From 10b4aa0250609eaf77586b2a49121b233b3856ac Mon Sep 17 00:00:00 2001 From: pelya Date: Tue, 18 May 2010 16:18:11 +0300 Subject: [PATCH] Added sdl_ttf and freetype libs --- alienblaster/Application.mk | 2 +- .../project/jni/application/Android.mk | 2 +- alienblaster/project/jni/freetype/.gitignore | 1 + alienblaster/project/jni/freetype/Android.mk | 28 + alienblaster/project/jni/freetype/ChangeLog | 7948 ++++++ .../project/jni/freetype/ChangeLog.20 | 2613 ++ .../project/jni/freetype/ChangeLog.21 | 9439 +++++++ .../project/jni/freetype/ChangeLog.22 | 2837 ++ alienblaster/project/jni/freetype/Jamfile | 203 + alienblaster/project/jni/freetype/Jamrules | 71 + alienblaster/project/jni/freetype/Makefile | 34 + alienblaster/project/jni/freetype/README | 64 + alienblaster/project/jni/freetype/README.git | 46 + alienblaster/project/jni/freetype/autogen.sh | 163 + .../project/jni/freetype/builds/amiga/README | 110 + .../amiga/include/freetype/config/ftconfig.h | 55 + .../amiga/include/freetype/config/ftmodule.h | 160 + .../jni/freetype/builds/amiga/makefile | 294 + .../jni/freetype/builds/amiga/makefile.os4 | 297 + .../jni/freetype/builds/amiga/smakefile | 297 + .../freetype/builds/amiga/src/base/ftdebug.c | 279 + .../freetype/builds/amiga/src/base/ftsystem.c | 522 + .../jni/freetype/builds/ansi/ansi-def.mk | 74 + .../project/jni/freetype/builds/ansi/ansi.mk | 21 + .../project/jni/freetype/builds/atari/ATARI.H | 20 + .../jni/freetype/builds/atari/FNames.SIC | 37 + .../jni/freetype/builds/atari/FREETYPE.PRJ | 32 + .../jni/freetype/builds/atari/README.TXT | 51 + .../freetype/builds/atari/deflinejoiner.awk | 181 + .../freetype/builds/atari/gen-purec-patch.sh | 40 + .../jni/freetype/builds/beos/beos-def.mk | 76 + .../project/jni/freetype/builds/beos/beos.mk | 19 + .../jni/freetype/builds/beos/detect.mk | 41 + .../jni/freetype/builds/compiler/ansi-cc.mk | 80 + .../jni/freetype/builds/compiler/bcc-dev.mk | 86 + .../jni/freetype/builds/compiler/bcc.mk | 86 + .../jni/freetype/builds/compiler/emx.mk | 77 + .../jni/freetype/builds/compiler/gcc-dev.mk | 95 + .../jni/freetype/builds/compiler/gcc.mk | 77 + .../jni/freetype/builds/compiler/intelc.mk | 85 + .../jni/freetype/builds/compiler/unix-lcc.mk | 83 + .../jni/freetype/builds/compiler/visualage.mk | 76 + .../jni/freetype/builds/compiler/visualc.mk | 82 + .../jni/freetype/builds/compiler/watcom.mk | 81 + .../jni/freetype/builds/compiler/win-lcc.mk | 81 + .../project/jni/freetype/builds/detect.mk | 154 + .../project/jni/freetype/builds/dos/detect.mk | 142 + .../jni/freetype/builds/dos/dos-def.mk | 45 + .../jni/freetype/builds/dos/dos-emx.mk | 21 + .../jni/freetype/builds/dos/dos-gcc.mk | 21 + .../jni/freetype/builds/dos/dos-wat.mk | 20 + .../project/jni/freetype/builds/exports.mk | 76 + .../project/jni/freetype/builds/freetype.mk | 361 + .../project/jni/freetype/builds/link_dos.mk | 42 + .../project/jni/freetype/builds/link_std.mk | 42 + .../builds/mac/FreeType.m68k_cfm.make.txt | 208 + .../builds/mac/FreeType.m68k_far.make.txt | 207 + .../builds/mac/FreeType.ppc_carbon.make.txt | 211 + .../builds/mac/FreeType.ppc_classic.make.txt | 212 + .../project/jni/freetype/builds/mac/README | 403 + .../jni/freetype/builds/mac/ascii2mpw.py | 24 + .../jni/freetype/builds/mac/ftlib.prj.xml | 1194 + .../project/jni/freetype/builds/mac/ftmac.c | 1531 + .../project/jni/freetype/builds/modules.mk | 79 + .../project/jni/freetype/builds/newline | 1 + .../project/jni/freetype/builds/os2/detect.mk | 73 + .../jni/freetype/builds/os2/os2-def.mk | 44 + .../jni/freetype/builds/os2/os2-dev.mk | 30 + .../jni/freetype/builds/os2/os2-gcc.mk | 26 + .../jni/freetype/builds/symbian/bld.inf | 65 + .../jni/freetype/builds/symbian/freetype.mmp | 142 + .../project/jni/freetype/builds/toplevel.mk | 255 + .../jni/freetype/builds/unix/.gitignore | 16 + .../jni/freetype/builds/unix/configure.raw | 684 + .../jni/freetype/builds/unix/detect.mk | 91 + .../freetype/builds/unix/freetype-config.in | 160 + .../jni/freetype/builds/unix/freetype2.in | 12 + .../jni/freetype/builds/unix/freetype2.m4 | 194 + .../jni/freetype/builds/unix/ft-munmap.m4 | 32 + .../jni/freetype/builds/unix/ft2unix.h | 61 + .../jni/freetype/builds/unix/ftconfig.in | 476 + .../jni/freetype/builds/unix/ftsystem.c | 419 + .../jni/freetype/builds/unix/install-sh | 520 + .../jni/freetype/builds/unix/install.mk | 97 + .../jni/freetype/builds/unix/mkinstalldirs | 161 + .../jni/freetype/builds/unix/unix-cc.in | 113 + .../jni/freetype/builds/unix/unix-def.in | 85 + .../jni/freetype/builds/unix/unix-dev.mk | 26 + .../jni/freetype/builds/unix/unix-lcc.mk | 24 + .../project/jni/freetype/builds/unix/unix.mk | 62 + .../jni/freetype/builds/unix/unixddef.mk | 45 + .../jni/freetype/builds/vms/ftconfig.h | 346 + .../jni/freetype/builds/vms/ftsystem.c | 321 + .../jni/freetype/builds/win32/detect.mk | 183 + .../jni/freetype/builds/win32/ftdebug.c | 214 + .../freetype/builds/win32/vc2005/freetype.sln | 31 + .../builds/win32/vc2005/freetype.vcproj | 644 + .../freetype/builds/win32/vc2005/index.html | 37 + .../freetype/builds/win32/vc2008/freetype.sln | 31 + .../builds/win32/vc2008/freetype.vcproj | 2176 ++ .../freetype/builds/win32/vc2008/index.html | 37 + .../builds/win32/visualc/freetype.dsp | 400 + .../builds/win32/visualc/freetype.dsw | 29 + .../builds/win32/visualc/freetype.sln | 31 + .../builds/win32/visualc/freetype.vcproj | 2175 ++ .../freetype/builds/win32/visualc/index.html | 37 + .../builds/win32/visualce/freetype.dsp | 400 + .../builds/win32/visualce/freetype.dsw | 29 + .../builds/win32/visualce/freetype.vcproj | 13881 +++++++++ .../freetype/builds/win32/visualce/index.html | 47 + .../jni/freetype/builds/win32/w32-bcc.mk | 28 + .../jni/freetype/builds/win32/w32-bccd.mk | 26 + .../jni/freetype/builds/win32/w32-dev.mk | 32 + .../jni/freetype/builds/win32/w32-gcc.mk | 31 + .../jni/freetype/builds/win32/w32-icc.mk | 28 + .../jni/freetype/builds/win32/w32-intl.mk | 28 + .../jni/freetype/builds/win32/w32-lcc.mk | 24 + .../jni/freetype/builds/win32/w32-mingw32.mk | 33 + .../jni/freetype/builds/win32/w32-vcc.mk | 28 + .../jni/freetype/builds/win32/w32-wat.mk | 28 + .../jni/freetype/builds/win32/win32-def.mk | 47 + .../jni/freetype/builds/wince/ftdebug.c | 236 + .../builds/wince/vc2005-ce/freetype.sln | 158 + .../builds/wince/vc2005-ce/freetype.vcproj | 3839 +++ .../builds/wince/vc2005-ce/index.html | 47 + .../builds/wince/vc2008-ce/freetype.sln | 158 + .../builds/wince/vc2008-ce/freetype.vcproj | 13495 +++++++++ .../builds/wince/vc2008-ce/index.html | 47 + alienblaster/project/jni/freetype/configure | 120 + .../project/jni/freetype/devel/ft2build.h | 41 + .../project/jni/freetype/devel/ftoption.h | 710 + .../project/jni/freetype/docs/CHANGES | 3396 +++ .../project/jni/freetype/docs/CUSTOMIZE | 150 + alienblaster/project/jni/freetype/docs/DEBUG | 202 + .../project/jni/freetype/docs/FTL.TXT | 169 + .../project/jni/freetype/docs/GPL.TXT | 340 + .../project/jni/freetype/docs/INSTALL | 91 + .../project/jni/freetype/docs/INSTALL.ANY | 151 + .../project/jni/freetype/docs/INSTALL.CROSS | 135 + .../project/jni/freetype/docs/INSTALL.GNU | 159 + .../project/jni/freetype/docs/INSTALL.MAC | 32 + .../project/jni/freetype/docs/INSTALL.UNIX | 96 + .../project/jni/freetype/docs/INSTALL.VMS | 62 + .../project/jni/freetype/docs/LICENSE.TXT | 31 + alienblaster/project/jni/freetype/docs/MAKEPP | 5 + .../project/jni/freetype/docs/PATENTS | 27 + .../project/jni/freetype/docs/PROBLEMS | 77 + alienblaster/project/jni/freetype/docs/TODO | 40 + .../project/jni/freetype/docs/TRUETYPE | 40 + .../project/jni/freetype/docs/UPGRADE.UNIX | 137 + .../project/jni/freetype/docs/VERSION.DLL | 138 + .../project/jni/freetype/docs/formats.txt | 164 + .../project/jni/freetype/docs/raster.txt | 635 + .../jni/freetype/docs/reference/.gitignore | 1 + .../jni/freetype/docs/reference/README | 5 + .../project/jni/freetype/docs/release | 195 + .../include/freetype/config/ftconfig.h | 528 + .../include/freetype/config/ftheader.h | 780 + .../include/freetype/config/ftmodule.h | 32 + .../include/freetype/config/ftoption.h | 710 + .../include/freetype/config/ftstdlib.h | 173 + .../jni/freetype/include/freetype/freetype.h | 3879 +++ .../jni/freetype/include/freetype/ftadvanc.h | 179 + .../jni/freetype/include/freetype/ftbbox.h | 94 + .../jni/freetype/include/freetype/ftbdf.h | 209 + .../jni/freetype/include/freetype/ftbitmap.h | 227 + .../jni/freetype/include/freetype/ftcache.h | 1125 + .../freetype/include/freetype/ftchapters.h | 103 + .../jni/freetype/include/freetype/ftcid.h | 166 + .../jni/freetype/include/freetype/fterrdef.h | 239 + .../jni/freetype/include/freetype/fterrors.h | 206 + .../jni/freetype/include/freetype/ftgasp.h | 120 + .../jni/freetype/include/freetype/ftglyph.h | 613 + .../jni/freetype/include/freetype/ftgxval.h | 358 + .../jni/freetype/include/freetype/ftgzip.h | 102 + .../jni/freetype/include/freetype/ftimage.h | 1301 + .../jni/freetype/include/freetype/ftincrem.h | 353 + .../jni/freetype/include/freetype/ftlcdfil.h | 172 + .../jni/freetype/include/freetype/ftlist.h | 273 + .../jni/freetype/include/freetype/ftlzw.h | 99 + .../jni/freetype/include/freetype/ftmac.h | 274 + .../jni/freetype/include/freetype/ftmm.h | 378 + .../jni/freetype/include/freetype/ftmodapi.h | 445 + .../jni/freetype/include/freetype/ftmoderr.h | 155 + .../jni/freetype/include/freetype/ftotval.h | 203 + .../jni/freetype/include/freetype/ftoutln.h | 537 + .../jni/freetype/include/freetype/ftpfr.h | 172 + .../jni/freetype/include/freetype/ftrender.h | 234 + .../jni/freetype/include/freetype/ftsizes.h | 159 + .../jni/freetype/include/freetype/ftsnames.h | 200 + .../jni/freetype/include/freetype/ftstroke.h | 716 + .../jni/freetype/include/freetype/ftsynth.h | 80 + .../jni/freetype/include/freetype/ftsystem.h | 346 + .../jni/freetype/include/freetype/fttrigon.h | 350 + .../jni/freetype/include/freetype/fttypes.h | 588 + .../jni/freetype/include/freetype/ftwinfnt.h | 274 + .../jni/freetype/include/freetype/ftxf86.h | 83 + .../include/freetype/internal/autohint.h | 231 + .../include/freetype/internal/ftcalc.h | 179 + .../include/freetype/internal/ftdebug.h | 250 + .../include/freetype/internal/ftdriver.h | 422 + .../include/freetype/internal/ftgloadr.h | 168 + .../include/freetype/internal/ftmemory.h | 368 + .../include/freetype/internal/ftobjs.h | 1401 + .../include/freetype/internal/ftpic.h | 67 + .../include/freetype/internal/ftrfork.h | 196 + .../include/freetype/internal/ftserv.h | 620 + .../include/freetype/internal/ftstream.h | 539 + .../include/freetype/internal/fttrace.h | 139 + .../include/freetype/internal/ftvalid.h | 150 + .../include/freetype/internal/internal.h | 51 + .../include/freetype/internal/pcftypes.h | 56 + .../include/freetype/internal/psaux.h | 873 + .../include/freetype/internal/pshints.h | 712 + .../freetype/internal/services/svbdf.h | 77 + .../freetype/internal/services/svcid.h | 83 + .../freetype/internal/services/svgldict.h | 82 + .../freetype/internal/services/svgxval.h | 72 + .../freetype/internal/services/svkern.h | 51 + .../include/freetype/internal/services/svmm.h | 104 + .../freetype/internal/services/svotval.h | 55 + .../freetype/internal/services/svpfr.h | 66 + .../freetype/internal/services/svpostnm.h | 79 + .../freetype/internal/services/svpscmap.h | 164 + .../freetype/internal/services/svpsinfo.h | 92 + .../freetype/internal/services/svsfnt.h | 102 + .../freetype/internal/services/svttcmap.h | 106 + .../freetype/internal/services/svtteng.h | 53 + .../freetype/internal/services/svttglyf.h | 67 + .../freetype/internal/services/svwinfnt.h | 50 + .../freetype/internal/services/svxf86nm.h | 55 + .../freetype/include/freetype/internal/sfnt.h | 897 + .../include/freetype/internal/t1types.h | 270 + .../include/freetype/internal/tttypes.h | 1543 + .../jni/freetype/include/freetype/t1tables.h | 504 + .../jni/freetype/include/freetype/ttnameid.h | 1247 + .../jni/freetype/include/freetype/tttables.h | 756 + .../jni/freetype/include/freetype/tttags.h | 107 + .../jni/freetype/include/freetype/ttunpat.h | 59 + .../project/jni/freetype/include/ft2build.h | 39 + alienblaster/project/jni/freetype/modules.cfg | 250 + .../project/jni/freetype/objs/.gitignore | 9 + alienblaster/project/jni/freetype/objs/README | 2 + alienblaster/project/jni/freetype/src/Jamfile | 25 + .../project/jni/freetype/src/autofit/Jamfile | 39 + .../jni/freetype/src/autofit/afangles.c | 292 + .../jni/freetype/src/autofit/afangles.h | 7 + .../project/jni/freetype/src/autofit/afcjk.c | 1512 + .../project/jni/freetype/src/autofit/afcjk.h | 57 + .../jni/freetype/src/autofit/afdummy.c | 60 + .../jni/freetype/src/autofit/afdummy.h | 42 + .../jni/freetype/src/autofit/aferrors.h | 40 + .../jni/freetype/src/autofit/afglobal.c | 320 + .../jni/freetype/src/autofit/afglobal.h | 71 + .../jni/freetype/src/autofit/afhints.c | 1265 + .../jni/freetype/src/autofit/afhints.h | 333 + .../jni/freetype/src/autofit/afindic.c | 130 + .../jni/freetype/src/autofit/afindic.h | 40 + .../jni/freetype/src/autofit/aflatin.c | 2227 ++ .../jni/freetype/src/autofit/aflatin.h | 212 + .../jni/freetype/src/autofit/afloader.c | 539 + .../jni/freetype/src/autofit/afloader.h | 73 + .../jni/freetype/src/autofit/afmodule.c | 94 + .../jni/freetype/src/autofit/afmodule.h | 37 + .../project/jni/freetype/src/autofit/afpic.c | 92 + .../project/jni/freetype/src/autofit/afpic.h | 64 + .../jni/freetype/src/autofit/aftypes.h | 403 + .../project/jni/freetype/src/autofit/afwarp.c | 338 + .../project/jni/freetype/src/autofit/afwarp.h | 64 + .../jni/freetype/src/autofit/module.mk | 23 + .../project/jni/freetype/src/autofit/rules.mk | 78 + .../project/jni/freetype/src/base/Jamfile | 60 + .../project/jni/freetype/src/base/basepic.c | 83 + .../project/jni/freetype/src/base/basepic.h | 62 + .../project/jni/freetype/src/base/ftadvanc.c | 163 + .../project/jni/freetype/src/base/ftapi.c | 121 + .../project/jni/freetype/src/base/ftbase.h | 57 + .../project/jni/freetype/src/base/ftbbox.c | 662 + .../project/jni/freetype/src/base/ftbdf.c | 88 + .../project/jni/freetype/src/base/ftbitmap.c | 663 + .../project/jni/freetype/src/base/ftcalc.c | 957 + .../project/jni/freetype/src/base/ftcid.c | 117 + .../project/jni/freetype/src/base/ftdbgmem.c | 997 + .../project/jni/freetype/src/base/ftdebug.c | 246 + .../project/jni/freetype/src/base/ftfstype.c | 62 + .../project/jni/freetype/src/base/ftgasp.c | 61 + .../project/jni/freetype/src/base/ftgloadr.c | 401 + .../project/jni/freetype/src/base/ftglyph.c | 627 + .../project/jni/freetype/src/base/ftgxval.c | 129 + .../project/jni/freetype/src/base/ftinit.c | 252 + .../project/jni/freetype/src/base/ftlcdfil.c | 351 + .../project/jni/freetype/src/base/ftmm.c | 202 + .../project/jni/freetype/src/base/ftobjs.c | 4500 +++ .../project/jni/freetype/src/base/ftotval.c | 84 + .../project/jni/freetype/src/base/ftoutln.c | 1128 + .../project/jni/freetype/src/base/ftpatent.c | 286 + .../project/jni/freetype/src/base/ftpfr.c | 143 + .../project/jni/freetype/src/base/ftpic.c | 54 + .../project/jni/freetype/src/base/ftrfork.c | 821 + .../project/jni/freetype/src/base/ftsnames.c | 94 + .../project/jni/freetype/src/base/ftstream.c | 852 + .../project/jni/freetype/src/base/ftstroke.c | 2039 ++ .../project/jni/freetype/src/base/ftsynth.c | 160 + .../project/jni/freetype/src/base/ftsystem.c | 302 + .../project/jni/freetype/src/base/fttrigon.c | 546 + .../project/jni/freetype/src/base/fttype1.c | 94 + .../project/jni/freetype/src/base/ftutil.c | 501 + .../project/jni/freetype/src/base/ftwinfnt.c | 51 + .../project/jni/freetype/src/base/ftxf86.c | 40 + .../project/jni/freetype/src/base/rules.mk | 96 + .../project/jni/freetype/src/bdf/Jamfile | 29 + .../project/jni/freetype/src/bdf/README | 148 + .../project/jni/freetype/src/bdf/bdf.h | 295 + .../project/jni/freetype/src/bdf/bdfdrivr.c | 879 + .../project/jni/freetype/src/bdf/bdfdrivr.h | 80 + .../project/jni/freetype/src/bdf/bdferror.h | 44 + .../project/jni/freetype/src/bdf/bdflib.c | 2481 ++ .../project/jni/freetype/src/bdf/module.mk | 34 + .../project/jni/freetype/src/bdf/rules.mk | 81 + .../project/jni/freetype/src/cache/Jamfile | 43 + .../project/jni/freetype/src/cache/ftcbasic.c | 851 + .../project/jni/freetype/src/cache/ftccache.c | 595 + .../project/jni/freetype/src/cache/ftccache.h | 316 + .../project/jni/freetype/src/cache/ftccback.h | 90 + .../project/jni/freetype/src/cache/ftccmap.c | 431 + .../project/jni/freetype/src/cache/ftcerror.h | 40 + .../project/jni/freetype/src/cache/ftcglyph.c | 209 + .../project/jni/freetype/src/cache/ftcglyph.h | 323 + .../project/jni/freetype/src/cache/ftcimage.c | 163 + .../project/jni/freetype/src/cache/ftcimage.h | 107 + .../project/jni/freetype/src/cache/ftcmanag.c | 743 + .../project/jni/freetype/src/cache/ftcmanag.h | 175 + .../project/jni/freetype/src/cache/ftcmru.c | 357 + .../project/jni/freetype/src/cache/ftcmru.h | 246 + .../project/jni/freetype/src/cache/ftcsbits.c | 404 + .../project/jni/freetype/src/cache/ftcsbits.h | 98 + .../project/jni/freetype/src/cache/rules.mk | 80 + .../project/jni/freetype/src/cff/Jamfile | 29 + .../project/jni/freetype/src/cff/cffcmap.c | 219 + .../project/jni/freetype/src/cff/cffcmap.h | 67 + .../project/jni/freetype/src/cff/cffdrivr.c | 691 + .../project/jni/freetype/src/cff/cffdrivr.h | 38 + .../project/jni/freetype/src/cff/cfferrs.h | 41 + .../project/jni/freetype/src/cff/cffgload.c | 2935 ++ .../project/jni/freetype/src/cff/cffgload.h | 201 + .../project/jni/freetype/src/cff/cffload.c | 1638 ++ .../project/jni/freetype/src/cff/cffload.h | 81 + .../project/jni/freetype/src/cff/cffobjs.c | 968 + .../project/jni/freetype/src/cff/cffobjs.h | 181 + .../project/jni/freetype/src/cff/cffparse.c | 919 + .../project/jni/freetype/src/cff/cffparse.h | 102 + .../project/jni/freetype/src/cff/cffpic.c | 99 + .../project/jni/freetype/src/cff/cffpic.h | 80 + .../project/jni/freetype/src/cff/cfftoken.h | 97 + .../project/jni/freetype/src/cff/cfftypes.h | 274 + .../project/jni/freetype/src/cff/module.mk | 23 + .../project/jni/freetype/src/cff/rules.mk | 72 + .../project/jni/freetype/src/cid/Jamfile | 29 + .../project/jni/freetype/src/cid/ciderrs.h | 40 + .../project/jni/freetype/src/cid/cidgload.c | 443 + .../project/jni/freetype/src/cid/cidgload.h | 51 + .../project/jni/freetype/src/cid/cidload.c | 672 + .../project/jni/freetype/src/cid/cidload.h | 53 + .../project/jni/freetype/src/cid/cidobjs.c | 482 + .../project/jni/freetype/src/cid/cidobjs.h | 154 + .../project/jni/freetype/src/cid/cidparse.c | 225 + .../project/jni/freetype/src/cid/cidparse.h | 123 + .../project/jni/freetype/src/cid/cidriver.c | 240 + .../project/jni/freetype/src/cid/cidriver.h | 43 + .../project/jni/freetype/src/cid/cidtoken.h | 112 + .../project/jni/freetype/src/cid/module.mk | 23 + .../project/jni/freetype/src/cid/rules.mk | 70 + .../project/jni/freetype/src/gxvalid/Jamfile | 33 + .../project/jni/freetype/src/gxvalid/README | 532 + .../jni/freetype/src/gxvalid/gxvalid.h | 107 + .../jni/freetype/src/gxvalid/gxvbsln.c | 333 + .../jni/freetype/src/gxvalid/gxvcommn.c | 1759 ++ .../jni/freetype/src/gxvalid/gxvcommn.h | 565 + .../jni/freetype/src/gxvalid/gxverror.h | 51 + .../jni/freetype/src/gxvalid/gxvfeat.c | 344 + .../jni/freetype/src/gxvalid/gxvfeat.h | 172 + .../jni/freetype/src/gxvalid/gxvjust.c | 630 + .../jni/freetype/src/gxvalid/gxvkern.c | 876 + .../jni/freetype/src/gxvalid/gxvlcar.c | 223 + .../project/jni/freetype/src/gxvalid/gxvmod.c | 285 + .../project/jni/freetype/src/gxvalid/gxvmod.h | 50 + .../jni/freetype/src/gxvalid/gxvmort.c | 285 + .../jni/freetype/src/gxvalid/gxvmort.h | 93 + .../jni/freetype/src/gxvalid/gxvmort0.c | 137 + .../jni/freetype/src/gxvalid/gxvmort1.c | 258 + .../jni/freetype/src/gxvalid/gxvmort2.c | 282 + .../jni/freetype/src/gxvalid/gxvmort4.c | 125 + .../jni/freetype/src/gxvalid/gxvmort5.c | 226 + .../jni/freetype/src/gxvalid/gxvmorx.c | 184 + .../jni/freetype/src/gxvalid/gxvmorx.h | 67 + .../jni/freetype/src/gxvalid/gxvmorx0.c | 103 + .../jni/freetype/src/gxvalid/gxvmorx1.c | 274 + .../jni/freetype/src/gxvalid/gxvmorx2.c | 285 + .../jni/freetype/src/gxvalid/gxvmorx4.c | 55 + .../jni/freetype/src/gxvalid/gxvmorx5.c | 217 + .../jni/freetype/src/gxvalid/gxvopbd.c | 217 + .../jni/freetype/src/gxvalid/gxvprop.c | 301 + .../jni/freetype/src/gxvalid/gxvtrak.c | 277 + .../jni/freetype/src/gxvalid/module.mk | 23 + .../project/jni/freetype/src/gxvalid/rules.mk | 94 + .../project/jni/freetype/src/gzip/Jamfile | 16 + .../project/jni/freetype/src/gzip/ftgzip.c | 688 + .../project/jni/freetype/src/gzip/rules.mk | 75 + .../project/jni/freetype/src/lzw/Jamfile | 16 + .../project/jni/freetype/src/lzw/ftlzw.c | 412 + .../project/jni/freetype/src/lzw/ftzopen.c | 401 + .../project/jni/freetype/src/lzw/ftzopen.h | 171 + .../project/jni/freetype/src/lzw/rules.mk | 70 + .../project/jni/freetype/src/otvalid/Jamfile | 29 + .../jni/freetype/src/otvalid/module.mk | 23 + .../jni/freetype/src/otvalid/otvalid.h | 78 + .../jni/freetype/src/otvalid/otvbase.c | 318 + .../jni/freetype/src/otvalid/otvcommn.c | 1086 + .../jni/freetype/src/otvalid/otvcommn.h | 437 + .../jni/freetype/src/otvalid/otverror.h | 43 + .../jni/freetype/src/otvalid/otvgdef.c | 224 + .../jni/freetype/src/otvalid/otvgpos.c | 1017 + .../jni/freetype/src/otvalid/otvgpos.h | 36 + .../jni/freetype/src/otvalid/otvgsub.c | 585 + .../jni/freetype/src/otvalid/otvjstf.c | 258 + .../jni/freetype/src/otvalid/otvmath.c | 452 + .../project/jni/freetype/src/otvalid/otvmod.c | 280 + .../project/jni/freetype/src/otvalid/otvmod.h | 43 + .../project/jni/freetype/src/otvalid/rules.mk | 78 + .../project/jni/freetype/src/pcf/Jamfile | 29 + .../project/jni/freetype/src/pcf/README | 114 + .../project/jni/freetype/src/pcf/module.mk | 34 + .../project/jni/freetype/src/pcf/pcf.h | 237 + .../project/jni/freetype/src/pcf/pcfdrivr.c | 695 + .../project/jni/freetype/src/pcf/pcfdrivr.h | 48 + .../project/jni/freetype/src/pcf/pcferror.h | 40 + .../project/jni/freetype/src/pcf/pcfread.c | 1274 + .../project/jni/freetype/src/pcf/pcfread.h | 45 + .../project/jni/freetype/src/pcf/pcfutil.c | 104 + .../project/jni/freetype/src/pcf/pcfutil.h | 55 + .../project/jni/freetype/src/pcf/rules.mk | 79 + .../project/jni/freetype/src/pfr/Jamfile | 29 + .../project/jni/freetype/src/pfr/module.mk | 23 + .../project/jni/freetype/src/pfr/pfrcmap.c | 166 + .../project/jni/freetype/src/pfr/pfrcmap.h | 46 + .../project/jni/freetype/src/pfr/pfrdrivr.c | 214 + .../project/jni/freetype/src/pfr/pfrdrivr.h | 43 + .../project/jni/freetype/src/pfr/pfrerror.h | 40 + .../project/jni/freetype/src/pfr/pfrgload.c | 828 + .../project/jni/freetype/src/pfr/pfrgload.h | 49 + .../project/jni/freetype/src/pfr/pfrload.c | 941 + .../project/jni/freetype/src/pfr/pfrload.h | 118 + .../project/jni/freetype/src/pfr/pfrobjs.c | 581 + .../project/jni/freetype/src/pfr/pfrobjs.h | 96 + .../project/jni/freetype/src/pfr/pfrsbit.c | 698 + .../project/jni/freetype/src/pfr/pfrsbit.h | 36 + .../project/jni/freetype/src/pfr/pfrtypes.h | 362 + .../project/jni/freetype/src/pfr/rules.mk | 73 + .../project/jni/freetype/src/psaux/Jamfile | 31 + .../project/jni/freetype/src/psaux/afmparse.c | 964 + .../project/jni/freetype/src/psaux/afmparse.h | 87 + .../project/jni/freetype/src/psaux/module.mk | 23 + .../project/jni/freetype/src/psaux/psauxerr.h | 41 + .../project/jni/freetype/src/psaux/psauxmod.c | 139 + .../project/jni/freetype/src/psaux/psauxmod.h | 42 + .../project/jni/freetype/src/psaux/psconv.c | 472 + .../project/jni/freetype/src/psaux/psconv.h | 71 + .../project/jni/freetype/src/psaux/psobjs.c | 1703 ++ .../project/jni/freetype/src/psaux/psobjs.h | 212 + .../project/jni/freetype/src/psaux/rules.mk | 73 + .../project/jni/freetype/src/psaux/t1cmap.c | 341 + .../project/jni/freetype/src/psaux/t1cmap.h | 105 + .../project/jni/freetype/src/psaux/t1decode.c | 1592 ++ .../project/jni/freetype/src/psaux/t1decode.h | 64 + .../project/jni/freetype/src/pshinter/Jamfile | 29 + .../jni/freetype/src/pshinter/module.mk | 23 + .../jni/freetype/src/pshinter/pshalgo.c | 2302 ++ .../jni/freetype/src/pshinter/pshalgo.h | 255 + .../jni/freetype/src/pshinter/pshglob.c | 750 + .../jni/freetype/src/pshinter/pshglob.h | 196 + .../jni/freetype/src/pshinter/pshmod.c | 118 + .../jni/freetype/src/pshinter/pshmod.h | 39 + .../jni/freetype/src/pshinter/pshnterr.h | 40 + .../jni/freetype/src/pshinter/pshpic.c | 67 + .../jni/freetype/src/pshinter/pshpic.h | 53 + .../jni/freetype/src/pshinter/pshrec.c | 1224 + .../jni/freetype/src/pshinter/pshrec.h | 176 + .../jni/freetype/src/pshinter/rules.mk | 72 + .../project/jni/freetype/src/psnames/Jamfile | 29 + .../jni/freetype/src/psnames/module.mk | 23 + .../jni/freetype/src/psnames/psmodule.c | 595 + .../jni/freetype/src/psnames/psmodule.h | 38 + .../jni/freetype/src/psnames/psnamerr.h | 41 + .../project/jni/freetype/src/psnames/pspic.c | 77 + .../project/jni/freetype/src/psnames/pspic.h | 54 + .../jni/freetype/src/psnames/pstables.h | 4095 +++ .../project/jni/freetype/src/psnames/rules.mk | 70 + .../project/jni/freetype/src/raster/Jamfile | 29 + .../project/jni/freetype/src/raster/ftmisc.h | 109 + .../jni/freetype/src/raster/ftraster.c | 3563 +++ .../jni/freetype/src/raster/ftraster.h | 46 + .../project/jni/freetype/src/raster/ftrend1.c | 291 + .../project/jni/freetype/src/raster/ftrend1.h | 44 + .../project/jni/freetype/src/raster/module.mk | 23 + .../jni/freetype/src/raster/rasterrs.h | 41 + .../project/jni/freetype/src/raster/rastpic.c | 89 + .../project/jni/freetype/src/raster/rastpic.h | 50 + .../project/jni/freetype/src/raster/rules.mk | 69 + .../project/jni/freetype/src/sfnt/Jamfile | 29 + .../project/jni/freetype/src/sfnt/module.mk | 23 + .../project/jni/freetype/src/sfnt/rules.mk | 79 + .../project/jni/freetype/src/sfnt/sfdriver.c | 651 + .../project/jni/freetype/src/sfnt/sfdriver.h | 38 + .../project/jni/freetype/src/sfnt/sferrors.h | 41 + .../project/jni/freetype/src/sfnt/sfntpic.c | 101 + .../project/jni/freetype/src/sfnt/sfntpic.h | 88 + .../project/jni/freetype/src/sfnt/sfobjs.c | 1149 + .../project/jni/freetype/src/sfnt/sfobjs.h | 54 + .../project/jni/freetype/src/sfnt/ttbdf.c | 250 + .../project/jni/freetype/src/sfnt/ttbdf.h | 46 + .../project/jni/freetype/src/sfnt/ttcmap.c | 3504 +++ .../project/jni/freetype/src/sfnt/ttcmap.h | 125 + .../project/jni/freetype/src/sfnt/ttcmapc.h | 55 + .../project/jni/freetype/src/sfnt/ttkern.c | 306 + .../project/jni/freetype/src/sfnt/ttkern.h | 52 + .../project/jni/freetype/src/sfnt/ttload.c | 1251 + .../project/jni/freetype/src/sfnt/ttload.h | 112 + .../project/jni/freetype/src/sfnt/ttmtx.c | 468 + .../project/jni/freetype/src/sfnt/ttmtx.h | 55 + .../project/jni/freetype/src/sfnt/ttpost.c | 521 + .../project/jni/freetype/src/sfnt/ttpost.h | 46 + .../project/jni/freetype/src/sfnt/ttsbit.c | 1507 + .../project/jni/freetype/src/sfnt/ttsbit.h | 79 + .../project/jni/freetype/src/smooth/Jamfile | 29 + .../project/jni/freetype/src/smooth/ftgrays.c | 2090 ++ .../project/jni/freetype/src/smooth/ftgrays.h | 58 + .../jni/freetype/src/smooth/ftsmerrs.h | 41 + .../jni/freetype/src/smooth/ftsmooth.c | 481 + .../jni/freetype/src/smooth/ftsmooth.h | 49 + .../project/jni/freetype/src/smooth/ftspic.c | 97 + .../project/jni/freetype/src/smooth/ftspic.h | 50 + .../project/jni/freetype/src/smooth/module.mk | 27 + .../project/jni/freetype/src/smooth/rules.mk | 69 + .../project/jni/freetype/src/truetype/Jamfile | 29 + .../jni/freetype/src/truetype/module.mk | 23 + .../jni/freetype/src/truetype/rules.mk | 72 + .../jni/freetype/src/truetype/ttdriver.c | 487 + .../jni/freetype/src/truetype/ttdriver.h | 38 + .../jni/freetype/src/truetype/tterrors.h | 40 + .../jni/freetype/src/truetype/ttgload.c | 2089 ++ .../jni/freetype/src/truetype/ttgload.h | 63 + .../jni/freetype/src/truetype/ttgxvar.c | 1544 + .../jni/freetype/src/truetype/ttgxvar.h | 182 + .../jni/freetype/src/truetype/ttinterp.c | 7844 ++++++ .../jni/freetype/src/truetype/ttinterp.h | 311 + .../jni/freetype/src/truetype/ttobjs.c | 951 + .../jni/freetype/src/truetype/ttobjs.h | 431 + .../project/jni/freetype/src/truetype/ttpic.c | 79 + .../project/jni/freetype/src/truetype/ttpic.h | 59 + .../jni/freetype/src/truetype/ttpload.c | 572 + .../jni/freetype/src/truetype/ttpload.h | 75 + .../project/jni/freetype/src/type1/Jamfile | 29 + .../project/jni/freetype/src/type1/module.mk | 23 + .../project/jni/freetype/src/type1/rules.mk | 73 + .../project/jni/freetype/src/type1/t1afm.c | 396 + .../project/jni/freetype/src/type1/t1afm.h | 54 + .../project/jni/freetype/src/type1/t1driver.c | 331 + .../project/jni/freetype/src/type1/t1driver.h | 42 + .../project/jni/freetype/src/type1/t1errors.h | 40 + .../project/jni/freetype/src/type1/t1gload.c | 515 + .../project/jni/freetype/src/type1/t1gload.h | 53 + .../project/jni/freetype/src/type1/t1load.c | 2231 ++ .../project/jni/freetype/src/type1/t1load.h | 102 + .../project/jni/freetype/src/type1/t1objs.c | 594 + .../project/jni/freetype/src/type1/t1objs.h | 171 + .../project/jni/freetype/src/type1/t1parse.c | 486 + .../project/jni/freetype/src/type1/t1parse.h | 135 + .../project/jni/freetype/src/type1/t1tokens.h | 143 + .../project/jni/freetype/src/type42/Jamfile | 29 + .../project/jni/freetype/src/type42/module.mk | 23 + .../project/jni/freetype/src/type42/rules.mk | 70 + .../jni/freetype/src/type42/t42drivr.c | 246 + .../jni/freetype/src/type42/t42drivr.h | 42 + .../jni/freetype/src/type42/t42error.h | 40 + .../project/jni/freetype/src/type42/t42objs.c | 648 + .../project/jni/freetype/src/type42/t42objs.h | 124 + .../jni/freetype/src/type42/t42parse.c | 1178 + .../jni/freetype/src/type42/t42parse.h | 90 + .../jni/freetype/src/type42/t42types.h | 56 + .../project/jni/freetype/src/winfonts/Jamfile | 16 + .../jni/freetype/src/winfonts/fnterrs.h | 41 + .../jni/freetype/src/winfonts/module.mk | 23 + .../jni/freetype/src/winfonts/rules.mk | 65 + .../jni/freetype/src/winfonts/winfnt.c | 1135 + .../jni/freetype/src/winfonts/winfnt.h | 171 + alienblaster/project/jni/freetype/version.sed | 5 + .../project/jni/freetype/vms_make.com | 1286 + alienblaster/project/jni/sdl_ttf/Android.mk | 19 + alienblaster/project/jni/sdl_ttf/CHANGES | 122 + alienblaster/project/jni/sdl_ttf/COPYING | 458 + .../project/jni/sdl_ttf/MPWmake.sea.bin | Bin 0 -> 21632 bytes alienblaster/project/jni/sdl_ttf/Makefile.am | 51 + alienblaster/project/jni/sdl_ttf/Makefile.in | 696 + alienblaster/project/jni/sdl_ttf/README | 24 + alienblaster/project/jni/sdl_ttf/SDL_ttf.c | 1814 ++ alienblaster/project/jni/sdl_ttf/SDL_ttf.h | 234 + alienblaster/project/jni/sdl_ttf/SDL_ttf.spec | 65 + .../project/jni/sdl_ttf/SDL_ttf.spec.in | 65 + alienblaster/project/jni/sdl_ttf/VisualC.zip | Bin 0 -> 265264 bytes .../project/jni/sdl_ttf/Watcom-Win32.zip | Bin 0 -> 722367 bytes alienblaster/project/jni/sdl_ttf/Xcode.tar.gz | Bin 0 -> 1825366 bytes .../project/jni/sdl_ttf/acinclude/libtool.m4 | 6409 +++++ .../project/jni/sdl_ttf/acinclude/sdl.m4 | 181 + alienblaster/project/jni/sdl_ttf/aclocal.m4 | 1022 + alienblaster/project/jni/sdl_ttf/autogen.sh | 11 + alienblaster/project/jni/sdl_ttf/config.guess | 1388 + alienblaster/project/jni/sdl_ttf/config.sub | 1487 + alienblaster/project/jni/sdl_ttf/configure | 23328 ++++++++++++++++ alienblaster/project/jni/sdl_ttf/configure.in | 192 + alienblaster/project/jni/sdl_ttf/depcomp | 522 + alienblaster/project/jni/sdl_ttf/gcc-fat.sh | 110 + alienblaster/project/jni/sdl_ttf/glfont.c | 537 + alienblaster/project/jni/sdl_ttf/install-sh | 323 + alienblaster/project/jni/sdl_ttf/ltmain.sh | 6864 +++++ alienblaster/project/jni/sdl_ttf/missing | 353 + alienblaster/project/jni/sdl_ttf/showfont.c | 375 + alienblaster/project/jni/sdl_ttf/version.rc | 39 + 627 files changed, 290827 insertions(+), 2 deletions(-) create mode 100644 alienblaster/project/jni/freetype/.gitignore create mode 100644 alienblaster/project/jni/freetype/Android.mk create mode 100644 alienblaster/project/jni/freetype/ChangeLog create mode 100644 alienblaster/project/jni/freetype/ChangeLog.20 create mode 100644 alienblaster/project/jni/freetype/ChangeLog.21 create mode 100644 alienblaster/project/jni/freetype/ChangeLog.22 create mode 100644 alienblaster/project/jni/freetype/Jamfile create mode 100644 alienblaster/project/jni/freetype/Jamrules create mode 100644 alienblaster/project/jni/freetype/Makefile create mode 100644 alienblaster/project/jni/freetype/README create mode 100644 alienblaster/project/jni/freetype/README.git create mode 100644 alienblaster/project/jni/freetype/autogen.sh create mode 100644 alienblaster/project/jni/freetype/builds/amiga/README create mode 100644 alienblaster/project/jni/freetype/builds/amiga/include/freetype/config/ftconfig.h create mode 100644 alienblaster/project/jni/freetype/builds/amiga/include/freetype/config/ftmodule.h create mode 100644 alienblaster/project/jni/freetype/builds/amiga/makefile create mode 100644 alienblaster/project/jni/freetype/builds/amiga/makefile.os4 create mode 100644 alienblaster/project/jni/freetype/builds/amiga/smakefile create mode 100644 alienblaster/project/jni/freetype/builds/amiga/src/base/ftdebug.c create mode 100644 alienblaster/project/jni/freetype/builds/amiga/src/base/ftsystem.c create mode 100644 alienblaster/project/jni/freetype/builds/ansi/ansi-def.mk create mode 100644 alienblaster/project/jni/freetype/builds/ansi/ansi.mk create mode 100644 alienblaster/project/jni/freetype/builds/atari/ATARI.H create mode 100644 alienblaster/project/jni/freetype/builds/atari/FNames.SIC create mode 100644 alienblaster/project/jni/freetype/builds/atari/FREETYPE.PRJ create mode 100644 alienblaster/project/jni/freetype/builds/atari/README.TXT create mode 100644 alienblaster/project/jni/freetype/builds/atari/deflinejoiner.awk create mode 100755 alienblaster/project/jni/freetype/builds/atari/gen-purec-patch.sh create mode 100644 alienblaster/project/jni/freetype/builds/beos/beos-def.mk create mode 100644 alienblaster/project/jni/freetype/builds/beos/beos.mk create mode 100644 alienblaster/project/jni/freetype/builds/beos/detect.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/ansi-cc.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/bcc-dev.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/bcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/emx.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/gcc-dev.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/gcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/intelc.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/unix-lcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/visualage.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/visualc.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/watcom.mk create mode 100644 alienblaster/project/jni/freetype/builds/compiler/win-lcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/detect.mk create mode 100644 alienblaster/project/jni/freetype/builds/dos/detect.mk create mode 100644 alienblaster/project/jni/freetype/builds/dos/dos-def.mk create mode 100644 alienblaster/project/jni/freetype/builds/dos/dos-emx.mk create mode 100644 alienblaster/project/jni/freetype/builds/dos/dos-gcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/dos/dos-wat.mk create mode 100644 alienblaster/project/jni/freetype/builds/exports.mk create mode 100644 alienblaster/project/jni/freetype/builds/freetype.mk create mode 100644 alienblaster/project/jni/freetype/builds/link_dos.mk create mode 100644 alienblaster/project/jni/freetype/builds/link_std.mk create mode 100644 alienblaster/project/jni/freetype/builds/mac/FreeType.m68k_cfm.make.txt create mode 100644 alienblaster/project/jni/freetype/builds/mac/FreeType.m68k_far.make.txt create mode 100644 alienblaster/project/jni/freetype/builds/mac/FreeType.ppc_carbon.make.txt create mode 100644 alienblaster/project/jni/freetype/builds/mac/FreeType.ppc_classic.make.txt create mode 100644 alienblaster/project/jni/freetype/builds/mac/README create mode 100755 alienblaster/project/jni/freetype/builds/mac/ascii2mpw.py create mode 100644 alienblaster/project/jni/freetype/builds/mac/ftlib.prj.xml create mode 100644 alienblaster/project/jni/freetype/builds/mac/ftmac.c create mode 100644 alienblaster/project/jni/freetype/builds/modules.mk create mode 100644 alienblaster/project/jni/freetype/builds/newline create mode 100644 alienblaster/project/jni/freetype/builds/os2/detect.mk create mode 100644 alienblaster/project/jni/freetype/builds/os2/os2-def.mk create mode 100644 alienblaster/project/jni/freetype/builds/os2/os2-dev.mk create mode 100644 alienblaster/project/jni/freetype/builds/os2/os2-gcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/symbian/bld.inf create mode 100644 alienblaster/project/jni/freetype/builds/symbian/freetype.mmp create mode 100644 alienblaster/project/jni/freetype/builds/toplevel.mk create mode 100644 alienblaster/project/jni/freetype/builds/unix/.gitignore create mode 100644 alienblaster/project/jni/freetype/builds/unix/configure.raw create mode 100644 alienblaster/project/jni/freetype/builds/unix/detect.mk create mode 100644 alienblaster/project/jni/freetype/builds/unix/freetype-config.in create mode 100644 alienblaster/project/jni/freetype/builds/unix/freetype2.in create mode 100644 alienblaster/project/jni/freetype/builds/unix/freetype2.m4 create mode 100644 alienblaster/project/jni/freetype/builds/unix/ft-munmap.m4 create mode 100644 alienblaster/project/jni/freetype/builds/unix/ft2unix.h create mode 100644 alienblaster/project/jni/freetype/builds/unix/ftconfig.in create mode 100644 alienblaster/project/jni/freetype/builds/unix/ftsystem.c create mode 100755 alienblaster/project/jni/freetype/builds/unix/install-sh create mode 100644 alienblaster/project/jni/freetype/builds/unix/install.mk create mode 100755 alienblaster/project/jni/freetype/builds/unix/mkinstalldirs create mode 100644 alienblaster/project/jni/freetype/builds/unix/unix-cc.in create mode 100644 alienblaster/project/jni/freetype/builds/unix/unix-def.in create mode 100644 alienblaster/project/jni/freetype/builds/unix/unix-dev.mk create mode 100644 alienblaster/project/jni/freetype/builds/unix/unix-lcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/unix/unix.mk create mode 100644 alienblaster/project/jni/freetype/builds/unix/unixddef.mk create mode 100644 alienblaster/project/jni/freetype/builds/vms/ftconfig.h create mode 100644 alienblaster/project/jni/freetype/builds/vms/ftsystem.c create mode 100644 alienblaster/project/jni/freetype/builds/win32/detect.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/ftdebug.c create mode 100644 alienblaster/project/jni/freetype/builds/win32/vc2005/freetype.sln create mode 100644 alienblaster/project/jni/freetype/builds/win32/vc2005/freetype.vcproj create mode 100644 alienblaster/project/jni/freetype/builds/win32/vc2005/index.html create mode 100644 alienblaster/project/jni/freetype/builds/win32/vc2008/freetype.sln create mode 100644 alienblaster/project/jni/freetype/builds/win32/vc2008/freetype.vcproj create mode 100644 alienblaster/project/jni/freetype/builds/win32/vc2008/index.html create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualc/freetype.dsp create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualc/freetype.dsw create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualc/freetype.sln create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualc/freetype.vcproj create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualc/index.html create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualce/freetype.dsp create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualce/freetype.dsw create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualce/freetype.vcproj create mode 100644 alienblaster/project/jni/freetype/builds/win32/visualce/index.html create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-bcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-bccd.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-dev.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-gcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-icc.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-intl.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-lcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-mingw32.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-vcc.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/w32-wat.mk create mode 100644 alienblaster/project/jni/freetype/builds/win32/win32-def.mk create mode 100644 alienblaster/project/jni/freetype/builds/wince/ftdebug.c create mode 100644 alienblaster/project/jni/freetype/builds/wince/vc2005-ce/freetype.sln create mode 100644 alienblaster/project/jni/freetype/builds/wince/vc2005-ce/freetype.vcproj create mode 100644 alienblaster/project/jni/freetype/builds/wince/vc2005-ce/index.html create mode 100644 alienblaster/project/jni/freetype/builds/wince/vc2008-ce/freetype.sln create mode 100644 alienblaster/project/jni/freetype/builds/wince/vc2008-ce/freetype.vcproj create mode 100644 alienblaster/project/jni/freetype/builds/wince/vc2008-ce/index.html create mode 100755 alienblaster/project/jni/freetype/configure create mode 100644 alienblaster/project/jni/freetype/devel/ft2build.h create mode 100644 alienblaster/project/jni/freetype/devel/ftoption.h create mode 100644 alienblaster/project/jni/freetype/docs/CHANGES create mode 100644 alienblaster/project/jni/freetype/docs/CUSTOMIZE create mode 100644 alienblaster/project/jni/freetype/docs/DEBUG create mode 100644 alienblaster/project/jni/freetype/docs/FTL.TXT create mode 100644 alienblaster/project/jni/freetype/docs/GPL.TXT create mode 100644 alienblaster/project/jni/freetype/docs/INSTALL create mode 100644 alienblaster/project/jni/freetype/docs/INSTALL.ANY create mode 100644 alienblaster/project/jni/freetype/docs/INSTALL.CROSS create mode 100644 alienblaster/project/jni/freetype/docs/INSTALL.GNU create mode 100644 alienblaster/project/jni/freetype/docs/INSTALL.MAC create mode 100644 alienblaster/project/jni/freetype/docs/INSTALL.UNIX create mode 100644 alienblaster/project/jni/freetype/docs/INSTALL.VMS create mode 100644 alienblaster/project/jni/freetype/docs/LICENSE.TXT create mode 100644 alienblaster/project/jni/freetype/docs/MAKEPP create mode 100644 alienblaster/project/jni/freetype/docs/PATENTS create mode 100644 alienblaster/project/jni/freetype/docs/PROBLEMS create mode 100644 alienblaster/project/jni/freetype/docs/TODO create mode 100644 alienblaster/project/jni/freetype/docs/TRUETYPE create mode 100644 alienblaster/project/jni/freetype/docs/UPGRADE.UNIX create mode 100644 alienblaster/project/jni/freetype/docs/VERSION.DLL create mode 100644 alienblaster/project/jni/freetype/docs/formats.txt create mode 100644 alienblaster/project/jni/freetype/docs/raster.txt create mode 100644 alienblaster/project/jni/freetype/docs/reference/.gitignore create mode 100644 alienblaster/project/jni/freetype/docs/reference/README create mode 100644 alienblaster/project/jni/freetype/docs/release create mode 100644 alienblaster/project/jni/freetype/include/freetype/config/ftconfig.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/config/ftheader.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/config/ftmodule.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/config/ftoption.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/config/ftstdlib.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/freetype.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftadvanc.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftbbox.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftbdf.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftbitmap.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftcache.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftchapters.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftcid.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/fterrdef.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/fterrors.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftgasp.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftglyph.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftgxval.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftgzip.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftimage.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftincrem.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftlcdfil.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftlist.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftlzw.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftmac.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftmm.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftmodapi.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftmoderr.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftotval.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftoutln.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftpfr.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftrender.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftsizes.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftsnames.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftstroke.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftsynth.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftsystem.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/fttrigon.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/fttypes.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftwinfnt.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ftxf86.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/autohint.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftcalc.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftdebug.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftdriver.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftgloadr.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftmemory.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftobjs.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftpic.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftrfork.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftserv.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftstream.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/fttrace.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/ftvalid.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/internal.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/pcftypes.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/psaux.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/pshints.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svbdf.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svcid.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svgldict.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svgxval.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svkern.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svmm.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svotval.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svpfr.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svpostnm.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svpscmap.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svpsinfo.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svsfnt.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svttcmap.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svtteng.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svttglyf.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svwinfnt.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/services/svxf86nm.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/sfnt.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/t1types.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/internal/tttypes.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/t1tables.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ttnameid.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/tttables.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/tttags.h create mode 100644 alienblaster/project/jni/freetype/include/freetype/ttunpat.h create mode 100644 alienblaster/project/jni/freetype/include/ft2build.h create mode 100644 alienblaster/project/jni/freetype/modules.cfg create mode 100644 alienblaster/project/jni/freetype/objs/.gitignore create mode 100644 alienblaster/project/jni/freetype/objs/README create mode 100644 alienblaster/project/jni/freetype/src/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/autofit/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/autofit/afangles.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afangles.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afcjk.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afcjk.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afdummy.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afdummy.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/aferrors.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afglobal.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afglobal.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afhints.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afhints.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afindic.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afindic.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/aflatin.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/aflatin.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afloader.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afloader.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afmodule.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afmodule.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afpic.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afpic.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/aftypes.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/afwarp.c create mode 100644 alienblaster/project/jni/freetype/src/autofit/afwarp.h create mode 100644 alienblaster/project/jni/freetype/src/autofit/module.mk create mode 100644 alienblaster/project/jni/freetype/src/autofit/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/base/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/base/basepic.c create mode 100644 alienblaster/project/jni/freetype/src/base/basepic.h create mode 100644 alienblaster/project/jni/freetype/src/base/ftadvanc.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftapi.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftbase.h create mode 100644 alienblaster/project/jni/freetype/src/base/ftbbox.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftbdf.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftbitmap.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftcalc.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftcid.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftdbgmem.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftdebug.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftfstype.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftgasp.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftgloadr.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftglyph.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftgxval.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftinit.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftlcdfil.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftmm.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftobjs.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftotval.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftoutln.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftpatent.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftpfr.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftpic.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftrfork.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftsnames.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftstream.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftstroke.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftsynth.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftsystem.c create mode 100644 alienblaster/project/jni/freetype/src/base/fttrigon.c create mode 100644 alienblaster/project/jni/freetype/src/base/fttype1.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftutil.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftwinfnt.c create mode 100644 alienblaster/project/jni/freetype/src/base/ftxf86.c create mode 100644 alienblaster/project/jni/freetype/src/base/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/bdf/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/bdf/README create mode 100644 alienblaster/project/jni/freetype/src/bdf/bdf.h create mode 100644 alienblaster/project/jni/freetype/src/bdf/bdfdrivr.c create mode 100644 alienblaster/project/jni/freetype/src/bdf/bdfdrivr.h create mode 100644 alienblaster/project/jni/freetype/src/bdf/bdferror.h create mode 100644 alienblaster/project/jni/freetype/src/bdf/bdflib.c create mode 100644 alienblaster/project/jni/freetype/src/bdf/module.mk create mode 100644 alienblaster/project/jni/freetype/src/bdf/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/cache/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcbasic.c create mode 100644 alienblaster/project/jni/freetype/src/cache/ftccache.c create mode 100644 alienblaster/project/jni/freetype/src/cache/ftccache.h create mode 100644 alienblaster/project/jni/freetype/src/cache/ftccback.h create mode 100644 alienblaster/project/jni/freetype/src/cache/ftccmap.c create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcerror.h create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcglyph.c create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcglyph.h create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcimage.c create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcimage.h create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcmanag.c create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcmanag.h create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcmru.c create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcmru.h create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcsbits.c create mode 100644 alienblaster/project/jni/freetype/src/cache/ftcsbits.h create mode 100644 alienblaster/project/jni/freetype/src/cache/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/cff/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/cff/cffcmap.c create mode 100644 alienblaster/project/jni/freetype/src/cff/cffcmap.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cffdrivr.c create mode 100644 alienblaster/project/jni/freetype/src/cff/cffdrivr.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cfferrs.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cffgload.c create mode 100644 alienblaster/project/jni/freetype/src/cff/cffgload.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cffload.c create mode 100644 alienblaster/project/jni/freetype/src/cff/cffload.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cffobjs.c create mode 100644 alienblaster/project/jni/freetype/src/cff/cffobjs.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cffparse.c create mode 100644 alienblaster/project/jni/freetype/src/cff/cffparse.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cffpic.c create mode 100644 alienblaster/project/jni/freetype/src/cff/cffpic.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cfftoken.h create mode 100644 alienblaster/project/jni/freetype/src/cff/cfftypes.h create mode 100644 alienblaster/project/jni/freetype/src/cff/module.mk create mode 100644 alienblaster/project/jni/freetype/src/cff/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/cid/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/cid/ciderrs.h create mode 100644 alienblaster/project/jni/freetype/src/cid/cidgload.c create mode 100644 alienblaster/project/jni/freetype/src/cid/cidgload.h create mode 100644 alienblaster/project/jni/freetype/src/cid/cidload.c create mode 100644 alienblaster/project/jni/freetype/src/cid/cidload.h create mode 100644 alienblaster/project/jni/freetype/src/cid/cidobjs.c create mode 100644 alienblaster/project/jni/freetype/src/cid/cidobjs.h create mode 100644 alienblaster/project/jni/freetype/src/cid/cidparse.c create mode 100644 alienblaster/project/jni/freetype/src/cid/cidparse.h create mode 100644 alienblaster/project/jni/freetype/src/cid/cidriver.c create mode 100644 alienblaster/project/jni/freetype/src/cid/cidriver.h create mode 100644 alienblaster/project/jni/freetype/src/cid/cidtoken.h create mode 100644 alienblaster/project/jni/freetype/src/cid/module.mk create mode 100644 alienblaster/project/jni/freetype/src/cid/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/README create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvalid.h create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvbsln.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvcommn.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvcommn.h create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxverror.h create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvfeat.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvfeat.h create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvjust.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvkern.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvlcar.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmod.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmod.h create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmort.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmort.h create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmort0.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmort1.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmort2.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmort4.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmort5.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmorx.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmorx.h create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmorx0.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmorx1.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmorx2.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmorx4.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvmorx5.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvopbd.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvprop.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/gxvtrak.c create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/module.mk create mode 100644 alienblaster/project/jni/freetype/src/gxvalid/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/gzip/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/gzip/ftgzip.c create mode 100644 alienblaster/project/jni/freetype/src/gzip/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/lzw/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/lzw/ftlzw.c create mode 100644 alienblaster/project/jni/freetype/src/lzw/ftzopen.c create mode 100644 alienblaster/project/jni/freetype/src/lzw/ftzopen.h create mode 100644 alienblaster/project/jni/freetype/src/lzw/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/otvalid/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/otvalid/module.mk create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvalid.h create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvbase.c create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvcommn.c create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvcommn.h create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otverror.h create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvgdef.c create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvgpos.c create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvgpos.h create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvgsub.c create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvjstf.c create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvmath.c create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvmod.c create mode 100644 alienblaster/project/jni/freetype/src/otvalid/otvmod.h create mode 100644 alienblaster/project/jni/freetype/src/otvalid/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/pcf/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/pcf/README create mode 100644 alienblaster/project/jni/freetype/src/pcf/module.mk create mode 100644 alienblaster/project/jni/freetype/src/pcf/pcf.h create mode 100644 alienblaster/project/jni/freetype/src/pcf/pcfdrivr.c create mode 100644 alienblaster/project/jni/freetype/src/pcf/pcfdrivr.h create mode 100644 alienblaster/project/jni/freetype/src/pcf/pcferror.h create mode 100644 alienblaster/project/jni/freetype/src/pcf/pcfread.c create mode 100644 alienblaster/project/jni/freetype/src/pcf/pcfread.h create mode 100644 alienblaster/project/jni/freetype/src/pcf/pcfutil.c create mode 100644 alienblaster/project/jni/freetype/src/pcf/pcfutil.h create mode 100644 alienblaster/project/jni/freetype/src/pcf/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/pfr/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/pfr/module.mk create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrcmap.c create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrcmap.h create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrdrivr.c create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrdrivr.h create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrerror.h create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrgload.c create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrgload.h create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrload.c create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrload.h create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrobjs.c create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrobjs.h create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrsbit.c create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrsbit.h create mode 100644 alienblaster/project/jni/freetype/src/pfr/pfrtypes.h create mode 100644 alienblaster/project/jni/freetype/src/pfr/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/psaux/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/psaux/afmparse.c create mode 100644 alienblaster/project/jni/freetype/src/psaux/afmparse.h create mode 100644 alienblaster/project/jni/freetype/src/psaux/module.mk create mode 100644 alienblaster/project/jni/freetype/src/psaux/psauxerr.h create mode 100644 alienblaster/project/jni/freetype/src/psaux/psauxmod.c create mode 100644 alienblaster/project/jni/freetype/src/psaux/psauxmod.h create mode 100644 alienblaster/project/jni/freetype/src/psaux/psconv.c create mode 100644 alienblaster/project/jni/freetype/src/psaux/psconv.h create mode 100644 alienblaster/project/jni/freetype/src/psaux/psobjs.c create mode 100644 alienblaster/project/jni/freetype/src/psaux/psobjs.h create mode 100644 alienblaster/project/jni/freetype/src/psaux/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/psaux/t1cmap.c create mode 100644 alienblaster/project/jni/freetype/src/psaux/t1cmap.h create mode 100644 alienblaster/project/jni/freetype/src/psaux/t1decode.c create mode 100644 alienblaster/project/jni/freetype/src/psaux/t1decode.h create mode 100644 alienblaster/project/jni/freetype/src/pshinter/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/pshinter/module.mk create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshalgo.c create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshalgo.h create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshglob.c create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshglob.h create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshmod.c create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshmod.h create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshnterr.h create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshpic.c create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshpic.h create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshrec.c create mode 100644 alienblaster/project/jni/freetype/src/pshinter/pshrec.h create mode 100644 alienblaster/project/jni/freetype/src/pshinter/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/psnames/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/psnames/module.mk create mode 100644 alienblaster/project/jni/freetype/src/psnames/psmodule.c create mode 100644 alienblaster/project/jni/freetype/src/psnames/psmodule.h create mode 100644 alienblaster/project/jni/freetype/src/psnames/psnamerr.h create mode 100644 alienblaster/project/jni/freetype/src/psnames/pspic.c create mode 100644 alienblaster/project/jni/freetype/src/psnames/pspic.h create mode 100644 alienblaster/project/jni/freetype/src/psnames/pstables.h create mode 100644 alienblaster/project/jni/freetype/src/psnames/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/raster/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/raster/ftmisc.h create mode 100644 alienblaster/project/jni/freetype/src/raster/ftraster.c create mode 100644 alienblaster/project/jni/freetype/src/raster/ftraster.h create mode 100644 alienblaster/project/jni/freetype/src/raster/ftrend1.c create mode 100644 alienblaster/project/jni/freetype/src/raster/ftrend1.h create mode 100644 alienblaster/project/jni/freetype/src/raster/module.mk create mode 100644 alienblaster/project/jni/freetype/src/raster/rasterrs.h create mode 100644 alienblaster/project/jni/freetype/src/raster/rastpic.c create mode 100644 alienblaster/project/jni/freetype/src/raster/rastpic.h create mode 100644 alienblaster/project/jni/freetype/src/raster/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/sfnt/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/sfnt/module.mk create mode 100644 alienblaster/project/jni/freetype/src/sfnt/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/sfnt/sfdriver.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/sfdriver.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/sferrors.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/sfntpic.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/sfntpic.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/sfobjs.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/sfobjs.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttbdf.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttbdf.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttcmap.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttcmap.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttcmapc.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttkern.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttkern.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttload.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttload.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttmtx.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttmtx.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttpost.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttpost.h create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttsbit.c create mode 100644 alienblaster/project/jni/freetype/src/sfnt/ttsbit.h create mode 100644 alienblaster/project/jni/freetype/src/smooth/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/smooth/ftgrays.c create mode 100644 alienblaster/project/jni/freetype/src/smooth/ftgrays.h create mode 100644 alienblaster/project/jni/freetype/src/smooth/ftsmerrs.h create mode 100644 alienblaster/project/jni/freetype/src/smooth/ftsmooth.c create mode 100644 alienblaster/project/jni/freetype/src/smooth/ftsmooth.h create mode 100644 alienblaster/project/jni/freetype/src/smooth/ftspic.c create mode 100644 alienblaster/project/jni/freetype/src/smooth/ftspic.h create mode 100644 alienblaster/project/jni/freetype/src/smooth/module.mk create mode 100644 alienblaster/project/jni/freetype/src/smooth/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/truetype/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/truetype/module.mk create mode 100644 alienblaster/project/jni/freetype/src/truetype/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttdriver.c create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttdriver.h create mode 100644 alienblaster/project/jni/freetype/src/truetype/tterrors.h create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttgload.c create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttgload.h create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttgxvar.c create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttgxvar.h create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttinterp.c create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttinterp.h create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttobjs.c create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttobjs.h create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttpic.c create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttpic.h create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttpload.c create mode 100644 alienblaster/project/jni/freetype/src/truetype/ttpload.h create mode 100644 alienblaster/project/jni/freetype/src/type1/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/type1/module.mk create mode 100644 alienblaster/project/jni/freetype/src/type1/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/type1/t1afm.c create mode 100644 alienblaster/project/jni/freetype/src/type1/t1afm.h create mode 100644 alienblaster/project/jni/freetype/src/type1/t1driver.c create mode 100644 alienblaster/project/jni/freetype/src/type1/t1driver.h create mode 100644 alienblaster/project/jni/freetype/src/type1/t1errors.h create mode 100644 alienblaster/project/jni/freetype/src/type1/t1gload.c create mode 100644 alienblaster/project/jni/freetype/src/type1/t1gload.h create mode 100644 alienblaster/project/jni/freetype/src/type1/t1load.c create mode 100644 alienblaster/project/jni/freetype/src/type1/t1load.h create mode 100644 alienblaster/project/jni/freetype/src/type1/t1objs.c create mode 100644 alienblaster/project/jni/freetype/src/type1/t1objs.h create mode 100644 alienblaster/project/jni/freetype/src/type1/t1parse.c create mode 100644 alienblaster/project/jni/freetype/src/type1/t1parse.h create mode 100644 alienblaster/project/jni/freetype/src/type1/t1tokens.h create mode 100644 alienblaster/project/jni/freetype/src/type42/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/type42/module.mk create mode 100644 alienblaster/project/jni/freetype/src/type42/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/type42/t42drivr.c create mode 100644 alienblaster/project/jni/freetype/src/type42/t42drivr.h create mode 100644 alienblaster/project/jni/freetype/src/type42/t42error.h create mode 100644 alienblaster/project/jni/freetype/src/type42/t42objs.c create mode 100644 alienblaster/project/jni/freetype/src/type42/t42objs.h create mode 100644 alienblaster/project/jni/freetype/src/type42/t42parse.c create mode 100644 alienblaster/project/jni/freetype/src/type42/t42parse.h create mode 100644 alienblaster/project/jni/freetype/src/type42/t42types.h create mode 100644 alienblaster/project/jni/freetype/src/winfonts/Jamfile create mode 100644 alienblaster/project/jni/freetype/src/winfonts/fnterrs.h create mode 100644 alienblaster/project/jni/freetype/src/winfonts/module.mk create mode 100644 alienblaster/project/jni/freetype/src/winfonts/rules.mk create mode 100644 alienblaster/project/jni/freetype/src/winfonts/winfnt.c create mode 100644 alienblaster/project/jni/freetype/src/winfonts/winfnt.h create mode 100644 alienblaster/project/jni/freetype/version.sed create mode 100644 alienblaster/project/jni/freetype/vms_make.com create mode 100644 alienblaster/project/jni/sdl_ttf/Android.mk create mode 100644 alienblaster/project/jni/sdl_ttf/CHANGES create mode 100644 alienblaster/project/jni/sdl_ttf/COPYING create mode 100644 alienblaster/project/jni/sdl_ttf/MPWmake.sea.bin create mode 100644 alienblaster/project/jni/sdl_ttf/Makefile.am create mode 100644 alienblaster/project/jni/sdl_ttf/Makefile.in create mode 100644 alienblaster/project/jni/sdl_ttf/README create mode 100644 alienblaster/project/jni/sdl_ttf/SDL_ttf.c create mode 100644 alienblaster/project/jni/sdl_ttf/SDL_ttf.h create mode 100644 alienblaster/project/jni/sdl_ttf/SDL_ttf.spec create mode 100644 alienblaster/project/jni/sdl_ttf/SDL_ttf.spec.in create mode 100644 alienblaster/project/jni/sdl_ttf/VisualC.zip create mode 100644 alienblaster/project/jni/sdl_ttf/Watcom-Win32.zip create mode 100644 alienblaster/project/jni/sdl_ttf/Xcode.tar.gz create mode 100644 alienblaster/project/jni/sdl_ttf/acinclude/libtool.m4 create mode 100644 alienblaster/project/jni/sdl_ttf/acinclude/sdl.m4 create mode 100644 alienblaster/project/jni/sdl_ttf/aclocal.m4 create mode 100755 alienblaster/project/jni/sdl_ttf/autogen.sh create mode 100755 alienblaster/project/jni/sdl_ttf/config.guess create mode 100755 alienblaster/project/jni/sdl_ttf/config.sub create mode 100755 alienblaster/project/jni/sdl_ttf/configure create mode 100644 alienblaster/project/jni/sdl_ttf/configure.in create mode 100755 alienblaster/project/jni/sdl_ttf/depcomp create mode 100755 alienblaster/project/jni/sdl_ttf/gcc-fat.sh create mode 100644 alienblaster/project/jni/sdl_ttf/glfont.c create mode 100755 alienblaster/project/jni/sdl_ttf/install-sh create mode 100644 alienblaster/project/jni/sdl_ttf/ltmain.sh create mode 100755 alienblaster/project/jni/sdl_ttf/missing create mode 100644 alienblaster/project/jni/sdl_ttf/showfont.c create mode 100644 alienblaster/project/jni/sdl_ttf/version.rc diff --git a/alienblaster/Application.mk b/alienblaster/Application.mk index 9d5297292..5f9cacf1a 100644 --- a/alienblaster/Application.mk +++ b/alienblaster/Application.mk @@ -1,2 +1,2 @@ APP_PROJECT_PATH := $(call my-dir)/project -APP_MODULES := application stlport sdl sdl_main sdl_mixer tremor sdl_image png jpeg +APP_MODULES := application stlport sdl sdl_main sdl_mixer tremor sdl_image png jpeg sdl_ttf freetype diff --git a/alienblaster/project/jni/application/Android.mk b/alienblaster/project/jni/application/Android.mk index e514d3105..6a608047a 100644 --- a/alienblaster/project/jni/application/Android.mk +++ b/alienblaster/project/jni/application/Android.mk @@ -22,7 +22,7 @@ LOCAL_SRC_FILES := $(foreach F, $(APP_SUBDIRS), $(addprefix $(F)/,$(notdir $(wil # Uncomment to also add C sources LOCAL_SRC_FILES += $(foreach F, $(APP_SUBDIRS), $(addprefix $(F)/,$(notdir $(wildcard $(LOCAL_PATH)/$(F)/*.c)))) -LOCAL_SHARED_LIBRARIES := sdl sdl_mixer tremor +LOCAL_SHARED_LIBRARIES := sdl sdl_mixer tremor sdl_ttf LOCAL_STATIC_LIBRARIES := stlport diff --git a/alienblaster/project/jni/freetype/.gitignore b/alienblaster/project/jni/freetype/.gitignore new file mode 100644 index 000000000..aee2e4ce1 --- /dev/null +++ b/alienblaster/project/jni/freetype/.gitignore @@ -0,0 +1 @@ +config.mk diff --git a/alienblaster/project/jni/freetype/Android.mk b/alienblaster/project/jni/freetype/Android.mk new file mode 100644 index 000000000..0a5483322 --- /dev/null +++ b/alienblaster/project/jni/freetype/Android.mk @@ -0,0 +1,28 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := freetype + +APP_SUBDIRS := $(patsubst $(LOCAL_PATH)/%, %, $(shell find $(LOCAL_PATH)/src -type d)) + +# Add more subdirs here, like src/subdir1 src/subdir2 + +LOCAL_CFLAGS := $(foreach D, $(APP_SUBDIRS), -I$(LOCAL_PATH)/$(D)) \ + -I$(LOCAL_PATH)/include -DFT2_BUILD_LIBRARY + + +#Change C++ file extension as appropriate +LOCAL_CPP_EXTENSION := .cpp + +LOCAL_SRC_FILES := $(foreach F, $(APP_SUBDIRS), $(addprefix $(F)/,$(notdir $(wildcard $(LOCAL_PATH)/$(F)/*.cpp)))) +# Uncomment to also add C sources +LOCAL_SRC_FILES += $(foreach F, $(APP_SUBDIRS), $(addprefix $(F)/,$(notdir $(wildcard $(LOCAL_PATH)/$(F)/*.c)))) + +LOCAL_SHARED_LIBRARIES := + +LOCAL_STATIC_LIBRARIES := + +LOCAL_LDLIBS := + +include $(BUILD_STATIC_LIBRARY) diff --git a/alienblaster/project/jni/freetype/ChangeLog b/alienblaster/project/jni/freetype/ChangeLog new file mode 100644 index 000000000..83a7d53c6 --- /dev/null +++ b/alienblaster/project/jni/freetype/ChangeLog @@ -0,0 +1,7948 @@ +2010-02-13 Werner Lemberg + + * Version 2.3.12 released. + ========================== + + + Tag sources with `VER-2-3-12'. + + * docs/CHANGES: Updated. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.12. + + * README, Jamfile (RefDoc), + builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html, + builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj, + builds/win32/visualce/index.html, + builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2005-ce/index.html, + builds/wince/vc2008-ce/freetype.vcproj, + builds/wince/vc2008-ce/index.html: s/2.3.11/2.3.12/, s/2311/2312/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 12. + + * builds/unix/configure.raw (version_info): Set to 10:0:4. + +2010-02-12 suzuki toshiya + + Improve autotool version checking to work with beta releases. + + * autogen.sh (check_tool_version): Improve the extraction of version + number from "tool --version" output. Some beta releases of + autotools have extra strings before version number. + +2010-02-12 suzuki toshiya + + Fix overallocating bug in FT_Outline_New_Internal(). + + * src/base/ftoutln.c (FT_Outline_New_Internal): The length of + FT_Outline->points[] should be numPoints, not 2 * numPoints. + Found by Paul Messmer, see + http://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html + +2010-02-10 Ken Sharp + + Really fix Savannah bug #28678 (part 2). + + Since we consider `sbw' for the horizontal direction only, we still have + to synthesize vertical metrics if the user wants to use the vertical + writing direction. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): + Synthesize vertical metrics (only) if FT_LOAD_VERTICAL_LAYOUT is + set. + +2010-02-10 Ken Sharp + + Really fix Savannah bug #28678 (part 1). + + After long discussion, we now consider the character width vector + (wx,wy) returned by the `sbw' Type 1 operator as being part of *one* + direction only. For example, if you are using the horizontal + writing direction, you get the horizontal and vertical components of + the advance width for this direction. Note that OpenType and CFF fonts + don't have such a vertical component; instead, the GPOS table can be + used to generate two-dimensional advance widths (but this isn't + handled by FreeType). + + * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add + `advance_v' field to hold the vertical component of the advance + value. + + * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c + (cff_slot_load), src/type1/t1gload.c + (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c + (cid_load_glyph): Use it. + +2010-02-08 Werner Lemberg + + * devel/ftoption.h [FT_CONFIG_OPTION_PIC]: Define. + +2010-02-04 suzuki toshiya + + Prevent NULL pointer dereference passed to FT_Module_Requester. + + * src/sfnt/sfdriver.c (sfnt_get_interface): Don't use `module'. + * src/psnames/psmodule.c (psnames_get_interface): Ditto. + + * src/cff/cffdrivr.c (cff_get_interface): Check NULL `driver'. + * src/truetype/ttdriver.c (tt_get_interface): Ditto. + +2010-01-29 suzuki toshiya + + Fix memory leaks in previous patch. + + * src/sfnt/sfobjs.c (sfnt_load_face): Don't overwrite the strings + allocated for face->root.family_name and style_name. + +2010-01-29 suzuki toshiya + + New parameters for FT_Open_Face() to ignore preferred family names. + + Preferred family names should be used for legacy systems that + can hold only a few faces (<= 4) for a family name. Suggested by + Andreas Heinrich. + http://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html + + * include/freetype/ftsnames.h (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY, + FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Define. + + * src/sfnt/sfobjs.h (sfnt_load_face): Check the arguments and + ignore preferred family and subfamily names if requested. + +2010-01-27 Ken Sharp + + Fix Savannah bug #28678. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_load_glyph): Handle vertical metrics correctly. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Handle + vertical metrics correctly. + (T1_Load_Glyph): Don't synthesize vertical metrics. + +2010-01-14 Werner Lemberg + + Make FT_Set_Transform work if no renderer is available. + + * src/base/ftobjs.c (FT_Load_Glyph): Apply `standard' transformation + if no renderer is compiled into the library. + +2010-01-14 Werner Lemberg + + Fix compilation warning. + + * src/base/ftbase.h: s/LOCAL_DEF/LOCAL/. + * src/base/ftobjc.s: Include ftbase.h conditionally. + +2010-01-11 Kwang Yul Seo + + Provide inline assembly code for RVCT compiler. + This is Savannah patch #7059. + + * include/freetype/config/ftconfig.h (FT_MULFIX_ASSEMBLER, + FT_MulFix_arm) [__CC_ARM || __ARM_CC]: Define. + +2010-01-08 Ken Sharp + + Fix Savannah bug #28521. + + Issue #28226 involved a work-around for a font which used the + `setcurrentpoint' operator in an invalid way; this operator is only + supposed to be used with the result of OtherSubrs, and the font used + it directly. The supplied patch removed the block of code which + checked this usage entirely. + + This turns out to be a Bad Thing. If `setcurrentpoint' is being + used correctly it should reset the flex flag in the decoder. If we + don't do this then the flag never gets reset and we omit any further + contours from the glyph (at least until we close the path or + similar). + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : Handle `flex_state' correctly. + +2010-01-05 Werner Lemberg + + Apply reports from clang static analyzer. + + * src/lzw/ftlzw.c (ft_lzw_file_init), src/base/ftstroke.c + (FT_Stroker_ParseOutline), src/base/ftsynth.c + (FT_GlyphSlot_Embolden): Remove dead code. + + * src/base/ftpatent.c (_tt_check_patents_in_table): Initialize + `offset_i' and `length_i'. + +2010-01-05 Ralph Giles + + Enable the incremental font interface by default. + + Ghostscript requires the incremental font interface for handling + some Postscript documents. It is moving to using FreeType as its + primary renderer; supporting this in the default build makes it + Ghostscript to be linked against the system FreeType when one is + available. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL): + Uncomment. + +2010-01-05 Werner Lemberg + + Fix Savannah bug #28395. + + * src/truetype/ttdriver.c (Load_Glyph), src/type1/t1gload.c + (T1_Loada_Glyph): Don't check `num_glyphs' if incremental interface + is used. + +2010-01-05 Ken Sharp + + Make Type 1 `seac' operator work with incremental interface. + This fixes Savannah bug #28480. + + * src/psaux/t1decode.c (t1operator_seac): Don't check `glyph_names' + if incremental interface is used. + +2010-01-04 Ken Sharp + + Make incremental interface work with TrueType fonts. + This fixes Savannah bug #28478. + + * src/truetype/ttgload.c (load_truetype_glyph): Don't check + `glyf_offset' if incremental interface is used. + +2009-12-31 Lars Abrahamsson + + Make compilation with FT_CONFIG_OPTION_PIC work again. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap) [FT_CONFIG_OPTION_PIC]: + Declare `library' for FT_BITMAP_GLYPH_CLASS_GET. + + * src/base/ftinit.c (ft_destroy_default_module_classes, + ft_create_default_module_classes): Use proper casts (needed for C++ + compilation). + + * src/sfnt/ttcmap.c (tt_cmap13_class_rec): Use FT_DEFINE_TT_CMAP. + +2009-12-22 Marc Kleine-Budde + + Make freetype-config aware of $SYSROOT. + This is Savannah patch #7040. + + * builds/unix/freetype-config.in: Decorate with ${SYSROOT} where + appropriate. + +2009-12-20 Werner Lemberg + + Fix compiler warning. + Reported by Sean. + + * src/base/ftdbgmem.c [!FT_DEBUG_MEMORY]: ANSI C doesn't like empty + source files; however, some compilers warn about an unused variable + declaration. This is now replaced with a typedef. + +2009-12-18 Werner Lemberg + + Fix Savannah bug #28320. + + There exist corrupt, subsetted fonts (embedded in PDF files) which + contain a private dict that ends with an unterminated floating point + number (no operator following). We now ignore this error (as + acrobat does). + + * src/cff/cffparse.c (cff_parser_run): Don't emit a syntax error for + unterminated floating point numbers. + +2009-12-16 Werner Lemberg + + Really fix compiler warnings. + Reported by Sean. + + * src/truetype/ttgxvar.c (GX_PT_POINTS_ARE_WORDS, + GX_PT_POINT_RUN_COUNT_MASK): Convert enum values to macros. + +2009-12-16 suzuki toshiya + + Improve configure.raw to copy some options from CFLAGS to LDFLAGS. + The linker of Mac OS X 10.6 is sensitive to the architecture. If + the architectures are specified explicitly for the C compiler, the + linker requires the architecture specifications too. + + * builds/unix/configure.raw: Replace `-isysroot' option parser by + more generic argument parser. + +2009-12-15 Werner Lemberg + + Fix compiler warnings. + Reported by Sean. + + * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): Fix counter data + type. + +2009-12-14 Ken Sharp + + Ignore invalid `setcurrentpoint' operations in Type 1 fonts. + This fixes Savannah bug #28226. + + At least two wild PostScript files of unknown provenance contain + Type 1 fonts, apparently converted from TrueType fonts in earlier + PDF versions of the files, which use the `setcurrentpoint' operator + inappropriately. + + FreeType currently throws an error in this case, but Ghostscript and + Adobe Distiller both accept the fonts and ignore the problem. This + commit #ifdefs out the check so PostScript interpreters using + FreeType can render these files. + + The specification says `setcurrentpoint' should only be used to set + the point after a `Subr' call, but these fonts use it to set the + initial point to (0,0). Unnecessarily so, as they correctly use an + `hsbw' operation which implicitly sets the initial point. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : Comment out code. + +2009-12-14 Bram Tassyns + + Fix parsing of /CIDFontVersion. + This fixes Savannah bug #28287. + + * src/cid/cidtoken.h: `cid_version' in CID_FaceInfoRec (in + t1tables.h) is of type FT_Fixed. + +2009-12-14 Werner Lemberg + + Trace glyph index in CID module. + Suggested in Savannah patch #7023. + + * src/cid/cidgload.c (cid_load_glyph): Add tracing message. + +2009-12-03 Werner Lemberg + + Fix compiler warnings. + + * src/truetype/ttgload.c (tt_get_metrics): Put `Exit' label into the + proper preprocessor conditional. + * src/pfr/pfrobjs.c (pfr_slot_load): Pacify gcc. + +2009-11-25 John Tytgat + + Better handling of start of `eexec' section. + This fixes Savannah bug #28090. + + * src/type1/t1parse.c (T1_Get_Private_Dict): Skip all whitespace + characters before start of `eexec' section. + +2009-11-20 Werner Lemberg + + Fix Savannah bug #27742. + + * src/base/ftstroke.c (ft_stroker_outside): Avoid silent division by + zero, using a threshold for `theta'. + +2009-11-20 Werner Lemberg + + Fix Savannah bug #28036. + + * src/type1/t1afm.c (t1_get_index): Fix comparison. + +2009-11-16 Werner Lemberg + + Fix compiler warnings. + Reported by Kevin Blenkinsopp . + + * src/sfnt/ttload.c (check_table_dir): Use proper data type. + +2009-11-15 Werner Lemberg + + Really fix FreeDesktop bug #21197. + This also fixes Savannah bug #28021. + + * src/autofit/aflatin.c (af_latin_metrics_check_digits), + src/autofit/aflatin2.c (af_latin2_metrics_check_digits): Fix loop. + +2009-11-15 Werner Lemberg + + Add tracing messages for advance values. + + * src/base/ftobjs.c (FT_Load_Glyph), src/truetype/ttgload.c + (TT_Get_HMetrics, TT_Get_VMetrics): Do it. + +2009-11-08 Werner Lemberg + + Fix compiler warning. + Reported by Jeremy Manson . + + * src/truetype/ttgload.c (load_truetype_glyph): Initialize `error'. + +2009-11-04 Werner Lemberg + + Remove compiler warning. + Reported by Sean McBride . + + * src/tools/apinames.c (read_header_file): Use a cast to + `int', as specified in the printf(3) man page. + +2009-11-04 Werner Lemberg + + Fix Savannah bug #27921. + + * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c + (cid_face_init), src/type1/t1afm.c (T1_Read_Metrics), + src/type1/t1objs.c (T1_Face_Init): Don't use unsigned constant + values for rounding if the argument can be negative. + +2009-11-03 Bram Tassyns + + Add basic support for Type1 charstrings in CFF. + This fixes Savannah bug #27922. + + * src/cff/cffgload.c (CFF_Operator, cff_argument_counts): Handle + `seac', `sbw', and `setcurrentpoint' opcodes. + (cff_compute_bias): Add parameter to indicate the charstring type. + Update all callers. + (cff_operator_seac): Add parameter for side bearing. + (cff_decoder_parse_charstrings): Updated for more Type1 support. + +2009-11-03 Werner Lemberg + + Return correct `linearHoriAdvance' value for embedded TT bitmaps too. + Reported by Jeremy Manson . + + src/truetype/ttgload.c (load_truetype_glyph): Add parameter to + quickly load the glyph header only. + Update all callers. + (tt_loader_init): Add parameter to quickly load the `glyf' table + only. + Update all callers. + (TT_Load_Glyph): Compute linear advance values for embedded bitmap + glyphs too. + +2009-11-03 Werner Lemberg + + Improve code readability. + + * src/ttgload.c (load_truetype_glyph): Move metrics calculation + to... + (tt_get_metrics): This new function. + +2009-10-26 Bram Tassyns + + Fix Savannah bug #27811. + + * src/truetype/ttxgvar.c (ft_var_readpackeddeltas): Fix + signed/unsigned mismatch. + +2009-10-19 Ning Dong + + Fix handling of `get' and `put' CFF instructions. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) : Appendix B of Adobe Technote #5177 limits the number of + elements for the `get' and `put' operators to 32. + * src/cff/cffgload.h (CFF_MAX_TRANS_ELEMENTS): Define. + (CFF_Decoder): Use it for `buildchar' and remove `len_buildchar'. + +2009-10-18 Werner Lemberg + + Fix handling of `dup' CFF instruction. + Problem and solution reported by Ning Dong . + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) : + Increase `args' by 2, not 1. + +2009-10-10 Werner Lemberg + + * Version 2.3.11 released. + ========================== + + + Tag sources with `VER-2-3-11'. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.11. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.10/2.3.11/, s/2310/2311/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 11. + + * builds/unix/configure.raw (version_info): Set to 9:22:3. + +2009-10-10 Werner Lemberg + + * docs/CHANGES, docs/release: Updated. + +2009-10-10 suzuki toshiya + + * src/pcf/pcfread.c (pcf_get_properties): Fix a bug in the nprops + truncation. Reported by Martin von Gagern and Peter Volkov. + https://bugs.gentoo.org/288357 and https://bugs.gentoo.org/288256 + +2009-10-06 Werner Lemberg + + * Version 2.3.10 released. + ========================== + + + Tag sources with `VER-2-3-10'. + + * builds/toplevel.mk (major, minor, patch): Fix regexp to allow more + than a single digit. + (dist): We now use git. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.10. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.9/2.3.10/, s/239/2310/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. + + * builds/unix/configure.raw (version_info): Set to 9:21:3. + +2009-10-06 Werner Lemberg + + Fix `make multi'. + + * src/cache/ftccache.c, src/cache/ftcsbits.c (FT_COMPONENT): Define. + + * src/sfnt/sfdriver.c: Include FT_INTERNAL_DEBUG_H. + +2009-09-27 suzuki toshiya + + [cache] Fix Savannah bug #27441, clean up Redhat bugzilla #513582. + Tricky casts in FTC_{CACHE,GCACHE,MRULIST}_LOOKUP_CMP() are removed. + Now these functions should be called with FTC_Node or FTC_MruNode + variable, and the caller should cast them to appropriate pointers to + concrete data. These tricky casts can GCC-4.4 optimizer (-O2) + confused and the crashing binaries are generated. + + * src/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Drop tricky cast. + Now the 4th argument `node' of this function should be typed as + FTC_MruNode. + + * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): For inline + implementation, new temporal variable FTC_MruNode `_mrunode' to take + the pointer from FTC_MRULIST_LOOKUP_CMP(). For non-inline + implementation, tricky cast is dropped. + + * src/cache/ftcmanag.c (FTC_SIZE_NODE): New macro casting + to FTC_SizeNode. + (FTC_Manager_LookupSize): Replace FTC_SizeNode `node' by FTC_MruNode + `mrunode', and FTC_SIZE_NODE() is inserted. + (FTC_FACE_NODE): New macro casting to FTC_FaceNode. + (FTC_Manager_LookupFace) Replace FTC_FaceNode `node' by FTC_MruNode + `mrunode', and FTC_FACE_NODE() is inserted. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Change the type of + `node' from FTC_INode to FTC_Node. Extra casting macro FTC_NODE() + is dropped. + (FTC_ImageCache_LookupScaler): Ditto. + (FTC_SBitCache_Lookup): Change the type of `node' from FTC_SNode to + FTC_Node. Extra casting macro FTC_NODE() is dropped. FTC_SNODE() + is inserted. + (FTC_SBitCache_LookupScaler): Ditto. + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the type of + `node' from FTC_CMapNode to FTC_Node. Extra casting macro + FTC_NODE() is dropped, FTC_CMAP_NODE() is inserted. + +2009-09-25 suzuki toshiya + + [cache, psaux, type1] Fix for multi build. + In multi build, some cpp functions are left as unresolved symbols. + + * src/cache/ftcbasic.c: Include FT_INTERNAL_DEBUG_H for FT_TRACE1(). + + * src/psaux/t1decode.c: Include FT_INTERNAL_CALC_H for + FIXED_TO_INT(). + * src/type1/t1gload.c: Ditto. + * src/type1/t1objs.c: Ditto. + +2009-09-25 suzuki toshiya + + [autofit] Fix for multi build. + + * src/autofit/afmodule.h: Include FT_INTERNAL_OBJECTS_H to use + FT_DECLARE_MODULE() macro in multi build. + + * src/autofit/aflatin.c: Include to handle + FT_ADVANCES_H correctly in multi build. + +2009-09-24 suzuki toshiya + + [cache] Check the face filled by FTC_Manager_LookupFace(). + + * src/cache/ftcbasic.c (ftc_basic_family_get_count): Return + immediately if FTC_Manager_LookupFace() fills face by NULL. Such + case can occur when the code is optimized by GCC-4.2.x. + +2009-09-23 Werner Lemberg + + * docs/CHANGES: Updated. + +2009-09-12 Werner Lemberg + + [raster] Fix 5-levels grayscale output. + This was broken since version 2.3.0. + + * src/raster/ftraster.c (count_table): Use pre-2.3.0 values (which + were then computed dynamically). + (Vertical_Gray_Sweep_Step): Updated. + + (ft_black_render): Initialize `worker->gray_lines' (problem found by + valgrind). + + (FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Dont' #undef, just + comment out. + +2009-09-12 suzuki toshiya + + Improve configure.raw for cross build. + + * builds/unix/configure.raw: Remove temporal files created by the + suffix checking for CC_BUILD. Set XX_ANSIFLAGS and XX_CFLAGS when + cross compiler is GCC. AC_PROG_CC checks whether the cross compiler + is GCC, its result is stored in GCC. + +2009-09-12 suzuki toshiya + + [BDF] Modify hash API to take size_t value instead of void *. + + The hash API in BDF driver is designed to be generic, it takes + void * typed data. But BDF driver always gives an unsigned long + integer (the index to a property). To reduce non-essential + casts from unsigned long to void* and from void* to unsigned + long, the hash API is changed to take size_t integer. + The issue of incompatible cast between unsigned long and void* + on LLP64 platform is reported by NightStrike from MinGW-Win64 + project. See + http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html + + * src/bdf/bdf.h: The type of hashnode->data is changed from + void* to size_t. + + * src/bdf/bdflib.c (hash_insert): Get size_t data, instead of + void* data. + (bdf_create_property): Get the name length of new property by + size_t variable, with a cut-off at FT_ULONG_MAX. + (_bdf_set_default_spacing): Get the name length of the face by + size_t variable, with a cut-off at 256. + (bdf_get_property): Get the property id by size_t variable to + reduce the casts between 32-bit prop ID & hashnode->data during + simple copying. + (_bdf_add_property): Ditto. + (_bdf_parse_start): Calculate the index to the property array + by size_t variable. + (bdf_get_font_property): Drop a cast to unsigned long. + +2009-09-10 suzuki toshiya + + [Win64] Improve the computation of random seed from stack address. + + On LLP64 platform, the conversion from pointer to FT_Fixed need + to drop higher 32-bit. Explict casts are required. Reported by + NightStrike from MinGW-w64 project. See + http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html + + * src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly. + + * src/psaux/t1decode.c: Ditto. + + +2009-09-03 Werner Lemberg + + [raster] Improvements for stand-alone mode. + + * src/raster/rules.mk: Don't handle ftmisc.h. It is needed for + stand-alone mode only. + + * src/raster/ftmisc.h (FT_MemoryRec , FT_Alloc_Func, FT_Free_Func, + FT_Realloc_Func): Copy declarations from ftsystem.h. + +2009-09-02 Bram Tassyns + + Improve vertical metrics calculation (Savannah bug #27364). + + The calculation of `vertBearingX' is not defined in the OTF font + spec so FreeType does a `best effort' attempt. However, this value + is defined in the PDF and PostScript specs, and that algorithm is + better than the one FreeType currently uses: + + FreeType: Use the middle of the bounding box as the X coordinate + of the vertical origin. + + Adobe PDF spec: Use the middle of the horizontal advance vector as + the X coordinate of the vertical origin. + + FreeType's algorithm goes wrong if you have a really small glyph + (like the full-width, circle-like dot at the end of the sentence, as + used in CJK scripts) with large bearings. With the FreeType + algorithm this dot gets centered on the baseline; with the PDF + algorithm it gets the correct location (in the top right). Note + that this is a serious issue, it's like printing the dot at the end + of a Roman sentence at the center of the textline instead of on the + baseline like it should. So i believe the PDF spec's algorithm + should be used in FreeType as well. + + The `vertBearingY' value for such small glyphs is also very strange + if no `vmtx' information is present, since the height of the bbox is + not representable for the height of the glyph visually (the + whitespace up to the baseline is part of the glyph). The fix also + includes some code for a better estimate of `vertBearingY'. + + * src/base/ftobjs.c (ft_synthesize_vertical_metrics): `vertBearingX' + is now calculated as described by the Adobe PDF Spec. Estimate for + `vertBearingY' now works better for small glyphs completely above or + below the baseline into account. + + * src/cff/cffgload.c (cff_slot_load): `vertBearingX' is now + calculated as described by the Adobe PDF Spec. Vertical metrics + information was always ignored when FT_CONFIG_OPTION_OLD_INTERNALS + was not defined. + + * src/truetype/ttgload.c (compute_glyph_metrics): `vertBearingX' is + now calculated as described by the Adobe PDF Spec. + +2009-09-01 John Tytgat + + Fix custom cmap for empty Type 1 font (Savannah bug #27294). + + * include/freetype/internal/t1types.h (T1_EncodingRecRec_): Update + comment to reflect revised code_last meaning. + * src/type1/t1load.c (T1_Open_Face), src/type42/t42objs.c + (T42_Open_Face): Assign max_char as highest character code + 1 and + use this for T1_EncodingRecRec_::code_last. + * src/psaux/t1cmap.c (t1_cmap_custom_init): Follow revised + T1_EncodingRecRec_::code_last meaning. + +2009-08-25 Werner Lemberg + + Fix rendering of horizontally compressed CFFs. + Bug reported by Ivan Nincic . + + * src/cff/cffgload.c (cff_slot_load): Thinko: Check `xx' element of + `font_matrix' also. + + * docs/CHANGES: Updated. + +2009-08-03 suyu0925@gmail.com + + Don't call `ft_fseek' every time when executing `ft_fread'. + + * src/base/ftstream.c (FT_Stream_Seek), src/base/ftsystem.c + (ft_ansi_stream_io): Implement it. + +2009-07-31 suzuki toshiya + + sfnt: Cast a charcode to 32-bit in cmap format 14 parser. + + * src/sfnt/ttcmap.c (tt_cmap14_char_var_index, + tt_cmap14_char_var_isdefault, tt_cmap14_char_variants, + tt_cmap14_variant_chars): Correct mismatches from + FT_CMap_CharVarIndexFunc prototype, FT_ULong arguments + are replaced by FT_UInt32 arguments. + +2009-07-31 suzuki toshiya + + sfnt: Cast a charcode to 32-bit in cmap format 12 parser. + + * src/sfnt/ttcmap.c (tt_cmap12_char_next): + Insert explicit cast from FT_UFast to FT_UInt32 + for return value. + +2009-07-31 suzuki toshiya + + psaux: Fix a few casts to FT_Int32 value. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): + Fix a few casts setting `value' from FT_Long to FT_Int32, + because `value' is typed as FT_Int32 since 2009-06-22. + +2009-07-31 suzuki toshiya + + sfnt: Fix a data type mismatching with its source. + + * src/sfnt/ttcmap.c (tt_cmap13_char_next): Fix the + type of `gindex' from FT_ULong to FT_UInt because + it is set by FT_UInt tt_cmap13_char_map_binary() or + TT_CMap13->cur_gindex. + +2009-07-31 suzuki toshiya + + sfnt: Extend a few local variables to load 32-bit values. + + * src/sfnt/ttkern.c (tt_face_load_kern): Extend `count' + and `kern' to load 32-bit values. + +2009-07-31 suzuki toshiya + + pfr: Extend `num_aux' to take 32-bit value. + + * src/pfr/pfrload.c (pfr_phy_font_load): Extend + `num_aux' to load 32-bit value. + +2009-07-31 suzuki toshiya + + pcf: Truncate FT_ULong `nprops' to fit to int PCF_Face->nprops. + + * src/pcf/pcfread.c (pcf_get_properties): Load `nprops' + as FT_ULong value from PCF file, but truncate it as + int to fit PCF_Face->nprops. The number of truncated + properties is shown in the trace message. + +2009-07-31 suzuki toshiya + + gxvalid: Extend a few local variables to reduce the casts. + + * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate): + Extend `type' and `rest' to take FT_ULong values. + +2009-07-31 suzuki toshiya + + gxvalid: Extend `settingTable' to take 32-bit offset. + + * src/gxvalid/gxvfeat.c (gxv_feat_name_validate): + Extend `settingTable' to take 32-bit offset. + +2009-07-31 suzuki toshiya + + autofit: Cast FT_Long glyph_count to compare with FT_UInt GID. + + * src/autofit/afglobal.c (af_face_globals_is_digit, + af_face_globals_compute_script_coverage): Cast FT_Long + globals->glyph_count to FT_ULong, to compare with FT_UInt + gindex. + +2009-07-31 suzuki toshiya + + smooth: Exclude 16-bit system in invalid pitch/height check. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): + pitch and height are typed as FT_UInt but checked to fit + 16-bit range, to avoid the overflows. On 16-bit system, + this checking inserts a conditional that never occurs. + +2009-07-03 suzuki toshiya + + cff: Type large constants > 0x7FFF as long for 16-bit systems. + + * src/cff/cffload.c (cff_charset_load): Type large + constants > 0x7FFF as long, because normal constants + are typed signed integer that is less than 0x8000 on + 16-bit systems. + +2009-07-31 suzuki toshiya + + base: Remove an unused variable. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove an + unused variable `library'. glyph->library is used. + +2009-07-31 suzuki toshiya + + cache: Check higher bits in flags for non ILP32 systems. + + 4 public functions ought to take FT_ULong flags, but take + FT_UInt flags. To keep binary compatibility, we drop higher + bits on non ILP32 platforms, + ILP64 systems: No drop occurs. + LP64 systems: Higher bits are not used. + 16-bit systems: Drop can occur. + See + http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html + These functions will be refined to take FT_ULong flags in + next bump with incompatible API change. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): + Check `flags' in `type', the 2nd argument. + (FTC_SBitCache_Lookup): Ditto. + (FTC_ImageCache_LookupScaler): Check `load_flags', + the 3rd argument. + (FTC_SBitCache_LookupScaler): Ditto. + +2009-07-31 suzuki toshiya + + sfnt: Ignore invalid GIDs in glyph name lookup. + + * include/freetype/internal/fttrace.h: + New trace module for sfdriver.c is added. + + * src/sfnt/sfdriver.c (sfnt_get_name_index): + Restrict glyph name lookup to FT_UInt GID. + Genuine TrueType can hold 16-bit glyphs. + +2009-07-31 suzuki toshiya + + pcf: Fix a comparison between FT_Long and FT_ULong. + + * src/pcf/pcfread.c (pcf_get_bitmaps): Return an error + if PCF_Face->nemetrics is negative. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `nFeatureFlags' size up to 32-bit. + + * src/gxvalid/gxvmort.c (gxv_mort_featurearray_validate): + Extend the 3rd argument `nFeatureFlags' to FT_ULong. + * src/gxvalid/gxvmort.h: Ditto. + +2009-07-31 suzuki toshiya + + sfnt: Insert explicit cast for LP64 system. + + * src/sfnt/ttkern.c (tt_face_load_kern): Insert + cast from unsigned long to FT_UInt32. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `just' table size upto 32-bit. + + * src/gxvalid/gxvjust.c (gxv_just_validate): + The type of `offset' is changed from FT_UInt to + FT_Offset, for 16-bit platforms. + +2009-07-31 suzuki toshiya + + gxvalid: Guarantee `trak' table size upto 32-bit. + + * src/gxvalid/gxvtrak.c (gxv_trak_validate): + The type of `offset' is changed from FT_UInt to + FT_Offset, for 16-bit platforms. + +2009-07-31 suzuki toshiya + + type1: Fix a data type mismatching with its source. + + * include/freetype/internal/t1types.h: The type of + T1_Face->buildchar is matched with T1_Decorder->top. + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_KernItem->offset + is extended from FT_UInt32 to FT_Offset, because it is + calculated with the pointer difference, in + pfr_extra_item_load_kerning_pairs(). + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_PhysFont->chars_offset + is extended from FT_UInt32 to FT_Offset, because it is + calculated with the pointer difference in pfr_phy_font_load(). + +2009-07-31 suzuki toshiya + + pfr: Fix a data type mismatching with its source. + + * src/pfr/pfrtypes.h: The type of PFR_PhyFont->bct_offset + is extended from FT_UInt32 to FT_Long, because it is + loaded by FT_STREAM_POS() in pfr_phy_font_load(). + +2009-07-31 suzuki toshiya + + smooth: Improve the format in debug message. + + * src/smooth/ftgrays.c (gray_dump_cells): Improve the + format specifications to dump variables. + +2009-07-31 suzuki toshiya + + sfnt: Fix a data type mismatching with its source. + + * src/sfnt/sfobjs.c (sfnt_load_face): The type of + local `flags' is matched with FT_Face->face_flags. + +2009-07-31 suzuki toshiya + + psaux: Fix a data type mismatching with its source. + + * include/freetype/internal/psaux.h: The type of + T1_DecorderRec.buildchar is matched with + T1_DecorderRec.top. + +2009-07-31 suzuki toshiya + + truetype: Extend TrueType GX packed deltas to FT_Offset. + + * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): + The type of 2nd argument `delta_cnt' is changed from + FT_Int to FT_Offset, because its source can be cvt + table size calculated from stream position. + +2009-07-31 suzuki toshiya + + truetype: Extend mmvar_len to hold size_t values. + + * src/truetype/ttgxvar.h: The type of + GX_BlendRec.mmvar_len is changed from FT_Int to + FT_Offset, because TT_Get_MM_Var() calculates it + by sizeof() results. + +2009-07-31 suzuki toshiya + + truetype: Check invalid function number in IDEF instruction. + + * src/truetype/ttinterp.c (Ins_IDEF): Check + if the operand fits to 8-bit opcode limitation. + +2009-07-31 suzuki toshiya + + truetype: Check invalid function number in FDEF instruction. + + * src/truetype/ttinterp.c (Ins_FDEF): Check + if the operand fits 16-bit function number. + +2009-07-31 suzuki toshiya + + truetype: Truncate the deltas of composite glyph at 16-bit values. + + * src/truetype/ttgload.c (load_truetype_glyph): + Insert cast from FT_Long (deltas[i].{x,y}) to + FT_Int16 in the summation of deltas[] for composite + glyphs. Because deltas[i] is typed as FT_Pos, + its component x, y are typed as FT_Long, but + their sources are always FT_Int16 when they are + loaded by ft_var_readpackeddeltas(). However, + the limitation about the summed deltas is unclear. + +2009-07-31 suzuki toshiya + + truetype: Truncate the instructions upto 16-bit per a glyph. + + * src/truetype/ttgload.c (TT_Hint_Glyph): Truncate + the instructions upto 16-bit length per a glyph. + +2009-07-31 suzuki toshiya + + truetype: Cast the numerical operands to 32-bit for LP64 systems. + + * src/truetype/ttinterp.c (Ins_SPHIX, INS_MIAP, + Ins_MIRP): Insert cast from long (args[], the + operands passed to TrueType operator) to FT_Int32 + (the argument of TT_MulFix14()). + +2009-07-31 suzuki toshiya + + truetype: Cast the project vector to 32-bit for LP64 system. + + * src/truetype/ttinterp.c (Project, DualProject): + Insert casts from FT_Pos (the arguments `dx', `dy') + to FT_UInt32 (the argument to TT_DotFix14()). + +2009-07-31 suzuki toshiya + + truetype: Cast the scaling params to 32-bit for LP64 system. + + * src/truetype/ttgload.c (TT_Process_Composite_Component): + Insert casts from long (return value of FT_MulFix()) to + FT_Int32 (the argument to FT_SqrtFixed()). + +2009-07-31 suzuki toshiya + + sfnt: Cast a character code to FT_UInt32 for LP64 system. + + * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, + tt_cmap14_variants, tt_cmap14_char_variants, + tt_cmap14_def_char_count, tt_cmap14_get_def_chars, + tt_cmap14_get_nondef_chars, tt_cmap14_variant_chars) + Insert casts when FT_UInt32 variable is loaded by + TT_NEXT_{UINT24|ULONG}. Because most of them are + compared with FT_UInt32 values in public API, replacing + FT_UFast is not recommended. + +2009-07-31 suzuki toshiya + + sfnt: Cast a character code to FT_UInt32 for LP64 system. + + * src/sfnt/ttcmap.c (tt_cmap4_init, tt_cmap4_next): + Insert the casts from unsigned long constant to + FT_UInt32. + +2009-07-31 suzuki toshiya + + sfnt: Extend TT_BDF->strings_size to FT_ULong for huge BDF. + + * include/freetype/internal/tttypes.h: The type + of TT_BDF->string_size is extended from FT_UInt32 + to FT_ULong, because BDF specification does not + restrict the length of string. + * src/sfnt/ttbdf.c: The scratch variable `strings' + to load TT_BDF->string_size is matched with + TT_BDF->string_size. + +2009-07-31 suzuki toshiya + + psaux: Handle the string length by FT_Offset variables. + + * src/psaux/afmparse.c (afm_parser_next_key, + afm_tokenize, afm_parse_track_kern, + afm_parse_kern_pairs, afm_parse_kern_data, + afm_parser_skip_section, afm_parser_parse): + The length of key is handled by FT_Offset, + instead of FT_UInt. Although the length of + PostScript strings or name object is 16-bit, + AFM_STREAM_KEY_LEN() calculates the length + from the pointer difference. + + * src/psaux/afmparse.h (afm_parser_next_key): + Ditto. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfread.c (pcf_get_bitmaps): The types + of `nbitmaps', `i', `sizebitmaps' are matched with + the type of area FT_Bitmap.pitch * FT_Bitmap.rows. + +2009-07-31 suzuki toshiya + + pcf: Handle the string length by size_t variables. + + * src/pcf/pcfread.c (pcf_interpret_style): The types + of nn, len, lengths[4] are changed to size_t, because + they are loaded by (or compared with) ft_strlen(). + + * src/pcf/pcfutil.c (BitOrderInvert, TwoByteSwap, + FourByteSwap): The type of the 2nd argument `nbytes' + is changed to size_t, for similarity with ANSI C + string functions. + + * src/pcf/pcfdrivr.c (PCF_Glyph_Load): The type of + `bytes' is changed to FT_Offset, because it is passed + to FT_ALLOC(), via ft_glyphslot_alloc_bitmap(). At + least, using unsigned type is better. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfread.c (pcf_seek_to_table_type, + pcf_has_table_type): The type of 3rd argument + `ntables' is matched with PCF_Toc->count. + +2009-07-31 suzuki toshiya + + otvalid: Truncate the glyph index to 16-bit. + + * src/otvalid/otvalid.c (otv_validate): Checks + face->num_glyphs does not exceed 16-bit limit, + pass FT_UInt num_glyphs to backend functions + otv_{GPOS|GSUB|GDEF|JSTF|MATH}_validate(). + +2009-07-31 suzuki toshiya + + cache: Insert explict casts for LP64 systems. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup, + FTC_SBitCache_Lookup): The type of FTC_ImageType->width + is FT_Int, so the cast to unsigned larger type FT_ULong + is introduced for the comparisons with 0x10000L for + LP64 platform. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftccache.h: The type of return value + by FTC_Node_WeightFunc function is changed to + FT_Offset. The type of FTC_CacheClass->cache_size + is changed to FT_Offset, too. + + * src/cache/ftccback.h (ft_inode_weight, + ftc_snode_weight): Ditto. + + * src/cache/ftccmap.c (ftc_cmap_node_weight): Ditto. + + * src/cache/ftcimage.c (ftc_inode_weight, + FTC_INode_Weight): Ditto. + + * src/cache/ftcsbits.c (ftc_snode_weight, + FTC_SNode_Weight): Ditto. + + * src/cache/ftcmru.h: The type of + FTC_MruListClass->node_size is changed to FT_Offset, + because it is passed to FT_ALLOC() to specify the + size of buffer. + +2009-07-31 suzuki toshiya + + XXX_cmap_encoding_char_next() return FT_UInt32 values. + + * include/freetype/internal/services/svpscmap.h: + The size of the charcode value returned by + the function typed PS_Unicodes_CharNextFunc is + matched with its input charcode value. + + * src/cff/cffmap.c (cff_cmap_encoding_char_next, + cff_cmap_unicode_char_next): Ditto. + + * src/pfr/pfrmap.c (pfr_cmap_encoding_char_next): + Ditto. + + * src/psaux/t1cmap.c (t1_cmap_std_char_next, + t1_cmap_custom_char_next, t1_cmap_unicode_char_next): + Ditto. + + * src/psnames/psmodule.c (ps_unicodes_char_next): + Ditto. + + * src/winfonts/winfnt.c (fnt_cmap_char_next): + Ditto. + + * src/sfnt/ttcmap.c (tt_cmap0_char_next, + tt_cmap2_char_next, tt_cmap4_char_next, + tt_cmap6_char_next, tt_cmap10_char_next, + tt_cmap12_char_next, tt_cmap13_char_next): Ditto. + (tt_cmap14_char_variants): Handle base unicode + codepoint by FT_UInt32 variable to avoid overflow + on 16-bit platforms. + (tt_cmap14_ensure): The type of `num_results' is + extend to FT_UInt32, to cover unsigned 32-bit + `numVarSelectorRecords' in cmap14 table header. + +2009-07-31 suzuki toshiya + + truetype: Extend TT_Face->num_locations for broken TTFs. + + * include/freetype/internal/tttypes.h: + TT_Face->num_locations are extended from FT_UInt + to FT_ULong, to stand with broken huge loca table. + Some people insists there are broken TTF including + the glyphs over 16-bit limitation, in PRC market. + * src/truetype/ttpload.c (tt_face_load_loca): + Remove unrequired 16-bit truncation for FT_UInt + TT_Face->num_locations. + +2009-07-31 suzuki toshiya + + smooth: Fix some data types mismatching with their sources. + + * src/smooth/ftgrays.c: The type of `TCoord' is + matched to `TPos', because they are mixed in + gray_set_cell(). The type of TCell->x is extended + to `TPos', because gray_find_cell() sets it by + TWorker.ex. The type of TCell->cover is extended + to `TCoord', because gray_render_scanline() adds + TCoord value to it. The type of TWork.cover is matched + with TCell->cover. The types of + TWork.{max_cells,num_cells} are changed to FT_PtrDist, + because they are calculated from the memory addresses. + The type of TWork.ycount is changed to TPos, because + it is calculated from TPos variables. + (gray_find_cell): The type of `x' is matched with + its initial value ras.ex. + (gray_render_scanline): The types of `mod', `lift' + and `rem' are changed to TCoord, because their values + are set with explicit casts to TCoord. When ras.area + is updated by the differential values including + `delta', they are explicitly cast to TArea, because + the type of `delta' is not TArea but TCoord. + (gray_render_line): The type of `mod' is extended + from int to TCoord, because (TCoord)dy is added to mod. + (gray_hline): The argument `acount' is extended to + TCoord, to match with the parameters in the callers. + +2009-07-31 suzuki toshiya + + cff: Fix some data types mismatching with their sources. + + * src/cff/cffobjs.c (cff_face_init): The type of + `scaling' is matched with the scaling parameter + in FT_Matrix_Multiply_Scaled() and + FT_Vector_Transform_Scaled(). + + * src/cff/cffparse.c (cff_parse_real): The type of + `power_ten', `scaling', `exponent_add', + `integer_length', `fraction_length', + `new_fraction_length' and `shift' are matched with + the type of `exponent' to avoid unexpected truncation. + (cff_parse_fixed_scaled): The type of `scaling' is + matched with the `scaling' argument to + cff_parse_real(). + (cff_parse_fixed_dynamic): Ditto. + (cff_parse_font_matrix): The type of `scaling' is + matched with the `scaling' argument to + cff_parse_dynamic(). + +2009-07-31 suzuki toshiya + + autofit: Fix some data types mismatching with their sources. + + * src/autofit/afglobal.c: Correct the type of + AF_FaceGlobalsRec.glyph_count to match with + FT_Face->num_glyphs. + (af_face_globals_compute_script_coverage): + Insert explicit cast to compare + FT_Long AF_FaceGlobalsRec.glyph_count versus + FT_UInt gindex. The type of `nn' is changed + to scan glyph index upto AF_FaceGlobalsRec.glyph_count. + (af_face_globals_get_metrics): The type of `script_max' + is changed to cover size_t value. Insert explicit cast + to compare FT_Long AF_FaceGlobalsRec.glyph_count versus + FT_UInt gindex. + + * src/autofit/afhints.c (af_axis_hints_new_segment): + Insert explicit cast to calculate `big_max' from + integer and size_t values. + (af_axis_hints_new_edge): Ditto. + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): + The type of `best_y' is matched to FT_Vector.y. + (af_latin_compute_stem_width): The type of `delta' is + matched to `dist' and `org_dist'. + +2009-07-31 suzuki toshiya + + autofit: Count the size of the memory object by ptrdiff_t. + + * src/autofit/afcjk.c (af_cjk_hint_edges): The + number of edges `n_edges' should be counted by + FT_PtrDist variable instead of FT_Int. + + * src/autofit/aflatin.c (af_latin_hint_edges): + Ditto. + + * src/autofit/aftypes.h: In AF_ScriptClassRec, + the size of metric `script_metrics_size' should + be counted by FT_Offset variable instead of FT_UInt. + + * src/autofit/afhints.c + (af_glyph_hints_align_strong_points): The cursors + for the edges `min', `max', `mid' in the memory + buffer should be typed FT_PtrDist. + +2009-07-31 suzuki toshiya + + autofit: Fix for unused variable `first'. + + * src/autofit/afhints.c (af_glyph_hints_reload): Insert + FT_UNUSED() to hide the unused variable warning. + +2009-07-31 suzuki toshiya + + Improve bitmap size or pixel variables for 16-bit systems. + + * include/freetype/config/ftstdlib.h: Introduce + FT_INT_MIN, to use in signed integer overflow in + 16-bit and 64-bit platforms. + + * include/freetype/internal/fttrace.h: Add a tracer + to ftsynth.c. + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Check + invalid strength causing integer overflow on 16-bit + platform. + + * src/base/ftcalc.c (ft_corner_orientation): Change + the internal calculation from FT_Int to FT_Long, to + avoid an overflow on 16-bit platforms. The caller of + this function should use only the sign of result, + so the cast to FT_Int is acceptable. + + * src/base/ftsynth.c: Introduce a tracer for synth module. + (FT_GlyphSlot_Embolden): Check invalid strength causing + integer overflow on 16-bit platform. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): The glyph index + in FT2 API is typed as FT_UInt, although BDF driver + can handle unsigned long glyph index internally. To + avoid integer overflow on 16-bit platform, too large + glyph index should be excluded. + (BDF_Glyph_Load): The glyph pitch in FT2 is typed as + FT_UInt, although BDF driver can handle unsigned long + glyph pitch internally. To avoid integer overflow on + 16-bit platform, too large glyph pitch should not be + returned. + + * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): The glyph + pitch in FT2 is typed as FT_UInt, although PFR font + format can include huge bitmap glyph with 24-bit pitch + (however, a glyph spends 16.7 pixel, it's not realistic). + To avoid integer overflow on 16-bit platform, huge + bitmap glyph should be excluded. + + * src/smooth/ftgrays.c (gray_hline): As FT_Span.x is + truncated to fit its type (16-bit short), FT_Span.y + should be truncated to fit its type (FT_Int). + + * src/cff/cffdrivr.c (cff_get_ros): CFF specification + defines the supplement in ROS as a real number. + Truncate it to fit public FT2 API. + + * src/cff/cffparse.c (cff_parse_cid_ros): Warn the + supplement if it is truncated or rounded in cff_get_ros(). + + * src/cff/cfftypes.h: Change the type of internal variable + `supplement' from FT_Long to FT_ULong to fit the signedness + to the type in public API. + +2009-07-31 suzuki toshiya + + psaux: Prevent invalid arguments to afm_parser_read_vals(). + + * src/psaux/afmparse.c (afm_parser_read_vals): Change + the type of `n' to prevent negative number how many + arguments should be parsed. + + * src/psaux/afmparse.h (afm_parser_read_vals): Ditto. + +2009-07-31 suzuki toshiya + + base: Prevent some overflows on LP64 systems. + + * src/base/ftadvance.c (FT_Get_Advances): Cast the + unsigned long constant FT_LOAD_ADVANCE_ONLY to FT_UInt32 + for LP64 platforms. + + * src/base/ftcalc.c (FT_Sqrt32): All internal variables + are changed to FT_UInt32 from FT_ULong. + (FT_MulDiv): Insert casts to FT_Int32 for LP64 platforms. + This function is designed for 32-bit integer, although + their arguments and return value are FT_Long. + + * src/base/ftobjs.c (FT_Get_Char_Index): Check `charcode' + is within unsigned 32-bit integer for LP64 platforms. + (FT_Face_GetCharVariantIndex): Check `charcode' and + `variantSelector' are within 32-bit integer for LP64 + platforms. + (FT_Face_GetCharsOfVariant): Check `variantSelector' is + within unsigned 32-bit integer for LP64 platforms. + + * src/base/fttrigon.c (ft_trig_downscale): The FT_Fixed + variable `val' and unsigned long constant FT_TRIG_SCALE + are cast to FT_UInt32, when calculates FT_UInt32. + (FT_Vector_Rotate): The long constant 1L is cast to + FT_Int32 to calculate FT_Int32 `half'. + +2009-07-31 suzuki toshiya + + cff: Cast the long variables to 32-bit for LP64 systems. + + * src/cff/cffdrivr.c (cff_get_advances): Insert + explicit cast to modify a 32-bit flag by unsigned + long constant. + + * src/cff/cffobjs.c (cff_face_init): Ditto. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): + Replace the casts to FT_Long by the casts to FT_Int32 + for LP64 platforms. + +2009-07-31 suzuki toshiya + + pcf: Improve PCF_PropertyRec.value names on LP64 platforms. + + * src/pcf/pcf.h: In PCF_PropertyRec.value, the member + `integer' is replaced by `l', `cardinal' is replaced + by `ul', to fix the difference between the name and + the types on LP64 platforms. + + * src/pcf/pcfdrivr.c (pcf_get_bdf_property): Reflect + PCF_PropertyRec.value change, with appropriate casts + to FT_Int32/FT_UInt32. Their destinations + BDF_PropertyRec.{integer|cardinal} are public and + explicitly defined as FT_Int32/FT_UInt32. + + * src/pcf/pcfread.c (pcf_get_properties, pcf_load_font): + Reflect PCF_PropertyRec.value change. + +2009-07-31 suzuki toshiya + + pcf: Fix some data types mismatching with their sources. + + * src/pcf/pcfdrivr.c (pcf_cmap_char_index): The type of + `code' is matched to PCF_Encoding->enc. + (pcf_cmap_char_next): The type of `charcode' is matched + to PCF_Encoding->enc. When *acharcode is set by charcode, + an overflow is checked and cast to unsigned 32-bit + integer. + +2009-07-31 suzuki toshiya + + bdf: Improve bdf_property_t.value names for LP64 platforms. + + * src/bdf/bdf.h: In bdf_property_t.value, the member + `int32' is replaced by `l', `card32' is replaced by + `ul', to fix the difference between the name and the + types on LP64 platforms. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Reflect + bdf_property_t.value change. + (bdf_get_bdf_property): Reflect bdf_property_t.value + change, with appropriate casts to FT_Int32/FT_UInt32. + Their destinations BDF_PropertyRec.{integer|cardinal} + are public and explicitly defined as FT_Int32/FT_UInt32. + + * src/bdf/bdflib.c (_bdf_add_property): Reflect + bdf_property_t.value change. + +2009-07-31 suzuki toshiya + + bdf: Fix some data types mismatching with their sources. + + * src/bdf/bdrdrivr.c (bdf_cmap_char_index): The type + of `code' is matched with BDF_encoding_el->enc. + (bdf_cmap_char_next): The type of `charcode' is + matched with BDF_encoding_el->enc. When *acharcode + is set by charcode, an overflow is checked and + cast to unsigned 32-bit integer. + +2009-07-31 suzuki toshiya + + autofit: Improve Unicode range definitions. + + * src/autofit/aftypes.h (AF_UNIRANGE_REC): New macro + to declare a range by two unsigned 32-bit integer, + to avoid 64-bit range definition on LP64 platforms. + + * src/autofit/aflatin.c (af_latin_uniranges): Ditto. + + * src/autofit/aflatin2.c (af_latin2_uniranges): Ditto. + + * src/autofit/afindic.c (af_indic_uniranges): Ditto. + + * src/autofit/afcjk.c (af_cjk_uniranges): Declare + the ranges by AF_UNIRANGE_REC. + +2009-07-31 suzuki toshiya + + smooth: Fix a data type mismatching with its source. + + * src/smooth/ftgrays.c (gray_sweep): The type of + `area' is matched with the 3rd argument `area' + of gray_hline(). + +2009-07-31 suzuki toshiya + + smooth: Fix a data type mismatching with its source. + + * src/smooth/ftgrays.c (gray_render_line): The type + of `area' is matched with TWorker.area. + +2009-07-31 suzuki toshiya + + cache: Disable the legacy compatibility if 16-bit system. + + * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Exclude + the legacy behaviour from 16-bit platform, because the + current hack cannot detect the caller uses this function + via legacy convension. + (FTC_SBitCache_Lookup): Ditto. + +2009-07-31 suzuki toshiya + + cache: Check 32-bit glyph index on 16-bit systems. + + * src/cache/ftcbasic.c (ftc_basic_family_get_count): + Check overflow caused by the face including large + number of glyphs > 64k. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftccache.c (ftc_cache_resize): The types of + `p', `mask', `count' are matched with FTC_Cache->{p,mask}. + (FTC_Cache_Clear): The type of `old_index' is matched to + FTC_Cache->{p,mask}. + + * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): The type + of `_idx' is matched with FTC_Cache->{p,mask}. + +2009-07-31 suzuki toshiya + + cache: Fix some data types mismatching with their sources. + + * src/cache/ftcsbits.c (ftc_snode_load): The types + of `xadvance' and `yadvance' are matched with + FT_GlyphSlot->advance.{x|y}. + +2009-07-31 suzuki toshiya + + cache: Cast NULL to a required function type explicitly. + + * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID): + Insert explicit cast from NULL to function type. + +2009-07-31 suzuki toshiya + + fttypes.h: Cast FT_MAKE_TAG output to FT_Tag exlicitly. + + * include/freetype/fttypes.h (FT_MAKE_TAG): + Cast the result to FT_Tag. + +2009-07-31 suzuki toshiya + + psnames: Handle Unicode codepoints by FT_UInt32 variables. + + * src/psnames/psmodule.c (BASE_GLYPH): Cast the result + to unsigned 32-bit integer for LP64 platform. + (ps_unicode_value): Return the value by unsigned 32-bit + integer instead of unsigned long. + +2009-07-31 suzuki toshiya + + psaux: Use size_t variable to pass the buffer size. + + * src/psaux/psaux.h (to_bytes): The type of `max_bytes' + (the argument to pass the buffer size) is changed to + size_t, to match with ANSI C string functions. + + * src/psaux/psconv.h (PS_Conv_StringDecode, + PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. + + * src/psaux/psconv.c (PS_Conv_StringDecode, + PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto. + + * src/psaux/psobjs.h (ps_parser_to_bytes): Ditto. + + * src/psaux/psobjs.c (ps_parser_to_bytes): Ditto. + +2009-07-31 suzuki toshiya + + type1: Use size_t variable to pass the string length. + + * psaux.h: The type of `len' (the argument to pass + the buffer size to the function in AFM_ParserRec) + is changed to size_t, to match with ANSI C string + functions. + + * t1afm.c (t1_get_index): Ditto. + + * test_afm.c (dummy_get_index): Ditto. + + * afmparse.c (afm_parser_read_vals): To call + AFM_ParserRec.get_index, the length of token + `len' is cast to size_t. + +2009-07-31 suzuki toshiya + + cid: Fix some data types mismatching with their sources. + + * src/cid/cidparse.c (cid_parser_new): The types of + `read_len' and `stream_len' are matched to + FT_Stream->size. Unrequired cast is removed. + +2009-07-31 suzuki toshiya + + cff: Fix for unused variable `rest'. + + * src/cff/cffparse.c (cff_parse_real): Insert + FT_UNUSED() to hide the unused variable warning. + +2009-07-31 suzuki toshiya + + cff: Fix some data types mismatching with their sources. + + * src/cff/cffgload.c (cff_slot_load): The types of + `top_upm' and `sub_upm' are matched with + CFF_FontRecDict->units_per_em. + + * src/cff/cffobjs.c (cff_size_select): Ditto. + (cff_size_request): Ditto. + +2009-07-31 suzuki toshiya + + bdf: Fix some data types mismatching with their sources. + + * bdflib.c (_bdf_list_ensure): The type of `num_items' + is matched with _bdf_list_t.used. Also the types of + `oldsize', `newsize', `bigsize' are matched too. + (_bdf_readstream): `cursor' is used as an offset to + the pointer, it should be typed as FT_Offset. Also + the types of `bytes', `start', `end', `avail' are matched. + + * bdfdrivr.c: The type of BDF_CMap->num_encodings is + matched with FT_CMap->clazz->size. + (bdf_cmap_char_index): The types of `min', `max', `mid' + are matched with BDF_CMap->num_encodings. The type of + `result' is matched with encoding->glyph. + (bdf_cmap_char_next): Ditto, the type of `code' is + matched with BDF_encoding_el.enc. + (bdf_interpret_style): The type of `lengths' is changed + to size_t, to take the value by ft_strlen(). Also the + types of `len', `nn', `mm' are matched. + +2009-07-31 suzuki toshiya + + sfnt: Count the size of the memory object by ptrdiff_t. + + * src/sfnt/ttbdf.c (tt_face_find_bdf_prop): The type of + `peroperty_len' is changed from FT_UInt to FT_Offset, + to match with size_t, which is appropriate type for the + object in the memory buffer. + +2009-07-31 suzuki toshiya + + lzw: Count the size of the memory object by ptrdiff_t. + + * src/lzw/ftzopen.h: The types of FT_LzwState->{buf_total, + stack_size} are changed from FT_UInt to FT_Offset, to match + with size_t, which is appropriate type for the object in + the memory buffer. + + * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): The types of + `old_size' and `new_size' are changed from FT_UInt to + FT_Offset, to match with size_t, which is appropriate type + for the object in the memory buffer. + +2009-07-31 suzuki toshiya + + otvalid: Count the table size on memory by ptrdiff_t. + + * src/otvalid/otvgpos.c (otv_ValueRecord_validate): + Change the type of table size from FT_UInt to + FT_PtrDist because it is calculated by the memory + addresses. + +2009-07-31 suzuki toshiya + + otvalid: Prevent an overflow by GPOS/GSUB 32b-bit offset. + + * src/otvalid/otvgpos.c (otv_ExtensionPos_validate): + Extend ExtensionOffset from FT_UInt to FT_ULong, to + cover 32-bit offset on 16-bit platform. + + * src/otvalid/otvgsub.c (otv_ExtensionSubst_validate): + Ditto. + +2009-07-31 suzuki toshiya + + ftobjs.c: Prevent an overflow in glyph index handling. + + * src/base/ftobjs.c (FT_Face_GetCharsOfVariant): + Improve the cast in comparison to avoid the truncation. + +2009-07-31 suzuki toshiya + + Improve the variable types in raccess_make_file_name(). + + * src/base/ftrfork.c (raccess_make_file_name): + Change the type of cursor variable `tmp' to const char*, + to prevent the unexpected modification of original pathname. + (raccess_make_file_name): Change the type of new_length + to size_t. + +2009-07-31 suzuki toshiya + + ftpatent.c: Fix for unused variable `error'. + + * src/base/ftpatent.c (_tt_check_patents_in_range): + Fix warning for unused variable `error'. + +2009-07-31 suzuki toshiya + + type1: Check invalid string longer than PostScript limit. + + * src/type1/t1afm.c (t1_get_index): Check invalid string + which exceeds the limit of PostScript string/name objects. + +2009-07-31 suzuki toshiya + + gzip: Use FT2 zcalloc() & zfree() in ftgzip.c by default. + + * src/gzip/ftgzip.c (zcalloc, zcfree): Disable all + zcalloc() & zfree() by zlib in zutil.c, those in + ftgzip.c by FT2 are enabled by default. To use + zlib zcalloc() & zfree(), define USE_ZLIB_ZCALLOC. + See discussion: + http://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html + +2009-07-31 suzuki toshiya + + gzip: Distinguish PureC from TurboC on MSDOS. + + * src/gzip/zutil.c (zcalloc, zcfree): Enable only for + MSDOS platform. + +2009-07-31 suzuki toshiya + + gxvalid: Insert PureC pragma to allow unevaluated variables. + + * builds/atari/ATARI.H: Insert PureC pragma not to + warn against set-but-unevaluated variable in gxvalid + module. + +2009-07-31 suzuki toshiya + + gxvalid: Pass the union by the pointer instead of the value. + + * src/gxvalid/gxvcommn.h: + - Declare new type `GXV_LookupValueCPtr'. + - Update the type of the 2nd argument to pass GXV_LookupValueDesc + data to the function prototyped as GXV_Lookup_Value_Validate_Func, + from GXV_LookupValueDesc to GXV_LookupValueCPtr. + - Likewise for the function prototyped as + GXV_Lookup_Fmt4_Transit_Func. + + - Declare new type `GXV_StateTable_GlyphOffsetCPtr'. + - Update the type of the 3rd argument to pass + GXV_StateTable_GlyphOffsetDesc data to the function prototyped + as GXV_StateTable_Entry_Validate_Func, from + GXV_StateTable_GlyphOffsetDesc to GXV_StateTable_GlyphOffsetCPtr. + + - Declare new type `GXV_XStateTable_GlyphOffsetCPtr'. + - Update the type of the 3rd argument to pass + GXV_XStateTable_GlyphOffsetDesc data to the function prototyped + as GXV_XStateTable_Entry_Validate_Func, + from GXV_XStateTable_GlyphOffsetDesc + to GXV_XStateTable_GlyphOffsetCPtr. + + * src/gxvalid/gxvcommn.c (gxv_LookupTable_fmt0_validate, + gxv_XClassTable_lookupval_validate, + gxv_XClassTable_lookupfmt4_transit): + Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. + + * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate, + gxv_bsln_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvjust.c + (gxv_just_pcTable_LookupValue_entry_validate, + gxv_just_classTable_entry_validate, + gxv_just_wdcTable_LookupValue_validate): Ditto. + + * src/gxvalid/gxvkern.c + (gxv_kern_subtable_fmt1_entry_validate): Ditto. + + * src/gxvalid/gxvlcar.c (gxv_lcar_LookupValue_validate, + gxv_lcar_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvopbd.c (gxv_opbd_LookupValue_validate, + gxv_opbd_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvprop.c (gxv_prop_LookupValue_validate, + gxv_prop_LookupFmt4_transit): Ditto. + + * src/gxvalid/gxvmort4.c + (gxv_mort_subtable_type4_lookupval_validate): Ditto. + + * src/gxvalid/gxvmort0.c + (gxv_mort_subtable_type0_entry_validate): Update + from GXV_StateTable_GlyphOffsetDesc + to GXV_StateTable_GlyphOffsetCPtr. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_entry_validate): Ditto. + + * src/gxvalid/gxvmort2.c + (gxv_mort_subtable_type2_entry_validate): Ditto. + + * src/gxvalid/gxvmort5.c + (gxv_mort_subtable_type5_entry_validate): Ditto. + + * src/gxvalid/gxvmorx2.c + (gxv_morx_subtable_type2_entry_validate): Ditto. + + * src/gxvalid/gxvmorx5.c + (gxv_morx_subtable_type5_entry_validate): Ditto. + + * src/gxvalid/gxvmorx1.c + (gxv_morx_subtable_type1_entry_validate): Ditto. + (gxv_morx_subtable_type1_LookupValue_validate, + gxv_morx_subtable_type1_LookupFmt4_transit): + Update from GXV_LookupValueDesc to GXV_LookupValueCPtr. + + * src/gxvalid/gxvmorx0.c + (gxv_morx_subtable_type0_entry_validate): Update + from GXV_XStateTable_GlyphOffsetDesc + to GXV_XStateTable_GlyphOffsetCPtr. + +2009-07-29 Fabrice Bellet + + Fix Redhat bugzilla #513582 and Savannah bug #26849. + + * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) : Fix + aliasing bug. + +2009-07-19 Werner Lemberg + + Document recent library changes. + + * docs/CHANGES: Do it. + +2009-07-17 Werner Lemberg + + Fix Savannah bug #23786. + + * src/truetype/ttobjs.c (tt_size_init_bytecode): Don't reset x_ppem + and y_ppem. Otherwise the `*_CVT_Stretched' functions in ttinterp.c + get never called. + An anonymous guy suggested this change on Savannah, and it seems to + be the right solution. + +2009-07-15 Werner Lemberg + + * docs/release: Updated. + +2009-07-15 Werner Lemberg + + README.CVS -> README.git + + * README.CVS: Renamed to... + * README.git: This. + Updated. + +2009-07-15 suzuki toshiya + + Borland C++ compiler patch proposed by Mirco Babin. + http://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html. + + * builds/exports.mk: Delete unused flags, CCexe_{CFLAGS,LDFLAGS}. + Fix APINAMES_C and APINAMES_EXE pathnames to reflect the platform + specific pathname syntax. + * builds/compiler/bcc.mk: Remove unused flag, CCexe_LDFLAGS. + Define TE = `-e' separately (bcc32 cannot specify the pathname of + binary executable by T = `-o'). + Extend the large page size in linking freetype.lib. + Add extra CLEAN target to delete bcc specific temporary files. + * builds/compiler/bcc-dev.mk: Ditto. + +2009-07-14 Werner Lemberg + + Fix Savannah bug #27026. + + * builds/win32/vc2005/freetype.sln: Use correct version number. + +2009-07-12 suzuki toshiya + + Add a script to check the undefined and unused trace macros. + + * src/tools/chktrcmp.py: A script to check trace_XXXX macros + that are used in C source but undefined in fttrace.h, or + defined in fttrace.h but unused in C sources. See + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html. + * docs/DEBUG: Mention on chktrcmp.py. + * docs/release: Ditto. + +2009-07-09 Werner Lemberg + + [ftraster] Make it compile again with -D_STANDALONE_. + + * src/raster/ftraster.c [_STANDALONE_]: Define + FT_CONFIG_STANDARD_LIBRARY_H. + Include `string.h'. + Don't include `rastpic.h'. + Define FT_DEFINE_RASTER_FUNCS. + +2009-07-09 suzuki toshiya + + smooth: Check glyph size by width/height, instead of pitch/height. + Suggested by der Mouse . + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Improve + the check for too large glyph. Replace the pair of `pitch' and + `height' by the pair of `width' and `height'. `pitch' cannot + be greater than `height'. The required is checking the product + `pitch' * `height' <= FT_ULONG_MAX, but we use cheap checks for + the realistic case only. + +2009-07-09 suzuki toshiya + + Register 2 missing trace components, t1afm and ttbdf. + + * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( t1afm ) + and FT_TRACE_DEF( ttbdf ). See + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html + +2009-07-09 suzuki toshiya + + Register a trace component for ftgloadr.c. + + * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( gloader ). + The macro `trace_gloader' was already used in the initial version + on 2002-02-24. + +2009-07-08 suzuki toshiya + + Prevent the overflows by a glyph with too many points or contours. + The bug is reported by Boris Letocha . See + http://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html + http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00002.html + + * include/freetype/ftimage.h (FT_OUTLINE_CONTOURS_MAX, + FT_OUTLINE_POINTS_MAX): New macros to declare the maximum + values of FT_Outline.{n_contours,n_points}. + * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Check the + total numbers of points and contours cause no overflows in + FT_Outline.{n_contours,n_points}. + + * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P, + FT_GLYPHLOADER_CHECK_C): Compare the numbers of points and + contours as unsigned long number, instead of signed int, to + prevent the overflows on 16-bit systems. + +2009-07-05 Bram Tassyns + + Improve compatibility to Acroread. + This fixes Savannah bug #26944. + + * src/cff/cffload.c (cff_charset_compute_cids): For multiple GID to + single CID mappings, make the lowest value win. + +2009-06-28 suzuki toshiya + + ftpatent: Fix a bug by wrong usage of service->table_info(). + http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00039.html + + * include/freetype/internal/services/svsfnt.h: Extend + FT_SFNT_TableInfoFunc() to take new argument to obtain the offset + to the specified table. + * src/sfnt/sfdriver.c (sfnt_table_info): Extend to return the + table-offset to the caller function. + * src/base/ftpatent.c (_tt_check_patents_in_table): Use new + service->table_info(). + * src/base/ftobjs.c (FT_Sfnt_Table_Info): Synchronize to new + service->table_info(). + +2009-06-28 Werner Lemberg + + [psaux, cff] Protect against nested `seac' calls. + + * include/freetype/internal/psaux.h (T1_Decoder), src/cff/cffgload.h + (CFF_Decoder): Add `seac' boolean variable. + + * src/cff/cffgload.c (cff_operator_seac), src/psaux/t1decode.c + (t1operator_seac): Use it. + +2009-06-28 Werner Lemberg + + Thinko. + + * src/psaux/t1decode.c (t1operator_seac) + [FT_CONFIG_OPTION_INCREMENTAL]: Test for existence of incremental + interface. + +2009-06-28 Werner Lemberg + + * devel/ftoption.h [FT_CONFIG_OPTION_INCREMENTAL]: Define. + +2009-06-27 suzuki toshiya + + Add tools to preprocess the source files for AtariST PureC. + + * builds/atari/deflinejoiner.awk: New file to filter C source files + for broken C preprocessor of PureC compiler. + + * builds/atari/gen-purec-patch.sh: New file to generate a patch set + for PureC, by using deflinejoiner.awk. + +2009-06-27 suzuki toshiya + + Keep existing modules.cfg in the building tree. + + * configure: If `configure' is executed outside of the source tree, + an existing `modules.cfg' file in the build directory should be + kept, not overwritten by the version in the source tree. + +2009-06-27 suzuki toshiya + + Filter --srcdir= option before invoking builds/unix/configure. + + * configure: If builds/unix/configure is invoked with --srcdir + option, the option should take `builds/unix' directory instead of + the top source directory. Thus the configure script in the top + directory should modify the --srcdir= option if + `builds/unix/configure' is invoked. + +2009-06-27 suzuki toshiya + + Improve configure.raw for cross-building on exe-suffixed systems. + + * builds/unix/configure.raw: Fix a bug in sed script to extract + native suffix for binary executables, patch by Peter Breitenlohner. + http://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html + +2009-06-26 Werner Lemberg + + [truetype] Remove TT_SubGlyphRec. + + * src/truetype/ttobjs.h (TT_SubGlyphRec): Removed, unused. + +2009-06-26 Werner Lemberg + + * */*: For warning messages, replace FT_ERROR with FT_TRACE0. + + FT_ERROR is now used only if a function produces a non-zero `error' + value. + + Formatting, improving and harmonizing debug strings. + +2009-06-25 Werner Lemberg + + Provide version information better. + + * src/base/ftinit.c (FT_Init_FreeType): Don't set version here + but... + * src/base/ftobjs.c (FT_New_Library): Here. + +2009-06-22 Werner Lemberg + + Use 16.16 format while parsing Type 1 charstrings. + This fixes Savannah bug #26867. + + Previously, only integers have been used which can lead to serious + rounding errors. + + However, fractional values are only used internally; after the + charstrings (of either Type 1 or 2) have been processed, the + resulting coordinates get rounded to integers currently -- before + applying scaling. This should be fixed; at the same time a new load + flag should be introduced, to be used in combination with + FT_LOAD_NO_SCALE, which indicates that font units are returned in + 16.16 format. Similarly, the incremental interface should be + extended to allow fractional values for metrics. + + * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `shift' + field. + * include/freetype/internal/pshints.h (T1_Hints_SetStemFunc, + T1_Hints_SetStem3Func): Use FT_Fixed for coordinates. + + * src/psaux/psobjs.c: Include FT_INTERNAL_CALC_H. + (t1_build_add_point): Always convert fixed to integer. + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): + Use 16.16 format everywhere (except for large integers followed by a + `div'). + [CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS]: Remove #ifdef and activate + code uncoditionally. + Add support for random numbers and update remaining code + accordingly; this should work now. + (t1_operator_seac): Updated. + * src/psaux/pshrec.c: Include FT_INTERNAL_CALC_H. + (ps_hints_t1stem3, t1_hints_stem): Updated. + + * src/cid/cidgload.c: Include FT_INTERNAL_CALC_H. + (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL], + (cid_face_compute_max_advance, cid_slot_load_glyph): Updated. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) + [FT_CONFIG_OPTION_INCREMENTAL], (T1_Get_Advances, T1_Load_Glyph): + Updated. + * src/type1/t1load.c: Include FT_INTERNAL_CALC_H. + * src/type1/t1objs.c (T1_Face_Init): Updated. + +2009-06-21 Werner Lemberg + + * src/pshinter/pshrec.c: Use PSH_Err_Ok. + +2009-06-21 Werner Lemberg + + Code beautification. + + * src/type1/t1load.c (FT_INT_TO_FIXED): Removed. + Replace everywhere with INT_TO_FIXED. + (FT_FIXED_TO_INT): Move to ... + * include/freetype/internal/ftcalc.h (FIXED_TO_INT): Here. + Update all users. + +2009-06-20 Werner Lemberg + + Remove unused variables. + + * include/freetype/internal/psaux.h (T1_BuilderRec), + src/cff/cffgload.h (CFF_Builder): Remove `last'. + Update all users. + +2009-06-20 Werner Lemberg + + [psaux] Check large integers while parsing charstrings. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Large + integers must be followed by a `div' operator. + +2009-06-20 Werner Lemberg + + [cff] Revert last change. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Do it. + Next time, don't confuse Type 2 charstring opcodes with TOP DICT + values... + +2009-06-20 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_check_digits): Fix + compiler warning. + +2009-06-20 Werner Lemberg + + * builds/compiler/gcc.mk (CFLAGS): Use -O3, not -O6. + +2009-06-19 Werner Lemberg + + [cff] Fix handling of reserved byte 0xFF. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Abort if byte + 0xFF is encountered. + +2009-06-19 Werner Lemberg + + Improve debug messages for Type1 charstrings. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Emit newlines + after instructions. + Prettify output. + +2009-06-19 Werner Lemberg + + More ftgray fixes for FT_STATIC_RASTER. + Problems reported by suyu@cooee.cn. + + * src/smooth/ftgrays.c (gray_move_to, gray_raster_render): Use + RAS_VAR. + +2009-06-18 Werner Lemberg + + * docs/CHANGES: Updated. + +2009-06-18 Werner Lemberg + + Fix B/W rasterization of subglyphs with different drop-out modes. + + Normally, the SCANMODE instruction (if present) to set the drop-out + mode in a TrueType font is located in the `prep' table only and thus + valid for all glyphs. However, there are fonts like `pala.ttf' + which additionally contain this instruction in the hinting code of + some glyphs (but not all). As a result it can happen that a + composite glyph needs multiple drop-out modes for its subglyphs + since the rendering state gets reset for each subglyph. + + FreeType collects the hinted outlines from all subglyphs, then it + sends the data to the rasterizer. It also sends the drop-out mode + -- after hinting has been applied -- and here is the error: It sends + the drop-out mode of the last subglyph only; drop-out modes of all + other subglyphs are lost. + + This patch fixes the problem; it adds a second, alternative + mechanism to pass the drop-out mode: For each contour, the + rasterizer now checks the first `tags' array element. If bit 2 is + set, bits 5-7 contain the contour's drop-out mode, overriding the + global drop-out mode. + + * include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro. + + * src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in + `tags[0]'. + + * src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom): + Use bits 3-5 instead of 0-2. + (New_Profile): Set the drop-out mode in the profile's `flags' field. + (Decompose_Curve): Check `tags[0]' and set `dropOutControl' if + necessary. + (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out + mode. + +2009-06-16 Werner Lemberg + + Improve scan conversion rules 4 and 6. + + Two new constraints are introduced to better identify a `stub' -- a + concept which is only vaguely described in the OpenType + specification. The old code was too rigorous and suppressed more + pixel than it should. + + . The intersection of the two profiles with the scanline is less + than a half pixel. Code related to this was already present in + the sources but has been commented out. + + . The endpoint of the original contour forming a profile has a + distance (`overshoot') less than half a pixel to the scanline. + + Note that the two additional conditions fix almost all differences + to the Windows rasterizer, but some problematic cases remain. + + * src/raster/ftraster.c (Overshoot_Top, Overshoot_Bottom): New + macros for the `flags' field in the `TProfile' structure. + (IS_BOTTOM_OVERSHOOT, IS_TOP_OVERSHOOT): New macros. + (New_Profile, End_Profile): Pass overshoot flag as an argument and + set it accordingly. + Update callers. + (Vertical_Sweep_Drop, Horizontal_Sweep_Drop): Implement the two new + constraints. + +2009-06-11 Werner Lemberg + + Increase precision for B/W rasterizer. + + * src/raster/ftraster.c (Set_High_Precision): Add two more bits to + the precision. This corrects rendering of some small glyphs, for + example, glyph `xi' in verdana.ttf at 13 ppem. Testing with ftbench + on my GNU/Linux box I don't see a performance degradation. + +2009-06-08 Michael Zucchi + + Handle FT_STROKER_LINECAP_BUTT. + This fixes Savannah bug #26757. + + * src/base/ftstroke.c (ft_stroker_cap): Implement it. + +2009-06-07 Harald Fernengel + + Fix some potential out-of-memory crashes. + + * src/base/ftobjs.c (ft_glyphslot_done): Check `slot->internal'. + * src/base/ftstream.c (FT_Stream_ReleaseFrame): Check `stream'. + * src/truetype/ttinterp.c (TT_New_Context): Avoid double-free of + `exec' in case of failure. + +2009-06-07 Werner Lemberg + + Simplify math. + Suggested by Alexei Podtelezhnikov . + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Do it. + +2009-06-04 Werner Lemberg + + Preparation for fixing scan conversion rules 4 and 6. + + * src/raster/ftraster.c (TFlow): Replace enumeration with... + (Flow_Up): This macro. + (TProfile): Replace `flow' member with `flags' bit field. + Update all affected code. + +2009-05-29 James Cloos + + Enable autohinting for glyphs rotated by multiples of 90°. + + * src/base/ftobjs.c (FT_Load_Glyph): Alter check for permitted + matrices to allow rotations by multiples of 90°, not only unrotated, + possibly slanted matrices. + +2009-05-28 Werner Lemberg + + Remove compiler warning. + Reported by Krzysztof Kowalczyk . + + * src/autofit/aflatin2.c (af_latin2_hint_edges): Move declaration of + `n_edges' into `#if' block. + +2009-05-28 Werner Lemberg + + Make compilation work with FT_CONFIG_OPTION_USE_ZLIB not defined. + Reported by Krzysztof Kowalczyk . + + * src/pcf/pcfdrivr.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_ZLIB]: + Make it work. + Simplify #ifdef logic. + +2009-05-22 Werner Lemberg + + Improve b/w rasterizer. + Problem reported by Krzysztof Kotlenga . + + * src/raster/raster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): For smart drop-out mode, if + intersections are equally distant relative to next pixel center, + select the left pixel, not the right one. + +2009-05-19 Werner Lemberg + + Fix Savannah bug #26600. + + * src/type42/t42parse.c (t42_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + +2009-04-30 Werner Lemberg + + Document recent changes to ftview. + + * docs/CHANGES: Do it. + +2009-04-27 Werner Lemberg + + autohinter: Don't change digit widths if all widths are the same. + This fixes FreeDesktop bug #21197. + + * src/autofit/afglobal.c (AF_DIGIT): New macro. + (af_face_globals_compute_script_coverage): Mark ASCII digits in + `glyph_scripts' array. + (af_face_globals_get_metrics): Updated. + (af_face_globals_is_digit): New function. + * src/autofit/afglobal.h: Updated. + (AF_ScriptMetricsRec): Add `digits_have_same_width' flag. + + * src/autofit/aflatin.c: Include FT_ADVANCES_H. + (af_latin_metrics_check_digits): New function. + (af_latin_metrics_init): Use it. + * src/autofit/aflatin.h: Updated. + * src/autofit/afcjk.c (af_cjk_metrics_init): Updated. + + * src/autofit/aflatin2.c: Similar changes as with aflatin.c. + + * src/autofit/afloader.c (af_loader_load_g): Test digit width. + + * docs/CHANGES: Document it. + +2009-04-26 Werner Lemberg + + Make ftgrays compile with _STANDALONE_ and FT_STATIC_RASTER again. + Problems reported by suyu@cooee.cn. + + * src/smooth/ftgrays.c (FT_DEFINE_OUTLINE_FUNCS, + FT_DEFINE_RASTER_FUNCS) [_STANDALONE_]: Define. + [!_STANDALONE_]: Include ftspic.h only here. + (ras): Define/declare after definition of `TWorker'. + Use `RAS_VAR_' where necessary. + +2009-04-21 Karl Berry + + Fix AC_CHECK_FT2. + + * builds/unix/freetype2.m4: Only check PATH for freetype-config if + we did not already find it from a prefix option. + +2009-04-05 Oran Agra + + Add #error to modules and files that do not support PIC yet. + + When FT_CONFIG_OPTION_PIC is defined the following files will + create #error: + * src/bdf/bdfdrivr.h + * src/cache/ftcmanag.c + * src/cid/cidriver.h + * src/gxvalid/gxvmod.h + * src/gzip/ftgzip.c + * src/lzw/ftlzw.c + * src/otvalid/otvmod.h + * src/pcf/pcfdrivr.h + * src/pfr/pfrdrivr.h + * src/psaux/psauxmod.h + * src/type1/t1driver.h + * src/type42/t42drivr.h + * src/winfonts/winfnt.h + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in autofit module. + + * include/freetype/internal/autohint.h add macros to init + instances of FT_AutoHinter_ServiceRec. + + * src/autofit/afmodule.h declare autofit_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/autofit/afmodule.c when FT_CONFIG_OPTION_PIC is defined + af_autofitter_service and autofit_module_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from afpic.h in order to access them. + + * src/autofit/aftypes.h add macros to init and declare + instances of AF_ScriptClassRec. + + * src/autofit/afcjk.h declare af_cjk_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afcjk.c when FT_CONFIG_OPTION_PIC is defined + af_cjk_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/afdummy.h declare af_dummy_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afdummy.c when FT_CONFIG_OPTION_PIC is defined + af_dummy_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/afindic.h declare af_indic_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/afindic.c when FT_CONFIG_OPTION_PIC is defined + af_indic_script_class struct will have function to init it instead of + being allocated in the global scope. + + * src/autofit/aflatin.h declare af_latin_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/aflatin.c when FT_CONFIG_OPTION_PIC is defined + af_latin_script_class struct will have function to init it instead of + being allocated in the global scope. + Change af_latin_blue_chars to be PIC-compatible by being a two + dimentional array rather than array of pointers. + + + * src/autofit/aflatin2.h declare af_latin2_script_class + using macros from aftypes.h, + when FT_CONFIG_OPTION_PIC is defined init function will be declared. + * src/autofit/aflatin2.c when FT_CONFIG_OPTION_PIC is defined + af_latin2_script_class struct will have function to init it instead of + being allocated in the global scope. + Change af_latin2_blue_chars to be PIC-compatible by being a two + dimentional array rather than array of pointers. + + * src/autofit/afglobal.c when FT_CONFIG_OPTION_PIC is defined + af_script_classes array initialization was moved to afpic.c and + is later refered using macros defeined in afpic.h. + + New Files: + * src/autofit/afpic.h declare struct to hold PIC globals for autofit + module and macros to access them. + * src/autofit/afpic.c implement functions to allocate, destroy and + initialize PIC globals for autofit module. + + * src/autofit/autofit.c add new file to build: afpic.c. + * src/autofit/jamfile add new files to FT2_MULTI build: afpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in pshinter module. + + * include/freetype/internal/pshints.h add macros to init + instances of PSHinter_Interface. + + * src/pshinter/pshmod.h declare pshinter_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/pshinter/pshmod.c when FT_CONFIG_OPTION_PIC is defined + pshinter_interface and pshinter_module_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from pshpic.h in order to access them. + + New Files: + * src/pshinter/pshpic.h declare struct to hold PIC globals for pshinter + module and macros to access them. + * src/pshinter/pshpic.c implement functions to allocate, destroy and + initialize PIC globals for pshinter module. + + * src/pshinter/pshinter.c add new file to build: pshpic.c. + * src/pshinter/jamfile add new files to FT2_MULTI build: pshpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in psnames module. + + * include/freetype/internal/services/svpscmap.h add macros to init + instances of FT_Service_PsCMapsRec. + + * src/psnames/psmodule.h declare psnames_module_class + using macros from ftmodapi.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/psnames/psmodule.c when FT_CONFIG_OPTION_PIC is defined + pscmaps_interface and pscmaps_services structs + and psnames_module_class array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from pspic.h in order to access them. + + New Files: + * src/psnames/pspic.h declare struct to hold PIC globals for psnames + module and macros to access them. + * src/psnames/pspic.c implement functions to allocate, destroy and + initialize PIC globals for psnames module. + + * src/psnames/psnames.c add new file to build: pspic.c. + * src/psnames/jamfile add new files to FT2_MULTI build: pspic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in raster renderer. + + * src/raster/ftrend1.h declare ft_raster1_renderer_class + and ft_raster5_renderer_class + using macros from ftrender.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/smooth/ftrend1.c when FT_CONFIG_OPTION_PIC is defined + ft_raster1_renderer_class and ft_raster5_renderer_class structs + will have functions to init or create and destroy them + instead of being allocated in the global scope. + Macros will be used from rastpic.h in order to access + ft_standard_raster from the pic_container (allocated in ftraster.c). + In ft_raster1_render when PIC is enabled, the last letter of + module_name is used to verfy the renderer class rather than the + class pointer. + + * src/raster/ftraster.c when FT_CONFIG_OPTION_PIC is defined + ft_standard_raster struct will have function to init it + instead of being allocated in the global scope. + + New Files: + * src/raster/rastpic.h declare struct to hold PIC globals for raster + renderer and macros to access them. + * src/raster/rastpic.c implement functions to allocate, destroy and + initialize PIC globals for raster renderer. + + * src/raster/raster.c add new file to build: rastpic.c. + * src/raster/jamfile add new files to FT2_MULTI build: rastpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in smooth renderer. + + * src/smooth/ftsmooth.h declare ft_smooth_renderer_class, + ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class + using macros from ftrender.h, + when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + ft_smooth_renderer_class, ft_smooth_lcd_renderer_class + and ft_smooth_lcd_v_renderer_class + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from ftspic.h in order to access + ft_grays_raster from the pic_container (allocated in ftgrays.c). + + * src/smooth/ftgrays.h include FT_CONFIG_CONFIG_H + * src/smooth/ftgrays.c when FT_CONFIG_OPTION_PIC is NOT defined + func_interface was moved from gray_convert_glyph_inner function + to the global scope. + When FT_CONFIG_OPTION_PIC is defined + func_interface and ft_grays_raster structs + will have functions to init them + instead of being allocated in the global scope. + And func_interface will be allocated on the stack of + gray_convert_glyph_inner. + + New Files: + * src/smooth/ftspic.h declare struct to hold PIC globals for smooth + renderer and macros to access them. + * src/smooth/ftspic.c implement functions to allocate, destroy and + initialize PIC globals for smooth renderer. + + * src/smooth/smooth.c add new file to build: ftspic.c. + * src/smooth/jamfile add new files to FT2_MULTI build: ftspic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in cff driver. + + * include/freetype/internal/services/svcid.h add macros to init + instances of FT_Service_CIDRec. + * include/freetype/internal/services/svpsinfo.h add macros to init + instances of FT_Service_PsInfoRec. + + * src/cff/cffcmap.h declare cff_cmap_encoding_class_rec + and cff_cmap_unicode_class_rec using macros from + ftobjs.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/cff/cffcmap.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + cff_cmap_encoding_class_rec and cff_cmap_unicode_class_rec + will have functions to init or create and destroy them + instead of being allocated in the global scope. + + * src/cff/cffdrivr.h declare cff_driver_class using macros from + ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/cff/cffdrivr.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + cff_service_glyph_dict, cff_service_ps_info, cff_service_ps_name + cff_service_get_cmap_info, cff_service_cid_info, cff_driver_class, + and cff_services array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from cffpic.h in order to access them + from the pic_container. + Use macros from cffpic.h in order to access the + structs allocated in cffcmap.c + + * src/cff/cffobjs.c Use macros from cffpic.h in order to access the + structs allocated in cffcmap.c + + * src/cff/parser.c when FT_CONFIG_OPTION_PIC is defined + implement functions to create and destroy cff_field_handlers array + instead of being allocated in the global scope. + And macros will be used from cffpic.h in order to access it + from the pic_container. + + New Files: + * src/cff/cffpic.h declare struct to hold PIC globals for cff + driver and macros to access them. + * src/cff/cffpic.c implement functions to allocate, destroy and + initialize PIC globals for cff driver. + + * src/cff/cff.c add new file to build: cffpic.c. + * src/cff/jamfile add new files to FT2_MULTI build: cffpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in sfnt driver. + + * include/freetype/internal/services/svbdf.h add macros to init + instances of FT_Service_BDFRec. + * include/freetype/internal/services/svgldict.h add macros to init + instances of FT_Service_GlyphDictRec. + * include/freetype/internal/services/svpostnm.h add macros to init + instances of FT_Service_PsFontNameRec. + * include/freetype/internal/services/svsfnt.h add macros to init + instances of FT_Service_SFNT_TableRec. + * include/freetype/internal/services/svttcmap.h add macros to init + instances of FT_Service_TTCMapsRec. + * include/freetype/internal/sfnt.h add macros to init + instances of SFNT_Interface. + + * src/sfnt/sfdriver.h declare sfnt_module_class using macros from + ftmodapi.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/sfnt/sfdriver.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + sfnt_service_sfnt_table, sfnt_service_glyph_dict, sfnt_service_ps_name + tt_service_get_cmap_info, sfnt_service_bdf, sfnt_interface, + sfnt_module_class, and sfnt_services array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from sfntpic.h in order to access them + from the pic_container. + + * src/sfnt/ttcmap.h add macros to init + instances of TT_CMap_ClassRec. + * src/sfnt/ttcmap.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + tt_cmap0_class_rec, tt_cmap2_class_rec, tt_cmap4_class_rec + tt_cmap6_class_rec, tt_cmap8_class_rec, tt_cmap10_class_rec, + tt_cmap12_class_rec, tt_cmap14_class_rec and tt_cmap_classes array + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from sfntpic.h in order to access them + from the pic_container. + The content of tt_cmap_classes is now described in the + new file 'ttcmapc.h'. + + New Files: + * src/sfnt/sfntpic.h declare struct to hold PIC globals for sfnt + driver and macros to access them. + * src/sfnt/sfntpic.c implement functions to allocate, destroy and + initialize PIC globals for sfnt driver. + * src/sfnt/ttcmapc.h describing the content of + tt_cmap_classes allocated in ttcmap.c + + * src/sfnt/sfnt.c add new file to build: sfntpic.c. + * src/sfnt/jamfile add new files to FT2_MULTI build: sfntpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support in truetype driver. + + * include/freetype/internal/services/svmm.h add macros to init + instances of FT_Service_MultiMastersRec. + * include/freetype/internal/services/svttglyf.h add macros to init + instances of FT_Service_TTGlyfRec. + + * src/truetype/ttdriver.h declare tt_driver_class using macros from + ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy + functions will be declared. + * src/truetype/ttdriver.c when FT_CONFIG_OPTION_PIC is defined + the following structs: + tt_service_gx_multi_masters, tt_service_truetype_glyf, tt_driver_class + and tt_services array, + will have functions to init or create and destroy them + instead of being allocated in the global scope. + And macros will be used from ttpic.h in order to access them + from the pic_container. + * src/truetype/ttobjs.c change trick_names array to be + PIC-compatible by being a two dimentional array rather than array + of pointers. + + New Files: + * src/truetype/ttpic.h declare struct to hold PIC globals for truetype + driver and macros to access them. + * src/truetype/ttpic.c implement functions to allocate, destroy and + initialize PIC globals for truetype driver. + + * src/truetype/truetype.c add new file to build: ttpic.c. + * src/truetype/jamfile add new files to FT2_MULTI build: ttpic.c. + +2009-04-05 Oran Agra + + Position Independent Code (PIC) support and infrastructure in base. + + * include/freetype/config/ftoption.h add FT_CONFIG_OPTION_PIC + * include/freetype/internal/ftobjs.h Add pic_container member to + FT_LibraryRec. + Add macros to declare and init instances of FT_CMap_ClassRec. + Add macros to init instances of FT_Outline_Funcs and FT_Raster_Funcs. + Add macros to declare, allocate and initialize modules + (FT_Module_Class). + Add macros to declare, allocate and initialize renderers + (FT_Renderer_Class). + Add macro to init instances of FT_Glyph_Class. + Add macros to declare, allocate and initialize drivers + (FT_Driver_ClassRec). + * include/freetype/internal/ftpic.h new file to declare the + FT_PIC_Container struct and the functions to allocate and detroy it. + * include/freetype/internal/ftserv.h add macros to allocate and + destory arrays of FT_ServiceDescRec. + * include/freetype/internal/internal.h define macro to include + ftpic.h. + + New Files: + * src/base/ftpic.c implement functions to allocate and destory the + global pic_container. + * src/base/basepic.h declare struct to hold PIC globals for base and + macros to access them. + * src/base/basepic.c implement functions to allocate, destroy and + initialize PIC globals for base. + + * src/base/ftinit.c when FT_CONFIG_OPTION_PIC is defined implement + functions that allocate and destroy ft_default_modules according to + FT_CONFIG_MODULES_H in the pic_container instead of the global scope + and use macro from basepic.h to access it. + * src/base/ftobjs.c add calls to the functions that allocate and + destroy the global pic_container when the library is created and + destroyed. + + * src/base/jamfile add new files to FT2_MULTI build: + ftpic.c and basepic.c. + * src/base/ftbase.c add new files to build: + ftpic.c and basepic.c. + + * src/base/ftglyph.c when FT_CONFIG_OPTION_PIC is defined + ft_bitmap_glyph_class and ft_outline_glyph_class will be allocated + in the pic_container instead of the global scope and use macros from + basepic.h to access them. + * src/base/ftbbox.c allocate bbox_interface stract on the stack + instead of the global scope when FT_CONFIG_OPTION_PIC is defined. + * src/base/ftstroke.c access ft_outline_glyph_class allocated in + ftglyph.c via macros from basepic.h + +2009-04-05 Oran Agra + + Preparing changes in cff parser later needed for PIC version. + + * src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c, + src/cff/cffparse.c, src/cff/cffparse.h: Add library pointer to + 'CFF_ParserRec' set by `cff_parser_init'. + Route library pointer from 'cff_face_init' to 'cff_subfont_load' + for `cff_parser_init'. + + * src/cff/cffparse.c (CFF_Field_Handler): Move it to... + * src/cff/cffparse.h: This file, to be used by other C files. + +2009-04-05 Oran Agra + + Minor change in ftstroke.c. + + * src/base/ftstroke.c (FT_StrokerRec): Replace `memory' member with + `library' needed for PIC version. + Update all callers. + +2009-04-04 Werner Lemberg + + ftnames.c -> ftsnames.c + + * src/base/ftnames.c: Rename to... + * src/base/ftsnames.c: This. + * src/base/Jamfile, src/base/rules.mk, src/base/ftbase.c: Updated. + +2009-04-04 Werner Lemberg + + Add support for cmap type 13. + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_CMAP_FORMAT_13): New macro. + + * src/sfnt/ttcmap.c (TT_CMap13Rec, tt_cmap13_init, + tt_cmap13_validate, tt_cmap13_char_index, tt_cmap13_char_next, + tt_cmap13_get_info, tt_cmap13_char_map_def_binary, + tt_cmap14_class_rec): New functions and structures for cmap 13 + support. + (tt_cmap_classes): Register tt_cmap13_class_rec. + + * docs/CHANGES: Mention cmap 13 support. + +2009-04-01 Werner Lemberg + + Ignore empty contours in CFF glyphs. + + Problem reported by Albert Astals Cid . + + * src/cff/cffgload.c (cff_builder_close_contour): Synchronize with + t1_builder_close_contour. + +2009-03-21 Werner Lemberg + + Another redundant header inclusion. + + * src/truetype/ttgxvar.c: Fix Ghostscript Coverity issue #4041. + +2009-03-21 Werner Lemberg + + Remove redundant header inclusions. + + This covers many Ghostscript Coverity issues. + + * src/*: Do it. + +2009-03-21 Werner Lemberg + + Fix Ghostscript Coverity issue #3904. + + * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against + invalid values of `runcnt'. + +2009-03-20 Werner Lemberg + + Fix `make multi' run. + + * src/smooth/ftsmooth.h: Include FT_INTERNAL_DEBUG_H. + +2009-03-20 Werner Lemberg + + Fix Savannah bug #25923. + + * src/cache/ftccmap.c (FTC_CMAP_HASH): Fix typo. + +2009-03-20 Werner Lemberg + + Protect against too large glyphs. + + Problem reported by Tavis Ormandy . + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Don't allow + `pitch' or `height' to be larger than 0xFFFF. + +2009-03-20 Werner Lemberg + Tavis Ormandy + + Fix validation for various cmap table formats. + + * src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate, + tt_cmap12_validate): Check `length' correctly. + (tt_cmap_14_validate): Check `length' and `numMappings' correctly. + +2009-03-20 Werner Lemberg + + Protect against malformed compressed data. + + * src/lzw/ftzopen.c (ft_lzwstate_io): Test whether `state->prefix' is + zero. + +2009-03-20 Werner Lemberg + + Protect against invalid SID values in CFFs. + + Problem reported by Tavis Ormandy . + + * src/cff/cffload.c (cff_charset_load): Reject SID values larger + than 64999. + +2009-03-19 Vincent Richomme + + Update WinCE Visual C project files. + + * builds/wince/vc2005-ce/freetype.vcproj, + builds/wince/vc2008-ce/freetype.vcproj: Add missing base extension + files. + +2009-03-19 Werner Lemberg + + Remove unused Win32 code. + + * builds/wince/ftdebug.c: Remove code guarded with `!_WIN32_WCE'. + Since Win32 is handled separately this is no longer needed. + +2009-03-19 Vincent Richomme + + Make `gzip' module compile on WinCE. + + * src/gzip/zconf.h [_WIN32_WCE]: Define NO_ERRNO_H. + +2009-03-19 Werner Lemberg + + Remove unused WinCE code. + + * builds/win32/ftdebug.c: Remove code guarded with `_WIN32_WCE'. + Since WinCE is handled separately this is no longer needed. + +2009-03-16 Werner Lemberg + + docmaker: Don't ignore single-line code blocks. + + * src/tools/docmaker/content.py (DocBlock::_init__): Fix change from + 2009-01-31. + +2009-03-15 Steve Langasek + + Use __asm__ for declaring assembly instead of asm. + + * builds/unix/ftconfig.in (FT_MulFix_arm): Use __asm__ instead of + asm on arm, fixing a build failure on armel with -pedantic. + +2009-03-14 Werner Lemberg + + Fix valgrind warning. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned): Don't read + past the end of the frame. + +2009-03-12 Werner Lemberg + + * Version 2.3.9 released. + ========================= + + + Tag sources with `VER-2-3-9'. + +2009-03-12 Werner Lemberg + + * builds/unix/freetype2.in: Move @FT2_EXTRA_LIBS@ to `Libs.private'. + +2009-03-12 Werner Lemberg + + Fix some FreeType Coverity issues as reported for Ghostscript. + + * src/base/ftobjs.c (FT_New_Face, FT_New_Memory_Face): Initialize + `args.stream' (#3874, #3875). + (open_face_PS_from_sfnt_stream): Improve error management (#3786). + * src/base/ftmm.c (ft_face_get_mm_service): Fix check of `aservice' + (#3870). + * src/base/ftstroke.c (ft_stroke_border_get_counts): Remove dead + code (#3790). + * src/base/ftrfork.c (raccess_guess_apple_generic): Check error + value of `FT_Stream_Skip' (#3784). + + * src/type1/t1gload.c (T1_Load_Glyph): Check `size' before accessing + it (#3872) + + * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Check `face' before accessing + it (#3871). + * src/pcf/pcfread.c (pcf_get_metrics): Handle return value of + `pcf_get_metric' (#3789, #3782). + (pcf_get_properties): Use FT_STREAM_SKIP (#3783). + + * src/cache/ftcmanag.c (FTC_Manager_RegisterCache): Fix check of + `acache' (#3797) + + * src/cff/cffdrivr.c (cff_ps_get_font_info): Fix check of `cff' + (#3796). + * src/cff/cffgload.c (cff_decoder_prepare): Check `size' (#3795). + * src/cff/cffload.c (cff_index_get_pointers): Add comment (#3794). + + * src/bdf/bdflib.c (_bdf_add_property): Check `fp->value.atom' + (#3793). + (_bdf_parse_start): Add comment (#3792). + + * src/raster/ftraster.c (Finalize_Profile_Table): Check + `ras.fProfile' (#3791). + + * src/sfnt/ttsbit.c (Load_SBit_Image): Use FT_STREAM_SKIP (#3785). + + * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Properly ignore + seek error (#3781). + +2009-03-11 Michael Toftdal + + Extend CID service functions to handle CID-keyed CFFs as CID fonts. + + * include/freetype/ftcid.h (FT_Get_CID_Is_Internally_CID_keyed, + FT_Get_CID_From_Glyph_Index): New functions. + + * include/freetype/internal/services/svcid.h + (FT_CID_GetIsInternallyCIDKeyedFunc, + FT_CID_GetCIDFromGlyphIndexFunc): New function typedefs. + (CID Service): Use them. + + * src/base/ftcid.c: Include FT_CID_H. + (FT_Get_CID_Is_Internally_CID_keyed, FT_Get_CID_From_Glyph_Index): + New functions. + + * src/cff/cffdrivr.c (cff_get_is_cid, cff_get_cid_from_glyph_index): + New functions. + (cff_service_cid_info): Add them. + * src/cff/cffload.c (cff_font_load): Don't free `font->charset.sids' + -- it is needed for access as a CID-keyed font. It gets deleted + later on. + + * src/cid/cidriver.c (cid_get_is_cid, cid_get_cid_from_glyph_index): + New functions. + (cid_service_cid_info): Add them. + + * docs/CHANGES: Updated. + +2009-03-11 Bram Tassyns + + Fix Savannah bug #25597. + + * src/cff/cffparse.c (cff_parse_real): Don't allow fraction_length + to become larger than 9. + +2009-03-11 Werner Lemberg + + Fix Savannah bug #25814. + + * builds/unix/freetype2.in: As suggested in the bug report, move + @LIBZ@ to `Libs.private'. + +2009-03-11 Werner Lemberg + + Fix Savannah bug #25781. + We now simply check for a valid `offset', no longer handling `delta + = 1' specially. + + * src/sfnt/ttcmap.c (tt_cmap4_validate): Don't check `delta' for + last segment. + (tt_cmap4_set_range, tt_cmap4_char_map_linear, + tt_cmap4_char_map_binary): Check offset. + +2009-03-11 Werner Lemberg + + * src/base/Jamfile: Fix handling of ftadvanc.c. + Reported by Oran Agra . + +2009-03-10 Vincent Richomme + + Restructure Win32 and Wince compiler support. + + * src/builds/win32: Remove files for WinCE. + Move VC 2005 support to a separate directory. + Add directory for VC 2008 support. + + * src/builds/wince: New directory hierarchy for WinCE compilers + (VC 2005 and VC 2008). + +2009-03-09 Werner Lemberg + + More preparations for 2.3.9 release. + + * docs/CHANGES: Updated. + + * Jamfile, README: s/2.3.8/2.3.9/, s/238/239/. + +2009-03-09 Werner Lemberg + + * src/sfnt/rules.mk (SFNT_DRV_H): Add ttsbit0.c. + +2009-03-09 Alexey Kryukov + + Fix handling of EBDT formats 8 and 9 (part 2). + + This patch fixes the following problems in ttsbit0.c: + + . Bitmaps for compound glyphs were never allocated. + + . `SBitDecoder' refused to load metrics if some other metrics have + already been loaded. This condition certainly makes no sense for + recursive calls, so I've just disabled it. Another possibility + would be resetting `decoder->metrics_loaded' to false before + loading each composite component. However, we must restore the + original metrics after finishing the recursion; otherwise we can + get a misaligned glyph. + + . `tt_sbit_decoder_load_bit_aligned' incorrectly handled `x_pos', + causing some glyph components to be shifted too far to the right + (especially noticeable for small sizes). + + Note that support for grayscale bitmaps (not necessarily compound) is + completely broken in ttsbit0.c. + + * src/sfnt/tt_sbit_decoder_load_metrics: Always load metrics. + (tt_sbit_decoder_load_bit_aligned): Handle `x_pos' correctly in case + of `h == height'. + (tt_sbit_decoder_load_compound): Reset metrics after loading + components. + Allocate bitmap. + +2009-03-09 Werner Lemberg + + * builds/unix/configure.raw (version_info): Set to 9:20:3. + +2009-03-03 David Turner + + Protect SFNT kerning table parser against malformed tables. + + This closes Savannah BUG #25750. + + * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): Fix a + bug where a malformed table would be successfully loaded but later + crash the engine during parsing. + +2009-03-03 David Turner + + Update documentation and bump version number to 2.3.9. + + * include/freetype/freetype.h: Bump patch version to 9. + * docs/CHANGES: Document the ABI break in 2.3.8. + * docs/VERSION.DLL: Update version numbers table for 2.3.9. + +2009-03-03 David Turner + + Remove ABI-breaking field in public PS_InfoFontRec definition. + + Instead, we define a new internal PS_FontExtraRec structure to + hold the additional field, then place it in various internal + positions of the corresponding FT_Face derived objects. + + * include/freetype/t1tables.h (PS_FontInfoRec): Remove the + `fs_type' field from the public structure. + * include/freetype/internal/psaux.h (T1_FieldLocation): New + enumeration `T1_FIELD_LOCATION_FONT_EXTRA'. + * include/freetype/internal/t1types.h (PS_FontExtraRec): New + structure. + (T1_FontRec, CID_FaceRec): Add it. + + * src/cid/cidload.c (cid_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c: + Adjust FT_STRUCTURE and T1CODE properly to handle `FSType'. + * src/type1/t1load.c (t1_load_keyword): Handle + T1_FIELD_LOCATION_FONT_EXTRA. + + * include/freetype/internal/services/svpsinfo.h (PsInfo service): + Add `PS_GetFontExtraFunc' function typedef. + + * src/base/ftfstype.c: Include FT_INTERNAL_SERVICE_H and + FT_SERVICE_POSTSCRIPT_INFO_H. + (FT_Get_FSType_Flags): Use POSTSCRIPT_INFO service. + + * src/cff/cffdrivr.c (cff_service_ps_info): Updated. + * src/cid/cidriver.c (cid_ps_get_font_extra): New function. + (cid_service_ps_info): Updated. + * src/type1/t1driver.c (t1_ps_get_font_extra): New function. + (t1_service_ps_info): Updated. + * src/type42/t42drivr.c (t42_ps_get_font_extra): New function. + (t42_service_ps_info): Updated. + +2009-03-02 Alexey Kryukov + + Fix handling of EBDT formats 8 and 9. + + The main cycle in `blit_sbit' makes too many iterations: it actually + needs the count of lines in the source bitmap rather than in the + target image. + + * src/sfnt/ttsbit.c (blit_sbit) [FT_CONFIG_OPTION_OLD_INTERNALS]: + Add parameter `source_height' and use it for main loop. + (Load_SBit_Single) [FT_CONFIG_OPTION_OLD_INTERNALS]: Updated. + +2009-02-23 Werner Lemberg + + Fix Savannah bug #25669. + + * src/base/ftadvanc.h (FT_Get_Advances): Fix serious typo. + + * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics): Fix + scaling factor for non-scalable fonts. + + * src/cff/cffdrivr.c (cff_get_advances): Use correct advance width + value to prevent incorrect scaling. + + * docs/CHANGES: Document it. + +2009-02-15 Matt Godbolt + + Fix Savannah bug #25588. + + * builds/unix/ftconfig.in (FT_MulFix_arm): Use correct syntax for + `orr' instruction. + +2009-02-11 Werner Lemberg + + * src/truetype/ttobjs.c (tt_check_trickyness): Add `DFKaiShu'. + Reported by David Bevan . + +2009-02-09 Werner Lemberg + + Fix Savannah bug #25495. + + * src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before + setting metrics and bbox values. This ensures that the check for a + font with neither a `glyf' table nor bitmap strikes can be performed + early enough to set metrics and bbox values too. + +2009-02-04 Werner Lemberg + + Fix Savannah bug #25480. + + * builds/unix/freetype-config.in: For --ftversion, don't use $prefix + but $includedir. + +2009-01-31 Werner Lemberg + + Minor docmaker improvements. + + * src/tools/docmaker/content.py (DocBlock::__init__): Ignore empty + code blocks. + +2009-01-25 Werner Lemberg + + Fix SCANCTRL handling in TTFs. + Problem reported by Alexey Kryukov . + + * src/truetype/ttinterp.c (Ins_SCANCTRL): Fix threshold handling. + +2009-01-23 Werner Lemberg + + Move FT_Get_FSType_Flags to a separate file. + Problem reported by Mickey Gabel . + + * src/base/ftobjs.c (FT_Get_FSType_Flags): Move to... + * src/base/ftfstype.c: This new file. + + * modules.cfg (BASE_EXTENSION): Add ftfstype.c. + + * docs/INSTALL.ANY: Updated. + + * builds/mac/*.txt, builds/amiga/*makefile*, + builds/win32/{visualc,visualce}/freetype.*, builds/symbian/*: + Updated. + +2009-01-22 suzuki toshiya + + * builds/unix/ftsystem.c (FT_Stream_Open): Fix 2 error + messages ending without "\n". + +2009-01-22 suzuki toshiya + + Fix Savannah bug #25347. + + * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Rewind + the stream to the original position passed to this function, + when ft_lookup_PS_in_sfnt_stream() failed. + (Mac_Read_sfnt_Resource): Rewind the stream to the head of + sfnt resource body, when open_face_PS_from_sfnt_stream() + failed. + +2009-01-19 Michael Lotz + + Fix Savannah bug #25355. + + * include/freetype/config/ftconfig.h (FT_MulFix_i386): Make + assembler code work with gcc 2.95.3 (as used by the Haiku project). + Add `cc' register to the clobber list. + +2009-01-18 Werner Lemberg + + Protect FT_Get_Next_Char. + + * src/sfnt/ttcmap.c (tt_cmap4_set_range): Apply fix similar to + change from 2008-07-22. + + Patch from Ronen Ghoshal . + +2009-01-18 Werner Lemberg + + Implement FT_Get_Name_Index for SFNT driver. + + * src/sfnt/sfdriver.c (sfnt_get_name_index): New function. + (sfnt_service_glyph_dict): Use it. + + Problem reported by Truc Truong . + +2009-01-18 Werner Lemberg + + * include/freetype/ftstroke.h (FT_Outline_GetInsideBorder): Fix + documentation. Problem reported by Truc Truong . + + * docs/CHANGES: Updated. + +2009-01-14 Werner Lemberg + + * Version 2.3.8 released. + ========================= + + + Tag sources with `VER-2-3-8'. + + * docs/VERSION.DLL: Update documentation and bump version number to + 2.3.8. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.7/2.3.8/, s/237/238/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. + + * builds/unix/configure.raw (version_info): Set to 9:19:3. + + * docs/release: Updated. + +2009-01-14 Werner Lemberg + + * builds/toplevel.mk (dist): Compress better. + +2009-01-13 Werner Lemberg + + * src/base/ftobjs.c (FT_Get_FSType_Flags): Cast for compilation + with C++. + +2009-01-13 Werner Lemberg + + Don't use stdlib.h and friends directly. + Reported by Mickey Gabel . + + * src/base/ftdbgmem.c: s//FT_CONFIG_STANDARD_LIBRARY_H/. + + * src/gzip/ftgzip.c, src/lzw/ftlzw.c, src/raster/ftmisc.h: + s//FT_CONFIG_STANDARD_LIBRARY_H/. + + * src/autofit/aftypes.h, src/autofit/afhints.c, + src/pshinter/pshalgo.c: s//FT_CONFIG_STANDARD_LIBRARY_H/ + + * src/lzw/ftlzw.c, src/base/ftdbgmem.c: Don't include stdio.h. + +2009-01-12 Werner Lemberg + + Avoid compiler warnings. + + * */*: s/do ; while ( 0 )/do { } while ( 0 )/. + Reported by Sean McBride . + +2009-01-12 Werner Lemberg + + Fix stdlib dependencies. + + Problem reported by Mickey Gabel . + + * include/freetype/config/ftstdlib.h (ft_exit): Removed. Unused. + + * src/autofit/afhints.c, src/base/ftlcdfil.c, src/smooth/ftsmooth.c: + s/memcpy/ft_memcpy/. + * src/psaux/t1decode.c: s/memset/ft_memset/, s/memcpy/ft_memcpy/. + +2009-01-11 Werner Lemberg + + * docs/formats.txt: Add link to PCF specification. + + * include/freetype/ftbdf.h (FT_Get_BDF_Property): Improve + documentation. + +2009-01-09 suzuki toshiya + + * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, + FT_Get_Advances): Change the type of load_flags from FT_UInt32 to + FT_Int32, to match with the flags for FT_Load_Glyph(). + * src/cff/cffdrivr.c (cff_get_advances): Ditto. + * src/truetype/ttdriver.c (tt_get_advances): Ditto. + * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): + Ditto. + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + Ditto. + +2009-01-09 Daniel Zimmermann + + * src/gxvalid/gxvmort.c (gxv_mort_feature_validate): Fix wrong + length check. From Savannah patch #6682. + +2009-01-09 Werner Lemberg + + Fix problem with T1_FIELD_{NUM,FIXED}_TABLE2. + + * src/psaux/psobjs.c (ps_parser_load_field_table): Don't handle + `count_offset' if it is zero (i.e., unused). Otherwise, the first + element of the structure which holds the data is erroneously + modified. Problem reported by Chi Nguyen . + +2009-01-09 suzuki toshiya + + * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance, + FT_Get_Advances): Extend the type of load_flags from FT_UInt to + FT_UInt32, to pass 32-bit flags on 16bit platforms. + * src/cff/cffdrivr.c (cff_get_advances): Ditto. + * src/truetype/ttdriver.c (tt_get_advances): Ditto. + * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances): + Ditto. + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + Ditto. + +2009-01-09 suzuki toshiya + + * src/base/ftobjs.c (FT_Done_Library): Issue an error message when + FT_Done_Face() cannot free all faces. If the list of the opened + faces includes broken face which FT_Done_Face() cannot free, + FT_Done_Library() retries FT_Done_Face() and it can fall into + an endless loop. See the discussion: + http://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html + http://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html + +2009-01-07 Werner Lemberg + + * docs/CHANGES: Document new key `a' in ftdiff. + +2009-01-06 Werner Lemberg + + * autogen.sh: Don't use GNUisms while calling sed. Problem reported + by Sean McBride. + +2009-01-06 Werner Lemberg + + * src/base/ftbitmap.c (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_LCD + and FT_PIXEL_MODE_LCD_V. Problem reported by Chi Nguyen + . + +2009-01-06 Diego Pettenò + + * builds/unix/configure.raw: Don't call AC_CANONICAL_BUILD and + AC_CANONICAL_TARGET and use $host_os only. A nice explanation for + this change can be found at + http://blog.flameeyes.eu/s/canonical-target. + + From Savannah patch #6712. + +2009-01-06 Sean McBride + + * src/base/ftdbgmem.c (_debug_mem_dummy): Make it static. + + * src/base/ftmac.c: Remove some #undefs. + +2008-12-26 Werner Lemberg + + Set `face_index' field in FT_Face for all font formats. + + * cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init), + sfnt/sfobjs.c (sfnt_init_face): Do it. + + * docs/CHANGES: Document it. + +2008-12-22 Steve Grubb + + * builds/unix/ftsystem.c (FT_Stream_Open): Reject zero-length files. + Patch from Savannah bug #25151. + +2008-12-21 Werner Lemberg + + * src/pfr/pfrdrivr.c, src/winfonts/winfnt.c, src/cache/ftcmanag.c, + src/smooth/ftgrays.c, src/base/ftobjc.s, src/sfobjs.c: + s/_Err_Bad_Argument/_Err_Invalid_Argument/. The former is for + errors in the bytecode interpreter only. + +2008-12-21 Werner Lemberg + + * src/base/ftpfr.c (FT_Get_PFR_Metrics): Protect against NULL + arguments. + Fix return value for non-PFR fonts. Both problems reported by Chi + Nguyen . + +2008-12-21 anonymous + + FT_USE_MODULE declares things as: + + extern const FT_Module_Class + + (or similar for C++). However, the actual types of the variables + being declared are often different, e.g., FT_Driver_ClassRec or + FT_Renderer_Class. (Some are, indeed, FT_Module_Class.) + + This works with most C compilers (since those structs begin with an + FT_Module_Class struct), but technically it's undefined behavior. + + To quote the ISO/IEC 9899:TC2 final committee draft, section 6.2.7 + paragraph 2: + + All declarations that refer to the same object or function shall + have compatible type; otherwise, the behavior is undefined. + + (And they are not compatible types.) + + Most C compilers don't reject (or even detect!) code which has this + issue, but the GCC LTO development branch compiler does. (It + outputs the types of the objects while generating .o files, along + with a bunch of other information, then compares them when doing the + final link-time code generation pass.) + + Patch from Savannah bug #25133. + + * src/base/ftinit.c (FT_USE_MODULE): Include variable type. + + * builds/amiga/include/freetype/config/ftmodule.h, + include/freetype/config/ftmodule.h, */module.mk: Updated to declare + pass correct types to FT_USE_MODULE. + +2008-12-21 Hongbo Ni + + * src/autofit/aflatin.c (af_latin_hint_edges), + src/autofit/aflatin2.c (af_latin2_hint_edges), src/autofit/afcjk.c + (af_cjk_hint_edges): Protect against division by zero. This fixes + Savannah bug #25124. + +2008-12-18 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-12-18 Bevan, David + + Provide API for accessing embedding and subsetting restriction + information. + + * include/freetype.h (FT_FSTYPE_INSTALLABLE_EMBEDDING, + FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING, + FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING, FT_FSTYPE_EDITABLE_EMBEDDING, + FT_FSTYPE_NO_SUBSETTING, FT_FSTYPE_BITMAP_EMBEDDING_ONLY): New + macros. + (FT_Get_FSType_Flags): New function declaration. + + * src/base/ftobjs.c (FT_Get_FSType_Flags): New function. + + * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c + (t42_keywords): Handle `FSType'. + + * include/freetype/t1tables.h (PS_FontInfoRec): Add `fs_type' field. + +2008-12-17 Werner Lemberg + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Don't use internal + macros so that copying the source code into an application works + out of the box. + +2008-12-17 Werner Lemberg + + * include/freetype/ftsynth.h, src/base/ftsynth.c: Move + FT_GlyphSlot_Own_Bitmap to... + * include/freetype/ftbitmap.h, src/base/ftbitmap.c: These files. + + * docs/CHANGES: Document it. + +2008-12-10 Werner Lemberg + + Generalize the concept of `tricky' fonts by introducing + FT_FACE_FLAG_TRICKY to indicate that the font format's hinting + engine is necessary for correct rendering. + + At the same time, slightly modify the behaviour of tricky fonts: + FT_LOAD_NO_HINTING is now ignored. To really force raw loading + of tricky fonts (without hinting), both FT_LOAD_NO_HINTING and + FT_LOAD_NO_AUTOHINT must be used. + + Finally, tricky TrueType fonts always use the bytecode interpreter + even if the patented code is used. + + * include/freetype/freetype.h (FT_FACE_FLAG_TRICKY, FT_IS_TRICKY): + New macros. + + * src/truetype/ttdriver.c (Load_Glyph): Handle new load flags + semantics as described above. + + * src/truetype/ttobjs.c (tt_check_trickyness): New function, using + code of ... + (tt_face_init): This function, now simplified and updated to new + semantics. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't use autohinter for tricky + fonts. + + * docs/CHANGES: Document it. + +2008-12-09 Werner Lemberg + + Really fix Savannah bug #25010: An SFNT font with neither outlines + nor bitmaps can be considered as containing space `glyphs' only. + + * src/truetype/ttpload.c (tt_face_load_loca): Handle the case where + a `glyf' table is missing. + + * src/truetype/ttgload.c (load_truetype_glyph): Abort if we have no + `glyf' table but a non-zero `loca' entry. + (tt_loader_init): Handle missing `glyf' table. + + * src/base/ftobjs.c (FT_Load_Glyph): Undo change 2008-12-05. + + * src/sfnt/sfobjs.c (sfnt_load_face): A font with neither outlines + nor bitmaps is scalable. + +2008-12-05 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_uniranges): Add more ranges. This + fixes Savannah bug #21190 which also provides a basic patch. + +2008-12-05 Werner Lemberg + + * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value + 0x100 instead of 0x10000; the latter value is already occupied by + FT_LOAD_TARGET_LIGHT. Bug reported by James Cloos. + + + Handle SFNT with neither outlines nor bitmaps. This fixes Savannah + bug #25010. + + * src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither + outlines nor bitmaps. + + * src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there + is no table with glyphs. + + + * src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging + message. + +2008-12-01 Werner Lemberg + + GDEF tables need `glyph_count' too for validation. Problem reported + by Chi Nguyen . + + * src/otvalid/otvgdef.c (otv_GDEF_validate), src/otvalid/otvalid.h + (otv_GDEF_validate), src/otvalid/otvmod.c (otv_validate): Pass + `glyph_count'. + +2008-11-29 Werner Lemberg + + * src/autofit/afcjk.c, src/base/ftoutln.c, src/base/ftrfork.c, + src/bdf/bdfdrivr.c, src/gxvalid/gxvmorx.c, src/otvalid/otvmath.c, + src/pcf/pcfdrivr.c, src/psnames/pstables.h, src/smooth/ftgrays.c, + src/tools/glnames.py, src/truetype/ttinterp.c, src/type1/t1load.c, + src/type42/t42objs.c, src/winfonts/winfnt.c: Fix compiler warnings + (Atari PureC). + +2008-11-29 James Cloos + + * src/type/t1load.c (mm_axis_unmap): Revert previous patch and fix + it correctly by using FT_INT_TO_FIXED (FreeType expects 16.16 values + in the /BlendDesignMap space). + +2008-11-29 James Cloos + + * src/type1/t1load.c (mm_axis_unmap): `blend_points' is FT_Fixed*, + whereas `design_points' is FT_Long*. Therefore, return blend rather + than design points. + +2008-11-27 Werner Lemberg + + * src/cff/cffparse.c (cff_parse_real): Handle more than nine + significant digits correctly. This fixes Savannah bug #24953. + +2008-11-25 Daniel Zimmermann + + * src/base/ftstream.c (FT_Stream_ReadFields): Don't access stream + before the NULL check. From Savannah patch #6681. + +2008-11-24 Werner Lemberg + + Fixes from the gnuwin32 port. + + * src/base/ftlcdfil.c: s/EXPORT/EXPORT_DEF/. + + * src/base/ftotval.c: Include FT_OPENTYPE_VALIDATE_H. + + * src/psaux/psobjs.c (ps_table_add): Check `length'. + +2008-11-15 Werner Lemberg + + * src/truetype/ttinterp.c (tt_default_graphics_state): The default + value for `scan_type' is zero, as confirmed by Greg Hitchcock from + Microsoft. Problem reported by Michal Nowakowski + . + +2008-11-12 Tor Andersson + + * src/cff/cffdrivr.c (cff_get_cmap_info): Initialize `format' field. + This fixes Savannah bug #24819. + +2008-11-08 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Remove #if 0/#endif guards + since OpenType version 1.5 has been released. + + * include/ttnameid.h (TT_NAME_ID_WWS_FAMILY, + TT_NAME_ID_WWS_SUBFAMILY): New macros for OpenType 1.5. + (TT_URC_COPTIC, TT_URC_VAI, TT_URC_NKO, TT_URC_BALINESE, + TT_URC_PHAGSPA, TT_URC_NON_PLANE_0, TT_URC_PHOENICIAN, + TT_URC_TAI_LE, TT_URC_NEW_TAI_LUE, TT_URC_BUGINESE, + TT_URC_GLAGOLITIC, TT_URC_YIJING, TT_URC_SYLOTI_NAGRI, + TT_URC_LINEAR_B, TT_URC_ANCIENT_GREEK_NUMBERS, TT_URC_UGARITIC, + TT_URC_OLD_PERSIAN, TT_URC_SHAVIAN, TT_URC_OSMANYA, + TT_URC_CYPRIOT_SYLLABARY, TT_URC_KHAROSHTHI, TT_URC_TAI_XUAN_JING, + TT_URC_CUNEIFORM, TT_URC_COUNTING_ROD_NUMERALS, TT_URC_SUNDANESE, + TT_URC_LEPCHA, TT_URC_OL_CHIKI, TT_URC_SAURASHTRA, TT_URC_KAYAH_LI, + TT_URC_REJANG, TT_URC_CHAM, TT_URC_ANCIENT_SYMBOLS, + TT_URC_PHAISTOS_DISC, TT_URC_OLD_ANATOLIAN, TT_URC_GAME_TILES): New + macros for OpenType 1.5. + +2008-11-08 Wenlin Institute + + * src/base/ftobjs.c (ft_glyphslot_free_bitmap): Protect against + slot->internal == NULL. Reported by Graham Asher. + +2008-11-08 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error + code so that memory allocation problems can be distinguished from + missing table entries. Reported by Graham Asher. + (GET_NAME): New macro. + (sfnt_load_face): Use it. + +2008-11-05 Werner Lemberg + + * devel/ftoption.h, include/freetype/config/ftoption.h + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Undefine + TT_CONFIG_OPTION_UNPATENTED_HINTING. This fixes the return value of + `FT_Get_TrueType_Engine_Type' (and makes it work as documented). + Reported in bug #441638 of bugzilla.novell.com. + + * docs/CHANGES: Document it. + +2008-11-03 Werner Lemberg + + * src/type1/t1load.c (parse_subrs): Use an endless loop. There are + fonts (like HELVI.PFB version 003.001, used on OS/2) which define + some `subrs' elements more than once. Problem reported by Peter + Weilbacher . + +2008-10-15 Graham Asher + + * src/sfnt/ttpost.c (tt_post_default_names): Add `const'. + +2008-10-15 David Turner + + * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Disambiguate for + meddlesome compilers' warning against `for ( ...; ...; ...) ;'. + +2008-10-14 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Remove compiler warning. + Suggested by Bram Tassyns in Savannah patch #6651. + +2008-10-12 Graham Asher + + * src/sfnt/sfobjs.c (sfnt_load_face): Fix computation of + `underline_position'. + +2008-10-12 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-10-09 suzuki toshiya + + Fix Savannah bug #24468. + + According to include/freetype/internal/ftobjs.h, the appropriate + type to interchange single character codepoint is FT_UInt32. It + should be distinguished from FT_UInt which can be 16bit integer. + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Change the type + of the second argument `pcharcode' from FT_UInt* to FT_UInt32*. + (tt_cmap4_char_map_binary): Ditto. + (tt_cmap14_get_nondef_chars): Change the type of return value + from FT_UInt* to FT_UInt32*. + +2008-10-08 John Tytgat + + Fix Savannah bug #24485. + + * src/type1/t1load.c (parse_charstrings): Assure that we always have + a .notdef glyph. + +2008-10-05 suzuki toshiya + + * src/base/ftmac.c: Include FT_TRUETYPE_TAGS_H for multi build. + * builds/mac/ftmac.c: Ditto. + +2008-10-05 suzuki toshiya + + * include/freetype/tttags.h (TTAG_TYP1, TTAG_typ1): Fix definitions. + * src/base/ftobjs.c: Include FT_TRUETYPE_TAGS_H. + +2008-10-05 suzuki toshiya + + * src/sfnt/sfobjs.c (sfnt_open_font): Allow `typ1' version tag in + the beginning of sfnt container. + * src/sfnt/ttload.c (check_table_dir): Return + `SFNT_Err_Table_Missing' when sfnt table directory structure is + correct but essential tables for TrueType fonts (`head', `bhed' or + `SING') are missing. Other errors are returned by + SFNT_Err_Unknown_File_Format. + + * src/base/ftobjs.c (FT_Open_Face): When TrueType driver returns + `FT_Err_Table_Missing', try `open_face_PS_from_sfnt_stream'. It is + enabled only when old mac font support is configured. + +2008-10-04 suzuki toshiya + + * include/freetype/tttags.h (TTAG_CID, TTAG_FOND, TTAG_LWFN, + TTAG_POST, TTAG_sfnt, TTAG_TYP1, TTAG_typ1): New tags to simplify + the repeated calculations of these values in ftobjs.c and ftmac.c. + * src/base/ftobjs.c: Replace all FT_MAKE_TAG by new tags. + * src/base/ftmac.c: Ditto. + * builds/mac/ftmac.c: Ditto. + +2008-10-04 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt_stream): Remove wrong + initialization of *is_sfnt_cid. + +2008-10-04 Werner Lemberg + + * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Remove compiler + warnings. + +2008-10-04 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Replaced by... + (ft_lookup_PS_in_sfnt_stream): This. + (open_face_PS_from_sfnt_stream): New function. It checks whether + the stream is sfnt-wrapped Type1 PS font or sfnt-wrapped CID-keyed + font, then try to open a face for given face_index. + (Mac_Read_sfnt_Resource): Replace the combination of + `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' by + `open_face_PS_from_sfnt_stream'. + * src/base/ftmac.c (FT_New_Face_From_SFNT): Ditto. + * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. + * src/base/ftbase.h: Remove `ft_lookup_PS_in_sfnt' and add + `open_face_PS_from_sfnt_stream'. + +2008-10-03 suzuki toshiya + + * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Set *is_sfnt_cid to + FALSE if neither `CID ' nor `TYP1' is found in the sfnt container. + +2008-10-03 suzuki toshiya + + * include/freetype/config/ftconfig.h: Define FT_MACINTOSH when SC or + MrC compiler of MPW is used. These compilers do not define the + macro __APPLE__ by themselves. + * builds/unix/ftconfig.in: Ditto. + * builds/vms/ftconfig.h: Ditto. + * src/base/ftbase.c: Use FT_MACINTOSH instead of __APPLE__, to + include ftmac.c if FreeType 2 is built by MPW. + * src/base/ftobjs.c: Use FT_MACINTOSH instead of __APPLE__, to + enable shared functions for ftmac.c if FreeType 2 is built by MPW. + + * builds/mac/ftmac.c: Include ftbase.h. + (memory_stream_close): Removed. + (new_memory_stream): Ditto. + (open_face_from_buffer): Removed. Use the implementation in + ftobjs.c. + (ft_lookup_PS_in_sfnt): Ditto. + + * builds/mac/FreeType.m68k_far.make.txt: Build ftmac.c as an + included part of ftbase.c, to share the functions in ftobjs.c. The + rule compiling ftmac.c separately is removed and the rule copying + ftbase.c from src/base/ftbase.c to builds/mac/ftbase.c is added. + * builds/mac/FreeType.m68k_cfm.make.txt: Ditto. + * builds/mac/FreeType.ppc_classic.make.txt: Ditto. + * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. + +2008-10-02 Bram Tassyns + + * src/cff/cffgload.c (cff_slot_load): Map CID 0 to GID 0. This + fixes Savannah bug #24430. + +2008-10-02 Werner Lemberg + + * builds/freetype.mk (BASE_H): Rename to... + (INTERNAL_H): This. + (FREETYPE_H): Updated. + * src/base/rules.mk: (BASE_OBJ_S, OBJ_DIR/%.$O): Add BASE_H. + * src/bdf/rules.mk (BDF_DRV_H): Add bdferror.h. + * src/cache/rules.mk (CACHE_DRV_H): Add ftccache.h and ftcsbits.h. + * src/pcf/rules.mk (PCF_DRV_H): Add pcfread.h. + * src/raster/rules.mk (RASTER_DRV_H): Add ftmisc.h. + * src/type42/rules.mk (T42_DRV_H): Add t42types.h. + +2008-10-02 suzuki toshiya + + * src/base/ftbase.h: New file to declare the private utility + functions shared by the sources of base modules. Currently, + `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' are declared to + share between ftobjs.c and ftmac.c. + + * src/base/rule.mk: Add ftbase.h. + + * src/base/ftobjs.c: Include ftbase.h. + (memory_stream_close): Build on any platform when old MacOS font + support is enabled. + (new_memory_stream): Ditto. + (open_face_from_buffer): Build on any platform when old MacOS font + support is enabled. The counting of the face in a font file is + slightly different between Carbon-dependent parser and Carbon-free + parser. They are merged with the platform-specific conditional. + (ft_lookup_PS_in_sfnt): Ditto. + + * src/base/ftmac.c: Include ftbase.h. + (memory_stream_close): Removed. + (new_memory_stream): Ditto. + (open_face_from_buffer): Removed. Use the implementation in + ftobjs.c. + (ft_lookup_PS_in_sfnt): Ditto. + +2008-10-02 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): `psnames_error' is only needed + if TT_CONFIG_OPTION_POSTSCRIPT_NAMES is defined. + +2008-10-01 Werner Lemberg + + * src/truetype/ttobjs.c (tt_face_done), src/cff/cffobjs.c + (cff_face_done), src/pfr/pfrobjs.c (pfr_face_done), + src/pcf/pcfdrivr.c (PCF_Face_Done), src/cid/cidobjs.c + (cid_face_done), src/bdf/bdfdrivr. (BDF_Face_Done), + src/sfnt/sfobjs.c (sfnt_face_done): Protect against face == 0. + Reported by Graham Asher. + +2008-09-30 suzuki toshiya + + * src/base/rules.mk: Add conditional source to BASE_SRC, for `make + multi' on Mac OS X. If the macro $(ftmac_c) is defined, + $(BASE_DIR)/$(ftmac_c) is added to BASE_SRC. In a normal build, the + lack of ftmac.c in BASE_SRC is not serious because ftbase.c includes + ftmac.c. + * builds/unix/unix-def.in: Add a macro definition of $(ftmac_c). + * builds/unix/configure.raw: Add procedure to set up appropriate + value of $(ftmac_c) with the consideration of the availability of + Carbon framework. + +2008-09-30 suzuki toshiya + + * src/base/Jamfile: Add target for multi build by jam on Mac OS X. + * src/base/ftobjs.c (FT_New_Face): Fix the condition to include this + function for MPW building. It is synchronized the condition to + include ftmac.c source into ftbase.c. + +2008-09-22 Werner Lemberg + + * src/cff/cffgload.c (CFF_Operator, cff_argument_counts, + cff_decoder_parse_charstrings): Handle (invalid) + `callothersubr' and `pop' instructions. + +2008-09-22 John Tytgat + + Fix Savannah bug #24307. + + * include/freetype/internal/t1types.h (CID_FaceRec), + src/type42/t42types.h (T42_FaceRec): Comment out `afm_data'. + +2008-09-21 Werner Lemberg + + * src/smooth/ftgrays.c (gray_raster_render): Don't dereference + `target_map' if FT_RASTER_FLAG_DIRECT is set. Problem reported by + Stephan T. Lavavej . + +2008-09-21 suzuki toshiya + + * src/otvalid/Jamfile: Add missing target `otvmath' for multi build + by jam. + * src/sfnt/Jamfile: Add missing target `ttmtx' for multi build by + jam. + +2008-09-20 Werner Lemberg + + * src/smooth/ftgrays.c (gray_find_cell): Fix threshold. The values + passed to this function are already `normalized'. Problem reported + by Stephan T. Lavavej . + + * docs/CHANGES: Document it. + +2008-09-20 Werner Lemberg + + * src/base/ftoutln.c: Include FT_INTERNAL_DEBUG_H. + (FT_Outline_Decompose): Decorate with tracing messages. + + * src/smooth/ftgrays.c [DEBUG_GRAYS]: Replace with + FT_DEBUG_LEVEL_TRACE. + [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: Include stdio.h and + stdarg.h. + + (FT_TRACE) [_STANDALONE_]: Remove. + (FT_Message) [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: New function. + (FT_TRACE5, FT_TRACE7) [_STANDALONE_]: New macros. + (FT_ERROR) [_STANDALONE_]: Updated. + + (gray_hline) [FT_DEBUG_LEVEL_TRACE]: Fix condition. + Use FT_TRACE7. + (gray_dump_cells): Make it `static void'. + (gray_convert_glyph): Use FT_TRACE7. + + (FT_Outline_Decompose) [_STANDALONE_]: Synchronize with version in + ftoutln.c. + + * src/base/ftadvanc.c (FT_Get_Advance, FT_Get_Advances): Use + FT_ERROR_BASE. + + * docs/formats.txt: Updated. + +2008-09-19 suzuki toshiya + + * src/base/ftmac.c: Import sfnt-wrapped Type1 and sfnt-wrapped + CID-keyed font support. + * builds/mac/ftmac.c: Ditto. + +2008-09-19 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Fix double free bug in + sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font support code. + `open_face_from_buffer' frees the passed buffer if it cannot open a + face from the buffer, so the caller must not free it. + +2008-09-19 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Add initial support + for sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font. + (ft_lookup_PS_in_sfnt): New function to look up `TYP1' or `CID ' + table in sfnt table directory. It is used before loading TrueType + font driver. + + * docs/CHANGES: Add note about the current status of sfnt-wrapped + Type1 and sfnt-wrapped CID-keyed font support. + +2008-09-18 Werner Lemberg + + * src/base/ftsystem.c (FT_Done_Memory): Use ft_sfree directly for + orthogonality (ft_free and ft_sfree could belong to different memory + pools). This fixes Savannah bug #24297. + +2008-09-18 suzuki toshiya + + * src/cff/cffobjs.c (cff_face_init): Use TTAG_OTTO defined + in ttags.h instead of numerical value 0x4F54544FL. + +2008-09-16 Werner Lemberg + + * src/cff/cffgload.h, src/cff/cffgload.c + (cff_decoder_set_width_only): Eliminate function call. + +2008-09-15 George Williams + + Fix Savannah bug #24179, reported by Bram Tassyns. + + * src/type1/t1load.c (mm_axis_unmap, T1_Get_MM_Var): Fix computation + of default values. + +2008-09-15 Werner Lemberg + + * src/tools/glnames.py (main): Surround `ft_get_adobe_glyph_index' + and `ft_adobe_glyph_list' with FT_CONFIG_OPTION_ADOBE_GLYPH_LIST to + prevent unconditional definition. This fixes Savannah bug #24241. + + * src/psnames/pstables.h: Regenerated. + +2008-09-13 Werner Lemberg + + * autogen.sh, builds/unix/configure.raw, + include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor + beautifying. + + * include/freetype/ftadvanc.h, include/freetype/ftgasp.h, + include/freetype/ftlcdfil.h: Protect against FreeType 1. + Some other minor fixes. + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + +2008-09-11 Werner Lemberg + + * src/base/ftbase.c: Include ftadvanc.c. + +2008-09-11 suzuki toshiya + + * builds/unix/ftconfig.in: Duplicate the cpp computation of + FT_SIZEOF_{INT|LONG} from include/freetype/config/ftconfig.h. + (FT_USE_AUTOCONF_SIZEOF_TYPES): New macro. If defined, the cpp + computation is disabled and the statically configured sizes are + used. This fixes Savannah bug #21250. + + * builds/unix/configure.raw: Add the checks to compare the cpp + computation results of the bit length of int and long versus the + sizes detected by running `configure'. If the results are + different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to prioritize the + results. + New option --{enable|disable}-biarch-config is added to define or + undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually. + +2008-09-05 suzuki toshiya + + * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or + ApplicationService framework is missing. Although this value is not + used in building of FreeType2, it is written in `freetype2.pc' and + `freetype-config'. + +2008-09-01 david turner + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap + index to mean `use default cached FT_Face's charmap'. This fixes + Savannah bug #22625. + * include/freetype/ftcache.h: Document it. + + + Make FT_MulFix an inlined function. This is done to speed up + FreeType a little (on x86 3% when loading+hinting, 10% when + rendering, ARM savings are more important though). Disable this by + undefining FT_CONFIG_OPTION_INLINE_MULFIX. + + Use of assembler code can now be controlled with + FT_CONFIG_OPTION_NO_ASSEMBLER. + + * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_arm): New assembler + implementation. + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_i386): Assembler + implementation taken from `ftcalc.c'. + [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MULFIX_ASSEMBLER): New macro + which is defined to the platform-specific assembler implementation + of FT_MulFix. + [FT_CONFIG_OPTION_INLINE_MULFIX && FT_MULFIX_ASSEMBLER] + (FT_MULFIX_INLINED): New macro. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_NO_ASSEMBLER, + FT_CONFIG_OPTION_INLINE_MULFIX): New macros. + + * include/freetype/freetype.h: Updated to handle FT_MULFIX_INLINED. + + * src/base/ftcalc.c: Updated to use FT_MULFIX_ASSEMBLER and + FT_MULFIX_INLINED. + + + Add a new header named FT_ADVANCES_H declaring some new APIs to + extract the advances of one or more glyphs without necessarily + loading their outlines. Also provide `fast loaders' for the + TrueType, Type1, and CFF font drivers (more to come later). + + * src/base/ftadvanc.c, include/freetype/ftadvanc.h: New files. + + * include/freetype/config/ftheader.h (FT_ADVANCES_H): New macro. + * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): New macro. + + * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc): + `flags' and `advances' are now of type `FT_UInt' and `FT_Fixed', + respectively. + + * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC): Add + ftadvanc.c. + + * src/cff/cffdrivr.c (cff_get_advances): New function. + (cff_driver_class): Register it. + + * src/cff/cffgload.c (cff_decoder_set_width_only): New function. + (cff_decoder_parse_charstrings): Handle `width_only'. + (cff_slot_load): Handle FT_LOAD_ADVANCE_ONLY. + + * src/cff/cffgload.h (cff_decoder): New element `width_only'. + (cff_decoder_set_width_only): New declaration. + + * src/truetype/ttdriver.c (tt_get_advances): New function. + (tt_driver_class): Register it. + + * src/truetype/ttgload.c (Get_HMetrics, Get_VMetrics): Renamed to... + (TT_Get_HMetrics, TT_Get_VMetrics): This. + Update callers. + * src/truetype/ttgload.h: Declare them. + + * src/type1/t1gload.h, src/type1/t1gload.c (T1_Get_Advances): New + function. + * src/type1/t1driver.c (t1_driver_class): Register T1_Get_Advances. + + + Add checks for minimum version of the `autotools' stuff. + + * autogen.sh: Implement it. + (get_major_version, get_minor_version, get_patch_version, + compare_to_minimum_version, check_tool_version): New auxiliary + functions. + + * README.CVS: Document it. + +2008-08-29 suzuki toshiya + + * src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in + ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ). + +2008-08-28 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Protect against infinite + loop. This fixes Savannah bug #24150 (where a patch has been posted + too). + +2008-08-23 Werner Lemberg + + * src/type/t1afm.c (compare_kern_pairs), src/pxaux/afmparse.c + (afm_compare_kern_pairs): Fix comparison. This fixes Savannah bug + #24119. + +2008-08-19 suzuki toshiya + + * src/base/ftobjs.c (FT_Stream_New): Initialize *astream always, + even if passed library or arguments are invalid. This fixes a bug + that an uninitialized stream is freed when an invalid library handle + is passed. Originally proposed by Mike Fabian, 2008/08/18 on + freetype-devel. + (FT_Open_Face): Ditto (stream). + (load_face_in_embedded_rfork): Ditto (stream2). + +2008-08-18 suzuki toshiya + + * src/base/ftmac.c: Add a fallback to guess the availability of the + `ResourceIndex' type. It is used when built without configure + (e.g., a build with Jam). + * builds/mac/ftmac.c: Ditto. + * builds/unix/configure.raw: Set HAVE_TYPE_RESOURCE_INDEX to 1 or 0 + explicitly, even if `ResourceIndex' is unavailable. + +2008-08-18 suzuki toshiya + + * builds/unix/configure.raw: In checking of Mac OS X features, + all-in-one header file `Carbon.h' is replaced by the minimum + header file `CoreServices.h', similar to current src/base/ftmac.c. + +2008-08-18 suzuki toshiya + + * src/sfnt/ttcmap.c (tt_cmap2_validate): Skip the validation of + sub-header when its code_count is 0. Many Japanese Dynalab fonts + include such an empty sub-header (code_count == 0, first_code == 0 + delta == 0, but offset != 0) as the second sub-header in SJIS cmap. + +2008-08-04 Werner Lemberg + + * src/type1/t1tokens.h: Handle `ForceBold' keyword. This fixes + Savannah bug #23995. + + * src/cid/cidload.c (parse_expansion_factor): New callback function. + (cid_field_records): Use it for `ExpansionFactor'. + * src/cod/cidtoken.h: Handle `ForceBold' keyword. + Don't handle `ExpansionFactor'. + +2008-08-04 Bram Tassyns + + * src/cff/cffparse.c (cff_parse_fixed_scaled): Fix thinko which + resulted in incorrect scaling. This fixes Savannah bug #23973. + +2008-08-04 Werner Lemberg + + Be more tolerant w.r.t. invalid entries in SFNT table directory. + + * src/sfnt/ttload.c (check_table_dir): Ignore invalid entries and + adjust table count. + Add more trace messages. + (tt_face_load_font_dir): Updated. + +2008-07-30 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): No longer + assume that the first argument on the stack is the bottom-most + element. Two reasons: + + o According to people from Adobe it is missing in the Type 2 + specification that pushing of additional, superfluous arguments + on the stack is prohibited. + + o Acroread in general handles fonts differently, namely by popping + the number of arguments needed for a particular operand (as a PS + interpreter would do). In case of buggy fonts this causes a + different interpretation which of the elements on the stack are + superfluous and which not. + + Since there are CFF subfonts (embedded in PDFs) which rely on + Acroread's behaviour, FreeType now does the same. + +2008-07-27 Werner Lemberg + + Add extra mappings for `Tcommaaccent' and `tcommaaccent'. This + fixes Savannah bug #23940. + + * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): Rename to... + (EXTRA_GLYPH_LIST_SIZE): This. + Increase by 2. + (ft_wgl_extra_unicodes): Rename to... + (ft_extra_glyph_unicodes): This. + Add two code values. + (ft_wgl_extra_glyph_names): Rename to... + (ft_extra_glyph_names): This. + Add two glyphs. + (ft_wgl_extra_glyph_name_offsets): Rename to... + (ft_extra_glyph_name_offsets): This. + Add two offsets. + + (ps_check_wgl_name, ps_check_wgl_unicode): Rename to... + (ps_check_extra_glyph_name, ps_check_extra_glyph_unicode): This. + Updated. + (ps_unicodes_init): Updated. + +2008-07-26 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_prepare, + cff_decoder_parse_charstrings): Improve debug output. + +2008-07-22 Martin McBride + + * src/sfnt/ttcmap.c (tt_cmap4_validate, tt_cmap4_char_map_linear, + tt_cmap4_char_map_binary): Handle fonts which treat the last segment + specially. According to the specification, such fonts would be + invalid but acroread accepts them. + +2008-07-16 Jon Foster + + * src/pfr/pfrdrivr.c (pfr_get_advance): Fix off-by-one error. + + * src/base/ftcalc.c (FT_MulFix): Fix portability issue. + + * src/sfnt/ttpost.c (MAC_NAME) [!FT_CONFIG_OPTION_POSTSCRIPT_NAMES]: + Fix compiler warning. + +2008-07-16 Werner Lemberg + + Handle CID-keyed fonts wrapped in an SFNT (with cmaps) correctly. + + * src/cff/cffload.c (cff_font_load): Pass `pure_cff'. + Invert sids table only if `pure_cff' is set. + * src/cff/cffload.h: Udpated. + + * src/cff/cffobjs.c (cff_face_init): Updated. + Set FT_FACE_FLAG_CID_KEYED only if pure_cff is set. + + * docs/CHANGES: Updated. + +2008-07-09 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_loca): Handle buggy fonts + where num_locations < num_glyphs. Problem reported by Ding Li. + +2008-07-05 Werner Lemberg + + Since FreeType uses `$(value ...)', we now need GNU make 3.80 or + newer. This fixes Savannah bug #23648. + + * configure: zsh doesn't like ${1+"$@"}. + Update needed GNU make version. + * builds/toplevel.mk: Check for `$(eval ...)'. + * docs/INSTALL.GNU, docs/INSTALL.CROSS, docs/INSTALL.UNIX: Document + it. + +2008-07-04 Werner Lemberg + + * src/raster/ftraster.c (Draw_Sweep): If span is smaller than one + pixel, only check for dropouts if neither start nor end point lies + on a pixel center. This fixes Savannah bug #23762. + +2008-06-29 Werner Lemberg + + * Version 2.3.7 released. + ========================= + + + Tag sources with `VER-2-3-7'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.7. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.6/2.3.7/, s/236/237/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. + + * builds/unix/configure.raw (version_info): Set to 9:18:3. + + * docs/release: Updated. + +2008-06-28 Werner Lemberg + + * src/ftglyph.c (FT_Matrix_Multiply, FT_Matrix_Invert): Move to... + * src/ftcalc.c: Here. This fixes Savannah bug #23729. + +2008-06-27 Werner Lemberg + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Test for intersections which + degenerate to a single point can be ignored; this has been confirmed + by Greg Hitchcock from Microsoft. (This was commented out code.) + +2008-06-26 Werner Lemberg + + Improve navigation in API reference. + + * src/tools/docmaker/tohtml.py (html_header_3): Renamed to... + (html_header_6): This. + (html_header_3, html_header_3i, html_header_4, html_header_5, + html_header_5t): New strings. + (toc_footer_start, toc_footer_end): New strings. + (HtmlFormatter::html_header): Updated. + (HtmlFormatter::html_index_header, HtmlFormatter::html_toc_header): + New strings. + (HtmlFormatter::index_enter): Use `html_index_header'. + (HtmlFormatter::index_exit): Print `html_footer'. + (HtmlFormatter::toc_enter): Use `html_toc_header'. + (HtmlFormatter::toc_exit): Print proper footer. + + Convert ~ to non-breakable space. + + * src/tools/docmaker/tohtml.py (make_html_para): Implement it. + Update header files accordingly. + +2008-06-24 suzuki toshiya + + * builds/unix/configure.raw: Check type `ResourceIndex' explicitly + and define HAVE_TYPE_RESOURCE_INDEX if it is defined. Mac OS X 10.5 + bundles 10.4u SDK with MAC_OS_X_VERSION_10_5 macro but without + ResourceIndex type definition. The macro does not inform the type + availability. + * src/base/ftmac.c: More parentheses are inserted to clarify the + conditionals to disable legacy APIs in `10.5 and later' cases. If + HAVE_TYPE_RESOURCE_INDEX is not defined, ResourceIndex is defined. + +2008-06-24 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_SCANTYPE): Don't check rendering + mode. + + * src/raster/ftraster.c (Render_Glyph, Render_Gray_Glyph, + Draw_Sweep): No-dropout mode is value 2, not value 0. + (Draw_Sweep): Really skip dropout handling for no-dropout mode. + +2008-06-24 Werner Lemberg + + * src/psaux/psobjs.c (t1_builder_close_contour): Don't add contour + if it consists of one point only. Based on a patch from Savannah + bug #23683 (from John Tytgat). + +2008-06-22 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Glyph): Protect bytecode stuff + with IS_HINTED. + + * docs/CHANGES: Updated. + +2008-06-22 suzuki toshiya + + * builds/unix/configure.raw: If CFLAGS has `-isysroot XXX' option + but LDFLAGS does not, import it to LDFLAGS. The option is used to + specify non-default SDK on Mac OS X (e.g., universal binary SDK for + Mac OS X 10.4 on PowerPC platform). Although Apple TechNote 2137 + recommends to add the option only to CFLAGS, LDFLAGS should include + it because libfreetype.la is built with -no-undefined. This fixes a + bug reported by Ryan Schmidt in MacPorts, + http://trac.macports.org/ticket/15331. + +2008-06-21 Werner Lemberg + + Enable access to the various dropout rules of the B&W rasterizer. + Pass dropout rules from the TT bytecode interpreter to the + rasterizer. + + * include/freetype/ftimage.h (FT_OUTLINE_SMART_DROPOUTS, + FT_OUTLINE_EXCLUDE_STUBS): New flags for for FT_Outline. + + * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop, + Horizontal_Gray_Sweep_Drop): Use same mode numbers as given in the + OpenType specification. + Fix mode 4 computation. + (Render_Glyph, Render_Gray_Glyph): Handle new outline flags. + + * src/truetype/ttgload.c (TT_Load_Glyph) Convert scan conversion + mode to FT_OUTLINE_XXX flags. + + * src/truetype/ttinterp.c (Ins_SCANCTRL): Enable ppem check. + +2008-06-19 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Compute final + `dict->units_per_em' value before assigning it to + `cffface->units_per_EM'. Otherwise, CFFs without subfonts are + scaled incorrectly if the font matrix is non-standard. This fixes + Savannah bug #23630. + + * docs/CHANGES: Updated. + +2008-06-19 Werner Lemberg + + * src/type/t1objs.c (T1_Face_Init): Slightly improve algorithm fix + from 2008-06-19. + +2008-06-18 Werner Lemberg + + * src/type/t1objs.c (T1_Face_Init): Fix change from 2008-03-21. + Reported by Peter Weilbacher . + + * docs/CHANGES: Updated. + +2008-06-15 George Williams + + * src/otvalid/otvgpos.c (otv_MarkBasePos_validate): Set + `valid->extra2' to 1. This is undocumented in the OpenType 1.5 + specification. + +2008-06-15 Werner Lemberg + + * src/base/ftcalc.c (FT_MulFix) : Protect registers correctly + from clobbering. Patch from Savannah bug report #23556. + + * docs/CHANGES: Document it. + +2008-06-10 Werner Lemberg + + * autogen.sh: Add option `--install' to libtoolize. + +2008-06-10 Werner Lemberg + + * Version 2.3.6 released. + ========================= + + + Tag sources with `VER-2-3-6'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.6. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.5/2.3.6/, s/235/236/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. + + * builds/unix/configure.raw (version_info): Set to 9:17:3. + + + * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `scale_x' + and `scale_y'. + * src/cff/cffgload.h (CFF_Builder): Remove `scale_x' and `scale_y'. + + + * src/cff/cffparse.c: Include FT_INTERNAL_DEBUG_H. + * src/cff/cffobjs.h: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + +2008-06-10 Werner Lemberg + + * src/base/ftobjs.c (open_face): Check `clazz->init_face' and + `clazz->done_face'. + +2008-06-09 VaDiM + + Support debugging on WinCE. From Savannah patch #6536; this fixes + bug #23497. + + * builds/win32/ftdebug.c (OutputDebugStringEx): New function/macro + as a replacement for OutputDebugStringA (which WinCE doesn't have). + Update all callers. + (ft_debug_init) [_WIN32_CE]: WinCE apparently doesn't have + environment variables. + +2008-06-09 Werner Lemberg + + * README.CVS: Updated. + + * builds/unix/configure.raw, builds/unix/freetype-config.in: Updated + for newer versions of autoconf and friends. + +2008-06-08 Werner Lemberg + + * src/type1/t1parse.h (T1_ParserRec): Make `base_len' and + `private_len' unsigned. + + * src/type1/t1parse.c (read_pfb_tag): Make `asize' unsigned and read + it as such. + (T1_New_Parser, T1_Get_Private_Dict): Make `size' unsigned. + + + * src/base/ftstream.c (FT_Stream_Skip): Reject negative values. + + + * src/type1/t1load.c (parse_blend_design_positions): Check `n_axis' + for sane value. + Fix typo. + + + * src/psaux/psobjs.c (ps_table_add): Check `idx' correctly. + + + * src/truetype/ttinterp (Ins_SHC): Use BOUNDS() to check + `last_point'. + + + * src/sfnt/ttload.c (tt_face_load_max_profile): Limit + `maxTwilightPoints'. + +2008-06-06 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_IP): Handle case `org_dist == 0' + correctly. This fixes glyphs `t' and `h' of Arial Narrow at 12ppem. + +2008-06-03 Werner Lemberg + + * include/freetype/ftcache.h (FTC_FaceID): Change type back to + FT_Pointer. Reported by Ian Britten . + +2008-06-02 Werner Lemberg + + Emit header info for defined FreeType objects in reference. + + * src/tools/docmaker/content.py (re_header_macro): New regexp. + (ContentProcessor::__init__): Initialize new dictionary `headers'. + (DocBlock::__init__): Collect macro header definitions. + + * src/tools/docmaker/tohtml.py (header_location_header, + header_location_footer): New strings. + (HtmlFormatter::__init__): Pass `headers' dictionary. + (HtmlFormatter::print_html_field): Don't emit paragraph tags. + (HtmlFormatter::print_html_field_list): Emit empty paragraph. + (HtmlFormatter::block_enter): Emit header info. + +2008-06-01 Werner Lemberg + + * include/freetype/config/ftheader.h (FT_UNPATENTED_HINTING_H, + FT_INCREMENTAL_H): Added. + +2008-05-28 Werner Lemberg + + * src/tools/docmaker/sources.py (SourceBlock::__init__): While + looking for markup tags, return immediately as soon a single one is + found. + +2008-05-28 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_MD): The MD instruction also uses + original, unscaled input values. Confirmed by Greg Hitchcock from + Microsoft. + +2008-05-27 Werner Lemberg + + * src/tools/docmaker/tohtml.py (block_footer_start, + block_footer_middle): Beautify output. + +2008-05-25 Werner Lemberg + + * src/raster/ftraster.c (fc_black_render): Return 0 when we are + trying to render into a zero-width/height bitmap, not an error code. + + * src/truetype/ttgload.c (load_truetype_glyph): Move initialization + of the graphics state for subglyphs to... + (TT_Hint_Glyph): This function. + Hinting instructions for a composite glyph apparently refer to the + just hinted subglyphs, not the unhinted, unscaled outline. This + seems to fix Savannah bugs #20973 and (at least partially) #23310. + +2008-05-20 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_Suitcase): Check if valid + `aface' is returned by FT_New_Face_From_FOND(). The patch was + proposed by an anonymous reporter of Savannah bug #23204. + +2008-05-18 Werner Lemberg + + * src/pshinter/pshalgo.c (ps_hints_apply): Reset scale values after + correction for pixel boundary. Without this patch, the effect can + be cumulative under certain circumstances, making glyphs taller and + taller after each call. This fixes Savannah bug #19976. + +2008-05-18 Werner Lemberg + + * src/base/ftdebug.c (FT_Message, FT_Panic): Send output to stderr. + This fixes Savannah bug #23280. + + * docs/CHANGES: Updated. + +2008-05-18 David Turner + + * src/psnames/psmodule.c (ft_wgl_extra_unicodes, + ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets, + ps_check_wgl_name, ps_check_wgl_unicode): Use `static' to make + declarations non-global. + + * src/type1/t1load.c: Add missing comment. + +2008-05-17 Sam Hocevar + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle zero-contour + glyphs correctly. Patch from Savannah bug #23277. + +2008-05-16 Werner Lemberg + + * docs/CHANGES: Updated. + +2008-05-16 Sergey Tolstov + + Improve support for WGL4 encoded fonts. + + * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro. + (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names, + ft_wgl_extra_glyph_name_offsets): New arrays. + (ps_check_wgl_name, ps_check_wgl_unicode): New functions. + (ps_unicodes_init): Use them to add additional Unicode mappings. + +2008-05-15 Werner Lemberg + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : `closepath' without a path is a no-op, not an error + (cf. the PS reference manual). + + Reported by Martin McBride. + +2008-05-15 Werner Lemberg + + * builds/toplevel.mk (CONFIG_GUESS, CONFIG_SUB): Updated. + +2008-05-15 Werner Lemberg + + * src/type1/t1load.c (parse_subrs): Accept fonts with a subrs array + which contains a single but empty entry. This is technically + invalid (since it must end with `return'), but... + + Reported by Martin McBride. + +2008-05-14 Werner Lemberg + + Finish fix of scaling bug of CID-keyed CFF subfonts. + + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c + (FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled): New + functions. + + * src/cff/cffobjs.h (CFF_Internal): New struct. It is used to + provide global hinting data for both the top-font and all subfonts + (with proper scaling). + + * src/cff/cffobjs.c (cff_make_private_dict): New function, using + code from `cff_size_init'. + (cff_size_init, cff_size_done, cff_size_select, cff_size_request): + Use CFF_Internal and handle subfonts. + (cff_face_init): Handle top-dict and subfont matrices correctly; + apply some heuristic in case of unlikely matrix concatenation + results. This has been discussed with people from Adobe (thanks + goes mainly to David Lemon) who confirm that the CFF specs are fuzzy + and not correct. + + * src/cff/cffgload.h (cff_decoder_prepare): Add `size' argument. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_decoder_prepare): Handle hints globals for subfonts. + Update all callers. + (cff_slot_load): Handling scaling of subfonts properly. + + * src/cff/cffparse.c (cff_parse_fixed_dynamic): New function. + (cff_parse_font_matrix): Use it. + + * src/cff/cfftypes.h (CFF_FontDictRec): Make `units_per_em' + FT_ULong. + + * docs/CHANGES: Document it. + +2008-05-13 Werner Lemberg + + * src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init): + Handle case `face_index < 0'. + * docs/CHANGES: Document it. + +2008-05-04 Werner Lemberg + + First steps to fix the scaling bug of CID-keyed CFF subfonts, + reported by Ding Li on 2008/03/28 on freetype-devel. + + * src/base/cff/cffparse.c (power_tens): New array. + (cff_parse_real): Rewritten to introduce a fourth parameter which + returns the `scaling' of the real number so that we have no + precision loss. This is not used yet. + Update all callers. + (cff_parse_fixed_thousand): Replace with... + (cff_parse_fixed_scaled): This function. Update all callers. + +2008-05-03 Werner Lemberg + + * src/base/ftobjs.c (FT_Load_Glyph): Call the auto-hinter without + transformation since it recursively calls FT_Load_Glyph. This fixes + Savannah bug #23143. + +2008-04-26 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_BuilderRec): Mark `scale_x' + and `scale_y' as obsolete since they aren't used. + * src/psaux/psobjs.c (t1_builder_init): Updated. + + * src/cff/cffgload.h (CFF_Builder): Mark `scale_x' and `scale_y' as + obsolete since they aren't used. + * src/cff/cffgload.c (cff_builder_init): Updated. + +2008-04-14 Werner Lemberg + + * src/pcf/pcfdrivr.c (PCF_Face_Init): Protect call to + `FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZ'. From Savannah + bug #22909. + +2008-04-13 Werner Lemberg + + * src/psaux/psconv.c (PS_Conv_ToFixed): Increase precision if + integer part is zero. + +2008-04-01 Werner Lemberg + + Fix compilation with g++ 4.1 (with both `single' and `multi' + targets). + + * src/base/ftobjs.c (FT_Open_Face): Don't define a variable in block + which is crossed by a `goto'. + + * src/otvalid/otvalid.h (otv_MATH_validate): Add prototype. + +2008-03-31 Werner Lemberg + + Fix support for subsetted CID-keyed CFFs. + + * include/freetype/freetype.h (FT_FACE_FLAG_CID_KEYED, + FT_IS_CID_KEYED): New macros. + + * src/cff/cffobjs.c (cff_face_init): Set number of glyphs to the + maximum CID value in CID-keyed CFFs. + Handle FT_FACE_FLAG_CID_KEYED flag. + + * docs/CHANGES: Document it. + + + Fix CFF font matrix calculation and improve precision. + + * src/cff/cffparse.c (cff_parse_real): Increase precision if integer + part is zero. + (cff_parse_font_matrix): Simplify computation of `units_per_em'; + this prevents overflow also. + + + Support FT_Get_CID_Registry_Ordering_Supplement for PS CID fonts. + + * src/cid/cidriver.c: Include FT_SERVICE_CID_H. + (cid_get_ros): New function. + (cid_service_cid_info): New service structure. + (cid_services): Register it. + +2008-03-23 Werner Lemberg + + Adjustments for Visual C++ 8.0, as reported by Rainer Deyke. + + * builds/compiler/visualc.mk (CFLAGS): Remove /W5. + (ANSIFLAGS): Add _CRT_SECURE_NO_DEPRECATE. + +2008-03-21 Laurence Darby + + * src/type1/t1objs.c (T1_Face_Init): Use `/Weight'. Patch from + Savannah bug #22675. + +2008-03-13 Derek Clegg + + * src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix named style loop. + Patch from Savannah bug #22541. + +2008-03-03 Masatoshi Kimura + + * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary, + tt_cmap14_find_variant): Return correct value. + (tt_cmap14_variant_chars): Fix check for `di'. + +2008-02-29 Wermer Lemberg + + * docs/CHANGES: Updated. + +2008-02-29 Wolf + + Add build support for symbian platform. From Savannah bug #22440. + + * builds/symbian/*: New files. + +2008-02-21 suzuki toshiya + + * src/base/ftmac.c (parse_fond): Fix a bug of PostScript font name + synthesis. For any face of a specified FOND, always the name for + the first face was used. Except of a FOND that refers multiple + Type1 font files, wrong synthesized font names are not used at all, + so this is an invisible bug. A few limit checks are added too. + + * builds/mac/ftmac.c: Ditto. + +2008-02-21 suzuki toshiya + + * builds/unix/configure.raw: Split compiler option to link Carbon + frameworks to one option for CoreServices framework and another + option for ApplicationServices framework. The split options can be + managed by GNU libtool to avoid unrequired duplication when FreeType + is linked with other applications. Suggested by Daniel Macks, + Savannah bug #22366. + +2008-02-18 Victor Stinner + + * src/truetype/ttinterp.c (Ins_IUP): Check number of points. Fix + from Savannah bug #22356. + +2008-02-17 Jonathan Blow + + * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph): + Check for valid callback pointers. + +2008-02-15 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_SFNT): Check the sfnt resource + handle by its value instead of ResError(), fix provided by Deron + Kazmaier. According to the Resource Manager Reference, + GetResource(), Get1Resource(), GetNamedResource(), + Get1NamedResource() and RGetResource() set noErr but return NULL + handle when they can not find the requested resource. These + functions never return undefined values, so it is sufficient to + check if the handle is not NULL. + + * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto. + +2008-02-14 suzuki toshiya + + * src/base/ftbase.c: is replaced by "ftmac.c" as other + inclusion styles. Now it always includes src/base/ftmac.c; + builds/mac/ftmac.c is never included in any configuration. + + * builds/unix/configure.raw: Print warning if configure is executed + with options to specify Carbon functionalities explicitly. + + * docs/INSTALL.MAC: Note that legacy builds/mac/ftmac.c is not + included automatically and manual replacement is required. + +2008-02-11 Werner Lemberg + + * builds/modules.mk (CLOSE_MODULE, REMOVE_MODULE), builds/detect.mk + (dos_setup), builds/freetype.mk (clean_project_dos, + distclean_project_dos): Don't use \ but $(SEP). Reported by Duncan + Murdoch. + +2008-01-18 Sylvain Pasche + + * src/base/ftlcdfil.c (_ft_lcd_filter_legacy): Updated comment to + mention intra-pixel algorithm. + + * include/freetype/freetype.h (FT_Render_Mode): Mention that + FT_Library_SetLcdFilter can be used to reduce fringes. + +2008-01-16 Werner Lemberg + + * src/raster/ftraster.c (ft_black_render): Check `outline' before + using it. Reported by Allan Yang. + +2008-01-12 Werner Lemberg + + * src/raster/ftraster.c (FT_CONFIG_OPTION_5_GRAY_LEVELS): Remove. + +2008-01-12 Allan Yang, Jian Hua - SH + + * src/raster/ftraster.c (ft_black_init) + [FT_RASTER_OPTION_ANTI_ALIASING]: Fix compilation. + +2008-01-10 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Handle the case + where the number of contours in a simple glyph is zero (and which + does contain an entry in the `glyf' table). This fixes Savannah bug + #21990. + +2008-01-04 suzuki toshiya + + Formatting suggested by Sean McBride. + + * builds/mac/ftmac.c: Formatting (tab expanded). + * src/autofit/afindic.c: Ditto. + * src/base/ftcid.c: Ditto. + * src/base/ftmac.c: Ditto. + +2007-12-30 Werner Lemberg + + * src/smooth/ftgrays.c (gray_raster_render): Check `outline' + correctly. + +2007-12-21 suzuki toshiya + + Improvement of POSIX resource-fork accessor to load unsorted + references in a resource. In HelveLTMM (resource-fork PostScript + Type1 font bundled with Mac OS X since 10.3.x), the appearance order + of PFB chunks is not sorted; sorting the chunks by reference IDs is + required. + + * include/freetype/internal/ftrfork.h (FT_RFork_Ref): New structure + type to store a pair of reference ID and offset to the chunk. + + * src/base/ftrfork.c (ft_raccess_sort_ref_by_id): New function to + sort FT_RFork_Ref by their reference IDs. + + (FT_Raccess_Get_DataOffsets): Returns an array of offsets that is + sorted by reference ID. + +2007-12-14 Werner Lemberg + + * src/cff/cffparse.c (cff_parse_real): Don't apply `power_ten' + division too early; otherwise the most significant digit(s) of the + final result are lost as the value is truncated to an integer. This + fixes Savannah bug #21794 (where the patch has been posted too). + +2007-12-06 Fix <4d876b82@gmail.com> + + Pass options from one configure script to another as-is (not + expanded). This is needed for options like + --includedir='${prefix}/include'. + + * builds/unix/detect.mk, configure: Prevent argument expansion in + call to the (real) `configure' script. + +2007-12-06 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation if + TT_USE_BYTECODE_INTERPRETER isn't defined. + +2007-12-06 Werner Lemberg + + There exist CFFs which contain opcodes for the Type 1 operators + `hsbw' and `closepath' which are both invalid in Type 2 charstrings. + However, it doesn't harm to support them. + + * src/cff/cffgload.c (CFF_Operator): Add `cff_op_hsbw' and + `cff_op_closepath.' + (cff_argument_counts): Ditto. + + (cff_decoder_parse_charstrings): Handle Type 1 opcodes 9 (closepath) + and 13 (hsbw) which are invalid in Type 2 charstrings. + +2007-12-06 suzuki toshiya + + * src/base/ftrfork.c (raccess_guess_darwin_newvfs): New function to + support new pathname syntax `..namedfork/rsrc' to access a resource + fork on Mac OS X. The legacy syntax `/rsrc' does not work on + case-sensitive HFS+. + (raccess_guess_darwin_hfsplus): Fix a bug in the calculation of + buffer size to store a pathname. + * include/freetype/internal/ftrfork.h: Increment the number of + resource fork guessing rule. + +2007-12-06 suzuki toshiya + + * builds/unix/configure.raw: Improve the compile tests to search + Carbon functions. + * builds/mac/ftmac.c: Import fixes for Carbon incompatibilities + proposed by Sean McBride from src/base/ftmac.c (see 2007-11-16). + +2007-12-06 suzuki toshiya + + The documents and comments for Mac OS X are improved by Sean + McBride. + + * src/base/ftmac.c: Fix a comment. + * include/freetype/ftmac.h: Ditto. + * docs/INSTALL.MAC: Improve English and add comment on lowest + system version specified by MACOSX_DEPLOYMENT_TARGET. + +2007-12-04 Werner Lemberg + + * src/cff/cffload.c (cff_subfont_load): Don't use logical OR to + concatenate error codes. + * src/sfnt/ttsbit.c (Load_SBit_Range): Ditto. + +2007-12-04 Graham Asher + + * src/truetype/ttobjs.c (tt_face_init): Don't use logical OR to + concatenate error codes. + +2007-12-04 Sean McBride + + * src/pfr/pfrgload.c (pfr_glyph_load_compound): Remove compiler + warning. + +2007-11-20 suzuki toshiya + + Fix MacOS legacy font support by Masatake Yamato on Mac OS X. It is + not working since 2.3.5. In FT_Open_New(), if FT_New_Stream() + cannot mmap() the specified file and cannot seek to head of the + specified file, it returns NULL stream and FT_Open_New() returns the + error immediately. On MacOS, most legacy MacOS fonts fall into such + a scenario because their data forks are zero-sized and cannot be + sought. To proceed to guessing of resource fork fonts, the + functions for legacy MacOS font must properly handle the NULL stream + returned by FT_New_Stream(). + + * src/base/ftobjs.c (IsMacBinary): Return error + FT_Err_Invalid_Stream_Operation immediately when NULL stream is + passed. + (FT_Open_Face): Even when FT_New_Stream() returns an error, proceed + to fallback. Originally, legacy MacOS font is tested in the cases + of FT_Err_Invalid_Stream_Operation (occurs when data fork is empty) + or FT_Err_Unknown_File_Format (occurs when AppleSingle header or + .dfont header is combined). Now the case of + FT_Err_Cannot_Open_Stream is included. + + * src/base/ftrfork.c (FT_Raccess_Guess): When passed stream is NULL, + skip FT_Stream_Seek(), which seeks to the head of stream, and + proceed to unit testing of raccess_guess_XXX(). FT_Stream_Seek() + for a NULL stream causes a Bus error on Mac OS X. + (raccess_guess_apple_double): Return FT_Err_Cannot_Open_Stream + immediately if passed stream is NULL. + (raccess_guess_apple_single): Ditto. + +2007-11-16 suzuki toshiya + + Fix for Carbon incompatibilities since Mac OS X 10.5, + proposed by Sean McBride. + + * doc/INSTALL.MAC: Comment on MACOSX_DEPLOYMENT_TARGET. + + * include/freetype/ftmac.h: Deprecate FT_New_Face_From_FOND and + FT_GetFilePath_From_Mac_ATS_Name. Since Mac OS X 10.5, calling + Carbon functions from a forked process is classified as unsafe + by Apple. All Carbon-dependent functions should be deprecated. + + * src/base/ftmac.c: Use essential header files + and + instead of + all-in-one header file . + + Include and replace HFS_MAXPATHLEN by Apple + genuine macro PATH_MAX. + + Add fallback macro for kATSOptionFlagsUnRestrictedScope which + is not found in Mac OS X 10.0. + + Multi-character constants ('POST', 'sfnt' etc) are replaced by + 64bit constants calculated by FT_MAKE_TAG() macro. + + For the index in the segment of resource fork, new portable + type ResourceIndex is introduced for better compatibility. + This type is since Mac OS X 10.5, so it is defined as short + when built on older platforms. + + (FT_ATSFontGetFileReference): If build target is only the systems + 10.5 and newer, it calls Apple genuine ATSFontGetFileReference(). + + (FT_GetFile_From_Mac_ATS_Name): Return an error if system is 10.5 + and newer or 64bit platform, because legacy type FSSpec type is + removed completely. + + (FT_New_Face_From_FSSpec): Ditto. + +2007-11-01 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_done_face): Check `sfnt' everywhere. This + fixes Savannah bug #21485. + +2007-10-29 Daniel Svoboda + + * src/winfonts/winfnt.c (FNT_Face_Init): Check first that the driver + can handle the font at all, then check `face_index'. Otherwise, the + driver might return the wrong error code. This fixes Savannah bug + #21468. + +2007-10-21 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Support bit 9 and prepare + support for bit 8 of the `fsSelection' field in the `OS/2' table. + MS is already using this; hopefully, this becomes part of OpenType + 1.5. + Prepare also support for `name' IDs 21 (WWS_FAMILY) and 22 + (WWS_SUBFAMILY). + +2007-10-20 Werner Lemberg + + * src/tools/docmaker/tohtml.py (html_header_2): Fix typo. + Add `td.left' element to CSS. + (toc_section_enter): Use it. + +2007-10-18 David Turner + + * include/freetype/freetype.h, src/base/ftobjs.c: Rename API + functions related to cmap type 14 support to the + `FT_Object_ActionName' scheme: + + FT_Get_Char_Variant_index -> FT_Face_GetCharVariantIndex + FT_Get_Char_Variant_IsDefault -> FT_Face_GetCharVariantIsDefault + FT_Get_Variant_Selectors -> FT_Face_GetVariantSelectors + FT_Get_Variants_Of_Char -> FT_Face_GetVariantsOfChar + FT_Get_Chars_Of_Variant -> FT_Face_GetCharsOfVariant + + Update documentation accordingly. + + * src/sfnt/ttcmap.c: Stronger cmap 14 validation. + Make the code a little more consistent with FreeType coding + conventions and modify the cmap14 functions that returned a newly + allocated array to use a persistent vector from the TT_CMap14 object + instead. + + (TT_CMap14Rec): Provide array and auxiliary data for result. + (tt_cmap14_done, tt_cmap14_ensure): New functions. + + (tt_cmap14_init, tt_cmap14_validate, tt_cmap14_char_map_def_binary, + tt_cmap14_char_map_nondef_binary, tt_cmap14_find_variant, + tt_cmap14_char_var_index, tt_cmap14_variants, + tt_cmap14_char_variants, tt_cmap14_def_char_count, + tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, + tt_cmap14_variant_chars, tt_cmap14_class_rec): Updated and improved. + +2007-10-15 George Williams + + Add support for cmap type 14. + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_CMAP_FORMAT_14): New macro. + + * include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc, + FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc, + FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New + support function prototypes. + (FT_CMap_ClassRec): Add them. + Update all users. + + * include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New + macro. + + * include/freetype/freetype.h (FT_Get_Char_Variant_Index, + FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors, + FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API + functions. + + * src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary + function. + (FT_Set_Charmap): Disallow cmaps of type 14. + (FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault, + FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char, + FT_Get_Chars_Of_Variant): New API functions. + + * src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros. + + (TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate, + tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info, + tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary, + tt_cmap14_find_variant, tt_cmap14_char_var_index, + tt_cmap14_char_var_isdefault, tt_cmap14_variants, + tt_cmap14_char_variants, tt_cmap14_def_char_count, + tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars, + tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and + structures for cmap 14 support. + (tt_cmap_classes): Register tt_cmap14_class_rec. + (tt_face_build_cmaps): One more error message. + + * docs/CHANGES: Mention cmap 14 support. + +2007-10-01 Werner Lemberg + + * src/base/ftobjs.c (find_unicode_charmap): If search for a UCS-4 + charmap fails, do the loop again while searching a UCS-2 charmap. + This favours MS charmaps over Apple ones. + +2007-08-29 suzuki toshiya + + * src/base/ftmac.c: Introduction of abstract `short' data types, + ResFileRefNum and ResID. These types were introduced for Copland, + then backported to MPW. The variables exchanged with FileManager + QuickDraw frameworks are redefined by these data types. Patch was + proposed by Sean McBride. + * builds/mac/ftmac.c: Ditto. + +2007-08-18 Werner Lemberg + + * src/otvalid/otvcmmn.c (otv_x_y_ux_sy): Skip context glyphs. Found + by Imran Yousaf. Fixes Savannah bug #20773. + + (otv_Lookup_validate): Correct handling of LookupType. Found by + Imran Yousaf. Fixes Savannah bug #20782. + +2007-08-17 George Williams + + * src/otvalid/otvgsub.c (otv_SingleSubst_validate): Fix handling of + SingleSubstFormat1. + +2007-08-11 suzuki toshiya + + * builds/unix/configure.raw: Fix a bug which sets CC_BUILD by + ${build-gcc} (unchecked) instead of by ${build}-gcc (checked). + Found by Ryan Hill. + +2007-08-11 George Williams + + * src/otvalid/otvcommn.c, src/otvalid/otvcommn.h + (otv_Coverage_validate): Add fourth argument to pass an expected + count value. Update all users. + Check glyph IDs. + (otv_ClassDef_validate): Check `StartGlyph'. + + * src/otvalid/otvgsub.c (otv_SingleSubst_validate): More glyph ID + checks. + + * src/otvalid/otvmath.c (otv_MathConstants_validate): There are only + 56 constants. + (otv_GlyphAssembly_validate, otv_MathGlyphConstruction_validate): + Check glyph IDs. + +2007-08-08 Werner Lemberg + + * src/otvalid/otvbase.c, src/otvalid/otvcommn.c, + src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, + src/otvalid/otvjstf.c: s/FT_INVALID_DATA/FT_INVALID_FORMAT/ where + appropriate. Reported by George. + + * include/freetype/internal/fttrace.h: Define `trace_otvmath'. + + * src/otvalid/rules.mk (OTV_DRV_SRC): Add otvmath.c. + + * docs/CHANGES: Updated. + +2007-08-08 George Williams + + Add `MATH' validating support to otvalid module. + + * include/freetype/tttags.h (TTAG_MATH): New macro. + * include/freetype/ftotval.h (FT_VALIDATE_MATH): New macro. + (FT_VALIDATE_OT): Updated. + + * src/otvalid/otmath.c: New file. + + * src/otvalid/otvalid.c: Include otvmath.c. + * src/otvalid/otvmod.c (otv_validate): Handle `MATH' table. + +2007-08-04 Werner Lemberg + + * builds/unix/configure.raw: Add call to AC_LIBTOOL_WIN32_DLL. + Fixes Savannah bug #20686. + +2007-08-03 Werner Lemberg + + * src/psnames/psmodule.c: Fix usage of + FT_CONFIG_OPTION_POSTSCRIPT_NAMES macro. Reported by Graham Asher. + +2007-07-31 suzuki toshiya + + * src/base/ftmac.c (open_face_from_buffer): The argument + `driver_name' is typed as `const char*' to match with the + callers in FT_New_Face_From_LWFN and FT_New_Face_From_SFNT. + This is same with open_face_from_buffer in src/base/ftobjs.c. + Found and fixed by Sean McBride. + +2007-07-28 Werner Lemberg + + * src/raster/ftraster.c (count_table): Make it conditional. + * src/base/ftobjs.c (FT_New_Library): Check FT_RENDER_POOL_SIZE with + a preprocessor statement. + +2007-07-27 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Translate): Check `outline' before + first usage. From Savannah patch #6115. + +2007-07-16 Werner Lemberg + + * docs/CHANGES: Updated. + +2007-07-16 Derek Clegg + + Add new service for getting the ROS from a CID font. + + * include/freetype/config/ftheader.h (FT_CID_H): New macro. + * include/freetype/ftcid.h: New file. + + * include/freetype/internal/ftserv.h (FT_SERVIVE_CID_H): New macro. + * include/freetype/internal/services/svcid.h: New file. + + * src/base/ftcid.c: New file. + + * src/cff/cffdrivr.c: Include FT_SERVICE_CID_H. + (cff_get_ros): New function. + (cff_service_cid_info): New service structure. + (cff_services): Register it. + + * src/cff/cffload.c (cff_font_done): Free registry and ordering. + + * src/cff/cfftypes.h (CFF_FontRec): Add `registry' and `ordering'. + + * modules.cfg (BASE_EXTENSIONS): Add ftcid.c. + +2007-07-11 Derek Clegg + + Add support for postscript name service to CFF driver. + + * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_NAME_H. + (cff_get_ps_name): New function. + (cff_service_ps_name): New service structure. + (cff_services): Register it. + +2007-07-07 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_Copy): Fix initialization of + `target'. Reported by Sean McBride. + +2007-07-06 Werner Lemberg + + * src/pfr/pfrcmap.c: Include pfrerror.h. + + * src/autofit/afindic.c: Add some external declarations to pacify + `make multi' compilation. + + * src/cid/cidgload.c (cid_load_glyph): Pacify compiler. + + * src/cff/cffdrivr.c (cff_ps_get_font_info), src/cff/cffobjs.c + (cff_strcpy), include/freetype/internal/ftmemory.h (FT_MEM_STRDUP), + src/autofit/aflatin.c (af_latin_hints_compute_edges), + src/autofit/afcjk.c (af_cjk_hints_compute_edges), src/sfnt/ttmtx.c + (tt_face_get_metrics), src/base/ftobjs.c (open_face) + [FT_CONFIG_OPTION_INCREMENTAL]: Fix compilation with C++ compiler. + + * docs/release: Mention test compilation targets. + +2007-07-04 Werner Lemberg + + * docs/PROBLEMS: Mention that some PS based fonts can't be + handled correctly by FreeType. + + * src/truetype/ttgload.c (load_truetype_glyph): Always allow a + recursion depth of 1. This was the maximum value in TrueType 1.0, + and some older fonts don't set this field correctly. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substTable_validate): Fix tracing message. + +2007-07-03 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize + `round' to pacify compiler. + +2007-07-02 Werner Lemberg + + + * Version 2.3.5 released. + ========================= + + + Tag sources with `VER-2-3-5'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.5. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, + builds/win32/visualce/index.html, + builds/win32/visualce/freetype.dsp, + builds/win32/visualce/freetype.vcproj: s/2.3.4/2.3.5/, s/234/235/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. + + * builds/unix/configure.raw (version_info): Set to 9:16:3. + +2007-07-01 David Turner + + * include/freetype/freetype.h, src/base/ftpatent.c + (FT_Face_SetUnpatentedHinting): New function to dynamically change + the setting after a face is created. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Fix a small bug + that created distortions in the bytecode interpreter results. + +2007-06-30 David Turner + + * src/truetype/ttinterp.c (Ins_IUP): Add missing variable + initialization. + + * src/autofit/aflatin.c (af_latin_metric_init_blues): Get rid of an + infinite loop in the case of degenerate fonts. + +2007-06-26 Rahul Bhalerao + + Add autofit module for Indic scripts. This currently just reuses + the CJK-specific functions. + + * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_INDIC): New + macro. + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/autofit/afindic.c, src/autofit/afindic.h: New files. + + * src/autofit/afglobal.c, src/autofit/aftypes.h, + src/autofit/autofit.c: Updated. + + * src/autofit/Jamfile (_sources), * src/autofit/rules.mk + (AUTOF_DRV_SRC): Updated. + +2007-06-23 David Turner + + * src/truetype/ttgload.c (TT_Load_Simple): Fix change from + 2007-06-16 that prevented the TrueType module from loading most + glyphs. + +2007-06-20 Werner Lemberg + + * src/cff/cffgload.c (cff_slot_load): Fix logic of 2007-05-28 + change. + +2007-06-19 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Handle one more error. + +2007-06-19 Dmitry Timoshkov + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Return error + FNT_Err_Invalid_File_Format if file format was recognized but + the file doesn't contain any FNT(NE) or RT_FONT(PE) resources. + Add verbose debug logs to make it easier to debug failing load + attempts. + (FNT_Face_Init): A single FNT font can't contain more than 1 face, + so return an error if requested face index is > 0. + Do not do further attempt to load fonts if a previous attempt has + failed but returned error FNT_Err_Invalid_File_Format, i.e., the + file format has been recognized but no fonts found in the file. + +2007-07-19 suzuki toshiya + + * src/base/ftmac.c: Apply patches proposed by Sean McBride. + (FT_GetFile_From_Mac_Name): Insert FT_UNUSED macros to fix + the compiler warnings against unused arguments. + (FT_ATSFontGetFileReference): Ditto. + (FT_GetFile_From_Mac_ATS_Name): Ditto. + (FT_New_Face_From_FSSpec): Ditto. + (lookup_lwfn_by_fond): Fix wrong comment. + Replace `const StringPtr' by more appropriate type + `ConstStr255Param'. + FSRefMakePathPath always returns UTF8 POSIX pathname in + Mach-O, thus HFS pathname support is dropped. + (count_faces): Remove HLock and HUnlock which is not + required on Mac OS X anymore. + (FT_New_Face_From_SFNT): Ditto. + (FT_New_Face_From_FOND): Ditto. + * builds/mac/ftmac.c: Synchronize to src/base/ftmac.c, + except of HFS pathname support and HLock/HUnlock. + They are required on classic CFM environment. + +2007-06-18 Werner Lemberg + + * src/psaux/psobjs.c (ps_parser_skip_PS_token): Remove incorrect + assertion. + (ps_parser_to_bytes): Fix error message. + + * src/type42/t42objs.c (T42_Open_Face): Handle one more error. + * src/type42/t42parse.c (t42_parse_sfnts): s/alloc/allocated/. + Don't allow mixed binary and hex strings. + Handle string_size == 0 and string_buf == 0. + (t42_parse_encoding): Handle one more error. + +2007-06-18 Werner Lemberg + + * src/psaux/psobjs.c (ps_tofixedarray, ps_tocoordarray): Fix exit + logic. + (ps_parser_load_field) : Skip delimiters + correctly. + (ps_parser_load_field_table): Use `fields->array_max' instead of + T1_MAX_TABLE_ELEMENTS to limit the number of arguments. + + * src/cff/cffgload.c (cff_decoder_prepare): Fix change from + 2007-06-06. + +2007-06-17 Werner Lemberg + + * src/tools/ftrandom.c (font_size): New global variable. + (TestFace): Use it. + (main): Handle new option `--size' to set `font_size'. + (Usage): Updated. + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Exit in case of + invalid font. + (FNT_Load_Glyph): Protect against invalid bitmap width. + +2007-06-16 David Turner + + * src/smooth/ftgrays.c (gray_find_cell, gray_set_cell, gray_hline): + Prevent integer overflows when rendering very large outlines. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check the + well-formedness of the contours array when loading a glyph. + + * src/truetype/ttinterp.c (TT_Load_Context): Initialize `zp0', `zp1', + and `zp2'. + (Ins_IP): Check argument ranges to reject bogus operations properly. + (IUP_WorkerRec): Add `max_points' member. + (_iup_worker_interpolate): Check argument ranges. + (Ins_IUP): Ignore empty outlines. + +2007-06-16 Dmitry Timoshkov + + * src/winfonts/winfnt.h: Add necessary structures for PE resource + parsing. + (WinPE32_HeaderRec): New structure. + (WinPE32_SectionRec): New structure. + (WinPE_RsrcDirRec): New structure. + (WinPE_RsrcDirEntryRec): New structure. + (WinPE_RsrcDataEntryRec): New structure. + (FNT_FontRec): Remove unused `size_shift' field. + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Add support for + loading bitmap .fon files in PE format. + +2007-06-15 Dmitry Timoshkov + + * builds/win32/ftdebug.c: Unify debug level handling with other + platforms. + +2007-06-14 Dmitry Timoshkov + + * builds/win32/ftdebug.c (FT_Message): Send debug output to the + console as well as to the debugger. + +2007-06-14 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_uniranges): Expand structure to + cover all ranges which could possibly be handled by the aflatin + module (since the default fallback for unknown ranges is now the + afcjk module). It might be necessary to fine-tune this further by + splitting off modules for Greek, Cyrillic, or other blocks. + +2007-06-11 David Turner + + * src/autofit/aflatin.c (af_latin_hints_link_segments): Fix + incorrect segment linking computation. This was the root cause of + Savannah bug #19565. + + + * src/autofit/* [FT_OPTION_AUTOFIT2]: Some very experimental changes + to improve the Latin auto-hinter. Note that the new code is + disabled by default since it is not stabilized yet. + + * src/autofit/aflatin2.c, src/autofit/aflatin2.h: New files + (disabled currently). + + * src/autofit/afhints.c: Remove dead code. + (af_axis_hints_new_edge): Add argument to handle segment directions. + (af_edge_flags_to_string): New function. + (af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Handle + option flags. + (af_glyph_hints_reload): Add argument to handle inflections. + Simplify. + (af_direction_compute): Fine tuning. + (af_glyph_hints_align_edge_points): Fix logic. + (af_glyph_hints_align_strong_points): Do linear search for small + edge counts. + (af_glyph_hints_align_weak_points): Skip any touched neighbors. + (af_iup_shift): Handle zero `delta'. + + * src/autofit/afhints.h: Updated. + (AF_SORT_SEGMENTS): New macro (disabled). + (AF_AxisHintsRec) [AF_SORT_SEGMENTS]: New member `mid_segments'. + + * src/autofit/afglobal.c (af_face_globals_get_metrics): Add + argument to pass option flags for handling scripts. + * src/autofit/afglobal.h: Updated. + + * src/autofit/afcjk.c: Updated. + * src/autofit/aflatin.c: Updated. + (af_latin_metrics_scale_dim): Don't reduce scale by 2%. + + (af_latin_hints_compute_segments) [AF_HINT_METRICS]: Remove dead code. + (af_latin_hints_compute_edges) [AF_HINT_METRICS]: Remove dead code. + Don't set `edge->dir' + (af_latin_hint_edges): Add more logging. + + * src/autofit/afloader.c: Updated. + +2007-06-11 Werner Lemberg + + * docs/CHANGES: Document FT_Face_CheckTrueTypePatents. + +2007-06-10 David Turner + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Slight speed-up to + the TrueType glyph loader. + + * include/freetype/config/ftoption.h: Clarify documentation + regarding unpatented hinting. + + + Add new `FT_Face_CheckTrueTypePatents' API. + + * include/freetype/freetype.h (FT_Face_CheckTrueTypePatents): New + declaration. + + * include/freetype/internal/services/svttglyf.h, + src/base/ftpatent.c: New files. + + * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_GLYF_H): + New macro. + + * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_GLYF_H and + `ttpload.h'. + (tt_service_truetype_glyf): New service structure. + (tt_services): Register it. + + * modules.cfg (BASE_EXTENSIONS), src/base/Jamfile (_sources): Add + `ftpatent.c'. + +2007-06-08 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Undo change from 2007-04-28. + Fonts without a cmap must be handled correctly by FreeType (anything + else would be a bug). + + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Improve tracing message. + +2007-06-07 Werner Lemberg + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_init, + tt_sbit_decoder_load_image): Protect against integer overflows. + + + * src/pfr/pfrgload.c (pfr_glyph_load_simple): More bounding checks + for `x_control' and `y_control'. + +2007-06-06 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Decompose): Check `last'. + + + * src/pfr/pfrcmap.c (pfr_cmap_init): Convert assertion into normal + FreeType error. + + + * src/winfonts/winfnt.c (fnt_face_get_dll_font): Do a rough check of + `font_count'. + + + * src/type1/t1load.c (parse_font_matrix): Check `temp_scale'. + + + * src/cff/cffgload.c (cff_decoder_prepare): Change return type to + `FT_Error'. + Check `fd_index'. + (cff_slot_load): Updated. + * src/cff/cffgload.h: Updated. + +2007-06-05 Werner Lemberg + + * src/pfr/pfrgload.c (pfr_glyph_done): Comment out unused code. + (pfr_glyph_load_simple): Convert assertion into normal FreeType + error. + Check `idx'. + (pfr_glyph_load_compound, pfr_glyph_curve_to, pfr_glyph_line_to): + Convert assertion into normal FreeType error. + + * src/pfr/pfrtypes.h (PFR_GlyphRec): Comment out unused code. + + + * src/winfonts/winfnt.c (FNT_Face_Init): Check `family_size'. + + + * src/psaux/psobjs.c (ps_tocoordarray, ps_tofixedarray): Return -1 + in case of parsing error. + (ps_parser_load_field): Updated. + + * src/type1/t1load.c (parse_font_matrix): Updated. + +2007-06-04 Werner Lemberg + + * src/cid/cidgload.c (cid_load_glyph): Check `fd_select'. + + * src/tools/ftrandom/Makefile: Depend on `libfreetype.a'. + +2007-06-03 Werner Lemberg + + * src/tools/ftrandom/*: Add the `ftrandom' test program written by + George Williams (with some modifications). + +2007-06-03 Werner Lemberg + + * src/base/ftobjs.c (destroy_charmaps), src/type1/t1objs.c + (T1_Face_Done), src/winfonts/winfnt.c (FNT_Face_Done): Check for + face == NULL. Suggested by Graham Asher. + +2007-06-03 Ismail Dönmez + + * src/base/ftobjs.c (FT_Request_Metrics): Fix compiler warning. + +2007-06-02 Werner Lemberg + + * include/freetype/fterrdef.h (FT_Err_Corrupted_Font_Header, + FT_Err_Corrupted_Font_Glyphs): New error codes for BDF files. + + * src/bdf/bdflib.c (bdf_load_font): Use them. + + * src/bdf/bdflib.c (_bdf_parse_start): Check `FONT' better. + +2007-06-01 Werner Lemberg + + * src/base/ftobjs.c (FT_Request_Metrics), src/cache/ftccmap.c + (FTC_CMapCache_Lookup): Remove unused code. + +2007-06-01 Sean McBride + + * src/truetype/ttinterp.c (Null_Vector, NULL_Vector): Removed, + unused. + +2007-06-01 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Don't continue second search + pass for `StartData' if an error has occurred. + Exit properly if no `StartData' has been seen at all. + + * builds/unix/ftsystem.c (FT_Stream_Open): Don't use ULONG_MAX but + LONG_MAX to avoid compiler warning. Suggested by Sean McBride. + +2007-05-30 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Protect + against too small binary data strings. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Check `STARTCHAR' better. + +2007-05-28 David Turner + + * src/cff/cffgload.c (cff_slot_load): Do not apply the identity + transformation. This significantly reduces the loading time of CFF + glyphs. + + * docs/CHANGES: Updated. + + * src/autofit/afglobal.c (AF_SCRIPT_LIST_DEFAULT): Change default + hinting script to CJK, since it works well with more scripts than + latin. Thanks to Rahul Bhalerao for pointing + this out! + +2007-05-25 Werner Lemberg + + * docs/CHANGES: Updated. + +2007-05-24 Werner Lemberg + + * src/truetype/ttobjs.h (tt_size_ready_bytecode): Move declaration + into TT_USE_BYTECODE_INTERPRETER preprocessor block. + +2007-05-24 Graham Asher + + * src/truetype/ttobjs.c (tt_size_ready_bytecode) + [!TT_USE_BYTECODE_INTERPRETER]: Removed. Unused. + +2007-05-22 David Turner + + * src/truetype/ttgload.c (load_truetype_glyph): Fix last change to + avoid crashes in case the bytecode interpreter is not used. + + + Avoid heap blowup with very large .Z font files. This fixes + Savannah bug #19910. + + * src/lzw/ftzopen.h (FT_LzwStateRec): Remove `in_cursor', + `in_limit', `pad', `pad_bits', and `in_buff' members. + Add `buf_tab', `buf_offset', `buf_size', `buf_clear', and + `buf_total' members. + + * src/lzw/ftzopen.c (ft_lzwstate_get_code): Rewritten. It now takes + only one argument. + (ft_lzwstate_refill, ft_lzwstate_reset, ft_lzwstate_io): Updated. + +2007-05-20 Ismail Dönmez + + * src/pshinter/pshrec.c (ps_mask_table_set_bits): Add `const'. + (ps_dimension_set_mask_bits): Remove `const'. + +2007-05-19 Werner Lemberg + + * src/sfnt/ttmtx.c (tt_face_get_metrics) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Another type-punning fix. + +2007-05-19 Derek Clegg + + Savannah patch #5929. + + * include/freetype/tttables.h, src/base/ftobjcs.c + (FT_Get_CMap_Format): New function. + + * include/freetype/internal/services/svttcmap.c (TT_CMapInfo): Add + `format' member. + * src/sfnt/ttcmap.c (tt_cmap{0,2,4,6,8,10,12}_get_info): Set + cmap_info->format. + +2007-05-19 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Save graphics state + before handling subglyphs so that it can be reinitialized each time. + This fixes Savannah bug #19859. + +2007-05-16 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_mru_link, ftc_node_mru_unlink), + src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), src/cache/ftcglyph.h + (FTC_GCACHE_LOOKUP_CMP), src/pshinter/pshmod.c (ps_hinter_init), + src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_load_hhea, + tt_face_get_metrics): Fix type-punning issues. + +2007-05-15 David Turner + + * include/freetype/config/ftstdlib.h, + include/freetype/internal/ftobjs.h: As suggested by Graham Asher, + ensure that ft_isalnum, ft_isdigit, etc., use hard-coded values + instead on relying on the locale-dependent functions provided by + . + +2007-05-15 Graham Asher + + * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Remove unused + variable. + * src/autofit/afloader.c (af_loader_load_g): Ditto. + + * src/base/ftobjs.c (ft_validator_error): Use `ft_jmp_buf'. + (open_face_from_buffer): Initialize `stream'. + (FT_Request_Metrics): Remove unused variable. + Remove redundant `break' statements. + (FT_Get_Track_Kerning): Remove unused variable. + + * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs, + afm_parse_kern_data): Remove redundant + `break' statements. + (afm_parser_parse): Ditto. + Don't use uninitialized variables. + + * src/psnames/psmodule.c (VARIANT_BIT): Define as unsigned long. + Use `|' operator instead of `^' to set it. + Update all users. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Use `ft_jmp_buf'. + * src/sfnt/ttkern.c (tt_face_load_kern): Remove unused variable. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant + comparison. + (TT_Process_Simple_Glyph): Use FT_UInt for `n_points' and `i'. + (TT_Load_Glyph): Remove unused variable. + +2007-05-13 Derek Clegg + + * src/base/ftobjs.c (FT_New_Library): Only allocate rendering pool + if FT_RENDER_POOL_SIZE is > 0. From Savannah patch #5928. + +2007-05-11 David Turner + + * src/cache/ftbasic.c, include/freetype/ftcache.h + (FTC_ImageCache_LookupScaler, FTC_SBit_Cache_LookupScaler): Two new + functions that allow us to look up glyphs using an FTC_Scaler object + to specify the size, making it possible to use fractional pixel + sizes. + + * src/truetype/ttobjs.c (tt_size_ready_bytecode): Set + `size->cvt_ready'. Reported by Boris Letocha. + +2007-05-09 Graham Asher + + * src/truetype/ttinterp.c (Ins_IP), src/autofit/aflatin.c + (af_latin_metrics_scale_dim): Fix compiler warnings. + +2007-05-06 Werner Lemberg + + * builds/win32/visualce/freetype.sln: Removed, as requested by + Vincent. + +2007-05-04 Vincent RICHOMME + + * builds/win32/visualce/*: Add Visual C++ project files for Pocket + PC targets. + + * docs/CHANGES: Document them. + +2007-05-04 + + * builds/unix/ftsystem.c (FT_Stream_Open): Handle return value 0 of + mmap (which might happen on some RTOS). From Savannah patch #5909. + +2007-05-03 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Simplify code. + * include/freetype/freetype.h (FT_Set_Char_Size): Update + documentation. + +2007-04-28 Victor Stinner + + * src/sfnt/sfobjs.c (sfnt_load_face): Check error code after loading + `cmap'. + +2007-04-27 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check for negative + number of points in contours. Problem reported by Victor Stinner + . + (TT_Process_Simple_Glyph): Synchronize variable types. + +2007-04-26 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_Copy): Always set second argument to + zero in case of error. This fixes Savannah bug #19689. + +2007-04-25 Boris Letocha + + * src/truetype/ttobjs.c: Fix a typo that created a speed regression + in the TrueType bytecode loader. + +2007-04-10 Martin Horak + + * src/sfnt/sfobjs.c (sfnt_load_face) [FT_CONFIG_OPTION_INCREMENTAL]: + Ignore `hhea' table. This fixes Savannah bug #19261. + +2007-04-09 Werner Lemberg + + + * Version 2.3.4 released. + ========================= + + + Tag sources with `VER-2-3-4'. + + * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump + version number to 2.3.4. + + * README, Jamfile (RefDoc), builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/2.3.3/2.3.4/, s/233/234/. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. + + * builds/unix/configure.raw (version_info): Set to 9:15:3. + +2007-04-09 Martin Horak + + * src/truetype/ttgload.c (load_truetype_glyph): Save and restore + memory stream to avoid a crash with the incremental memory + interface (Savannah bug #19260). + +2007-04-06 David Turner + + * src/base/ftbimap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite bug + (Savannah bug #19536). + +2007-04-04 Werner Lemberg + + + * Version 2.3.3 released. + ========================= + + + Tag sources with `VER-2-3-3'. + + * docs/CHANGES: Mention CVE-2007-1351. + +2007-04-03 David Turner + + * src/base/ftobjs.c (FT_Set_Char_Size): As suggested by James Cloos, + if one of the resolution values is 0, treat it as if it were the + same as the other value. + +2007-04-02 David Turner + + Add special code to detect `extra-light' fonts and do not snap their + stem widths too much to avoid bizarre hinting effects. + + * src/autofit/aflatin.h (AF_LatinAxisRec): Add `standard_width' and + `extra_light' members. + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Initialize + them. + (af_latin_metrics_scale_dim): Set `extra_light'. + (af_latin_compute_stem_width): Use `extra_light'. + +2007-03-28 David Turner + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix zero-ing of the + padding. + +2007-03-28 Werner Lemberg + + * src/bdf/bdflib.c (setsbit, sbitset): Handle values >= 128 + gracefully. + (_bdf_set_default_spacing): Increase `name' buffer size to 256 and + issue an error for longer names. This fixes CVE-2007-1351. + (_bdf_parse_glyphs): Limit allowed number of glyphs in font to the + number of code points in Unicode. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, README: s/2.3.2/2.3.3/, + s/232/233/. + + * docs/CHANGES: Mention ftdiff. + +2007-03-26 David Turner + + * src/truetype/ttinterp.c [FIX_BYTECODE]: Remove it and + corresponding code. + (Ins_MD): Last regression fix. + + * src/autofit/aflatin.c (af_latin_metrics_init_blues): Fix blues + computations in order to ignore single-point contours. These are + never rasterized and correspond in certain fonts to mark-attach + points that are very far from the glyph's real outline, ruining the + computation. + + * src/autofit/afloader.c (af_loader_load_g): In the case of + monospaced fonts, always set `rsb_delta' and `lsb_delta' to 0. + Otherwise code that uses them will most certainly ruin the fixed + advance property. + + * docs/CHANGES, docs/VERSION.DLL, README, Jamfile (RefDoc): Update + documentation and bump version number to 2.3.3. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. + + * builds/unix/configure.raw (version_info): Set to 9:14:3. + +2007-03-26 suzuki toshiya + + * builds/unix/ftconfig.in: Disable Carbon framework dependency on + 64bit ABI on Mac OS X 10.4.x (ppc & i386). Found by Sean McBride. + * builds/vms/ftconfig.h: Ditto. + * include/freetype/config/ftconfig.h: Ditto. + +2007-03-22 suzuki toshiya + + * builds/unix/ftsystem.c (FT_Stream_Open): Temporary fix to prevent + 32bit unsigned long overflow by 64bit filesize on LP64 platform, as + proposed by Sean McBride: + http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + +2007-03-22 suzuki toshiya + + * builds/unix/ftconfig.in: Suppress SGI compiler's warning against + setjmp, proposed by Sean McBride: + http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html + +2007-03-19 suzuki toshiya + + * builds/unix/configure.raw: Dequote `OS_INLINE' in comment of + conftest.c, to avoid unexpected shell evaluation. Possibly it is a + bug or undocumented behaviour of autoconf. + +2007-03-18 David Turner + + * src/truetype/ttinterp.c (Ins_MDRP): Another bytecode regression + fix; testing still needed. + + * src/truetype/ttinterp.c (Ins_MD): Another bytecode regression fix. + +2007-03-17 David Turner + + * src/truetype/ttinterp.c (Ins_IP): Fix wrong handling of the + (undocumented) twilight zone special case. + +2007-03-09 Werner Lemberg + + + * Version 2.3.2 released. + ========================= + + + Tag sources with `VER-2-3-2'. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, README: s/2.3.1/2.3.2/, + s/231/232/. + +2007-03-08 David Turner + + * docs/CHANGES, docs/VERSION.DLL: Updated for upcoming release. + + * builds/unix/configure.raw (version_info): Set to 9:13:3. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2. + + * README, Jamfile (RefDoc): s/2.3.1/2.3.2/. + + * src/base/ftutil.c (ft_mem_strcpyn): Fix a bug that prevented the + function to work properly, over-writing user-provided buffers in + some cases. Reported by James Cloos . + + +2007-03-05 Werner Lemberg + + * include/freetype/config/ftstdlib.h (ft_strstr): New wrapper + macro for `strstr'. + + * src/truetype/ttobjs.c (tt_face_init): Use ft_strstr for scanning + `trick_names', as suggested by Ivan Nincic. + +2007-03-05 David Turner + + * src/base/ftinit.c (FT_Init_FreeType): Fix a small memory leak in + case FT_Init_FreeType fails for some reason. Problem reported by + Maximilian Schwerin . + + * src/truetype/ttobs.c (tt_size_init_bytecode): Clear the `x_ppem' + and `y_ppem' fields of the `TT_Size.metrics' structure, not those of + `TT_Size.root.metrics'. Problem reported by Daniel Glöckner + . + + * src/type1/t1afm.c (T1_Read_PFM): Read kerning values as 16-bit + signed values, not unsigned ones. Problem reported by Johannes + Walther . + +2007-02-21 David Turner + + * src/pshinter/pshalgo.c (psh_hint_align): Fix a bug in the hinting + of small and ghost stems in the Postscript interpreter. + +2007-02-20 suzuki toshiya + + * src/base/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Fix memory + leak, patch by "Jjgod Jiang" . + * builds/mac/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Ditto. + +2007-02-16 Werner Lemberg + + * src/truetype/ttinterp.c (Ins_MD): Remove unused variable. + * src/autofit/aflatin.c (af_latin_hints_link_segments): Ditto. + +2007-02-14 David Turner + + It seems that the following changes fix most of the known + interpreter problems with my fonts, but more testing is needed, + though. + + * src/truetype/ttinterp.c (FIX_BYTECODE): Activate. + (TT_MulFix14): Rewrite. + (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Improved and updated. + (Ins_MIRP): Ditto. + +2007-02-12 Werner Lemberg + + * src/truetype/ttinterp.c (Project_x, Project_y): Remove compiler + warnings. + + * src/pcf/pcfread.c (pcf_interpret_style), src/bdf/bdfdrivr.c + (bdf_interpret_style): Ditto. + +2007-02-12 David Turner + + Simplify projection and dual-projection code interface. + + * src/truetype/ttinterp.h (TT_Project_Func): Use `FT_Pos', not + FT_Vector' as argument type. + * src/truetype/ttinterp.c (CUR_Func_project, CUR_Func_dualproj): + Updated. + (CUR_fast_project, CUR_fast_dualproj): New macros. + (Project, Dual_Project, Project_x, Project_y): Updated. + (Ins_GC, Ins_SCFS, Ins_MDAP, Ins_MIAP, Ins_IP): Use new `fast' + macros. + + + * src/autofit/afloader.c (af_loader_load_g): Improve spacing + adjustments for the non-light auto-hinted modes. Gets rid of + `inter-letter spacing is too wide' problems. + + * src/autofit/aflatin.c (af_latin_hints_link_segments, + af_latin_hints_compute_edges): Slight optimization of the segment + linker and better handling of serif segments to get rid of broken + `9' in Arial at 9pt (96dpi). + + + Introduce new string functions and the corresponding macros to get + rid of various uses of strcpy and other `evil' functions, as well as + to simplify a few things. + + * include/freetype/internal/ftmemory.h (ft_mem_strdup, ft_mem_dup, + ft_mem_strcpyn): New declarations. + (FT_MEM_STRDUP, FT_STRDUP, FT_MEM_DUP, FT_DUP, FT_STRCPYN): New + macros. + * src/base/ftutil.c (ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn): New + functions. + + * src/bfd/bfddrivr.c (bdf_interpret_style, BDF_Face_Init), + src/bdf/bdflib.c (_bdf_add_property), src/pcf/pcfread.c + (pcf_get_properties, pcf_interpret_style, pcf_load_font), + src/cff/cffdrivr.c (cff_get_glyph_name), src/cff/cffload.c + (cff_index_get_sid_string), src/cff/cffobjs.c (cff_strcpy), + src/sfnt/sfdriver.c (sfnt_get_glyph_name), src/type1/t1driver.c + (t1_get_glyph_name), src/type42/t42drivr.c (t42_get_glyph_name, + t42_get_name_index): Use new functions and simplify code. + + * builds/mac/ftmac.c (FT_FSPathMakeSpec): Don't use FT_MIN. + +2007-02-11 Werner Lemberg + + * src/autofit/afloader.c (af_loader_load_g): Don't change width for + non-spacing glyphs. + +2007-02-07 Tom Parker + + * src/cff/cffdrivr.c (cff_get_name_index): Protect against NULL + pointer. + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h (FT_DEPRECATED_ATTRIBUTE): + Introduce __attribute((deprecated))__ to warn functions + which use non-ANSI data types in its interfaces. + (FT_GetFile_From_Mac_Name): Deprecated, using FSSpec. + (FT_GetFile_From_Mac_ATS_Name): Deprecated, using FSSpec. + (FT_New_Face_From_FSSpec): Deprecated, using FSSpec. + (FT_New_Face_From_FSRef): Deprecated, using FSRef. + + * src/base/ftmac.c: Predefine FT_DEPRECATED_ATTRIBUTE as void + to avoid warning in building FreeType. + * builds/mac/ftmac.c: Ditto. + +2007-02-05 suzuki toshiya + + * src/base/ftbase.c: Fix to use builds/mac/ftmac.c, if configured + `--with-fsspec' etc. Replace #include "ftmac.c" with + #include . + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h (FT_GetFilePath_From_Mac_ATS_Name): + Introduced as replacement of FT_GetFile_From_Mac_ATS_Name. + * src/base/ftmac.c (FT_GetFilePath_From_Mac_ATS_Name): Ditto. + (FT_GetFile_From_Mac_ATS_Name): Rewritten as wrapper of + FT_GetFilePath_From_Mac_ATS_Name. + * builds/mac/ftmac.c: Ditto. + +2007-02-05 suzuki toshiya + + * include/freetype/ftmac.h: Fixed wrong comment: FSSpec of + FT_GetFile_From_Mac_Name, FT_GetFile_From_Mac_ATS_Name are + for passing to FT_New_Face_From_FSSpec. + +2007-02-05 suzuki toshiya + + * builds/unix/configure.raw: Check whether Mac OS X system headers + can be built under ANSI C mode. + + * src/base/ftmac.c (OS_INLINE): Redefine OS_INLINE by a version + compatible to ANSI C in case system headers are ANSI C incompatible. + * builds/mac/ftmac.c (OS_INLINE): Ditto. + +2007-02-01 Werner Lemberg + + * include/freetype/ttnameid.h (TT_MS_LANGID_DZONGHKA_BHUTAN): + Explain why applications shouldn't use it. Found by Alexei. + +2007-02-01 Alexei Podtelezhnikov + + * builds/unix/freetype2.m4 (AC_CHECK_FT2): Fix spelling of warning + message. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substTable_validate): Fix debugging + message. + +2007-01-31 Werner Lemberg + + + * Version 2.3.1 released. + ========================= + + + Tag sources with `VER-2-3-1-FINAL'. + + * builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/230/231/. + * builds/win32/visualc/index.html: s/221/231/. + + * vms_make.com: Add `ftgasp'. + +2007-01-30 David Turner + + Tag sources with VER-2-3-1 to prepare release. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. + + * docs/VERSION.DLL, docs/release, README, Jamfile (RefDoc): + s/2.3.0/2.3.1/. + + * builds/unix/configure.raw (version_info): Set to 9:12:3. + + + * src/autofit/aftypes.h (AF_USE_WARPER), src/autofit/afloader.c + (af_loader_load_g): Disable the warper (i.e., the light hinting + improvements) to make a 2.3.1 bugfix release before introducing a + new feature. This should give us more time to tune and improve the + warper for the next release. + + * docs/CHANGES: Update accordingly. + +2007-01-25 David Turner + + For light auto-hinting, improve glyph advance widths and resurrect + normal/full hinting to its normal quality. + + * src/autofit/afhints.h (AF_GlyphHintsRec): New members `xmin_delta' + and `xmax_delta'. + * src/autofit/afhints.c (af_glyph_hints_reload): Reset `xmin_delta' + and `xmax_delta'. + + * src/autofit/afloader.c (af_loader_load_g) : Replace + preprocessor conditional with if-clause, handling both light and + normal mode. + + * src/autofit/afwarp.c (AF_WarpScore): Fine-tune again. + (af_warper_compute): Handle `xmin_delta' and `xmax_delta'. + +2007-01-25 Werner Lemberg + + * docs/release: Updated -- Savannah uses a new uploading scheme. + +2007-01-25 David Turner + + * src/cff/cffload.c (cff_index_get_pointers): Improve previous fix. + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Fix sanity check for empty + functions. + + * docs/CHANGES: Document light auto-hinting improvement. + +2007-01-25 Werner Lemberg + + * src/cff/cffload.c (cff_index_get_pointers): Handle last entry + correctly in a sanity check. Since this function is only used to + load local and global functions, any charstring that called the last + local/global function would fail otherwise. This fixes Savannah bug + #18867. + + * docs/CHANGES: Document it. + +2007-01-23 David Turner + + * src/truetype/ttobjs.c (tt_size_ready_bytecode): Fix typo that + prevented compilation when disabling both the unpatented and the + bytecode interpreter in the TrueType font driver. + + + Fix and enable the warper to improve `light' hinting mode. This is + not necessarily a final version, but it seems to work well. + + * src/autofit/aflatin.c (af_latin_hints_init) [AF_USE_WARPER]: + Disable code. + (af_latin_hints_apply) [AF_USE_WARPER]: Handle FT_RENDER_MODE_LIGHT. + * src/autofit/aftypes.h: Activate AF_USE_WARPER. + + * src/autofit/afwarp.c (AF_WarpScore): Tune table. + (af_warper_compute_line_best): Fix array size of `scores'. + (af_warper_compute): Better handling of border cases. + * src/autofit/afwarp.h (AF_WarperRec): Remove unused members `X1' + and `X2'. + +2007-01-21 Werner Lemberg + + * ChangeLog: Split off older entries into... + * ChangeLog.22: This new file. + +2007-01-21 Werner Lemberg + + * docs/CHANGES: Document SHZ fix. + +2007-01-21 George Williams + + * src/truetype/ttinterp.c (Ins_SHZ): SHZ doesn't move phantom + points. + +2007-01-21 Werner Lemberg + + * src/sfnt/ttmtx.c (tt_face_get_metrics) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Fix limit check. + +2007-01-17 Werner Lemberg + + + * Version 2.3.0 released. + ========================= + + + Tag sources with `VER-2-3-0-FINAL'. + +2007-01-17 Werner Lemberg + + * docs/release: Updated. + +2007-01-16 David Turner + + * src/autofit/aflatin.c (af_latin_hints_compute_segments), + src/cff/cffdriver.c (cff_ps_get_font_info), src/truetype/ttobjs.c + (tt_face_init), src/truetype/ttinterp.c (Ins_SHC): Fix compiler + warnings. + +2007-01-15 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile: Add `ftgasp.c' and `ftlcdfil.c'. + + * builds/amiga/include/freetype/config/ftconfig.h: Synchronize. + +2007-01-14 Detlef Würkner + + Fix various compiler warnings. + + * src/truetype/ttdriver.c (tt_size_select), src/cff/cffobjs.h, + src/cff/cffobjs.c (cff_size_request), src/type42/t42objs.h: + s/index/strike_index/. + * src/base/ftobjs.c (FT_Match_Size): s/index/size_index/. + + * src/gxvalid/gxvmorx5.c + (gxv_morx_subtable_type5_InsertList_validate): s/index/table_index/. + + * src/truetype/ttinterp.c (Compute_Point_Displacement), + src/pcf/pcfread.c (pcf_seek_to_table_type): Avoid possibly + uninitialized variables. + +2007-01-13 suzuki toshiya + + * docs/CHANGES, docs/INSTALL.MAC: Improvements. + +2007-01-13 Werner Lemberg + + * src/type1/t1afm.c (T1_Read_Metrics): MS Windows allows PFM + versions up to 0x3FF without complaining. + +2007-01-13 Derek Clegg + + Add FT_Get_PS_Font_Info interface to CFF driver. + + * src/cff/cfftypes.h: Include FT_TYPE1_TABLES_H. + (CFF_FontRec): Add `font_info' field. + + * src/cff/cffload.c: Include FT_TYPE1_TABLES_H. + (cff_font_done): Free font->font_info if necessary. + + * src/cff/cffdrvr.c (cff_ps_get_font_info): New function. + (cff_service_ps_info): Register cff_ps_get_font_info. + +2007-01-13 Werner Lemberg + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Fix compilation + with C++ compiler. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments, + af_glyph_hints_dump_edges): Ditto. + + * src/base/rules.mk (BASE_SRC): Remove ftgasp.c (it's already in + `modules.cfg'). + + * src/sfnt/ttsbit0.h: Remove. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c. + +2007-01-12 David Turner + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix memory stomping + bug in the bitmap emboldener if the pitch of the source bitmap is + much larger than its width. + + * src/truetype/ttinterp.c (Update_Max): Fix aliasing-related + compilation warning. + +2007-01-12 Werner Lemberg + + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `automake' CVS module from sources.redhat.com. + +2007-01-11 Werner Lemberg + + * src/type1/t1load.c (is_space): Removed. + (parse_encoding, parse_charstrings): Use IS_PS_DELIM. + (parse_charstrings): Use IS_PS_TOKEN. + + + * autogen.sh: Avoid bash specific syntax. + +2007-01-11 David Turner + + * docs/CHANGES: Small update. + + * builds/unix/configure.raw (version_info): Set to 9:11:3. + + * src/base/ftobjs.c (IsMacResource): Fix a small bug that caused a + crash with some Mac OS X .dfont files. Submitted by Masatake + Yamato. + + * autogen.sh: Small fix to get it working on Mac OS X properly: + The issue is that GNU libtool is called `glibtool' on this platform, + and we must call `glibtoolize', since `libtoolize' doesn't exist. + +2007-01-10 David Turner + + * all-sources: Tag all sources with VER-2-3-0-RC1 and + VER-2-3-0. + + * Jamfile (RefDoc), README, builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, docs/VERSION.DLL: Update + version number to 2.3.0. + + * include/freetype/freetype.h (FREETYPE_MINOR): Set to 3. + (FREETYPE_PATCH): Set to 0. + + * include/freetype/ftchapters.h, include/freetype/ftgasp.h, + include/freetype/ftlcdfil.h: Update reference documentation with + GASP support and LCD filtering sections. + + * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix a typo + which created an endless loop with some malformed font files. + +2007-01-10 Derek Clegg + + * src/type1/t1load.c (T1_Get_MM_Var): Always return fixed point + values. + +2007-01-08 David Turner + + * docs/CHANGES: Updated. + + * include/freetype/ftgasp.h, src/base/ftgasp.c: New files which add + a new API `FT_Get_Gasp' to return entries of the `gasp' table + corresponding to a given character pixel size. + + * src/sfnt/ttload.c (tt_face_load_gasp): Add version check for the + `gasp' table, in order to avoid potential problems with later + versions. + + * include/freetype/config/ftheader.h (FT_GASP_H): New macro for + . + + * src/base/rules.mk (BASE_SRC), src/base/Jamfile (_sources), + modules.cfg (BASE_EXTENSIONS), builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: Add src/base/ftgasp.c to the + default build. + +2007-01-07 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Improve error message for + Type 11 fonts. + Scan for `/sfnts' token. + +2007-01-07 Werner Lemberg + + * src/cid/cidparse.c (cid_parser_new): Reject Type 11 fonts. + +2007-01-06 Werner Lemberg + + * src/cff/cffload.c (cff_index_init): Remove unused variable. + (cff_index_read_offset): s/perror/errorp/ to avoid global shadowing. + +2007-01-04 David Turner + + * src/pfr/pfrobjs.c (pfr_face_init): Detect non-scalable fonts + correctly. This fixes Savannah bug #17876. + + + Do not allocate interpreter-specific tables in memory if we are not + going to load glyphs with the bytecode interpreter anyway. + + * src/truetype/ttgload.c (tt_loader_init): Load execution context + only if glyph is hinted. + Updated. + * src/truetype/ttobjs.h (TT_SizeRec): Add members `bytecode_ready' + and `cvs_ready'. + Add `tt_size_ready_bytecode' declaration. + * src/truetype/ttobjs.c (tt_size_done_bytecode, + tt_size_init_bytecode, tt_size_ready_bytecode): New functions. + (tt_size_init): Move most code into `tt_size_init_bytecode'. + (tt_size_done): Move most code into `tt_size_done_bytecode'. + (tt_size_reset): Move some code to `tt_size_ready_bytecode'. + + + Don't extract the metrics table from the SFNT font file. Instead, + reparse it on each glyph load. The runtime difference is not + noticeable, and it can save a lot of heap memory when memory-mapped + files are not used. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add members + `horz_metrics_offset' and `vert_metrics_ofset'. + * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): + Updated. + + + * src/sfnt/ttcmap.c (tt_cmap4_validate): Slight optimization. + + + Do not load the CFF index offsets into memory, since this wastes a + *lot* of heap memory with large Asian CFF fonts. There is no + significant performance loss. + + * src/cff/cffload.h: Add `cff_charset_cid_to_gindex' declaration. + * src/cff/cfftypes.h (CFF_IndexRec): Add fields `start' and + `data_size'. + (CFF_CharsetRec): Add field `num_glyphs'. + + * src/cff/cffload.c (cff_index_read_offset, cff_index_load_offsets, + cff_charset_cid_to_gindex): New functions. + (cff_new_index): Renamed to... + (cff_index_init): This. Update all callers. + Updated -- some code has been moved to `cff_index_load_offsets'. + (cff_done_index): Renamed to... + (cff_index_done): This. Update all callers. + (cff_index_get_pointers, cff_index_access_element): Updated to use + stream offsets. + (cff_charset_compute_cids): Set `num_glyphs' field. + (cff_encoding_load): Updated. + + * src/cff/cffgload.c (cff_slot_load): Updated. + +2007-01-04 David Turner + + * docs/INSTALL.UNIX: Simplify some parts, add reference to + autogen.sh and pointer to README.CVS. + + * README.CVS: Add common problem description and solution + when running autogen.sh. + + * docs/INSTALL: Add reference to MacOS X. + + * docs/MAKEPP, docs/INSTALL.MAC: New documentation files. + + * docs/TODO: Remove obsolete items. + + * src/raster/ftraster.c: (TRaster_Instance): Replace it with... + (TWorker): This. + Remove `count_table' and `memory'. + Make `grays' a pointer. + (TRaster): New structure. + (count_table): New static array. + (RAS_ARGS, RAS_ARG, RAS_VARS, RAS_VAR, FT_UNUSED_RASTER, cur_ras, + Vertical_Gray_Sweep_Step, ft_black_new, ft_black_done, + ft_black_set_mode, ft_black_render): Updated. + (ft_black_init): Don't initialize `count_table'. + (ft_black_reset): Use the render pool. This saves about 6KB of + heap space for each FT_Library instance. + + * src/smooth/ftgrays.c (TRaster): Replaced with... + (TWorker): This. + Remove `memory'. + (TRaster): New structure. + + (RAS_ARG_, RAS_ARG, RAS_VAR_, RAS_VAR, ras, gray_render_line, + gray_move_to, gray_line_to, gray_conic_to, gray_cubic_to, + gray_render_span, gray_raster_render): Updated. + (gray_raster_reset): Use the render pool. This saves about 6KB of + heap space for each FT_Library instance. + + * src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h, + src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, + src/truetype/ttpload.c, include/freetype/config/ftoption.h: Remove + FT_OPTIMIZE_MEMORY macro (and code for !FT_OPTIMIZE_MEMORY) since + the optimization is no longer experimental. + + * src/pshinter/pshalgo.c (psh_glyph_interpolate_normal_points): + Remove a typo that results in no hinting and a memory leak with some + large Asian CFF fonts. + + * src/base/ftobjs.c (FT_Done_Library): Remove a subtle memory leak + which happens when FT_Done_Library is called with still opened + CFF_Faces in it. We need to close all faces before destroying the + modules, or else some bad things (memory leaks) may happen. + +2007-01-02 Werner Lemberg + + * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): + Remove compiler warning. + +2007-01-02 David Turner + + * src/sfnt/sfobjs.c: Add documentation comment. + +2006-12-31 Masatake YAMATO + + * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): New + function. + Check uniqueness of the gid pairs. + (gxv_kern_subtable_fmt0_validate): Move some code to + `gxv_kern_subtable_fmt0_pairs_validate'. + +2006-12-22 David Turner + + * src/autofit/aflatin.c, src/truetype/ttgload.c: Remove compiler + warnings. + + * builds/win32/visualc/freetype.vcproj: Add _CRT_SECURE_NO_DEPRECATE + to avoid deprecation warnings with Visual C++ 8. + +2006-12-16 Anders Kaseorg + + * src/base/ftlcdfil.c (FT_Library_SetLcdFilter) + [FT_FORCE_LIGHT_LCD_FILTER]: Fix typo. + +2006-12-15 suzuki toshiya + + * include/freetype/internal/services/svotval.h: Add `volatile' to + sync with the modification by Jens Claudius on 2006-08-22; cf. + http://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5 + +2006-12-15 suzuki toshiya + + * src/base/ftmac.c: Specialized for Mac OS X only. + * builds/unix/ftconfig.in: Fixed for ppc64 missing Carbon framework. + * builds/unix/configure.raw: Ditto. When explicit switches for + FSSpec/FSRef/QuickDraw/ATS availability are given to configure, + builds/mac/ftmac.c is used instead of default src/base/ftmac.c. + +2006-12-15 suzuki toshiya + + * builds/mac/ftmac.c: Copied src/base/ftmac.c for legacy system. + * builds/mac/FreeType.m68k_cfm.make.txt: Fix to use builds/mac/ftmac.c + instead of src/base/ftmac.c + * builds/mac/FreeType.ppc_carbon.make.txt: Ditto. + * builds/mac/FreeType.ppc_classic.make.txt: Ditto. + * builds/mac/FreeType.m68k_far.make.txt: Ditto, and exclude gxvalid.c + that cannot be built at present. + +2006-12-15 suzuki toshiya + + * src/base/ftobjs.c: Improvement of resource fork handler for + POSIX, cf. + http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html + (Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font + format or .dfont, to simulate the face index number counted by ftmac.c. + (IsMacResource): Return the number of scalable faces correctly. + +2006-12-10 Werner Lemberg + + * builds/toplevel.mk (version): Protect against `distclean' target. + +2006-12-09 Werner Lemberg + + * builds/*/*def.mk, builds/*/detect.mk (CAT): Define to either `cat' + or `type'. + + * builds/freetype.mk (version): Extracted from freetype.h, using + GNU make's built-in string functions. + (refdoc): Use $(version) instead of static version number. + +2006-12-08 Werner Lemberg + + * builds/toplevel.mk (dist): Extract version number from freetype.h. + +2006-12-08 Vladimir Volovich + + * src/tools/apinames.c (State): Remove final comma in structure -- + xlc v5 under AIX 4.3 doesn't like this. + +2006-12-07 David Turner + + * src/autofit/afloader.c (af_loader_load_g): Small adjustment + to the spacing of auto-fitted glyphs. This only impacts rare + cases (e.g., Arial Bold at rather small character sizes). + +2006-12-03 Werner Lemberg + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. + +2006-12-01 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): All Unicode strings are + encoded in UTF-16BE. Patch from Rajeev Pahuja . + (tt_name_entry_ascii_from_ucs4): Removed. + + + * include/freetype/ftxf86.h: Fix and extend comment so that it + appears in the documentation. + + * include/freetype/ftchapters.h: Add `font_format' section. + + + * src/tools/docmaker/tohtml.py (HtmlFormatter::index_exit): Add link + to TOC in index page. + +2006-11-28 David Turner + + * src/smooth/ftgrays.c (gray_raster_render): Return 0 when we are + trying to render into a zero-width/height bitmap, not an error code. + + * src/truetype/ttobjs.c (tt_face_init): Fix typo in previous patch. + + * src/smooth/ftgrays.c: Remove hard-coded error values; use FreeType + ones instead. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments): Remove unused + variable. + +2006-11-26 Pierre Hanser + + * src/truetype/ttobjs.c (tt_face_init): Protect against NULL pointer. + +2006-11-25 David Turner + + * src/autofit/afhints.c (af_glyph_hints_dump_points, + af_glyph_hints_dump_segments, af_glyph_hints_dumpedges) [!AF_DEBUG]: + Add stubs to link the `ftgrid' test program when debugging is + disabled in the auto-hinter. + +2006-11-23 David Turner + + * src/autofit/afhints.c, src/autofit/afhints.h, src/autofit/aflatin.c, + src/autofit/aftypes.h: Miscellaneous auto-hinter improvements. + + * src/autofit/afhints.c (af_glyph_hints_dump_segments) [AF_DEBUG]: + Emit more sensible information. + + * src/autofit/afhints.h (AF_SegmentRec): Add `height' member. + + * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Improve + rounding of blue values. + (af_latin_hints_compute_segments): Hint segment heights. + (af_latin_hints_link_segments): Reduce `len_score' value. + (af_latin_hints_compute_edges): Increase `segment_length_threshold' + value and use `height' member for comparisons. + (af_latin_hint_edges): Extend logging message. + Improve handling of remaining edges. + +2006-11-22 Werner Lemberg + + Fix Savannah bug #15553. + + * src/truetype/ttgload.c (tt_loader_init): Re-execute the CVT + program after a change from mono to grayscaling (and vice versa). + Use correct constant for comparison to get `exec->grayscale'. + +2006-11-18 Werner Lemberg + + Because FT_Load_Glyph expects CID values for CID-keyed fonts, the + test for a valid glyph index must be deferred to the font drivers. + This patch fixes Savannah bug #18301. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't check `glyph_index'. + * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/cff/cffgload.c + (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph), + src/pcf/pcfdrivr.c (PCF_Glyph_Load), src/pfr/pfrobjs.c + (pfr_slot_load), src/truetype/ttdriver.c (Load_Glyph), + src/type1/t1gload.c (T1_Load_Glyph), src/winfonts/winfnt.c + (FNT_Load_Glyph): Check validity of `glyph_index'. + +2006-11-13 David Turner + + * src/truetype/ttinterp.c (FIX_BYTECODE): Undefine. The interpreter + `enhancements' are still too buggy for general use. + + * src/base/ftlcdfil.c: Add support for FT_FORCE_LIGHT_LCD_FILTER and + FT_FORCE_LEGACY_LCD_FILTER at compile time. Define these macros + when building the library to change the default LCD filter to be + used. This is only useful for experimentation. + + * include/freetype/ftlcdfil.h: Update documentation. + +2006-11-10 David Turner + + * src/smooth/ftsmooth.c: API change for the LCD + filter. The FT_LcdFilter value is an enumeration describing which + filter to apply, with new values FT_LCD_FILTER_LIGHT and + FT_LCD_FILTER_LEGACY (the latter implements the LibXft original + algorithm which produces strong color fringes for everything + except very-well hinted text). + + * include/freetype/ftlcdfil.h (FT_Library_SetLcdFilter): Change + second parameter to an enum type. + + * src/base/ftlcdfil.c (USE_LEGACY): Define. + (_ft_lcd_filter): Rename to... + (_ft_lcd_filter_fir): This. + Update parameters. + (_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function. + (FT_Library_Set_LcdFilter): Update parameters. + Handle new filter modes. + + * include/internal/ftobjs.h: Include FT_LCD_FILTER_H. + (FT_Bitmap_LcdFilterFunc): Change third argument to `FT_Library'. + (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add filtering + callback and update other fields. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic) + [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Update. + Other minor improvements. + + * src/autofit/aflatin.c: Various tiny improvements that drastically + improve the handling of serif fonts and of LCD/LCD_V hinting modes. + (af_latin_hints_compute_edges): Fix typo. + (af_latin_compute_stem_width): Take better care of diagonal stems. + +2006-11-09 David Turner + + * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix + typo which created a variable-used-before-initialized bug. + +2006-11-07 Zhe Su + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle vertical layout + also. + +2006-11-03 Werner Lemberg + + * src/base/ftcalc.c: Don't use `long long' but `FT_Int64'. + +2006-11-02 David Turner + + Add a few tweaks to better handle serif fonts. + Add more debugging messages. + + * src/autofit/aflatin.c (af_latin_hints_compute_edges): Ignore + segments that are less than 1.5 pixels high. This gets rid of + *many* corner cases with serifs. + (af_latin_align_linked_edge): Add logging message. + (af_latin_hint_edges): Use AF_HINTS_DO_BLUES. + Add logging messages. + Handle AF_EDGE_FLAG flag specially. + + * src/autofit/afmodule.c [AF_DEBUG]: Add _af_debug, + _af_debug_disable_blue_hints, and _af_debug_hints variables. + + * src/autofit/aftypes.h (AF_LOG) [AF_DEBUG]: Use _af_debug. + Update external declarations. + (af_corner_orientation, af_corner_is_flat): Replaced by... + + * include/freetype/internal/ftcalc.h (ft_corner_orientation, + ft_corner_is_flat): These declarations. + + * src/autofit/afangles.c (af_corner_orientation, af_corner_is_flat): + Comment out. Replaced by... + + * src/base/ftcalc.h (ft_corner_orientation, ft_corner_is_flat): + These functions. Update all callers. + (FT_Add64) [!FT_LONG64]: Simplify. + + * src/autofit/afhints.c: Include FT_INTERNAL_CALC_H. + (af_direction_compute): Add a missing FT_ABS call. This bug caused + production of garbage by missing lots of segments. + + * src/autofit/afhints.h (AF_HINTS_DO_BLUES): New macro. + + * src/autofit/afloader.c (af_loader_init, af_loader_done) + [AF_DEBUG]: Set _af_debug_hints. + + + * src/pshinter/pshalgo.c: Include FT_INTERNAL_CALC_H. + (psh_corner_is_flat, psh_corner_orientation): Use ft_corner_is_flat + and ft_corner_orientation. + + + * src/gzip/inftrees.c (huft_build): Remove compiler warning. + +2006-10-24 Werner Lemberg + + * src/cff/cffload.c (cff_encoding_load): Remove unused variable. + + * src/base/ftobjs.c (FT_Select_Charmap): Disallow FT_ENCODING_NONE + as argument. + +2006-10-23 Zhe Su + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Re-implement to + better deal with broken Asian fonts with strange glyphs, having + self-intersections and other peculiarities. The used algorithm is + based on the nonzero winding rule. + +2006-10-23 David Turner + + Speed up the CFF font loader. With some large CFF fonts, + FT_Open_Face is now more than three times faster. + + * src/cff/cffload.c (cff_get_offset): Removed. + (cff_new_index): Inline functionality of `cff_get_offset'. + (cff_charset_compute_cids, cff_charset_free_cids): New functions. + (cff_charset_done): Call `cff_charset_free_cids'. + (cff_charset_load): Call `cff_charset_compute_cids'. + (cff_encoding_load) : Ditto, to replace inefficient loop. + + * src/sfnt/ttmtx.c (tt_face_load_hmtx): Replace calls to FT_GET_XXX + with FT_NEXT_XXX. + + + Speed up the Postscript hinter, with more than 100% speed increase + on my machine. + + * src/pshinter/pshalgo.c (psh_corner_is_flat, + psh_corner_orientation): New functions. + (psh_glyph_compute_inflections): Merge loops for efficiency. + Use `psh_corner_orientation'. + (psh_glyph_init): Use `psh_corner_is_flat'. + (psh_hint_table_find_strong_point): Renamed to... + (psh_hint_table_find_strong_points): This. + Rewrite, adding argument to handle all points at once. + Update all callers. + (PSH_MAX_STRONG_INTERNAL): New macro. + (psh_glyph_interpolate_normal_points): Rewrite for efficiency. + +2006-10-15 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_FOND): Initialize variable + `error' with FT_Err_Ok. + +2006-10-14 suzuki toshiya + + * docs/INSTALL.CROSS: New document file for cross-building. + + * builds/unix/configure.raw: Preliminary cross-building support. + Find native C compiler and pass it by CC_BUILD, and + find suffix for native executable and pass it by EXEEXT_BUILD. + Also suffix for target executable is passed by EXEEXT. + + * builds/unix/unix-cc.in (CCraw_build, E_BUILD): New variables to + build `apinames' which runs on building system. They are set by + CC_BUILD and EXEEXT_BUILD. + + * builds/exports.mk (APINAMES_EXE): Change the extension for + apinames from the suffix for target (E) to that for building host + (E_BUILD). + +2006-10-12 Werner Lemberg + + * docs/INSTALL.UNX, docs/UPGRADE.UNX: Renamed to... + * docs/INSTALL.UNIX, docs/UPGRADE.UNIX: This. Update all documents + which reference those files. + +2006-10-12 suzuki toshiya + + * builds/unix/configure.raw (FT2_EXTRA_LIBS): New variable. It is + embedded in freetype2.pc and freetype-config. Use it to record + Carbon dependency of MacOSX. + + * builds/unix/freetype2.in: Embed FT2_EXTRA_LIBS. + + * builds/unix/freetype-config.in: Ditto. + +2006-10-11 Werner Lemberg + + * devel/ftoption.h (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): Define for + development. + +2006-10-03 Jens Claudius + + * include/freetype/config/ftstdlib.h: Cast away volatileness from + argument to ft_setjmp. + + * include/freetype/internal/ftvalid.h: Add comment that + ft_validator_run must not be used. + +2006-10-01 Werner Lemberg + + * src/base/ftbase.c: Undo change from 2006-09-30. + + * src/base/rules.mk (BASE_SRC): Remove `ftlcdfil.c'. + +2006-09-30 David Turner + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): + s/unpatented_hinting/ignore_unpatented_hinter/. + Update all callers. + + * src/base/ftobjs.c (FT_Load_Glyph): Refine the algorithm whether + auto-hinting shall be used or not. + + * src/truetype/ttobjs.c (tt_face_init): Ditto. + +2006-09-30 Werner Lemberg + + * src/base/rules.mk (BASE_SRC): Remove `ftapi.c' (which is no longer + in use). + + * src/base/ftbase.c: Include `ftlcdfil.c'. + +2006-09-29 Werner Lemberg + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Fix algorithm for + overlapping segments. Bug reported by Stefan Koch. + +2006-09-28 David Turner + + Fix a bug in the automatic unpatented hinting support which prevents + normal bytecode hinting to work properly. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): + s/force_autohint/unpatented_hinting/. Update all callers. + + * src/base/ftobjs.c (FT_Load_Glyph): Updated code. + + * src/autofit/aftypes.h (AF_DEBUG): Undefine to get rid of traces. + +2006-09-27 David Turner + + * include/freetype/freetype.h (FT_FREETYPE_PATCH): Set to 2. + + + Add a new API to support color filtering of subpixel glyph bitmaps. + In a default build, the function `FT_Library_SetLcdFilter' returns + `FT_Err_Unimplemented_Feature'; you need to #define + FT_CONFIG_OPTION_SUBPIXEL_RENDERING in ftoption.h to compile the + real implementation. + + * include/freetype/ftlcdfil.h, src/base/ftlcdfil.c: New files. + + * include/freetype/internal/ftobjs.h (FT_Bitmap_LcdFilterFunc): New + typedef. + (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: New members + `lcd_filter_weights' and `lcd_filter'. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove arguments + `hmul' and `vmul'. + + Handle subpixel rendering. + Simplify function. + (ft_smooth_render_lcd): Use `FT_RENDER_MODE_LCD'. + (ft_smooth_render_lcd_v): Use `FT_RENDER_MODE_LCD_V'. + + * include/freetype/config/ftheader.h (FT_LCD_FILTER_H): New macro, + pointing to . + + * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC), + vms_make.com: Add `ftlcdfil.c' to the list of compiled source files. + + * modules.cfg (BASE_EXTENSIONS): Add ftlcdfil.c. + +2006-09-26 David Bustin + + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Skip adjustment bytes + correctly. Reported as Savannah bug #17843. + +2006-09-26 David Turner + + * src/autofit/afhints.h (AF_HINTS_DO_HORIZONTAL, + AF_HINTS_DO_VERTICAL, AF_HINTS_DO_ADVANCE): New macros to disable + horizontal and vertical hinting for the purpose of debugging the + auto-fitter. + + * src/autofit/afmodule.c (_af_debug_disable_horz_hints, + _af_debug_disable_vert_hints) [AF_DEBUG]: New global variables. + + * src/autofit/aftypes.h [AF_DEBUG]: Declare above variables. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): New macro to control whether + we want to compile LCD-optimized rendering code (à la ClearType) or + not. The macro *must* be disabled in default builds of the library + for patent reasons. + + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Disable + LCD-specific rendering when FT_CONFIG_OPTION_SUBPIXEL_RENDERING + isn't defined at compile time. This only changes the content of the + rendered glyph to match the one of normal gray-level rendering, + hence clients should not need to be modified. + + * docs/CHANGES: Updated. + +2006-09-18 Garrick Meeker + + * src/base/ftmac.c (FT_New_Face_From_FOND): Fall back to SFNT if + LWFN fails and both are available. + +2006-09-11 David Turner + + * src/sfnt/sfobjs.c (tt_face_get_name): Support some fonts which + report their English names through an Apple Roman + (platform,encoding) pair, with language_id != English. + + If the font uses another name entry with language_id == English, it + will be selected correctly, though. + + * src/truetype/ttobjs.c (tt_face_init): Add unpatented hinting + selection for `mingli.ttf'. + +2006-09-05 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_hdmx): Handle `record_size' + values which have the upper two bytes set to 0xFF instead of 0x00 + (as it happens in at least two CJKV fonts, `HAN NOM A.ttf' and + `HAN NOM B.ttf'). + + * src/smooth/ftgrays.c [GRAYS_USE_GAMMA]: Really remove all code. + +2006-09-05 David Turner + + Minor source cleanups and optimizations. + + * src/smooth/ftgrays.c (GRAYS_COMPACT): Removed. + (TRaster): Remove `count_ex' and `count_ey'. + (gray_find_cell): Remove 2nd and 3rd argument. + (gray_alloc_cell): Merged with `gray_find_cell'. + (gray_record_cell): Simplify. + (gray_set_cell): Rewrite. + (gray_start_cell): Apply offsets to `ras.ex' and `ras.ey'. + (gray_render_span): Don't use FT_MEM_SET for small values. + (gray_dump_cells) [DEBUG_GRAYS]: New function. + (gray_sweep): Avoid buffer overwrites when to drawing the end of a + bitmap scanline. + (gray_convert_glyph): Fix speed-up. + +2006-09-04 David Turner + + * src/smooth/ftgrays.c (gray_convert_glyphs): Make it work with + 64bit processors. + +2006-09-03 Werner Lemberg + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/smooth/ftgrays.c (gray_record_cell): Remove shadowing + variable declaration. + (gray_convert_glyph): Fix compiler warnings. + +2006-09-01 David Turner + + * src/truetype/ttobjs.c (tt_face_init): Update the TrueType loader + to recognize a few fonts that require the automatic unpatented + loader. + + * src/smooth/ftgrays.c: Optmize the performance of the anti-aliased + rasterizer. The speed improvement is between 15% and 25%, depending + on the font data. + + (GRAYS_USE_GAMMA, GRAYS_COMPACT): Removed, and all associated code. + (TCell): Redefine. + (TRaster): New members `buffer', `buffer_size', `ycells', `ycount'. + (gray_init_cells): Updated. + (gray_find_cell, gray_alloc_cell): New functions. + (gray_record_cell): Rewritten to use `gray_find_cell' and + `gray_alloc_cell'. + (PACK, LESS_THAN, SWAP_CELLS, DEBUG_SORT, QUICK_SORT, SHELL_SORT, + QSORT_THRESHOLD): + Removed. + (gray_shell_sort, gray_quick_sort, gray_check_sort, + gray_dump_cells): Removed. + (gray_sweep): Rewritten. + (gray_convert_glyph): Rewrite code which used one of the sorting + functions. + (gray_raster_render): Updated. + +2006-08-29 Dr. Werner Fink + + * configure: Make it possible to handle configure options which + have strings containing spaces. + +2006-08-27 David Turner + + * include/freetype/config/ftoption.h (TT_USE_BYTECODE_INTERPRETER): + New macro, defined if either TT_CONFIG_OPTION_BYTECODE_INTERPRETER + or TT_CONFIG_OPTION_UNPATENTED_HINTING is defined. + + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c, + src/truetype/truetype.c, src/truetype/ttdriver.c, + src/truetype/ttgload.c, src/truetype/ttgload.h, + src/truetype/ttinterp.c, src/truetype/ttobjs.c, + src/truetype/ttobjs.h, src/truetype/ttpload.c, src/type42/t42drivr.c: + s/TT_CONFIG_OPTION_BYTECODE_INTERPRETER/TT_USE_BYTECODE_INTERPRETER/. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New + member `force_autohint'. + + * src/base/ftobjs.c (FT_Load_Glyph): Use `force_autohint'. + + * src/truetype/ttobjs.c (tt_face_init): Prepare code for testing + against a list of font names which need the bytecode interpreter. + +2006-08-27 Jens Claudius + + Fix miscellaneous compiler warnings. + + * include/freetype/internal/ftobjs.h: Close comment with `*/' to + avoid `/* in comment' compiler warning. + + * src/base/ftdbgmem.c (ft_mem_table_get_source): Turn cast + `(FT_UInt32)(void*)' into `(FT_UInt32)(FT_PtrDist)(void*)' since on + 64-bit platforms void* is larger than FT_UInt32. + + * src/base/ftobjs.c (t_validator_error): Cast away + volatileness of argument to ft_longjmp. Spotted by Werner + `Putzfrau' Lemberg. + + * src/bdf/bdflib.c (bdf_load_font): Initialize local + variable `lineno'. + + * src/gxvalid/gxvmod.c (classic_kern_validate): Mark local variable + `error' as volatile. + +2006-08-27 Werner Lemberg + + * builds/unix/ftconfig.in: Synchronize with main ftconfig.h. + Reported by Jens. + +2006-08-22 Jens Claudius + + Fix for previous commit, which caused many compiler warnings/errors + about addresses of volatile objects passed as function arguments as + non-volatile pointers. + + * include/freetype/internal/ftvalid.h: Make FT_Validator typedef a + pointer to a volatile object. + + * src/gxvalid/gxvmod.c (gxv_load_table): Make function argument + `table' a pointer to a volatile object. + + * src/otvalid/otvmod.c (otv_load_table): Make function argument + `table' a pointer to a volatile object. + +2006-08-18 Jens Claudius + + * src/gxvalid/gxvmod.c (GXV_TABLE_DECL): Mark local variable `_sfnt' + as volatile since it must keep its value across a call to ft_setjmp. + (gxv_validate): Same for local variables `memory' and `valid'. + (classic_kern_validate): Same for local variables `memory', + `ckern', and `valid'. + + * src/otvalid/otvmod.c (otv_validate): Same for function parameter + `face' and local variables `base', `gdef', `gpos', `gsub', `jstf', + and 'valid'. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Same for local variable + `cmap'. + +2006-08-16 David Turner + + * src/cid/cidgload.c (cid_slot_load_glyph): Remove compiler + warnings. + + * src/base/ftobjs.c (ft_validator_run): Disable function; it is + buggy by design. Always return -1. + + + Improvements to native TrueType hinting. This is a first try, + controlled by the FIX_BYTECODE macro in src/truetype/ttinterp.c. + + * include/freetype/internal/ftgloadr.h (FT_GlyphLoadRec): Add member + `extra_points2'. + + * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add member + `orus'. + + * src/base/ftgloadr.c (FT_GlyphLoader_Reset, + FT_GlyphLoader_Adjust_Points, FT_GlyphLoader_CreateExtra, + FT_GlyphLoader_CheckPoints, FT_GlyphLoader_CopyPoints): Updated to + handle `extra_points2'. + + * src/truetype/ttgload.c (tt_prepare_zone): Handle `orus'. + Remove compiler warning. + (cur_to_arg): Remove macro. + (TT_Hint_Glyph): Updated. + (TT_Process_Simple_Glyph): Handle `orus'. + + * src/truetype/ttinterp.c (FIX_BYTECODE): New macro. + (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Handle `orus'. + (LOC_Ins_IUP): Renamed to... + (IUP_WorkerRec): This. + Add `orus' member. + (Shift): Renamed to... + (_iup_worker_shift): This. + Updated. + (Interp): Renamed to... + (_iup_worker_interpolate): This. + Updated to handle `orus'. + (Ins_IUP): Updated. + + * src/truetype/ttobjs.c (tt_glyphzone_done, tt_glyphzone_new): + Handle `orus'. + +2006-08-15 suzuki toshiya + + * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to + build ftvalid in ft2demos. This has been inadvertedly changed + 2006-08-13. + +2006-08-15 suzuki toshiya + + `ft_validator_run' wrapping `setjmp' can cause a crash, as found by + Jens: + http://lists.gnu.org/archive/html/freetype-devel/2006-08/msg00004.htm. + + * src/otvalid/otvmod.c: Replace `ft_validator_run' by `ft_setjmp'. + It reverts the change introduced on 2005-08-20. + + * src/gxvalid/gxvmod.c: Ditto. + +2006-08-13 Jens Claudius + + * finclude/freetype/internal/psaux.h: (T1_TokenType): Add + T1_TOKEN_TYPE_KEY. + (T1_FieldRec): Add `dict'. + (T1_FIELD_DICT_FONTDICT, T1_FIELD_DICT_PRIVATE): New macros. + (T1_NEW_XXX, T1_FIELD_XXX): Update to take the dictionary where a PS + keyword is expected as an additional argument. + + * src/cid/cidload.c: (cid_field_records): Adjust invocations of + T1_FIELD_XXX. + + * src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX. + + * src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing. + (ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY, + not T1_TOKEN_TYPE_ANY. + (ps_parser_load_field): Make sure a token that should be a string or + name is really a string or name. + Avoid memory leak if a keyword has been already encountered and its + value is overwritten. + * src/type1/t1load.c: (t1_keywords): Adjust invocations of + T1_FIELD_XXX. + (parse_dict): Ignore keywords that occur in the wrong dictionary + (e.g., in `Private' instead of `FontDict'). + + * src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX. + + * src/type42/t42parse.c: (t42_keywords): Adjust invocations of + T1_FIELD_XXX. + +2006-07-18 Jens Claudius + + Move creation of field `buildchar' of T1_DecoderRec out of + `t1_decoder_init' and let the caller of `t1_decoder_init' take care + of it. + + Call the finisher for T1_Decoder in `cid_face_compute_max_advance' + and `T1_Compute_Max_Advance'. + + * include/freetype/internal/psaux.h (T1_DecoderRec): Remove field + `face', add `len_buildchar'. + + * include/freetype/internal/t1types.h (T1_FaceRec): Add field + `buildchar'. + + * src/cid/cidgload.c (cid_face_compute_max_advance): Call finisher + for T1_Decoder. + (cid_slot_load_glyph): Do not ignore failure when initializing the + T1_Decoder. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Updated. + (t1_decoder_init): Remove initialization of fields `buildchar' and + `len_buildchar'. + (t1_decoder_done): Remove deallocation of field `buildchar'. + + * freetype/src/type1/t1gload.c (T1_Compute_Max_Advance): Initialize + T1_Decoder's `buildchar' and `len_buildchar'; call finisher for + T1_Decoder. + (T1_Load_Glyph): Initialize T1_Decoder's `buildchar' and + `len_buildchar'; make sure to call finisher for T1_Decoder even in + case of error. + + * src/type1/t1load.c (T1_Open_Face): Allocate new field `buildchar' + of T1_FaceRec. + + * src/type1/t1objs.c (T1_Face_Done): Free new field `buildchar' of + T1_FaceRec. + +2006-07-14 Jens Claudius + + * include/freetype/internal/psaux.h: New macros IS_PS_NEWLINE, + IS_PS_SPACE, IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, + and IS_PS_BASE85 (from src/psaux/psconv.h). + (T1_FieldLocation): Add T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, and T1_FIELD_LOCATION_BLEND. + (T1_DecoderRec): New fields `buildchar' and `face'. + (IS_PS_TOKEN): New macro. + + * include/freetype/internal/t1types.h (T1_FaceRec): New fields + `ndv_idx', `cdv_idx', and `len_buildchar'. + + * include/freetype/t1tables.h (PS_BlendRec): New fields + `default_design_vector' and `num_default_design_vector'. + + * src/psaux/psconv.h: Move macros IS_PS_NEWLINE, IS_PS_SPACE, + IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, and + IS_PS_BASE85 to include/freetype/internal/psaux.h. + + * src/psaux/psobjs.c (ps_parser_to_token_array): Allow `token' + argument to be NULL if we want only to count the number of tokens. + (ps_tocoordarray): Allow `coords' argument to be NULL if we just + want to skip the array. + (ps_tofixedarray): Allow `values' argument to be NULL if we just + want to skip the array. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add support + for (partially commented out) othersubrs 19-25, 27, and 28. + (t1_decoder_init): Initialize new fields `face' and `buildchar'. + (t1_decoder_done): Release new field `buildchar'. + + * src/type1/t1load.c (parse_buildchar, parse_private): New + functions. + (t1_keywords): Register them. + (t1_allocate_blend): Updated. + (t1_load_keyword): Handle field types T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE and T1_FIELD_LOCATION_BLEND. + (parse_dict): Remove `keyword_flags' argument. + Use new macro IS_PS_TOKEN. + Changed function so that later PostScript definitions override + earlier ones. + (t1_init_loader): Initialize new field `keywords_encountered'. + (T1_Open_Face): Initialize new fields `ndv_idx', `cdv_idx', and + `len_buildchar'. + Remove `keywords_flags'. + + * src/type1/t1load.h (T1_LoaderRect): New field + `keywords_encountered'. + (T1_PRIVATE, T1_FONTDIR_AFTER_PRIVATE): New macros. + + * src/type1/t1tokens.h [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: New + entries for parsing /NDV, /CDV, and /DesignVector. + +2006-07-07 Werner Lemberg + + Add many checks to protect against malformed PCF files. + + * src/pcf/pcfdrivr.c (PCF_Face_Done): Protect against NULL pointers. + (PCF_Face_Init): Add calls to PCF_Face_Done in case of errors. + + * src/pcf/pcfread.c (pcf_read_TOC): Protect against malformed table + data and check that tables don't overlap (using a simple + bubblesort). + (PCF_METRIC_SIZE, PCF_COMPRESSED_METRIC_SIZE, PCF_PROPERTY_SIZE): + New macros which give the size of data structures in the data + stream. + (pcf_get_properties): Use rough estimates to get array size limits. + Assign `face->nprops' and `face->properties' earlier so that a call + to PCF_Face_Done can do the clean-up in case of error. + Protect against invalid string offsets. + (pcf_get_metrics): Clean up code. + Adjust tracing message levels. + Use rough estimate to get array size limit. + (pcf_get_bitmaps): Clean up code. + Adjust tracing message levels. + Use rough estimates to get offset limits. + (pcf_get_encodings): Adjust tracing message level. + (pcf_get_accel): Clean up code. + +2006-06-26 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Handle fonts correctly which + don't have a POINT_SIZE property. This fixes Savannah bug #16914. + +2006-06-26 Jens Claudius + + * src/psaux/t1decode.c (T1_Operator, t1_args_count): Add opcode 15. + (t1_decoder_parse_charstrings): Operator with + opcode 15 pops its two arguments. + Handle the case where the pops of an othersubr may be part of a + subroutine. + Handle unknown othersubrs gracefully: count their operands and let + the following pop operators push the operands as the results onto + the Type1 stack. + Improve handling of setcurrentpoint opcode. + +2006-06-25 Jens Claudius + + The Type 1 parser now skips over top-level procedures as required + for a `Simplified Parser'. This makes the parser more robust as it + doesn't poke around in PostScript code. Additionally, it makes the + FontDirectory hackery in src/type1/t1load.c unnecessary. + + * src/psaux/psobjs.c (IS_OCTAL_DIGIT): New macro. + (skip_literal_string): Add FT_Error as return value. + Handle escapes better. + (skip_string): Add FT_Error as return value. + Don't set `parser->error' but return error code directly. + (skip_procedure): New function. + (ps_parser_skip_PS_token): Handle procedures. + Update code. + (ps_parser_to_token): Update code. + (ps_parser_load_field_table): Handle bbox entries also. + + * src/type1/t1load.c (parse_dict): Remove FontDirectory hackery. + Add commented-out code for synthetic fonts. + +2006-06-24 Eugeniy Meshcheryakov + + Fix two hinting bugs as reported in + http://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html. + + * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add + `first_point' member. + + * src/truetype/ttgload.c (tt_prepare_zone): Initialize + `first_point'. + (TT_Process_Composite_Glyph): Always untouch points. + + * src/truetype/ttinterp.c (Ins_SHC): Fix computation of + `first_point' and `last_point' in case of composite glyphs. + (Ins_IUP): Fix computation of `end_point'. + +2006-06-22 suzuki toshiya + + Insert EndianS16_BtoN and EndianS32_BtoN as workaround for Intel + Mac. The original patch was written by David Sachitano and Lawrence + Coopet, and modified by Sean McBride for MPW compatibility. Only + required data are converted; unused data are left in big endian. + + * src/base/ftmac.c: Include for byteorder macros for non + Mac OS X platforms. + (OS_INLINE): Undefine before definition. + (count_faces_sfnt): Insert EndianS16_BtoN to parse the header of + FontAssociation table in FOND resource. + (count_faces_scalable): Insert EndianS16_BtoN to parse the header + and fontSize at each entry of FontAssociation table in FOND + resource. + (parse_fond): Insert EndianS16_BtoN and EndianS32_BtoN to parse + ffStylOff of FamilyRecord header of FOND resource, the header, + fontSize, fontID at each entry of FontAssociation table, and + StyleMapping table. + (count_faces): Call `HUnlock' after all FOND utilization. + +2006-06-08 suzuki toshiya + + Public API of TrueTypeGX, OpenType, and classic kern table validator + should return `FT_Err_Unimplemented_Feature' if validation service + is unavailable (disabled in `modules.cfg'). It is originally + suggested by David Turner, cf. + http://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html + + * src/base/ftgxval.c (FT_TrueTypeGX_Validate): Return + FT_Err_Unimplemented_Feature if TrueTypeGX validation service is + unavailable. + (FT_ClassicKern_Validate): Return FT_Err_Unimplemented_Feature if + classic kern table validation service is unavailable. + + * src/base/ftotval.c (FT_OpenType_Validate): Return + FT_Err_Unimplemented_Feature if OpenType validation service is + unavailable. + +2006-06-08 Werner Lemberg + + * src/bdf/bdflib.c (bdf_load_font): Fix memory leaks in case of + errors. + +2006-06-07 David Turner + + * src/type1/t1afm.c (KERN_INDEX): Make it more robust. + (T1_Read_Metrics): Fix memory leak which happened when the metrics + file doesn't have kerning pairs. This fixes Savannah bug #16768. + +2006-06-06 David Turner + + Fix memory leak described in Savannah bug #16759. + + We change `ps_unicodes_init' so that it also takes a + `free_glyph_name' callback to release the glyph names returned by + `get_glyph_name' + + * include/freetype/internal/services/svpscmap.h (PS_Glyph_NameFunc): + Renamed to ... + (PS_GetGlyphNameFunc): This. + (PS_FreeGlyphNameFunc): New typedef. + (PS_Unicodes_InitFunc): Add variable for PS_FreeGlyphNameFunc. + + * src/cff/cffcmap.c (cff_sid_to_glyph_name): Use `TT_Face' for first + argument. + (cff_sid_free_glyph_name): New function. + (cff_cmap_unicode_init): Updated. + + * src/psaux/t1cmap.c (t1_cmap_unicode_init): Updated. + + * src/psnames/psmodule.c (ps_unicodes_init): Add variable for + PS_FreeGlyphNameFunc and use it. + + +2006-06-04 David Turner + + * src/base/ftutil.c (ft_mem_qrealloc): Fix the function to accept + `item_size == 0' as well -- though this sounds weird, it can + theoretically happen. This fixes Savannah bug #16669. + + * src/pfr/pfrobjs.c (pfr_face_init): Fix the computation + of `face->num_glyphs' which missed the last glyph, due to + the offset-by-1 computation, since the PFR format doesn't + guarantee that glyph index 0 corresponds to the `missing + glyph. This fixes Savannah bug #16668. + +2006-05-25 Werner Lemberg + + * builds/unix/unix-cc.in (LINK_LIBRARY): Don't comment out + `-no-undefined'. Reported by Christian Biesinger. + +2006-05-19 Brian Weed + + * builds/win32/visualc/freetype.dsp: Release libraries no longer + have debug information, and debug libraries use `C7 compatible' + debug info. + +2006-05-19 suzuki toshiya + + Apply patch by Derek Clegg to fix two memory leaks in the MacOS + resource fork handler. This fixes Savannah bug #16631. + + * src/base/ftobjs.c (load_face_in_embedded_rfork): Replace + `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. + + * src/base/ftrfrk.c (raccess_guess_linux_double_from_file_name): + Replace `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak. + +2006-05-19 suzuki toshiya + + * build/unix/configure.raw: Add a fallback to disable Carbon + dependency, if configured with no options on Mac OS X. + +2006-05-19 suzuki toshiya + + * src/base/ftmac.c (open_face_from_buffer): Deallocate stream when + its content cannot be parsed as supported font. This fixes + the second part of Savannah bug #16590. + +2006-05-18 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Composite_Glyph) + [FT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again. + +2006-05-17 David Turner + + This is a major patch used to drastically improve the performance of + loading glyphs. This both speeds up loading the glyph vectors + themselves and the auto-fitter module. + + We now use inline assembler code with GCC to implement `FT_MulFix', + which is probably the most important function related to the + engine's performance. + + The resulting speed-up is about 25%. + + + * include/freetype/internal/tttypes.h (TT_LoaderRec): Add fields + `cursor' and `limit'. + + * src/autofit/afangles.c (af_corner_is_flat, af_corner_orientation): + New functions. + (AF_ATAN_BITS, af_arctan, af_angle_atan): Comment out. + [TEST]: Remove. + + * src/autofit/afcjk.c (AF_Script_UniRangeRec): Comment out test + code. + + * src/autofit/afhints.c (af_axis_hints_new_segment): Don't call + `FT_ZERO' + (af_direction_compute, af_glyph_hints_compute_inflections): Rewritten. + (af_glyph_hints_reload: Rewrite recognition of weak points. + + * src/autofit/aflatin.c (af_latin_hints_compute_segments): Move + constant values out of the loops. + + * src/autofit/aftypes.h: Updated. + + * src/base/ftcalc.c (FT_MulFix): Use inline assembler code. + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Use vector + product to get orientation. + + * src/gzip/ftgzip.c (ft_get_uncompressed_size): New function. + (FT_Stream_OpenGzip): Use it to handle small files directly in + memory. + + * src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_ConvEexecDecode): + Improve performance. + + * src/truetype/ttgload.c (TT_Access_Glyph_Frame): Set `cursor' and + `limit'. + + (TT_Load_Glyph_Header, TT_Load_Simple_Glyph, + TT_Load_Composite_Glyph): Updated. Add threshold to protect against + exceedingly large values of number of contours. Speed up by + reducing the number of loops. + + * src/type1/t1gload.c (T1_Load_Glyph): Don't apply unit matrix. + + + * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the threshold + used to detect rogue clients from 4 to 16. This is to prevent some + segmentation faults with fonts like `KozMinProVI-Regular.otf' which + comes from the Japanese Adobe Reader Asian Font pack. + +2007-05-17 Werner Lemberg + + * src/cff/cffload.c (cff_font_done): Deallocate subfont array. This + fixes the first part of Savannah bug #16590. + +2006-05-16 Werner Lemberg + + * docs/PROBLEMS: Updated icl issues. + +---------------------------------------------------------------------------- + +Copyright 2006, 2007, 2008, 2009, 2010 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/alienblaster/project/jni/freetype/ChangeLog.20 b/alienblaster/project/jni/freetype/ChangeLog.20 new file mode 100644 index 000000000..8fcc5e70a --- /dev/null +++ b/alienblaster/project/jni/freetype/ChangeLog.20 @@ -0,0 +1,2613 @@ +2002-02-09 Werner Lemberg + + * README: Fix typo. + * docs/CHANGES: Minor fixes. + + + * Version 2.0.8 released. + ========================= + + +2002-02-08 David Turner + + * docs/CHANGES: Updating for 2.0.8. + + * include/freetype/freetype.h: Setting `PATCH_LEVEL' to 8 and + removing `FT_Get_Next_Char' from the API (temporarily). + + * include/freetype/freetype.h: Adding comments to FT_Get_Next_Char; + note that this function might temporarily be removed for the 2.0.8 + release. + +2002-02-07 David Turner + + * src/pcf/pcfread.c (pcf_load_font): Removed immature support of + the AVERAGE_WIDTH property. + +2002-02-06 David Turner + + * src/sfnt/sfobjs.c (SFNT_Load_Face): Since many fonts embedded in + PDF documents do not include 'cmap', 'post' and 'name' tables, the + SFNT face loader has been changed to not immediately report an + error if these are not present. + + Note that the specification _requires_ these tables, but Adobe + seems to ignore it completely. + + * src/sfnt/ttcmap.c: Removing compiler warnings. + + * src/pcf/pcfread.c (pcf_read_TOC): Use FT_UInt. + (pcf_parse_metric, pcf_parse_compressed_metric): Removed. Code + is now in ... + (pcf_get_metric): Here. + (pcfSeekToType): Renamed to ... + (pcf_seek_to_table_type): This. + Use FT_Int. + (pcfHasType): Renamed to ... + (pcf_has_table_type): This. + Use FT_Int. + (find_property): Renamed to ... + (pcf_find_property): This. + Use FT_Int. + (pcf_get_bitmaps, pcf_get_encodings): Handle invalid PCF fonts + better (delaying format checks out of FT_Access_Frame .. + FT_Forget_Frame blocks to avoid leaving the stream in an incorrect + state when encountering an invalid PCF font). + + * src/pcf/pcfdriver.c (PCF_Done_Face): Renamed to ... + (PCF_Face_Done): This. + (PCF_Init_Face): Renamed to ... + (PCF_Face_Init): This. + (PCF_Get_Char_Index): Renamed to ... + (PCF_Char_Get_Index): This. + (PCF_Get_Next_Char): Renamed to ... + (PCF_Char_Get_Next): This. + (pcf_driver_class): Updated. + + * src/pcf/pcf.h (PCF_Done_Face): Removed. + +2002-02-06 Detlef Würkner + + * src/pcf/pcfdriver.c (FT_Done_Face): Fixed small memory leak. + + * src/pcf/pcfread.c (pcf_load_font): Now handles the `AVERAGE_WIDTH' + property to return correct character pixel (width/height) pairs for + embedded bitmaps. + +2002-02-04 Keith Packard + + Adding the function `FT_Get_Next_Char', doing the obvious thing + w.r.t. the selected charmap. + + * include/freetype/freetype.h: Add prototype. + * include/freetype/internal/ftdriver.h: Add `FTDriver_getNextChar' + typedef. + (FT_Driver_Class): Use it. + * include/freetype/internal/psnames.h: Add `PS_Next_Unicode_Func' + typedef. + (PSNames_Interface): Use it. + * include/freetype/internal/tttypes.h: Add `TT_CharNext_Func' + typedef. + (TT_CMapTable): Use it. + + * src/base/ftobjs.c (FT_Get_Next_Char): New function, implementing + high-level API. + * src/cff/cffdrivr.c (cff_get_next_char): New function. + (cff_driver_class): Add it. + * src/cid/cidriver.c (Cid_Get_Next_Char): New function. + (t1cid_driver_class): Add it. + * src/pcf/pcfdriver.c (PCF_Get_Next_Char): New function. + (pcf_driver_class): Add it. + * src/psnames/psmodule.c (PS_Next_Unicode): New function. + (psnames_interface): Add it. + * src/sfnt/ttcmap.c (code_to_next0, code_to_next2, code_to_next4, + code_to_next6, code_to_next_8_12, code_to_next_10): New auxiliary + functions. + (TT_CharMap_Load): Use them. + * src/truetype/ttdriver.c (Get_Next_Char): New function. + (tt_driver_class): Add it. + * src/type1/t1driver.c (Get_Next_Char): New function. + (t1_driver_class): Add it. + * src/winfonts/winfnt.c (FNT_Get_Next_Char): New function. + (winfnt_driver_class): Add it. + + * src/pcf/pcfread.c (pcf_load_font): For now, report Unicode for + Unicode and Latin 1 encodings. + +2002-02-02 Keith Packard + + * builds/unix/freetype-config.in: Add missing `fi'. + + + * Version 2.0.7 released. + ========================= + + +2002-02-01 David Turner + + * include/freetype/freetype.h: Increasing FREETYPE_PATCH to 7 + for the new release. + +2002-01-31 David Turner + + * README, README.UNX, docs/CHANGES: Updating documentation for the + 2.0.7 release. + +2002-01-30 David Turner + + * INSTALL: Moved to ... + * docs/INSTALL: Here to avoid conflicts with the `install' script on + Windows, where the filesystem doesn't preserve case. + +2002-01-29 David Turner + + * configure: Fixed the script. It previously didn't accept more + than one argument correctly. For example, when typing: + + ./configure --disable-shared --disable-nls + + the `--disable-nls' was incorrectly sent to the `make' program. + +2002-01-29 Werner Lemberg + + * README.UNX: Fix typo. + * builds/unix/install.mk (uninstall): Fix library name for libtool. + +2002-01-28 Francesco Zappa Nardelli + + * src/pcf/pcfdriver.c (PCF_Done_Face): Fix incorrect destruction of + the face object (face->toc.tables, face->root.family_name, + face->root.available_size, face->charset_encoding, + face->charset_registry are now freed). Thanks to Niels Moseley. + +2002-01-28 Roberto Alameda + + * src/type1/t1load.c (parse_encoding): Set `loader->num_chars'. + +2002-01-28 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Use copy + of `base' string for decrypting to not modify the original data. + Based on a patch by Jakub Bogusz . + +2002-01-27 Giuliano Pochini + + * src/smooth/ftgrays.c (gray_render_scanline): Fix bug which caused + bad rendering of thin lines (less than one pixel thick). + +2002-01-25 Werner Lemberg + + * src/cff/cffdrivr.c (cff_get_name_index): Make last patch work + actually. + +2002-01-25 Martin Zinser + + * src/cache/ftccache.c (ftc_node_done, ftc_node_destroy): Fix + compilation warnings. + * src/base/descrip.mms (OBJS): Add `ftmm.obj'. + * src/cache/descrip.mms (ftcache.obj): Dependencies added. + +2002-01-25 WANG Yi + + * src/cff/cffdrivr.c (cff_get_name_index): Fix deallocation bug. + +2002-01-21 Antoine Leca + + * docs/PATENTS: Typo fixed (thanks to Detlef `Hawkeye' Würkner) in + the URL for the online resource. + +2002-01-18 Ian Brown + + * builds/win32/ftdebug.c: New file. + * builds/win32/visualc/freetype.dsp: Updated. + +2002-01-18 Detlef Würkner + + * builds/amiga/src/base/ftsystem.c: Updated for AmigaOS 3.9. + * builds/amiga/README: Updated. + +2002-01-18 Ian Brown + + * builds/win32/visualc/freetype.dsp: Updated. + +2002-01-13 Werner Lemberg + + * builds/unix/freetype2.a4: The script was still buggy. + * builds/unix/freetype-config.in: Make it really work for any install + prefix. + +2002-01-10 Werner Lemberg + + * builds/unix/freetype2.a4: Fix some serious bugs. + +2002-01-09 David Turner + + * builds/unix/configure.ac: Build top-level Jamfile. + +2002-01-09 Maxim Shemanarev + + * src/smooth/ftgrays.c (gray_render_line): Small optimization to + the smooth anti-aliased renderer that deals with vertical segments. + This results in a 5-7% speedup in rendering speed. + +2002-01-08 David Turner + + Added some wrapper scripts to make the installation more + Unix-friendly. + + * configure, install: New files. + + * INSTALL, README.UNX: Updated installation documentation to use the + new 'configure' and 'install' scripts. + +2002-01-07 David Turner + + + * Version 2.0.6 released. + ========================= + + + * docs/BUGS, docs/CHANGES: Updating documentation for 2.0.6 release. + + * src/tools/docmaker.py: Fixed HTML quoting in sources. + (html_format): Replaced with ... + (html_quote): New function. + (html_quote0): New function. + (DocCode::dump_html): Small improvement. + (DocParagraph::dump, DocBlock::html): Use html_quote0 and html_quote. + + * include/freetype/config/ftoption.h: Setting default options for + a release build (debugging off, bytecode interpreter off). + + * src/base/ftobjs.c, src/base/ftoutln.c, src/cache/ftccmap.c, + src/cff/cffload.c, src/cff/cffobjs.c, src/pshinter/pshalgo2.c, + src/sfnt/ttload.c, src/sfnt/ttsbit.c: Removing small compiler + warnings (in pedantic compilation modes). + +2002-01-05 David Turner + + * src/autohint/ahhint.c (ah_align_linked_edge): Modified computation + of auto-hinted stem widths; this avoids color fringes in + `ClearType-like' rendering. + + * src/truetype/ttgload.c (TT_Load_Glyph_Header, + TT_Load_Simple_Glyph, TT_Load_Composite_Glyph, load_truetype_glyph): + Modified the TrueType loader to make it more paranoid; this avoids + nasty buffer overflows in the case of invalid glyph data (as + encountered in the output of some buggy font converters). + +2002-01-04 David Turner + + * README.UNX: Added special README file for Unix users. + + * builds/unix/ftsystem.c (FT_New_Stream): Fixed typo. + + * src/base/ftobjs.c: Added #include FT_OUTLINE_H to get rid + of compiler warnings. + + * src/base/ftoutln.c (FT_Outline_Check): Remove compiler warning. + +2002-01-03 Werner Lemberg + + * src/type1/t1objs.c (T1_Face_Init): Add cast to avoid compiler + warning. + +2002-01-03 Keith Packard + + * builds/unix/ftsystem.c (FT_New_Stream): Added a fix to ensure that + all FreeType input streams are closed in child processes of a `fork' + on Unix systems. This is important to avoid (potential) access + control issues. + +2002-01-03 David Turner + + * src/type1/t1objs.c (T1_Face_Init): Fixed a bug that crashed the + library when dealing with certain weird fonts like `Stalingrad', in + `sadn.pfb' (this font has no full font name entry). + + * src/base/ftoutln.c, include/freetype/ftoutln.h (FT_Outline_Check): + New function to check the consistency of outline data. + + * src/base/ftobjs.c (FT_Load_Glyph): Use `FT_Outline_Check' to + ensure that loaded glyphs are valid. This allows certain fonts like + `tt1095m_.ttf' to be loaded even though it appears they contain + really funky glyphs. + + There still is a bug there, though. + + * src/truetype/ttgload.c (load_truetype_glyph): Fix error condition. + +2001-12-30 David Turner + + * src/autohint/ahhint.c (ah_hinter_load): Fix advance width + computation of auto-hinted glyphs. This noticeably improves the + spacing of letters in KDE and Gnome. + +2001-12-25 Antoine Leca + + * builds/dos/detect.mk: Correcting the order for Borland compilers: + 16-bit bcc was never selected, always overridden by 32-bit bcc32. + +2001-12-22 Francesco Zappa Nardelli + + * src/pfc/pcfread.c (pcf_load_font): Handle property `POINT_SIZE' + and fix incorrect computation of `available_sizes'. + +2001-12-22 David Turner + + * src/autohint/ahhint.c (ah_hinter_load): Auto-hinted glyphs had an + incorrect glyph advance in the case of mono-width fonts (like + Courier, Andale Mono, and others). + +2001-12-22 Detlef Würkner + + * builds/amiga/*: Adaptations to latest changes. + Support added for MorphOS. + +2001-12-22 Werner Lemberg + + * src/pshinter/pshrec.c (FT_COMPONENT): Redefine to `trace_pshrec'. + (ps_mask_table_merge, ps_hints_open, ps_hints_stem, + ps_hints_t1stem3, ps_hints_t2mask, ps_hints_t2counter): Fix + FT_ERROR messages. + * src/pshinter/pshalgo1.c (FT_COMPONENT): Define as + `trace_pshalgo1'. + * src/pshinter/pshalgo2.c (FT_COMPONENT): Define as + `trace_pshalgo2'. + * include/freetype/internal/ftdebug.h (FT_Trace): Updated. + + * docs/modules.txt: New file. + +2001-12-21 David Turner + + * src/pshinter/pshrec.c (ps_hints_t2mask, ps_hints_t2counter): + Ignore invalid `hintmask' and `cntrmask' operators (instead of + returning an error). Glyph 2028 of the CFF font `MSung-Light-Acro' + couldn't be rendered otherwise (it seems its charstring is buggy, + though this requires more analysis). + (FT_COMPONENT): Define. + + * src/cff/cffgload.c (CFF_Parse_CharStrings), src/psaux/t1decode.c + (T1_Decoder_Parse_Charstrings), src/pshinter/pshalgo2.c (*), Fixed a + bug where the X and Y axis where inverted in the postscript hinter. + This caused problem when displaying on non-square surfaces. + + * src/pshinter/pshalgo2.c: s/vertical/dimension/. + + * src/pshinter/pshglob.c (psh_globals_new): Replaced a floating + point constant with a fixed-float equivalent. For some reasons not + all compilers are capable of directly computing a floating pointer + constant casted to FT_Fixed, and will link a math library instead. + +2001-12-20 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_destroy, ftc_cache_lookup): Fix + tracing strings. + * src/cache/ftccmap.c (ftc_cmap_family_init): Ditto. + * src/cache/ftcmanag.c (ftc_family_table_alloc, + ftc_family_table_free, FTC_Manager_Check): Ditto. + * src/cache/ftcsbits.c (ftc_sbit_node_load): Ditto. + + * src/base/ftobjs.c (FT_Done_Library): Remove compiler warning. + +2001-12-20 David Turner + + Added PostScript hinter support to the CFF and CID drivers. + + * include/freetype/internal/cfftypes.h (CFF_Font): New member + `pshinter'. + * src/cff/cffload.c (CFF_Get_Standard_Encoding): New function. + * src/cff/cffload.h: Updated. + * src/cff/cffgload.c (CFF_Init_Builder): Renamed to ... + (CFF_Builder_Init): This. + Added new argument `hinting'. + (CFF_Done_Builder): Renamed to ... + (CFF_Builder_Done): This. + (CFF_Init_Decoder): Added new argument `hinting'. + (CFF_Parse_CharStrings): Implement vstem support. + (CFF_Load_Glyph): Updated. + Add hinting support. + (cff_lookup_glyph_by_stdcharcode): Use CFF_Get_Standard_Encoding(). + (cff_argument_counts): Updated. + * src/cff/cffgload.h: Updated. + * src/cff/cffobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + (CFF_Size_Get_Globals_Funcs, CFF_Size_Done, CFF_Size_Init, + CFF_Size_Reset, CFF_GlyphSlot_Done, CFF_GLyphSlot_Init): New + functions. + (CFF_Init_Face): Renamed to ... + (CFF_Face_Init): This. + Add hinter support. + (CFF_Done_Face): Renamed to ... + (CFF_Face_Done): This. + (CFF_Init_Driver): Renamed to ... + (CFF_Driver_Init): This. + (CFF_Done_Driver): Renamed to ... + (CFF_Driver_Done): This. + * src/cff/cffobjs.h: Updated. + * src/cff/cffdrivr.c (cff_driver_class): Updated. + + * include/freetype/internal/t1types.h (CID_FaceRec): New member + `pshinter'. + * src/cid/cidgload.c (CID_Load_Glyph): Add hinter support. + * src/cid/cidobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + (CID_GlyphSlot_Done, CID_GlyphSlot_Init, CID_Size_Get_Globals_Funcs, + CID_Size_Done, CID_Size_Init, CID_Size_Reset): New functions. + (CID_Done_Face): Renamed to ... + (CID_Face_Done): This. + (CID_Init_Face): Renamed to ... + (CID_Face_Init): This. + Add hinting support. + (CID_Init_Driver): Renamed to ... + (CID_Driver_Init): This. + (CID_Done_Driver): Renamed to ... + (CID_Driver_Done): This. + * src/cid/cidobjs.h: Updated. + * src/cidriver.c: Updated. + + * src/pshinter/pshrec.c (t2_hint_stems): Fixed. + + * src/base/ftobjs.c (FT_Done_Library): Fixed a stupid bug that + crashed the library on exit. + + * src/type1/t1gload.c (T1_Load_Glyph): Enable font matrix + transformation of hinted glyphs. + + * src/cid/cidload.c (cid_read_subrs): Fix error condition. + + * src/cid/cidobjs.c (CID_Face_Done): Fixed a memory leak; the subrs + routines were never released when CID faces were destroyed. + + * src/cff/cffload.h, src/cff/cffload.c, src/cff/cffgload.c: Updated + to move the definition of encoding tables back within `cffload.c' + instead of making them part of a shared header (causing problems in + `multi' builds). This reverts change 2001-08-08. + + * docs/CHANGES: Updated for 2.0.6 release. + * docs/TODO: Added `stem3 and counter hints support' to the TODO + list for the Postscript hinter. + * docs/BUGS: Closed the AUTOHINT-NO-SBITS bug. + +2001-12-19 David Turner + + * include/freetype/cache/ftcache.h: Added comments to indicate that + some of the exported functions should only be used by applications + that need to implement custom cache types. + + * src/truetype/ttgload.c (cur_to_org, org_to_cur): Fixed a nasty bug + that prevented composites from loading correctly, due to missing + parentheses around macro parameters. + + * src/sfnt/sfobjs.c (SFNT_Load_Face): Make the `post' and `name' + tables optional to load PCL fonts properly. + + * src/truetype/ttgload.c (TT_Load_Glyph), src/base/ftobjs.c + (FT_Load_Glyph), include/freetype/freetype.h (FT_LOAD_SBITS_ONLY): + `Fixed' the bug that prevented embedded bitmaps to be loaded when + the auto-hinter is used. This actually is a hack but will be enough + until the internal re-design scheduled for FreeType 2.1. + + * src/raster/ftrend1.c (ft_raster1_render): Fixed a nasty outline + shifting bug in the monochrome renderer. + + * README: Updated version numbers to 2.0.6. + +2001-12-17 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix test for invalid + glyph header. + +2001-12-15 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove compiler warning. + * include/freetype/ftcache.h (FTC_Node_Unref): Removed. It is + already in ftcmanag.h. + * src/cache/ftcsbits.c (ftc_sbit_node_load): Remove unused variable + `gfam'. + * src/cache/ftcmanag.c (ftc_family_table_alloc, + * ftc_family_table_free): Use FT_EXPORT_DEF. + * include/freetype/cache/ftcmanag.h: Updated. + * src/cache/ftccache.c (ftc_node_destroy): Use FT_EXPORT_DEF. + * src/cache/ftccmap.c (ftc_cmap_node_init): Remove unused variable + `cfam'. + Remove compiler warning. + (FTC_CMapCache_Lookup): Remove compiler warnings. + (ftc_cmap_family_init): Ditto. + (FTC_CMapCache_Lookup): Ditto. + + * builds/unix/configure.ac: Increase `version_info' to 8:0:2. + * builds/unix/configure: Regenerated. + +2001-12-14 Werner Lemberg + + * builds/mac/README: Updated. + +2001-12-14 Scott Long + + * src/truetype/ttgload.c (load_truetype_glyph): Fixing crash when + dealing with invalid fonts (i.e. glyph size < 10 bytes). + +2001-12-14 Sam Latinga + + * builds/mac/freetype.make: A new Makefile to build with MPW on + MacOS classic. + +2001-12-14 David Turner + + * src/truetype/ttgload.c (TT_Load_Glyph), src/type1/t1gload.c + (T1_Load_Glyph), src/cid/cidgload.c (CID_Load_Glyph), + src/cff/cffgload.c (CFF_Load_Glyph): Fixed a serious bug common to + all font drivers (the advance width was never hinted when it + should). + + * include/freetype/freetype.h (FREETYPE_PATCH): New macro. + * src/base/ftdbgmem.c (debug_mem_dummy) [!FT_DEBUG_MEMORY]: Don't + use `extern' keyword. + +2001-12-12 David Turner + + * src/pshinter/pshglob.c (psh_blues_scale_zones, psh_blues_snap_stem + psh_globals_new): Adding correct BlueScale/BlueShift support, plus + family blues processing. + * src/pshinter/pshglob.h (PSH_BluesRec): Updated. + + Started adding support for the Postscript hinter in the CFF module. + + * src/cff/cffgload.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H. + (CFF_Parse_CharStrings): Implement it. + * src/cff/cffgload.h: Updated. + +2001-12-12 Werner Lemberg + + * builds/unix/freetype2.m4: Some portability fixes. + +2001-12-11 Jouk Jansen + + * src/base/descrip.mms (OBJS): Add ftdebug.obj. + +2001-12-11 Werner Lemberg + + * src/sfnt/ttload.c (TT_Load_Generic_Header): Typos. + +2001-12-11 David Turner + + * builds/unix/freetype-config.in: Modified the script to prevent + passing `-L/usr/lib' to gcc. + + * docs/FTL.TXT: Simple fix (change `LICENSE.TXT' to `FTL.TXT'). + + * builds/unix/freetype2.m4: New file for checking configure paths. + We need to install it in $(prefix)/share/aclocal/freetype2.m4 but I + didn't modify builds/unix/install.mk yet. + + * INSTALL: Updated the instructions to build shared libraries with + Jam. They were simply wrong. + + * src/base/fttrigon.c (FT_Cos): Fixed a small bug that caused + slightly improper results for `FT_Cos' and `FT_Sin' (example: + FT_Sin(0) == -1!). + +2001-12-11 Detlef Würkner + + * include/freetype/internal/ftstream.h (GET_LongLE, GET_ULongLE): + Fixed incorrect argument types. + +2001-12-10 Francesco Zappa Nardelli + + * src/pcf/pcfdriver.c (PCF_Init_Face): Allow Xft to use PCF fonts + by setting the `face->metrics.max_advance' correctly. + +2001-12-07 David Turner + + * include/freetype/cache/ftccmap.h, src/cache/ftccmap.c: Added new + charmap cache. + * src/cache/ftcache.c: Updated. + + * src/autohint/ahhint.c (ah_hinter_hint_edges): s/UNUSED/FT_UNUSED/. + +2001-12-06 Leonard Rosenthol + + Added support for reading .dfont files on Mac OS X. Also added a + new routine which looks up a given font by name in the Mac OS and + returns the disk file where it resides. + + * src/base/ftmac.c: Include and . + (is_dfont): New auxiliary function. + (FT_New_Face_From_dfont): New function. + (FT_GetFile_From_Mac_Name): New exported function. + (FT_New_Face): Updated. + * include/freetype/ftmac.h: Updated. + +2001-12-06 David Turner + + * src/cache/Jamfile, src/cache/rules.mk: Updated. + +2001-12-06 Werner Lemberg + + * INSTALL: Small update. + +2001-12-05 David Turner + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Re-ordered code for + debugging purposes. + Comment out use of `origin'. + + * src/smooth/ftsmooth.c (ft_smooth_render): Fixed a nasty hidden bug + where outline shifting wasn't correctly undone after bitmap + rasterization. This created problems with certain glyphs (like '"' + of certain fonts) and the cache system. + + * src/pshinter/pshalgo1.c (psh1_hint_table_init): Fix typo. + * src/pshinter/pshalgo2.c (psh2_hint_table_init): Fix typo. + (ps2_hints_apply): Small fix. + +2001-12-05 David Turner + + * src/pshinter/pshalgo2.c (psh2_hint_table_init), + src/pshinter/pshalgo1.c (psh1_hint_table_init): Removed compiler + warnings. + + * include/freetype/ftcache.h, include/freetype/cache/*, src/cache/*: + Yet another massive rewrite of the caching sub-system in order to + both increase performance and allow simpler cache sub-classing. As + an example, the code for the image and sbit caches is now much + simpler. + + I still need to update the documentation in + www/freetype2/docs/cache.html to reflect the new design though. + + * include/freetype/config/ftheader.h (FT_CACHE_CHARMAP_H): New + macro. + (FT_CACHE_INTERNAL_CACHE_H): Updated. + +2001-12-05 David Krause + + * docs/license.txt: s/X Windows/X Window System/. + +2001-12-04 Werner Lemberg + + * src/raster/ftraster.c: Fix definition condition of MEM_Set(). + * src/smooth/ftgrays.c (M_Y): Change value to 192. + * src/base/ftdbgmem.c (ft_mem_table_destroy): Fix printf() parameter. + Remove unused variable. + * src/cache/ftcimage.c (ftc_image_node_init, + ftc_image_node_compare): Remove unused variables. + * src/cache/ftcsbits.c (ftc_sbit_node_weight): Remove unused + variable. + * src/raster/ftraster.c (MEM_Set): Move definition down to avoid + compiler warning. + * src/autohint/ahhint.c (ah_hinter_hint_edges): Use UNUSED() to + avoid compiler warnings. + * src/pcf/pcfread.c (tableNames): Use `const'. + (pcf_read_TOC): Change counter name to avoid compiler warning. + Use `const'. + * src/pshinter/pshrec.c (ps_hints_close): Remove redundant + declaration. + * src/pshinter/pshalgo1.c (psh1_hint_table_init): Rename variables + to avoid shadowing. + * src/pshinter/pshalgo2.c (psh2_hint_table_activate_mask): Ditto. + * src/type1/t1objs.h: Remove double declarations of `T1_Size_Init()' + and `T1_Size_Done()'. + +2001-11-20 Antoine Leca + + * include/freetype/ttnameid.h: Added some new Microsoft language + codes and LCIDs as found in MSDN (Passport SDK). Also added + comments about the meaning of bit 57 of the `OS/2' table + (TT_UCR_SURROGATES) which (with OpenType v.1.3) now means `there is + a character beyond 0xFFFF in this font'. Thanks to Detlef Würkner + for noticing this. + +2001-11-20 David Turner + + * src/pshinter/{pshalgo2.c, pshalgo1.c}: Fixed stupid bug in sorting + routine that created nasty alignment artefacts. + + * src/pshinter/pshrec.c, tests/gview.c: Debugging updates. + + * src/smooth/ftgrays.c: De-activated experimental gamma support. + Apparently, `optimal' gamma tables depend on the monitor type, + resolution and general karma, so it's better to compute them outside + of the rasterizer itself. + (gray_convert_glyph): Use `volatile' keyword. + +2001-10-29 David Turner + + Adding experimental `gamma' support. This produces smoother glyphs + at small sizes for very little cost. + + * src/smooth/ftgrays.c (grays_init_gamma): New function. + (gray_raster_new): Use it. + + Various fixes to the auto-hinter. They merely improve the output of + sans-serif fonts. Note that there are still problems with serifed + fonts and composites (accented characters). + + * src/autohint/ahglyph.c (ah_outline_load, + ah_outline_link_segments): Implement it. + Fix typos. + (ah_outline_save, ah_outline_compute_segments): Fix typos. + * src/autohint/ahhint.c (ah_align_serif_edge): New argument + `vertical'. Implement improvement. + (ah_hint_edges_3, ah_hinter_hint_edges): Implement it. + Fix typos. + (ah_hinter_align_strong_points, ah_hinter_align_weak_points): Fix + typos. + (ah_hinter_load): Set `ah_debug_hinter' if DEBUG_HINTER is defined. + * src/autohint/ahmodule.c: Implement support for DEBUG_HINTER macro. + * src/autohint/ahtypes.h: Ditto. + (AH_Hinter): Remove `disable_horz_edges' and `disable_vert_edges' + (making them global as `ah_debug_disable_horz' and + `ah_debug_disable_vert'). + Fix typos. + + * tests/gview.c: Updated the debugging glyph viewer to show the + hints generated by the `autohint' module. + +2001-10-27 David Turner + + * src/cache/ftcchunk.c (ftc_chunk_cache_lookup): Fixed a bug that + considerably lowered the performance of the abstract chunk cache. + +2001-10-26 David Turner + + * include/freetype/ftcache.h, include/freetype/cache/*.h, + src/cache/*.c: Major re-design of the cache sub-system to provide + better performance as well as an `Acquire'/`Release' API. Seems to + work well here, but probably needs a bit more testing. + +2001-10-26 Leonard Rosenthol + + * builds/mac/README: Updated to reflect my taking over the project + and that is now being actively maintained. + + * src/base/ftmac.c (parse_fond): Applied patches from Paul Miller + to support loading a face other than the + first from a FOND resource. + (FT_New_Face_From_FOND): Updated. + +2001-10-25 Leonard Rosenthol + + * builds/mac/ftlib.prj: Update of CodeWarrior project file for Mac + OS for latest version (7) of CWPro and for recent changes to the FT + source tree. + +2001-10-25 David Turner + + * include/freetype/config/ftoption.h: Updated comments to explain + precisely how to use project-specific macro definitions without + modifying this file manually. + + (FT_CONFIG_FORCE_INT64): Define. + + (FT_DEBUG_MEMORY): New macro. + +2001-10-24 Tom Kacvinsky + + * builds/unix/ftsystem.c (FT_New_Memory): Added a missing `{'. + +2001-10-23 David Turner + + * include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c: + Improvements to the memory debugger to report more information in + case of errors. Also, some allocations that occurred through REALLOC + couldn't be previously caught correctly. + + * src/autohint/ahglyph.c (ah_outline_compute_segments, + ah_outline_compute_edges), src/raster/ftraster.c (ft_black_new), + src/smooth/ftgrays.c (gray_render_span, gray_raster_new): Replaced + liberal uses of memset() by the MEM_Set() macro. + +2001-10-23 David Turner + + * src/raster/ftraster.c (Update): Removed to be inlined in ... + (Sort): Updated. + +2001-10-22 David Turner + + * builds/unix/ftsystem.c (FT_New_Memory, FT_Done_Memory), + builds/vms/ftsystem.c (FT_New_Memory, FT_Done_Memory), + builds/amiga/ftsystem.c (FT_New_Memory, FT_Done_Memory), + src/base/ftdbgmem.c: Updated the memory debugger and + platform-specific implementations of `ftsystem' in order to be able + to debug memory allocations on Unix, VMS and Amiga too! + + * src/pshinter/pshalgo2.c (psh2_hint_table_record_mask): Removed + some bogus warnings. + + * include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c: + Modified the debugging memory manager to report the location (source + file name + line number) where leaked memory blocks are allocated in + the source file. + + * src/base/ftdbgmem.c: New debugging memory manager. You must + define the FT_DEBUG_MEMORY macro in `ftoption.h' to enable it. It + will record every memory block allocated and report simple errors + like memory leaks and double deletes. + + * src/base/Jamfile: Include ftdbgmem. + * src/base/rules.mk: Ditto. + * src/base/ftbase.c: Include ftdbgmem.c. + + * include/freetype/config/ftoption.h: Added the FT_DEBUG_MEMORY + macro definition. + + * src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory): Modified the + base component to use the debugging memory manager when the macro + FT_DEBUG_MEMORY is defined. + +2001-10-21 Tom Kacvinsky + + * src/cff/cffload.c (CFF_Done_Font): Free subfonts array only if + we are working with a CID keyed CFF font. Otherwise, a variable + that was never allocated memory might freed. This is a correction + to the previous patch for freeing subfonts. + +2001-10-21 Tom Kacvinsky + + * src/cff/cffload.c (CFF_Done_Font): Free the subfonts array to + avoid a memory leak. + +2001-10-21 David Turner + + * src/pshinter/pshalgo2.c, src/pshinter/pshalgo1.c, + src/pshinter/pshglob.c: Removing compiler warnings in pedantic modes + (in multi-object compilation mode, mainly). + +2001-10-20 Tom Kacvinsky + + * src/type1/t1load.c (parse_encoding): Add a test to make sure + that custom encodings (i.e., neither StandardEncoding nor + ExpertEncoding) are not loaded twice when the Type 1 font is + synthetic. + + * src/type1/t1load.c (parse_font_name, parse_subrs): Added a test + for when loading synthetic fonts to make sure that the font name + and subroutines are not loaded twice. This is to remove a memory + leak that occurred because the original memory blocks for these + objects were not deallocated when the objects were parsed the + second time. + +2001-10-19 David Turner + + * src/smooth/ftgrays.c, src/pshinter/pshglob.h, + src/pshinter/pshrec.c, src/pshinter/pshalgo2.c: Getting rid of + compiler warnings. + + * src/pshinter/module.mk, src/pshinter/rules.mk: Adding control + files to build the PostScript hinter with the `old' build system. + +2001-10-19 Jacob Jansen + + * descrip.mms, src/pshinter/descrip.mms: Updates to the VMS build + files. + +2001-10-18 David Turner + + * src/psnames/pstables.h, src/tools/glnames.py: Rewrote the + `glnames.py' script used to generate the `pstables.h' header file. + The old one contained a serious bug that made FreeType return + incorrect glyph names for certain glyphs. + + * src/truetype/ttdriver.c (Set_Char_Sizes): Changing computation of + pixel size from character size to use rounding. This is an + experiment to see whether this gives values similar to Windows for + scaled ascent/descent/etc. + + * src/base/ftcalc.c (FT_Div64by32): Changed the implementation + slightly since the original code was mis-compiled on Mac machines + using the MPW C compiler. + + * src/base/ftobjs.c (FT_Realloc): When a memory block was grown + through FT_Realloc(), the new bytes were not set to 0, which created + some strange bugs in the PostScript hinter. + (destroy_face): Don't deallocate unconditionally. + + * src/cid/cidgload.c (CID_Compute_Max_Advance, CID_Load_Glyph): + Adding support to new PostScript hinter. + + * include/freetype/internal/psglobal.h, + include/freetype/internal/pshints.h, + include/freetype/config/ftmodule.h, src/pshinter/Jamfile, + src/pshinter/pshalgo.h, src/pshinter/pshalgo1.h, + src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.h, + src/pshinter/pshalgo2.c, src/pshinter/pshglob.h, + src/pshinter/pshglob.c, src/pshinter/pshinter.c, + src/pshinter/pshmod.c, src/pshinter/pshmod.h, src/pshinter/pshrec.c, + src/pshinter/pshrec.h: Adding new PostScript hinter module. + + * include/freetype/internal/ftobjs.h, + include/freetype/internal/internal.h, + include/freetype/internal/psaux.h, + include/freetype/internal/t1types.h, src/psaux/psobjs.c, + src/psaux/psobjs.h, src/psaux/t1decode.h, src/psaux/t1decode.c, + src/type1/t1driver.c, src/type1/t1gload.c, src/type1/t1objs.c, + src/type1/t1objs.h: Updates to use the new PostScript hinter. + + * tests/Jamfile, tests/gview.c: Adding a new glyph hinting + viewer/debugger to the source tree. Note that you will _not_ be + able to compile it since it depends on an unavailable graphics + library named `Nirvana' to render vector images. + +2001-10-17 David Turner + + + * Version 2.0.5 released. + ========================= + + + * include/freetype/freetype.h, include/internal/ftobjs.h, + src/base/ftobjs.c, src/type1/t1driver.c: Adding a new function named + 'FT_Get_Postscript_Name' to retrieve the PostScript name of a given + font. Should work with all formats except pure CFF/CEF fonts (this + will be added soon). + + * src/cid/cidriver (cid_get_postscript_name): New function. + (CID_Get_Interface): Handle `postscript_name' interface. + + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): New function. + (SFNT_Get_Interface): Handle `postscript_name' interface. + + * src/type1/t1driver.c (t1_get_ps_name): New function. + (Get_Interface): Handle `postscript_name' interface. + + * README, docs/CHANGES: Updated for 2.0.5 release. + +2001-10-08 David Turner + + Fixed a bug in `glnames.py' that prevented it from generating + correct glyph names tables. This resulted in the unavailability of + certain glyphs like `Cacute', `cacute' and `lslash' in Unicode + charmaps, even if these were present in the font (causing problems + for Polish users). + + * src/tools/glnames.py (mac_standard_names): Fixed. + (t1_standard_strings): Some fixes and renamed to ... + (sid_standard_names): This. + (t1_expert_encoding): Fixed. + (the_adobe_glyph_list): Renamed to ... + (adobe_glyph_names): This. + (the_adobe_glyphs): Renamed to ... + (adobe_glyph_values): This. + (dump_mac_indices, dump_glyph_list, dump_unicode_values, main): + Updated. + * src/psnames/pstables.h: Regenerated. + * src/psnames/psmodule.c (PS_Unicode_Value): Fix offset. + Fix return value. + Use `sid_standard_table' and `ps_names_to_unicode' instead of + `t1_standard_glyphs' and `names_to_unicode'. + (PS_Macintosh_Name): Use `ps_glyph_names' instead of + `standard_glyph_names'. + (PS_Standard_Strings): Use `sid_standard_names' instead of + `t1_standard_glyphs'. + + * doc/BUGS, doc/TODO: New documents. + +2001-10-07 Richard Barber + + * src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented + correct LRU behaviour. + +2001-10-07 David Turner + + setjmp() and longjmp() are now used for rollback (i.e. when memory + pool overflow occurs). + + Function names are now all uniformly prefixed with `gray_'. + + * src/smooth/ftgrays.c: Include . + (ErrRaster_MemoryOverflow): New macro. + (TArea): New type to store area values in each cell (using `int' was + too small on 16-bit systems). is included to properly + get the needed data type. + (TCell, TRaster): Use it. + (TRaster): New element `jump_buffer'. + (gray_compute_cbox): Use `RAS_ARG' as the only parameter and get + `outline' from it. + (gray_record_cell): Use longjmp(). + (gray_set_cell): Use gray_record_cell() for error handling. + (gray_render_line, gray_render_conic, gray_render_cubic): Simplify. + (gray_convert_glyph_inner): New function, using setjmp(). + (gray_convert_glyph): Use it. + +2001-10-07 David Turner + + Provide a public API to manage multiple size objects for a given + FT_Face in the new header file `ftsizes.h'. + + * include/freetype/ftsizes.h: New header file, + * include/freetype/internal/ftobjs.h: Use it. + Remove declarations of FT_New_Size and FT_Done_Size (moved to + ftsizes.h). + * include/freetype/config/ftheader.h (FT_SIZES_H): New macro. + * src/base/ftobjs.c (FT_Activate_Size): New function. + * src/cache/ftcmanag.c: Include ftsizes.h. + (ftc_manager_init_size, ftc_manager_flush_size): Use + FT_Activate_Size. + +2001-09-20 Detlef Würkner + + * builds/amiga/*: Added port to Amiga with the SAS/C compiler. + +2001-09-15 Detlef Würkner + + * src/type1/t1afm.c (T1_Done_AFM): Free `afm'. + +2001-09-10 Yao Zhang + + * src/sfnt/ttcmap.c (code_to_index2): Handle code values with + hi-byte == 0 correctly. + +2001-09-10 Werner Lemberg + + * builds/link-std.mk ($(PROJECT_LIBRARY)): Fix typo. + +2001-08-30 Martin Muskens + + * src/type1/t1load.c (parse_font_matrix): A new way to compute the + units per EM with greater accuracy (important for embedded T1 fonts + in PDF documents that were automatically generated from TrueType + ones). + + * src/type1/t1load.c (is_alpha): Now supports `+' in font names; + this is used in embedded fonts. + + * src/psaux/psobjs.c (PS_Table_Add): Fixed a reallocation bug that + generated a dangling pointer reference. + +2001-08-30 Anthony Feik + + * src/type1/t1afm.c (T1_Read_Afm): Now correctly sets the flag + FT_FACE_FLAG_KERNING when appropriate for Type1 + AFM files. + +2001-08-25 Werner Lemberg + + * src/sfnt/ttload.c (TT_Load_CMap): Fix frame length of + `cmap_rec_fields'. + + * include/freetype/fterrors.h [!FT_CONFIG_OPTION_USE_MODULE_ERRORS]: + Undefine FT_ERR_BASE before defining again. + +2001-08-22 Werner Lemberg + + * src/truetype/ttinterp.h: Fix prototype of TT_Move_Func. + +2001-08-21 Werner Lemberg + + * builds/dos/dos-def.mk (NO_OUTPUT): Don't use `&>' but `>'. + +2001-08-21 David Turner + + * include/freetype/config/ftoption.h: Changed the default setting + for FT_CONFIG_OPTION_USE_MODULE_ERRORS to undefined, since it breaks + source compatibility in a few cases. Updated the comment to explain + that too. + +2001-08-17 Martin Muskens + + * src/base/ftcalc.c (FT_MulDiv): Fixed serious typo. + +2001-08-12 Werner Lemberg + + Updating to OpenType 1.3. + + * include/freetype/internal/tttypes.h (TT_CMap0, TT_CMap2, TT_CMap4, + TT_CMap6): Adding field `language'. + (TT_CMapTable): Removing field `language'. + Type of `length' field changed to FT_ULong. + Adding fields for cmaps format 8, 10, and 12. + (TT_CMapGroup): New auxiliary structure. + (TT_CMap8_12, TT_CMap10): New structures. + * include/freetype/tttables.h (TT_HoriHeader, TT_VertHeader): + Removed last element of `Reserved' array. + * include/freetype/ttnameid.h (TT_PLATFORM_CUSTOM, TT_MS_ID_UCS_4, + TT_NAME_ID_CID_FINDFONT_NAME): New macros. + + * src/sfnt/ttcmap.c (TT_CharMap_Load): Updated loading of `language' + field to the new structures. + Fixed freeing of arrays in case of unsuccessful loads. + Added support for loading format 8, 10, and 12 cmaps. + (TT_CharMap_Free): Added support for freeing format 8, 10, and 12 + cmaps. + (code_to_index4): Small improvement. + (code_to_index6): Ditto. + (code_to_index8_12, code_to_index10): New functions. + * src/sfnt/ttload.c (TT_Load_Metrics_Header): Updated to new + structure. + (TT_Load_CMap): Ditto. + + * src/sfnt/sfobjs.c (tt_encodings): Add MS UCS4 table (before MS + Unicode). + +2001-08-11 Werner Lemberg + + * src/type1/t1driver.c (t1_get_name_index): Fix compiler warning. + +2001-08-09 Tom Kacvinsky + + * src/cff/cffdrivr.c (get_cff_glyph_name): Renamed to + cff_get_glyph_name for consistency. + + (cff_get_glyph_index): Minor documentation change. + + * src/type1/t1driver.c (t1_get_name_index): New function used in + Get_Interface as the function returned when the `name_index' + function is requested. + + (get_t1_glyph_name): Renamed to t1_get_glyph_name for consistency. + +2001-08-08 Tom Kacvinsky + + * src/cff/cffload.c: Removed definitions of cff_isoadobe_charset, + cff_expert_charset, cff_expertsubset_charset, cff_standard_encoding, + and cff_expert_encoding arrays to cffload.h. + + * src/cff/cffload.h: Added definitions of cff_isoadobe_charset, + cff_expert_charset, cff_expertsubset_charset, cff_standard_encoding, + and cff_expert_encoding arrays. + + * src/cff/cffdrivr.c (cff_get_name_index): New function, returned + when `cff_get_interface' is called with a request for the + `name_index' function. + + (cff_get_interface): Modified so that it returns the function + `cff_get_name_index' when the `name_index' function is requested. + + * src/base/ftobjs.c (FT_Get_Name_Index): New function, used to + return a glyph index for a given glyph name only if the driver + supports glyph names. + + * include/freetype/internal/ftobjs.h (FT_Name_Index_Requester): + New function pointer type definition used in the function + FT_Get_Name_Index. + + * include/freetype/freetype.h (FT_Get_Name_Index): Added + documentation and prototype. + +2001-07-26 Werner Lemberg + + * builds/cygwin/*: Removed. Use the unix stuff instead. + +2001-07-26 Jouk Jansen + + * builds/vms/ftconfig.h (FT_CALLBACK_DEF): Updated to change dated + 2001-06-27. + +2001-07-17 Werner Lemberg + + * include/freetype/internal/psaux.h (PS_Table): Use FT_Offset for + `cursor' and `capacity'. + * src/psaux/psobjc.c (reallocate_t1_table): Use FT_Long for second + parameter. + (PS_Table_Add): Use FT_Offset for `new_size'. + + Add support for version 0.5 maxp tables. + + * src/sfnt/ttload.c (TT_Load_MaxProfile): Implement it. + (TT_Load_OS2): Initialize some values. + +2001-07-13 Werner Lemberg + + * src/base/ftsynth.c: Include ftcalc.h unconditionally. + +2001-07-07 David Turner + + * src/truetype/ttgload.c, src/truetype/ttinterp.c, src/pcf/pcfread: + Removed pedantic compiler warnings when the bytecode interpreter is + compiled in. + +2001-07-03 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_align_weak_points): Remove + unused variable `edges'. + (ah_hinter_load): Remove unused variables `old_width' and + `new_width'. + * src/cid/cidload.c (cid_decrypt): Use `U' for constant (again). + * src/psaux/psobjs.c (T1_Decrypt): Ditto. + * src/type1/t1parse.c (T1_Get_Private_Dict): Ditto. + +2001-06-28 David Turner + + * include/internal/ftstream.h: Modified the definitions + of the FT_GET_XXXX and NEXT_XXXX macros for 16-bit correctness. + +2001-06-26 Werner Lemberg + + * src/cid/cidload.c, src/cid/cidload.h (cid_decrypt): Use FT_Offset + instead of FT_Int as type for `length' parameter. + * include/freetype/internal/psaux.h (PSAux_Interface): Updated. + +2001-06-27 Wolfgang Domröse + + * src/psaux/psobjs.c, src/psaux/psobjs.h (T1_Decrypt): Use FT_Offset + instead of FT_Int as type for `length' parameter. + + + * Version 2.0.4 released. + ========================= + + +2001-06-27 David Turner + + * builds/unix/ftconfig.in: Changed the definition of the + FT_CALLBACK_DEF macro. + + * include/freetype/ftconfig.h, src/*/*.c: Changed the definition and + use of the FT_CALLBACK_DEF macro in order to support 16-bit + compilers. + + * builds/unix/ftconfig.in: Changed the definition of the + FT_CALLBACK_DEF macro. + + * src/sfnt/ttload.c (TT_Load_Kern): The kern table loader now ensures + that the kerning table is correctly sorted (some problem fonts don't + have a correct kern table). + +2001-06-26 Wolfgang Domröse + + * include/freetype/internal/ftstream.h (FT_GET_OFF3_LE): Fix typo. + +2001-06-24 David Turner + + * src/base/ftcalc.c (ft_div64by32): Fixed the source to work + correctly on 16-bit systems. + +2001-06-23 Anthony Fok + + * debian/*: Added Debian package build directory for 2.0.4. + +2001-06-22 David Turner + + * docs/PATENTS: Added patents disclaimer. This one was missing! + + * docs/CHANGES, docs/todo: Updated for the upcoming 2.0.4 release. + +2001-06-20 Werner Lemberg + + * include/freetype/config/ftconfig.h: Add two more `L's to + constants. + Add missing semicolons. + + * builds/toplevel.mk: Do similar change as for + builds/unix/detect.mk. + + * include/freetype/freetype.h (FT_ENC_TAG): New version to make it + easier to redefine. + * include/freetype/ftimage.h (FT_IMAGE_TAG): Ditto. + + * src/pcf/pcfread.c (pcf_get_encodings): Add cast. + +2001-06-19 David Turner + + * builds/win32/visualc/freetype.dsp, builds/win32/visualc/index.html: + Updated the Visual C++ project (for the 2.0.4 release). + + * builds/unix/detect.mk: Added rule for AIX detection (which uses + /usr/sbin/init instead of /sbin/init). + + * include/freetype/fterrors.h, src/*/*err*.h: Updated some of the + error macros to simplify handling of new error scheme. + +2001-06-19 Werner Lemberg + + * include/freetype/fttypes.h (FT_ERROR_MODULE): New macro. + +2001-06-19 David Turner + + Removing _lots_ of compiler warnings when the most pedantic warning + levels of Visual C++ and Borland C++ are used. Too many files to be + listed here, but FT2 now compiles without warnings with VC++ and the + `/W4' warning level (lint-style). + + * include/freetype/freetype.h (FT_New_Memory_Face): Updated + documentation. + * include/freetype/fttypes.h (FT_BOOL): New macro. + * include/freetype/internal/ftdebug.h: Add #pragma for Visual C++ + to suppress warning. + * include/freetype/internal/ftstream.h (FT_GET_SHORT_{BE,LE}, + FT_GET_OFF3_{BE,LE}, FT_GET_LONG_{BE,LE}): New macros. + (NEXT_*): Use them. + * src/autohint/ahglobal.c: Include FT_INTERNAL_DEBUG_H. + (FT_New_Memory_Face): Add `const' to function declaration. + +2001-06-18 Werner Lemberg + + Minor cleanups to remove compiler warnings. + + * include/freetype/cache/ftcmanag.h (FTC_MAX_BYTES_DEFAULT): Use + `L' for constant. + * include/freetype/config/ftoption.h (FT_RENDER_POOL_SIZE): Ditto. + * src/base/ftcalc.c (FT_MulDiv): Use `L' for constant. + * src/base/ftglyph.c (FT_Glyph_Get_CBox): Remove `error' variable. + * src/base/fttrigon.c (ft_trig_arctan_table): Use `L' for constants. + * src/base/ftobjs.c (FT_Done_Size): Fix return value. + (FT_Set_Char_Size, FT_Set_Pixel_Sizes, FT_Get_Kerning): Remove + unused `memory' variable. + * src/autohint/ahglyph.c (ah_get_orientation): Use `L' for constant. + * src/autohint/ahhint.c (ah_hint_edges_3, + ah_hinter_align_edge_points): Remove unused `before' and `after' + variables. + (ah_hinter_align_weak_points): Remove unused `edge_limit' variable. + (ah_hinter_load): Remove unused `new_advance', `start_contour', + and `metrics' variables. + * src/cff/cffload.c (CFF_Load_Encoding): Remove dead code to avoid + compiler warning. + * src/cff/cffobjs.c (CFF_Init_Face): Remove unused `base_offset' + variable. + * src/cff/cffgload.c (CFF_Parse_CharStrings): Remove unused + `outline' variable. + (cff_compute_bias): Use `U' for constant. + * src/cid/cidload.c (cid_decrypt): Ditto. + * src/psaux/psobjs.c (T1_Decrypt): Ditto. + * src/psaux/t1decode.c (T1_Decoder_Parse_CharStrings): Ditto. + * src/sfnt/ttload.c (TT_Load_Kern): Remove unused `version' + variable. + * src/sfnt/ttsbit.c (TT_Load_SBit_Image): Remove unused `top' + variable. + * src/truetype/ttgload.c (load_truetype_glyph): Remove unused + `num_contours' and `ins_offset' variables. + (compute_glyph_metrics): Remove unused `Top' and `x_scale' + variables. + (TT_Load_Glyph): Remove unused `memory' variable. + * src/smooth/ftgrays.c (grays_raster_render): Use `L' for constants. + +2001-06-18 Werner Lemberg + + Make the new error scheme source compatible with older FT versions + by introducing another layer. + + * include/freetype/fterrors.h (FT_ERRORDEF_, FT_NOERRORDEF_): New + macros. + (FT_NOERRORDEF): Removed. + * include/*/*err*.h: Use FT_ERRORDEF_ and FT_NOERRORDEF_. + +2001-06-16 Werner Lemberg + + * include/freetype/freetype.h (FT_ENC_TAG): New macro. + (FT_Encoding_): Use it. + * include/freetype/ftimage.h (FT_IMAGE_TAG): Define it + conditionally. + +2001-06-14 David Turner + + Modified the TrueType interpreter to let it use the new + trigonometric functions provided in `fttrigon.h'. This gets rid of + some old 64-bit computation routines, as well as many warnings when + compiling the library with the `long long' 64-bit integer type. + + * include/freetype/config/ftoption.h: Undefine + FT_CONFIG_OPTION_OLD_CALCS. + * include/freetype/internal/ftcalc.h: Rearrange use of + FT_CONFIG_OPTION_OLD_CALCS. + * src/base/ftcalc.c: Add declaration of FT_Int64 if + FT_CONFIG_OPTION_OLD_CALCS isn't defined. + * src/truetype/ttinterp.c: Use FT_TRIGONOMETRY_H. + (Norm): Add a special version if FT_CONFIG_OPTION_OLD_CALCS isn't + defined. + (Current_Ratio, Normalize): Simplify code. + +2001-06-11 Mike Owens + + * src/base/ftcalc.c (FT_MulDiv, FT_DivFix, FT_Sqrt64): Remove + compiler warnings. + +2001-06-08 Werner Lemberg + + * builds/unix/configure.in: Renamed to ... + * builds/unix/configure.ac: This to make sure that autoconf 2.50 is + needed. + Run `autoupdate' on it. + Increase `version_info' to 7:0:1. + * builds/unix/configure: Regenerated. + +2001-06-08 David Turner + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Fixed a bug that + corrupted transformed glyphs that were auto-hinted (the transform + was applied twice). + + Fixed a bug that returned an invalid linear width for composite + TrueType glyphs. + + * include/internal/tttypes.h (TT_Loader_): Two new elements `linear' + and `linear_def'. + * src/truetype/ttgload.c (load_truetype_glyph, + compute_glyph_metrics): Use it. + + * include/fttypes.h (FT_ERROR_BASE): New macro. + * src/base/ftobjs.c (FT_Open_Face, FT_Render_Glyph_Internal): Use it + to make source code work with the new error scheme implemented by + Werner. + * src/base/ftoutln.c (FT_Outline_Render): Ditto. + +2001-06-07 Werner Lemberg + + Updating to libtool 1.4.0 and autoconf 2.50. + + * builds/unix/ltconfig: Removed. + * builds/unix/ltmain.sh, builds/unix/configure.in, + builds/unix/aclocal.m4: Updated. + * builds/unix/configure: Regenerated. + +2001-06-06 Werner Lemberg + + Complete redesign of error codes. Please check ftmoderr.h for more + details. + + * include/freetype/internal/cfferrs.h, + include/freetype/internal/tterrors.h, + include/freetype/internal/t1errors.h: Removed. Replaced with files + local to the module. All extra error codes have been moved to + `fterrors.h'. + + * src/sfnt/ttpost.h: Move error codes to `fterrors.h'. + + * src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h, + src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h, + src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h, + src/smooth/ftsmerrs.h, src/truetype/tterrors.h, + src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the + error names for the module it belongs to. + + * include/freetype/ftmoderr.h: New file, defining the module error + offsets. Its structure is similar to `fterrors.h'. + + * include/freetype/fterrors.h (FT_NOERRORDEF): New macro. + (FT_ERRORDEF): Redefined to use module error offsets. + All internal error codes are now public; unused error codes have + been removed, some are new. + + * include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New + macro. + * include/freetype/config/ftoption.h + (FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro. + + All other source files have been updated to use the new error codes; + some already existing (internal) error codes local to a module have + been renamed to give them the same name as in the base module. + + All make files have been updated to include the local error files. + +2001-06-06 Werner Lemberg + + * src/cid/cidtokens.h: Replaced with... + * src/cid/cidtoken.h: This file for 8+3 consistency. + + * src/raster/ftraster.c: Use macros for header file names. + + * src/include/freetype/tttables.h (TT_HoriHeader_, TT_VertHeader_): + Fix length of `Reserved' array. Note that this isn't the real fix + since recent OpenType specs have introduced a `CaretOffset' field + instead of the first reserved byte. + +2001-05-29 Werner Lemberg + + * INSTALL: Minor fixes. + + + * Version 2.0.3 released. + ========================= + + +2001-05-29 David Turner + + * INSTALL, docs/CHANGES: Updated. + +2001-05-25 David Turner + + Moved several documents from the top-level to the `docs' directory. + + * src/base/ftcalc.c (FT_DivFix): Small fix to return value. + +2001-05-16 David Turner + + * src/truetype/ttgload.c (load_truetype_glyph): Fixed a bug in the + composite loader. Spotted by Keith Packard. + * src/base/ftobjs.c (FT_GlyphLoader_Check_Points, + FT_GlyphLoader_Check_Subglyphs): Ditto. + +2001-05-14 David Turner + + Fixed the incorrect blue zone computations, and improved the + composite support. Note that these changes result in improved + rendering, while sometimes introducing their own artefacts. This is + probably the last big change to the autohinter before the + introduction of a complete replacement. + + * src/autohint/ahglobal.c (sort_values): Fix loop. + * src/autohint/ahglyph.c: Removed some obsolete code. + (ah_outline_compute_edges): Modify code to set the ah_edge_round + flag. + (ah_outline_compute_blue_edges): Add code to compute active blue + zones. + * src/autohint/ahhint.c (ah_hinter_glyph_load): Change load_flags + value. + + * src/base/ftcalc.c (FT_DivFix): Fixed a bug in the 64-bit code that + created incorrect scale factors! + (FT_Round_Fix, FT_CeilFix, FT_FloorFix): Minor improvements. + +2001-05-12 Werner Lemberg + + * include/freetype/ftbbox.h: FTBBOX_H -> __FTBBOX_H__. + * include/freetype/fttrigon.h: __FT_TRIGONOMETRY_H__ -> + __FTTRIGON_H__. + Include FT_FREETYPE_H. + Beautified; added copyright. + * src/base/fttrigon.c: Beautified; added copyright. + +2001-05-11 David Turner + + * src/cff/cffparse.c (cff_parse_font_matrix), src/cid/cidload.c + (parse_font_matrix), src/type1/t1load.c (parse_font_matrix): Fixed + the incorrect EM size computation. + + * include/freetype/fttrigon.h, src/base/fttrigon.c: New files, + adding trigonometric functions to the core API (using Cordic + algorithms). + * src/base/ftbase.c, src/base/Jamfile, src/base/rules.mk: Use them. + + * builds/newline: New file. + * builds/top_level.mk, builds/detect.mk: Use it. This fixes + problems with Make on Windows 2000, as well as problems when `make + distclean' is invoked on a non-Unix platform when there is no + `config.mk' in the current directory. + + * builds/freetype.mk: Fixed a problem with object deletions under + Dos/Windows/OS/2 systems. + + Added new directory to hold tools and test programs. + + * docs/docmaker.py, docs/glnames.py: Moved to... + * src/tools/docmaker.py, src/tools/glnames.py: This place. + * src/tools/cordic.py: New file used to compute arctangent table + needed by fttrigon.c. + * src/tools/test_bbox.c, src/tools/test_trig.c: New test files. + + * src/tools/docmaker.py: Improved the script to add the current date + at the footer of each web page (useful to distinguish between + versions). + + * Jamfile: Fixed incorrect HDRMACRO argument. + + * TODO: Removed the cubic arc bbox computation note, since it has been + fixed recently. + * src/base/ftbbox.c (test_cubic_zero): Renamed to... + (test_cubic_extrema): This function. Use `UL' for unsigned long + constants. + + * include/freetype/t1tables.h, include/freetype/config/ftoption.h: + Formatting. + +2001-05-10 David Turner + + * src/base/ftobjs.c (FT_Open_Face): Fixed a small memory leak + which happened when trying to open 0-size font files! + +2001-05-09 Werner Lemberg + + * include/freetype/internal/ftcalc.h: Move declaration of + FT_SqrtFixed() out of `#ifdef FT_LONG64'. + +2001-05-08 Francesco Zappa Nardelli + + * src/pcfdriver.c (PCF_Load_Glyph): Fixed incorrect bitmap width + computation. + +2001-05-08 David Turner + + * docs/docmaker.py: Updated the DocMaker script in order to add + command line options (--output,--prefix,--title), fix the erroneous + line numbers reported during errors and warnings, and other + formatting issues. + + * src/base/ftcalc.c (FT_MulDiv, FT_MulFix, FT_DivFix): Various tiny + fixes related to rounding in 64-bits routines and + pseudo-`optimizations'. + +2001-04-27 David Turner + + * src/base/ftbbox.c (BBox_Cubic_Check): Fixed the coefficient + normalization algorithm (invalid final bit position, and invalid + shift computation). + +2001-04-26 Werner Lemberg + + * builds/unix/config.guess, builds/unix/config.sub: Updated to + latest versions from gnu.org. + + * builds/compiler/gcc-dev.mk: Add `-Wno-long-long' flag. + + * include/freetype/internal/ftcalc.h: Define FT_SqrtFixed() + unconditionally. + * src/base/ftbbox.c: Include FT_INTERNAL_CALC_H. + Fix compiler warnings. + * src/base/ftcalc.c: Fix (potential) compiler warnings. + +2001-04-26 David Turner + + * src/base/ftcalc.c (FT_SqrtFixed): Corrected/optimized the 32-bit + fixed-point square root computation. It is now used even with + 64-bits integers, as it is _much_ faster than calling FT_Sqrt64 :-) + + * src/base/ftbbox.c: Removed invalid `#include FT_BEZIER_H' line. + +2001-04-25 David Turner + + * src/base/ftbbox.c (BBox_Cubic_Check): Rewrote function to use + direct computations with 16.16 values instead of sub-divisions. It + is now slower, but proves a point :-) + + * src/raster/ftraster.c, src/smooth/ftgrays.c, src/base/ftbbox.c: + Fixed the Bézier stack depths. + + * src/base/ftcalc.c (FT_MulFix): Minor rounding fix. + + * builds/beos: Added BeOS-specific files to the old build system + (no changes were necessary to support BeOS in the Jamfile though). + +2001-04-20 David Turner + + * ftconfig.h, ftoption.h: Updated `ftconfig.h' to detect 64-bit int + types on platforms where Autoconf is not available). Also removed + FTCALC_USE_LONG_LONG and replaced it with + FT_CONFIG_OPTION_FORCE_INT64. + + * builds/win32/freetype.dsp: Updated the Visual C++ project file. + Doesn't create a DLL yet. + + * cffgload.c: Removed a compilation warning. + +2001-04-10 Tom Kacvinsky + + * t1load.c (parse_charstrings): Changed code for placing .notdef + glyph into slot 0 so that we no longer have a memory access + violation. + + * t1load.h: In structure T1_Loader, added swap_table (of type + PS_Table) to facilitate placing the .notdef glyph into slot 0. + +2001-04-10 Francesco Zappa Nardelli + + * src/pcf/pcfdriver.c (PCF_Get_Char_Index): Fix return value. + +2001-04-09 Laurence Withers + + * builds/dos/detect.mk: Add support for bash. + +2001-04-05 Werner Lemberg + + * builds/os2/*.mk: These files have been forgotten to update to + the structure of similar makefiles. + * builds/dos/*.mk: Ditto. + * builds/ansi/*.mk: Ditto. + + * builds/win32/win32-def.mk (BUILD): Fix typo. + + * builds/compiler/*.mk (CLEAN_LIBRARY): Don't use NO_OUTPUT. + This is already used in the link_*.mk files. + +2001-04-03 Werner Lemberg + + * src/*/Jamfile: Slight changes to make files more cryptic. + +2001-04-03 Werner Lemberg + + * Jamfile, src/Jamfile, src/*/Jamfile: Formatted. Slight changes + to give files identical structure. + +2001-04-02 Werner Lemberg + + * CHANGES: Reformatted, minor fixes. + * TODO: Updated. + * README: Formatting. + * include/freetype/freetype.h: Formatting. + + * Jamfile: Fix typo. + + * src/cff/cffparse.c: Move error code #defines to... + * include/freetype/internal/cfferrs.h: This file. + * src/cff/cffdrivr.c, src/cff/cffobjs.c, src/cff/cffload.c: Replaced + `FT_Err_*' with `CFF_Err_*'. + * src/cid/cidparse.c: Replaced `FT_Err_*' with `T1_Err_*'. + * src/psaux/psobjs.c, src/psaux/t1decode.c: Ditto. + * src/sfnt/sfobcs.c, src/sfnt/ttload.c: Replaced `FT_Err_*' with + `TT_Err_*'. + * src/truetype/ttgload.c, src/truetype/ttobjs.c: Ditto. + * src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1objs.c, + src/type1/t1parse.c: Replaced `FT_Err_*' with `T1_Err_*'. + + * include/freetype/internal/cfferrs.h: Add + `CFF_Err_Unknown_File_Format'. + * include/freetype/internal/t1errors.h: Add + `T1_Err_Unknown_File_Format'. + * include/freetype/internal/tterrors.h: Add + `TT_Err_Unknown_File_Format'. + + * src/cff/cffload.h: Add `cff_*_encoding' and `cff_*_charset' + references. + * src/psaux/psobjs.c: Include `FT_INTERNAL_TYPE1_ERRORS_H'. + + * src/cff/cffobjs.c (CFF_Init_Face, CFF_Done_Face): Use + FT_LOCAL_DEF. + * src/cid/cidobjs.c (CID_Done_Driver): Ditto. + * src/trutype/ttobjs.c (TT_Init_Face, TT_Done_Face, TT_Init_Size): + Ditto. + * src/type1/t1objs.c (T1_Done_Driver): Ditto. + * src/pcf/pcfdriver.c (PCF_Done_Face): Ditto. + * src/pcf/pcf.h: Use FT_LOCAL for `PCF_Done_Face'. + +2001-04-02 Tom Kacvinsky + + * src/sfnt/ttload.c (TT_Load_Metrics): Fix an improper pointer + dereference. Submitted by Herbert Duerr . + +2001-03-26 Tom Kacvinsky + + * include/freetype/config/ftconfig.h: Changed hexadecimal + constants to use suffix U to avoid problems with HP-UX's c89 + compiler. Submitted by G.W. Lucas . + +2001-03-24 David Turner + + * Jamrules, Jamfile, src/Jamfile, src/*/Jamfile: Adding jamfiles to + the source tree. See www.freetype.org/jam/index.html for details. + + + * Version 2.0.2 released. + ========================= + + +2001-03-20 Werner Lemberg + + * builds/win32/detekt.mk: Fix .PHONY target for Intel compiler. + +2001-03-20 David Turner + + * include/freetype/config/ftheader.h, include/freetype/ftsnames.h: + Renamed `ftnames.h' to `ftsnames.h', and FT_NAMES_H to + FT_SFNT_NAMES_H. + + * docs/docmaker.py: Added generation of INDEX link in table of + contents. + + * INSTALL, docs/BUILD: Updated documentation to indicate that the + compilation process has changed slightly (no more `src' required in + the include path). + + * builds/*/*-def.mk: Changed the objects directory from `obj' to + `objs'. + + * include/freetype/config/ftheader.h: Removed obsolete macros like + FT_SOURCE_FILE, etc. and added cache-specific macro definitions that + were previously defined in . Added comments to + be included in a new API Reference section. + + * src/*/*: Removed the use of FT_SOURCE_FILE, etc. Now, each + component needs to add its own directory to the include path at + compile time. Modified all `rules.mk' and `descrip.mms' + accordingly. + +2001-03-20 Werner Lemberg + + * builds/unix/configure.in: Add $ft_version. + * builds/unix/freetype-config.in: Use it. + * builds/unix/configure: Updated. + +2001-03-19 Tom Kacvinsky + + * src/type1/t1load.c (parse_font_matrix): Assign the units per em + value an unsigned short value, first by shifting right 16 bits, + then by casting the results to FT_UShort. + + * src/cff/cffparse.c (cff_parse_font_bbox): Assign the units per em + value an unsigned short value, first by shifting right 16 bits, + then by casting the results to FT_UShort. + +2001-03-17 David Turner + + * src/cid/cidobjs.c, src/cid/cidload.c, src/pcf/pcfread.c, + src/type1/t1load.c, src/type1/t1objs.c: Added a few casts to remove + compiler warnings in pedantic modes. + + * include/config/ft2build.h, include/config/ftheader.h: The file + `ft2build.h' was renamed to `ftheader.h' to avoid conflicts with the + top-level . + + * include/config/ftheader.h: Added new section describing the #include + macros. + +2001-03-17 Tom Kacvinsky + + * src/cff/cffparse.c (cff_parse_font_bbox): Obtain rounded FT_Fixed + values for the bounding box numbers. + + * src/cff/cffobjs.c (CFF_Init_Face): When processing a CFF/CEF font, + set `root->ascender' (`root->descender') to the integer part of + `root->bbox.yMax' (`root->bbox.yMin', respectively). + +2001-03-16 Tom Kacvinsky + + * src/cff/cffdrivr.c (get_cff_glyph_name): New function. Used in + cff_get_interface to facilitate getting a glyph name for glyph index + via FT_Get_Glyph_Name(). + + (cff_get_interface): Added support for getting a glyph name via the + `glyph_name' module interface. Uses the new function + get_cff_glyph_name(). + Submitted by Sander van der Wal . + + * src/cff/cffobjs.c (CFF_Init_Face): Logical or the face flags with + FT_FACE_FLAG_GLYPH_NAMES only if FT_CONFIG_OPTION_NO_GLYPH_NAMES is + not defined. This is to add support for getting a glyph name from a + glyph index via FT_Get_Glyph_Name(). + Submitted by Sander van der Wal . + + * src/cff/cffgload.c (CFF_Parse_CharStrings): Added support for + deprecated operator `dotsection'. + Submitted by Sander van der Wal . + +2001-03-12 Werner Lemberg + + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix error + messages. + + * INSTALL, docs/BUILD: We need GNU make 3.78.1 or newer. + +2001-03-12 Tom Kacvinsky + + * include/freetype/internal/psaux.h: Changed the lenIV member of + the T1_Decoder_ struct to be an FT_Int instead of an FT_UInt. + + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Adjust + for lenIV seed bytes at the start of a decrypted subroutine. + + * src/cid/cidload.c (cid_read_subrs): Decrypt subroutines only + if lenIV >= 0. + + * src/cid/cidgload.c (cid_load_glyph): Decrypt charstrings only + if lenIV >= 0. + +2001-03-11 Werner Lemberg + + * TODO: Updated. + + * src/pcf/pcfread.c: Put READ_Fields() always in a conditional to + avoid compiler warnings. + +2001-03-10 Tom Kacvinsky + + * TODO: New file. + + * include/freetype/freetype.h: Added prototypes and notes for + three new functions: FT_RoundFix, FT_CeilFix, and FT_FloorFix. + * src/base/ftcalc.c (FT_RoundFix, FT_CeilFix, FT_FloorFix): Added + implementation code. + + * src/cid/cidobjs.c (CID_Init_Face): Use calculated units_per_EM, + and if that is not available, default to 1000 units per EM. Changed + assignment code for ascender and descender values. + * src/cid/cidload.c (parse_font_matrix): Added units_per_EM + processing. + (parse_font_bbox): Changed to use FT_Fixed number handling. + + * src/type1/t1objs.c (T1_Init_Face): Changed the assignment code + for ascender, descender, and max_advance_width. + * src/type1/t1load.c (parse_font_bbox): Changed to use FT_Fixed + number handling. + +2001-03-10 Henrik Grubbström + + * src/*/*.c: Added many casts to make code more 64bit-safe. + +2001-03-07 Werner Lemberg + + * INSTALL, docs/BUILD: We need GNU make 3.78 or newer. + +2001-03-07 Tom Kacvinsky + + * src/type1/t1objs.c (T1_Init_Face): Minor correction: We must wait + until parse_font_bbox is changed before we use logical shift rights + in the assignments of `root->ascender', `root->descender', and + `root->max_advance_width'. + + (T1_Done_Face): Free `char_name' table to avoid a memory leak. + Submitted by Sander van der Wal . + +2001-03-05 Tom Kacvinsky + + * src/cff/cffgload.c (CFF_Load_Glyph): Set glyph control data to the + the Type 2 glyph charstring (used by conversion programs). + Submitted by Ha Shao . + +2001-03-04 Antoine Leca + + * include/freetype/ttnameid.h: Correct a stupid typo which prevented + correct compilation (TT_MS_LANGID_TIGRIGNA_ETHIOPIA appeared twice). + +2001-03-04 Werner Lemberg + + * src/autohint/ahtypes.h (AH_Hinter): Add elements + `disable_horz_edges', `disable_vert_edges'. + * src/autohint/ahhint.c (ah_hint_edges_3, ah_hinter_hint_edges): Use + them (and remove static variables with the same names). + * src/pcf/pcfutil.c (BitOrderInvert): Add `const'. + * docs/glnames.py: Updated to latest pstables.h changes. + + * builds/unix/detect.mk: Add test for Hurd. + * builds/hurd/detect.mk: Removed. + +2001-03-04 Sander van der Wal + + * src/psnames/pstables.h: Add more `const'. + * src/pcf/pcfutil.c: Ditto. + +2001-03-04 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Fixing typo + (FT_Glyph_Done -> FT_Done_Glyph). + +2001-03-01 Antoine Leca + + * include/freetype/ttnameid.h: Added some new Microsoft language + codes and LCIDs as found in Office Xp. + +2001-02-28 David Turner + + * builds/hurd/detect.mk: New file. Added support to detect the GNU + Hurd operating system as Unix-like. Fix submitted by Anthony Fok + . + + * src/type1/t1gload.c (T1_Load_Glyph): Set glyph control data to the + the Type 1 glyph charstring (used by conversion programs). + Submitted by Ha Shao . + +2001-02-22 David Turner + + * src/base/ftgrays.c (grays_sweep): The function didn't exit + immediately if `num_cells' was 0 as it should. Thanks to Boris for + finding this out. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Fixed memory leak when + bitmap rendering fails (thanks to Graham Asher). + +2001-02-13 Werner Lemberg + + * docs/docmaker.py (DocSection::add_element): Use + `self.print_error()'. + + * builds/unix/config.{guess,sub}: Updated (from ftp.gnu.org). + +2001-02-13 David Turner + + * docs/docmaker.py, include/freetype/*.h: Updated the DocMaker + script to support chapters and section block ordering. Updated the + public header files accordingly. + + * src/base/ftglyph.c (FT_Glyph_Copy): Advance width and glyph format + were not correctly copied. + +2001-02-08 Tom Kacvinsky + + * src/cff/cffparse.c (cff_parse_font_matrix): Removed an + unnecessary fprintf( stderr, ... ). + +2001-02-07 Tom Kacvinsky + + * src/type1/t1objs.c (T1_Init_Face): Added code to get the + units_per_EM from the value assigned in parse_font_matrix, if + available. Default to 1000 if not available. + + * src/cff/cffparse.c (cff_parse_font_matrix): Added logic to get + the units_per_EM from the FontMatrix. + + (cff_parse_fixed_thousand): New function. Gets a real number from + the CFF font, but multiplies by 1000 (this is to avoid rounding + errors when placing this real number into a 16.16 fixed number). + + (cff_parse_real): Added code so that the integer part is moved + into the high sixteen bits of the 16.16 fixed number. + + * src/cff/cffobjs.c (CFF_Init_Face): Added logic to get the units + per EM from the CFF dictionary, if available. + + * include/freetype/internal/cfftypes.h: In struct CFF_Font_Dict_, + added a units_per_em member to facilitate passing of units_per_em + from function cff_parse_font_matrix. + + * src/type1/t1load.c (is_alpha): Make `-' a legal alphanumeric + character. This is so that font names with `-' are fully parsed, + etc... + +2001-02-02 Werner Lemberg + + * src/psaux/psobjs.c (shift_elements): Remove if clause (which is + obsolete now). + + (reallocate_t1_table, PS_Table_Done): Replace REALLOC() with ALLOC() + + MEM_Copy() to avoid a memory bug. + +2001-02-01 David Turner + + * docs/docmaker.py: Improved the index sorting routine to place + capital letters before small ones. Added the `' marker to + section blocks in order to give the order of blocks. + +2001-01-30 Antoine Leca + + * include/freetype/ttnameid.h: Latest updates to Microsoft language + ID codes. + +2001-01-24 Tom Kacvinsky + + * src/cff/t1load.c (parse_font_matrix): Added heuristic to get + units_per_EM from the font matrix. + + (parse_dict): Deleted test to see whether the FontInfo keyword has + been seen. Deletion of this test allows fonts without FontInfo + dictionaries to be parsed by the Type 1 driver. + + (T1_Open_Face): Deleted empty subroutines array test to make sure + fonts with no subroutines still are parsed. + +2001-01-17 Francesco Zappa Nardelli + + * src/pcfread.c (pcf_get_properties, pcf_get_metrics, + pcf_get_bitmaps): Fix compiler errors. + +2001-01-11 David Turner + + * src/pcf/pcfread.c: Removed some compilation warnings related + to comparison of signed vs. unsigned integers. + + * include/freetype/internal/ftdebug.h: Changed the debug trace + constants from trace_t2xxxx to trace_cffxxxx to be able to compile + the CFF driver in debug mode. + +2001-01-11 Matthew Crosby + + * builds/unix/freetype-config.in: Fix problems with separate + --prefix and --exec-prefix. + +2001-01-11 David Turner + + * docs/docmaker.py: Added cross-references generation as well as + more robust handling of pathname wildcard matching. + +2001-01-10 Werner Lemberg + + * docs/docmaker.py: Minor improvements to reduce unwanted spaces + and empty lines in output. + +2001-01-09 David Turner + + * docs/docmaker.py: Improved script to generate table of contents + and index pages. It also supports wildcards on non Unix systems. + + * include/freetype/*.h, include/freetype/cache/*.h: Updated comments + to include section definitions/delimitations for the API Reference + generator. + + * include/freetype/freetype.h: Moved declaration of + `FT_Generic_Finalizer' and the `FT_Generic' structure to... + * include/freetype/fttypes.h: here. + +2001-01-04 Werner Lemberg + + * include/freetype/ttnameid.h: Updated Unicode code range comments. + +2001-01-03 Tom Kacvinsky + + * src/cff/rules.mk: Use cffgload.{c,h} instead of t2gload.{c,h}. + + * include/freetype/internal/internal.h: Changed to use cfftypes.h + (cfferrs.h) instead of t2types.h (t2errors.h, respectively). + + * include/freetype/internal/cfftypes.h: Merged in changes from + t2types.h and made this the canonical `types' header for the CFF + driver. + + * include/freetype/internal/t2types.h: This file was merged with + cfftypes.h and is no longer necessary. + + * include/freetype/internal/t2errors.h: Renamed to cfferrs.h. + + * src/cff/cffobjs.c, src/cff/cffobjs.h, src/cff/cffparse.c, + src/cff/cffdrivr.c, src/cff/cff.c, src/cff/cffload.c, + src/cff/cffgload.c, src/cff/cffgload.h: Changed to use + cffgload.{c,h} instead of t2gload.{c,h}. All occurrences of t2_ + (T2_) were replaced with cff_ (CFF_, respectively). + + * src/cff/t2gload.h: Renamed cffgload.h. + + * src/cff/t2gload.c: Renamed cffgload.c + +2000-01-02 Jouk Jansen + + * builds/vms: Support files for VMS architecture added. + * descrip.mms, src/*/descrip.mms: VMS makefiles added. + * README.VMS: New file. + +2000-01-01 Werner Lemberg + + * LICENSE.TXT: Added info about PCF driver license. + +2001-01-01 Francesco Zappa Nardelli + + * src/pcf/*: New driver module for PCF font format (used in + X Window System). + * include/freetype/internal/ftdebug.h (FT_Trace): Added values for + PCF driver. + * include/freetype/internal/pcftypes.h: New file. + * include/freetype/config/ftmodule.h: Added PCF driver module. + +2001-01-01 Werner Lemberg + + * src/winfonts/winfnt.c (FNT_Get_Char_Index): Fix parameter type. + +2000-12-31 Werner Lemberg + + * builds/modules.mk (clean_module_list): Fixed deletion of module + file in case `make make_module_list' is called before `make setup'. + +2000-12-30 Werner Lemberg + + * src/cff/cffload.c (CFF_Load_Charset): Improved error messages. + (CFF_Load_Charset, CFF_Load_Encoding): Remove unnecessary variable + definition. + +2000-12-30 Tom Kacvinsky + + * include/freetype/internal/t2types.h, + include/freetype/internal/cfftypes.h: Changed the structures for + CFF_Encoding and CFF_Encoding for the new implementations of the + charset and encoding parsers in the CFF driver. + + * src/cff/t2gload.c (t2_lookup_glyph_by_stdcharcode, + t2_operator_seac): Added these functions for use in implementing the + seac emulation provided by the Type 2 endchar operator. + (T2_Parse_CharStrings): Added seac emulation for the endchar + operator. + + * src/cff/cffload.c (CFF_Load_Encoding, CFF_Load_Charset, + CFF_Done_Encoding, CFF_Done_Charset): Extended to load and parse the + charset/encoding tables, and free the memory used by them when the + CFF driver is finished with them. Added tables + + cff_isoadobe_charset + cff_expert_charset + cff_expertsubset_charset + cff_standard_encoding + cff_expert_encoding + + so that the encoding/charset parser can handle predefined encodings and + charsets. + +2000-12-24 Tom Kacvinsky + + * src/cff/t2gload.c (T2_Load_Glyph): Added code so that the font + transform is applied. + + * src/cff/cffparse.c (cff_parse_font_matrix): Added code so that + the font matrix numbers are scaled by 1/(matrix->yy). Also, the + offset vector now contains integer values instead of 16.16 fixed + numbers. + +2000-12-22 Tom Kacvinsky + + * src/autohint/ahhint.c (ah_hinter_load_glyph): + Removed unnecessary comments and commented-out code. + +2000-12-21 David Turner + + * src/cid/cidafm.c, src/cid/cidafm.h: removed un-needed files, + we'll work on supporting CID AFM files later I guess :-) + +2000-12-21 Tom Kacvinsky + + * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph): + Changed so that fonts with a non-standard FontMatrix render + correctly. Previously, the first glyph rendered from such a + font did not have the transformation matrix applied. + +2000-12-17 Werner Lemberg + + * *.mk: Added lots of `.PHONY' targets. + +2000-12-17 Karsten Fleischer + + * *.mk: Implemented `platform' target to disable auto-detection. + +2000-12-14 Werner Lemberg + + * docs/design/modules.html: Removed. Covered by design-*.html. + + * INSTALL: Added info about makepp. + +2000-12-14 David Turner + + Added support for clipped direct rendering in the smooth renderer. + This should not break binary compatibility of existing applications. + + * include/freetype/fttypes.h, include/freetype/ftimage.h: Move + definition of the FT_BBox structure from the former to the latter. + * include/freetype/ftimage.h: Add `ft_raster_flag_clip' value to + FT_Raster_Flag enumeration. + Add `clip_box' element to FT_Raster_Params structure. + * src/smooth/ftgrays.c (grays_convert_glyph): Implement it. + + * INSTALL: Updated installation instructions on Win32, listing the + new `make setup list' target used to list supported + compilers/targets. + + * src/raster/ftraster.c (ft_black_render): Test for unsupported + direct rendering before testing arguments. + +2000-12-13 David Turner + + * include/freetype/config/ft2build.h, + include/freetype/internal/internal.h: Fixed header inclusion macros + to use direct definitions. This is the only way to do these things + in a portable way :-( The rest of the code should follow shortly + though everything compiles now. + + * builds/compiler/intelc.mk, builds/compiler/watcom.mk: New files. + + * builds/win32/detect.mk: Added support for the Intel C/C++ + compiler, as well as _preliminary_ (read: doesn't work!) support for + Watcom. Also added a new setup target. Type `make setup list' for + a list of supported command-line compilers on Win32. + + * src/base/ftdebug.c: Added dummy symbol to avoid empty file if + conditionals are off. + +2000-12-13 Werner Lemberg + + * builds/unix/ftsystem.c: Fixed typos. Fixed inclusion of wrong + ftconfig.h file. + +2000-12-12 Werner Lemberg + + * include/freetype/config/ft2build.h (FT2_ROOT, FT2_CONFIG_ROOT): + Removed. ANSI C doesn't (explicitly) allow macro expansion in + arguments using `##'. + (FT2_PUBLIC_FILE, FT2_CONFIG_FILE, FT2_INTERNAL_FILE): Use directory + names directly. Make them configurable. Use `##' to strip leading + and trailing spaces from arguments. + + * builds/unix/ft2unix.h: Adapted. + + * src/base/ftsystem.c (ft_alloc, ft_realloc, ft_free, ft_io_stream, + ft_close_stream): Use FT_CALLBACK_DEF. + + * builds/unix/ftsystem.c: Use new header scheme. + (FT_Done_Memory): Use free() from FT_Memory structure. + + * src/base/ftinit.c, src/base/ftmac.c: Header scheme fixes. + +2000-12-11 Werner Lemberg + + * include/freetype/config/ft2build.h (FT2_CONFIG_ROOT, + FT2_PUBLIC_FILE, FT2_CONFIG_FILE, FT2_INTERNAL_FILE, + FT_SOURCE_FILE): Use `##' operator to be really ANSI C compliant. + +2000-12-09 Werner Lemberg + + * builds/unix/detect.mk: Remove unused USE_CFLAGS variable. + +2000-12-08 Werner Lemberg + + * */*.h: Changed body inclusion macro names to start and end with + `__' (those which haven't converted yet). Fixed minor conversion + issues. + + * src/winfonts/winfnt.c: Updated to new header inclusion scheme. + + * src/truetype/ttinterp.c: Remove unused CALC_Length() macro. + +2000-12-07 David Turner + + * */*.[ch]: Changed source files to adhere to the new + header inclusion scheme. Not completely tested but works for now + here. + + * src/cff/t2driver.c: Renamed and updated to... + * src/cff/cffdrivr.c: New file. + * src/cff/t2driver.h: Renamed and updated to... + * src/cff/cffdrivr.h: New file. + * src/cff/t2load.c: Renamed and updated to... + * src/cff/cffload.c: New file. + * src/cff/t2load.h: Renamed and updated to... + * src/cff/cffload.h: New file. + * src/cff/t2objs.c: Renamed and updated to... + * src/cff/cffobjs.c: New file. + * src/cff/t2objs.h: Renamed and updated to... + * src/cff/cffobjs.h: New file. + * src/cff/t2parse.c: Renamed and updated to... + * src/cff/cffparse.c: New file. + * src/cff/t2parse.h: Renamed and updated to... + * src/cff/cffparse.h: New file. + * src/cff/t2tokens.h: Renamed and updated to... + * src/cff/cfftoken.h: New file. + + * src/cff/cff.c, src/cff/rules.mk: Updated. + +2000-12-06 David Turner + + * src/cache/ftlru.c (FT_Lru_Done): Fixed memory leak. + +2000-12-06 Werner Lemberg + + * builds/module.mk: Replaced `xxx #' with `xxx$(space). + * builds/os2/detekt.mk, builds/win32/detekt.mk: Moved comment to + avoid trailing spaces in variable. + * builds/freetype.mk: Use $(D) instead of $D to make statement more + readable. + + * docs/docmaker.py: Formatting. + +2000-12-05 David Turner + + * src/psaux/psauxmod.c: Fixed a broken inclusion of component + header files (an FT_FLAT_COMPILE test was missing). + + * src/cache/ftcmanag.c (FTC_Manager_Done): Fixed a bug that caused + an occasional crash when the function was called (due to a dangling + pointer). + + * src/base/ftsystem.c (FT_Done_Memory): Fixed an obvious bug: + The ANSI `free()' function was called instead of `memory->free()'. + + * docs/docmaker.py: Added section filtering, multi-page generation + (index page generation is still missing though). + +2000-12-04 David Turner + + * builds/unix/install.mk, builds/unix/ft2unix.h: The file `ft2unix.h' + is now installed as for Unix systems. Note that we + still use the `freetype2/freetype' installation path for now. + + * */*.[ch]: Now using as the default build and setup + configuration file in all public headers. Internal source files + still need some changes though. + + * builds/devel/ft2build.h, builds/devel/ftoption.h: Created a new + directory to hold all development options for both the Unix and + Win32 developer builds. + + * builds/win32/detect.mk, builds/win32/w32-bccd.mk, + builds/win32/w32-dev.mk: Changed the developer build targets to + `devel-gcc' and `devel-bcc' in order to be able to develop with the + Borland C++ compiler. + +2000-12-01 David Turner + + + * Version 2.0.1 released. + ========================= + + + * builds/unix/configure.in, builds/unix/configure, + builds/cygwin/configure.in, builds/cygwin/configure: Setting + `version_info' to 6:1:0 for the 2.0.1 release. + + * CHANGES: Added a summary of changes between 2.0.1 and 2.0. + + * builds/unix/ftconfig.in, builds/cygwin/ftconfig.in: Changes + to allow compilation under Unix with the Unix-specific config + files. + +2000-12-01 Werner Lemberg + + * INSTALL: Revised. + * builds/compiler/bcc-dev.mk, builds/compiler/visualage.mk, + builds/compiler/bcc.mk, builds/win32/w32-bcc.mk, + builds/win32/w32-bccd.mk: Revised. + * include/freetype/config/ftbuild.h, + include/freetype/internal/internal.h: Revised. + * include/freetype/ftimage.h: Updated to new header inclusion scheme. + +2000-11-30 Werner Lemberg + + * builds/toplevel.mk (.PHONY): Adding `distclean'. + * builds/unix/detect.mk (.PHONY): Adding `devel', `unix', `lcc', + `setup'. + +2000-11-30 David Turner + + * INSTALL: Slightly updated the quick starter documentation to + include IDE compilation, prevent against BSD Make, and specify `make + setup' instead of a single `make' for build configuration. + + * include/config/ftbuild.h, include/internal/internal.h: Added new + configuration files used to determine the location of all public, + configuration, and internal header files for FreeType 2. Modified + all headers under `include/freetype' to reflect this change. Note + that we still need to change the library source files themselves + though. + + * builds/compiler/bcc.mk, builds/compiler/bcc-dev.mk, + builds/win32/w32-bcc.mk, builds/win32/w32-bccd.mk, + builds/win32/detect.mk: Added new files to support compilation with + the free Borland C++ command-line compiler. Modified the detection + rules to recognize the new `bcc32' target in `make setup bcc32'. + + * src/sfnt/ttcmap.c, src/sfnt/ttpost.c, src/sfnt/ttsbit.c, + src/truetype/ttobjs.c, src/truetype/ttgload.c, + src/truetype/ttinterp.c: Fixed a few comparisons that Borland C++ + didn't really like. Basically, this compiler complains when FT_UInt + is compared to FT_UShort (apparently, it promotes `UShort' to `Int' + in these cases). + +2000-11-30 Tom Kacvinsky + + * t2objs.c (T2_Init_Face): Added calculation of `face->height' for + pure CFF fonts. + + * t1objs.c (T1_Init_Face): Fixed computation of `face->height'. + +2000-11-29 David Turner + + * src/base/ftbbox.c (BBox_Conic_Check): Fixed a really stupid + bug in the formula used to compute the conic Bézier extrema + of non-monotonous arcs. + +2000-11-29 Werner Lemberg + + * src/base/ftcalc.c (FT_SqrtFixed), src/base/ftobjs.c + (FT_Set_Renderer): Use FT_EXPORT_DEF. + * src/cache/ftcimage.c (FTC_Image_Cache_Lookup), + src/cache/ftcmanag.c (FTC_Manager_Done, FTC_Manager_Reset, + FTC_Manager_Lookup_Face, FTC_Manager_Lookup_Size, + FTC_Manager_Register_Cache), src/cache/ftcsbits.c + (FTC_SBit_Cache_Lookup): Ditto. + + * src/include/freetype/cache/ftcglyph.h (FTC_GlyphNode_Init), + src/include/freetype/ftmac.h (FT_New_Face_From_FOND): Use FT_EXPORT. + +2000-11-29 Werner Lemberg + + * src/sfnt/sfdriver.c: Include ttsbit.h and ttpost.h only + conditionally. + + * src/truetype/ttdriver.c (Set_Char_Sizes, Set_Pixel_Sizes): Set + `size->strike_index' only conditionally. + + * src/type1/t1driver.c, src/type1/t1objs.c: Include t1afm.h only + conditionally. + + * src/winfonts/winfnt.h: Move all type definitions to... + * src/include/freetype/internal/fnttypes.h: New file. + * src/winfonts/winfnt.c: Use it. + +2000-11-29 ??? ??? + + * include/freetype/internal/ftdebug.h: Replaced FT_CAT and FT_XCAT + with a direct solution (which also satisfies picky compilers). + +2000-11-28 YAMANO-UCHI Hidetoshi + + * src/truetype/ttobjs.c (TT_Init_Size): Fix #ifdef's to work with + disabled interpreter also. + + * src/base/ftnames.c (FT_Get_Sfnt_Name_Count): Fix incorrect + parentheses. + +2000-11-26 Tom Kacvinsky + + * src/cff/t2gload.c (T2_Parse_CharStrings): Added logic to glyph + width setting code to take into account even/odd argument counts + and glyph width operand before endchar/hmoveto/vmoveto. + +2000-11-26 Werner Lemberg + + * builds/ansi/ansi.mk: Fix inclusion order of files. + +2000-11-26 Keith Packard + + * src/type1/t1objs.c (T1_Init_Face): Compute style flags. + +2000-11-26 Werner Lemberg + + * builds/compiler/ansi-cc.mk (CLEAN_LIBRARY): Fix rule and + conditional. + +2000-11-23 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_charstrings): Use decrypt + function from PSAux module. + + * src/type1/t1parse.c (T1_Done_Parse): Renamed to... + (T1_Finalize_Parser): New function (to avoid name clash with a + function in the PSAux module). + (T1_Decrypt): Removed since it is duplicated in the PSAux module. + (T1_Get_Private_Dict): Added `psaux' as new parameter; use decrypt + function from PSAux module. + + * src/type1/t1parse.h: Adapted. + +2000-11-22 Tom Kacvinsky + + * src/cff/t2objs.c (T2_Init_Face): For pure CFF fonts, set + `root->num_faces' to `cff->num_faces' and set `units_per_EM' + to 1000. + + * src/cff/t2parse.c (parse_t2_real): Fixed real number parsing + loop. + + * src/cff/t2load.c (T2_Get_String): Called T2_Get_Name with a + sid that was off by one. + +2000-11-16 David Turner + + * src/autohint/ahtypes.h (AH_Hinter): Added new fields to control + auto-hinting of synthetic Type 1 fonts. + + * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph): + Added auto-hinting support of synthetic Type 1 fonts. + +2000-11-12 Tom Kacvinsky + + * src/sfnt/ttload.c (TT_LookUp_Table, TT_Load_Generic_Table): Change + tracing output. + + * src/sfnt/sfobjs.c (SFNT_Load_Face): Set boolean variable + `has-outline' to true only if the font has a `glyf' or `CFF ' table. + +2000-11-11 Werner Lemberg + + * builds/win32/visualc/freetype.dsp: Fix raster1->raster and + type1z->type1. + +2000-11-11 Tom Kacvinsky + + * builds/unix/freetype-config.in, builds/cygwin/freetype-config.in: + Added a --libtool option. When freetype-config --libtool is + invoked, the absolute path to the libtool convenience library + is returned. + +2000-11-11 Werner Lemberg + + * builds/cygwin/cygwin-def.in: Same fix as previous. + +2000-11-10 Tom Kacvinsky + + * builds/unix/unix-def.in: Add + + INSTALL_PROGRAM := @INSTALL_PROGRAM@ + INSTALL_SCRIPT := @INSTALL_SCRIPT@ + + so that installation of freetype-config does not fail. + +2000-11-10 Werner Lemberg + + * builds/cygwin/freetype-config.in, builds/unix/freetype-config.in: + Move test down for empty --exec-prefix. + Fix --version. + + * builds/cygwin/install.mk, builds/unix/install.mk: Use + $(INSTALL_SCRIPT) for installation of freetype-config. + + * builds/cygwin/install.mk: Fix clean target names. + +2000-11-09 David Turner + + + * Version 2.0 released. + ======================= + +---------------------------------------------------------------------------- + +Copyright 2000, 2001, 2002, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/alienblaster/project/jni/freetype/ChangeLog.21 b/alienblaster/project/jni/freetype/ChangeLog.21 new file mode 100644 index 000000000..d6371d175 --- /dev/null +++ b/alienblaster/project/jni/freetype/ChangeLog.21 @@ -0,0 +1,9439 @@ +2005-06-08 Werner Lemberg + + + * Version 2.1.10 released. + ========================== + + + * src/pcf/readme: Renamed to... + * src/pcf/README: This. + +2005-06-07 Detlef Würkner + + * builds/amiga/*: Added copyright notes, reworked some comments. + +2005-06-05 Werner Lemberg + + * Add copyright notices to all files which don't have one. + + * docs/license.txt: Renamed to... + * docs/LICENSE.TXT: This. + * docs/FTL.txt: Renamed to... + * docs/FTL.TXT: This. + * docs/GPL.txt: Renamed to... + * docs/GPL.TXT: This. + + * docs/PATENTS: Slightly reworded. Suggested by Sylvain Beucler + . + +2005-06-04 Werner Lemberg + + * include/freetype/ftimage.h (FT_Outline_MoveToFunc, + FT_Outline_LineToFunc, FT_Outline_ConicToFunc, + FT_Outline_CubicToFunc, FT_Raster_RenderFunc), + include/freetype/ftrender.h (FT_Glyph_TransformFunc, + FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Don't use + `const' to stay compatible with FreeType 2.1.9. + +2005-06-01 Adam D. Moss + + * src/base/ftstroke.c (ft_stroker_inside): Revert `sigma' patch from + 2004-07-11; this gives much better results under normal + circumstances. + +2005-05-30 Chia I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Minor + documentation improvements. + + * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix typos. + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Add support for bitmap + of pixel_mode FT_PIXEL_MODE_GRAY2 or FT_PIXEL_MODE_GRAY4. + If xstr is larger than 8 and bitmap is of pixel_mode + FT_PIXEL_MODE_MONO, set xstr to 8 instead of returning error. + +2005-05-29 Chia I Wu + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Fix emboldening bitmap + of mode FT_PIXEL_MODE_GRAY. Also add support for mode + FT_PIXEL_MODE_LCD and FT_PIXEL_MODE_LCD_V. + (ft_bitmap_assure_buffer): FT_PIXEL_MODE_LCD and FT_PIXEL_MODE_LCD_V + should have ppb (pixel per byte) 1. + Zero the padding when there's no need to allocate memory. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle slot->advance + too. + More suited emboldening strength. + +2005-05-28 Chia I Wu + + * src/base/ftbitmap.c (FT_Bitmap_Embolden): Handle negative pitch. + Handle FT_PIXEL_MODE_GRAY with num_gray != 256. + Improve speed for FT_PIXEL_MODE_GRAY. + (ft_bitmap_assure_buffer): Accept FT_PIXEL_MODE_LCD and + FT_PIXEL_MODE_LCD_V. + +2005-05-27 Chia I Wu + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Initialize `error'. + + * src/base/ftobjs.c (ft_cmap_done_internal): New function. + (FT_CMap_Done): Remove cmap from cmap list. + (destroy_charmaps, FT_CMap_New): Don't call FT_CMap_Done but + ft_cmap_done_internal. + +2005-05-26 Werner Lemberg + + * docs/GPL.txt: Update postal address of FSF. + +2005-05-26 Chia I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Improve + documentation. + + * src/base/ftsynth.c (FT_BOLD_THRESHOLD): Removed. + (FT_GlyphSlot_Embolden): Check whether slot is bitmap owner. + Always modify the metrics. + +2005-05-24 Werner Lemberg + + * docs/CHANGES: Updated. + +2005-05-24 Chia I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): New declaration. + + * include/freetype/ftoutln.h (FT_Outline_Embolden): New declaration. + + * src/base/ftbitmap.c (ft_bitmap_assure_buffer): New auxiliary + function. + (FT_Bitmap_Embolden): New function. + + * src/base/ftoutln.c (FT_Outline_Embolden): New function. + + * src/base/ftsynth.c: Don't include FT_INTERNAL_CALC_H and + FT_TRIGONOMETRY_H but FT_BITMAP_H. + (FT_GlyphSlot_Embolden): Use FT_Outline_Embolden or + FT_Bitmap_Embolden. + +2005-05-24 Werner Lemberg + + * configure: Always remove config.mk, builds/unix/unix-def.mk, and + builds/unix/unix-cc.mk. This fixes repeated calls of the script. + Reported by Nelson Beebe and Behdad Esfahbod. + + * README.CVS: Mention file permissions. + +2005-05-23 Werner Lemberg + + * builds/amiga/makefile.os4 (WARNINGS), builds/compiler/gcc-dev.mk + (CFLAGS), builds/compiler/gcc.mk (CFLAGS): Remove + -fno-strict-aliasing. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c -- + it is currently loaded from ttsbit.c. + +2005-05-23 Behdad Esfahbod + + Say you have `(Foo*)x' and want to assign, pass, or return it as + `(Bar*)'. If you simply say `x' or `(Bar*)x', then the C compiler + would warn you that type casting incompatible pointer types breaks + strict-aliasing. The solution is to cast to `(void*)' instead which + is the generic pointer type, so the compiler knows that it should + make no strict-aliasing assumption on `x'. But the problem with + `(void*)x' is that seems like in C++, unlike C, `void*' is not a + generic pointer type and assigning `void*' to `Bar*' without a cast + causes an error. The solution is to cast to `Bar*' too, with + `(Bar*)(void*)x' as the result -- this is what the patch does. + + * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), + include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Remove + cast on lvalue, use a temporary pointer instead. + Cast temporarily to (void*) to not break strict aliasing. + + * include/freetype/internal/ftmemory.h (FT_MEM_ALLOC, + FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, FT_MEM_FREE), + src/base/ftglyph.c (FT_Glyph_To_Bitmap): Cast temporarily to (void*) + to not break strict aliasing. + + * src/base/ftinit.c (FT_USE_MODULE): Fix wrong type information. + + * builds/unix/configure.ac (XX_CFLAGS): Remove -fno-strict-aliasing. + +2005-05-23 David Turner + + Fix Savannah bug #12213 (incorrect behaviour of the cache sub-system + in low-memory conditions). + + * include/freetype/cache/ftccache.h (FTC_CACHE_TRYLOOP, + FTC_CACHE_TRYLOOP_END): New macros. + + * src/cache/ftccache.c (FTC_Cache_NewNode), src/cache/ftcsbits.c + (ftc_snode_compare): Use FT_CACHE_TRYLOOP and FTC_CACE_TRYLOOP_END. + +2005-05-23 Werner Lemberg + + * src/base/rules.mk (BASE_SRC): Don't add ftsynth.c here but... + (BASE_EXT_SRC): Here. + +2005-05-22 Werner Lemberg + + * src/base/ftrfork.c (raccess_guess_apple_generic): Mark + `version_number' and `entry_length' as unused. + (raccess_guess_linux_double_from_file_name): Remove `memory'. + (raccess_make_file_name): Mark `error' as unused. + + * src/bdf/bdflib.c (_bdf_parse_properties): Remove `memory'. + + * src/cid/cidobjs.c (cid_face_init): Remove `psnames'. + + * src/sfnt/sfobjs.c (sfnt_load_face): Remove `memory'. + + * src/truetype/ttgxvar.c (ft_var_readpackedpoints, + ft_var_readpackeddeltas, ft_var_load_avar): Mark `error' as unused. + + * src/base/rules.mk (BASE_SRC): Add ftsynth.c. + +2005-05-21 David Turner + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Fix a bug that + produced unpleasant artefacts when trying to embolden very sharp + corners. + +2005-05-20 Werner Lemberg + + * docs/CHANGES: Updated. + +2005-05-20 Chia I Wu + + * src/base/ftbitmap.c: Don't include FT_FREETYPE_H and FT_IMAGE_H + but FT_BITMAP_H. + (FT_Bitmap_Copy): New function (from ftglyph.c). + + * include/freetype/ftbitmap.h (FT_Bitmap_Copy): New public + definition. + + * src/base/ftglyph.c: Include FT_BITMAP_H. + (ft_bitmap_copy): Move to ftbitmap.c. + (ft_bitmap_glyph_init): Remove `memory' variable. + Create new bitmap object if FT_GLYPH_OWN_BITMAP isn't set. + (ft_bitmap_glyph_copy): Use FT_Bitmap_Copy. + (ft_bitmap_glyph_done): Use FT_Bitmap_Done. + (ft_outline_glyph_init): Use FT_Outline_Copy. + + * src/base/ftoutln.c (FT_Outline_Copy): Handle source == target. + (FT_Outline_Done_Internal): Check for valid `memory' pointer. + (FT_Outline_Translate, FT_Outline_Reverse, FT_Outline_Render, + FT_Outline_Transform): Check for valid `outline' pointer. + + * src/base/ftobjs.c (FT_New_GlyphSlot): Prepend glyph slot to + face->glyph, otherwise a new second glyph slot cannot be created. + (FT_Done_GlyphSlot): Fix memory leak. + (FT_Open_Face): Updated -- face->glyph is already managed by + FT_New_GlyphSlot. + + * src/type42/t42objs.c (T42_GlyphSlot_Done): Updated. + +2005-05-20 Kirill Smelkov + + * include/freetype/ftimage.h (FT_Raster_Params), + include/freetype/ftoutln.h (FT_Outline_Translate, + FT_Outline_Transform), src/base/ftoutln.c (FT_Outline_Translate, + FT_Outline_Transform): Decorate parameters with `const' where + appropriate. + Update all callers. + + * src/raster/ftraster.c (ft_black_reset), src/smooth/ftgrays.c + (gray_raster_reset): Remove `const' from `pool_base' argument. + +2005-05-18 Kirill Smelkov + + * src/raster/ftmisc.h: New file. Only needed if ftraster.c is + compiled as stand-alone. + + * src/raster/ftraster.c: Add comment how to compile as stand-alone. + s/FT_CONFIG_OPTION_STATIC_RASTER/FT_STATIC_RASTER/. + s/TT_STATIC_RASTER/FT_STATIC_RASTER/. + [_STANDALONE_]: Include ftimage.h and ftmisc.h. + (FT_TRACE1, FT_TRACE6, ft_memset, FT_MEM_ZERO): Define + conditionally. + (Render_Glyph, Render_Gray_Glyph): Return Raster_Err_None (or + Raster_Err_Unsupported). + (ft_black_new) [_STANDALONE_]: Fix type of `the_raster'. + (ft_black_init, ft_black_reset, ft_black_set_mode, ft_black_render): + Use `ras', not `raster'. + (ft_black_done): Use FT_UNUSED_RASTER. + (Horizontal_Sweep_Init, Horizontal_Sweep_Step, + Horizontal_Gray_Sweep_Span): Use FT_UNUSED_RASTER. + +2005-05-18 Werner Lemberg + + * docs/announce: Start updating. + + * docs/CHANGES: Updated. + +2005-05-16 Vitaliy Pasternak + + * builds/win32/visualc/freetype.vcproj: Updated. + Exclude debug info for `Release' versions to reduce library size. + +2005-05-16 Werner Lemberg + + * src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this + is, ignore `aface' completely if face_index < 0. Reported by David + Osborn . + +2005-05-16 Kirill Smelkov + + * include/freetype/ftimage.h (FT_Outline_MoveToFunc, + FT_Outline_LineTo_Func, FT_Outline_ConicToFunc, + FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic, + gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to, + gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters + with `const' where appropriate. + +2005-05-11 Kirill Smelkov + + * include/freetype/ftimage.h (FT_Raster_RenderFunc), + include/freetype/ftrender.h (FT_Glyph_TransformFunc, + FT_Renderer_Render_Func, FT_Renderer_TransformFunc), + src/base/ftglyph.c (ft_outline_glyph_transform), + src/raster/ftrend1.c (ft_raster1_transform, ft_raster1_render), + src/smooth/ftgrays.c (FT_Outline_Decompose, gray_raster_render), + src/smooth/ftsmooth.c (ft_smooth_transform, + ft_smooth_render_generic, ft_smooth_render, ft_smooth_render_lcd, + ft_smooth_render_lcd_v): Decorate parameters with `const' where + appropriate. + + * src/raster/ftraster.c (RASTER_RENDER_POOL): Removed. Obsolete. + (ft_black_render): Decorate parameters with `const' where + appropriate. + +2005-05-11 Werner Lemberg + + * src/sfnt/ttcmap.c (tt_cmap4_set_range): Fix typo (FT_PEEK_SHORT -> + FT_PEEK_USHORT) which caused crashes. Reported by Ismail Donmez + . + +2005-05-08 Werner Lemberg + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_GLOBAL_SERVICE) + [__cplusplus]: Fix typo. + +2005-05-07 Werner Lemberg + + Handle unsorted SFNT type 4 cmaps correctly (reported by Dirck + Blaskey ). + + * src/sfnt/ttcmap.h (TT_CMap): Add member `unsorted'. + * src/sfnt/ttcmac.c: Use SFNT_Err_Ok where appropriate. + + (tt_cmap0_validate, tt_cmap2_validate, tt_cmap6_validate, + tt_cmap8_validate, tt_cmap10_validate, tt_cmap12_validate): Use + `FT_Error' as return type. + (tt_cmap4_validate): Use `FT_Error' as return type. + Return error code for unsorted cmap. + (tt_cmap4_char_index, tt_cmap4_char_next): Use old code for unsorted + cmaps. + (tt_face_build_cmaps): Set `unsorted' variable in cmap. + +2005-05-07 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_get_location): Fix typo. + +2005-05-06 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Set ppem value in top + dictionary for SFNT-based CFF. + +2005-05-05 Werner Lemberg + + Handle malformed `loca' table entries. + + * docs/TODO: Add some bugs which should be fixed. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add `glyf_len' + element. + + * src/truetype/ttpload.c (tt_face_load_loca): Get length of `glyf' + table. + (tt_face_get_location): Fix computation of `asize' for malformed + `loca' entries. + +2005-05-01 David Turner + + * Jamfile: Remove `otvalid' from the list of compiled modules. + + * include/freetype/internal/ftserv.h: Add compiler pragmas to get + rid of annoying warnings with Visual C++ compiler in maximum warning + mode. + + * src/autofit/afhints.c, src/autofit/aflatin.c, src/base/ftstroke.c, + src/bdf/bdfdrivr.c, src/cache/ftcbasic.c, src/cache/ftccmap.c, + src/cache/ftcmanag.c, src/cff/cffload.c, src/cid/cidload.c, + src/lzw/zopen.c, src/otvalid/otvgdef.c, src/pcf/pcfread.c, + src/sfnt/sfobjs.c, src/truetype/ttgxvar.c: Remove compiler warnings. + +2005-04-28 Werner Lemberg + + * docs/TODO: Updated. + +2005-04-24 Werner Lemberg + + * src/otvalid/otvcommn.c + (otv_GSUBGPOS_have_MarkAttachmentType_flag): Handle table == 0. + +2005-04-16 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Set default upem value in top + font dict also. + Handle font matrix settings in subfonts. + + * src/cff/cffgload.c (cff_slot_load): Use the correct font matrix + for CID-keyed fonts with subfonts. + + * docs/formats.txt: Updated. + +2005-04-14 Kirill Smelkov + + * include/freetype/freetype.h (FT_Vector_Transform), + include/freetype/ftimage.h (FT_Raster_Params), + include/freetype/ftoutln.h, src/base/ftoutln.c (FT_Outline_Get_CBox, + FT_Outline_Copy, FT_Outline_Transform, FT_Vector_Transform, + FT_Outline_Get_Bitmap), src/raster/ftraster.c (ft_black_render), + src/smooth/ftgrays.c (gray_raster_render): Decorate parameters with + `const' where appropriate. + +2005-04-14 Werner Lemberg + + * src/type1/t1load.c (parse_charstrings): Catch this non-standard + beginning of the /CharStrings dictionary: + + /CharStrings 118 dict def + Private begin + CharStrings begin + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Fix arguments + to call of tt_sbit_decoder_load_bitmap. + +2005-04-13 Werner Lemberg + + * docs/TODO: Updated. + + * autogen.sh: Use `--force' for all commands. + +2005-04-09 Werner Lemberg + + * src/pshinter/pshalgo.c (ps_hints_apply): Change scaling values + only if `fitted' is not zero. + +2005-04-06 Werner Lemberg + + * src/truetype/ttgload.c (tt_face_get_metrics) [FT_OPTIMIZE_MEMORY]: + Fix typo which sometimes causes wrong metrics for the last glyph. + +2005-04-04 David Turner + + * devel/ftoption.h, include/freetype/config/ftoption.h + (FT_OPTIMIZE_MEMORY): Comment out this macro for the upcoming 2.1.10 + release. + (*_CHESTER_*): Removed. No longer used. + + * src/autofit/afhints.c (af_axis_hints_new_segment, + af_axis_hints_new_edge): Small tweak to use less heap memory. + +2005-04-03 Werner Lemberg + + * src/type1/t1parse.c (T1_New_Parser): Relax the check for a valid + first line in the font. + +2005-04-03 Werner Lemberg + + * docs/CHANGES, include/freetype/freetype.h: Improve documentation + of FT_Set_Pixel_Sizes and FT_Set_Char_Size. + +2005-03-26 Detlef Würkner + + * builds/amiga/src/base/ftsystem.c (ft_amiga_stream_io): Fix buffer + offsets after a large read. + +2005-03-26 Werner Lemberg + + * src/autofit/afglobal.c (af_face_globals_get_metrics): + s/index/gidx/. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Fix compiler + warnings. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c. + + * src/sfnt/ttsbit0.h: Dummy file for build with `make'. + +2005-03-26 Detlef Würkner + + Update of the Amiga port. + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile: Included the base extension files + (ftbitmap.c, ftotval.c, ftpfr.c, ftstroke.c, ftxf86.c). + +2005-03-25 Detlef Würkner + + Update of the Amiga port. + + * builds/amiga/makefile, builds/amiga/smakefile: Handle new modules. + + * builds/amiga/makefile.os4: Makefile for AmigaOS4 SDK. + + * builds/amiga/README: Updated. + + * builds/amiga/include/freetype/config/ftconfig.h: Handle gcc for + AmigaOS4. + + * builds/amiga/include/freetype/config/ftmodule.h: Handle new + modules. + + * builds/amiga/src/base/ftdebug.c: Updated to current version of + default ftdebug.c. + Add various include files and macros to have proper support for + both AmigaOS4 and older AmigaOS versions. + Don't declare KVPrintF explicitly. + Replace getenv with GetVar. + Actually enable debugging code. + + * builds/amiga/src/base/ftsystem.c: Major rewrite. + +2005-03-23 Werner Lemberg + + * tests/*: Removed. + +2005-03-23 Werner Lemberg + + * docs/CHANGES, docs/INSTALL.ANY: Updated. + + * include/freetype/ftmoderr.h: Replace `Autohint' with `Autofit'. + Add `OTvalid'. + + * src/autofit/aferrors.h: New file. + + * src/autofit/afglobal.c, src/autofit/afhints.c, + src/autofit/aflatin.c, src/autofit/afloader.c: s/FT_Err_/AF_Err_/. + Include aferrors.h. + + * src/autofit/rules.mk (AUTOF_DRV_H): Include aferrors.h. + + * src/otvalid/otverror.h: s/FT_Mod_Err_OTV/FT_Mod_Err_OTvalid/. + +2005-03-22 David Turner + + * src/autohint/*: Removed. + * Jamfile: Updated. + +2005-03-15 David Turner + + * src/bdf/bdflib.c: Remove compiler warnings. + (hash_rehash, hash_init): Don't call FT_MEM_ZERO. + (_bdf_list_t): Add `memory' field. + (_bdf_list_init, _bdf_list_done, _bdf_list_ensure): New functions. + (_bdf_shift, _bdf_join): Rename to... + (_bdf_list_shift, _bdf_list_join): This. + (_bdf_split): Renamed to... + (_bdf_list_split): This. Use new functions. + (bdf_internal_readstream): Removed. + (NO_SKIP): New macro. + (_bdf_readstream): Rewritten. + (bdf_create_property, _bdf_add_comment): Improve allocation. + (_bdf_set_default_spacing, _bdf_parse_glyphs): Updated. Improve + allocation. + (_bdf_parse_properties, _bdf_parse_start): Updated. + (bdf_load_font): Updated to use new functions. + + * src/type1/t1parse.c (check_type1_format): New function. + (T1_New_Parser): Use it to check font header before allocating + anything on the heap. + + * src/type42/t42parse.c (t42_parser_init): Modify functions to check + the font header before allocating anything on the heap. + + * include/freetype/internal/ftmemory.h (FT_ARRAY_MAX, + FT_ARRAY_CHECK): New macros. + + * src/base/ftstream.c (FT_Stream_TryRead): New function. + * include/freetype/internal/ftstream.h: Updated. + + * src/pcf/pcfread.c (pcf_read_TOC), src/pcf/pcfutil.c + (BitOrderInvert, TwoByteSwap, FourByteSwap): Minor fixes and + simplifications. Try to protect the PCF driver from doing stupid + things with broken fonts. + + * src/lzw/ftlzw.c (FT_Stream_OpenLZW): Check the LZW header before + doing anything else. This avoids unnecessary heap allocations + (400KByte of heap memory for the LZW decoder). + + * src/gzip/ftgzip.c (FT_Stream_OpenGZip): Ditto for the gzip + decoder, although the code savings are smaller. + + * docs/CHANGES: Updated. + +2005-03-10 David Turner + + * src/tools/glnames.py: Add comment to explain the compression + being used for the Adobe Glyph List. + +2005-03-10 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_cvt, tt_face_load_fpgm): + Fix serious typo which prevented correct TT rendering. + + * include/freetype/internal/ftmemory.h: Undo change from 2005-03-03. + To suppress warnings it is sufficient to use `-fno-strict-aliasing'. + +2005-03-10 Werner Lemberg + + * src/tools/glnames.py: Formatted. + Format output to be in sync with other FreeType code. + Import `re' and `os.path'. + (StringTable) <__init__>: Add parameter to initialize master table + name. + (StringTable) : Don't pass master table name. + (StringTable) : Emit explanatory comment. + Simplify and make output more human readable. + (t1_bias, glyph_list, adobe_glyph_names): Removed. Unused. + (main): Use `basename' for file name in header. + + * src/psnames/pstables.h: Regenerated. + +2005-03-09 David Turner + + * src/tools/glnames.py: Rewrite the generator for the `pstables.h' + header file which contains various constant tables related to glyph + names. It now uses a different, more compact storage scheme that + saves about 20KB. This also closes Savannah bug #12262. + + * src/psnames/pstables.h: Regenerated. + + * src/psnames/psmodule.c (ps_unicode_value): Use + `ft_get_adobe_glyph_index', a new function defined in `pstables.h'. + (ps_get_macintosh_name, ps_get_standard_strings): Updated. + + * src/base/ftobjs.c (FT_Set_Char_Sizes): Handle fractional sizes + more carefully. This fixes Savannah bug #12263. + +2005-03-06 David Turner + + * src/otvalid/otvgsub.c, src/otvalid/otvgpos.c: Make static tables + constant. + + * src/autofit/aflatin.c (af_latin_metrics_init): Fix Savannah bug + #12212 (auto-hinter refuses to work if no Unicode charmap in font). + +2005-03-05 Werner Lemberg + + * autogen.sh: New script for bootstrapping. + + * README.CVS: New file which documents bootstrapping. + + * builds/unix/aclocal.m4, builds/unix/config.guess, + builds/unix/config.sub, builds/unix/configure, + builds/unix/ltmain.sh: Removed. + +2005-03-04 Werner Lemberg + + * src/base/ftutil.c: Include FT_INTERNAL_OBJECTS_H. + +2005-03-03 Werner Lemberg + + Various fixes for C and C++ compiling. + + * src/autofit/*: Add copyright messages. + + * src/autofit/afhints.c (af_glyph_hints_done): Don't use + `AF_Dimension' but `int' for loop counter. + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Don't use + `AF_Dimension' but `int' for loop counter. + Use proper enumeration value for `render_mode'. + (af_latin_metrics_scale_dim): Don't shadow variables. + (af_latin_hints_compute_segments): Use proper cast for `major_dir' + and `segment_dir'. + (af_latin_align_linked_edge, af_latin_hint_edges): Fix arguments of call to + `af_latin_compute_stem_width'. + (af_latin_hints_apply): Don't use `AF_Dimension' but `int' for loop + counter. + + * src/base/ftdbgmem.c (ft_mem_table_get_source, FT_DumpMemory): Use + proper cast for memory allocation. + + * src/cff/cffdrivr.c (cff_get_kerning): Use proper cast for + initialization of `sfnt'. + + * src/sfnt/sfdriver.c: Include `ttkern.h'. + + * src/sfnt/ttkern.c (tt_face_get_kerning): Don't shadow variables. + + * src/truetype/ttgload.c: Include `ttpload.h'. + +2005-03-03 David Turner + + * include/freetype/internal/ftmemory.h (FT_ALLOC, FT_REALLOC, + FT_QALLOC, FT_QREALLOC) [gcc >= 3.3]: Provide macro versions which + avoid compiler warnings. + (FT_NEW, FT_NEW_ARRAY, FT_RENEW_ARRAY, FT_QNEW, FT_QNEW_ARRAY, + FT_QRENEW_ARRAY, FT_ALLOC_ARRAY, FT_REALLOC_ARRAY): Updated. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_FIND_GLOBAL_SERVICE, FT_FACE_LOOKUP_SERVICE) [__cplusplus]: + Provide macro versions which avoid compiler warnings. + + * src/base/ftutil.c (ft_highpow2): New utility function. + + * include/freetype/internal/ftobjs.h: Updated. + + * src/pfr/pfrload.c (pfr_get_gindex, pfr_compare_kern_pairs, + pfr_sort_kerning_pairs): Don't define if FT_OPTIMIZE_MEMORY is set. + (pfr_phy_font_done): Don't handle `kern_pairs' if FT_OPTIMIZE_MEMORY + is set. + (pfr_phy_font_load): Don't call `pfr_sort_kerning_pairs' if + FT_OPTIMIZE_MEMORY is set. + + * src/pfr/pfrobjs.c (pfr_slot_load): Comment out some code which + doesn't work with broken fonts. + (pfr_face_get_kerning) [FT_OPTIMIZE_MEMORY]: Implement. + + * src/pfr/pfrtypes.h (PFR_KernItemRec): Optimize member types. + (PFR_NEXT_KPAIR): New macro. + (PFR_PhyFontRec): Don't define `kern_pairs' if FT_OPTIMIZE_MEMORY is + set. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Introduce + temporary variable to avoid gcc warning. + (tt_face_load_sbit_image): Mark unused variables with FT_UNUSED. + + * src/truetype/ttpload.c (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]: + Remove redundant variable. + + * include/freetype/config/ftmodule.h: Moving the order of drivers to + speed up font loading. The PCF and BDF loaders are still slow and + consume far too much memory. + +2005-03-03 Werner Lemberg + + * devel/ftoption.h: Updated to recent changes. + +2005-03-02 Werner Lemberg + + * src/autofit/afdummy.c, src/autofit/afdummy.h + (af_dummy_script_class): Fix type. + + * src/autofit/aflatin.c, src/autofit/aflatin.h + (af_latin_script_class): Fix type. + + * src/autofit/rules.mk (AUTOF_DRV_SRC): Fix typo. + +2005-03-01 David Turner + + * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning), + src/sfnt/ttsbit0.c (tt_face_load_sbit_strikes, + tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_compound, + tt_sbit_decoder_load_image), src/sfnt/ttload.c + (tt_face_load_metrics): Remove compiler warnings + -- redundant variables, missing initializations, etc. + + * src/sfnt/ttsbit.h: Handle FT_OPTIMIZE_MEMORY. + + * src/autofit/rules.mk, src/autofit/module.mk, + src/autofit/afangles.h: New files. + + * src/autofit/afhints.c (af_axis_hints_new_segment, + af_axis_hints_new_edge): New functions. + (af_glyph_hints_done): Do proper deallocation. + (af_glyph_hints_reload): Only reallocate points array. This + drastically reduces heap usage. + + * src/autofit/afhints.h (AF_PointRec, AF_SegmentRec): Optimize + member types and positions. + (AF_AxisHintsRec): Add `max_segments' and `max_edges'. + (af_axis_hints_new_segment, af_axis_hints_new_edge): New prototypes. + + * src/autofit/aflatin.c (af_latin_metricsc_scale): Don't call + AF_SCALER_EQUAL_SCALES. + (af_latin_hints_compute_segments): Change return type to FT_Error. + Update all callers. + Improve segment allocation. + (af_latin_hints_compute_edges): Change return type to FT_Error. + Update all callers. + Improve edge allocation and link handling. + (af_latin_hints_detect_features): Change return type to FT_Error. + Update all callers. + + * src/autofit/aflatin.h: Updated. + + * src/autofit/afloader.c (af_loader_load_g) + : Assure axis->num_edges > 1. This fixes + a bug with certain fonts. + + * include/freetype/config/ftmodule.h: The auto-fitter is now the + only supported auto-hinting module. + + * include/freetype/config/ftstdlib.h (FT_INT_MAX): New macro. + +2005-02-28 Werner Lemberg + + * src/truetype/ttpload.c (tt_face_load_loca): Fix typo. + + * src/sfnt/ttkern.c: Include `ttkern.h'. + (FT_COMPONENT): Updated. + + * include/freetype/internal/fttrace.h: Add entry for `ttkern'. + + * src/sfnt/ttsbit0.c: s/FT_Err_/SFNT_Err_/. + Decorate constants with `U' and `L' where necessary. + + * src/sfnt/ttcmap.c (tt_cmap4_next): Remove unused variable. + +2005-02-28 David Turner + + * src/base/ftdbgmem.c (FT_DumpMemory): Added sorting of memory + sources according to decreasing maximum cumulative allocations. + (ft_mem_source_compare): New auxiliary function. + + * src/sfnt/ttsbit0.c: New file, implementing a heap-optimized + embedded bitmap loader. + + * src/sfnt/ttsbit.c: Include `ft2build.h', FT_INTERNAL_DEBUG_H, + FT_INTERNAL_STREAM_H, FT_TRUETYPE_TAGS_H. + Load `ttsbit0.c' if FT_OPTIMIZE_MEMORY is set, otherwise use + file contents. + (tt_face_load_sbit_strikes): Set up root fields to indicate the + strikes. This fixes Savannah bug #12107. + Use `static' keyword for `sbit_line_metrics_field', + `strike_start_fields', `strike_end_fields'. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Define + `sbit_table', `sbit_table_size', `sbit_num_strikes' if + FT_OPTIMIZE_MEMORY is set. + Don't define `num_sbit_strikes' and `sbit_strikes' if + FT_OPTIMIZE_MEMORY is set. + + * src/cff/cffobjs.c (sbit_size_reset): Handle FT_OPTIMIZE_MEMORY. + + * src/sfnt/sfobjs.c (sfnt_load_face): Fixed bug that prevented + loading SFNT fonts without a `kern' table. + Properly pass root->face_flags. + Remove code for TT_CONFIG_OPTION_EMBEDDED_BITMAPS. + + * src/sfnt/sfdriver.c (sfnt_interface) + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Don't use `tt_find_sbit_image' + and `tt_load_sbit_metrics'. + + * src/sfnt/ttcmap.c: Optimize linear charmap scanning for Format 4. + (OPT_CMAP4): New macro. + (TT_CMap4Rec) [OPT_CMAP4]: New structure. + (tt_cmap4_init, tt_cmap4_set_range, tt_cmap4_next, tt_cmap4_reset) + [OPT_CMAP4]: New functions. + (tt_cmap4_char_next) [OPT_CMAP4]: Use `tt_cmap4_next' and + `tt_cmap4_reset'. + (tt_cmap4_class_rec) [OPT_CMAP4]: Use `TT_CMap4Rec' and + `tt_cmap4_init'. + + * src/truetype/ttobjs.c (Reset_SBit_Size): Handle + FT_OPTIMIZE_MEMORY. + + * src/autofit/afhints.h (AF_PointRec, AF_SegmentRec, AF_EdgeRec): + Optimize member types. + + * src/autofit/afloader.c (af_loader_done): Call + `af_glyph_hints_done'. + +2005-02-27 David Turner + + * src/sfnt/ttkern.c (tt_face_load_kern): Fix a small bug which + caused invalid (random) return values for the horizontal kerning. + +2005-02-25 David Turner + + Implement several memory optimizations to drastically reduce the + heap usage of FreeType, especially in the case of memory-mapped + files. The idea is to avoid loading and decoding tables in the + heap, and instead access the raw data whenever possible (i.e., when + it doesn't compromise performance). + + This has several benefits: For example, opening vera.ttf now uses + just a small amount of memory (even when the FT_Library footprint is + accounted for), until you start loading glyphs. Even then, you save + at least 20KB compared to the non-optimized case. Performance of + various operations, including open and close, has also been + dramatically improved. + + More optimizations to come, especially for the auto-hinter. + + * include/freetype/internal/sfnt.h (TT_Face_GetKerningFunc): New + function type. + (SFNT_Interface): Add it. + + * include/freetype/internal/tttypes.h (TT_HdmxEntryRec, TT_HdmxRec, + TT_Kern0_PairRec): Don't define if FT_OPTIMIZE_MEMORY is set. + (TT_FaceRec): Define `horz_metrics', `horz_metrics_size', + `vert_metrics', `vert_metrics_size', `hdmx_table', + `hdmx_table_size', `hdmx_record_count', `hdmx_record_size', + `hdmx_record_sizes', `kern_table', `kern_table_size, + `num_kern_tables', `kern_avail_bits', `kern_order_bits' if + FT_OPTIMIZE_MEMORY is set. + Don't define `hdmx', `num_kern_pairs', `kern_table_index', + `kern_pairs' if FT_OPTIMIZE_MEMORY is set. + + * src/base/ftdbgmem.c (ft_mem_table_set): Don't shadow variable. + Fix compiler warning. + + * src/cff/cffdrivr.c (Get_Kerning): Renamed to... + (cff_get_kerning): This. Simplify. + (cff_driver_class): Updated. + + * src/sfnt/Jamfile (_sources): Add `ttkern'. + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add `ttkern.c'. + + * src/sfnt/sfdriver.c (sfnt_interface): Add `tt_face_get_kerning'. + + * src/sfnt/sfnt.c: Include `ttkern.c'. + + * src/sfnt/sfobjs.c: Include `ttkern.h'. + (sfnt_load_face): Consider the `kern' and `gasp' table as optional. + (sfnt_done_face): Call `tt_face_done_kern'. + Handle horizontal metrics for FT_OPTIMIZE_MEMORY. + + * src/sfnt/ttkern.c, src/sfnt/ttkern.h: New files. Code has been + taken from `ttload.c' and `ttload.h'. + Provide special versions of `tt_face_load_kern', + `tt_face_get_kerning', and `tt_face_done_kern' for + FT_OPTIMIZE_MEMORY. + + * src/sfnt/ttload.c (tt_face_load_metrics, tt_face_load_hdmx, + tt_face_free_hdmx): Provide version for FT_OPTIMIZE_MEMORY. + (tt_face_load_kern, tt_kern_pair_compare, TT_KERN_INDEX): Moved to + `ttkern.c'. + + * src/sfnt/ttload.h: Updated. + + * src/sfnt/ttsbit.c (sbit_metrics_field): Add `static' keyword. + + * src/truetype/ttdriver.c (Get_Kerning): Renamed to... + (tt_get_kerning): This. Simplify. + (tt_driver_class): Updated. + + * src/truetype/ttgload.c (TT_Get_Metrics): Renamed to... + (tt_face_get_metrics): This. Provide version for FT_OPTIMIZE_MEMORY. + Update all callers. + (Get_Advance_Widths): Replaced with... + (Get_Advance_WidthPtr): This. Provide version for + FT_OPTIMIZE_MEMORY. + Update all callers. + + * src/truetype/ttgload.h: Updated. + +2005-02-22 David Turner + + * src/base/ftdbgmem.c: Partly rewritten. Added the ability to list + all allocation sites in the memory debugger. Also a new function + FT_DumpMemory() was added. It is only available in builds with + FT_DEBUG_MEMORY defined, and you must declare it in your own code to + use it, i.e., with something like: + + extern void FT_DumpMemory( FT_Memory ); + + ... + + FT_DumpMemory( memory ); + + * include/freetype/config/ftoption.h + (TT_CONFIG_OPTION_BYTECODE_INTERPRETER): Comment out definition -- + again. + (FT_OPTIMIZE_MEMORY): New configuration macro to control various + optimizations for reducing the heap footprint of memory-mapped + TrueType files. + + * include/freetype/internal/ftmemory.h (FT_ARRAY_ZERO): New + convenience macro. + + * include/freetype/internal/tttypes.h (TT_FaceRec) + [FT_OPTIMIZE_MEMORY]: Use optimized types for `num_locations' and + `glyph_locations'. + + * src/truetype/ttgload.c (load_truetype_glyph): Call + `tt_face_get_location'. + + * src/truetype/ttobjs.c (tt_face_init) + [FT_CONFIG_OPTION_INCREMENTAL]: Improve error handling. + (tt_face_done): Call `tt_face_done_loca'. + + * src/truetype/ttpload.c (tt_face_get_location, tt_face_done_loca): + New functions. If FT_OPTIMIZE_MEMORY is set, the locations table is + read directly from memory-mapped streams, instead of being decoded + into the heap. + (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]: New implementation. + (tt_face_load_cvt, tt_face_load_fpgm): Only load table if the + bytecode interpreter is compiled in. + + * src/truetype/ttpload.h: Updated. + + * src/autohint/ahglyph.c (ah_outline_load): Improve allocation + logic. + +2005-02-20 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.14. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.9.4. + + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at subversions.gnu.org. + +2005-02-14 Werner Lemberg + + * src/cff/cffcmap.c (cff_cmap_unicode_init): Don't try to build + a cmap for a CID-keyed font which doesn't have SIDs. + +2005-02-13 Werner Lemberg + + * src/type1/t1load.c (read_binary_data): Return more meaningful + value. + (parse_encoding, parse_subrs, parse_charstrings, parse_dict): Check + parser error value after call to T1_Skip_PS_Token (where necessary). + + * src/type1/t1parse.c (T1_Get_Private_Dict): Check parser error + value after call to T1_Skip_PS_Token. + + * src/cid/cidparse.c (cid_parser_new): Check parser error value + after call to cid_parser_skip_PS_token. + + * src/type42/t42parse.c (t42_parse_encoding, t42_parse_sfnts, + t42_parse_charstrings, t42_parse_dict): Check parser error value + after call to T1_Skip_PS_Token (where necessary). + + * src/psaux/psobjc.c (skip_string, ps_parser_skip_PS_token, + ps_tobytes): Add error messages. + +2005-02-12 Werner Lemberg + + * configure: Output more variables to the created Makefile so that + it can be used for ft2demos also (if the FT2DEMOS variable is + defined). + +2005-02-10 David Turner + + * src/pfr/pfrgload.c (pfr_glyph_load): Fix an unbounded growing + dynamic array when loading a glyph from a PFR font (Savannah bug + #11921). + + * src/base/ftbitmap.c (FT_Bitmap_Convert): Small improvements to the + conversion function (mainly stupid optimization). + + * src/base/Jamfile: Adding ftbitmap.c to the list of compiled files. + +2005-02-10 Werner Lemberg + + * builds/unix/freetype-config.in: Add new flag `--ftversion' to + return the FreeType version. Suggested by George Williams + . + + * docs/CHANGES: Updated. + +2005-02-09 Werner Lemberg + + * src/otvalid/otvmod.c (otv_validate): Deallocate arrays in case + of error. Reported by YAMANO-UCHI Hidetoshi . + +2005-02-08 Werner Lemberg + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) + : Accept `T1_Parse_Have_Moveto' state also which can + happen in empty glyphs. Reported by Ian Brown + (Savannah bug #11856). + +2005-02-04 Werner Lemberg + + * src/otlayout/*: Removed. Obsolete. + +2004-12-28 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.10. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.9.4. + * builds/unix/configure: Regenerated with autoconf 2.59b. + + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + + * builds/unix/install-sh: Updated from + `texinfo' CVS module at subversions.gnu.org. + + * builds/unix/ftsystem.c (FT_Stream_Open): Add proper cast for + ft_alloc. + Fix compiler warning. + +2004-12-27 Dirck Blaskey + + * src/cff/cffobjs.c (cff_face_init): Improve computation of + FT_STYLE_BOLD_FLAG. + +2004-12-27 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): A CFF within an SFNT can have + only a single font. This is undocumented but has been verified on + the opentype list. + +2004-12-26 Werner Lemberg + + * Jamfile (FT2_COMPONENTS): Add `otvalid'. + +2004-12-25 Werner Lemberg + + * src/base/ftbitmap.c (FT_Bitmap_Convert): Fix compiler warning. + +2004-12-15 Werner Lemberg + + * vms_make.com: Add ftbitmap.obj. + +2004-12-14 Werner Lemberg + + * src/base/ftbitmap.c, include/freetype/ftbitmap.h: New files for + handling various bitmap formats. + + * include/freetype/config/ftheader.h (FT_BITMAP_H): New macro. + + * src/base/rules.mk (BASE_EXT_SRC): Add ftbitmap.c. + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Don't convert bitmaps to 8bpp + but return them as-is. + + * docs/CHANGES: Mention new bitmap API. + * include/freetype/ftchapter.s: Updated. + +2004-12-11 Robert Clark + + * src/base/ftobjs.c (FT_Get_Kerning): Make kerning amount + dependent on ppem by scaling down for ppem < 25, then do normal + rounding. This gives slightly better results than rounding towards + zero. + +2004-12-09 Werner Lemberg + + * src/base/ftobjs.c (FT_Get_Kerning): Always round towards zero + for FT_KERNING_DEFAULT. This greatly enhances the kerning for + small ppem values. + +2004-12-08 Werner Lemberg + + * src/base/ftobjs.c (ft_glyphslot_clear): Reset `lsb_delta' and + `rsb_delta'. + +2004-12-05 Werner Lemberg + + * builds/unix/install.mk (install): Use $(OBJ_BUILD) for ftconfig.h. + +2004-12-03 Antoine Leca + + * include/freetype/ttnameid.h: Updated to latest + specifications from Microsoft. + +2004-11-26 Jouk Jansen + + * vms_make.com: Include ftbbox.c. + Fix `ccopt'. + Handle `otvalid' module. + Update `vmslib.dat' default values. + Fixes to `libs.opt'. + +2004-11-23 Anders Kaseorg + + * src/base/ftoutln.c (FT_OrientationExtremumRec, + ft_orientation_extremum_compute): Removed. + (FT_Outline_Get_Orientation): Rewritten, simplified. + + * src/autohint/ahglyph.c: Include FT_OUTLINE_H. + (ah_test_extremum, ah_get_orientation): Removed. + (ah_outline_load): Use FT_Outline_Get_Orientation. + + * src/base/ftsynth.c (ft_test_extrama, ft_get_orientation): Removed. + (FT_GlyphSlot_Embolden): Use FT_Outline_Get_Orientation. + +2004-11-23 Fernando Papa + + * src/truetype/ttinterp.h: Fix typo. + +2004-11-22 Antoine Leca + + * builds/win32/detect.mk: Corrected logic that detects Windows NT to + use the previous change even if win32 is forced. Corrected + detection of win32 on Win9X. + + * builds/dos/detect.mk: Added same correction as for win32 about + COPY on Windows NT. Detection of plain DOS 7.x. + +2004-11-22 Werner Lemberg + + * builds/detect.mk: Undo change from 2004-11-20. + * builds/win32/detect.mk: If the `OS' environment variable contains + `Windows_NT', use `cmd.exe /c copy' for copying files. + +2004-11-20 Werner Lemberg + + * builds/detect.mk (dos_setup): Use `cmd.exe' for copying + $(CONFIG_MK) to force lowercase file name under Windows. + +2004-11-19 Werner Lemberg + + Fix a serious bug in the TT hinter. + + * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Don't shift + points vertically before hinting. + + * docs/CHANGES: Updated. + + * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily, + FTC_GCache_Lookup): A new try to fix comparison with zero. + +2004-11-16 Werner Lemberg + + * builds/unix/configure.ac: Add `-fno-strict-aliasing' if gcc is + used. + * builds/unix/configure: Regenerated. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + +2004-11-16 Dr. Martin P.J. Zinser + + * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily, + FTC_GCache_Lookup): Fix comparison with zero. + + * docs/INSTALL.VMS: Updated. + + * vms_make.com: Updated. All `descrip.mms' files are now created + automatically. + + * src/*/descrip.mms: Removed. + +2004-11-16 Owen Taylor + + * builds/unix/freetype-config.in: Suppress -L$libdir for + /usr/lib64 as well as /usr/lib. (Reported by Dan Winship - + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=139199) + +2004-11-11 Werner Lemberg + + * src/cff/cffdrivr.c (cff_service_ps_info): Updated. + * src/cid/cidriver.c (cid_service_ps_info): Updated. + * src/type42/t42drivr.c (t42_ps_get_font_private): New function. + (t42_service_ps_info): Updated. + + * src/type42/t42parse.c (t42_parse_dict): Remove compiler warning. + +2004-11-11 David Bevan + + Add new function FT_Get_PS_Font_Private(). + + * include/freetype/internal/services/svpsinfo.h + (PS_GetFontPrivateFunc): New service function. + + * include/freetype/t1tables.h, src/base/fttype1.c + (FT_Get_PS_Font_Private): New function. + + * src/type1/t1driver.c (t1_ps_get_font_private): New function. + (t1_service_ps_info): Updated. + +2004-10-13 Werner Lemberg + + * include/freetype/config/ftstdlib.h: Include `stddef.h'. + (ft_ptrdiff_t): Define. + + * include/freetype/fttypes.h (FT_PtrDist): Use `ft_ptrdiff_t'. + + * src/cid/cidload.c (cid_parse_dict), src/type1/t1load.c + (parse_dict): Fix compiler warning. + +2004-10-11 Joshua Neal + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Check for pointer + overflow. + + * src/sfnt/ttload.c (tt_face_load_hdmx): Protect against bad input. + Don't use FT_QNEW_ARRAY but FT_NEW_ARRAY to make deallocation work + in case of failure. + + * src/sfnt/ttsbit.c (Load_SBit_Range): Check range intervals. + (tt_face_load_sbit_strikes): Allocate `strike_sbit_ranges' after + frame test. + + * src/truetype/ttgload.c (TTLoad_Simple_Glyph): Add assertion for + `flag'. + +2004-10-09 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-10-09 Boris Letocha + + Fix handling of NPUSHW if skipped in data stream. + + * src/truetype/ttinterp.c (opcode_length): Set value for NPUSHW + to -2. + (SkipCode, TT_RunIns): Use opcode_length value for computation of + bytes to be skipped. + +2004-09-10 Jouk Jansen + + * vms_make.com: Updated. + +2004-09-09 Werner Lemberg + + Adding OpenType validation module. The code is based on the + (unfinished) `otlayout' module but has been heavily modified to make + it much more compact. + + * src/otvalid/*: New module. + + * include/freetype/ftotval.h, src/base/ftotval.c, + include/freetype/internal/services/svotval.h: New files. + + * include/freetype/config/ftmodule.h: Add otv_module_class. + * include/freetype/config/ftheader.h (FT_OPENTYPE_VALIDATE_H): New + macro. + * include/freetype/internal/ftserv.h + (FT_SERVICE_OPENTYPE_VALIDATE_H): New macro. + * include/freetype/internal/fttrace.h (otvmodule, otvcommon, + otvbase, otvgdef, otvgpos, otvgsub, otvjstf): New trace components. + + * include/freetype/ftchapters.h: Updated. + + * src/base/Jamfile (Library), src/base/descrip.mms (OBJS), + src/base/rules.mk (BASE_EXT_SRC): Updated. + + * docs/CHANGES: Updated. + +2004-09-08 Werner Lemberg + + * src/tools/docmaker/sources.py (re_source_block_format2) : + Use lookahead assertion to not match `*/'. This removes spurious + insertions of `/' in the HTML output. + +2004-09-07 Werner Lemberg + + * src/truetype/ttgxvar.c (TT_Vary_Get_Glyph_Deltas): Fix call to + FT_NEW_ARRAY. + +2004-09-04 Werner Lemberg + + * include/freetype/internal/ftobjs.h: Don't include + FT_CONFIG_STANDARD_LIBRARY_H. + (FT_Validator, FT_ValidationLevel, FT_ValidatorRec, FT_VALIDATOR, + ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID, + FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT, + FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to... + + * include/freetype/internal/ftvalid.h: New file. + Make FT_INVALID return module-specific error codes. + + * include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New + macro. + + * include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if + FT_KEEP_ERR_PREFIX isn't defined. + + * src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H. + + * src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but + FT_INTERNAL_VALIDATE_H. + + * src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but + FT_INTERNAL_VALIDATE_H. + Include sferrors.h before FT_INTERNAL_VALIDATE_H. + s/FT_Err_Ok/SFNT_Err_Ok/. + + * src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX. + + * src/type1/t1afm.c: Include t1errors.h. + +2004-09-03 Werner Lemberg + + * src/base/ftdebug.c (ft_debug_init): Highest debug level is 7, + not 6. + * docs/DEBUG: Updated. + +2004-08-30 Werner Lemberg + + * include/freetype/tttags.h (TTAG_BASE, TTAG_GDEF, TTAG_GPOS, + TTAG_JSTF): New tags. + + * include/freetype/fttypes.h (FT_Bytes, FT_Tag): New typedefs. + (FT_Int): Add `signed'. + +2004-08-29 Werner Lemberg + + * src/otlayout/otlgpos.c (otl_gpos_subtable_validate): Add argument + to pass number of lookups. + Update all callers. + Don't call otl_lookup_list_validate but otl_lookup_validate. + (otl_gpos_validate): Call otl_lookup_list_validate instead of + otl_gpos_subtable_validate. + + * src/otlayout/otlgpos.h: Updated. + + * src/otlayout/otljstf.c (otl_jstf_max_validate): Add argument to + pass number of lookups. + Update all callers. + + + * src/cff/cffparse.c (cff_parse_real): s/exp/exponent/ to avoid + compiler warning. + + + * src/sfnt/ttcmap0.c, src/sfnt/ttcmap0.h: Renamed to... + * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: This. + * src/sfnt/Jamfile, src/sfnt/rules.mk, src/sfnt/sfdriver.c, + src/sfnt/sfnt.c, src/sfnt/sfobjs.c: Updated. + + + * builds/compiler/gcc-dev.mk (CFLAGS): Don't add `-Wnested-externs' + if compiler is g++ (v3.3.3 emits a warning otherwise). + +2004-08-28 Werner Lemberg + + * src/otlayout/otlgpos.c (otl_value_length): Return number of bytes, + not number of 16bit entities. + (otl_gpos_lookup2_validate): Check class definition tables for + format 2. + Fix loop for format 2. + (otl_liga_mark2_validate): Fix offset for otl_anchor_validate. + +2004-08-27 Werner Lemberg + + * src/base/ftmac.c: Don't include truetype/ttobjs.h. + Don't include type1/t1objs.h. + (FT_New_Face_From_FSSpec) [!__MWERKS__]: Remove compiler warnings. + +2004-08-27 Mathieu Malaterre + + * src/base/ftmac.c: Handle OS_INLINE for xlc compiler also. + +2004-08-27 Werner Lemberg + + * src/otlayout/otlayout.h: Add copyright. + (OTL_INVALID_OFFSET): Removed. + + * src/otlayout/otlgdef.h: Include otlayout.h. + Comment out inclusion of otltable.h. + + * src/otlayout/otlgpos.c (otl_gpos_lookup4_validate): Fix call + to otl_base_array_validate. + (otl_liga_mark2_validate): Fix `for' loop. + + * src/otlayout/otlgsub.c (otl_ligature_validate): Check `glyph_id', + not components array. + + * src/otlcommn.c (otl_lookup_get_count, otl_feature_get_count): + Comment out. + (otl_lookup_list_get_count, otl_feature_list_get_count): Activate. + (otl_feature_list_validate, otl_gsubgpos_get_lookup_count): + s/otl_lookup_get_count/otl_lookup_list_get_count/. + (otl_script_list_validate): + s/otl_feature_get_count/otl_feature_list_get_count/. + (otl_script_validate): Call otl_lang_validate for default language. + + * src/otlayout/otlcommn.h: Updated. + +2004-08-16 Werner Lemberg + + * src/otlayout/otlgpos.c (otl_gpos_lookup1_validate, + otl_gpos_lookup2_validate, otl_gpos_lookup3_validate, + otl_gpos_lookup4_validate, otl_gpos_lookup5_validate, + otl_gpos_lookup6_validate, otl_gpos_lookup9_validate, + otl_gpos_validate): Update + function arguments. + (otl_gpos_lookup7_validate, otl_gpos_lookup8_validate): Update + function arguments. + Handle NULL offsets correctly. + Check sequence and lookup indices for format 3. + (otl_pos_rule_validate, otl_chain_pos_rule_validate): Add argument + to pass lookup count. + Check sequence and glyph indices. + (otl_gpos_subtable_validate): Update function arguments. + Update callers. + + * src/otlayout/otlgpos.h: Updated. + + * src/otlayout/otlgsub.c (otl_gsub_lookup1_validate, + otl_gsub_lookup3_validate, otl_gsub_lookup8_validate): Update + function arguments. + Add glyph index checks. + (otl_sequence_validate, otl_alternate_set_validate, + otl_ligature_validate): Add argument to pass glyph count. + Update callers. + Add glyph index check. + (otl_gsub_lookup2_validate, otl_gsub_lookup4_validate): Update + function arguments. + (otl_ligature_set_validate): Add argument to pass glyph count. + Update caller. + (otl_sub_class_rule_validate, + otl_sub_class_rule_set_validate): Removed. + (otl_sub_rule_validate, otl_chain_sub_rule_validate): Add argument + to pass lookup count. + Update callers. + Add lookup index check. + (otl_sub_rule_set_validate, otl_chain_sub_rule_set_validate): Add + argument to pass lookup count. + Update callers. + (otl_gsub_lookup5_validate): Update function arguments. + Handle NULL offsets correctly. + Don't call otl_sub_class_rule_set_validate but + otl_sub_rule_set_validate. + Check sequence and lookup indices for format 3. + (otl_gsub_lookup6_validate): Update function arguments. + Handle NULL offsets correctly. + Check sequence and lookup indices for format 3. + (otl_gsub_lookup7_validate, otl_gsub_validate): Update function + arguments. + + * src/otlayout/otlgsub.h: Updated. + + * src/otlayout/otlbase.c (otl_base_validate): Handle NULL offsets + correctly. + + * src/otlayout/otlcommn.c (otl_class_definition_validate): Fix + compiler warning. + (otl_coverage_get_first, otl_coverage_get_last): New functions. + (otl_lookup_validate): Add arguments to pass lookup and glyph + counts. + Update callers. + (otl_lookup_list_validate): Add argument to pass glyph count. + Update callers. + + * src/otlayout/otlcommn.h: Updated. + + * src/otlayout/otljstf.c (otl_jstf_extender_validate, + otl_jstf_max_validate, otl_jstf_script_validate, + otl_jstf_priority_validate, otl_jstf_lang_validate): Add parameter + to validate glyph indices. + Update callers. + (otl_jstf_validate): Add parameter which specifies number of glyphs + in font. + + * src/otlayout/otljstf.h: Updated. + +2004-08-15 Werner Lemberg + + * src/otlayout/otlgpos.c (otl_liga_mark2_validate): Add parameter + to handle possible NULL values properly. + Update all callers. + +2004-08-15 Werner Lemberg + + * src/otlayout/gpos.c: Rename counting variables to be more + meaningful. + Add copyright. + (otl_liga_attach_validate): Renamed to... + (otl_liga_mark2_validate): This. + Update all callers. + (otl_mark2_array_validate): Removed. + (otl_gpos_lookup6_validate): Call otl_liga_mark2_validate, not + otl_mark2_array_validate. + (otl_pos_class_set_validate, otl_pos_class_rule_validate): Removed. + (otl_gpos_lookup7_validate): Complete code for format 2. + (otl_chain_pos_class_rule_validate, + otl_chain_pos_class_set_validate): Removed. + (otl_gpos_lookup8_validate): Don't call + otl_chain_pos_class_set_validate but + otl_chain_pos_rule_set_validate. + Simplify some code. + + * src/otlayout/otlgpos.h: Add copyright. + +2004-08-14 Werner Lemberg + + * src/otlayout/otljstf.c (otl_jstf_gsub_mods_validate): Removed. + (otl_jstf_gpos_mods_validate): Renamed to... + (otl_jstf_gsubgpos_mods_validate): This. + Test whether lookup_count is zero. + (otl_jstf_priority_validate): Use otl_jstf_gsubgpos_mods_validate. + (otl_jstf_validate): Initialize gsub_lookup_count and + gpos_lookup_count if gsub or gpos is zero. + + * src/otlayout/otlgsub.c: Rename counting variables to be more + meaningful. + Add copyright. + (otl_gsub_lookup1_validate): Simplify code. + (otl_gsub_lookup2_validate, otl_gsub_lookup3_validate, + otl_gsub_lookup4_validate, otl_gsub_lookup7_validate): Remove unused + variables. + (otl_gsub_lookup5_validate): Remove unused variable. + Fix call to otl_sub_rule_set_validate and + otl_sub_class_rule_set_validate. + (otl_chain_sub_class_rule_validate, + otl_chain_sub_class_set_validate): Removed. + (otl_gsub_lookup6_validate): Remove unused variable. + Fix call to otl_chain_sub_rule_set_validate. + (otl_gsub_lookup7_validate): Handle lookup type 8 also. + (otl_gsub_lookup8_validate: New function. + (otl_gsub_lookup1_apply, otl_gsub_lookup2_apply, + otl_gsub_lookup3_apply): Commented out. + (otl_gsub_validate_funcs): Add otl_gsub_lookup7_validate and + otl_gsub_lookup8_validate. + (otl_gsub_validate): Updated. + + * src/otlayout/otlgsub.h: Add copyright. + + * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h + (otl_coverage_get_index): Comment out. + +2004-08-13 Werner Lemberg + + * src/otlayout/otlcommn.c (otl_gsubgpos_get_lookup_count): New + function. + * src/otlayout/otlcommn.h: Updated. + + * src/otlayout/otlbase.c: Rename counting variables to be more + meaningful. + Add copyright message. + * src/otlayout/otlbase.h: Add copyright message. + + * src/otlayout/otlgdef.c: Rename counting variables to be more + meaningful. + Add copyright message. + Use OTL_CHECK everywhere. + (otl_caret_value_validate): Remove unused variable. + (otl_gdef_validate): All tables are optional. + * src/otlayout/otlgdef.h: Add copyright message. + + * src/otlayout/otljstf.c: Rename counting variables to be more + meaningful. + Add copyright message. + (otl_jstf_gsub_mods_validate, otl_jstf_gpos_mods_validate): Add + parameter to pass lookup count. + Update all callers. + Check lookup array. + (otl_jstf_max_validate): + s/otl_gpos_subtable_check/otl_gpos_subtable_validate/. + (otl_jstf_priority_validate, otl_jstf_lang_validate, + otl_jstf_script_validate): Add two parameters to pass lookup counts. + Update all callers. + (otl_jstf_validate): Add two parameters to pass GPOS and GSUB + table offsets; use otl_gsubgpos_get_lookup_count to convert extract + lookup counts. + Fix typo. + * src/otlayout/otljstf.h: Updated. + Add copyright message. + + * src/otlayout/otlgpos.c (otl_gpos_subtable_validate): New function. + (otl_gpos_validate): Use it. + * src/otlayout/otlgpos.h: Updated. + +2004-08-13 Werner Lemberg + + * src/otlayout/otcommn.c: Use OTL_CHECK everywhere. + (otl_coverage_validate): Initialize `p', + s/count/num_glyphs/. + s/start_cover/start_coverage/. + (otl_coverage_get_index): Return OTL_Long, not OTL_Int. + Remove unused variables. + (otl_class_definition_validate): s/count/num_glyphs/. + Remove unused variables. + (otl_class_definition_get_value, otl_device_table_get_start, + otl_device_table_get_end, otl_device_table_get_delta, + otl_lookup_get_table, otl_lookup_list_get_count, + otl_lookup_list_get_lookup, otl_lookup_list_get_table, + otl_feature_get_lookups, otl_feature_list_get_count, + otl_feature_list_get_feature, otl_lang_get_count, + otl_lang_get_req_feature, otl_lang_get_features): Commented out + temporarily until we really need it. + (otl_lookup_validate): Removed. + (otl_lookup_table_validate): Renamed to ... + (otl_lookup_validate): This. Update callers. + (otl_lookup_list_validate): Remove already commented out definition + and move the other definition up. + (otl_feature_validate): Add parameter to pass number of lookups. + Update callers. + Check lookup indices. + (otl_feature_list_validate): Add parameter to pass lookup table. + Update callers. + (otl_lang_validate): Add parameter to pass number of features. + Update callers. + Handle req_feature and check feature indices. + (otl_script_validate): Add parameter to pass number of features. + Update callers. + (otl_script_list_validate): Add parameter to pass feature table. + Update callers. + + * src/otlayout/otcommn.h: s/LOCALDEF/LOCAL/. + Comment out the same functions as in otcommn.c. + (otl_script_list_get_script): Removed. + + * src/otlayout/otlgsub.c (otl_gsub_lookup1_apply): Change `index' to + type OTL_Long. + (otl_gsub_lookup2_apply, otl_gsub_lookup3_apply): Change `index' to + type OTL_Long. + Fix test. + (otl_gsub_validate): Fix order of validation. + + * src/otlayout/otlgpos.c (otl_gpos_validate): Fix order of + validation. + +2004-08-12 Werner Lemberg + + Make otlayout module compile (without actually working). + + * src/otlayout/*: s/OTL_Valid/OTL_Validator/. + s/NULL/0/. + + * src/otlayout/otlayout.h: Fix various typos. + (OTL_Bool): New typedef. + (OTL_Int, OTL_Long, OTL_Int16, OTL_Int32): Use `signed' keyword. + (OTL_Err_InvalidArgument): Removed. + (OTL_Err_InvalidData, OTL_Err_InvalidSize): New enum values. + (OTL_MAKE_TAG): Add missing parenthesis. + (OTL_INVALID_DATA): Use OTL_Err_InvalidData. + (OTL_INVALID_TOO_SHORT): Use OTL_Err_InvalidSize. + (OTL_INVALID_FORMAT, OTL_INVALID_OFFSET): New macros. + + * src/otlayout/otlgpos.c: s/FT_/OTL_/. + s/OTL_Short/OTL_Int16/. + (otl_gpos_pairset_validate): Add return type. + (otl_base_array_validate): Fix call to otl_anchor_validate. + (otl_liga_array_validate): Fix call to otl_liga_attach_validate. + (otl_gpos_lookup5_validate): Fix typos. + (otl_gpos_lookup6_validate): Fix call to otl_mark2_array_validate. + (otl_gpos_lookup7_validate): Comment out unfinished code. + Fix typos. + + * src/otlayout/otlgsub.c: Add forward declaration for + otl_gsub_validate_funcs. + (otl_gsub_lookup1_apply, otl_gsub_lookup2_apply, + otl_gsub_lookup3_apply): Fix call to otl_parser_check_property. + s/otl_coverage_lookup/otl_coverage_get_index/. + (otl_ligature_validate): Add missing variable declaration. + (otl_sub_rule_validate): Fix typo. + (otl_sub_class_rule_validate): Add missing variable declaration. + Fix typo. + (otl_gsub_lookup5_validate): Fix typo. + (otl_gsub_lookup6_validate): Fix call to + otl_chain_sub_class_set_validate. + (otl_gsub_validate_funcs): Don't use `const'. + + * src/otlayout/otlcommn.c (otl_class_definition_get_value, + otl_device_table_validate, otl_device_table_get_delta, + otl_lookup_validate, otl_script_validate): Add missing + variable declarations. + (otl_lookup_list_validate): Comment out first definition. + (otl_lookup_list_foreach, otl_feature_list_foreach): Comment out. + (otl_feature_list_validate): + s/otl_feature_table_validate/otl_feature_validate/. + (otl_script_list_validate): + s/otl_script_table_validate/otl_script_validate/. + + * src/otlayout/otlcommn.h: Comment out first declaration. + (otl_lookup_list_foreach, otl_feature_list_foreach): Comment out. + + * src/otlayout/otlbase.c (otl_base_coord_validate): Fix call to + otl_device_table_validate. + (otl_base_script_validate): Add missing variable declarations. + (otl_base_script_list_validate): Fix call to + otl_base_script_validate. + (otl_axis_table_validate): Fix calls to otl_base_tag_list_validate + and otl_base_script_list_validate. + (otl_base_validate): Fix calls to otl_axis_table_validate. + + * src/otlayout/otlgdef.c (otl_attach_list_validate): Fix call to + otl_attach_point_validate. + (otl_caret_value_validate): Add missing variable declaration. + Fix call to otl_device_table_validate. + (otl_ligature_glyph_validate): Fix call to otl_caret_value_validate. + (otl_ligature_caret_list_validate): Fix call to + otl_ligature_glyph_validate. + (otl_gdef_validate): Fix calls to otl_class_definition_validate, + otl_attach_list_validate, otl_ligature_caret_list_validate, and + otl_class_definition_validate. + + * src/otlayout/otltable.h (otl_table_validate, otl_table_init, + otl_table_set_script): Comment out. + + * src/otlayout/otlparse.h (OTL_ParserRec): + s/OTL_Alternate/OTL_GSUB_Alternate/. + (OTL_ParseError): Add OTL_Err_Parser_Memory and + OTL_Err_Parser_Internal. + (otl_parser_error): Fix typo. + (otl_parser_check_property): Remove third argument. + + * src/otlayout/otlparse.c (otl_string_ensure): + s/OTL_Parse_Err_Memory/OTL_Err_Parser_Memory/. + (OTL_STRING_ENSURE, otl_parser_error, otl_parser_get_index, + otl_parser_replace_1, otl_parser_replace_n): Fix typos. + (OTL_PARSER_UNCOVERED): Removed. + (otl_parser_check_property): Remove third argument. + + * src/otlayout/otljstf.c (otl_jstf_priority_validate): Add missing + variable declaration. + + * src/otlayout/otlutils.h (OTL_MEM_REALLOC): Fix typo. + +2004-08-11 Danny + + * src/base/ftstream.c (FT_Stream_Close): Don't reset stream->close + to NULL. This allows custom close functions to delete the FT_STREAM + object. + +2004-08-11 Werner Lemberg + + Add API to get information about SFNT tables. + + * include/freetype/internal/services/svsfnt.h + (FT_SFNT_Table_Info_Func): New typedef. + (SFNT_Table): Add it. + + * src/base/ftobjs (FT_Sfnt_Table_Info): New function. + + * include/freetype/tttables.h: Updated. + + * src/sfnt/sfdriver.c (sfnt_table_info): New function. + (sfnt_service_sfnt_table): Add it. + + * docs/CHANGES: Updated. + + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10. + + * builds/unix/configure.ac (version_info): Set to 9:8:3. + * builds/unix/configure: Updated. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. + + * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): + s/2.1.9/2.1.10/. + + * docs/CHANGES, docs/VERSION.DLL: Updated. + +2004-08-11 Detlef Würkner + + * src/base/ftrfork.c (FT_Raccess_Guess) + [!FT_CONFIG_OPTION_GUESSING_EMBEDDED_FORK]: Remove compiler + warnings. + +2004-08-06 Adam Piotrowski + + * src/pfr/pfrload.c (pfr_sort_kerning_pairs): Single-byte + adjustments are unsigned, not signed. + +2004-08-05 David Turner + + `Activate' gray-scale specifing hinting within the TrueType + bytecode interpreter. This is an experimental feature which + should probably be made optional. + + * src/truetype/ttgload.c (TT_Process_Simple_Glyph, + load_truetype_glyph): Move the code to set the pedantic_hinting flag + to... + (TT_Load_Glyph): Here. + Set `grayscale' flag except for `FT_LOAD_TARGET_MONO'. + + * src/truetyep/ttinterp.c (Ins_GETINFO): Return MS rasterizer + version 1.7. + Return rotation and stretching info only if glyph is rotated or + stretched, respectively. + Handle grayscale info. + + * src/truetype/ttinterp.h (TT_ExecContextRec): Add `grayscale' + member. + +2004-08-02 George Williams + + * src/base/ftobjs.c (FT_Attach_File): Initialize `open.stream'. + +2004-08-01 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-08-01 George Williams + + FreeType now can read kerning values from PFM files. + + * src/type1/t1afm.c (T1_Done_AFM): Renamed to... + (T1_Done_Metrics): This. + Update all callers. + (T1_Read_AFM): Make it static. + Don't enter and leave a frame. + (LITTLE_ENDIAN_USHORT, LITTLE_ENDIAN_UINT): New macros. + (T1_Read_PFM): New function. + (T1_Read_Metrics): New higher-level function to be used instead of + T1Read_AFM. + Update all callers. + +2004-07-31 Werner Lemberg + + * src/pcf/pcfread (pcf_load_font), src/bdf/bdfdrivr.c + (BDF_Face_Init), src/truetype/ttgxvar (TT_Get_MM_Var, + tt_face_vary_cvt): Fix compiler warnings. + +2004-07-26 Søren Sandmann + + * src/pcf/pcfread.c (pcf_interpret_style): Always allocate memory for + face->style_name. + * src/pcf/pcfdrivr.c (PCF_Face_Done): Free `style_name'. + +2004-07-26 Darren J Longhorn + + * include/freetype/config/ftconfig.h (FT_SIZEOF_LONG): Recognize + five-byte `long' (which is avoided then). + +2004-07-25 Detlef Würkner + + * src/pcf/pcfdrivr.c (PCF_Set_Pixel_Size): Compare heights, not + ppem values. + (PCF_Set_Point_Size): Don't call PCF_Set_Pixel_Size but provide own + code to compare ppem values. + * src/bdf/bdfdrivr.c (BDF_Set_Pixel_Size): Compare heights, not + ppem values. + (BDF_Set_Point_Size): Don't call BDF_Set_Pixel_Size but provide own + code to compare ppem values. + +2004-07-25 Kornfeld Eliyahu Peter + + * src/sfnt/sfobjs.c (sfnt_load_face): Handle + TT_NAME_ID_PREFERRED_FAMILY and TT_NAME_ID_PREFERRED_SUBFAMILY. + +2004-07-24 Derek B. Noonburg + + * src/cff/cffload.c (cff_font_load): Always create inverse mapping. + Even if the charstring count is the same as the CID count, it is + still possible that the font uses a different CID -> GID mapping. + +2004-07-23 Werner Lemberg + + * src/truetype/ttobjs.c (tt_face_init): Accept 0x00020000 format tag + found in some Arphic fonts made for Chinese version of Windows 3.1. + +2004-07-17 David Turner + + Fixed a dangling pointer bug in the cache code that happened in very + rare cases, i.e., when a new family object was destroyed by an + out-of-memory condition during a glyph node initialization. The + function FTC_Cache_Lookup would flush the cache and restart the + lookup with a bad pointer. + + * include/freetype/cache/ftcglyph.h (FTC_FAMILY_TREE): New macro. + (FTC_GCACHE_LOOKUP_CMP): Use it. + Handle reference count in `num_nodes' correctly. + + * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily): Use + FTC_FAMILY_FREE. + (FTC_GCache_Lookup): Handle reference count in `num_nodes' correctly. + + * src/cache/ftcmanag.c (FTC_Manager_FlushN): Fixed a cache flushing + bug. + + * src/truetype/ttinterp.c (Normalize): Fixed a bug that caused + long and unnecessary delays while normalizing huge vectors. + +2004-07-15 Werner Lemberg + + * docs/CHANGES: Updated. + + * src/base/ftstroke.c (FT_Stroker_ParseOutline): Fix compiler + warning. + +2004-07-15 David Turner + + * src/base/ftstroke.c (FT_Stroker_ParseOutline): Single points + are not stroked, preventing a bug with pala.ttf and other + fonts. + + * include/freetype/ftstroke.h: Updating documentation comments. + +2004-07-13 Werner Lemberg + + * src/base/ftstroke.c (ft_stroke_border_reverse): Removed. Unused. + +2004-07-12 David Turner + + * src/base/ftstroke.c (ft_stroke_border_close): Add second parameter + to indicate reversion of points. + Update all callers. + (ft_stroke_border_reverse): Fix initialization of `point1' and + `tag1'. + + * src/cache/ftcsbits.c (ftc_snode_load): Fixing advance computation + for transformed glyphs. + +2004-07-11 David Turner + + Fix bugs that prevented the stroker to correctly generate stroked + paths from closed paths, i.e., nearly all glyphs in vectorial fonts. + + The code is still _very_ buggy though; treat with special care. + + * src/base/ftstroke.c (FT_STROKE_TAG_BEGIN_END): New macro. + (ft_stroke_border_reverse): New function. + (ft_stroker_inside): Remove local variable `sigma'; use different + threshold. + (ft_stroker_add_reverse_left): Switch begin/end tags if necessary. + (FT_Stroker_EndSubPath): Call ft_stroker_inside and + ft_stroke_border_reverse. + +2004-06-26 Peter Kovar + + * src/truetype/ttgload.c (load_truetype_glyph): Fix typo. + +2004-06-25 Werner Lemberg + + * src/type1/t1afm.c (afm_atoindex): Fix boundary test. Reported + by Dirck Blaskey. + +2004-06-24 David Turner + + + * Version 2.1.9 released. + ========================= + + + * src/truetype/ttgload.c, src/truetype/ttxgvar.c: Removing + compiler warnings. + +2004-06-23 Werner Lemberg + + * include/freetype/internal/ftmemory.h [FT_DEBUG_MEMORY]: Declare + FT_QAlloc_Debug and FT_QRealloc_Debug. + + * src/base/ftutil.c (FT_QAlloc): Fix error and debug messages. + (FT_QRealloc): Call FT_QAlloc if original pointer is NULL. + Fix error message. + +2004-06-23 David Turner + + * include/freetype/internal/ftmemory.h, src/base/ftutil.c + (FT_QAlloc, FT_QRealloc), src/base/ftdbgmem.c (FT_QAlloc_Debug, + FT_QRealloc_Debug): New functions that perform allocation without + zero-ing out the corresponding blocks. + + * include/freetype/internal/ftmemory.h (FT_MEM_QALLOC, + FT_MEM_QREALLOC, FT_MEM_QNEW, FT_MEM_QNEW_ARRAY, + FT_MEM_QRENEW_ARRAY, FT_QALLOC, FT_QREALLOC, FT_QNEW, FT_QNEW_ARRAY, + FT_QRENEW_ARRAY): New macros. + + * src/base/ftstream.c (FT_Stream_EnterFrame): Use FT_QALLOC. + * src/gzip/ftgzip.c (FT_Stream_OpenGzip): Use FT_QNEW_ARRAY. + * src/sfnt/sfobjs.c (tt_face_get_name): Use FT_QNEW_ARRAY. + + * src/sfnt/ttload.c (tt_face_load_directory, tt_face_load_metrics, + tt_face_load_gasp): Use FT_QNEW_ARRAY. + (tt_face_load_kern): Use FT_QNEW_ARRAY. + Small optimization in the kerning table verifier; this speeds up + TrueType face opening by about 7%. + (tt_face_load_hdmx): Use FT_QNEW_ARRAY and FT_QALLOC. + + * include/freetype/config/ftmodule.h: Changed the order of modules, + putting TrueType and Type 1 first. This dramatically improves the + performance of face open/close operations. For example, putting the + TrueType driver first in the list results in a 5x speedup when + opening `Vera.ttf'. + + The very problem is that both the PCF and BDF drivers do a lot more + than necessary to detect that they cannot handle a font file. + +2004-06-22 Werner Lemberg + + * src/pcf/pcfread.c (pcf_read_TOC, pcf_get_properties, + pcf_get_metrics, pcf_get_bitmaps, pcf_get_encodings): Improve + debugging messages. + + * src/pcf/pcfdrivr.c (FT_COMPOMENT): Move up. + (PCF_Face_Init): Simplify code. + + * src/bdf/bdfdrivr.h (BDF_FaceRec): New element `default_glyph'. + + * src/bdf/bdflib.c (_bdf_add_property, _bdf_parse_start), + src/bdf/bdf.h (bdf_font_t): s/default_glyph/default_char/. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Fix number of glyphs. + Set `default_glyph'. + (BDF_Glyph_Load): Use `default_glyph' for undefined glyph. + + * docs/CHANGES: Updated. + +2004-06-21 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-06-21 David Turner + + * src/truetype/ttgload.c (TT_Process_Simple_Glyph, + load_truetype_glyph): Don't access (unrounded) + `TT_Size.root.metrics' but (rounded) `TT_Size.metrics'. This fixes + a scaling bug that caused incorrect rendering when the bytecode + interpreter was enabled. + +2004-06-14 Huw D M Davies + + * src/winfonts/winfnt.c (FNT_Face_Init): Set x_ppem and y_ppem + based on pixel_width and pixel_height. + (FNT_Size_Set_Pixels): Updated. + +2004-06-14 Werner Lemberg + + * src/lzw/zopen.c: Comment out inclusion of signal.h and unistd.h. + Reported by Hyvärinen Jyrki Juhani. + +2004-06-11 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-06-10 David Turner + + * src/base/ftobject.c, src/base/fthash.c, src/base/ftexcept.c, + src/base/ftsysio.c, src/base/ftsysmem.c, src/base/ftlist.c: Removed. + Obsolete. + + * src/raster/ftraster.c (Alignment, PAlignment): New union to fix + problems with 64bit systems. + (AlignProfileSize): Use it. + +2004-06-08 David Turner + + * include/freetype/freetype.h (FT_GlyphMetrics): Move `lsb_delta' + and `rsb_delta' elements to... + (FT_GlyphSlotRec): Here to retain binary compatibility with older + FreeType versions. + Update all users. + + * src/sfnt/sfobjs.c (tt_face_get_name): Remove compiler warning. + + * src/winfonts/winfnt.c (FNT_Load_Glyph): Add missing initialization + of slot->metrics.width and slot->metrics.height when loading a + Windows FNT glyph. Thanks to Huw Davies. + + * include/freetype/cache/ftcmru.h (FTC_MruNode_CompareFunc): Change + return type to FT_Bool. + + * src/cache/ftbasic.c (ftc_basic_family_compare): Change return + type to FT_Bool. + + * src/cache/ftccache.c (FTC_Cache_Init, ftc_cache_init): Make + the former call the latter, not vice versa. + (FTC_Cache_Done, ftc_cache_done): Ditto. + + * src/cache/ftcglyph.c (FTC_GNode_Compare, ftc_gnode_compare): Make + the former call the latter, not vice versa. + (FTC_GCache_Init, ftc_gcache_init): Ditto. + (FTC_GCache_Done, ftc_gcache_done): Ditto. + + * src/cache/ftcimage.c (FTC_INode_Free, ftc_inode_free): Make the + former call the latter, not vice versa. + (FTC_INode_Weight, ftc_inode_weight): Ditto. + + * src/cache/ftcmanag.c (ftc_size_node_compare, + ftc_size_node_compare_faceid, ftc_face_node_compare): Change return + type to FT_Bool. + + * src/cache/ftcsbits.c (FTC_SNode_Free, ftc_snode_free): Make the + former call the latter, not vice versa. + (FTC_SNode_Weight, ftc_snode_weight): Ditto. + (FTC_SNode_Compare, ftc_snode_compare): Ditto. + + * src/cache/ftcsbits.c: Fix some bugs and inefficiencies in the cache + sub-system. + +2004-06-05 Werner Lemberg + + * src/autofit/afloader.c (af_loader_load_g): Set `lsb_delta' and + `rsb_delta' in slot->metrics and tune side bearings slightly. + +2004-06-04 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-06-04 David Chester + + Improve inter-letter spacing for autohinted glyphs. + + * include/freetype/freetype.h (FT_Glyph_Metrics): Add elements + `lsb_delta' and `rsb_delta'. + + * src/autohint/ahhint.c (ah_hinter_load): Set `lsb_delta' and + `rsb_delta' in slot->metrics and tune side bearings slightly. + +2004-06-04 David Turner + + * src/autofit/*: Important fixes to the auto-fitter. The output + now seems to be 100% equivalent to the auto-hinter, while being + about 2% faster (which proves that script-specific algorithm + selection isn't a performance problem). + + To test it, change `autohint' to `autofit' in + and recompile. + + A few more testing is needed before making this the official + auto-hinting module. + +2004-06-02 Werner Lemberg + + * src/truetype/ttgload.c (compute_glyph_metrics): Fix compiler + warnings. + +2004-06-01 Werner Lemberg + + * src/sfnt/sfobjs.c (tt_face_get_name): Make sure that an English + name record for the Apple platform is preferred to a non-English + entry for the Microsoft platform. Problem reported by HANDA + Ken'ichi. + +2004-05-19 George Williams + + * src/type1/t1load.c (mm_axis_unmap, mm_weights_unmap): New + auxiliary functions. + (T1_Get_MM_Var): Provide axis tags. + Use mm_axis_unmap and mm_weights_unmap to provide default values + for design and normalized axis coordinates. + + * include/freetype/t1tables.h (PS_DesignMapRec): Change type of + `design_points' to FT_Long. + Update all users. + +2004-05-17 Werner Lemberg + + * src/base/ftbbox.c (BBox_Conic_Check): Fix boundary cases. + Reported by Mikey Anbary . + +2004-05-15 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_done_face): Free face->postscript_name. + +2004-05-15 George Williams + + * src/sfnt/ttload.c (tt_face_load_max_profile): Always set + face->root.num_glyphs. + +2004-05-14 Masatake YAMATO + George Williams + + * src/sfnt/ttload.c (sfnt_dir_check): Handle `bhed' properly. + +2004-05-14 Werner Lemberg + + * src/cache/ftcbasic.c (ftc_basic_family_compare, + ftc_basic_family_init, ftc_basic_family_get_count, + ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph, + ftc_basic_gnode_compare_faceid): Adjust parameters and return types + to prototypes given in header files from include/freetype/cache. + Use casts to proper types locally. + (ftc_basic_image_family_class, ftc_basic_image_cache_class, + ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): Remove + casts. + + * src/cache/ftccback.h: Adjust parameters and return types to + prototypes given in header files from include/freetype/cache. + + * src/cache/ftcimage.c (ftc_inode_free, ftc_inode_new, + ftc_inode_weight): Adjust parameters and return types to prototypes + given in header files from include/freetype/cache. Use casts to + proper types locally. + + * src/cache/ftcsbits.c (ftc_snode_free, ftc_snode_new, + ftc_snode_weight, ftc_snode_compare): Adjust parameters and return + types to prototypes given in header files from + include/freetype/cache. Use casts to proper types locally. + + * src/cache/ftccmap.c (ftc_cmap_node_free, ftc_cmap_node_new, + ftc_cmap_node_weight, ftc_cmap_node_compare, + ftc_cmap_node_remove_faceid): Adjust parameters and return types to + prototypes given in header files from include/freetype/cache. Use + casts to proper types locally. + (ftc_cmap_cache_class): Remove casts. + + * src/cache/ftcglyph.c (ftc_gnode_compare, ftc_gcache_init, + ftc_gcache_done): Adjust parameters and return types to prototypes + given in header files from include/freetype/cache. Use casts to + proper types locally. + + * src/cache/ftcmanag.c (ftc_size_node_done, ftc_size_node_compare, + ftc_size_node_init, ftc_size_node_reset, + ftc_size_node_compare_faceid, ftc_face_node_init, + ftc_face_node_done, ftc_face_node_compare: Adjust parameters and + return types to prototypes given in header files from + include/freetype/cache. Use casts to proper types locally. + + (ftc_size_list_class, ftc_face_list_class): Remove casts. + +2004-05-13 Werner Lemberg + + * src/autohint/ahmodule.c (ft_autohinter_init, ft_autohinter_done): + Use FT_Module as parameter and do a cast to FT_AutoHinter locally. + (autohint_module_class): Remove casts. + + * src/base/ftglyph.c (ft_bitmap_glyph_init, ft_bitmap_glyph_copy, + ft_bitmap_glyph_done, ft_bitmap_glyph_bbox, ft_outline_glyph_init, + ft_outline_glyph_done, ft_outline_glyph_copy, + ft_outline_glyph_transform, ft_outline_glyph_bbox, + ft_outline_glyph_prepare): Use FT_Glyph as parameter and do a cast + to FT_XXXGlyph locally. + Use FT_CALLBACK_DEF throughout. + (ft_bitmap_glyph_class, ft_outline_glyph_class): Remove casts. + + * src/bdf/bdfdrivr.c (bdf_cmap_init, bdf_cmap_done, + bdf_cmap_char_index, bdf_cmap_char_next): Use FT_CMap as parameter + and do a cast to BDF_CMap locally. + (bdf_cmap_class): Remove casts. + +2004-05-12 Werner Lemberg + + * src/cff/cffgload.h (CFF_Builder): Remove `error'. + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Replace + `Memory_Error' with `Fail' und update all users. + +2004-05-11 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_ParseState): New + enumeration. + (T1_BuilderRec): Replace `path_begun' with `parse_state'. + Remove `error'. + * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Replace + `Memory_Error' with `Fail' and update all users. + Don't use `builder->error'. + Replace `path_begun' with `parse_state' and check parsing states. + + * src/psaux/psobjs.c (t1_builder_init, t1_builder_start_point): + Replace `path_begun' with `parse_state' and check parsing states. + +2004-05-10 George Williams + + * src/truetype/ttxgvar.c (ft_var_load_avar): Do free arrays in case + of error -- `avar' is optional so we can't rely on tt_done_blend + being called automatically. + +2004-05-09 George Williams + + * src/truetype/ttxgvar.c (ft_var_load_avar, ft_var_load_gvar): Fix + error handling. + +2004-05-07 Werner Lemberg + + * src/pfr/pfrobjs.c, src/pfr/pfrobjs.h (pfr_face_init, + pfr_face_done, pfr_face_get_kerning, pfr_slot_init, pfr_slot_done, + pfr_slot_load): Don't use PFR_XXX but FT_XXX arguments which are + typecast to the proper PFR_XXX types within the function. + Update code accordingly. + + * src/pfr/pfrdrivr.c (pfr_get_kerning, pfr_get_advance, + pfr_get_metrics, pfr_get_service): Don't use PFR_XXX but FT_XXX + arguments which are typecast to the proper PFR_XXX types within the + function. + Update code accordingly. + Use FT_CALLBACK_DEF throughout. + (pfr_metrics_service_rec, pfr_driver_class): Remove casts. + +2004-05-06 Masatake YAMATO + + * src/truetype/ttgxvar.c (ft_var_load_gvar): Use FT_FACE_STREAM. + (*): Rename local variable OffsetToData to offsetToData. + +2004-05-06 Werner Lemberg + + * src/cff/cffobjs.c (cff_size_done, cff_size_init, cff_size_reset, + cff_slot_done, cff_slot_init, cff_face_init, cff_face_done): Access + root fields directly. + * src/cff/cffdrivr.c (Load_Glyph): Access root fields directly. + + * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Save current + frame before calling TT_Vary_Get_Glyph_Deltas. + + * src/pcf/pcfdrivr.c (PCF_CMapRec): Rename `cmap' to `root' for + consistency. + (pcf_cmap_init, pcf_cmap_done, pcf_cmap_char_index, + pcf_cmap_char_next): Don't use PCF_XXX but FT_XXX arguments which + are typecast to the proper PCF_XXX types within the function. + Update code accordingly. + (pcf_cmap_class): Remove casts. + (PCF_Face_Done, PCF_Face_Init, PCF_Set_Pixel_Size): Don't use + PCF_XXX but FT_XXX arguments which are typecast to the proper + PCF_XXX types within the function. + Update code accordingly. + Use FT_CALLBACK_DEF throughout. + (PCF_Set_Point_Size): New wrapper function. + (PCF_Glyph_Load, pcf_driver_requester): Use FT_CALLBACK_DEF. + (pcf_driver_class): Remove casts. + +2004-05-04 Steve Hartwell + + * src/truetype/ttobjs.c (tt_driver_done): Fix typo. + +2004-05-04 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Done, BDF_Face_Init, + BDF_Set_Pixel_Size): Don't use BDF_XXX but FT_XXX arguments which + are typecast to the proper BDF_XXX types within the function. + Update code accordingly. + Use FT_CALLBACK_DEF throughout. + (BDF_Set_Point_Size): New wrapper function. + (bdf_driver_class): Remove casts. + + * src/cff/cffdrivr.c (Get_Kerning, Load_Glyph, cff_get_interface): + Don't use CFF_XXX but FT_XXX arguments which are typecast to the + proper CFF_XXX types within the function. + Update code accordingly. + Use FT_CALLBACK_DEF throughout. + (cff_driver_class): Remove casts. + + * src/cff/cffobjs.h, src/cff/cffobjs.c (cff_size_done, + cff_size_init, cff_size_reset, cff_slot_done, cff_slot_init, + cff_face_init, cff_face_done, cff_driver_init, cff_driver_done): + Don't use CFF_XXX but FT_XXX arguments which are typecast to the + proper CFF_XXX types within the function. + Update code accordingly. + (cff_point_size_reset): New wrapper function. + + * src/cid/cidobjs.h, src/cid/cidobjs.c (cid_slot_done, + cid_slot_init, cid_size_done, cid_size_init, cid_size_reset, + cid_face_done, cid_face_init, cid_driver_init, cid_driver_done): + Don't use CID_XXX but FT_XXX arguments which are typecast to the + proper CID_XXX types within the function. + Update code accordingly. + (cid_point_size_reset): New wrapper function. + + * src/cid/cidgload.c, src/cid/cidgload.h (cid_slot_load_glyph): + Don't use CID_XXX but FT_XXX arguments which are typecast to the + proper CID_XXX types within the function. + Update code accordingly. + + * src/cid/cidriver.c (cid_get_interface): + Don't use CID_XXX but FT_XXX arguments which are typecast to the + proper CID_XXX types within the function. + Update code accordingly. + Use FT_CALLBACK_DEF. + (t1cid_driver_class): Remove casts. + + * src/truetype/ttdriver.c (tt_get_interface): Use FT_CALLBACK_DEF. + * src/truetype/ttgxvar.c (ft_var_load_avar): Don't free non-local + variables (this is done later). + (ft_var_load_avar): Fix call to FT_FRAME_ENTER. + (TT_Get_MM_Var): Fix size for `fvar_fields'. + (TT_Vary_Get_Glyph_Deltas): Handle deallocation of local variables + correctly. + + * src/base/ftdbgmem.c (ft_mem_debug_realloc): Don't abort if + current size is zero. + +2004-05-03 Steve Hartwell + + * src/truetype/ttobjs.h, src/truetype/ttobjs.c (tt_face_init, + tt_face_done, tt_size_init, tt_size_done, tt_driver_init, + tt_driver_done): Don't use TT_XXX but FT_XXX arguments which are + typecast to the proper TT_XXX types within the function. + Update code accordingly. + + * src/truetype/ttdriver.c (Get_Kerning, Set_Char_Sizes, + Set_Pixel_Sizes, Load_Glyph, tt_get_interface): Don't use TT_XXX but + FT_XXX arguments which are typecast to the proper TT_XXX types + within the function. + Update code accordingly. + (tt_driver_class): Remove casts. + +2004-05-02 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_free_names): Check that `table->names' + is not NULL. Reported by Gordon Childs . + +2004-04-29 Werner Lemberg + + * docs/formats.txt: Add more information on PFR format. + +2004-04-28 Werner Lemberg + + * docs/formats.txt: New file. + * docs/CHANGES: Updated. + +2004-04-28 Masatake YAMATO + + * include/freetype/internal/tttypes.h (GX_BlendRec_) + [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Fix a typo. + + * src/truetype/ttgxvar.h (GX_BlendRec_): Fix a typo. + +2004-04-27 Masatake YAMATO + + * src/truetype/ttgxvar.h: Use FT_LOCAL instead of FT_LOCAL_DEF + for function declarations. + +2004-04-25 George Williams + + * src/truetype/ttgxvar.c (ft_var_apply_tuple): Fix typo. + +2004-04-25 Werner Lemberg + + * src/truetype/Jamfile, docs/CHANGES: Updated. + +2004-04-24 Werner Lemberg + + * src/pcf/pcfdrivr.c: Revert change from 2004-04-17. + * src/pcf/pcfutil.c: Use FT_LOCAL_DEF. + * src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H. + Use FT_BEGIN_HEADER and FT_END_HEADER. + Use FT_LOCAL. + +2004-04-24 George Williams + + Add support for Apple's distortable font technology (in GX fonts). + + * devel/ftoption.h, include/freetype/config/ftoption.h + (TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro. + + * include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style, + FT_MM_Var): New structures. + (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates, + FT_Set_Var_Blend_Coordinates): New function declarations. + + * include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func, + FT_Set_Var_Design_Func): New typedefs. + Update MultiMasters service. + + * include/freetype/internal/tttypes.h + [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H. + (GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef. + (TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend' + and `blend'. + + * include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New + macros. + + * include/freetype/internal/fttrace.h: Add `ttgxvar'. + + * src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates, + FT_Set_Var_Blend_Coordinates): New functions. + + * src/sfnt/sfobjs.c (sfnt_load_face) + [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS + flag for GX var fonts. + + * src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files. + + * src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + ttgxvar.c. + + * src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h. + (tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: + New service. + (tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated. + + * src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + ttgxvar.h. + (TT_Process_Simple_Glyph, load_truetype_glyph) + [TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts. + + * src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + ttgxvar.h. + (tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call + tt_done_blend. + + * src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include + ttgxvar.h. + (tt_face_load_cvt) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call + tt_face_vary_cvt. + + * src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c. + + * src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var + and T1_Set_Var_Design. + + * src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros. + (T1_Get_MM_Var, T1_Set_Var_Design): New functions. + + * src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New + function declarations. + +2004-04-23 Werner Lemberg + + * include/freetype/ftcache.h (FT_Get_CharMap_Index): Rename + declaration and move to... + * include/freetype/freetype.h (FT_Get_Charmap_Index): Here. + (FREETYPE_PATCH): Set to 9. + + * src/base/ftobjs.c (FT_Get_Charmap_Index): New function. + + * builds/unix/configure.ac (version_info): Set to 9:7:3. + * builds/unix/configure: Updated. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/218/219/. + + * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): + s/2.1.8/2.1.9/. + + * docs/CHANGES, docs/VERSION.DLL: Updated. + +2004-04-21 Werner Lemberg + + * src/cff/cffparse.c (cff_parser_run), src/psaux/psobjs.c + (ps_parser_load_field): Use FT_CHAR_BIT. + +2004-04-21 David Turner + + + * Version 2.1.8 released. + ========================= + + + * src/cff/cffobjs.c (cff_face_init): Fix a small memory leak. + + * src/autofit/afloader.c (af_loader_load_g), src/autofit/afmodule.c + (af_autofitter_load_glyph), src/base/ftdebug.c (FT_Trace_Get_Name): + Remove compiler warnings. + + * src/autofit/aftypes.h: Undefine AF_DEBUG. + + * src/lzw/zopen.c (rmask), src/pcf/pcfdrivr.c (pcf_service_bdf, + pcf_services), src/pcf/pcfread.c (tableNames), src/psaux/psobjs.c + (ft_char_table), src/type42/t42drivr.c (t42_service_glyph_dict, + t42_service_ps_font_name): Decorate data arrays with `const' to + avoid populating the `.data' segment. + + * src/lzw/Jamfile: New file. + +2004-04-20 Werner Lemberg + + * src/psaux/psobjs.c (T1Radix): Renamed to... + (ps_radix): This. + Update current cursor position. + + * docs/CHANGES: Updated. + +2004-04-18 Werner Lemberg + + * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph), + src/ttdriver.c (Load_Glyph): Change type of `glyph_index' to + FT_UInt. From Lex Warners. + +2004-04-17 Chisato Yamauchi + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Really fix change + from 2004-03-19. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Use `ft_strlen'. + + * src/pcf/pcfutil.c, src/pcf/pcfutil.h: Decorate functions with + `static'. + Remove unused function `RepadBitmap'. + * src/pcf/pcfdrivr.c: Don't include pcfutil.h. + +2004-04-16 Werner Lemberg + + * builds/unix/freetype-config.in (usage): Fix and improve usage + information. + +2004-04-15 Werner Lemberg + + * builds/unix/ftconfig.in, builds/vms/ftconfig.h: Define + FT_CHAR_BIT. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't apply autohinting if + glyph is vertically distorted or mirrored. + + * src/cff/cffgload.c (cff_slot_load): Handle zero `size' properly + for embedded bitmaps. + + * docs/CHANGES: Updated. + +2004-04-15 bytesoftware + + * include/freetype/config/ftconfig.h, src/base/ftstream.c + (FT_Stream_ReadFields): More fixes using FT_CHAR_BIT. + +2004-04-14 Werner Lemberg + + * include/freetype/config/ftconfig.h (FT_CHAR_BIT): New macro. + +2004-04-14 Alex Strelnikov + + * src/cache/ftcsbits.c (ftc_snode_load): Initialize `*asize' in case + of error. + +2004-04-14 Werner Lemberg + + * src/base/ftmac.c [__GNUC__]: Define OS_INLINE. + * builds/unix/configure.ac: Don't try to remove `-ansi' compilation + switch on the Mac. + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.6. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + +2004-04-13 Werner Lemberg + + * include/freetype/config/ftconfig.h: Use CHAR_BIT to define + size of FT_SIZEOF_xxx. + +2004-04-12 Chisato Yamauchi + + * include/freetype/internal/sfnt.h (TT_Find_SBit_Image_Func, + TT_Load_SBit_Metrics_Func): New typedefs. + (SFNT_Interface): Add find_sbit_image and load_sbit_metrics. + + * src/sfnt/sfdriver.c (sfnt_interface): Updated. + * src/sfnt/ttsbit.h (tt_find_sbit_image, tt_load_sbit_metrics): New + declarations. + * src/sfnt/ttsbit.c (find_sbit_image): Renamed to... + (tt_find_sbit_image): This. + Updated all callers. + (load_sbit_metrics): Renamed to... + (tt_load_sbit_metrics): This. + Updated all callers. + +2004-04-12 Werner Lemberg + + * configure: Accept makepp also. + + * builds/unix/detect.mk: Use proper path to unix-def.mk. + * builds/unix/unix-def.in (BUILD_DIR, PLATFORM): Remove. + * builds/unix/unix.mk (BUILD_DIR, PLATFORM): Define. + Use BUILD_DIR. + + * docs/INSTALL, docs/INSTALL.GNU, docs/INSTALL.UNX: Update + documentation on makepp. + +2004-04-11 Werner Lemberg + + * src/lzw/zopen.c: Don't include sys/param.h and sys/stat.h. + +2004-04-10 Werner Lemberg + + * src/lzw/ftlzw.c: Include zopen.h dependent on + FT_CONFIG_OPTION_USE_LZW. + + * src/base/ftdebug.c: s/index/idx/ to avoid compiler warnings. + +2004-04-02 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5.2. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + +2004-04-01 Werner Lemberg + + * builds/unix/ft-munmap.m4 (FT_MUNMAP_PARAM): Fix arguments of + AC_COMPILE_IFELSE. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.8a. + * builds/unix/configure: Regenerated with autoconf 2.59a. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at subversions.gnu.org. + * builds/freetype.mk (refdoc): Updated. + +2004-03-31 Werner Lemberg + + Handle broken FNT files which don't have a trailing NULL byte + in the face name string. + + * src/winfonts/winfnt.h (FNT_FontRec): New member `family_name'. + * src/winfonts/winfnt.c (fnt_font_done): Free font->family_name. + (FNT_Face_Init): Append a final zero byte to the font face name. + +2004-03-30 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from + 2004-03-19. + +2004-03-27 Werner Lemberg + + * src/base/descrip.mms (OBJS): Add ftbbox.obj. + +2004-03-26 George Williams + + Add vertical phantom points. + + * include/freetype/internal/tttypes.h (TT_LoaderRec): Add + `top_bearing', `vadvance', `pp3', and `pp4'. + + * src/autofit/afloader.c (af_loader_load_g): Handle two more points. + + * src/autohint/ahhint.c (ah_hinter_load): Handle two more points. + * src/truetype/ttgload.c (Get_VMetrics): New function. + (TT_Load_Simple_Glyph, TT_Process_Simple_Glyph): Handle two more + points. + (load_truetype_glyph): Use Get_VMetrics. + Handle two more points. + (compute_glyph_metrics): Thanks to vertical phantom points we now + can always compute `advance_height' and `top_bearing'. + * src/truetype/ttobjs.h (TT_SubglyphRec): Add vertical phantom + points. + + + * src/autohint/ahglyph.c (ah_outline_load): Fix allocation of + `news'. + +2004-03-21 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Fix left side bearing. + +2004-03-20 Steve Hartwell + + * src/cache/ftcmru.c (FTC_MruList_RemoveSelection): Handle a NULL + value for `selection' as `select all'. + +2004-03-19 Steve Hartwell + + * src/sfnt/ttload.c (tt_face_load_sfnt_header): Reject face_index + values > 0 if loading non-TTC fonts. + + * src/base/ftmac.c (open_face_from_buffer): Set positive face_index + to zero before calling FT_Open_Face. + + * docs/CHANGES: Updated. + +2004-03-04 Werner Lemberg + + * Jamfile, vms_make.com, builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype/vcproj, include/freetype/ftmoderr.h: + Add LZW module. + + * Jamfile.in: Removed. + + * docs/CHANGES: Updated. + + * include/freetype/internal/ftobjs.h: s/MIN/FT_MIN/, s/MAX/FT_MAX/, + s/ABS/FT_ABS/. Updated all callers. + + * src/type1/t1load.c (parse_dict), src/pcf/pcfdrivr.c + (PCF_Face_Init): Use FT_ERROR_BASE. + +2004-03-04 Albert Chin + + Add support for PCF fonts compressed with LZW (extension .pcf.Z, + created with `compress'). + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_USE_LZW): New macro. + + * include/freetype/ftlzw.h: New file. + * include/freetype/config/ftheader.h (FT_LZW_H): New macro for + ftlzw.h. + + * src/lzw/*: New files. + + * src/pcf/pcfdrivr.c: Include FT_LZW_H. + (PCF_Face_Init): Try LZW also. + + * src/gzip/ftgzip.c: s/0/Gzip_Err_Ok/ where appropriate. + Beautify. + +2004-03-03 Werner Lemberg + + * src/pshinter/pshalgo.c (psh_hint_table_init): Simplify code. + +2004-03-02 Werner Lemberg + + Add embedded bitmap support to CFF driver. + + * src/cff/cffobjs.h (CFF_SizeRec): New structure. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_slot_load): Updated. + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Load sbit. + + * src/cff/cffobjs.c (sbit_size_reset) + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: New function. + (cff_size_get_globals_funcs, cff_size_done, cff_size_init): Updated. + (cff_size_reset): Updated. + [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Call sbit_size_reset. + + * src/cff/cffdrivr.c (Load_Glyph): Updated. + (cff_driver_class): Use CFF_SizeRec. + + * docs/CHANGES: Updated. + +2004-03-01 Werner Lemberg + + * src/pshinter/pshglob.c (psh_globals_scale_widths): Don't use + FT_RoundFix but FT_PIX_ROUND. + (psh_blues_snap_stem): Don't use blue_shift but blue_threshold. + + * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD_MAXIMUM): New macro. + (psh_glyph_find_string_points): Use PSH_STRONG_THRESHOLD_MAXIMUM. + (psh_glyph_find_blue_points): New function. Needed for fonts like + p052003l.pfb (URW Palladio L Roman) which have flex curves at the + base line within blue zones, but the flex curves aren't covered by + hints. + (ps_hints_apply): Use psh_glyph_find_blue_points. + +2004-02-27 Garrick Meeker + + * builds/unix/configure.ac: Fix compiler flags for + `--with-old-mac-fonts'. + * builds/unix/configure: Regenerated. + + * src/base/ftmac.c: s/TARGET_API_MAC_CARBON/!TARGET_API_MAC_OS8/. + (FT_New_Face_From_Resource): New function. + (FT_New_Face): Use FT_New_Face_From_Resource. + (FT_New_Face_From_FSSpec): Use FT_New_Face_From_Resource. + [__MWERKS__]: Don't include FSp_fopen.h. + +2004-02-26 Werner Lemberg + + * src/pshinter/pshglob.c (psh_globals_new): Fix value of + `dim->stdw.count'. + Don't assign default values to blue scale and blue shift. + +2004-02-25 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-02-25 Garrick Meeker + Steve Hartwell + + Improve MacOS fond support. Provide a new API + `FT_New_Face_From_FSSpec' similar to `FT_New_Face'. + + * src/base/ftmac.c [__MWERKS__]: Include FSp_fpopen.h. + STREAM_FILE [__MWERKS__]: New macro. + (ft_FSp_stream_close, ft_FSp_stream_io) [__MWERKS__]: New functions. + (file_spec_from_path) [__MWERKS__]: Updated #if statement. + (get_file_type, make_lwfn_spec): Use `const' for argument. + (is_dfont) [TARGET_API_MAC_CARBON]: Removed. + (count_face_sfnt, count_faces): New functions. + (parse_fond): Do some range checking. + (read_lwfn): Change type of second argument. + No longer call FSpOpenResFile. + (OpenFileAsResource): New function. + (FT_New_Face_From_LWFN): Use `const' for second argument. + Use OpenFileAsResource. + (FT_New_Face_From_Suitcase): Change type of second argument. + No longer call FSpOpenResFile. + Loop over all resource indices. + (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Removed. + (FT_GetFile_From_Mac_Name): Use `const' for first argument. + (ResourceForkSize): Removed. + (FT_New_Face): Updated to use new functions. + (FT_New_Face_From_FSSpec): New function. + + * include/freetype/ftmac.h: Updated. + +2004-02-24 Malcolm Taylor + + * src/autohint/ahhint.c (ah_hinter_load) : + Handle case where outline->num_vedges is zero while computing hinted + metrics. + +2004-02-24 Gordon Childs + + * src/cff/cffcmap.c (cff_cmap_unicode_init): Provide correct value + for `count'. + +2004-02-24 Werner Lemberg + + * include/freetype/t1tables.h (PS_PrivateRec): Add + `expansion_factor'. + + * src/pshinter/pshglob (psh_blues_scale_zones): Fix computation + of blues->no_overshoots -- `blues_scale' is stored with a + magnification of 1000, and `scale' returns fractional pixels. + + * src/type1/t1load.c (T1_Open_Face): Initialize `blue_shift', + `blue_fuzz', `expansion_factor', and `blue_scale' according to the + Type 1 specification. + + * src/type1/t1tokens.h: Handle `ExpansionFactor'. + + * docs/CHANGES: Updated. + +2004-02-24 Masatake YAMATO + + Provide generic access to MacOS resource forks. + + * src/base/ftrfork.c, include/freetype/internal/ftrfork.h: New + files. + + * src/base/ftobjs.c: Include FT_INTERNAL_RFORK_H. + (Mac_Read_POST_Resource, Mac_Read_sfnt_Resource): Remove arguments + `resource_listoffset' and `resource_data' and adapt code + accordingly. These values are calculated outside of the function + now. + Add new argument `offsets'. + (IsMacResource): Use `FT_Raccess_Get_HeaderInfo' and + `FT_Raccess_Get_DataOffsets'. + (load_face_in_embedded_rfork): New function. + (load_mac_face): Use load_face_in_embedded_rfork. + (ft_input_stream_new): Renamed to... + (FT_Stream_New): This. Use FT_BASE_DEF. Updated all callers. + (ft_input_stream_free): Renamed to... + (FT_Stream_Free): This. Use FT_BASE_DEF. Updated all callers. + + * src/base/ftbase.c: Include ftrfork.c. + + * src/base/rules.mk (BASE_SRC), src/base/Jamfile: Updated. + + * include/freetype/internal/internal.h (FT_INTERNAL_RFORK_H): + New macro. + + * include/freetype/internal/fttrace.h: Added `rfork' as a new + trace definition. + + * include/freetype/internal/ftstream.h: Declare FT_Stream_New and + FT_Stream_Free. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK): New option. + + * include/freetype/config/ftstdlib.h (ft_strrchr): New macro. + +2004-02-23 Werner Lemberg + + * docs/CHANGES: Updated. + + * include/freetype/internal/ftdebug.h: Include FT_FREETYPE_H. + +2004-02-23 Masatake YAMATO + + Provide a simple API to control FreeType's tracing levels. + + * include/freetype/internal/ftdebug.h (FT_Trace_Get_Count, + FT_Trace_Get_Name): New declarations. + + * src/base/ftdebug.c (FT_Trace_Get_Count, FT_Trace_Get_Name): New + functions. + +2004-02-23 David Turner + + * src/autofit/afhints.c, src/autofit/afhints.h, + src/autofit/aflatin.c, src/autofit/afloader.c, src/types.h: Grave + bugs have been fixed. The auto-fitter works, doesn't crash, but + still produces unexpected results... + +2004-02-21 Werner Lemberg + + * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD): Changed to hold + the accepted shift for strong points in fractional pixels (which + is a heuristic value). + (psh_glyph_find_strong_points): Compute threshold for + psh_hint_table_find_strong_points. + (psh_hint_table_find_strong_point): Add parameter to pass threshold. + +2004-02-20 Werner Lemberg + + * src/pshinter/pshrec.c (ps_mask_table_set_bits): Don't call + ps_mask_table_alloc but ps_mask_table_last. + (ps_hints_t2mask): Use correct position and number for vertical + and horizontal hinter mask bits. + + * docs/CHANGES: Updated. + +2004-02-19 Werner Lemberg + + * src/base/ftstroke.c (FT_Glyph_StrokeBorder): Fix enum handling. + * src/cff/cffdrivr.c (cff_get_cmap_info): Remove compiler warning. + +2004-02-18 Werner Lemberg + + * include/freetype/freetype.h: Document FT_LOAD_TARGET_XXX properly. + + * src/base/ftglyph.c (ft_bitmap_glyph_class, + ft_outline_glyph_class): Tag with FT_CALLBACK_TABLE_DEF. + + * src/smooth/ftsmooth.c (ft_smooth_render): Handle + FT_RENDER_MODE_LIGHT. + +2004-02-17 Werner Lemberg + + Fix callback functions in cache module. + + * src/cache/ftccback.h: New file for callback declarations. + + * src/cache/ftcbasic.c (ftc_basic_family_compare, + ftc_basic_family_init, ftc_basic_family_get_count, + ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph, + ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF. + (ftc_basic_image_family_class, ftc_basic_image_cache_class, + ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): + Use FT_CALLBACK_TABLE_DEF and local wrapper functions. + + * src/cache/ftccache.c: Include ftccback.h. + (ftc_cache_init, ftc_cache_done): New wrapper functions which use + FT_LOCAL_DEF. + + * src/cache/ftccmap.c: Include ftccback.h. + (ftc_cmap_cache_class): Use local wrapper functions. + + * src/cache/ftcglyph.c: Include ftccback.h. + (ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper + functions which use FT_LOCAL_DEF. + + * src/cache/ftcimage.c: Include ftccback.h. + (ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper + functions which use FT_LOCAL_DEF. + + * src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class): + Use FT_CALLBACK_TABLE_DEF. + + * src/cache;/ftcsbits.c: Include ftccback.h. + (ftc_snode_free, ftc_snode_new, ftc_snode_weight, + ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF. + + * src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h. + +2004-02-17 Masatake YAMATO + + * include/freetype/ftmac.h (FT_GetFile_From_Mac_Name): Fix a typo + (FT_EXPORT_DEF -> FT_EXPORT). + + * include/freetype/ftxf86.h (FT_Get_X11_Font_Format): Ditto. + +2004-02-15 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Fix typo. + +2004-02-14 Masatake YAMATO + + * builds/unix/ftsystem.c: Include errno.h. + (ft_close_stream): Renamed to... + (ft_close_stream_by_munmap): This. + (ft_close_stream_by_free): New function. + (FT_Stream_Open): Use fallback method if mmap fails. + Use proper function for closing the stream. + +2004-02-14 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Initialize `start_binary'. + +2004-02-13 Robert Etheridge + + * src/type42/t42objs.c (T42_Face_Init), src/type1/t1objs.c + (T1_Face_Init), src/cid/cidobjs.c (cid_face_init): Fix computation + of underline_position and underline_thickness. + +2004-02-12 Werner Lemberg + + * src/base/ftobjs.c (FT_Set_Char_Size): Return immediately if + ppem values don't change. Suggested by Graham Asher. + +2004-02-11 Werner Lemberg + + * src/cid/cidload.c (cid_face_open): Always allocate + face->cid_stream so that we can deallocate it safely. + +2004-02-10 Werner Lemberg + + Make the PS parser more tolerant w.r.t. non-standard font data. In + general, an error is only reported in case of a syntax error; a + wrong type is now simply ignored (if possible). To be independent + of the order of various MM-specific keywords, the parse_shared_dict + routine has been removed -- the PS parser is now capable to skip + this data. It no longer fails on parsing e.g. + + dup /WeightVector exch def + + Since the token following /WeightVector isn't `[' (starting an + array) it is simply ignored. + + * include/freetype/fterrdef.h: Define `FT_Err_Ignore' (0xA2) as a + new internal error value. + + * src/type1/t1load.c (parse_blend_axis_types, + parse_blend_design_positions, parse_blend_design_map): Return + T1_Err_Ignore if no proper array is following the keyword. + (parse_weight_vector): Use T1_ToTokenArray, initializing `blend' + structure, if necessary. + Return T1_Err_Ignore if no proper array is following the keyword. + (parse_shared_dict): Removed. + (parse_encoding): Set parser->root.error to return T1_Err_Ignore + if no result can be obtained. + Check for errors before accessing `elements' array. + (t1_keywords): Remove /shareddict. + (parse_dict): Reset error if t1_load_keyword returns T1_Err_Ignore. + Set keyword_flag only in case of success. + Check error code if skipping an unrecognized token. + (T1_Open_Face) [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: Call T1_Done_Blend + if blend commands haven't set up a proper MM font. + + * src/psaux/psobjs.c (ps_parser_load_field_table): Remove special + code for synthetic fonts. + Return PSaux_Err_Ignore if no proper value has been found. + +2004-02-09 Werner Lemberg + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + : Preserve glyph width before calling + cff_operator_seac. + +2004-02-09 Martin Muskens + + * src/cff/cffgload.c (cff_decoder_parse_charstrings): Handle special + first argument for `hintmask' and `cntrmask' operators also. + +2004-02-08 Werner Lemberg + + * builds/unix/configure.in: Call AC_SUBST for `enable_shared', + `hardcode_libdir_flag_spec', and `wl'. + * builds/unix/configure: Regenerated. + + * builds/unix/freetype-config.in: Make --prefix and --exec-prefix + actually work. + Report a proper --rpath (or -R) value for --libs argument if a + shared library has been built. + + * docs/CHANGES: Updated. + +2004-02-07 Keith Packard + + * src/bdf/bdfdrivr.c (BDF_Face_Init, BDF_Set_Pixel_Size): Fix + computation of various vertical and horizontal metric values. + + * src/pcfdrivr.c (PCF_Set_Pixel_Size), src/pcfread (pcf_load_font): + Ditto. + +2004-02-07 Werner Lemberg + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.dsw, docs/CHANGES: Updated. + +2004-02-07 Vitaliy Pasternak + + * builds/win32/visualc/freetype.sln, + builds/win32/visualc/freetype.vcproj: New files for VS.NET 2003. + +2004-02-03 Werner Lemberg + + * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): + Initialize `node'. + * src/type1/t1load.c (parse_dict): Initialize `have_integer'. + +2004-02-02 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Handle `RD' and `-|' commands + outside of /Subrs or /CharStrings. This can happen if there is + additional code manipulating those two arrays so that FreeType + doesn't recognize them properly. + (T1_Open_Face): Improve an error message. + +2004-02-01 Werner Lemberg + + * src/type1/t1load.c (parse_charstrings): Exit immediately if + there are no elements in /CharStrings. This is needed for fonts + like Optima-Oblique which not only define /CharStrings but access it + also. + +2004-02-01 David Turner + + * src/sfnt/Jamfile: Removing `ttcmap' from the list of sources. + + * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) + : Provide macro version which doesn't use inline code. + * include/freetype/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP) + : Ditto. + Use FTC_MRULIST_LOOKUP_CMP. + * include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): New + macro. + (FTC_MRULIST_LOOKUP): Use it. + + * src/cache/Jamfile (_sources), src/cache/descrip.mms: Updated. + * src/cache/ftcbasic.c: Fix compiler warnings. + * src/cache/ftcmanag.c (FTC_Manager_LookupSize, + FTC_Manager_LookupFace) : Use FTC_MRULIST_LOOKUP_CMP. + * src/cache/ftcmru.c (FTC_MruList_Find): Fix a bug (found after + heavy testing). + + * Jamfile: Updating `refdoc' target, and adding `autohint' to the + list of modules to build. Both the autohinter and autofitter will + be built by default. But which one will be used is determined by + the content of `ftmodule.h'. + + * src/autofit/*: Many updates, but the code is still buggy... + +2004-01-31 Werner Lemberg + + * src/cff/cffgload.c (cff_operator_seac): Fix magnitude of + accent offset. + Update code similarly to the seac support for Type 1 fonts. + (cff_decoder_parse_charstrings) : Fix magnitude + of accent offset. + Don't hint glyphs twice if seac is emulated. + : Assign correct point tags. + * docs/CHANGES: Updated. + +2004-01-30 Werner Lemberg + + * src/type1/t1parse.c (T1_Get_Private_Dict): Use FT_MEM_MOVE, not + FT_MEM_COPY, for copying the private dict. + + * src/type1/t1load.c (parse_subrs): Assign number of subrs only + in first run. + (parse_charstrings): Parse /CharStrings in second run without + assigning values. + (parse_dict): Skip all /CharStrings arrays but the first. We need + this for non-standard fonts like `Optima' which have different + outlines depending on the resolution. Note that there is no + guarantee that we get fitting /Subrs and /CharStrings arrays; this + can only be done by a real PS interpreter. + +2004-01-29 Antoine Leca + + * builds/win32/visualc/index.html: New file, giving detailed + explanations about forcing CR+LF line endings for the VC++ project + files. + +2004-01-22 Garrick Meeker + + * src/cff/cffload.c (cff_subfont_load): Initialize `dict'. + +2004-01-22 Werner Lemberg + + Add support for the hexadecimal representation of binary data + started with `StartData' in CID-keyed Type 1 fonts. + + * include/freetype/internal/t1types.h (CID_FaceRec): Add new + members `binary_data' and `cid_stream'. + + * src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'. + (cid_hex_to_binary): New auxiliary function. + (cid_face_open): Add new argument `face_index' to return quickly + if less than zero. Updated all callers. + Call `cid_hex_to_binary', then open and assign memory stream to + `face->cid_stream' if `parser->binary_length' is non-zero. + * src/cid/cidload.h: Updated. + + * src/cid/cidobjs.c (cid_face_done): Free `binary_data' and + `cid_stream'. + + * src/cid/cidparse.c (cid_parser_new): Check arguments to + `StartData' and set parser->binary_length accordingly. + * src/cid/cidparse.h (CID_Parser): New member `binary_length'. + + * src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'. + + * docs/CHANGES: Updated. + +2004-01-21 Werner Lemberg + + include/freetype/config/ftstdlib.h (ft_atoi): Replaced with... + (ft_atol): This. + * src/base/ftdbgmem.c: s/atol/ft_atol/. + * src/type42/t42drivr.c: s/ft_atoi/ft_atol/. + +2004-01-20 Masatake YAMATO + + * include/freetype/ftcache.h: Delete duplicated definition of + FTC_FaceID. + + * src/cff/cffdrivr.c (cff_get_cmap_info): Call sfnt module's TT CMap + Info service function if the cmap comes from sfnt. Return 0 if the + cmap is sythesized in cff module. + +2004-01-20 David Turner + + * src/cache/ftcmanag.c (ftc_size_node_compare): Call + FT_Activate_Size. + +2004-01-20 Werner Lemberg + + * src/type1/t1parse.c (T1_Get_Private_Dict): Skip exactly one + CR, LF, or CR/LF after `eexec'. + +2004-01-18 David Turner + + * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Remove compiler + warning. + + * src/tools/docmaker/*: Updating beautifier tool. + +2004-01-15 David Turner + + * src/base/ftoutln.c (ft_orientation_extremum_compute): Fix + infinite loop bug. + + * include/freetype/ftstroke.h: Include FT_GLYPH_H. + (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_Glyph_StrokeBorder): New + declarations. + + * src/base/ftstroke.c: Include FT_INTERNAL_OBJECTS_H. + (FT_Outline_GetOutsideBorder): Inverse result. + (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_GlyphStrokeBorder): New + functions. + (FT_Stroker_EndSubPath): Close path if needed. + (FT_Stroker_Set, FT_Stroker_ParseOutline): Use FT_Stroker_Rewind. + + * include/freetype/cache/ftcmanag.h (FTC_ScalerRec, + FTC_Manager_LookupSize): Moved to... + * include/freetype/ftcache.h (FTC_ScalerRec, + FTC_Manager_LookupSize): Here. + + * src/tools/docmaker/docbeauty.py: New file to beautify the + documentation comments (e.g., to convert them to single block border + mode). + * src/tools/docmaker/docmaker.py (file_exists, make_file_list): + Moved to... + * src/tools/docmaker/utils.py (file_exists, make_file_list): Here. + +2004-01-14 David Turner + + * include/freetype/internal/ftmemory.h (FT_ARRAY_COPY, + FT_ARRAY_MOVE): New macros to make copying arrays easier. + Updated all relevant code to use them. + +2004-01-14 Werner Lemberg + + * src/cff/cffload.c (cff_font_load): Load charstrings_index earlier. + Use number of charstrings as argument to CFF_Load_FD_Select (as + documented in the CFF specs). + +2004-01-13 Graham Asher + + * src/pshinter/pshalgo.c (psh_glyph_init): Move assignment of + `glyph->memory' up to free arrays properly in case of failure. + +2004-01-10 Masatake YAMATO + + Make `FT_Get_CMap_Language_ID' work with CFF. Bug reported by + Steve Hartwell . + + * src/cff/cffdrivr.c: Include FT_SERVICE_TT_CMAP_H. + (cff_services): Added an entry for FT_SERVICE_ID_TT_CMAP. + (cff_get_cmap_info): New function. + (cff_service_get_cmap_info) New entry for cff_services. + + * src/sfnt/ttcmap0.c: Exit loop after a format match has been found. + Suggested by Steve Hartwell . + +2004-01-03 Masatake YAMATO + + * src/base/ftobjs.c (destroy_charmaps): New function. + (destroy_face, open_face): Use `destroy_charmaps'. + +2004-01-01 Werner Lemberg + + * docs/CHANGES: Updated. + +2004-01-01 Michael Jansson + + * src/winfonts/winfnt.c (FNT_Size_Set_Pixels): Fix sign of + size->metrics.descender. + +2003-12-31 Wolfgang Domröse + + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Use `%ld' in FT_TRACE4. + : Change type of dx and dy to FT_Pos and remove + cast for accessing arguments. + +2003-12-31 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Revert previous + change. It's not necessary. + +2003-12-29 Smith Charles + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle `repeated + flags set' correctly. + +2003-12-29 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Fix memory leak by deallocating + `full' and `weight' properly. + * src/cff/cffgload.c (cff_decoder_parse_charstrings) + [FT_DEBUG_LEVEL_TRACE]: Use `0x' as prefix for + tracing output. + +2003-12-26 Werner Lemberg + + * include/freetype/internal/sfnt.h (TT_Set_SBit_Strike_Func): + Use FT_UInt for ppem values. + * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use FT_UInt for + ppem values. + * src/sfnt/ttsbit.h: Updated. + + * src/base/ftobjs.c (FT_Set_Pixel_Sizes): Don't allow ppem values + larger than -0FFFF. + +2003-12-25 Werner Lemberg + + * src/base/fttrigon.c, src/base/ftgloadr.c: Inlude + FT_INTERNAL_OBJECTS_H. + + * src/base/ftstroke.c (FT_Outline_GetInsideBorder, + FT_Outline_GetOutsideBorder): s/or/o/ to make it compile with + C++ compilers. + + * src/cache/ftcmru.c, include/freetype/cache/ftcmru.h: + s/select/selection/ to avoid compiler warning. + * src/cff/cffload.h: s/select/ftselect/ to avoid potential + compiler warning. + +2003-12-24 Werner Lemberg + + * src/cache/ftcsbits.c (FTC_SNode_Weight): + s/FTC_SBIT_ITEM_PER_NODE/FTC_SBIT_ITEMS_PER_NODE/. + +2003-12-24 David Turner + + * Fixed compilation problems in the cache sub-system. + + * Partial updates to src/autofit. + + * Jamfile (FT2_COMPONENTS): Add autofit module. + +2003-12-23 Werner Lemberg + + * src/cff/cffgload.c (cff_lookup_glyph_by_stdcharcode): Handle + CID-keyed fonts. + +2003-12-23 David Turner + + * include/freetype/internal/ftobjs.h (FT_PAD_FLOOR, FT_PAD_ROUND, + FT_PAD_CEIL, FT_PIX_FLOOR, FT_PIX_ROUND, FT_CEIL): New macros. They + are used to avoid compiler warnings with very pedantic compilers. + Note that `(x) & -64' causes a warning if (x) is not signed. Use + `(x) & ~63' instead! + Updated all related code. + + Add support for extraction of `inside' and `outside' borders. + + * src/base/ftstroke.c (FT_StrokerBorder): New enumeration. + (FT_Outline_GetInsideBorder, FT_Outline_GetOutsideBorder, + FT_Stroker_GetBorderCounts, FT_Stroker_ExportBorder): New functions. + (FT_StrokeBorderRec): New boolean member `valid'. + (ft_stroke_border_get_counts): Updated. + * include/freetype/ftstroke.h: Updated. + +2003-12-22 Werner Lemberg + + * include/freetype/ftwinfnt.h (FT_WinFNT_ID_*): New definitions + to describe the `charset' field in FT_WinFNT_HeaderRec. + * src/winfonts/winfnt.c (FNT_Face_Init): Set encoding to + FT_ENCODING_NONE except for FT_WinFNT_ID_MAC. + + * include/freetype/freetype.h (FT_Encoding): Improve comment, + based on work by Detlef Würkner . + + * docs/CHANGES: Updated. + +2003-12-22 David Turner + + * include/freetype/ftcache.h, + include/freetype/cache/ftcmanag.h, + include/freetype/cache/ftccache.h, + include/freetype/cache/ftcmanag.h, + include/freetype/cache/ftcmru.h (added), + include/freetype/cache/ftlru.h (removed), + include/freetype/cache/ftcsbits.h, + include/freetype/cache/ftcimage.h, + include/freetype/cache/ftcglyph.h, + src/cache/ftcmru.c, + src/cache/ftcmanag.c, + src/cache/ftccache.c, + src/cache/ftcglyph.c, + src/cache/ftcimage.c, + src/cache/ftcsbits.c, + src/cache/ftccmap.c, + src/cache/ftcbasic.c (added), + src/cache/ftclru.c (removed): + + *Complete* rewrite of the cache sub-system to `solve' the + following points: + + - all public APIs have been moved to FT_CACHE_H, everything + under `include/freetype/cache' is only needed by client + applications that want to implement their own caches + + - a new function named FTC_Manager_RemoveFaceID to deal + with the uninstallation of FaceIDs + + - the image and sbit cache are now abstract classes, that + can be extended much more easily by client applications + + - better performance in certain areas. Further optimizations + to come shortly anyway... + + - the FTC_CMapCache_Lookup function has changed its signature, + charmaps can now only be retrieved by index + + - FTC_Manager_Lookup_Face => FTC_Manager_LookupFace + FTC_Manager_Lookup_Size => FTC_Manager_LookupSize (still in + private header for the moment) + +2003-12-21 Werner Lemberg + + * src/type1/t1load.c (parse_dict): Stop parsing if `eexec' keyword + is encountered. + +2003-12-19 Werner Lemberg + + * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 32. For + example, the Japanese Hiragino font already contains 15 subfonts. + + * src/cff/cffload.c (cff_font_load): Deallocate `sids' array for + CID-keyed fonts. + + * devel/ftoption.h: Define FT_DEBUG_MEMORY. + +2003-12-18 Werner Lemberg + + * include/freetype/ttnameid.h (TT_ADOBE_ID_LATIN_1): New macro. + * src/type1/t1objs.c (T1_Face_Init): Use TT_ADOBE_ID* values. + +2003-12-18 Werner Lemberg + + * src/cff/cfftypes.h (CFF_FontRecDictRec): Change type of + `cid_count' to `FT_ULong'. + + * src/cff/cffgload.c (cff_slot_load): Take care of empty `cids' + array. + + * src/cff/cffload.c (cff_charset_done): Free `cids' array. + (cff_font_load): Create cids array only for CID-keyed fonts which + are subsetted. + + * src/cff/cffobjs.c (cff_face_init): Check the availability of + the PSNames modules for non-pure CFFs also. + Set FT_FACE_FLAG_GLYPH_NAMES for a non-pure CFF also if it isn't + CID-keyed. + + * src/cff/rules.mk (CFF_DRV_H): Add cfftypes.h. + +2003-12-17 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_init_face): Don't set + FT_FACE_FLAG_GLYPH_NAMES if the font contains a version 3.0 `post' + table. + + * docs/CHANGES: Updated. + +2003-12-17 Masatake YAMATO + + Add new function FT_Get_CMap_Language_ID to extract the language ID + for TrueType/sfnt fonts. + + * include/freetype/internal/services/svttcmap.h: New file. + * include/freetype/internal/ftserv.h (FT_SERVICE_TT_CMAP_H): Add + svttcmap.h. + + * src/sfnt/sfdriver.c: Include ttcmap0.h. + (tt_service_get_cmap_info): New service. + (sfnt_services): Updated. + + * src/sfnt/ttcmap0.c (tt_cmap*_get_info): New functions. + (tt_cmap*_class_rec): Add tt_cmap*_get_info members. + (tt_get_cmap_info): New function. + * src/sfnt/ttcmap0.h: Include FT_SERVICE_TT_CMAP_H. + (TT_CMap_ClassRec): New field `get_cmap_info'. + (tt_get_cmap_info): New declaration. + + * src/base/ftobjs.c: Include FT_SERVICE_TT_CMAP_H. + (FT_Get_CMap_Language_ID): New function implementation. + * include/freetype/tttables.h (FT_Get_CMap_Language_ID): New + function declaration. + +2003-12-16 Werner Lemberg + + * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: Removed. Obsolete. + + * include/freetype/internal/sfnt.h (SFNT_Interface): Remove + obsolete fields `load_charmap' and `free_charmap'. + (TT_CharMap_Load_Func, TT_CharMap_Free_Func): Removed. + * src/sfnt/sfnt.c: Don't include ttcmap.c. + * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttcmap.c. + * src/sfnt/ttload.c: Don't include ttcmap.h. + * src/sfnt/sfdriver.c: Don't include ttcmap.h. + (sfnt_interface): Updated. + + * include/freetype/internal/tttypes.h (TT_TableDirRec, + TT_CMapDirRec, TT_CMapDirEntryRec, TT_CMap0, TT_CMap2SubHeaderRec, + TT_CMap2Rec, TT_CMap4Segment, TT_CMap4Rec, TT_CMap6, + TT_CMapGroupRec, TT_CMap8_12Rec, TT_CMap10Rec, TT_CharMap_Func, + TT_CharNext_Func, TT_CMapTableRec, TT_CharMapRec): Removed. + Obsolete. + * src/cff/cffobjs.h (CFF_CharMapRec): Removed. Obsolete. + +2003-12-15 Werner Lemberg + + * docs/CHANGES: Updated. + +2003-12-15 Wolfgang Domröse + + * builds/atari/*: New directory for building FreeType 2 on Atari + with the PureC compiler. + +2003-12-12 Wolfgang Domröse + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add + cast. + * src/cff/cffdrivr.c (cff_ps_has_glyph_names): Assure that return + value is either 0 or 1. + +2003-12-12 Werner Lemberg + + * src/cff/cffdrivr.c (cff_get_glyph_name): Improve error message. + (cff_get_name_index): Return if no PSNames service is available. + (cff_ps_has_glyph_names): Handle CID-keyed fonts correctly. + * src/cff/cfftypes.h (CFF_CharsetRec): New field `cids', used for + CID-keyed fonts. This is the inverse mapping of `sids'. + * src/cff/cffload.c (cff_charset_load): New argument `invert'. + Initialize charset->cids if `invert' is set. + (cff_font_load): In call to cff_charset_load, set `invert' to true + for CID-keyed fonts. + * src/cff/cffgload.c (cff_slot_load): Handle glyph index as CID + and map it to the real glyph index. + + * docs/CHANGES: Updated. + +2003-12-11 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Don't set + FT_FACE_FLAG_GLYPH_NAMES for CID-keyed fonts. + Don't construct a cmap for CID-keyed fonts. + +2003-12-10 Werner Lemberg + + Use implementation specific SID value 0xFFFF to indicate that + a dictionary element is missing. + + * src/cff/cffload.c (cff_subfont_load): Initialize all fields + which hold SIDs to 0xFFFF. + (cff_index_get_sid_string): Handle SID value 0xFFFF. + Handle case where `psnames' is zero. + (cff_font_load): Updated. + Don't load encoding for CID-keyed CFFs. + + * src/cff/cffobjs.c (cff_face_init): Updated. + Don't check for PSNames module if font is CID-keyed. + Compute style name properly (using the same algorithm as in the + CID driver). + Fix computation of style flags. + + * src/cff/cfftoken.h: Comment out handling of base_font_name. + Rename `postscript' field to `embedded_postscript' + * src/cff/cfftypes.h (CFF_FontRecDictRec): Remove `base_font_name' + and `postscript'. + +2003-12-10 Detlef Würkner + + * src/pcf/pcfdrivr.c (pcf_get_charset_id): New function (a clone + of the similar BDF function). + (pcf_service_bdf): Use it. + +2003-12-09 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Set FT_FACE_FLAG_GLYPH_NAMES + only if a `post' table is present. + +2003-12-09 George Williams + + * src/base/ftobjs.c (load_mac_face): Recent versions of Linux + support Mac's HFS+ file system, thus enable code to read /rsrc on + non-Macintosh platforms also. + +2003-12-08 Werner Lemberg + + * include/freetype/internal/psaux.h (PS_TableRec): Change type + of `lengths' to FT_PtrDist. + (T1_DecoderRec): Change type of `subrs_len' to FT_PtrDist. + * include/freetype/internal/t1types.h (T1_FontRec): Change type + of `subrs_len' and `charstrings_len' to FT_PtrDist. + + * src/base/ftobjs.c (Mac_Read_POST_Resource): Replace `junk' + variable with better solution. + (IsMacResource): Remove unused variable `map_len'. + Replace `junk' variable with better solution. + (FT_Open_Face) [!FT_MACINTOSH]: Add conditional + FT_CONFIG_OPTION_MAC_FONTS. + +2003-12-08 Wolfgang Domröse + + * src/autohint/ahhint.c (ah_hinter_hint_edges, + ah_hinter_align_strong_points): Add some casts. + + * src/base/ftoutln.c (FT_OrientationExtremumRec): Change type + of `pos' to FT_Long. + + * src/base/ftobjs.c (Mac_Read_POST_Resource, + Mac_Read_sfnt_Resource): Change type of `len' to FT_Long. + + * src/type42/t42parse.c (t42_parse_dict): Add cast for `n_keywords'. + +2003-12-07 Werner Lemberg + + * docs/raster.txt: New file, taken from FreeType 1 and completely + revised. + +2003-12-04 Masatake YAMATO + + * src/type1/t1driver.c (Get_Interface): Remove FT_UNUSED for + t1_interface. t1_interface is used. + +2003-11-27 David Turner + + * src/pfr/pfrdrivr.c (pfr_get_metrics): Revert incorrect change of + 2003-11-23: For PFR fonts, metrics->x_scale and metrics->y_scale are + the scaling values for outline units, not for metric units. + +2003-11-25 Werner Lemberg + + * src/base/ftcalc.c, include/freetype/internal/ftcalc.h + (FT_MulDiv_No_Round): Surround code with `#ifdef + TT_CONFIG_OPTION_BYTECODE_INTERPRETER ... #endif'. + +2003-11-23 Werner Lemberg + + * src/base/ftcalc.c (FT_MulDiv_No_Round): New function (32 and + 64 bit version). + * include/freetype/internal/ftcalc.h: Updated. + + * src/truetype/ttinterp.c (TT_MULDIV_NO_ROUND): New macro. + (TT_INT64): Removed. + (DO_DIV): Use TT_MULDIV_NO_ROUND. + + * src/pfr/pfrdrivr.c (pfr_get_metrics): Directly use + metrics->x_scale and metrics->y_scale. + +2003-11-22 Rogier van Dalen + + * src/truetype/ttinterp.c (CUR_Func_move_orig): New macro. + (Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New + functions. Similar to Direct_Move, Direct_Move_X, and + Direct_Move_Y but without touching. + (Compute_Funcs): Use new functions. + + (Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid, + Round_Up_To_Grid, Round_To_Double_Grid, Round_Super, + Round_Super_45): Fix rounding of value zero. + + (DO_DIV): Don't use TT_MULDIV. + + (Ins_SHC): This instruction actually touches the points. + (Ins_MSIRP): Fix undocumented behaviour. + + * src/truetype/ttinterp.h (TT_ExecContextRec): Updated. + +2003-11-22 Werner Lemberg + + * docs/VERSION.DLL, docs/CHANGES: Updated. + + * src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and + metrics->y_scale really precise. + + (FT_Load_Glyph): Update computation of linearHoriAdvance and + linearVertAdvance. + + * src/truetype/ttinterp.c (Update_Max): Use FT_REALLOC. + +2003-11-22 David Turner + + * src/autofit/*: More updates. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8. + * builds/unix/configure.ac (version_info): Set to 9:6:3. + * README: Updated. + +2003-11-13 John A. Boyd Jr. + + * src/bdf/bdfdrivr.c (bdf_interpret_style), src/pcf/pcfread.c + (pcf_interpret_style): Replace spaces with dashes in properties + SETWIDTH_NAME and ADD_STYLE_NAME to simplify parsing. + +2003-11-11 Werner Lemberg + + * docs/CHANGES: Updated. + +2003-11-11 John A. Boyd Jr. + + Handle SETWIDTH_NAME and ADD_STYLE_NAME properties for BDF and PCF + fonts. + + * src/bdf/bdfdrivr.c (bdf_interpret_style): New auxiliary function. + (BDF_Face_Init): Don't handle style properties but call + bdf_interpret_style. + + * src/pcf/pcfread.c (pcf_interpret_style): New auxiliary function. + (pcf_load_font): Don't handle style properties but call + pcf_interpret_style. + +2003-11-07 Werner Lemberg + + + * Version 2.1.7 released. + ========================= + + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7. + + * builds/unix/ft2unix.h: Fix comments. + + * builds/unix/ftconfig.in: Synchronized with ANSI version. + Use `#undef' in templates as recommended in the autoconf + documentation. + Since real `#undef' lines don't survive during configuration, use + `/undef' instead; the postprocessing facility of the + AC_CONFIG_HEADERS autoconf macro converts them to `#undef'. + + * builds/unix/install.mk (install): Install Unix version of + `ftconfig.h'. + + * builds/unix/unix-cc.in (CFLAGS): Set FT_CONFIG_CONFIG_H macro + to include the correct `ftconfig.h' file. + + * builds/unix/ft-munmap.m4 (FT_MUNMAP_DECL): Removed. + (FT_MUNMAP_PARAM): Updated syntax to autoconf 2.59. + + * builds/unix/freetype2.m4: Updated syntax to autoconf 2.59. + + * builds/unix/configure.ac: Use AC_CONFIG_HEADERS instead of + AC_CONFIG_HEADER to create ftconfig.h, and use second argument + to replace `/undef' with `#undef'. + Don't use FT_MUNMAP_DECL but AC_CHECK_DECLS to check for munmap. + Use AS_HELP_STRING in AC_ARG_WITH. + Update syntax to autoconf 2.59. + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.5. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.7.8. + * builds/unix/configure: Regenerated with autoconf 2.59. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at subversions.gnu.org. + + * builds/vms/ftconfig.h: Synchronized with ANSI version. + + * docs/CUSTOMIZE: Fix documentation error. + * docs/CHANGES, docs/VERSION.DLL, docs/release: Updated. + + * builds/freetype.mk (refdoc): Updated --title. + +2003-11-07 David Turner + + + * Version 2.1.6 released. + ========================= + + + * install: Removed. Obsolete. + +2003-11-04 Werner Lemberg + + * src/sfnt/sfdriver.c: Include FT_SERVICE_SFNT_H. + (sfnt_service_sfnt_table): New service. + (sfnt_services): Updated. + + * docs/license.txt: Reworded. + +2003-11-03 Werner Lemberg + + * include/freetype/*: Add a guard to all public header files which + load FT_FREETYPE_H to reject freetype.h from FreeType 1. + +2003-11-02 Patrick Welche + + * builds/unix/freetype2.m4, builds/unix/ft-munmap.m4: Protect + first argument of AC_DEFUN with brackets to avoid possible + expansion. + +2003-11-02 Werner Lemberg + + * include/freetype/cache/ftcglyph.h: Don't include stddef.h. + + * include/freetype/freetype.h: Fix check for ft2build.h. + +2003-11-01 Werner Lemberg + + * include/freetype/freetype.h: Check that ft2build.h has been + loaded first. + + * src/base/fttype1.c (FT_Get_PS_Font_Info): Fix incorrectly applied + patch. + +2003-10-31 Detlef Würkner + + * src/base/fttype1.c (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): + Fix parameter order in calls to FT_FACE_FIND_SERVICE. + +2003-10-31 Werner Lemberg + + * include/freetype/internal/ftserv.h + (FT_SERVICE_POSTSCRIPT_NAMES_H): Removed. Unused. + + * src/type42/t42drivr.c (t42_services): Updated. + +2003-10-29 David Turner + + * include/freetype/internal/bdftypes.h: Removed. Obsolete. + * src/base/ftbdf.c: Updated. + + * include/freetype/internal/cfftypes.h: Moved to... + * src/cff/cfftypes.h: This place since no other module needs to + know about those types. + + * include/freetype/internal/t42types.h: Moved to... + * src/type42/t42types.h: This place since no other module needs to + know about those types. + + * include/freetype/internal/services/svbdf.h: Include FT_BDF_H. + + * include/freetype/internal/services/svpsname.h: Renamed to... + * include/freetype/internal/services/svpscmap.h: This. + Updated `FT_Service_PsNames' -> `FT_Service_PsCMaps' and + `POSTSCRIPT_NAMES' -> `POSTSCRIPT_CMAPS' everywhere. + + * include/freetype/internal/services/svpsinfo.h: New file, providing + PostScript info service. + + * include/freetype/internal/ftserv.h (FT_SERVICE_POSTSCRIPT_CMAPS_H, + FT_SERVICE_POSTSCRIPT_INFO_H): New macros for svpscmap.h and + svpsinfo.h. + * include/freetype/internal/internal.h (FT_INTERNAL_TYPE42_TYPES_H, + FT_INTERNAL_CFF_TYPES_H, FT_INTERNAL_BDF_TYPES_H): Removed. + + * src/base/fttype1.c: Don't include FT_INTERNAL_TYPE1_TYPES_H and + FT_INTERNAL_TYPE42_TYPES_H but FT_INTERNAL_SERVICE_H and + FT_SERVICE_POSTSCRIPT_INFO_H. + (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): Use new + POSTSCRIPT_INFO service. + + * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (cff_ps_has_glyph_names): New function. + (cff_service_ps_info): New service. + (cff_services): Updated. + + * src/cff/cffload.h, src/cff/cffobjs.h, src/cff/cffparse.h: Don't + include FT_INTERNAL_CFF_TYPES_H but cfftypes.h directly. + + * src/cif/cidriver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (cid_ps_get_font_info): New function. + (cid_service_ps_info): New service. + (cid_services): Updated. + + * src/type1/t1driver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (t1_ps_get_font_info, t1_ps_has_glyph_names): New functions. + (t1_service_ps_info): New service. + (t1_services): Updated. + + * src/type42/t42drivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H. + (t42_ps_get_font_info, t42_ps_has_glyph_names): New functions. + (t42_service_ps_info): New service. + + * src/type42/t42objs.h: Don't include FT_INTERNAL_TYPE42_TYPES_H + but t42types.h directly. + + * src/psnames/psmodule.c (psnames_interface, psnames_services): + Renamed to... + (pscmaps_interface, pscmaps_services): This. + Updated all users. + + + * src/gzip/infblock.c (inflate_blocks): Remove compiler warning. + +2003-10-22 Werner Lemberg + + * src/type1/t1load.c (parse_encoding): Handle `/Encoding [ ... ]'. + + * src/type1/t1parse.c (T1_Get_Private_Dict): Test whether `eexec' + is real. + + * src/type42/t42parse.c (t42_parse_encoding): Improve boundary + checking while parsing. + + * docs/CHANGES: Updated. + +2003-10-21 Josselin Mouette + + * include/freetype/internal/t1types.h (T1_FontRec): `paint_type' + and `stroke_width' aren't pointers. + + * src/type42/t42objs.c (T42_Face_Done), src/type1/t1objs.c + (T1_Face_Done): Don't free `paint_type' and `stroke_width'. + +2003-10-20 Graham Asher + + * src/winfonts/winfnt.c (fnt_cmap_class): Fix position of `const'. + +2003-10-19 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Patch from + 2003-08-18 introduced a severe bug (FT_Render_Glyph was called + twice under some circumstances, causing strange results). This + is fixed now by clearing the FT_LOAD_RENDER bit of `load_flags'. + + * src/base/ftpfr.c (FT_Get_PFR_Metrics): Initialize `error'. + * src/psaux/psobjs.c (ps_tobytes): Initialize `n'. + * src/type42/t42parse.c (t42_parse_sfnts): Initialize `string_size'. + +2003-10-16 Werner Lemberg + + Completely revised Type 42 parser. It now handles both fonts + produced with ttftot42 (tested version 0.3.1) and + TrueTypeToType42.ps (tested version May 2001; it is necessary to + fix the broken header comment to be `%!PS-TrueTypeFont...'). + + * src/type42/t42objs.c (T42_GlyphSlot_Load): Change fourth + parameter to `FT_UInt'. + * src/type42/t42objs.h: Updated. + + * src/type42/t42parse.h (T42_ParserRec): Change type of `in_memory' + to FT_Bool. + (T42_Loader): Change type of `num_chars' and `num_glyphs' to + FT_UInt. + Add `swap_table' element. + * src/type42/t42parse.c (T42_KEYWORD_COUNT, T1_ToFixed, + T1_ToCoordArray, T1_ToTokenArray): Removed. + (T1_ToBytes): New macro. + (t42_is_alpha, t42_hexval): Removed. + (t42_is_space): Handle `\0'. + (t42_parse_encoding): Updated to use new PostScript parser routines + from psaux. + Handle `/Encoding [ ... ]' also. + (T42_Load_Status): New enumeration. + (t42_parse_sfnts): Updated to use new PostScript parser routines + from psaux. + (t42_parse_charstrings): Updated to use new PostScript parser + routines from psaux. + Handle `/CharStrings << ... >>' also. + Don't expect that /.notdef is the first element in dictionary. Copy + code from type1 module to handle this. + (t42_parse_dict): Updated to use new PostScript parser routines + from psaux. + Remove code for synthetic fonts (which can't occur in Type 42 + fonts). + (t42_loader_done): Release `swap_table'. + + * src/psaux/psobjs.c (skip_string): Increase `cur' properly. + + * src/type1/t1load.c (parse_charstrings): Make test for `.notdef' + faster. + +2003-10-15 Graham Asher + + * src/autohint/ahglobal.c (blue_chars), src/winfonts/winfnt.c + (fnt_cmap_class_rec, fnt_cmap_class), src/bdf/bdflib.c (empty, + _num_bdf_properties), src/gzip/infutil.c (inflate_mask), + src/gzip/inffixed.h (fixed_bl, fixed_bd, fixed_tl, fixed_td), + src/gzip/inftrees.h (inflate_trees_fixed), srf/gzip/inftrees.c + (inflate_trees_fixed): Decorate with more `const' to avoid + writable global variables which are disallowed on ARM. + +2003-10-08 Werner Lemberg + + * src/type1/t1load.c (parse_font_matrix, parse_charstrings): Remove + code specially for synthetic fonts; this is handled elsewhere. + (parse_encoding): Remove code specially for synthetic fonts; this is + handled elsewhere. + Improve boundary checking while parsing. + (parse_dict): Improve boundary checking while parsing. + Use ft_memcmp to simplify code. + +2003-10-07 Werner Lemberg + + * src/type1/t1load.c (parse_subrs, parse_dict): Handle synthetic + fonts properly. + (parse_charstrings): Copy correct number of characters into + `name_table'. + +2003-10-06 Werner Lemberg + + Heavy modification of the PS parser to handle comments and strings + correctly. This doesn't slow down the loading of PS fonts + significantly since charstrings aren't affected. + + * include/freetype/config/ftstdlib.h (ft_xdigit): Renamed to... + (ft_isxdigit): This. Updated all callers. + (ft_isdigit): New alias to `isdigit'. + + * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): Renamed + `skip_alpha' to `skip_PS_token'. + Add parameter to `to_bytes' and change some argument types. + + * src/psaux/psauxmod.c (ps_parser_funcs): Updated. + * src/psaux/psobjs.c (ft_char_table): New array to map character + codes (ASCII and EBCDIC) of digits to numbers. + (OP): New auxiliary macro holding either `>=' or `<' depending on + the character encoding. + (skip_comment): New function. + (skip_spaces): Use it. + (skip_alpha): Removed. + (skip_literal_string, skip_string): New functions. + (ps_parser_skip_PS_token): New function. This is a better + replacement of... + (ps_parser_skip_alpha): Removed. + (ps_parser_to_token, ps_parser_to_token_array): Updated. + (T1Radix): Rewritten, using `ft_char_table'. + (t1_toint): Renamed to... + (ps_toint): This. Update all callers. + Use `ft_char_table'. + (ps_tobytes): Add parameter to handle delimiters and change some + argument types. + Use `ft_char_table'. + (t1_tofixed): Renamed to... + (ps_tofixed): This. Update all callers. + Use `ft_char_table'. + (t1_tocoordarray): Renamed and updated to... + (ps_tocoordarray): This. Update all callers. + (t1_tofixedarray): Renamed and updated to... + (ps_tofixedarray): This. Update all callers. + (t1_tobool): Renamed to... + (ps_tobool): This. Update all callers. + (ps_parser_load_field): Updated. + (ps_parser_load_field_table): Use `T1_MAX_TABLE_ELEMENTS' + everywhere. + (ps_parser_to_int, ps_parser_to_fixed, ps_parser_to_coord_array, + ps_parser_to_fixed_array): Skip spaces. Updated. + (ps_parser_to_bytes): Add parameter to handle delimiters and change + some argument types. Updated. + * src/psaux/psobjs.h: Updated. + + * src/cid/cidload.c (cid_parse_dict): Updated. + * src/cid/cidparse.c (cid_parser_new): Check whether the `StartData' + token was really found. + * src/cid/cidparse.h (cid_parser_skip_alpha): Updated and renamed + to... + (cid_parser_skip_PS_token): This. + + * src/type1/t1parse.h (T1_ParserRec): Use `FT_Bool' for boolean + fields. + (T1_Skip_Alpha): Replaced with... + (T1_Skip_PS_Token): This new macro. + * src/type1/t1parse.c (hexa_value): Removed. + (T1_Get_Private_Dict): Use `ft_isxdigit' and + `psaux->ps_parser_funcs_to_bytes' for handling ASCII hexadecimal + encoding. + After decrypting, replace the four random bytes at the beginning + with whitespace. + * src/type1/t1load.c (t1_allocate_blend): Use proper error values. + (parser_blend_design_positions, parse_blend_design_map, + parse_weight_vector): Updated. + (is_space): Handle `\f' also. + (is_name_char): Removed. + (read_binary_data): Updated. + (parse_encoding): Use `ft_isdigit'. + Updated. + (parse_subrs): Updated. + (TABLE_EXTEND): New macro. + (parse_charstrings): Updated. + Provide a workaround for buggy fonts which have more entries in the + /CharStrings dictionary then expected; the function now adds some + slots and skips entries which still exceed the new limit. + (parse_dict): Updated. + Terminate on the token `closefile'. + + * src/type42/t42parse.c (T1_Skip_Alpha): Replaced with... + (T1_Skip_PS_Token): This new macro. Updated all callers. + (t42_parse_encoding): Use `ft_isdigit'. + + + * src/base/ftmm.c (ft_face_get_mm_service): Return FT_Err_OK if + success. + +2003-10-05 Werner Lemberg + + * include/freetype/ftmodule.h: Renamed to... + * include/freetype/ftmodapi.h: This to avoid duplicate file names. + * include/freetype/config/ftheader.h (FT_MODULE_H): Updated. + +2003-10-04 Werner Lemberg + + * src/base/ftoutln.c (FT_OrientationExtremumRec, + FT_Outline_Get_Orientation): Trivial typo fixes to make it compile. + +2003-10-02 Markus F.X.J. Oberhumer + + * src/winfonts/winfnt.c (FT_WinFNT_HeaderRec): `color_table_offset' + has four bytes, not two. + Fix all users. + (fnt_font_load, FNT_Load_Glyph): Add more font validity tests. + +2003-10-01 David Turner + + * src/autofit/*: Adding first source files of the new multi-script + `auto-fitter'. + + * include/freetype/ftoutln.h (FT_Orientation): New enumeration. + (FT_Outline_Get_Orientation): New declaration. + + * src/base/ftoutln.c (FT_OrientationExtremumRec): New structure. + (ft_orientation_extremum_compute): New auxiliary function. + (FT_Outline_Get_Orientation): New function to compute the fill + orientation of a given glyph outline. + + * include/freetype/internal/ftserv.h (FT_FACE_LOOKUP_SERVICE): Fixed + trivial bug which could crash the font engine when a cached service + pointer was retrieved. + +2003-09-30 Werner Lemberg + + * src/cid/cidload.c (cid_parse_dict): Skip token if no keyword is + found. + + * src/type1/t1parse.c (IS_T1_WHITESPACE, IS_T1_LINESPACE, + IS_T1_SPACE): Removed. + (PFB_Tag): Removed. + (read_pfb_tag): Don't use PFB_Tag. + + * src/type42/t42parse.c (t42_is_space): Handle `\f' also. + (t42_parse_encoding): Handle synthetic fonts. + +2003-09-29 Werner Lemberg + + * include/freetype/internal/t1types.h: Don't include + FT_INTERNAL_OBJECTS_H but FT_INTERNAL_SERVICE_H. + * src/truetype/ttobjs.c: Don't include + FT_SERVICE_POSTSCRIPT_NAMES_H. + +2003-09-29 David Turner + + Added new service to handle glyph name dictionaries, replacing the + old internal header named `psnames.h' by `services/svpsname.h'. + Note that this is different from `services/svpostnm.h' which only + handles the retrieval of PostScript font names for a given face. + (Should we merge these two services into a single header?) + + * include/freetype/internal/psnames.h: Removed. Most of its + contents is moved to... + * include/freetype/internal/services/svpsname.h: New file. + + * include/freetype/internal/services/svpostnm.h + (FT_SERVICE_ID_POSTSCRIPT_NAME): Replaced with... + (FT_SERVICE_ID_POSTSCRIPT_FONT_NAME): New macro. + (PsName): Service named changed to... + (PsFontName): This. + Updated `FT_Service_PsName' -> `FT_Service_PsFontName' and + `POSTSCRIPT_NAME' -> `POSTSCRIPT_FONT_NAME' everywhere. + + * include/freetype/internal/internal.h + (FT_INTERNAL_POSTSCRIPT_NAMES_H): Removed. + * include/freetype/internal/psaux.h: Include + FT_SERVICE_POSTSCRIPT_NAMES_H. + (T1_DecoderRec): Updated type of `psnames'. + * include/freetype/internal/t1types.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + Include FT_INTERNAL_OBJECTS_H. + * include/freetype/internal/t42types.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H. + * include/freetype/internal/tttypes.h (TT_FaceRec): Updated. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): Changed + order of parameters. All callers updated. + (FT_FACE_FIND_GLOBAL_SERVICE): New macro to look up a service + globally, checking all modules. + (FT_ServiceCacheRec): Updated. + (FT_SERVICE_POSTSCRIPT_NAMES_H): New macro for accessing + `svpsname.h'. + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c + (ft_module_get_service): New function. + + * src/cff/cffdrivr.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_get_glyph_name, cff_get_name_index): Use new POSTSCRIPT_NAMES + service. + * src/cff/cffcmap.c (cff_cmap_unicode_init): Updated. + * src/cff/cffload.c, src/cff/cffload.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_index_get_sid_string): Updated. + * src/cff/cffobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cff_face_init): Use new POSTSCRIPT_NAMES service. + * src/cff/cffobjs.h: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + + * src/cid/cidobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (cid_face_init): Use new POSTSCRIPT_NAMES service. + * src/cid/cidriver.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H. + + * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Use + new POSTSCRIPT_NAMES service. + * src/psaux/t1decode.h (t1_lookup_glyph_by_stdcharcode, + t1_decode_init): Use new POSTSCRIPT_NAMES service. + * src/psaux/t1cmap.h, src/psaux/t1decode.h: Dont' include + FT_INTERNAL_POSTSCRIPT_NAMES_H. + + * src/psnames/psmodule.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (ps_build_unicode_table): Renamed to... + (ps_unicodes_init): This. + (ps_lookup_unicode): Renamed to... + (ps_unicodes_char_index): This. + (ps_next_unicode): Renamed to... + (ps_unicodes_char_next): This. + (psnames_interface): Updated. + (psnames_services): New services list. + (psnames_get_service): New function. + (psnames_module_class): Updated. + + * src/sfnt/sfobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (sfnt_init_face): Use new POSTSCRIPT_NAMES service. + * src/sfnt/ttpost.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H + but FT_SERVICE_POSTSCRIPT_NAMES_H. + (tt_face_get_ps_name): Updated. + + * src/truetype/ttobjs.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + + * src/type1/t1driver.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + * src/type1/t1objs.c: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + (T1_Face_Init): Use new POSTSCRIPT_NAMES service. + + * src/type42/t42drivr.c (t42_get_ps_name): Renamed to... + (t42_get_ps_font_name): This. + (t42_service_ps_name): Renamed to... + (t42_service_ps_font_name): This. + (t42_services): Updated. + * src/type42/t42objs.c (T42_Face_Init): Use new POSTSCRIPT_NAMES + service. + * src/type42/t42objs.h: Don't include + FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H. + + + * src/base/ftglyph.c (FT_Get_Glyph): Don't access `slot' before + testing its validity. Reported by Henry Maddocks + . + +2003-09-21 Werner Lemberg + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): + Fix compilation warning (s/pptr/Pptr/). + + * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H, + FT_INTERNAL_FNT_TYPES_H): Removed. + +2003-09-21 David Turner + + Migrating the PFR and WINFNT drivers to the new service-based + internal API. + + * include/freetype/internal/fnttypes.h: Removed. Most of its data + are moved to winfnt.h and... + * include/freetype/internal/services/svwinfnt.h: New file. + + * include/freetype/internal/pfr.h: Removed. Most of its data are + moved to... + * include/freetype/internal/services/svpfr.h: New file. + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_LOOKUP_SERVICE): Simplify fix of 2003-09-16 by removing + pointer type argument. + Updated all callers. + Update macro names of services header files. + + * src/base/ftobjs.c (FT_Get_Name_Index): Simplified code. + + * src/base/ftpfr.c: Include FT_SERVICE_PFR_H instead of + FT_INTERNAL_PFR_H. + (ft_pfr_check, FT_Get_PFR_Metrics, FT_Get_PFR_Kerning, + FT_Get_PFR_Advance): Use services provided in `PFR_METRICS'. + + * src/base/ftwinfnt.c: Include FT_SERVICE_WINFNT_H instead of + FT_INTERNAL_FNT_TYPES_H. + (FT_Get_WinFNT_Header): Use service provided in `WINFNT'. + + * src/pfr/pfrdrivr.c: Include FT_SERVICE_PFR_H and + FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_PFR_H. + (pfr_service_bdf): Updated. + (pfr_services): New services list. + (pfr_get_service): New function. + (pfr_driver_class): Updated. + + * src/winfonts/winfnt.c: Include FT_SERVICE_WINFNT_H and + FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_FNT_TYPES_H. + (winfnt_get_header, winfnt_get_service): New functions. + (winfnt_service_rec): New structure providing WINFNT services. + (winfnt_services): New services list. + (winfnt_driver_class): Updated. + * src/winfonts/winfnt.h: Add most of the removed fnttypes.h data. + + * src/sfnt/sfdriver.c (sfnt_service_ps_name): Fix typo. + + * src/type1/t1driver.c (t1_service_ps_name): Fix typo. + + * src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrsbit.c, + src/psaux/psobjs.c, src/sfnt/sfobjs.c, src/truetype/ttobjs.c, + src/type1/t1objs.c, src/type42/t42objs.c: Removing various compiler + warnings. + +2003-09-19 David Bevan + + * src/type1/t1parse.c (pfb_tag_fields): Removed. + (read_pfb_tag): Fix code so that it doesn't fail on end-of-file + indicator (0x8003). + * docs/CHANGES: Updated. + +2003-09-16 Werner Lemberg + + * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE, + FT_FACE_LOOKUP_SERVICE): Add parameter to pass pointer type. + Ugly, I know, but this is needed for compilation with C++ -- + maybe someone knows a better solution? + Updated all callers. + + * src/base/ftobjs.c (FT_Get_Name_Index, FT_Get_Glyph_Name): Remove + C++ compiler warnings. + + * src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): + Fix order of arguments passed to FT_FACE_FIND_SERVICE. + +2003-09-15 Werner Lemberg + + Avoid header files with identical names. + + * include/freetype/internal/services/bdf.h: Renamed to... + * include/freetype/internal/services/svbdf.h: This. + Add copyright notice. + * include/freetype/internal/services/glyfdict.h: Renamed to... + * include/freetype/internal/services/svgldict.h: This. + Add copyright notice. + * include/freetype/internal/services/multmast.h: Renamed to... + * include/freetype/internal/services/svmm.h: This. + Add copyright notice. + Add FT_BEGIN_HEADER and FT_END_HEADER. + * include/freetype/internal/services/sfnt.h: Renamed to... + * include/freetype/internal/services/svsfnt.h: This. + Add copyright notice. + * include/freetype/internal/services/postname.h: Renamed to... + * include/freetype/internal/services/svpostnm.h: This. + Add copyright notice. + * include/freetype/internal/services/xf86name.h: Renamed to... + * include/freetype/internal/services/svxf86nm.h: This. + Add copyright notice. + + * include/freetype/internal/ftserv.h: Add FT_BEGIN_HEADER and + FT_END_HEADER. + Add copyright notice. + Update macro names of services header files. + + * builds/freetype.mk (SERVICES_DIR): New variable. + (BASE_H): Add services header files. + +2003-09-11 Werner Lemberg + + * builds/toplevel.mk (distclean): Remove `builds/unix/freetype2.pc'. + + * src/cff/cffdrivr.c: Don't load headers twice. + + * include/freetype/internal/ftserv.h (FT_SERVICE_SFNT_H): New macro. + * src/base/ftobjs.c: Include FT_SERVICE_SFNT_H. + + * src/cff/cffcmap.c: Include `cfferrs.h'. + * src/pfr/pfrdrivr.c: Include `pfrerror.h'. + * src/sfnt/sfdriver.c: Include `sferrors.h'. + * src/psaux/psobjs.h: Add declaration for `ps_parser_to_bytes'. + +2003-09-11 David Turner + + Introducing the concept of `module services'. This is the first + step towards a massive simplification of the engine's internals, in + order to get rid of various numbers of hacks. + + Note that these changes will break source & binary compatibility for + authors of external font drivers. + + * include/freetype/config/ftconfig.h (FT_BEGIN_STMNT, FT_END_STMNT, + FT_DUMMY_STMNT): New macros. + + * include/freetype/internal/ftserv.h: New file, containing the new + structures and macros to provide `services'. + + * include/freetype/internal/internal.h (FT_INTERNAL_EXTENSION_H, + FT_INTERNAL_EXTEND_H, FT_INTERNAL_HASH_H, FT_INTERNAL_OBJECT_H): + Removed, obsolete. + (FT_INTERNAL_SERVICE_H): New macro for `ftserv.h'. + + * include/freetype/internal/services/bdf.h, + include/freetype/internal/services/glyfdict.h, + include/freetype/internal/services/postname.h, + include/freetype/internal/services/xf86name.h: New files. + + * include/freetype/ftmm.h (FT_Get_MM_Func, FT_Set_MM_Design_Func, + FT_Set_MM_Blend_Func): Function pointers moved (in modified form) + to... + * include/freetype/internal/services/multmast.h: New file. + + * include/freetype/internal/sfnt.h (SFNT_Interface): `get_interface' + is now of type `FT_Module_Requester'. + (SFNT_Get_Interface_Func, SFNT_Load_Table_Func): Function pointers + moved (in modified form) to... + * include/freetype/internal/services/sfnt.h: New file. + + * include/freetype/tttables.h (FT_Get_Sfnt_Table_Func): Function + pointer moved (in modified form) to `services/sfnt.h'. + + * include/freetype/ftmodule.h (FT_Module_Interface): Make it a + a typedef to `FT_Pointer'. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Add + `postscript_name'. + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove + `postscript_name'. + Add `services' element. + (FT_LibraryRec): Remove `meta_class'. + + * src/base/ftbdf.c: Include FT_SERVICE_BDF_H. + (test_font_type): Removed. + (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Use services + provided in `FT_SERVICE_ID_BDF'. + + * src/base/ftmm.c: Include FT_SERVICE_MULTIPLE_MASTERS_H. + (ft_face_get_mm_service): New auxiliary function to get services + from `FT_SERVICE_ID_MULTI_MASTERS'. + (FT_Get_Multi_Master, FT_Set_MM_Design_Coordinates, + FT_Set_MM_Blend_Coordinates): Use `ft_face_get_mm_service'. + + * src/base/ftobjs.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and + FT_SERVICE_GLYPH_DICT_H. + (ft_service_list_lookup): New function to get a specific service. + (destroy_face): Updated. + (Mac_Read_POST_Resource): Simplify some code. + (IsMacResource): Fix warnings. + (FT_Get_Name_Index, FT_Get_Glyph_Name): Use services provided in + `FT_SERVICE_ID_GLYPH_DICT'. + (FT_Get_Postscript_Name): Use service provided in + `FT_SERVICE_ID_POSTSCRIPT_NAME'. + (FT_Get_Sfnt_Table, FT_Load_Sfnt_Table): Use services provided in + `FT_SERVICE_ID_SFNT_TABLE'. + + * src/base/ftxf86.c: Include FT_SERVICE_XFREE86_NAME_H. + (FT_Get_X11_Font_Format): Use service provided in + `FT_SERVICE_ID_XF86_NAME'. + + * src/bdf/bdfdrivr.c: Include FT_SERVICE_BDF_H and + FT_SERVICE_XFREE86_NAME_H. + (bdf_get_charset_id): New function. + (bdf_service_bdf): New structure providing BDF services. + (bdf_services): New services list. + (bdf_driver_requester): Use `ft_service_list_lookup'. + + * src/cff/cffdrivr.c: Include FT_SERVICE_XFREE86_NAME_H and + FT_SERVICE_GLYPH_DICT_H. + (cff_service_glyph_dict): New structure providing CFF services. + (cff_services): New services list. + (cff_get_interface): Use `ft_service_list_lookup'. + + * src/cid/cidriver.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and + FT_SERVICE_XFREE86_NAME_H. + (cid_service_ps_name): New structure providing CID services. + (cid_services): New services list. + (cid_get_interface): Use `ft_service_list_lookup'. + + * src/pcf/pcfdrivr.c: Include FT_SERVICE_BDF_H and + FT_SERVICE_XFREE86_NAME_H. + (pcf_service_bdf): New structure providing PCF services. + (pcf_services): New services list. + (pcf_driver_requester): Use `ft_service_list_lookup'. + + * src/sfnt/sfdriver.c: Include FT_SERVICE_GLYPH_DICT_H and + FT_SERVICE_POSTSCRIPT_NAME_H. + (get_sfnt_glyph_name): Renamed to... + (sfnt_get_glyph_name): This. + (get_sfnt_postscript_name): Renamed to... + (sfnt_get_ps_name): This. + Updated. + (sfnt_service_glyph_dict, sfnt_service_ps_name): New structures + providing services. + (sfnt_services): New services list. + (sfnt_get_interface): Use `ft_service_list_lookup'. + + * src/truetype/ttdriver.c: Include FT_SERVICE_XFREE86_NAME_H. + (tt_services): New services list. + (tt_get_interface): Use `ft_service_list_lookup'. + + * src/type1/t1driver.c: Include FT_SERVICE_MULTIPLE_MASTERS_H, + FT_SERVICE_GLYPH_DICT_H, FT_SERVICE_XFREE86_NAME_H, and + FT_SERVICE_POSTSCRIPT_NAME_H. + (t1_service_glyph_dict, t1_service_ps_name, + t1_service_multi_masters): New structures providing Type 1 services. + (t1_services): New services list. + (Get_Interface): Use `ft_service_list_lookup'. + + * src/type42/t42drivr.c: Include FT_SERVICE_XFREE86_NAME_H, + FT_SERVICE_GLYPH_DICT_H, and FT_SERVICE_POSTSCRIPT_NAME_H. + (t42_service_glyph_dict, t42_service_ps_name): New strucures + providing Type 42 services. + (t42_services): New services list. + (T42_Get_Interface): Use `ft_service_list_lookup'. + + + * README, docs/CHANGES: Updating version numbers for 2.1.6, and + removing obsolete warnings in the documentation. + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6. + * builds/unix/configure.ac (version_info): Set to 9:5:3. + * builds/unix/configure: Regenerated. + + * include/freetype/internal/ftcore.h, + include/freetype/internal/ftexcept.h, + include/freetype/internal/fthash.h, + include/freetype/internal/ftobject.h: Removed. Obsolete. + +2003-09-09 David Turner + + Fixing PFR kerning support. The tables within the font file contain + (charcode,charcode) kerning pairs, we need to convert them to + (gindex,gindex). + + * src/base/ftpfr.c (ft_pfr_check): Fix serious typo. + * src/pfr/prfload.c: Remove dead code. + (pfr_get_gindex, pfr_compare_kern_pairs, pfr_sort_kerning_pairs): + New functions. + (pfr_phy_font_done): Free `kern_pairs'. + (pfr_phy_font_load): Call `pfr_sort_kerning_pairs'. + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Fix kerning extraction. + * src/pfr/pfrtypes.h (PFR_KERN_PAIR_INDEX): New macro. + (PFR_KernPairRec): Make `kerning' an FT_Int. + (PFR_PhyFontRec): New element `kern_pairs'. + (PFR_KernFlags): Values of PFR_KERN_2BYTE_CHAR and + PFR_KERN_2BYTE_ADJ were erroneously reversed. + + * include/freetype/ftoption.h: Commenting out the macro + TT_CONFIG_OPTION_BYTECODE_INTERPRETER. + +2003-09-02 David Turner + + + * Version 2.1.5 released. + ========================= + + +2003-08-31 Manish Singh + + * src/bdf/bdflib.c (_bdf_readstream): Don't use FT_MEM_COPY but + FT_MEM_MOVE. + +2003-08-30 Werner Lemberg + + * include/freetype/freetype.h (FT_ENCODING_SJIS, FT_ENCODING_GB2312, + FT_ENCODING_BIG5, FT_ENCODING_WANSUNG, FT_ENCODING_JOHAB): New + enumerations of FT_Encoding. The FT_ENCODING_MS_* variants except + FT_ENCODING_MS_SYMBOL are now deprecated. + Updated all users. + * docs/CHANGES: Document it. + +2003-08-27 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Accept lowercase characters + for spacing. + +2003-08-27 Mike FABIAN + + * src/pcf/pcfread.c (pcf_load_font), src/bdf/bdfdrivr.c + (BDF_Face_Init): Accept lowercase characters for slant and weight. + +2003-08-18 David Turner + + * include/freetype/config/ftoption.h: Disabling TrueType bytecode + interpreter until the UNPATENTED_HINTING works as advertised. + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Use `|' for + setting `load_flags'. + + * Jamfile: Adding the `refdoc' target to the Jamfile in order to + build the API Reference in `docs/reference' automatically. + + * include/freetype/t1tables.h (PS_FontInfoRec), src/cid/cidtoken.h, + src/type1/t1tokens.h, src/type42/t42parse.c: Resetting the types of + `italic_angle', `underline_position', and `underline_thickness' to + their previous values (i.e., long, short, and ushort) in order to + avoid breaking binary compatibility. + + * include/freetype/ttunpat.h: Fixing documentation comment. + + * include/freetype/config/ftoption.h, devel/ftoption.h + (TT_CONFIG_OPTION_OPTION_COMPILE_UNPATENTED_HINTING): Replaced + with... + (TT_CONFIG_OPTION_UNPATENTED_HINTING): This. Updated all users. + (TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): Removed. + + * include/freetype/internal/ftobjs.h (FT_DEBUG_HOOK_TYPE1): Removed. + (FT_DEBUG_HOOK_UNPATENTED_HINTING): New macro. Use this with + `FT_Set_Debug_Hook' to get the same effect as the removed + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING. + + * src/truetype/ttobjs.c (tt_face_init): Use + `FT_DEBUG_HOOK_UNPATENTED_HINTING'. + +2003-08-06 Werner Lemberg + + * src/type1/t1gload.c (T1_Load_Glyph), src/cff/cffgload.c + (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph): Fix + previous change. + +2003-08-05 Werner Lemberg + + * src/type1/t1gload.c (T1_Load_Glyph), src/cff/cffgload.c + (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph): Apply + font matrix to advance width also. + * docs/CHANGES: Updated. + +2003-07-26 Werner Lemberg + + * builds/unix/configure.ac (version_info): Set to 9:4:3. + * builds/unix/configure: Updated. + * docs/CHANGES, docs/VERSION.DLL: Updated. + + * include/freetype/freetype.h (FT_GlyphSlot): Change 2003-06-16 + also breaks binary compatibility. Reintroduce an unsigned integer + at the old position of `flags' called `reserved'. + +2003-07-25 Werner Lemberg + + Make API reference valid HTML 4.01 transitional. + + * src/tools/docmaker/tohtml.py (html_header_1): Add doctype + and charset. + (html_header_2): Fix style elements and add some more. + Fix syntax. + (block_header, block_footer, description_header, description_footer, + marker_header, marker_footer, source_header, source_footer, + chapter_header): Don't use
...
but `align=center' + table attribute. + (chapter_inter, chapter_footer): Add
  • and use special
      + class. + Use double quotes around table widths given in percent. + (keyword_prefix, keyword_suffix): Don't change font colour directly + but use a new class. + (section_synopsis_header, section_synopsis_footer): Don't change + colour. + (code_header, code_footer): Don't change font colour directly but + use a special
       class.
      +	(print_html_field):  gets the `valign' attribute, not .
      +	(print_html_field_list): Ditto.
      +	(index_exit): Don't use 
      ...
      but `align=center' + table attribute. + (section_enter): Ditto. + (toc_exit): Don't emit
      . + (block_enter): Use

      , not

      . + (__init__): Fix tag order in self.html_footer. + +2003-07-25 David Turner + + This change reimplements fix from 2003-05-30 without breaking + binary compatibility. + + * include/freetype/t1tables.h (PS_FontInfoRec): `italic_angle', + `is_fixed_pitch', `underline_position', `underline_thickness' are + reverted to be normal values. + + * include/freetype/internal/psaux.h (T1_FieldType): Remove + `T1_FIELD_TYPE_BOOL_P', `T1_FIELD_TYPE_INTEGER_P', + `T1_FIELD_TYPE_FIXED_P', `T1_FIELD_TYPE_FIXED_1000_P'. + (T1_FIELD_TYPE_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P, + T1_FIELD_FIXED_1000_P): Removed. + (T1_FIELD_TYPE_BOOL): Renamed to... + (T1_FIELD_BOOL): New macro. Updated all callers. + + * src/type42/t42parse.c: `italic_angle', `is_fixed_pitch', + `underline_position', `underline_thickness', `paint_type', + `stroke_width' are reverted to be normal values. + (T42_KEYWORD_COUNT): New macro. + (t42_parse_dict): New array `keyword_flags' to mark that a value has + already been assigned to a dictionary entry. + * src/type42/t42objs.c (T42_Face_Init, T42_Face_Done): Updated. + + * src/cid/cidtoken.h: `italic_angle', `is_fixed_pitch', + `underline_position', `underline_thickness' are reverted to be + normal values. + * src/cid/cidobjs.c (cid_face_done, cid_face_init): Updated. + + * src/psaux/psobjs.c (ps_parser_load_field): Updated. + + * src/type1/t1tokens.h: `italic_angle', `is_fixed_pitch', + `underline_position', `underline_thickness', `paint_type', + `stroke_width' are reverted to be normal values. + * src/type1/t1objs.c (T1_Face_Done, T1_Face_Init): Updated. + * src/type1/t1load.c (T1_FIELD_COUNT): New macro. + (parse_dict): Add parameter for keyword flags. + Record only first instance of a field. + (T1_Open_Face): New array `keyword_flags'. + +2003-07-24 Werner Lemberg + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5. + * builds/unix/configure.ac (version_info): Set to 10:0:3. + * builds/unix/configure: Updated. + * builds/freetype.mk (refdoc): Fix --title. + + * docs/CHANGES, docs/VERSION.DLL, README: Updated. + + * src/tools/docmaker/sources.py (re_crossref): Fix regular + expression to handle trailing punctuation characters. + * src/tools/docmaker/tohtml.py (make_html_word): Updated. + + * docs/release: New file. + +2003-07-23 YAMANO-UCHI Hidetoshi + + * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): New + member function `to_bytes'. + + * src/psaux/psauxmod.c (ps_parser_funcs): New member + `ps_parser_to_bytes'. + (psaux_module_class): Increase version to 0x20000L. + + * src/psaux/psobjs.c (IS_T1_LINESPACE): Add \f. + (IS_T1_NULLSPACE): New macro. + (IS_T1_SPACE): Add it. + (skip_spaces, skip_alpha): New functions. + (ps_parser_skip_spaces, ps_parser_skip_alpha): Use them. + (ps_tobytes, ps_parser_to_bytes): New functions. + +2003-07-07 Werner Lemberg + + * builds/freetype.mk (DOC_DIR): New variable. + (refdoc): Use *_DIR variables. + (distclean): Remove documentation files. + + * builds/detect.mk (std_setup, dos_setup): Mention `make refdoc'. + + * configure: Set DOC_DIR variable. + +2003-07-07 Patrik Hägglund + + * builds/freetype.mk (refdoc): New target to build the + documentation. + (.PHONY): Updated. + + * include/freetype/freetype.h: Improve documentation of FT_CharMap. + * include/freetype/ftimage,h: Fix documentation of FT_OUTLINE_FLAGS. + * include/freetype/tttables.h: Document FT_Sfnt_Tag. + +2003-07-06 Werner Lemberg + + * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfread.c + (pcf_load_font): Fix computation of height if PIXEL_SIZE property is + missing. + +2003-07-01 Werner Lemberg + + * src/cache/ftcsbits.c (ftc_sbit_node_compare): Only add `size' if + there is no error. Reported by Knut St. Osmundsen + . + +2003-06-30 Werner Lemberg + + A new try to synchronize bitmap font access. + + * include/freetype/freetype.h (FT_Bitmap_Size): `height' is now + defined to return the baseline-to-baseline distance. This was + already the value returned by the BDF and PCF drivers. + + The `width' field now gives the average width. I wasn't able to + find something better. It should be taken as informative only. + + New fields `size', `x_ppem', and `y_ppem'. + + * src/pcf/pcfread.c (pcf_load_font): Updated to properly fill + FT_Bitmap_Size. + Do proper rounding and conversion from 72.27 to 72 points. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Updated to properly fill + FT_Bitmap_Size. + Do proper rounding and conversion from 72.27 to 72 points. + + * src/sfnt/sfobjs.c (sfnt_load_face): Updated to properly fill + FT_Bitmap_Size. + + * src/winfonts/winfnt.c (FNT_Face_Init): Updated to properly fill + FT_Bitmap_Size. + +2003-06-29 Werner Lemberg + + Redesigning the FNT driver to return multiple faces, not multiple + strikes. At least one font (app850.fon from WinME) contains + different FNT charmaps for its subfonts. Consequently, the previous + design of having multiple bitmap strikes in a single font face fails + since we have only one charmap per face. + + * include/freetype/internal/fnttypes.h (FNT_Size_Rec): Removed. + (FNT_FaceRec): Remove `num_fonts' field and replace `fonts' with + `font'. + + * src/base/ftwinfnt.c (FT_Get_WinFNT_Header): Updated. + + * src/winfonts/winfnt.c (fnt_font_load): Don't set pixel_width equal + to pixel_height. + (fnt_face_done_fonts): Removed. + (fnt_face_get_dll_fonts): Renamed to... + (fnt_face_get_dll_font): This. Add second function argument to + select face index. + Updated to load just one subfont. + (fnt_font_done, FNT_Face_Done): Updated. + (FNT_Face_Init): Handle `face_index'. + Updated. + (FNT_Size_Set_Pixels): Simplified; similar to BDF and PCF, the + bitmap width is now ignored. + (FNT_Load_Glyph): Updated. + Fix glyph index computation. + (winfnt_driver_class): Updated. + +2003-06-25 Owen Taylor + + * src/sfnt/ttload.c (tt_face_load_hdmx): Don't assign + num_records until we actually decide to load the table, + otherwise, we'll segfault in tt_face_free_hdmx. + +2003-06-24 Werner Lemberg + + * src/cff/cffdrivr.c (cff_get_glyph_name): Protect against zero + glyph name pointer. Reported by Mikey Anbary . + +2003-06-23 Werner Lemberg + + * src/tools/glnames.py: Updated to AGL 2.0. + * src/psnames/pstables.h: Regenerated. + +2003-06-22 Werner Lemberg + + * include/freetype/cache/ftcglyph.h, include/freetype/ttnameid.h, + src/base/ftcalc.c, src/base/fttrigon.c, src/cff/cffgload.c, + src/otlayout/otlgsub.c, src/pshinter/pshrec.c, + src/psnames/psmodule.c, src/sfnt/sfobjs.c, src/truetype/ttdriver.c: + Decorate constants with `U' and `L' if appropriate. + + * include/freetype/ftmoderr.h: Updated to include recent module + additions. + + * src/pshinter/pshnterr.h (FT_ERR_BASE): Define as + `FT_Mod_Err_PShinter'. + * src/type42/t42error.h (FT_ERR_BASE): Define as + `FT_Mod_Err_Type42'. + + * src/pshinter/pshrec.h (PS_HINTS_MAGIC): Removed. Not used. + + * include/freetype/config/ftconfig.h [__MWERKS__]: Define FT_LONG64 + and FT_INT64. + +2003-06-21 Werner Lemberg + + * src/winfonts/winfnt.c (FNT_Load_Glyph): Use first_char in + computation of glyph_index. + (FNT_Size_Set_Pixels): To find a strike, first check pixel_height + only, then try to find a better hit by comparing pixel_width also. + Without this fix it isn't possible to access all strikes. + Also compute metrics.max_advance to be in sync with other bitmap + drivers. + + * src/base/ftobjs.c (FT_Set_Char_Size): Remove redundant code. + (FT_Set_Pixel_Size): Assign value to `metrics' after validation of + arguments. + +2003-06-20 Werner Lemberg + + Synchronize computation of height and width for bitmap strikes. The + `width' field in the FT_Bitmap_Size structure is now only useful to + enumerate different strikes. The `max_advance' field of the + FT_Size_Metrics structure should be used to get the (maximum) width + of a strike. + + * src/bdf/bdfdrivr.c (BDF_Face_Init): Don't use AVERAGE_WIDTH for + computing `available_sizes->width' but make it always equal to + `available_sizes->height'. + + * src/pcf/pcfread.c (pcf_load_font): Don't use RESOLUTION_X for + computing `available_sizes->width' but make it always equal to + `available_sizes->height'. + + * src/truetype/ttdriver.c (Set_Pixel_Sizes): Pass only single + argument to function. + + * src/psnames/psmodule.c (ps_unicode_value): Handle `.' after + `uniXXXX' and `uXXXX[X[X]]'. + +2003-06-19 Werner Lemberg + + * src/bdf/bdfdrivr.c: s/FT_Err_/BDF_Err/. + * src/cache/ftccache.c, src/cache/ftcsbits.c, src/cache/ftlru.c: + s/FT_Err_/FTC_Err_/. + * src/cff/cffcmap.c: s/FT_Err_/CFF_Err_/. + * src/pcf/pcfdrivr.c: s/FT_Err_/PCF_Err_/. + * src/psaux/t1cmap.c: Include psauxerr.h. + s/FT_Err_/PSaux_Err_/. + * src/pshinter/pshnterr.h: New file. + * src/pshinter/rules.mk: Updated. + * src/pshinter/pshalgo.c, src/pshinter/pshrec.c: Include pshnterr.h. + s/FT_Err_/PSH_Err_/. + * src/pfr/pfrdrivr.c, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c: + s/FT_Err_/PFR_Err_/. + * src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c, + src/sfnt/ttload.c: s/FT_Err_/SFNT_Err_/. + * src/truetype/ttgload.c: s/FT_Err_/TT_Err_/. + * src/gzip/ftgzip.c: Load FT_MODULE_ERRORS_H and define + FT_ERR_PREFIX and FT_ERR_BASE. + s/FT_Err_/Gzip_Err_/. + +2003-06-19 Dirck Blaskey + + * src/cff/cffload (cff_encoding_load): `nleft' must be FT_UInt, + otherwise adding 1 might wrap the result. + +2003-06-18 Werner Lemberg + + * src/psnames/psmodule.c (ps_unicode_value): Add support to + recognize `uXXXX[X[X]]' glyph names. + Don't handle glyph names starting with `uni' which have more than + four digits. + +2003-06-16 Werner Lemberg + + * include/freetype/freetype.h (FT_Open_Flags): Replaced with + #defines for the constants. + (FT_Open_Args): Change type of `flags' to FT_UInt. + (FT_GlyphSlot): Move `flags' to FT_Slot_Internal. + + * include/freetype/ftimage.h (FT_Outline_Flags, FT_Raster_Flag): + Replaced with #defines for the constants. + + * include/freetype/internal/ftobjs.h (FT_Slot_Internal): New + field `flags' (from FT_GlyphSlot). + Updated all affected source files. + (FT_GLYPH_OWN_BITMAP): New macro (from ftgloadr.h). + + * include/freetype/internal/ftgloadr.h (FT_GLYPH_OWN_BITMAP): Moved + to ftobjs.h. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Use dummy + FT_GlyphSlot_Internal object. + +2003-06-15 Werner Lemberg + + * builds/compiler/gcc.mk, builds/compiler/gcc-dev.mk (CFLAGS): + Add -fno-strict-aliasing to get rid of zillion warnings from gcc + version 3.3. + +2003-06-14 Werner Lemberg + + * include/freetype/ftglyph.h (ft_glyph_bbox_unscaled, + ft_glyph_bbox_subpixels, ft_glyph_bbox_gridfit, + ft_glyph_bbox_truncate, ft_glyph_bbox_pixels): Replaced with + FT_GLYPH_BBOX_UNSCALED, FT_GLYPH_BBOX_SUBPIXELS, + FT_GLYPH_BBIX_GRIDFIT, FT_GLYPH_BBOX_TRUNCATE, FT_GLYPH_BBOX_PIXELS. + The lowercase variants are now (deprecated aliases) to the uppercase + versions. + Updated all other files. + + * include/freetype/ftmodule.h (ft_module_font_driver, + ft_module_renderer, ft_module_hinter, ft_module_styler, + ft_module_driver_scalable, ft_module_driver_no_outlines, + ft_module_driver_has_hinter): Replaced with FT_MODULE_FONT_DRIVER, + FT_MODULE_RENDERER, FT_MODULE_HINTER, FT_MODULE_STYLER, + FT_MODULE_DRIVER_SCALABLE, FT_MODULE_DRIVER_NO_OUTLINES, + FT_MODULE_DRIVER_HAS_HINTER. + The lowercase variants are now (deprecated aliases) to the uppercase + versions. + Updated all other files. + + * src/base/ftglyph.c (FT_Glyph_Get_CBox): Handle bbox_mode better + as enumeration. + + * src/pcf/pcfdrivr.c (pcf_driver_class), src/winfonts/winfnt.c + (winfnt_driver_class), src/bdf/bdfdrivr.c (bdf_driver_class): Add + the FT_MODULE_DRIVER_NO_OUTLINES flag. + +2003-06-13 Detlef Würkner + + * src/pfr/pfrobjs.c (pfr_slot_load): Apply font matrix. + +2003-06-13 Werner Lemberg + + * builds/dos/detect.mk: Test not only for `Dos' but for `DOS' also. + + * builds/dos/dos-emx.mk, builds/compiler/emx.mk: New files for + EMX gcc compiler. + * builds/dos/detect.mk: Add target `emx'. + + * builds/compiler/watcom.mk (LINK_LIBRARY): GNU Make for DOS doesn't + like a trailing semicolon; add a dummy command. + + * src/cid/cidload.c: Remove parse_font_bbox code (already enclosed + with #if 0 ... #endif). + + * src/type1/t1tokens.h: Handle /FontName. + * src/type1/t1load.c (parse_font_name): Removed. + Remove parse_font_bbox code (already enclosed with #if 0 ... + #endif). + + * src/type42/t42parse.c (t42_parse_font_name): Removed. + Remove t42_parse_font_bbox code (already enclosed with #if 0 ... + #endif). + (t42_keywords): Handle /FontName with T1_FIELD_KEY. + +2003-06-12 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_FieldType): Add + T1_FIELD_TYPE_KEY. + (T1_FIELD_KEY): New macro. + * src/psaux/psobjs.c (ps_parser_load_field): Handle + T1_FIELD_TYPE_KEY. + + * src/cid/cidtoken.h: Use T1_FIELD_KEY for /CIDFontName. + +2003-06-11 Alexander Malmberg + + * src/cache/ftlru.c (FT_LruList_Remove_Selection): Decrease + number of nodes. + (FT_LruList_Lookup): Fix assertion for out-of-memory case. + +2003-06-11 Werner Lemberg + + * src/cid/cidload.c (cid_decrypt): Removed. + (cid_read_subrs): Use t1_decrypt from psaux module. + * src/cid/cidload.h: Updated. + * src/cid/cidgload.c (cid_load_glyph): Use t1_decrypt from psaux + module. + +2003-06-10 Werner Lemberg + + * src/cid/cidobjs.c: Apply change 2003-05-31 from . + Compute style flags. + Fix computation of root->height. + * src/cid/cidtoken.h: Handle FontBBox. + * src/cid/cidload.c (cid_load_keyword): Handle + T1_FIELD_LOCATION_BBOX. + (parse_font_bbox): Commented out. + (cid_field_record): Comment out element for parsing FontBBox. + + * src/type42/t42parse.c (t42_parse_font_bbox): Commented out. + (t42_keywords): Handle FontBBox with T1_FIELD_BBOX, not with + T1_FIELD_CALLBACK. + (t42_parse_font_bbox): Commented out. + (t42_load_keyword): Handle T1_FIELD_LOCATION_BBOX. + * src/type42/t42objs.c (T42_Face_Init): Apply change 2003-05-31 + from . + +2003-06-09 George Williams + + * src/truetype/ttinterp.c (SetSuperRound) <0x30>: Follow Apple's + TrueType specification. + (Ins_MDRP, Ins_MIRP): Fix single width cut-in test. + +2003-06-09 Detlef Würkner + + * src/gzip/ftgzip.c: (inflate_mask): Replaced with... + (NO_INFLATE_MASK): This. + * src/gzip/infutil.h: Declare `inflate_mask' conditionally by + NO_INFLATE_MASK. + +2003-06-09 Alexis S. L. Carvalho + + * src/gzip/ftgzip.c (ft_gzip_file_fill_output): Handle Z_STREAM_END + correctly. + +2003-06-09 Wolfgang Domröse + + * src/pshinter/pshglob.c (psh_globals_new): Change calculation of + dim->stdw.count to avoid compiler problem. + + * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Move the block + variables to the beginning of the function to avoid compiler + problems. + Add casts necessary for 16bit compilers. + +2003-06-09 Werner Lemberg + + * src/pfr/rules.mk (PFR_DRV_SRC): Add pfrsbit.c. + (PFR_DRV_H): Add pfrtypes.h. + + * include/freetype/config/ftconfig.h: s/__MWKS__/__MWERKS__/. + +2003-06-08 Karl Schultz + + * src/pfr/pfrsbit.c (pfr_bitwriter_init): Change type of third + argument to FT_Bool. + (pfr_lookup_bitmap_data): Change type of third and fourth argument + to FT_UInt. Updated caller. + (pfr_load_bitmap_bits): Change type of fourth argument to FT_Bool. + +2003-06-08 Werner Lemberg + + Completely revised FreeType's make management. + + . In all makefiles `/' is used as the path separator. The + conversion to the real path separators is done as late as + possible using $(subst ...). + + . $(HOSTSEP) no longer exists. Now, $(SEP) gives the path separator + for the operating system, and the new $(COMPILER_SEP) the path + separator for the compiler tools. + + . $(BUILD) has been renamed to $(BUILD_DIR). In general, all + directory variables end with `_DIR'. The variants ending in `_' + (like `BASE_' have been removed). + + The following ChangeLog entries only describe changes which are + not related to the redesign. + + * builds/beos/beos-def.mk (BUILD_DIR): Fix typo. + * builds/compiler/watcom.mk (LINK_LIBRARY): Fix linker call to avoid + overlong arguments as suggested by J. Ali Harlow + . + * builds/dos/dos-wat.mk: New file. + * builds/freetype.mk (FREETYPE_H): Include header files from the + `devel' subdirectory. + + * builds/os2/os2-dev.mk, builds/unix/unixddef.mk, + builds/unix/unixddef.mk, builds/win32/w32-bccd.mk, + builds/win32/w32-dev.mk (BUILD_DIR): Fix path. + + * builds/unix/configure.ac, builds/unix/configure: Updated. + * builds/unix/unix-def.in (DISTCLEAN): Add `freetype2.pc'. + +2003-06-07 Werner Lemberg + + * src/base/ftmac.c (FT_New_Face_From_SFNT): s/rlen/sfnt_size/ to + make it compile. + + * devel/ftoption.h: Updated. + +2003-06-07 Detlef Würkner + + * include/freetype/internal/psaux.h, src/truetype/ttgload.h: + s/index/idx/ to fix compiler warnings. + + * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Use more `volatile' to + fix compiler warning. + + * src/gzip/ftgzip.c (BUILDFIXED): Removed. + * src/gzip/inftrees.c (inflate_trees_fixed) [!BUILDFIXED]: Use + FT_UNUSED to remove compiler warning. + +2003-06-06 Werner Lemberg + + * include/freetype/ftstroker.h: Renamed to... + * include/freetype/ftstroke.h: This. + + * src/base/ftstroker.c: Renamed to... + * src/base/ftstroke.c: This. + + * include/freetype/config/ftheader.h (FT_STROKER_H): Updated. + + * src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk: + Updated. + + * src/pcf/pcfdriver.c: Renamed to... + * src/pcf/pcfdrivr.c: This. + * src/pcf/pcfdriver.h: Renamed to... + * src/pcf/pcfdrivr.h: This. + + * src/pcf/Jamfile, src/pcf/rules.mk: Updated. + +2003-06-05 Wenlin Institute (Tom Bishop) + + * src/base/ftmac.c (file_spec_from_path) [TARGET_API_MAC_CARBON]: + Add `#if !defined(__MWERKS__)'. + +2003-06-05 Werner Lemberg + + * include/freetype/internal/psaux.h (T1_FieldType): Add + T1_FIELD_TYPE_FIXED_1000 and T1_FIELD_TYPE_FIXED_1000_P. + (T1_FIELD_FIXED_1000, T1_FIELD_FIXED_1000_P): New macros. + * src/psaux/psobjs.c (ps_parser_load_field): Handle + T1_FIELD_TYPE_FIXED_1000 and T1_FIELD_TYPE_FIXED_1000_P. + + * src/cff/cffparse.c (cff_kind_fixed_thousand): New enumeration. + (CFF_FIELD_FIXED_1000): New macro. + (cff_parser_run): Handle cff_kind_fixed_thousand. + * src/cff/cfftoken.h: Use CFF_FIELD_FIXED_1000 for blue_scale. + * src/cff/cffload (cff_subfont_load): Fix default values of + expansion_factor and blue_scale. + + * src/cif/cidtoken.h, src/type1/t1tokens.h: Use T1_FIELD_FIXED_1000 + for blue_scale. + + * src/pshinter/pshglob.c (psh_globals_new): Fix default value of + blue_scale. + +2003-06-04 Wolfgang Domröse + + * include/freetype/internal/ftdriver.h, + include/freetype/internal/ftobjs.h, + include/freetype/internal/psaux.h, src/cid/cidgload.c, + src/psaux/psobjs.c, src/psaux/t1decode.c, src/psaux/psobjs.h, + src/pshinter/pshrec.c, src/pshinter/pshalgo.c, + src/psnames/psmodule.c, src/raster/ftraster.c, src/sfnt/sfobjs.c, + src/smooth/ftgrays.c, src/smooth/ftsmooth.c, src/truetype/ttobjs.c, + src/truetype/ttdriver.c, src/truetype/ttgload.c, src/type1/t1afm.c, + src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1load.c, + src/type1/t1objs.c, src/type42/t42parse.c, src/type42/t42parse.h: + Many casts and slight argument type changes to make it work with + a 16bit compiler. + +2003-06-04 Werner Lemberg + + * include/freetype/config/ftoption.h: Defining + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING by default is a bad idea + since some fonts (e.g. Arial) produce worse results than without + hinting. Reverted. + +2003-06-04 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Call + FT_GlyphLoader_CheckPoints before adding phantom points. This fixes + a segfault bug with fonts (e.g. htst3.ttf) which have nested + subglyphs more than one level deep. Reported by Anthony Fok. + + * include/freetype/config/ftoption.h: Define + TT_CONFIG_OPTION_BYTECODE_INTERPRETER, + TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, and + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING to make it the new + default. + +2003-06-03 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_hint_edges): Removed. Just a + wrapper for ah_hint_edges. + (ah_hint_edges): Renamed to... + (ah_hinter_hint_edges): This. + + * src/base/ftobjs.c (FT_Set_Hint_Flags): Removed. Unused. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec), + include/freetype/internal/psaux.h (T1_DecoderRec), + src/cff/cffgload.h (CFF_Builder): Remove `hint_flags' field. + Unused. + + * src/cff/cffgload.c (cff_builder_init): Updated. + (cff_decoder_parse_charstrings) : Call hinter->apply + with decoder->hint_mode instead of builder->hint_flags. + * src/psaux/t1decode.c (t1_decoder_init): Updated. + + * src/base/ftstroker.c (ft_stroke_border_export): s/index/idx/. + + * src/sfnt/sfobjs.c (sfnt_load_face): Commented out code which + increased root->height by 15% if the line gap was zero. There exist + fonts (containing e.g. form drawing characters) which intentionally + have a zero line gap value. + + * src/truetype/ttinterp.c (Free_Project, CUR_Func_freeProj): + Removed. Unused. + Updated all callers. + +2003-06-02 Werner Lemberg + + * src/cff/cffobjs.c (cff_face_init): Use symbolic names for + Adobe specific encoding IDs (there was a wrong EID value for custom + encoding). + + * src/cff/cffcmap.h (CFF_CMapStdRec): Remove `count'. + * src/cff/cffcmap.c (cff_cmap_encoding_init, + cff_cmap_encoding_done): Updated. + (cff_cmap_encoding_char_index, cff_cmap_encoding_char_next): Use + 256 as limit for character code. + +2003-06-01 Werner Lemberg + + * src/winfonts/winfnt.c (FNT_Load_Glyph): Revert change from + 2003-03-20. + +2003-05-31 Werner Lemberg + + * include/freetype/fttrigon.h (FT_Vector_Normalize): Removed. + +2003-05-31 + + * src/type1/t1objs.c (T1_Face_Init): Improve algorithm for guessing + the font style by ignoring spaces and hyphens. + + * builds/unix/freetype2.in: Fix `Version' field. + +2003-05-30 Werner Lemberg + + Avoid overwriting of numeric font dictionary entries for synthetic + fonts. Additionally, some entries were handled as `integer' instead + of `number'. + + * include/freetype/internal/psaux.h (T1_FieldType): Add + T1_FIELD_TYPE_BOOL_P, T1_FIELD_TYPE_INTEGER_P, and + T1_FIELD_TYPE_FIXED_P. + (T1_FIELD_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P): New macros. + * src/psaux/psobjs.c (ps_parser_load_field): Handle new field types. + + * include/freetype/internal/cfftypes.h (CFF_FontRecDict), + src/cff/cfftoken.h: Change type of underline_position and + underline_thickness to FT_Fixed. + * src/cff/cffload.c (cff_subfont_load): Fix default values of + underline_position and underline_thickness. + * src/cff/cffobjs.c (cff_face_init): Set underline_position + and underline_thickness in `root'. + + * include/freetype/internal/t1types.h (T1_Font): Change point_type + and stroke_width to pointers. + * include/freetype/t1tables.h (PS_FontInfo): Change italic_angle, + is_fixed_pitch, underline_position, and underline_thickness to + pointers. + * src/type1/t1tokens.h: Change italic_angle, is_fixed_pitch, + underline_position, and underline_thickness to pointers. Change + the type of the latter two to `fixed'. + Change type of stroke_width to `fixed' and make it a pointer. + Change paint_type to pointer. + * src/type1/t1objs.c (T1_Face_Done): Updated. + (T1_Face_Init): Updated. + Fix assignment of underline_position and underline_thickness. + + * src/cid/cidtoken.h: Change italic_angle, is_fixed_pitch, + underline_position, and underline_thickness to pointers. Change + the type of the latter two to `fixed'. + Change type of stroke_width to `fixed'. + * src/cid/cidobjs.c (cid_face_done): Updated. + (cid_face_init): Updated. + Fix assignment of underline_position and underline_thickness. + + * src/type42/t42parse.c: Change italic_angle, is_fixed_pitch, + underline_position, and underline_thickness to pointers. Change the + type of the latter two to `fixed'. + Change type of stroke_width to `fixed' and make it a pointer. + Change paint_type to pointer. + * src/type42/t42objs.c (T42_Face_Init): Updated. + Fix assignment of underline_position and underline_thickness. + (T42_Face_Done): Updated. + + * src/base/ftobjs.c (open_face_from_buffer): Fix compiler warning. + * src/pshinter/pshglob.c, src/pshinter/pshglob.h + (psh_globals_set_scale): Make it a local function. + + * test/gview.c: Fix renaming ps3->ps typo. + Formatting. + +2003-05-29 Werner Lemberg + + * src/pshinter/pshalgo1.[ch], src/pshinter/pshalgo2.[ch]: Removed. + * src/pshinter/pshalgo.h: Removed. + + * src/pshinter/pshalgo3.[ch]: Renamed to... + * src/pshinter/pshalgo.[ch]: New files. + s/PSH3/PSH/. + s/psh3/psh/. + s/ps3/ps/. + + * src/pshinter/pshrec.c, src/pshinter/pshinter.c: Updated. + * src/pshinter/rules.mk, src/pshinter/Jamfile: Updated. + + * src/pshinter/pshglob.[ch] (psh_dimension_snap_width): Commented + out. + + * tests/gview.c: Remove code for pshalgo1 and pshalgo2. + Updated. + +2003-05-28 Martin Zinser + + * vms_make.com: Reworked support for shareable images on VMS. The + first version was kind of a hack; the current implementation of the + procedure to extract the required symbols is much cleaner. + + Reworked creation of MMS files, avoiding a number of temporary files + which were created in the previous version. + + Further work on creating descrip.mms files on the fly. + + * builds/vms/descrip.mms, src/autohint/descrip.mms, + src/type1/descrip.mms: Removed. + +2003-05-28 Werner Lemberg + + * src/pshinter/pshalgo3.c (psh3_glyph_compute_extrema): Skip + contours with only a single point to avoid segfault. + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Activate code for + handling `origin'. + +2003-05-24 Werner Lemberg + + * src/autohint/ahtypes.h (AH_OPTION_NO_STRONG_INTERPOLATION): + Removed since unused. + +2003-05-21 Werner Lemberg + + * include/freetype/config/ftstdlib.h (ft_strcat): New wrapper macro + for strcat. + + * src/base/ftmac.c (create_lwfn_name): s/isupper/ft_isupper/. + (parse_font): s/memcpy/ft_memcpy/. + (is_dfont) [TARGET_API_MAC_CARBON]: s/memcmp/ft_memcmp/. + * src/base/ftobjs.c (load_mac_face) [FT_MACINTOSH]: + s/strlen/ft_strlen/. + s/strcat/ft_strcat/. + s/strcpy/ft_strcpy/. + * src/gzip/zutil.h: s/memset/ft_memset/. + s/memcmp/ft_memcmp/. + + * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c + (PCF_Face_Init): Test for charset registry case-insensitively. + + * src/gzip/ftgzip.c (ft_gzip_fil_io): Revert change from yesterday; + it has already been fixed differently. + + * src/truetype/ttinterp.c (DO_SFVTL): Add missing braces around + if-clause. + +2003-05-21 Martin Zinser + + * t1load.c (parse_blend_axis_types): Fix compiler warning. + + * descrip.mms: Removed. Now created by... + + * vms_make.com: New file. + +2003-05-21 Weiqi Gao + + * src/gzip/ftgzip.c (ft_gzip_file_io): Avoid zero value of `delta' + to prevent infinite loop. + +2003-05-21 Lars Clausen + + * docs/VERSION.DLL: Provide better autoconf snippet to check + FreeType version. + +2003-05-21 Werner Lemberg + + * src/base/ftobjs.c (open_face): Free `internal' not + `face->internal' in case of error to avoid possible segfault. + + * src/pshinter/pshalgo3.c (ps3_hints_apply): Check whether we + actually have an outline. + +2003-05-20 David Chester + + * src/pshinter/pshalgo3.c (ps3_hints_apply): Try to optimize + y_scale so that the top of non-capital letters is aligned on a pixel + boundary whenever possible. + + * src/autohint/ahhint.c (ah_hint_edges): Make sure that lowercase + m's maintain their symmetry. + +2003-05-20 Werner Lemberg + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Oops! David's + patch from yesterday has been resolved already in a different + way. Reverted. + +2003-05-19 David Chester + + * src/autohint/ahhint.c (ah_hinter_load_glyph): Don't scale + y_scale locally but face->size->metrics.y_scale. + +2003-05-19 David Turner + + * src/sfnt/ttcmap0.c (tt_cmap4_char_next): Select proper start + value for `hi' to avoid infinite loop. + +2003-05-18 Yong Sun + + * src/raster/ftraster.c (Insert_Y_Turn): Fix overflow test. + +2003-05-18 Werner Lemberg + + * include/freetype/config/ftoption.h [FT_CONFIG_OPTION_MAC_FONTS]: + New macro. + * src/base/ftobjs.c: Use it to control mac font support on non-mac + platforms. + +2003-05-17 George Williams + + Implement partial support of Mac fonts on non-Mac platforms. + + * src/base/ftobjs.c (memory_stream_close, new_memory_stream, + open_face_from_buffer, Mac_Read_POST_Resource, + Mac_Read_sfnt_Resource, IsMacResource, IsMacBinary, load_mac_face) + [!FT_MACINTOSH]: New functions. + (FT_Open_Face) [!FT_MACINTOSH]: Use load_mac_face. + +2003-05-17 Werner Lemberg + + * src/base/ftobjs.c (FT_Load_Glyph): Scale linear advance width only + if FT_FACE_FLAG_SCALABLE is set (otherwise we have a division by + zero since FNT and friends don't define `face->units_per_EM'). + +2003-05-15 David Turner + + * src/base/fttrigon.c (FT_Vector_Rotate): Avoid rounding errors + for small values. + +2003-05-15 Werner Lemberg + + * src/autohint/ahtypes.h (AH_PointRec): Remove unused `in_angle' + and `out_angle' fields. + +2003-05-14 George Williams + + * src/base/ftmac.c (FT_New_Face_From_SFNT): Handle CFF files also. + +2003-05-14 Werner Lemberg + + * include/freetype/freetype.h: Fix typo in comment + (FT_HAS_FIXED_SIZES). + +2003-05-10 Dan Williams + + * builds/unix/aclocal.m4: Comment out definition of + `allow_undefined_flag' for Darwin 1.3. + * builds/unix/configure.ac: Add option --with-old-mac-fonts. + * builds/unix/ltmain.sh: Fix version numbering for Darwin 1.3. + * builds/unix/configure: Regenerated. + + * include/freetype/config/ftconfig.h: Fix conditions for defining + `FT_MACINTOSH'. + * src/base/ftbase.c: Include `ftmac.c' conditionally. + * src/base/ftmac.c: Handle __GNUC__. + +2003-05-07 YAMANO-UCHI Hidetoshi + + * src/cid/cidload.c (is_alpha): Removed. + (cid_parse_dict): Use `cid_parser_skip_alpha' instead of `is_alpha'. + +2003-05-07 Werner Lemberg + + * src/autohint/ahoptim.c, src/autohint/ahoptim.h: Obsolete, removed. + +2003-05-07 David Turner + + * src/autohint/ahglyph.c (ah_setup_uv): Exchange `for' loop and + `switch' statement to make it run faster. + (ah_outline_compute_segments): Reset `segment->score' and + `segment->link'. + (ah_outline_link_segments): Provide alternative code which does + the same but runs much faster. + Handle major direction also. + (ah_outline_compute_edges): Scale `edge_distance_threshold' down + after rounding instead of scaling comparison value in loop. + + * src/autohint/ahhint.c (ah_hinter_align_stong_points): Provide + alternative code which runs faster. + Handle `before->scale == 0'. + + * src/autohint/ahtypes.h (AH_SegmentRec): Move some fields down. + (AH_EdgeRec): Move some fields in structure. + New field `scale'. + + * src/sfnt/ttcmap0.c (tt_cmap4_char_next): Use binary search. + +2003-05-02 Werner Lemberg + + * src/autohint/ahoptim.c (LOG): Renamed to... + (AH_OPTIM_LOG): This. + (AH_Dump_Springs): Fix log message format. + + * src/autohint/ahhint.c (ah_hint_edges_3): Renamed to... + (ah_hint_edges): This. + +2002-05-02 Keith Packard + + * src/bdf/bdfdrivr.c (BDF_Set_Pixel_Size): Initialize `max_advance'. + +2003-05-01 Werner Lemberg + + * src/autohint/ahglyph.c (ah_test_extrema): Renamed to... + (ah_test_extremum): This. + +2003-04-28 Werner Lemberg + + * builds/unix/configure.ac: Generate `freetype.pc' from + `freetype.in'. + * builds/unix/configure: Regenerated. + * builds/unix/install.mk (install, uninstall): Handle `freetype.pc'. + +2003-04-28 Gustavo J. A. M. Carneiro + + * builds/unix/freetype2.in: New file. Contains building information + for the `pkg-config' package. + +2003-04-28 David Turner + + * src/base/ftobjs.c (FT_Load_Glyph): Fix boundary check for + `glyph_index'. + +2003-04-25: Graham Asher + + Added the optional unpatented hinting system for TrueType. It + allows typefaces which need hinting to produce correct glyph forms + (e.g., Chinese typefaces from Dynalab) to work acceptably without + infringing Apple patents. This system is compiled only if + TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING is defined in + ftoption.h. + + * include/freetype/ttunpat.h: New file. Defines + FT_PARAM_TAG_UNPATENTED_HINTING. + + * include/freetype/config/ftheader.h (FT_TRUETYPE_UNPATENTED_H): New + macro to use when including ttunpat.h. + + * include/freetype/config/ftoption.h + (TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): New configuration macros + (not defined, but in comments) for the unpatented hinting system. + + * include/freetype/internal/tttypes.h (TT_FaceRec) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: New element `FT_Bool + unpatented_hinting'. + + * src/truetype/ttinterp.c (NO_APPLE_PATENT, APPLE_THRESHOLD): + Removed. + (GUESS_VECTOR): New macro. + (TT_Run_Context) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: + Set `both_x_axis'. + (tt_default_graphics_state) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Updated. + (Current_Ratio) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: + Handle `unpatented_hinting'. + (Direct_Move) [NO_APPLE_PATENT]: Removed. + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Insert assertion. + (Project, FreeProject) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Insert assertion. + (Compute_Funcs) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: + Implement unpatented hinting. + (DO_SPVTCA, DO_SFVTCA, DO_SPVTL, DO_SFVTL, DO_SPVFS, DO_SFVFS, + Ins_SDPVTL): Call `GUESS_VECTOR'. + (DO_GPV, DO_GFV) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: + Handle `unpatented_hinting'. + (Compute_Point_Displacement) [NO_APPLE_PATENT]: Removed. + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Implement unpatented + hinting. + (Move_Zp2_Point, Ins_SHPIX, Ins_DELTAP, Ins_DELTAC) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Implement unpatented + hinting. + (TT_RunIns): Updated. + + * src/truetype/ttobjs.c + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Include + FT_TRUETYPE_UNPATENTED_H. + (tt_face_init) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, + TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING]: Check + FT_PARAM_TAG_UNPATENTED_HINTING. + + * src/truetype/ttobjs.h (TT_GraphicsState) + [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Add `both_x_axis'. + +2003-04-25 Werner Lemberg + + * src/bdf/bdflib.c (hash_bucket, hash_lookup): Use `const' for first + argument. + (bdf_get_font_property): Use `const' for third argument. + Updated all callers. + * src/bdf/bdfdrivr.c (BDF_Face_Init): Set pixel width and height + similar to the PCF driver. + * src/bdf/bdf.h (_hashnode): Use `const' for `key'. + Updated. + + * src/gzip/ftgzip.c: C++ doesn't like that the array `inflate_mask' + is declared twice. It is perhaps better to modify the zlib source + files directly instead of this hack. + (zcalloc, zfree, ft_gzip_stream_close, ft_gzip_stream_io): Add casts + to make build with g++ successful. + +2003-04-24 Manish Singh + + * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c + (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Split on `-' + also for searching the style name. + +2003-04-24 David Turner + + * src/pcf/pcfread.c (pcf_load_font): Fixed the computation of + face->num_glyphs. We must increase the value by 1 to respect the + convention that glyph index 0 always corresponds to the `missing + glyph'. + +2003-04-24 Werner Lemberg + + * builds/unix/unix-cc.in (CFLAGS): Add @CPPFLAGS@. + +2003-04-24 Dieter Baron + + * builds/unix/freetype-config.in (cflags): Emit FreeType 2's include + files first. Otherwise there are conflicts with FreeType 1 + installed simultaneously. + +2003-04-23 Werner Lemberg + + Fixing bugs reported by Nelson Beebe. + + * src/base/ftstroker.c (FT_Stroker_ParseOutline): Remove unused + variable `in_path'. + + * src/base/ftobjs (ft_glyphslot_set_bitmap): Change type of + second argument to `FT_Byte*'. + * include/freetype/internal/ftobjs.h: Updated. + + * src/bdf/bdflib.c (_bdf_readstream): Remove unused variable `res'. + (_bdf_parse_glyphs): Remove unused variable `next'. + Mark `call_data' as unused. + + * src/cache/ftlru.c (FT_LruList_Lookup): Remove unused variable + `plast'. + + * src/pcf/pcfread.c (pcf_seek_to_table_type): Slight recoding to + actually use `error'. + (pcf_load_font): Remove unused variable `avgw'. + + * src/pfr/pfrobjs.c (pfr_face_get_kerning): Change return type + to `void'. + Mark `error' as unused. + * src/pfr/pfrobjs.h: Updated. + * src/pfr/pfrdrivr.c (pfr_get_kerning): Updated. + + * src/sfnt/ttload.c (sfnt_dir_check): Remove unused variable + `format_tag'. + + * src/sfnt/ttcmap0.c (tt_cmap6_validate, tt_cmap10_validate): Remove + unused variable `start'. + (tt_cmap10_char_next): Remove unused variable `result' + + * src/sfnt/sfobjs.c (tt_face_get_name): Mark `error' as unused. + + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Mark `error' as + unused. + + * src/type1/t1objs.c (T1_Face_Init): Remove unused variable + `pshinter'. + + * src/type1/t1gload.c (T1_Load_Glyph): Use `glyph_data_loaded' + only for FT_CONFIG_OPTION_INCREMENTAL. + +2003-04-23 Akito Hirai + + * src/sfnt/ttcmap0.c (tt_cmap4_validate): Provide a weak variant + of the glyph ID bounding check if FT_VALIDATE_TIGHT is not active. + Without this change, many CJK fonts from Dynalab are rejected. + +2003-04-23 Joe Marcus Clarke + + * src/base/ftbdf.c (FT_Get_BDF_Property): Check for valid + `get_interface'. + +2003-04-23 Paul Miller + + * src/base/ftmac.c (parse_fond): Fix handling of style names. + +2003-04-23 Werner Lemberg + + * src/pfr/pfrload.c (pfr_extra_item_load_font_id): Use FT_PtrDist + instead of FT_Uint for `len'. + +2003-04-22 Werner Lemberg + + * src/gzip/ftgzip.c (zcalloc) [!FT_CONFIG_OPTION_SYSTEM_ZLIB]: + Convert K&R format to modern C usage. + (FT_Stream_OpenGzip): Use long constant. + +2003-04-21 Werner Lemberg + + * src/cache/ftccache.c (ftc_cache_lookup): Remove shadow declaration + of `manager'. + +2003-04-20 Werner Lemberg + + * doc/INSTALL.UNX: Cleaned up. + +2003-04-09 Torrey Lyons + + * src/base/ftmac.c (open_face_from_buffer): Removed a double-free + bug that had nasty consequences when trying to open an `invalid' + font on a Mac. + +2003-04-09 Mike Fabian + + * src/bdf/bdfdrivr.h (BDF_encoding_el), src/pcf/pcf.h + (PCF_EncodingRec): Changed FT_Short to FT_UShort in order to be able + to access more than 32768 glyphs in fonts. + +2003-04-08 David Turner + + + * Version 2.1.4 released. + ========================= + + +2003-04-03 Martin Muskens + + * src/type1/t1load.c (T1_Open_Face): Fixed the code to make it + handle special cases where a font only contains a `.notdef' glyph + (happens in PDF-embedded fonts). Otherwise, FT_Panic was called. + +2003-03-27 David Turner + + * README: Udpated. + + * README.UNX: Removed (now replaced by docs/INSTALL.UNX). + + * src/pshinter/pshalgo3.c: The hinter now performs as in 2.1.3 and + will ignore stem quantization only when FT_LOAD_TARGET_SMOOTH is + used. + (psh3_dimension_quantize_len): Enabled. + (psh3_hint_align): Enable commented code. + (psh3_hint_align_light): Commented out. + + * src/base/ftobjs.c (FT_Set_Char_Size): Changed the default + computations to include rounding in all cases; this is required to + provide accurate kerning data when native TrueType hinting is + enabled. + + * src/type1/t1load.c (is_name_char): The Type 1 loader now accepts + more general names according to the PostScript specification (the + previous one was too restrictive). + (parse_font_name, parse_encoding, parse_charstrings, parse_dict): + Use `is_name_char'. + (parse_subrs): Handle empty arrays. + +2003-03-20 David Turner + + Serious rewriting of the documentation. + + * docs/BUGS, docs/BUILD: Removed. + * docs/DEBUG.TXT: Renamed to... + * docs/DEBUG: This. + * docs/CUSTOMIZE, docs/TRUETYPE, docs/UPGRADE.UNX: New files. + * docs/INSTALL.ANY, docs/INSTALL.UNX, docs/INSTALL.GNU New files, + containing platform specific information previously in INSTALL. + * docs/readme.vms: Renamed to... + * docs/INSTALL.VMS: This. + + * docs/*: Updated. + + Introduced three new functions to deal with glyph bitmaps within + FT_GlyphSlot objects: + + ft_glyphslot_free_bitmap + ft_glyphslot_alloc_bitmap + ft_glyphslot_set_bitmap + + These functions are much more convenient to use than managing the + FT_GLYPH_OWN_BITMAP flag manually. + + * include/freetype/internal/ftobjs.h (ft_glyphslot_free_bitmap, + ft_glyphslot_alloc_bitmap, ft_glyphslot_set_bitmap): New functions. + * src/base/ftobjs.c: Implement them. + (ft_glyphslot_done): Use ft_glyphslot_free_bitmap. + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/pcf/pcfdriver.c + (PCF_Glyph_Load): Remove unused variable `memory'. + Use `ft_glyphslot_*' functions. + Don't set `FT_GLYPH_OWN_BITMAP'. + + * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Use + `ft_glyphslot_alloc_bitmap'. + + * src/sfnt/ttsbit.c (Load_SBit_Image): Change 5th argument to type + `FT_GlyphSlot'. + Adding argument `depth' to handle recursive calls. + Use `ft_glyphslot_alloc_bitmap'. + (tt_face_load_sbit_image): Remove unused variable `memory'. + Don't handle `FT_GLYPH_OWN_BITMAP'. + Update call to Load_SBit_Image. + + * src/type42/t42objs.c (ft_glyphslot_clear): Renamed to... + (t42_glyphslot_clear): This. Updated caller. + Call `ft_glyphslot_free_bitmap'. + + * src/winfonts/winfnt.c (FNT_Load_Glyph): Use + `ft_glyphslot_set_bitmap'. + Don't handle `FT_GLYPH_OWN_BITMAP'. + + * src/cache/ftlru.c (FT_LruList_Lookup): Fixed an invalid assertion + check. + + * src/autohint/ahglyph.c (ah_outline_load): Add two scaling + arguments. + * src/autohint/ahglyph.h: Updated. + * src/autohint/ahhint.c (ah_hinter_load): Updated. + * src/autohint/ahglobal.c (ah_hinter_compute_widths): Updated. + + * src/cache/ftccache.c (ftc_family_done): Fixed small bug that could + crash the cache in rare circumstances (mostly with broken fonts). + +2003-03-15 David Turner + + * src/truetype/ttdriver.c (Set_Char_Sizes): Fixed a small rounding + bug. Actually, it seems that previous versions of FreeType didn't + perform TrueType rounding exactly as appropriate. + +2003-03-14 David Turner + + * src/truetype/ttdriver.c (Set_Char_Sizes): Fixing the small + TrueType native rendering glitches; they came from a small rounding + error. + +2003-03-13 David Turner + + Added new environment variables to control memory debugging with + FreeType. See the description of `FT2_DEBUG_MEMORY', + `FT2_ALLOC_TOTAL_MAX' and `FT2_ALLOC_COUNT_MAX' in DEBUG.TXT. + + * src/base/ftdbgmem.c (FT_MemTableRec): Add `alloc_count', + `bound_total', `alloc_total_max', `bound_count', `alloc_count_max'. + (ft_mem_debug_alloc): Handle new variables. + (ft_mem_debug_init): s/FT_DEBUG_MEMORY/FT2_DEBUG_MEMORY/. + Handle new environment variables. + * docs/DEBUG.TXT: Updated. + + Fixed the cache sub-system to correctly deal with out-of-memory + conditions. + + * src/cache/ftccache.c (ftc_node_destroy): Comment out generic + check. + (ftc_cache_lookup): Implement loop. + * src/cache/ftccmap.c: Define FT_COMPONENT. + * src/cache/ftcsbits.c (ftc_sbit_node_load): Handle + FT_Err_Out_Of_Memory. + * src/cache/ftlru.c: Include FT_INTERNAL_DEBUG_H. + (FT_LruList_Lookup): Implement loop. + + * src/pfr/pfrobjs.c (pfr_face_done): Fix memory leak. + (pfr_face_init): Fixing compiler warnings. + + * src/psaux/psobjs.c (reallocate_t1_table): Fixed a bug (memory + leak) that only happened when a try to resize an array would end in + an out-of-memory condition. + + * src/smooth/ftgrays.c (gray_convert_glyph): Removed compiler + warnings / volatile bug. + + * src/truetype/ttobjs.c (tt_glyphzone_done): Removed segmentation + fault that happened in tight memory environments. + +2003-02-28 Pixel + + * src/gzip/ftgzip.c (ft_gzip_file_done): Fixed memory leak: The ZLib + stream was not properly finalized. + +2003-02-25 Anthony Fok + + * src/cache/ftccmap.c: Include FT_TRUETYPE_IDS_H. + (ftc_cmap_family_init): The cmap cache now + supports UCS-4 charmaps when available in Asian fonts. + + * src/sfnt/ttload.c, src/base/ftobjs.c: Changed `asian' to `Asian' + in comments. + +2003-02-25 David Turner + + * src/gzip/ftgzip.c (ft_gzip_file_fill_output): Fixed a bug that + caused FreeType to loop endlessly when trying to read certain + compressed gzip files. The following test reveals the bug: + + touch 0123456789 ; gzip 0123456789 ; ftdump 0123456789.gz + + Several fixes to the PFR font driver: + + - The list of available embedded bitmaps was not correctly set in + the root FT_FaceRec structure describing the face. + + - The glyph loader always tried to load the outlines when + FT_LOAD_SBITS_ONLY was specified. + + - The table loaded now scans for *undocumented* elements of a + physical font's auxiliary data record. This is necessary to + retrieve the `real' family and style names. + + NOTE THAT THESE CHANGES THE FAMILY NAME OF MANY PFR FONTS! + + * src/pfr/pfrload.c (pfr_aux_name_load): New function. + (pfr_phy_font_done): Free `family_name' and `style_name' also. + Remove unused variables. + (pfr_phy_font_load): Extract useful information from the auxiliary + bytes. + + * src/pfr/pfrobjs.c (pfr_face_done): Set pointers to NULL. + (pfr_face_init): Provide fallback values for `family_name' and + `style_name'. + Handle strikes. + (pfr_slot_load): Handle FT_LOAD_SBITS_ONLY. + * src/pfr/pfrtypes.h (PFR_PhyFontRec): Add fields `ascent', + `descent', `leading', `family_name', and `style_name'. + + * src/truetype/ttdriver.c (Set_Char_Sizes): Fixed a rounding bug + when computing the scale factors for a given character size in + points with resolution. + + * devel/ft2build.h, devel/ftoption.h: New files (in a new directory) + which are special development versions of include/ft2build.h and + include/freetype/config/ftoption.h, respectively. + +2003-02-18 David Turner + + Fixing the slight distortion problem that occurred due to the latest + auto-hinter changes. + + * src/base/ftobjs.c (ft_recompute_scaled_metrics): Fix rounding. + + * src/truetype/ttdriver.c (Set_Char_Sizes): New variable `metrics2'. + [!TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Removed. + + * src/truetype/ttobjs.h (TT_SizeRec): New field `metrics'. + * src/truetype/ttobjs.c (Reset_Outline_Size): Fix initialization of + `metrics'. + [FT_CONFIG_CHESTER_ASCENDER]: Code removed. + (Reset_SBit_Size): Fix initialization of `metrics'. + + * src/truetype/ttinterp.c (TT_Load_Context): Fix initialization of + `exec->metrics'. + + * src/autohint/ahhint.c (ah_hinter_load): Disabled the advance width + `correction' which seemed to provide more trouble than benefits. + +2003-02-13 Graham Asher + + Changed the incremental loading interface in a way that makes it + simpler and allows glyph metrics to be changed (e.g., by adding a + constant, as required by CFF fonts) rather than just overridden. + This was required to make the GhostScript-to-FreeType bridge work. + + * src/cff/cffgload.c (cff_slot_load) [FT_CONFIG_OPTION_INCREMENTAL]: + Allow metrics to be overridden. + * src/cid/cidgload.c (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL]: + Ditto. + + * src/truetype/ttgload.c (load_truetype_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Simplify. + (compute_glyph_metrics) [FT_CONFIG_OPTION_INCREMENTAL]: Code block + moved down. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + + * include/freetype/ftincrem.h: Updated. + +2003-01-31 David Turner + + * docs/CHANGES, docs/VERSION.DLL, docs/TODO: Updating documentation + for the 2.1.4 release. + + * builds/win32/visualc/freetype.dsp, + builds/win32/visualc/index.html: Updating the project file for + 2.1.4. + + * src/gzip/adler32.c, src/gzip/ftgzip.c, src/gzip/infblock.c, + src/gzip/infcodes.c, src/gzip/inflate.c, src/gzip/inftrees.c, + src/gzip/infutil.c: Removed old-style (K&R)function definitions. + This avoids warnings with Visual C++ at its most pedantic mode. + + * src/pfr/pfrsbit.c: Removed compiler warnings. + + * src/cache/ftccmap.c (ftc_cmap_family_init): Changed an FT_ERROR + into an FT_TRACE1 since it caused `ftview' and others to dump too + much junk when trying to display a waterfall with a font without a + Unicode charmap (e.g. SYMBOL.TTF). + + Implemented FT_CONFIG_CHESTER_BLUE_SCALE, corresponding to the last + patch from David Chester, but with a much simpler (and saner) + implementation. + + * src/autohint/ahhint.c (ah_hinter_load_glyph) + [FT_CONFIG_CHESTER_BLUE_SCALE]: Try to optimize the y_scale so that + the top of non-capital letters is aligned on a pixel boundary + whenever possible. + + * src/base/ftobjs.c (FT_Set_Char_Size) + [FT_CONFIG_CHESTER_BLUE_SCALE]: Round differently. + * src/truetype/ttdriver.c (Set_Char_Sizes) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Do some rounding only + if this macro is defined. + + * src/truetype/ttobjs.c (Reset_Outline_Size) + [FT_CONFIG_CHESTER_ASCENDER]: Round differently. + + * src/pshinter/pshalgo3.c: Improved the Postscript hinter. Getting + rid of stem snapping seems to work well here (though the stems are + still slightly moved to increase contrast). + (psh3_dimension_quantize_len): Commented out. + (psh3_hint_align_light): New function. + (psh3_hint_align): Comment out some code. + + THIS IMPROVES ANTI-ALIASED RENDERING, BUT MONOCHROME AND LCD MODES + STILL SUCK. + +2003-01-22 David Chester + + * src/autohint/ahhint.c (ah_compute_stem_width): Small fix to the + stem width optimization. + +2003-01-22 David Turner + + Adding a new API `FT_Get_BDF_Property' to retrieve the BDF + properties of a given PCF or BDF font. + + * include/freetype/ftbdf.h (FT_PropertyType): New enumeration. + (BDF_Property, BDF_PropertyRec): New structure. + FT_Get_BDF_Property): New function. + * include/freetype/internal/bdftypes.h: Include FT_BDF_H. + (BDF_GetPropertyFunc): New function pointer. + + * src/base/ftbdf.c (test_font_type): New helper function. + (FT_Get_BDF_Charset_ID): Use `test_font_type'. + (FT_Get_BDF_Property): New function. + + * src/bdf/bdfdrivr.c: Include FT_BDF_H. + (bdf_get_bdf_property, bdf_driver_requester): New functions. + (bdf_driver_class): Use `bdf_driver_requester'. + + * src/pcf/pcfdrivr.c: Include FT_BDF_H. + (pcf_get_bdf_property, pdc_driver_requester): New functions + (pcf_driver_class): Use `pcf_driver_requester'. + + * src/pcf/pcfread.c: Include `pcfread.h'. + (pcf_find_property): Decorate it with FT_LOCAL_DEF. + * src/pcf/pcfread.h: New file, providing `pcf_find_property'. + + * src/sfnt/ttload.c (sfnt_dir_check): Relaxed the `head' table size + verification to accept a few broken fonts who pad the size + incorrectly (the table should be padded, but its `size' field + shouldn't according to the specification). + +2003-01-18 Werner Lemberg + + * builds/unix/ltmain.sh: Regenerated with `libtoolize --force + --copy' from libtool 1.4.3. + * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from + automake 1.7.1. + * builds/unix/configure: Regenerated with autoconf 2.54. + * builds/unix/config.guess, builds/unix/config.sub: Updated from + `config' CVS module at subversions.gnu.org. + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `automake' CVS module at subversions.gnu.org. + +2003-01-15 David Turner + + * include/freetype/freetype.h: Fixed documentation for + FT_Size_Metrics. + +2003-01-15 James Su + + * src/gzip/ftgzip.c (ft_gzip_check_header): Bugfix: couldn't read + certain gzip-ed font files (typo: `&&' -> `&'). + +2003-01-15 Huw D M Davies + + Added a Windows .FNT specific API (mostly for Wine). Also fixed a + nasty bug in the header loader which would cause invalid memory + overwrites. + + * include/freetype/config/ftheader.h (FT_WINFONTS_H): New macro + for ftwinfnt.h. + * include/freetype/internal/fnttypes.h: Include FT_WINFONTS_H. + (FNT_FontRec): Updated. + Move Windows FNT definition to... + * include/freetype/ftwinfnt.h: This new file. + (FT_WinFNT_HeaderRec): Rename `reserved2' to `reserved1'. + * src/base/ftwinfnt.c: New file, providing `FT_Get_WinFNT_Header'. + * src/winfonts/winfnt.c (winfnt_header_fields): Updated. + Rename `reserved2' to `reserved1'. + (fnt_font_load): Updated. + + * src/base/Jamfile, src/base/descrip.mms, src/base/rules.mk: + Updated. + +2003-01-14 Graham Asher + + * include/freetype/ftglyph.h, src/base/ftglyph.c: Added `const' to + the type of the first argument to FT_Matrix_Multiply, which isn't + changed -- this adds documentation and convenience. + +2003-01-13 Graham Asher + + * src/sfnt/ttload.c (tt_face_load_metrics) + [FT_CONFIG_OPTION_INCREMENTAL]: TrueType typefaces without + horizontal metrics (without the `hmtx' table) are now tolerated if + an incremental interface has been specified that has a + get_glyph_metrics function, implying that metrics will be supplied + from outside. This happens for certain Type 42 fonts passed from + GhostScript. + +2003-01-11 David Chester + + Patches to the auto-hinter in order to slightly improve the output. + Note that everything is controlled through the new + FT_CONFIG_OPTION_CHESTER_HINTS defined in `ftoption.h'. There are + also individual FT_CONFIG_CHESTER_XXX macros to control individual + `features'. + + Note that all improvements are enabled by default, but can be + tweaked for optimization and testing purposes. The configuration + macros will most likely disappear in the short future. + + * include/freetype/config/ftoption.h + (FT_CONFIG_OPTION_CHESTER_HINTS): New macro. + (FT_CONFIG_CHESTER_{SMALL_F,ASCENDER,SERIF,STEM,BLUE_SCALE}) + [FT_CONFIG_OPTION_CHESTER_HINTS]: New macros to control individual + features. + + * src/autohint/ahglobal.c (blue_chars) [FT_CONFIG_CHESTER_SMALL_F]: + Add blue zone for `fijkdbh'. + * src/autohint/ahglobal.h (AH_IS_TOP_BLUE) + [FT_CONFIG_CHESTER_SMALL_F]: Use `AH_BLUE_SMALL_F_TOP'. + * src/autohint/ahglyph.c (ah_outline_compute_edges) + [FT_CONFIG_CHESTER_SERIF]: Use `AH_EDGE_SERIF'. + (ah_outline_compute_blue_edges) [FT_CONFIG_CHESTER_SMALL_F]: + Increase threshold for `best_dist'. + * src/autohint/ahhint.c (ah_compute_stem_width) + [FT_CONFIG_CHESTER_SERIF]: Provide new version for improved serif + handling. + (ah_align_linked_edge) [FT_CONFIG_CHESTER_SERIF]: Use special + version of `ah_compute_stem_width'. + (ah_hint_edges_3) [FT_CONFIG_CHESTER_STEM]: A new algorithm for stem + alignment when stem widths are less than 1.5 pixels wide centers the + stem slightly off-center of the center of a pixel (this increases + sharpness and consistency). + [FT_CONFIG_CHESTER_SERIF]: Use special version of + `ah_compute_stem_width'. + * src/autohint/ahtypes.h [FT_CONFIG_CHESTER_SMALL_F]: Add + `AH_BLUE_SMALL_F_TOP'. + +2003-01-11 David Turner + + * include/freetype/internal/fnttypes.h (WinFNT_HeaderRec): Increase + size of `reserved2' to avoid memory overwrites. + +2003-01-08 Huw Davies + + * src/winfonts/winfnt.c (winfnt_header_fields): Read 16 bytes into + `reserved2', not `reserved'. + + * src/base/ftobjs.c (find_unicode_charmap): Fixed the error code + returned when the font doesn't contain a Unicode charmap. This + allows FT2 to load `symbol.ttf' and a few others correctly since the + last release. + (open_face): Fix return value. + +2003-01-08 Owen Taylor + + Implemented the FT_RENDER_MODE_LIGHT hinting mode in the auto and + postscript hinters. + + * src/autohint/ahtypes.h (AH_HinterRec): Add `do_stem_adjust'. + * src/autohint/ahhint.c (ah_compute_stem_width): Handle + hinter->do_stem_adjust. + (ah_hinter_load_glyph): Set hinter->do_stem_adjust. + + * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Add `do_stem_adjust'. + * src/pshinter/pshalgo3.c (psh3_hint_align): Use `do_stem_adjust'. + (ps3_hints_apply): Handle FT_RENDER_MODE_LIGHT. + + * include/freetype/freetype.h (FT_Render_Mode): Add + FT_RENDER_MODE_LIGHT. + + * src/truetype/ttgload.c: Fixing the TrueType loader to handle + invalid composites correctly by limiting the recursion depth. + (TT_MAX_COMPOSITE_RECURSE): New macro. + (load_truetype_glyph): Add argument `recurse_count'. + Load a composite only if the numbers of contours is -1, emit error + otherwise. + (TT_Load_Glyph): Updated. + +2003-01-08 David Turner + + * Jamrules, Jamfile, Jamfile.in, src/*/Jamfile: Small changes to + support the compilation of FreeType 2 as part of larger projects + with their own configuration options (only with Jam). + +2003-01-07 David Turner + + * src/base/ftstroker.c: Probably the last bug-fixes to the stroker; + the API is likely to change, however. + (ft_stroke_border_close): Don't record empty paths. + (ft_stroke_border_get_counts): Increase `num_points' also in for loop. + (ft_stroke_border_export): Don't increase `write' twice in for loops. + (ft_stroker_outside): Handle `phi' together with `theta'. + (FT_Stroker_ParseOutline): New function. + + * src/base/fttrigon.c (FT_Angle_Diff): Fixing function: It returned + invalid values for large negative angle differences (resulting in + incorrect stroker computations, among other things). + + * src/cache/ftccache.c (ftc_node_hash_unlink): Removing incorrect + assertion, and changing code to avoid hash table size contraction. + + * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: Adding + `ftstroker' to default build, as optional component. + +2002-12-26 David Turner + + * src/gzip/adler32.c, src/gzip/infblock.c, src/gzip/inflate.c, + src/gzip/inftrees.c, src/gzip/zconf.h, src/gzip/zlib.h, + src/gzip/zutil.h: Updates to allow compilation without compiler + warnings with LCC-Win32. + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4. + * builds/unix/configure.ac (version_info): Increased to 9:3:3. + * builds/unix/configure: Regenerated. + * docs/VERSION.DLL: Updated. + +2002-12-23 Anthony Fok + + * builds/unix/configure.ac, builds/unix/unix-cc.in (LINK_LIBRARY), + builds/unix/unix-def.in (SYSTEM_ZLIB): Small fix to configure + sub-system on Unix to allow other programs to correctly link with + zlib when needed. + +2002-12-19 David Turner + + * include/freetype/internal/sfnt.h (SFNT_Load_Table_Func): New + function pointer. + + * include/freetype/tttables.h (FT_Load_Sfnt_Table): New function. + * src/base/ftobjs.c: Implement it. + + * src/sfnt/sfdriver.c (sfnt_get_interface): Handle `load_sfnt' + module request. + +2002-12-17 David Turner + + * src/base/ftobjs.c (find_unicode_charmap): Added some comments to + better explain what's happening there. + (open_face): Included Graham Asher's fix to prevent faces without + Unicode charmaps from loading. + + * src/winfonts/winfnt.c: Included George Williams's fix to support + version 2 fonts correctly. + (winfnt_header_fields): Updated. + (fnt_font_load): Handle version 2 fonts. + (FNT_Load_Glyph): Updated. + +2002-12-16 David Turner + + * docs/VERSION.DLL: Updating document to better explain the + differences between the three version numbers being used on Unix, as + well as providing an autoconf fragment provided by Lars Clausen. + + * src/smooth/ftgrays.c (gray_render_conic): Fixed small bug that + prevented Bézier arcs with negative vertical coordinates to be + rendered appropriately. + +2002-12-02 Antoine Leca + + * src/base/ftobjs.c: Modified the logic to get Unicode charmaps. + Now it loads UCS-4 charmaps when there is one. + (find_unicode_charmap): New function. + (open_face): Refer to the above one. + (FT_Select_Charmap): Idem. + +2002-11-29 Antoine Leca + + * include/freetype/ftgzip.h: Correct the name of the controlling + macro (was __FTXF86_H__ ...). + +2002-11-27 Vincent Caron + + * builds/unix/unix-def.in, builds/unix/freetype-config.in, + builds/unix/configure.ac, src/gzip/rules.mk, src/gzip/ftgzip.c + [FT_CONFIG_OPTION_SYSTEM_ZLIB]: Adding support for system zlib + installations if available on the target platform (Unix only). + +2002-11-23 David Turner + + * src/cff/cffload.c (cff_charset_load, cff_encoding_load): Modified + charset loader to accept pre-defined charsets, even when the font + contains fewer glyphs. Also enforced more checks to ensure that we + never overflow the character codes array in the encoding. + +2002-11-22 Antoine Leca + + * include/freetype/ttnameid.h: Updated to latest OpenType + specification. + +2002-11-18 David Turner + + + * Version 2.1.3 released. + ========================= + + +2002-11-07 David Turner + + * src/cache/ftcsbit.c (ftc_sbit_node_load): Fixed a small bug that + caused problems with embedded bitmaps. + + * src/otlayout/otlayout.h, src/otlyaout/otlconf.h, + src/otlayout/otlgsub.c, src/otlayout/otlgsub.h, + src/otlayout/otlparse.c, src/otlayout/otlparse.h, + src/otlayout/otlutils.h: Updating the OpenType Layout code, adding + support for the first GSUB lookups. Nothing that really compiles + for now though. + + * src/autohint/ahhint.c (ah_align_serif_edge): Disabled serif stem + width quantization. It produces slightly better shapes though this + is not distinguishable with many fonts. + Remove other dead code. + + * src/Jamfile, src/*/Jamfile: Simplified. + Use $(FT2_SRC_DIR). + +2002-11-06 David Turner + + * include/freetype/freetype.h (FT_LOAD_TARGET_LIGHT): New macro. + (FT_LOAD_TARGET, FT_LOAD_TARGET_MODE): Use `& 15' instead of `& 7'. + +2002-11-05 David Turner + + * include/freetype/config/ftoption.h, src/gzip/ftgzip.c: Added + support for the FT_CONFIG_OPTION_SYSTEM_ZLIB option, used to specify + the use of system-wide zlib. + + Note that this macro, as well as + TT_CONFIG_OPTION_BYTECODE_INTERPRETER, is not #undef-ed anymore. + This allows the build system to define them depending on the + configuration (typically by adding -D flags at compile time). + + * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Removed compiler + warnings in optimized mode relative to the `volatile' local + variables. This was not a compiler bug after all, but the fact that + a pointer to a volatile variable is not the same as a volatile + pointer to a variable :-) + + The fix was to change + `volatile FT_Byte* p' + into + `FT_Byte* volatile p'. + + * src/pfr/pfrload.c (pfr_phy_font_load), src/pfr/pfrdrivr.c + (pfr_get_metrics), src/gzip/inftrees.c: Removed compiler warnings in + optimized modes. + + * src/gzip/*.[hc]: Modified our zlib copy in order to prevent + exporting any zlib function names outside of the component. This + prevents linking problems on some platforms, when applications want + to link FreeType _and_ zlib together. + +2002-11-05 Juliusz + + * src/psaux/psobjs.c (ps_table_add): Modified increment loop in + order to implement exponential behaviour. + +2002-11-01 David Turner + + Added PFR-specific public API. Fixed the kerning retrievel routine + (it returned invalid values when the outline and metrics resolution + differ). + + * include/freetype/ftpfr.h, include/freetype/internal/pfr.h: New + files. + + * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H): New + macro for pfr.h. + + * src/base/ftpfr.c: New file. + * src/base/Jamfile, src/base/descrip.mms: Updated. + + * src/pfr/pfrdrivr.c: Include FT_INTERNAL_PFR_H. + (pfr_get_kerning, pfr_get_advance, pfr_get_metrics): New functions. + (pfr_service_rec): New format interface. + (pfr_driver_class): Use `pfr_service_rec'. + Replace `pfr_face_get_kerning' with `pfr_get_kerning'. + * src/pfr/pfrobjs.c: Remove dead code. + + * src/base/ftobjs.c (ft_glyphslot_clear): Small internal fix to + better support bitmap-based font formats. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Fix handling of + `scale'. + Fix arguments to `FT_Vector_From_Polar'. + +2002-10-31 David Turner + + Add support for automatic handling of gzip-compressed PCF files. + + * src/gzip/*: New files, taken from the zlib package (except + ftgzip.c). + + * include/freetype/ftgzip.h, src/gzip/ftgzip.c: New files. + * include/freetype/config/ftheader.h (FT_GZIP_H): New macro for + `ftgzip.h'. + + * src/pcf/pcfdriver.c: Include FT_GZIP_H and FT_ERRORS_H. + (PCF_Face_Init): If normal open fails, try to open gzip stream. + (PCF_Face_Done): Close gzip stream. + + * include/freetype/internal/pcftypes.h (PCF_Public_FaceRec), + src/pcf/pcf.h (PCF_FaceRec): Add `gzip_stream' and `gzip_source'. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_ZLIB): + New macro. + (T1_CONFIG_OPTION_DISABLE_HINTER, FT_CONFIG_OPTION_USE_CMAPS + FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS, + FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS): Removed. + + (FT_EXPORT, FT_EXPORT_DEF, FT_DEBUG_LEVEL_ERROR, + FT_DEBUG_LEVEL_TRACE, FT_DEBUG_MEMORY): Comment out definitions so + that platform specific configuration file can override. + + * include/freetype/internal/ftstream.h: Include FT_SYSTEM_H. + +2002-10-30 David Turner + + * FreeType 2.1.3rc3 released. + +2002-10-25 David Turner + + * include/freetype/ftcache.h (FT_POINTER_TO_ULONG): New macro. + (FTC_FACE_ID_HASH): Rewritten, using FT_POINTER_TO_ULONG. + +2002-10-22 Giuseppe Ghibò + + * include/freetype/freetype.h (FT_Encoding): Fix entry for latin-2. + +2002-10-07 Werner Lemberg + + * include/freetype/freetype.h (FT_Open_Face): Use `const' for `args' + (suggested by Graham). + * src/base/ftobjs.c (FT_Open_Face): Updated. + (ft_input_stream_new): Ditto. + +2002-10-05 David Turner + + Adding support for embedded bitmaps to the PFR driver, and rewriting + its kerning loader/handler to use all kerning pairs in a physical + font (and not just the first item). + + * src/pfr/pfr.c: Include `pfrsbit.c'. + * src/pfr/pfrgload.c: Include `pfrsbit.h'. + * src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): Rewritten. + (pfr_phy_font_done, pfr_phy_font_load): Updated. + * src/pfr/pfrobks.c: Include `pfrsbit.h'. + (pfr_face_init): Handle kerning and embedded bitmaps. + (pfr_slot_load): Load embedded bitmaps. + (PFR_KERN_INDEX): Removed. + (pfr_face_get_kerning): Rewritten. + * src/pfr/pfrsbit.c, src/pfr/pfrsbit.h: New files. + * src/pfr/pfrtypes.h (PFR_KernItemRec): New structure. + (PFR_KERN_INDEX): New macro. + (PFR_PhyFontRec): Add items for kerning and embedded bitmaps. + * src/pfr/Jamfile (_sources) [FT2_MULTI]: Add `pfrsbit'. + + * src/base/ftobjs.c (FT_Load_Glyph): Don't load bitmap fonts if + FT_LOAD_NO_RECURSE is set. + Load embedded bitmaps only if FT_LOAD_NO_BITMAP isn't set. + + * src/tools/docmaker/content.py, src/tools/docmaker/sources.py, + src/tools/docmaker/tohtml.py: Fixing a few nasty bugs. + + * src/sfnt/ttcmap0.c (tt_cmap4_validate): The validator for format 4 + sub-tables is now capable of dealing with invalid `length' fields at + the start of the sub-table. This allows fonts like `mg______.ttf' + (i.e. Marriage) to return accurate charmaps. + + * docs/CHANGES: Updated. + +2002-10-05 Werner Lemberg + + * src/smooth/ftgrays.c (SUBPIXELS): Add cast to `TPos'. + Update all callers. + (TRUNC): Add cast to `TCoord'. + Update all callers. + (TRaster): Use `TPos' for min_ex, max_ex, min_ey, max_ey, and + last_ey. + Update all casts. + (gray_render_line): Fix casts for `p' and `first'. + +2002-10-02 Detlef Würkner + + * src/bdf/bdflib.c (bdf_load_font): Allocate the _bdf_parse_t + structure with FT_ALLOC instead of using the stack. + +2002-09-27 Werner Lemberg + + * src/include/freetype/internal/tttypes.h (num_sbit_strikes, + num_sbit_scales): Use `FT_ULong'. + * src/sfnt/sfobjs.c (sfnt_load_face): Updated accordingly. + * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Ditto. + (find_sbit_image): Remove cast. + * src/raster/ftrend1.c (ft_raster1_render): Fix cast. + +2002-09-27 Wolfgang Domröse + + * src/sfnt/ttload.c (tt_face_load_names): Use cast. + * src/sfnt/ttcmap.c (code_to_next2): Use long constant. + (code_to_index4): Use cast. + (code_to_index8_12): Fix cast. + * src/sfnt/ttcmap0.c (tt_cmap4_char_next, tt_cmap8_char_index, + tt_cmap12_char_index): Use cast for `result'. + (tt_face_build_cmaps): Use cast. + * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_ucs4): Use cast for + `code'. + (sfnt_load_face): Use FT_Int32 for `flags'. + + * src/smooth/ftgrays.c (gray_render_scanline, gray_render_line, + gray_compute_cbox, gray_convert_glyph, gray_raster_reset): Add casts + to `TCoord' and `int'. + More 16bit fixes. + s/FT_Pos/TPos/. + * src/smooth/ftsmooth.c (ft_smooth_render_generic): Add casts. + +2002-09-26 Werner Lemberg + + * src/sfnt/ttpost.c (load_post_names, tt_face_free_ps_names, + tt_face_get_ps_name): Replace switch statement with if clauses to + make it more portable. + + * src/cff/cffobjs.c (cff_face_init): Ditto. + + * include/freetype/ftmodule.h (FT_Module_Class): Use `FT_Long' for + `module_size'. + * include/freetype/ftrender.h (FT_Glyph_Class_): Use `FT_Long' for + `glyph_size'. + + * src/base/ftobjs.c (FT_Render_Glyph): Change second parameter to + `FT_Render_Mode'. + (FT_Render_Glyph_Internal): Change third parameter to + `FT_Render_Mode'. + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Change second parameter + to `FT_Render_Mode'. + + * src/raster/ftrend1.c (ft_raster1_render): Change third parameter + to `FT_Render_Mode'. + * src/smooth/ftsmooth.c (ft_smooth_render, ft_smooth_render_lcd, + ft_smooth_render_lcd_v): Ditto. + (ft_smooth_render_generic): Change third and fifth parameter to + `FT_Render_Mode'. + + * include/freetype/freetype.h, include/freetype/internal/ftobjs.h, + include/freetype/ftglyph.h: Updated. + + * src/cff/cffdrivr.c (Load_Glyph), src/pcf/pcfdriver.c + (PCF_Glyph_Load), src/pfr/pfrobjs.c (pfr_slot_load), + src/winfonts/winfnt.c (FNT_Load_Glyph), src/t42/t42objs.c + (T42_GlyphSlot_Load), src/bdf/bdfdrivr.c (BDF_Glyph_Load): Change + fourth parameter to `FT_Int32'. + + * src/pfr/pfrobjs.c (pfr_face_init): Add two missing parameters + and declare them as unused. + + * src/cid/cidparse.h (CID_Parser): Use FT_Long for `postscript_len'. + + * src/psnames/psnames.h (PS_Unicode_Value_Func): Change return + value to FT_UInt32. + * src/psnames/psmodule.c (ps_unicode_value, ps_build_unicode_table): + Updated accordingly. + +2002-09-26 Wolfgang Domröse + + * src/cff/cffdrivr.c (Get_Kerning): Use FT_Long for `middle'. + (cff_get_glyph_name): Use cast for result of ft_strlen. + * src/cff/cffparse.c (cff_parse_real): User cast for assigning + `exp'. + * src/cff/cffload.c (cff_index_get_pointers): Use FT_ULong for + some local variables. + (cff_charset_load, cff_encoding_load): Use casts to FT_UInt for some + switch statements. + (cff_font_load): Use cast in call to CFF_Load_FD_Select. + * src/cff/cffobjs.c (cff_size_init): Use more casts. + (cff_face_init): Use FT_Int32 for `flags'. + * src/cff/cffgload.c (cff_operator_seac): Use cast for assigning + `adx' and `ady'. + (cff_decoder_parse_charstrings): Use FT_ULong for third parameter. + Use more casts. + * src/cff/cffcmap.c (cff_cmap_unicode_init): Use cast for `count'. + + * src/cid/cidload.c (cid_read_subrs): Use FT_ULong for `len'. + * src/cid/cidgload.c (cid_load_glyph): Add missing cast for + `cid_get_offset'. + + * src/psaux/t1decode.c (t1_decoder_parse_charstrings) <18>: Use + cast for `num_points'. + (t1_decoder_init): Use cast for assigning `decoder->num_glyphs'. + + * src/base/ftdebug.c (ft_debug_init): Use FT_Int. + * include/freetype/internal/ftdriver.h (FT_Slot_LoadFunc): Use + `FT_Int32' for fourth parameter. + * src/base/ftobjs.c (open_face): Use cast for calling + clazz->init_face. + + * src/raster/ftraster.c (Set_High_Precision): Use `1' instead of + `1L'. + (Finalize_Profile_Table, Line_Up, ft_black_init): Use casts. + * src/raster/ftrend1.c (ft_raster1_render): Ditto. + + * src/sfnt/sfnt_dir_check: Compare `magic' with unsigned long + constant. + +2002-09-26 Detlef Würkner + + * builds/amiga/include/freetype/config/ftmodule.h: Updated. + +2002-09-25 David Turner + + * src/autohint/ahtypes.h (AH_HINT_METRICS): Disabling metrics + hinting in the auto-hinter. This produces much better anti-aliased + text. + + * docs/CHANGES: Updating the changes documentation. + +2002-09-25 Anthony Fok + + * src/sfnt/ttcmap0.c (tt_cmap4_validate, tt_cmap4_char_index, + tt_cmap4_char_next): Added support for opens___.ttf (it contains a + charmap that uses offset=0xFFFFU instead of 0x0000 to indicate a + missing glyph). + +2002-09-21 Wolfgang Domröse + + * src/truetype/ttdriver.c (Load_Glyph): Fourth parameter must be + FT_Int32. + * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph): + Ditto. + +2002-09-19 Wolfgang Domröse + + More 16bit fixes. + + * src/autohint/ahglobal.c (sort_values): Use FT_Pos for `swap'. + (ah_hinter_compute_widths): Use FT_Pos for `dist'. + Use AH_MAX_WIDTHS. + * src/autohint/ahglyph.c (ah_outline_scale_blue_edges): Use FT_Pos + for `delta'. + (ah_outline_compute_edges): Replace some ints with FT_Int and + FT_Pos. + (ah_test_extrema): Clean up code. + (ah_get_orientation): Use 4 FT_Int variables instead of FT_BBox to + hold indices. + * src/autohint/ahtypes.h (AH_SegmentRec): Change type of `score' + to FT_Pos. + +2002-09-19 Werner Lemberg + + * builds/unix/config.guess, builds/unix/config.sub: Updated to + recent versions. + +2002-09-18 David Turner + + * src/base/ftobjs.c (FT_Library_Version): Bugfix. + + * FreeType 2.1.3rc2 (release candidate 2) is released! + +2002-09-17 David Turner + + * include/freetype/freetype.h, include/freetype/ftimage.h, + include/freetype/ftstroker.h, include/freetype/ftsysio.h, + include/freetype/ftsysmem.h, include/freetype/ttnameid.h: Updating + the in-source documentation. + + * src/tools/docmaker/tohtml.py: Updating the HTML formatter in the + DocMaker tool. + + * src/tools/docmaker.py: Removed. + +2002-09-17 Werner Lemberg + + More 16bit fixes. + + * src/psaux/psobjs.c (reallocate_t1_table): Use FT_Long for + second parameter. + +2002-09-16 Werner Lemberg + + 16bit fixes from Wolfgang Domröse. + + * src/type1/t1parse.h (T1_ParserRec): Change type of `base_len' + and `private_len' to FT_Long. + * src/type1/t1parse.c (T1_Get_Private_Dict): Remove cast for + `private_len'. + * src/type1/t1load.c: Use FT_Int cast for most calls of T1_ToInt. + Use FT_PtrDist where appropriate. + (parse_encoding): Use FT_Long for `count' and `n'. + (read_binary_data): Use FT_Long* for second parameter. + * src/type1/t1afm.c (afm_atoindex): Use FT_PtrDist. + + * src/cache/ftcsbits.c (ftc_sbit_node_load): Remove unused label. + * src/pshinter/pshalgo3.c (psh3_hint_align): Remove unused variable. + +2002-09-14 Werner Lemberg + + Making ftgrays.c compile stand-alone again. + + * include/freetype/ftimage.h: Include ft2build.h only if _STANDALONE_ + isn't defined. + * src/smooth/ftgrays.c [_STANDALONE_]: Define ft_memset, + FT_BEGIN_HEADER, FT_END_HEADER. + (FT_MEM_ZERO): Define. + (TRaster) [GRAYS_USE_GAMMA]: Use `unsigned char' instead of FT_Byte. + (gray_render_span, gray_init_gamma): Don't use `FT_UInt'. + Don't cast with `FT_Byte'. + (grays_init_gamma): Don't use `FT_UInt'. + +2002-09-14 Werner Lemberg + + * src/base/ftinit.c (FT_Add_Default_Modules): Improve error message. + * src/pcf/pcfdriver.c (PCF_Face_Done): Improve tracing message. + * include/freetype/config/ftoption.h (FT_MAX_MODULES): Increased + to 32. + +2002-09-10 Werner Lemberg + + * builds/unix/configure.ac (version_info): Set to 9:2:3. + * builds/unix/configure: Regenerated. + * docs/VERSION.DLL: Updated. + +2002-09-09 David Turner + + * src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points), + src/pshinter/pshalgo3.c (psh3_glyph_find_strong_points): Adding fix + to prevent seg fault when hints are provided in an empty glyph. + + * src/cache/ftccache.i (GEN_CACHE_LOOKUP) [FT_DEBUG_LEVEL_ERROR]: + Removed conditional code. This fixes a bug that prevented + compilation in debug mode of template instantiation. + + * include/freetype/ftimage.h: Removed incorrect `zft_' definitions + and updated constants documentation comments. + + * src/cff/cffparse.c (cff_parser_run): Fixed the CFF table loader. + It didn't accept empty arrays, and this prevented the loading of + certain fonts. + + * include/freetype/freetype.h (FT_FaceRec): Updating documentation + comment. The `descender' value is always *negative*, not positive. + +2002-09-09 Owen Taylor + + * src/pcf/pcfdriver.c (PCF_Glyph_Load): Fixing incorrect computation + of bitmap metrics. + +2002-09-08 David Turner + + Various updates to correctly support sub-pixel rendering. + + * include/freetype/config/ftmodule.h: Add two renderers for LCD. + + * src/base/ftobjs.c (FT_Load_Glyph): Updated. + + * src/smooth/ftsmooth.c (ft_smooth_render_lcd, + ft_smooth_render_lcd_v): Set FT_PIXEL_MODE_LCD and + FT_PIXEL_MODE_LCD_V, respectively. + + * include/freetype/cache/ftcimage.h (FTC_ImageTypeRec): New + structure. + Updated all users. + (FTC_ImageDesc): Removed. + (FTC_ImageCache_Lookup): Second parameter is now of type + `FTC_ImageType'. + Updated all users. + (FTC_IMAGE_DESC_COMPARE): Updated and renamed to... + (FTC_IMAGE_TYPE_COMPARE): This. + (FTC_IMAGE_DESC_HASH): Updated and renamed to... + (FTC_IMAGE_TYPE_HASH): This. + + * include/freetype/cache/ftcsbits.h (FTC_SBitRec): Field `num_grays' + replaced with `max_grays'. + `pitch' is now FT_Short. + (FTC_SBitCache_Lookup): Second parameter is now of type + `FTC_ImageType'. + Updated all users. + + * src/cache/ftcimage.c (FTC_ImageQueryRec, FTC_ImageFamilyRec): + Updated. + (ftc_image_node_init): Updated. + Moved code to convert type flags to load flags to... + (FTC_Image_Cache_Lookup): This function. + (ftc_image_family_init): Updated. + + * src/cache/ftcsbit.c (FTC_SBitQueryRec, FTC_SBitFamilyRec): + Updated. + (ftc_sbit_node_load): Updated. + Moved code to convert type flags to load flags to... + (FTC_SBitCache_Lookup): This function. + + * src/autohint/ahtypes.h (AH_HinterRec): Replace `no_*_hints' with + `do_*_snapping'. + Update all users (with negation). + * src/autohint/ahhint.c (ah_compute_stem_width): Fix threshold for + `dist' for `delta' < 40. + + * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Replace `no_*_hints' with + `do_*_snapping'. + Update all users (with negation). + * src/pshinter/pshalgo3.c (psh3_dimension_quantize_len): New + function. + (psh3_hint_align): Use it. + Improve hinting code. + [STRONGER]: Removed. + (STRONGER): Removed. + + * include/freetype/freetype.h (FT_Set_Hint_Flags, FT_HINT_*): + Removed. + +2002-09-05 Werner Lemberg + + * src/cid/cidobjs.c (CID_Size_Init): Renamed to... + (cid_size_init): This. + * src/psaux/psobjs.c (T1_Builder_Add_Point1): Renamed to... + (t1_builder_add_point1): This. + + Updated all affected code. + + * src/pshinter/pshalgo3.c (psh3_hint_align): Fix compiler warnings. + * src/type1/t1gload.c (T1_Compute_Max_Advance): Ditto. + +2002-09-04 David Turner + + * include/freetype/freetype.h: Corrected the definition of + ft_encoding_symbol to be FT_ENCODING_MS_SYMBOL (instead of + the erroneous FT_ENCODING_SYMBOL). + + * builds/unix/unix-def.in (datadir): Initialize it (thanks to + Anthony Fok). + +2002-08-29 David Turner + + Slight modification to the Postscript hinter to slightly increase + the contrast of smooth hinting. This is very similar to what the + auto-hinter does when it comes to stem width computations. However, + it produces better results with well-hinted fonts. + + * include/freetype/internal/psaux.h (T1_Decoder_FuncsRec): Add hint + mode to `init' member function. + (T1_DecoderRec): Add hint mode. + * include/freetype/internal/pshints (T1_Hints_ApplyFunc, + T2_Hints_ApplyFunc): Pass `hint_mode', not `hint_flags'. + * src/psaux/t1decode.c (t1_decoder_init): Add hint mode argument. + * src/pshinter/pshalgo1.c (ps1_hints_apply): Pass hint mode, not + hint flags. + * src/pshinter/pshalgo2.c (ps2_hints_apply): Ditto. + * src/pshinter/pshalgo3.c (ps3_hints_apply): Ditto. + (STRONGER): New macro. + (psh3_hint_align, psh3_hint_table_align_hints): Pass `glyph' instead + of `hint_flags'. + Implement announced changes. + * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Add flags to control + vertical and horizontal hints and snapping. + + * README, docs/CHANGES: Updating for the 2.1.3 release. + +2002-08-27 David Turner + + * Massive re-formatting changes to many, many source files. I don't + want to list them all here. The operations performed were all + logical transformations of the sources: + + - trying to convert all enums and constants to CAPITALIZED_STYLE, + #with define definitions like + + #define my_old_constants MY_NEW_CONSTANT + + - big, big update of the documentation comments + + * include/freetype/freetype.h, src/base/ftobjs.c, + src/smooth/ftsmooth.c, include/freetype/ftimage.h: Adding support + for LCD-optimized rendering though the new constants/enums: + + FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V + FT_PIXEL_MODE_LCD, FT_PIXEL_MODE_LCD_V + + This is still work in progress, don't expect everything to work + correctly though most of the features have been implemented. + + * Adding new FT_LOAD_XXX flags, used to specify both hinting and + rendering targets: + + FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering + FT_LOAD_TARGET_MONO :: monochrome bitmaps + FT_LOAD_TARGET_LCD :: horizontal RGB/BGR decimated + hinting & rendering + FT_LOAD_TARGET_LCD_V :: vertical RGB/BGR decimated + hinting & rendering + + Note that FT_LOAD_TARGET_NORMAL is 0, which means that the default + behaviour of the font engine is _unchanged_. + + * include/freetype/ftimage.h + (FT_Outline_{Move,Line,Conic,Cubic}To_Func): Renamed to... + (FT_Outline_{Move,Line,Conic,Cubic}ToFunc): This. + (FT_Raster_Span_Func): Renamed to ... + (FT_SpanFunc): This. + (FT_Raster_{New,Done,Reset,Set_Mode,Render}_Func): Renamed to ... + (FT_Raster_{New,Done,Reset,SetMode,Render}Func}: This. + + Updated all affected code. + + * include/freetype/ftrender.h + (FT_Glyph_{Init,Done,Transform,BBox,Copy,Prepare}_Func): Renamed + to ... + (FT_Glyph_{Init,Done,Transform,GetBBox,Copy,Prepare}Func): This. + (FTRenderer_{render,transform,getCBox,setMode}): Renamed to ... + (FT_Renderer_{RenderFunc,TransformFunc,GetCBoxFunc,SeteModeFunc}): + This. + + Updated all affected code. + + * src/autohint/ahtypes.h (AH_Point, AH_Segment, AH_Edge, AH_Globals, + AH_Face_Globals, AH_Outline, AH_Hinter): These typedefs are now + pointers to the corresponding `*Rec' structures. All source files + have been updated accordingly. + + * src/cff/cffgload.c (cff_decoder_init): Add hint mode as parameter. + * src/cff/cffgload.h (CFF_Decoder): Add `hint_mode' element. + + * src/cid/cidgload.c (CID_Compute_Max_Advance): Renamed to... + (cid_face_compute_max_advance): This. + (CID_Load_Glyph): Renamed to... + (cid_slot_load_glyph): This. + * src/cid/cidload.c (CID_Open_Face): Renamed to... + (cid_face_open): This. + * src/cid/cidobjs.c (CID_GlyphSlot_{Done,Init}): Renamed to... + (cid_slot_{done,init}): This. + (CID_Size_{Get_Globals_Funcs,Done,Reset): Renamed to... + (cid_size_{get_globals_funcs,done,reset): This. + (CID_Face_{Done,Init}): Renamed to... + (cid_face_{done,init}): This. + (CID_Driver_{Done,Init}: Renamed to... + (cid_driver_{done,init}: This. + * src/cid/cidparse.c (CID_{New,Done}_Parser): Renamed to... + (cid_parser_{new,done}): This. + * src/cid/cidparse.h (CID_Skip_{Spaces,Alpha}): Renamed to... + (cid_parser_skip_{spaces,alpha}): This. + (CID_To{Int,Fixed,CoordArray,FixedArray,Token,TokenArray}): Renamed + to... + (cid_parser_to_{int,fixed,coord_array,fixed_array,token,token_array}): + This. + (CID_Load_{Field,Field_Table): Renamed to... + (cid_parser_load_{field,field_table}): This. + * src/cid/cidriver.c (CID_Get_Interface): Renamed to... + (cid_get_interface): This. + + Updated all affected code. + + * src/psaux/psobjs.c (PS_Table_*): Renamed to... + (ps_table_*): This. + (T1_Builder_*): Renamed to... + (t1_builder_*): This. + * src/psaux/t1decode.c (T1_Decoder_*): Renamed to... + (t1_decoder_*): This. + + * src/psnames/psmodule.c (PS_*): Renamed to... + (ps_*): This. + + Updated all affected code. + + * src/sfnt/sfdriver (SFNT_Get_Interface): Renamed to... + (sfnt_get_interface): This. + * src/sfnt/sfobjs.c (SFNT_*): Renamed to... + (sfnt_*): This. + * src/sfnt/ttcmap.c (TT_CharMap_{Load,Free}): Renamed to... + (tt_face_{load,free}_charmap): This. + * src/sfnt/ttcmap0.c (TT_Build_CMaps): Renamed to... + (tt_face_build_cmaps): This. + * src/sfnt/ttload.c (TT_*): Renamed to... + (tt_face_*): This. + * src/sfnt/ttpost.c (TT_Post_Default_Names): Renamed to... + (tt_post_default_names): This. + (Load_*): Renamed to... + (load_*): This. + (TT_*): Renamed to... + (tt_face_*): This. + * src/sfnt/ttsbit.c (TT_*): Renamed to... + (tt_face_*): This. + ({Find,Load,Crop}_*): Renamed to... + ({find,load,crop}_*): This. + + Updated all affected code. + + * src/smooth/ftsmooth.c (ft_smooth_render): Renamed to... + (ft_smooth_render_generic): This. + Make function more generic by adding vertical and horizontal scaling + factors. + (ft_smooth_render, ft_smooth_render_lcd, ft_smooth_render_lcd_v): + New functions. + + (ft_smooth_locd_renderer_class, ft_smooth_lcdv_renderer_class): New + classes. + + * src/truetype/ttobjs.c (TT_{Done,New}_GlyphZone): Renamed to... + (tt_glyphzone_{done,new}): This. + (TT_{Face,Size,Driver}_*): Renamed to... + (tt_{face,size,driver}_*): This. + * src/truetype/ttpload.c (TT_Load_Locations): Renamed to... + (tt_face_load_loca): This. + (TT_Load_Programs): Renamed to... + (tt_face_load_fpgm): This. + (TT_*): Renamed to... + (tt_face_*): This. + +2002-08-27 Werner Lemberg + + * docs/VERSION.DLL: New file. + +2002-08-23 Graham Asher + + * src/cff/cffgload.c (cff_operator_seac) + [FT_CONFIG_OPTION_INCREMENTAL]: Incremental fonts (actually not + incremental in the case of CFF but just using callbacks to get glyph + recipes) pass the character code, not the glyph index, to the + get_glyph_data function; they have no valid charset table. + + * src/cff/cffload.c (cff_font_load): Removed special cases for + FT_CONFIG_OPTION_INCREMENTAL, which are no longer necessary; CFF + fonts provided via the incremental interface now have to conform + more closely to the CFF font format. + + * src/cff/cffload.h (cff_font_load): Removed argument now unneeded. + + * src/cff/cffobjs.c (cff_face_init): Changed call to cff_font_load + to conform with new signature. + +2002-08-22 David Turner + + * src/base/ftobject.c, src/base/ftsynth.c, src/base/ftstroker.c, + src/bdf/bdfdrivr.c: Removed compiler warnings. + +2002-08-21 Werner Lemberg + + * src/pshinter/pshalgo3.c (psh3_glyph_compute_inflections, + psh3_glyph_compute_extrema, psh3_hint_table_find_strong_point): Fix + compiler warnings and resolve shadowing of local variables. + +2002-08-21 David Turner + + The automatic and Postscript hinter now automatically detect + inflection points in glyph outlines and treats them specially. This + is very useful to prevent nasty effect like the disappearing + diagonals of `S' and `s' in many, many fonts. + + * src/autohint/ahtypes.h (ah_flag_inflection): New macro. + * src/autohint/ahangles.c (ah_angle_diff): New function. + * src/autohint/ahangles.h: Updated. + * src/autohint/ahglyph.c (ah_outline_compute_inflections): New + function. + (ah_outline_detect_features): Use it. + * src/autohint/ahhint.c (ah_hinter_align_strong_points) + [!AH_OPTION_NO_WEAK_INTERPOLATION]: Handle inflection. + + * src/tools/docmaker/docmaker.py, src/tools/docmaker/utils.py, + src/tools/docmaker/tohtml.py: Updating the DocMaker tool. + + * include/freetype/freetype.h: Changing the type of the `load_flags' + parameter from `FT_Int' to `FT_Int32', this in order to support more + options. This should only break binary and/or source compatibility + on 16-bit platforms (Atari?). + (FT_LOAD_NO_AUTOHINT): New macro. + + * src/base/ftobjs.c (FT_Load_Glyph): Updated. + Handle FT_LOAD_NO_AUTOHINT. + (FT_Load_Char): Updated. + + * src/pshinter/pshalgo3.c, src/base/ftobjs.c, src/base/ftobject.c, + src/autohint/ahglyph.c, include/freetype/freetype.h: Fixing typos + and removing compiler warnings. + +2002-08-20 Werner Lemberg + + * src/truetype/ttgload.c (TT_Get_Metrics): Add guard for k = 0. + +2002-08-20 David Turner + + * src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c, + src/pshinter/pshglob.c, src/pshinter/pshrec.c, + src/autohint/ahmodule.c [DEBUG_HINTER]: Removing compiler warnings + (only used in development builds anyway). + + Improve support of local extrema and stem edge points. + + * src/pshinter/pshalgo3.h (PSH3_Hint_TableRec): Use PSH3_ZoneRec + for `zones'. + (PSH3_DIR_UP, PSH3_DIR_DOWN): Exchange values. + (PSH3_DIR_HORIZONTAL, PSH3_DIR_VERTICAL): New macros. + (PSH3_DIR_COMPARE, PSH3_DIR_IS_HORIZONTAL, PSH3_IS_VERTICAL): New + macros. + (PSH3_POINT_INFLEX): New enum. + (psh3_point_{is,set}_{off,inflex}): New macros. + (PSH3_POINT_{EXTREMUM,POSITIVE,NEGATIVE,EDGE_MIN,EDGE_MAX): New + enum values. + (psh3_point_{is,set}_{extremum,positive,negative,edge_min,edge_max}): + New macros. + (PSH3_PointRec): New members `flags2' and `org_v'. + (PSH3_POINT_EQUAL_ARG, PSH3_POINT_ANGLE): New macros. + + * src/pshinter/pshalgo3.c [DEBUG_HINTER]: Removing compiler + warnings. + (COMPUTE_INFLEXS): New macro. + (psh3_hint_align): Simplify some basic arithmetic computations. + (psh3_point_is_extremum): Removed. + (psh3_glyph_compute_inflections) [COMPUTE_INFLEXS]: New function. + (psh3_glyph_init) [COMPUTE_INFLEXS]: Use it. + (psh3_glyph_compute_extrema): New function. + (PSH3_STRONG_THRESHOLD): Increased to 30. + (psh3_hint_table_find_strong_point): Improved. + (psh3_glyph_find_strong_points, + psh3_glyph_interpolate_strong_points): Updated. + (psh3_hints_apply): Use psh3_glyph_compute_extrema. + + * test/gview.c (draw_ps3_hint, ps3_draw_control_points): New + functions. + Other small updates. + + * Jamfile: Small updates. + +2002-08-18 Arkadiusz Miskiewicz + + * builds/unix/install.mk (install, uninstall): Add $(DESTDIR) to + make life easier for package maintainers. + +2002-08-18 Werner Lemberg + + * src/pcf/pcfdriver.c (PCF_Glyph_Load): Fix computation of + horiBearingX. + * src/bdf/bdfdrivr.c (BDF_GlyphLoad): Fix computation of + horiBearingY. + +2002-08-16 George Williams + + Add support for Apple composite glyphs. + + * include/freetype/config/ftoption.h + (TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED): New macro. + + * src/truetype/ttgload.c (OVERLAP_COMPOUND, SCALED_COMPONENT_OFFSET, + UNSCALED_COMPONENT_OFFSET): New macros for additional OpenType + glyph loading flags. + (load_truetype_glyph): Implement it. + +2002-08-16 Werner Lemberg + + * src/cff/cffgload.c (cff_free_glyph_data), + src/cff/cffload.c (cff_font_load): Use FT_UNUSED. + +2002-08-15 Werner Lemberg + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Initialize `error'. + * src/sfnt/sfobjs.c (SFNT_Load_Face): Fix compiler warning. + +2002-08-15 Graham Asher + + Implemented the incremental font loading system for the CFF driver. + Tested using the GhostScript-to-FreeType bridge (under development). + + * src/cff/cffgload.c (cff_get_glyph_data, cff_free_glyph_data): New + functions. + (cff_operator_seac, cff_compute_max_advance, cff_slot_load): Use + them. + * src/cff/cffload.c (cff_font_load): Add `face' parameter. + Load charset and encoding only if there are glyphs. + [FT_CONFIG_OPTION_INCREMENTAL]: Incremental fonts don't need + character recipes. + * src/cff/cffload.h, src/cff/cffobjs.c: Updated. + + * src/cid/cidgload.c (cid_load_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Corrected the incremental font + loading implementation to use the new system introduced on + 2002-08-01. + +2002-08-06 Werner Lemberg + + * src/cff/cffcmap.c: Remove compiler warnings. + * src/cache/ftccache.c, src/cache/ftccache.i, + src/pfr/pfrload.c, src/pfr/pfrgload.c: s/index/idx/. + * src/cff/cffload.c: s/select/fdselect/. + * src/raster/ftraster.c: s/wait/waiting/. + +2002-08-01 Graham Asher + + * src/type1/t1load.c (T1_Open_Face): Tolerate a face with no + charstrings if there is an incremental loading interface. Type 1 + faces supplied by PostScript interpreters like GhostScript will + typically not provide any charstrings at load time, so this is + essential if they are to work. + +2002-08-01 Graham Asher + + Modified incremental loading interface to be closer to David's + preferences. The header freetype.h is not now affected, the + interface is specified via an FT_Parameter, the pointer to the + interface is hidden in an internal part of the face record, and all + the definitions are in ftincrem.h. + + * include/freetype/freetype.h [FT_CONFIG_OPTION_INCREMENTAL]: + Removed. + * include/freetype/internal/ftobjs.h [FT_CONFIG_OPTION_INCREMENTAL]: + Include FT_INCREMENTAL_H. + (FT_Face_InternalRec) [FT_CONFIG_OPTION_INCREMENTAL]: Add + `incremental_interface'. + + * src/base/ftobjs.c (open_face, FT_Open_Face) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + * src/sfnt/sfobjs.c (SFNT_Load_Face) [FT_CONFIG_OPTION_INCREMENTAL]: + Updated. + + * src/truetype/ttgload.c (load_truetype_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + Free loaded glyph data properly. + (compute_glyph_metrics, TT_Load_Glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + * src/truetype/ttobjs.c (TT_Face_Init) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + + * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String) + [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + (T1_Parse_Glyph) [FT_CONFIG_OPTION_INCREMENTAL]: Updated. + Free loaded glyph data properly. + (T1_Load_Glyph): Updated. + [FT_CONFIG_OPTION_INCREMENTAL]: Free loaded glyph data properly. + +2002-07-30 David Turner + + * include/freetype/ftincrem.h: Adding new experimental header file + to demonstrate a `cleaner' API to support incremental font loading. + + * include/freetype/config/ftheader.h (FT_INCREMENTAL_H): New macro. + + * src/tools/docmaker/*: Adding new (more advanced) version of + the DocMaker tool, using Python's sophisticated regexps. + +2002-07-28 Werner Lemberg + + s/ft_memset/FT_MEM_SET/. + s/FT_MEM_SET/FT_MEM_ZERO/ where appropriate. + +2002-07-27 Werner Lemberg + + * src/sfnt/ttload.c (sfnt_dir_check): Make it work with TTCs. + +2002-07-26 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: s/memset/ft_memset/. + + * src/autohint/ahhint.c (ah_hint_edges_3): Fix compiler warning. + * src/cff/cffload.c (cff_encoding_load): Remove `memory' variable. + * src/cff/cffcmap.c (cff_cmap_encoding_init): Remove `psnames' + variable. + * src/truetype/ttgload.c (load_truetype_glyph): Remove statement + without effect. + * src/truetype/ttdriver (Get_Char_Index, Get_Next_Char): Removed. + + * src/pshinter/pshalgo3.c (psh3_hint_table_record, + psh3_hint_table_init, psh3_hint_table_activate_mask): Fix error + message. + +2002-07-24 Graham Asher + + * src/truetype/ttobjs.c: Fix for bug reported by Sven Neumann + [sven@gimp.org] on the FreeType development forum: `If + FT_CONFIG_OPTION_INCREMENTAL is undefined (this is the default), the + TrueType loader crashes in line 852 of src/truetype/ttgload.c when + it tries to access face->glyph_locations.' + +2002-07-18 Graham Asher + + Added types and structures to support incremental typeface loading. + The FT_Incremental_Interface structure, defined in freetype.h, is + designed to be passed to FT_Open_Face to provide callback functions + to obtain glyph recipes and metrics, for fonts like those passed + from PostScript that do not necessarily provide all, or any, glyph + information, when first opened. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL): + New configuration macro to enable incremental face loading. By + default it is not defined. + + * include/freetype/freetype.h (FT_Basic_Glyph_Metrics, + FT_Get_Glyph_Data_Func, FT_Get_Glyph_Metrics_Func, + FT_Incremental_Interface_Funcs, FT_Incremental_Interface) + [FT_CONFIG_OPTION_INCREMENTAL]: New. + (FT_Open_Args, FT_FaceRec) [FT_CONFIG_OPTION_INCREMENTAL]: New field + `incremental_interface'. + (FT_Open_Flags) [FT_CONFIG_OPTION_INCREMENTAL]: New enum + `ft_open_incremental'. + + * include/freetype/fttypes.h: Include FT_CONFIG_CONFIG_H. + (FT_Data): New structure to represent binary data. + + * src/base/ftobjs.c (open_face) [FT_CONFIG_OPTION_INCREMENTAL]: + Add parameter for incremental loading. + (FT_Open_Face) [FT_CONFIG_OPTION_INCREMENTAL]: Use incremental + interface. + + * src/truetype/ttgload.c (load_truetype_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading system + for the TrueType driver. + (compute_glyph_metrics): Return FT_Error. + [FT_CONFIG_OPTION_INCREMENTAL]: Check for overriding metrics. + (TT_Load_Glyph) [FT_CONFIG_OPTION_INCREMENTAL]: Don't look for + the glyph table while handling an incremental font. + Get glyph offset. + + * src/truetype/ttobjs.c (TT_Face_Init) + [FT_CONFIG_OPTION_INCOREMENTAL]: Added the incremental loading + system for the TrueType driver. + + * src/cid/cidgload.c (cid_load_glyph) + [FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading system + for the CID driver. + + * src/sfnt/sfobjs.c (SFNT_Load_Face) [FT_CONFIG_OPTION_INCREMENTAL]: + Changes to support incremental Type 42 fonts: Assume a font has + glyphs if it has an incremental interface object. + + * src/type1/t1gload.c (T1_Parse_Glyph): Renamed to... + (T1_Parse_Glyph_And_Get_Char_String): This. + [FT_CONFIG_OPTION_INCREMENTAL]: Added support for incrementally + loaded Type 1 faces. + (T1_Parse_Glyph): New function. + (T1_Load_Glyph): Updated. + +2002-07-17 David Turner + + Cleaning up the cache sub-system code; linear hashing is now the + default. + + * include/freetype/cache/ftccache.h, src/cache/ftccache.i, + src/cache/ftccache.c [!FTC_CACHE_USE_LINEAR_HASHING]: Removed. + (FTC_CACHE_USE_LINEAR_HASHING: Removed also. + + FT_CONFIG_OPTION_USE_CMAPS is now the default. + + * include/freetype/internal/ftdriver.h (FT_Driver_ClassRec): Remove + `get_char_index' and `get_next_char'. + + * include/freetype/config/ftoption.h, + include/freetype/internal/tttypes.h, src/base/ftobjs.c, + src/bdf/bdfdrivr.c, src/cff/cffobjs.c, src/pcf/pcfdrivr.c, + src/pfr/pfrdrivr.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c, + src/sfnt/ttcmap0.h, src/sfnt/ttload.c, src/type1/t1objs.c, + src/type42/t42objs.c, src/winfonts/winfnt.c + [!FT_CONFIG_OPTION_USE_CMAPS]: Removed. The new cmap code is now + the default. + + * src/type42/t42objs.c (T42_CMap_CharIndex, T42_CMap_CharNext): + Removed. + * src/type42/t42objs.h: Updated. + + * src/cid/cidriver.c (Cid_Get_Char_Index, Cid_Get_Next_Char): + Removed. + (t1_cid_driver_class): Updated. + * src/truetype/ttdriver.c (tt_driver_class): Updated. + * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Removed + (t1_driver_class): Updated. + * src/type42/t42drivr.c (t42_driver_class): Updated. + + * src/base/ftobjs.c (open_face): Select Unicode cmap by default. + + * src/sfnt/ttload.c (TT_Load_SFNT_Header): Fixed a recent bug that + prevented OpenType fonts to be recognized by FreeType. + +2002-07-11 David Turner + + Changing the SFNT loader to check for SFNT-based font files + differently. We now ignore the range `helper' fields and check the + `head' table's magic number instead. + + * include/freetype/internal/tttypes.h (SFNT_HeaderRec): Add `offset' + field. + + * src/sfnt/ttload.c (sfnt_dir_check): New function. + (TT_Load_SFNT_HeaderRec): Renamed to... + (TT_Load_SFNT_Header): This. + Implement new functionality. + * src/sfnt/ttload.h: Updated. + * src/sfnt/sfdriver.c (sfnt_interface): Updated. + + * src/base/ftobject.c, src/base/fthash.c: Updated object sub-system + and dynamic hash table implementation (still experimental, don't + use). + * include/freetype/internal/fthash.h: Updated. + * include/freetype/internal/ftobjs.h (FT_LibraryRec): New member + `meta_class'. + + Fixing a bug in the Type 1 loader that prevented valid font bounding + boxes to be loaded from multiple master fonts. + + * include/freetype/t1tables.h (PS_BlendRec): Add `bboxes' field. + + * include/freetype/internal/psaux.h (T1_FieldType): Add + `T1_FIELD_TYPE_BBOX'. + (T1_FieldLocation): Add `T1_FIELD_LOCATION_BBOX'. + (T1_FIELD_BBOX): New macro. + + * src/psaux/psobjs.c (PS_Parser_LoadField): Handle T1_FIELD_TYPE_BBOX. + * src/type1/t1load.c (t1_allocate_blend): Create blend->bboxes. + (T1_Done_Blend): Free blend->bboxes. + (t1_load_keyword): Handle T1_FIELD_LOCATION_BBOX. + (parse_font_bbox): Commented out. + (t1_keywords): Comment out `parse_font_bbox'. + * src/type1/t1tokens.h: Define `FontBBox' field. + +2002-07-10 David Turner + + * src/cff/cffobjs.c: Small fix to select the Unicode charmap by + default when needed. + Small fix to allow OpenType fonts to support Adobe charmaps when + needed. + + * src/cff/cffcmap.c, src/cff/cffcmap.h: New files to support + charmaps for CFF fonts. + + * src/cff/cff.c, src/cff/Jamfile, src/cff/rules.mk: Updated. + + * include/freetype/internal/cfftypes.h (CFF_EncodingRec): Use + fixed-length arrays for `sids' and `codes'. Add `count' member. + (CFF_FontRec): Add `psnames' member. + + * src/cff/cffdrivr.c, src/cff/cffload.c, src/cff/cffload.h, + src/cff/cffobjs.c, src/cff/cffobjs.h, src/cff/cffparse.c, + src/cffparse.h, src/cff/cffgload.c, src/cff/cffgload.h: Adding + support for CFF charmaps, reformatting the sources, and removing + some bugs in the Encoding and Charset loaders. + Many fonts renamed to use lowercase only: + + CFF_Builder_Init -> cff_builder_init + CFF_Builder_Done -> cff_builder_done + CFF_Init_Decoder -> cff_decoder_init + CFF_Parse_CharStrings -> cff_decoder_parse_charstrings + CFF_Load_Glyph -> cff_slot_load + CFF_Init_Decoder -> cff_decoder_init + CFF_Prepare_Decoder -> cff_decoder_prepare + CFF_Get_Standard_Encoding -> cff_get_standard_encoding + CFF_Access_Element -> cff_index_access_element + CFF_Forget_Element -> cff_index_forget_element + CFF_Get_Name -> cff_index_get_name + CFF_Get_String -> cff_index_get_sid_string + CFF_Get_FD -> cff_fd_select_get + CFF_Done_Charset -> cff_charset_done + CFF_Load_Charset -> cff_charset_load + CFF_Done_Encoding -> cff_encoding_done + CFF_Load_Encoding -> cff_encoding_load + CFF_Done_SubFont -> cff_subfont_done + CFF_Load_Font -> cff_font_load + CFF_Done_Font -> cff_font_done + CFF_Size_Get_Global_Funcs -> cff_size_get_global_funcs + CFF_Size_Done -> cff_size_done + CFF_Size_Init -> cff_size_init + CFF_Size_Reset -> cff_size_reset + CFF_GlyphSlot_Done -> cff_slot_done + CFF_GlyphSlot_Init -> cff_slot_init + CFF_StrCopy -> cff_strcpy + CFF_Face_Init -> cff_face_init + CFF_Face_Done -> cff_face_done + CFF_Driver_Init -> cff_driver_init + CFF_Driver_Done -> cff_driver_done + CFF_Parser_Init -> cff_parser_init + CFF_Parser_Run -> cff_parser_run + + add_point -> cff_builder_add_point + add_point1 -> cff_builder_add_point1 + add_contour -> cff_builder_add_contour + close_contour -> cff_builder_close_contour + cff_explicit_index -> cff_index_get_pointers + +2002-07-09 Owen Taylor + + * src/pshinter/pshglob.c (psh_globals_new): Fixed a bug that + prevented the hinter from using correct standard width and height + values, resulting in hinting bugs with certain fonts (e.g. Utopia). + +2002-07-07 David Turner + + * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Added code to return + successfully when the function is called with a bitmap glyph (the + previous code simply returned with an error). + + * docs/DEBUG.TXT: Adding debugging support documentation. + + * src/base/ftdebug.c (ft_debug_init), builds/win32/ftdebug.c + (ft_debug_init), builds/amiga/src/ftdebug.c (ft_debug_init): Changed + the syntax of the FT2_DEBUG environment variable used to control + debugging output (i.e. logging and error messages). It must now + look like: + + any:6 memory:4 io:3 or + any:6,memory:4,io:3 or + any:6;memory:4;io:3 + +2002-07-07 Owen Taylor + + * src/pshinter/pshglob.c (psh_blues_snap_stem): Adding support for + blue fuzz. + * src/pshinter/pshglob.h (PSH_BluesRec): Add `blue_fuzz' field. + * src/type1/t1load.c (T1_Open_Face): Initialize `blue_fuzz'. + + Adding support for hinter-specific bit flags, and the new + FT_Set_Hint_Flags high-level API. + + * include/freetype/freetype.h (FT_Set_Hint_Flags): New function. + (FT_HINT_NO_INTEGER_STEM, FT_HINT_NO_HSTEM_ALIGN, + FT_HINT_NO_VSTEM_ALIGN): New macros. + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Add + `hint_flags' member. + + * src/base/ftobjs.c (FT_Set_Hint_Flags): New function. + + * include/freetype/internal/psaux.h (T1_DecoderRec): Add `hint_flags' + member. + + * include/freetype/internal/pshints.h (T1_Hints_ApplyFunc, + T2_Hints_ApplyFunc): Add parameter to pass hint flags. + + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings, + T1_Decoder_Init): Use decoder->hint_flags. + * src/cff/cffgload.h (CFF_Builder): Add `hint_flags' field. + * src/cff/cffgload.c (CFF_Builder_Init): Set builder->hint_flags. + (CFF_Parse_CharStrings): Updated. + * src/pshinter/pshalgo1.c (ps1_hints_apply): Add parameter to handle + hint flags (unused). + * src/pshinter/pshalgo1.h: Updated. + * src/pshinter/pshalgo2.c (ps2_hints_apply): Add parameter to handle + hint flags (unused). + * src/pshinter/pshalgo2.h: Updated. + * src/pshinter/pshalgo3.c (ps3_hints_apply): Add parameter to handle + hint flags. + * src/pshinter/pshalgo3.h: Updated. + +2002-07-04 David Turner + + * src/pfr/pfrobjs.c (pfr_slot_load): Fixed a small bug that returned + incorrect advances when the outline resolution was different from + the metrics resolution. + + * src/autohint/ahhint.c: Removing compiler warnings. + + * src/autohint/ahglyph.c: s/FT_MEM_SET/FT_ZERO/ where appropriate. + (ah_outline_link_segments): Slight improvements to the serif + detection code. More work is needed though. + +2002-07-03 David Turner + + Small improvements to the automatic hinter. Uneven stem-widths have + now disappeared and everything looks much better, even if there are + still issues with serifed fonts. + + * src/autohint/ahtypes.h (AH_Globals): Added `stds' array. + * src/autohint/ahhint.c (OPTIM_STEM_SNAP): New #define. + (ah_snap_width): Commented out. + (ah_align_linked_edge): Renamed to... + (ah_compute_stem_width): This. + Don't allow uneven stem-widths. + (ah_align_linked_edge): New function. + (ah_align_serifed_edge): Don't strengthen serifs. + (ah_hint_edges_3, ah_hinter_scale_globals): Updated. + +2002-07-03 Owen Taylor + + Adding new algorithm based on Owen Taylor's recent work. + + * src/pshinter/pshalgo3.c, src/pshinter/pshalgo3.h: New files. + * src/pshinter/pshalgo.h: Updated. + Use pshalgo3 by default. + * src/pshinter/pshinter.c: Include pshalgo3.c. + + * src/pshinter/Jamfile, src/pshinter/rules.mk: Updated. + +2002-07-01 Owen Taylor + + * src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points): Fix a bug + where, if a glyph has more than hint mask, the second mask gets + applied to points that should have been covered by the first mask. + +2002-07-01 Keith Packard + + * src/sfnt/ttcmap0.c (tt_cmap8_char_next, tt_cmap12_char_next): + Fixing the cmap 8 and 12 parsing routines. + +2002-07-01 David Turner + + * src/base/ftsynth.c: Include FT_TRIGONOMETRY_H. + (FT_Outline_Embolden): Renamed to... + (FT_GlyphSlot_Embolden): This. + Updated to new trigonometric functions. + (FT_Outline_Oblique): Renamed to... + (FT_GlyphSlot_Oblique): This. + (ft_norm): Removed. + * include/freetype/ftsynth.h: Updated. + +2002-06-26 David Turner + + * include/freetype/internal/ftobject.h: Updating the object + sub-system definitions (still experimental). + + * src/base/fthash.c (ft_hash_remove): Fixing a small reallocation + bug. + + * src/base/fttrigon.c (FT_Vector_From_Polar, FT_Angle_Diff): New + functions. + * include/freetype/fttrigon.h: Updated. + + + Adding path stroker component (work in progress). + + * include/freetype/ftstroker.h, src/base/ftstroker.c: New files. + * src/base/Jamfile: Updated. + + * include/freetype/config/ftheader.h (FT_STROKER_H): New macro. + + + * src/truetype/ttgload.c (TT_Load_Composite_Glyph), + src/base/ftoutln.c (FT_Vector_Transform): Fixed Werner's latest fix. + FT_Vector_Transform wasn't buggy, the TrueType composite loader was. + +2002-06-24 Werner Lemberg + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3. + +2002-06-21 David Turner + + + * Version 2.1.2 released. + ========================= + + +2002-06-21 Roberto Alameda . + + * include/freetype/internal/t42types.h (T42_Font): Removed since + it is already in t42objs.h. + (T42_Face): Use T1_FontRec. + + * src/base/fttype1.c (FT_Get_PS_Font_Info): Updated. + (FT_Has_PS_Glyph_Names): Check for type42 driver name also. + * src/type42/t42objs.h: Include FT_INTERNAL_TYPE42_TYPES_H. + (T42_Face): Removed since it is already in t42types.h. + +2002-06-21 Detlef Würkner + + * src/pfrgload.c (pfr_glyph_load_compound): Fix loading of composite + glyphs. + +2002-06-21 Sven Neumann + + * src/prf/pfrtypes.h (PFR_KernPair): New structure. + (PFR_PhyFont): Use it. + (PFR_KernFlags): New enumeration. + * src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): New + function. + (pfr_phy_font_extra_items): Use it. + (pfr_phy_font_done): Updated. + * src/pfr/pfrobjs.c (pfr_face_init): Set kerning flag conditionally. + (pfr_face_get_kerning): New function. + * src/pfr/pfrobjs.h: Updated. + * src/pfr/pfrdrivr.c (pfr_driver_class): Updated. + +2002-06-21 David Turner + + * README, docs/CHANGES: Preparing the 2.1.2 release. + +2002-06-19 Detlef Würkner + + * src/base/fttype1.c: Include FT_INTERNAL_TYPE42_TYPES_H. + (t1_face_check_cast): Removed. + (FT_Get_PS_Font_Info): Make it work with CID and Type 42 drivers + also. + +2002-06-19 Sebastien BARRE + + * src/type42/t42parse.c (t42_parse_sfnts): Fix compiler warning. + +2002-06-19 Werner Lemberg + + * src/base/ftoutln.c (FT_Vector_Transform): Fix serious typo + (xy <-> yx). + * src/truetype/ttgload.c (load_truetype_glyph): Replace `|' with + `||' to make code easier to read. + +2002-06-18 Roberto Alameda . + + * src/type42/t42objs.c (t42_check_size_change): Removed. + (T42_Size_SetChars, T42_Size_SetPixels): Use FT_Activate_Size + instead. + (T42_GlyphSlot_Load): Remove call to t42_check_size_change. + +2002-06-18 Detlef Würkner + + * src/psaux/t1cmap.c (t1_cmap_custom_char_index, + t1_cmap_custom_char_next): Fix index computation -- indices start + with 0 and not with cmap->first. + + Provide default charmaps. + + * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c + (PCF_Face_Init), src/pfr/pfrobjs.c (pfr_face_init), + src/type1/t1objs (T1_Face_Init), src/winfonts/winfnt.c + (FNT_Face_Init): Implement it. + +2002-06-17 Sven Neumann + + * src/pfr/pfrobjs.c (pfr_face_init): Fix typo. + +2002-06-16 Leonard Rosenthol + + Updated Win32/VC++ projects to include the new PFR driver. + + * builds/win32/visualc/freetype.dsp: Updated. + +2002-06-16 Anthony Fok + + Install freetype2.m4. + + * builds/unix/install.mk (install, uninstall): Handle it. + +2002-06-16 Detlef Würkner + + Same fix for PFR driver. + + * src/pfr/pfrcmap.c (pfr_cmap_char_index, pfr_cmap_char_next): + Increase return value by 1. + * src/pfr/pfrobjs.c (pfr_slot_load): Decrease index by 1. + +2002-06-15 Detlef Würkner + + Fix glyph indices to make index zero always the undefined glyph. + + * src/bdf/bdfdrivr.c (bdf_cmap_init): Don't decrease + cmap->num_encodings. + (bdf_cmap_char_index, bdf_cmap_char_next, BDF_Get_Char_Index): + Increase result by 1 for normal cases. + (BDF_Glyph_Load): Decrease index by 1. + + * src/pcf/pcfdriver.c (pcf_cmap_char_index, pcf_cmap_char_next, + PCF_Char_Get_Index): Increase result by 1 for normal cases. + (PCF_Glyph_Load): Decrease index by 1. + * src/pcf/pcfread.c (pcf_get_encodings): Don't decrease j for + allocating `encoding'. + + * src/base/ftobjs.c (FT_Load_Glyph, FT_Get_Glyph_Name): Fix + bounding tests. + +2002-06-14 Detlef Würkner + + Add new cmap support to BDF driver. + + * src/bdf/bdfdrivr.c (BDF_CMapRec) [FT_CONFIG_OPTION_USE_CMAPS]: + New structure. + (bdf_cmap_init, bdf_cmap_done, bdf_cmap_char_index, + bdf_cmap_char_next) [FT_CONFIG_OPTION_USE_CMAPS]: New functions. + (BDF_Get_Char_Index) [!FT_CONFIG_OPTION_USE_CMAPS]: Use only + conditionally. + (BDF_Face_Init): Handle `AVERAGE_WIDTH' and `POINT_SIZE' keywords. + Implement new cmap handling. + (bdf_driver_class): Updated. + +2002-06-14 Werner Lemberg + + * Makefile, configure, */*.mk, builds/unix/unix-def.in, + docs/CHANGES, docs/INSTALL: s/TOP/TOP_DIR/. + +2002-06-12 Werner Lemberg + + * src/bdf/bdflib.c: s/FT_Short/short/ for consistency. + +2002-06-11 David Turner + + * builds/win32/ftdebug.c: Added a missing #endif. + + * src/sfnt/ttload.c, src/bdf/bdflib.c: Removing compiler warnings. + + Removed the bug in Type 42 driver that prevented un-hinted outlines + to be loaded. + + * src/type42/t42objs.c (T42_Face_Init): Call FT_Done_Size. + (T42_Size_Init): Call FT_Activate_Size. + (t42_check_size_change): New function. + (T42_Size_SetChars, T42_Size_SetPixels): Use it. + (ft_glyphslot_clear): Replace FT_MEM_SET with FT_ZERO. + (T42_GlyphSlot_Load): Use t42_check_size_change. + Initialize more fields of `glyph'. + + * builds/win32/visualc/freetype.dsp: Updated. + +2002-06-09 David Turner + + + * Version 2.1.1 released. + ========================= + + +2002-06-08 Juliusz Chroboczek + + * include/freetype/internal/ftobjs.h, src/autohint/ahglyph.c, + src/base/ftobjs.c, src/sfnt/ttcmap0.c, src/smooth/ftgrays.c: Don't + use `setjmp', `longjmp', and `jmp_buf' but `ft_setjmp', `ft_longjmp', + and `ft_jmp_buf'. + Removed direct references to and when + appropriate, to eventually replace them with a + FT_CONFIG_STANDARD_LIBRARY_H. Useful for the XFree86 Font Server + backend based on FT2. + + * src/base/fttype1.c (FT_Has_PS_Glyph_Names): Fix return value. + +2002-06-08 David Turner + + * src/pcf/pcfdriver.c (pcf_cmap_char_next): Fixed a bug that caused + the function to return invalid values. + + * src/cache/ftccache.i: Removing a typo that prevented + the source's compilation. + + * src/cache/ftccache.c (ftc_node_hash_unlink): Fixed a + bug that caused nasty memory overwrites. The hash table's + buckets array wasn't correctly resized when shrunk. + +2002-06-08 Detlef Würkner + + * builds/amiga/smakefile, builds/amiga/makefile: Updated. + +2002-06-08 Werner Lemberg + + * src/cache/ftccache.c (ftc_node_hash_unlink, ftc_node_hash_link) + [FTC_CACHE_USE_LINEAR_HASHING]: Fix returned error code. + Fix debugging messages. + * src/cache/ftccache.i (GEN_CACHE_LOOKUP): Move declaration of + `family' and `hash' up to make it compilable with g++. + + * src/type42/t42error.h: New file. + * src/type42/t42drivr.c, src/type42/t42objs.c, + src/type42/t42parse.c: Use t42 error codes. + * src/type42/rules.mk: Updated. + + * src/base/ftnames.c: Include FT_INTERNAL_STREAM_H. + +2002-06-08 David Turner + + * src/cache/ftccmap.c: GEN_CACHE_FAMILY_COMPARE, + GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]: + New macros. + (ftc_cmap_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to + ftc_cache_lookup. + (FTC_CMapCache_Lookup): Updated. + + Adding various experimental optimizations to the cache manager. + + * include/freetype/cache/ftccache.h (FTC_CACHE_USE_INLINE, + FTC_CACHE_USE_LINEAR_HASHING): New options. + (FTC_CacheRec) [FTC_CACHE_USE_LINEAR_HASHING]: New elements `p', + `mask', and `slack'. + + * src/cache/ftccache.c (FTC_HASH_MAX_LOAD, FTC_HASH_MIN_LOAD, + FTC_HASH_SUB_LOAD) [FTC_CACHE_USE_LINEAR_HASHING, + FTC_HASH_INITIAL_SIZE]: New macros. + (ftc_node_mru_link, ftc_node_mru_up): Optimized. + (ftc_node_hash_unlink, ftc_node_hash_link) + [FTC_CACHE_USE_LINEAR_HASHING]: New variants. + (FTC_PRIMES_MIN, FTC_PRIMES_MAX, ftc_primes, ftc_prime_closest, + FTC_CACHE_RESIZE_TEST, ftc_cache_resize) + [!FTC_CACHE_USE_LINEAR_HASHING]: Define it conditionally. + (ftc_cache_init, ftc_cache_clear) [FTC_CACHE_USE_LINEAR_HASHING]: + Updated. + (ftc_cache_lookup) [FTC_CACHE_USE_LINEAR_HASHING]: Implement it. + + * src/cache/ftccache.i: New file. + + * src/cache/ftcsbits.c (GEN_CACHE_FAMILY_COMPARE, + GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]: + New macros. + (ftc_sbit_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to + ftc_cache_lookup. + (FTC_SBitCache_Lookup): Updated. + + * src/type42/t42parse.c: Removing duplicate function. + +2002-06-07 Graham Asher + + * src/base/ftobjs.c (FT_Render_Glyph_Internal): Changed definition + from FT_EXPORT_DEF to FT_BASE_DEF. + +2002-06-07 David Turner + + Fixed the bug that prevented the correct display of fonts with + `ftview'. + + * src/type42/t42drivr.c: Split into... + * src/type42/t42drivr.h, src/type42/t42parse.c, + src/type42/t42parse.h, src/type42/t42objs.h, src/type42/t42objs.c, + src/type42/type42.c: New files. + + (t42_get_glyph_name, t42_get_ps_name, t42_get_name_index): Use + `face->type1'. + + (Get_Interface): Renamed to... + (T42_Get_Interface): This. + Updated. + (T42_Open_Face, T42_Face_Done): Updated. + (T42_Face_Init): Add new cmap support. + Updated. + (T42_Driver_Init, T42_Driver_Done, T42_Size_Init, T42_Size_Done, + T42_GlyphSlot_Init, T42_GlyphSlot_Done): Updated. + (Get_Char_Index, Get_Next_Char): Renamed to... + (T42_CMap_CharIndex, T42_CMap_CharNext): This. + Updated. + (T42_Char_Size, T42_Pixel_Size): Renamed to... + (T42_Size_SetChars, T42_Size_SetPixels): This. + (T42_Load_Glyph): Renamed to... + (T42_GlyphSlot_Load): This. + + (t42_init_loader, t42_done_loader): Renamed to... + (t42_loader_init, t42_loader_done): This. + (T42_New_Parser, T42_Finalize_Parser): Renamed to... + (t42_parser_init, t42_parser_done): This. + (parse_dict): Renamed to... + (t42_parse_dict): This. + (is_alpha, is_space, hexval): Renamed to... + (t42_is_alpha, t42_is_space, t42_hexval): This. + (parse_font_name, parse_font_bbox, parse_font_matrix, + parse_encoding, parse_sfnts, parse_charstrings, parse_dict): + Renamed to... + (t42_parse_font_name, t42_parse_font_bbox, t42_parse_font_matrix, + t42_parse_encoding, t42_parse_sfnts, t42_parse_charstrings, + t42_parse_dict): This. + Updated. + + (t42_keywords): Updated. + + * src/type42/Jamfile, src/type42/descrip.mms: Updated. + +2002-06-03 Werner Lemberg + + Add 8bpp support to BDF driver. + + * src/bdf/bdflib.c (_bdf_parse_start): Handle 8bpp. + * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Ditto. + * src/bdf/README: Updated. + +2002-06-02 Detlef Würkner + + * src/pfr/pfrload.c (pfr_phy_font_done): Free `blue_values' array. + +2002-05-29 Detlef Würkner + + * src/bdf/bdflib.c (_bdf_readstream): Allocate `buf' dynamically. + (_bdf_parse_glyphs): Use correct size for allocating + `font->unencoded'. + (bdf_load_font): Free array conditionally. + Return proper error code in case of failure. + * src/bdf/bdfdrivr.c (BDF_Face_Init): Make it more robust against + unusual fonts. + +2002-05-29 Werner Lemberg + + * src/bdf/descrip.mms, src/type42/descrip.mms: New files. + * descrip.mms (all): Updated. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Fix typo which prevented + compilation. + * src/pshglob.c (psh_blues_scale_zones): Fix compiler warning. + +2002-05-28 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/smakefile, + amiga/include/freetype/config/ftmodule.h: Updated to include + support for BDF and Type42 drivers. + + * docs/modules.txt: Updated. + +2005-05-28 David Turner + + * docs/CHANGES: Updating file for next release (2.1.1). + + * src/bdf/bdflib.c: Removing compiler warnings. + + * include/freetype/ftxf86.h, src/base/ftxf86.c: New files. + They provide a new API (FT_Get_X11_Font_Format) to retrieve an + X11-compatible string describing the font format of a given face. + This was put in a new optional base source file, corresponding to a + new public header (named FT_XFREE86_H since this function should + only be used within the XFree86 font server IMO). + + * include/freetype/config/ftheader.h (FT_XFREE86_H): New macro (not + documented yet). + + * src/base/fttype1.c: New file, providing two new API functions + (FT_Get_PS_Font_Info and FT_Has_PS_Glyph_Names). + * include/freetype/t1tables.h: Updated. + + * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: + Updating build control files for the new files `ftxf86.c' and + `fttype1.c' in src/base. + + * src/pshinter/pshglob.c (psh_blues_scale_zones): Fixed a bug that + prevented family blue zones substitution from hapenning correctly. + + * include/freetype/ftbdf.h FT_Get_BDF_Charset_ID): Adding + documentation comment. + +2002-05-28 Werner Lemberg + + * src/base/ftnames.c (FT_Get_Sfnt_Name): Don't use FT_STREAM_READ_AT + but FT_STREAM_READ. + Declare `stream' variable. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Replace floating point math + with calls to `FT_MulDiv'. + +2002-05-28 David Turner + + Fixing the SFNT name table loader to support various buggy fonts. + It now ignores empty name entries, entries with invalid pointer + Offsets and certain fonts containing tables with broken + `storageOffset' fields. + + Name strings are now loaded on demand, which reduces the memory + requirements for a given FT_Face tremendously (for example, the name + table of Arial.ttf is about 10Kb and contains 70 names). + + This is a temporary fix. The whole name table loader and interface + will be rewritten in a much more cleanly way shortly, once CSEH have + been introduced in the sources. + + * include/freetype/internal/tttypes.h (TT_NameEntryRec): Change + type of `stringOffset' to FT_ULong. + (TT_NameTableRec): Change type of `numNameRecords' and + `storageOffset' to FT_UInt. + Replace `storage' with `stream'. + * src/base/ftnames.c (FT_Get_Sfnt_Name): Load name on demand. + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto. + Make code more robust. + * src/sfnt/sfobjs.c (TT_NameEntry_ConvertFunc): New typedef. + (tt_face_get_name): Use it. + Make code more robust. + * src/sfnt/ttload.c (TT_Load_Names): Use `static' for arrays. + Handle invalid `storageOffset' data better. + Set length fields to zero for invalid or ignored data. + Remove code within FT_DEBUG_LEVEL_TRACE. + (TT_Free_Names): Updated. + +2002-05-24 Tim Mooney + + * builds/unix/ft-munmap.m4: New file, extracted FT_MUNMAP_DECL and + FT_MUNMAP_PARAM from aclocal.m4 into here, so aclocal.m4 can be + rebuilt from sources. Set macro serial to 1, and use third argument + to AC_DEFINE for our two custom symbols, so ftconfig.in could one day + be rebuilt with autoheader (not recommended now, ftconfig.in is a + custom source file) + +2002-05-22 Werner Lemberg + + * include/freetype/config/ftheader.h (FT_BEZIER_H): Removed. + (FT_BDF_H): New macro for accessing `ftbdf.h'. + + * src/type42/t42drivr.c (hexval): Fix typo. + +2002-05-21 Martin Muskens + + * src/psaux/psobjs.c (T1Radix): New function. + (t1_toint): Use it to handle numbers in radix format. + + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Add dummy + for undocumented, obsolete opcode 15. + +2002-05-21 David Turner + + * src/bdf/bdflib.c: Removed compiler warning, and changed all tables + to the `static const' storage specifier (instead of simply + `static'). + + * src/type42/t42drivr.c (hexval): Use more efficient code. + Removing compiler warnings. + * src/bdf/bdfdrivr.c: Removing compiler warnings. + + * include/freetype/internal/ftbdf.h, src/base/ftbdf.c, + src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk + (FT_Get_BDF_Charset_ID): New API to retrieve BDF-specific strings + from a face. This is much cleaner than accessing the internal types + `BDF_Public_Face' defined in FT_INTERNAL_BDF_TYPES_H. + +2002-05-21 Werner Lemberg + + * src/bdf/README: Mention Microsoft's SBIT tool. + + * src/cff/cffdrivr.c, src/cid/cidriver.c, src/pcf/pcfdriver.c, + src/truetype/ttdriver.c, src/type1/t1driver.c, + src/winfonts/winfnt.c, src/type42/t42drivr.c, src/bdf/bdfdrivr.c + [FT_CONFIG_OPTION_DYNAMIC_DRIVERS]: Completely removed. It has + been never used. + +2002-05-21 Roberto Alameda . + + * src/type42/t42drivr.c: s/T42_ENCODING_TYPE_/T1_ENCODING_TYPE_/. + (parse_font_matrix): Remove unnecessary code. + (parse_sfnts): Initialize some variables. + (t42_driver_class) [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Use + ft_module_driver_has_hinter conditionally. + Moved some type 42 specific structure definitions to... + * include/freetype/internal/t42types.h: New file. + * include/freetype/internal/internal.h (FT_INTERNAL_T42_TYPES_H): + New macro. + +2002-05-20 Werner Lemberg + + * include/freetype/cache/ftcsbits.h (FTC_SBit): Added a new field + `num_grays' for specifying the number of used gray levels. + * src/cache/ftcsbits.c (ftc_sbit_node_load): Initialize it. + +2002-05-19 Werner Lemberg + + Adding a driver for BDF fonts written by Francesco Zappa Nardelli + . Heavily modified by me to + better adapt it to FreeType, removing unneeded stuff. Additionally, + it now supports Mark Leisher's BDF extension for anti-aliased + bitmap glyphs with 2 and 4 bpp. + + * src/bdf/*: New driver. + * include/freetype/internal/bdftypes.h: New file. + * include/freetype/internal/fttrace.h: Added BDF driver components. + * include/freetype/fterrdef.h: Added error codes for BDF driver. + * include/freetype/config/ftmodule.h, src/Jamfile: Updated. + * include/freetype/internal/internal.h (FT_INTERNAL_BDF_TYPES_H): + New macro. + + * include/freetype/config/ftstdlib.h (ft_sprintf): New alias for + sprintf. + +2002-05-18 Werner Lemberg + + * include/freetype/internal/fttrace.h: Added Type 42 driver + component. + * src/type42/t42drivr.c: Use it. + + * include/freetype/internal/internal.h (FT_INTERNAL_PCF_TYPES_H): + New macro. + +2002-05-17 Werner Lemberg + + * src/type42/Jamfile: New file. + +2002-05-14 Werner Lemberg + + Adding a driver for Type42 fonts written by Roberto Alameda + . + + * src/type42/*: New driver. + * include/freetype/config/ftmodule.h, src/Jamfile: Updated. + * include/freetype/config/ftstdlib.h (ft_xdigit, ft_memcmp, + ft_atoi): New aliases for xdigit, memcmp, and atoi, respectively. + +2002-05-12 Owen Taylor + + * src/sfnt/ttload.c (TT_LookUp_Table): Protect against tables + with a zero length value. + +2002-05-12 Michael Pfeiffer + + * builds/beos/beos.mk: Include `link-std.mk'. + +2002-05-12 Werner Lemberg + + * src/type1/t1load.h (T1_Loader): Renamed to... + (T1_LoaderRec): This. + (T1_Loader): Now pointer to T1_LoaderRec. + * src/type1/t1load.c: Updated. + + * include/freetype/internal/t1types.h, src/type1/t1load.c, + src/type1/t1objs.c: + s/T1_ENCODING_TYPE_EXPORT/T1_ENCODING_TYPE_EXPERT/. + +2002-05-06 Werner Lemberg + + * README: Add a note regarding libttf vs. libfreetype. + +2002-05-05 Werner Lemberg + + FreeType 2 can now be built in an external directory with the + configure script also. + + * builds/freetype.mk (INCLUDES): Add `OBJ_DIR'. + + * builds/unix/detect.mk (have_mk): New variable to test for + external build. + (unix-def.mk): Defined according to value of `have_mk'. + * builds/unix/unix.mk (have_mk): New variable to test for + external build. + Select include paths for unix-def.mk and unix-cc.mk according + to value of `have_mk'. + * builds/unix/unix-def.in (OBJ_BUILD): New variable. + (DISTCLEAN): Use it. + * builds/unix/unix-cc.in (LIBTOOL): Define default value only + if not yet defined. + * builds/unix/install.mk (install): Use `OBJ_BUILD' for installing + freetype-config. + + * configure: Don't depend on bash features. + (ft2_dir, abs_curr_dir, abs_ft2_dir): New variables (code + partially taken from Autoconf). + Build a dummy Makefile if not building in source tree. + + * docs/INSTALL: Document it. + +2002-05-04 David Turner + + * src/truetype/ttgload.c (TT_Load_Glyph): Finally fixing the last + bug that prevented FreeType 2.x and FreeType 1.x to produce + bit-by-bit identical monochrome glyph bitmaps with native TrueType + hinting. The culprit was a single-bit flag that wasn't set + correctly by the TrueType glyph loader. + + * src/otlayout/otlayout.h, src/otlayout/otlbase.c, + src/otlayout/otlbase.h, src/otlayout/otlconf.h, + src/otlayout/otlgdef.c, src/otlayout/otlgdef.h, + src/otlayout/otlgpos.c, src/otlayout/otlgpos.h, + src/otlayout/otlgsub.c, src/otlayout/otlgsub.h, + src/otlayout/otljstf.c, src/otlayout/otljstf.h, + src/otlayout/otltable.c, src/otlayout/otltable.h, + src/otlayout/otltags.h: New OpenType Layout source files. The + module is still incomplete. + +2002-05-02 Werner Lemberg + + * src/sfnt/ttcmap0.c (tt_cmap4_char_index): Fix serious typo + (0xFFFU -> 0xFFFFU). + +2002-05-01 Werner Lemberg + + * docs/INSTALL: Fix URL of makepp. + +2002-05-01 David Turner + + * src/sfnt/sfobjs.c (tt_face_get_name): Fixing a bug that caused + FreeType to crash when certain broken fonts (e.g. `hya6gb.ttf') + were opened. + + * src/sfnt/ttload.c (TT_Load_Names): Applied a small work-around to + manage fonts containing a broken name table (e.g. `hya6gb.ttf'). + + * src/sfnt/ttcmap0.c (tt_cmap4_validate): Fixed over-restrictive + validation test. The charmap validator now accepts overlapping + ranges in format 4 charmaps. + + * src/sfnt/ttcmap0.c (tt_cmap4_char_index): Switched to a binary + search algorithm. Certain fonts contain more than 170 distinct + segments! + + * include/freetype/config/ftstdlib.h: Adding an alias for the `exit' + function. This will be used in the near future to panic in case of + unexpected exception (which shouldn't happen in theory). + + * include/freetype/internal/fthash.h, src/base/fthash.c: New files. + This is generic implementation of dynamic hash tables using a linear + algorithm (to get rid of `stalls' during resizes). In the future + this will be used in at least three parts of the library: the cache + sub-system, the object sub-system, and the memory debugger. + + * src/base/Jamfile: Updated. + + * include/freetype/internal/internal.h (FT_INTERNAL_HASH_H, + FT_INTERNAL_OBJECT_H): New macros. + + * include/freetype/internal/ftcore.h: New file to group all new + definitions related to exception handling and memory management. It + is very likely that this file will disappear or be renamed in the + future. + + * include/freetype/internal/ftobject.h, include/freetype/ftsysmem.h: + Adding comments to better explain the object sub-system as well as + the new memory manager interface. + +2002-04-30 Wenlin Institute (Tom Bishop) + + * src/base/ftmac.c (p2c_str): Removed. + (file_spec_from_path) [TARGET_API_MAC_CARBON]: Added support for + OS X. + (is_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X. + Handle `nameLen' <= 6 also. + (parse_fond): Remove unused variable `name_table'. + Use functionality of old p2c_str directly. + Add safety checks. + (read_lwfn): Initialize `size_p'. + Check for size_p == NULL. + (new_memory_stream, open_face_from_buffer): Updated to FreeType 2.1. + (FT_New_Face_From_LWFN): Remove unused variable `memory'. + Remove some dead code. + (FT_New_Face_From_SFNT): Remove unused variable `stream'. + (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Define only for + OS X. + (FT_New_Face_From_FOND): Remove unused variable `error'. + (ResourceForkSize): New function. + (FT_New_Face): Use it. + Handle empty resource forks. + Conditionalize some code for OS X. + Add code to call normal loader as a fallback. + +2002-04-30 Werner Lemberg + + `interface' is reserved on the Mac. + + * include/freetype/ftoutln.h, include/freetype/internal/sfnt.h, + src/base/ftoutln.c: s/interface/func_interface/. + * src/base/ftbbox.c (FT_Outline_Get_BBox): + s/interface/bbox_interface/. + * src/cff/cffdrivr.c: s/interface/module_interface/. + * src/cff/cffload.c, src/cff/cffload.h: + s/interface/psnames_interface/. + * src/cid/cidriver.c: s/interface/cid_interface/. + * src/sfnt/sfdriver.c: s/interface/module_interface/. + * src/smooth/ftgrays.c: s/interface/func_interface/. + * src/truetype/ttdriver.c: s/interface/tt_interface/. + * src/type1/t1driver.c: s/interface/t1_interface/. + + Some more variable renames to avoid troubles on the Mac. + + * src/raster/ftraster.c: + s/Unknown|Ascending|Descending|Flat/\1_State/. + * src/smooth/ftgrays.c: s/TScan/TCoord/. + + Other changes for the Mac. + + * include/freetype/config/ftconfig.h: Define FT_MACINTOSH for + Mac platforms. + * src/base/ftobjs.c: s/macintosh/FT_MACINTOSH/. + + * src/raster/ftrend1.c (ft_raster1_render): Make `pitch' always + an even number. + +2002-04-29 Jouk Jansen + + * descrip.mms (all): Add pfr driver. + +2002-04-28 Werner Lemberg + + * src/pfr/pfrerror.h: New file. + * include/freetype/ftmoderr.h: Add PFR error codes. + * src/pfr/pfrgload.c: Include pfrerror.h. + Use PCF error codes. + (pfr_extra_item_load_stem_snaps): Fix debug message. + * src/pfr/pfrgload.c: Include pfrerror.h. + Use PCF error codes. + (pfr_extra_item_load_bitmap_info, pfr_glyph_load_simple, + pfr_glyph_load_compound): Fix debug message. + * src/pfr/pfrobjs.c: Include pfrerror.h. + Use PCF error codes. + (pfr_face_init): Return PFR_Err_Unknown_File_Format. + * src/pfr/rules.mk (PFR_DRV_H): Include pfrerror.h. + + * src/pcf/pcfdriver.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_CMAPS]: + `root' -> `face->root'. + * src/sfnt/ttcmap0.c (TT_Build_CMaps) [!FT_CONFIG_OPTION_USE_CMAPS]: + Removed. + * src/sfnt/ttcmap0.c: Declare TT_Build_CMaps only for + FT_CONFIG_OPTION_USE_CMAPS. + +2002-04-27 Werner Lemberg + + * src/cache/ftccache.c (ftc_cache_lookup), + src/cache/ftccmap.c (ftc_cmap_family_init), + src/cache/ftcmanag.c (ftc_family_table_alloc), + src/cache/ftcsbits.c (FTC_SBit_Cache_Lookup): Use FTC_Err_*. + src/cache/ftcimage.c (FTC_Image_Cache_Lookup): Use FTC_Err_*. + (FTC_ImageCache_Lookup): Fix handling of invalid arguments. + +2002-04-22 Werner Lemberg + + * builds/unix/configure.ac: Set `version_info' to 9:1:3 (FT2 + version 2.0.9 has 9:0:3). + * builds/unix/configure: Regenerated (using autoconf 2.53). + +2002-04-19 Werner Lemberg + + * src/pfr/pfrload.c (pfr_extra_items_farse): Fix debug message. + (pfr_phy_font_load): s/size/Size/ for local variable to avoid + compiler warning. + * src/pfr/pfrobjs.c (pfr_face_init): Fix debug message. + (pfr_slot_load): Remove redundant local variable. + +2002-04-19 David Turner + + Adding a PFR font driver to the FreeType sources. Note that it + doesn't support embedded bitmaps or kerning tables yet. + + src/pfr/*: New files. + + * include/freetype/config/ftmodule.h, + include/freetype/internal/fttrace.h, src/Jamefile: Updated. + + * src/type1/t1gload.h (T1_Load_Glyph), src/type1/t1gload.c + (T1_Load_Glyph): Fixed incorrect parameter sign-ness in callback + function. + + * include/freetype/internal/ftmemory.h (FT_MEM_ZERO, FT_ZERO): New + macros. + + * include/freetype/internal/ftstream.h (FT_NEXT_OFF3, FT_NEXT_UOFF3, + FT_NEXT_OFF3_LE, FT_NEXT_UOFF3_LE): New macros to parse in-memory + 24-bit integers. + +2002-04-18 David Turner + + * src/base/ftobjs.c, builds/win32/ftdebug.c, + builds/amiga/src/base/ftdebug.c: Version 2.1.0 couldn't be linked + against applications in Win32 and Amiga builds due to changes to + `src/base/ftdebug.c' that were not properly propagated to + `builds/win32' and `builds/amiga'. This has been fixed. + + * include/freetype/internal/ftobject.h, + include/freetype/internal/ftexcept.h, include/freetype/ftsysmem.h, + include/freetype/ftsysio.h, src/base/ftsysmem.c, src/base/ftsysio.c: + New experimental files. + +2002-04-17 David Turner + + + * Version 2.1.0 released. + ========================= + + +2002-04-17 Michael Jansson + + * src/type1/t1gload.c (T1_Compute_Max_Advance): Fixed a small bug + that prevented the function to return the correct value. + +2002-04-16 Francesco Zappa Nardelli + + * src/pcf/pcfread (pcf_get_accell): Fix parsing of accelerator + tables. + +2002-04-15 David Turner + + * docs/FTL.txt: Formatting. + + * include/freetype/config/ftoption.h: Reduce the size of the + render pool from 32kByte to 16kByte. + + * src/pcf/pcfread.c (pcf_seek_to_table_type): Remove compiler + warning. + + * include/freetype/config/ftoption.h (FT_MAX_EXTENSIONS): Removed. + + * docs/CHANGES: Preparing 2.1.0 release. + +2002-04-13 Werner LEMBERG + + * src/cff/cffgload.c (CFF_Parse_CharStrings): s/rand/Rand/ to avoid + compiler warning. + +2002-04-12 David Turner + + * README.UNX: Updated the Unix-specific quick-compilation guide to + warn about the GNU Make requirement at compile time. + + * include/freetype/config/ftstdlib.h, + include/freetype/config/ftconfig.h, + include/freetype/config/ftheader.h, + include/freetype/internal/ftmemory.h, + include/freetype/internal/ftobjs.h, + + src/autohint/ahoptim.c, + + src/base/ftdbgmem.c, src/base/ftdebug.c, src/base/ftmac.c, + src/base/ftobjs.c, src/base/ftsystem.c, + + src/cache/ftcimage.c, src/cache/ftcsbits.c, + + src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c, + + src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c, + + src/pcf/pcfdriver.c, src/pcf/pcfread.c, + + src/psaux/t1cmap.c, src/psaux/t1decode.c, + + src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c, + src/pshinter/pshrec.c, + + src/psnames/psmodule.c, + + src/raster/ftraster.c, + + src/sfnt/sfdriver.c, src/sfnt/ttload.c, + + src/smooth/ftgrays.c, + + src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c, + src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c, + + builds/unix/ftconfig.in, builds/vms/ftconfig.h, + + builds/amiga/src/base/ftdebug.c: + + Added the new configuration file `ftstdlib.h' used to define + aliases for all ISO C library functions used by the engine + (e.g. strlen, qsort, setjmp, etc.). + + This eases the porting of FreeType 2 to environments like + XFree86 modules/extensions. + + Also removed many #include , #include , etc. + from the engine's sources where they are not needed. + + * src/sfnt/ttpost.c: Use macro name for psnames.h. + +2002-04-12 Vincent Caron + + * configure, builds/detect.mk: Updated the build system to print + a warning message in case GNU Make isn't used to build the library. + +2002-04-11 David Turner + + * README, docs/CHANGES, Jamfile.in: Updates for the 2.1.0 release. + + * docs/FTL.txt: Updated license text to provide a preferred + disclaimer and adjust copyright dates/extents. + + * include/freetype/cache/ftcglyph.h: Removing obsolete (and + confusing) comment. + + * Jamfile.in: New file. + +2002-04-11 Maxim Shemanarev + + * src/smooth/ftgrays.c (gray_hline): Minor optimization. + +2002-04-02 Werner Lemberg + + Fixes from the stable branch: + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_OLD_CALCS): + Removed. + [FT_CONFIG_OPTION_OLD_CALCS]: Removed. + * include/freetype/internal/ftcalc.h, src/base/ftcalc.c + [FT_CONFIG_OPTION_OLD_CALCS]: Removed. + + * src/base/fttrigon.c (FT_Vector_Length): Change algorithm to match + output of FreeType 1. + + * src/pshinter/pshglob.c (psh_globals_scale_widths): Fixed a small + bug that created un-even stem widths when hinting Postscript fonts. + + * src/type1/t1driver.c, src/type1/t1parse.c: 16bit fixes. + +2002-04-01 Werner Lemberg + + * src/truetype/ttgload.c: 16bit fixes. + (TT_Load_Simple_Glyph): Improve debug messages. + (load_truetype_glyph): Remove dead code. + * src/truetype/ttinterp.c: 16bit fixes. + * src/truetype/ttobjs.c: Ditto. + + * include/freetype/ftsnames.h, include/freetype/internal/sfnt.h, + src/cff/cffload.h, src/psaux/psobjs.h, src/truetype/ttinterp.[ch], + src/sfnt/ttpost.h: s/index/idx/. + +2002-03-31 Yao Zhang + + * src/truetype/ttobjs.c (TT_Size_Init): Fix typo. + +2002-03-31 Werner Lemberg + + * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h: s/index/idx/. + * src/psaux/t1cmap.c: Ditto. + * src/sfnt/ttcmap0.c: Ditto. + + * include/freetype/internal/tttypes.h, + include/freetype/internal/sfnt.h (TT_Goto_Table_Func): Renamed to ... + (TT_Loader_GotoTableFunc): This. + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix debug + messages. + * src/psnames/psmodule.c (psnames_interface) + [!FT_CONFIG_OPTION_ADOBE_GLYPH_LIST]: Fix typo. + * src/sfnt/sfdriver.c (get_sfnt_table): 16bit fix. + * src/sfnt/ttcmap.c: 16bit fixes (0xFFFF -> 0xFFFFU). + * src/sfnt/ttcmap0.c: 16bit fixes. + (TT_Build_CMaps): Simplify debug messages. + (tt_cmap12_char_next): Fix offset. + * src/sfnt/ttload.c (TT_Load_Names, TT_Load_CMap): Fix debug + messages. + (TT_Load_OS2): 16bit fix. + +2002-03-30 David Turner + + * include/freetype/internal/tttypes.h: Adding comments to some of + the TT_FaceRec fields. + + * src/sfnt/ttcmap0.c (TT_Build_CMaps): Removed compiler warnings. + + * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_{utf16,ucs4,other}: + New functions. + (tt_face_get_name): Use them to properly extract an ascii font name. + +2002-03-30 Werner Lemberg + + * include/freetype/t1tables.h (t1_blend_max): Fix typo. + * src/base/ftstream.c: Simplify FT_ERROR calls. + * src/cff/cffdrivr.c (cff_get_glyph_name): Fix debug message. + + * src/cff/cffobjs.c (CFF_Driver_Init, CFF_Driver_Done) + [TT_CONFIG_OPTION_EXTEND_ENGINE]: Removed. + * src/cff/sfobjs.c (SFNT_Load_Face) + [TT_CONFIG_OPTION_EXTEND_ENGINE]: Ditto. + * src/truetype/ttobjs.c (TT_Init_Driver, TT_Done_Driver) + [TT_CONFIG_OPTION_EXTEND_ENGINE]: Ditto. + + * src/truetype/ttdriver.c, src/truetype/ttobjs.c, + src/truetype/ttobjs.h: Renaming driver functions to the + FT__ scheme: + + TT_Init_Driver => TT_Driver_Init + TT_Done_Driver => TT_Driver_Done + TT_Init_Face => TT_Face_Init + TT_Done_Face => TT_Face_Done + TT_Init_Size => TT_Size_Init + TT_Done_Size => TT_Size_Done + TT_Reset_Size => TT_Size_Reset + +2002-03-29 Werner Lemberg + + * builds/vms/ftconfig.h: Rename LOCAL_DEF and LOCAL_FUNC to + FT_LOCAL and FT_LOCAL_DEF, respectively, as with other ftconfig.h + files. + * builds/unix/ftconfig.in: Add argument to FT_LOCAL and + FT_LOCAL_DEF. + * src/truetype/ttinterp.c: s/FT_Assert/FT_ASSERT/. + * builds/unix/configure.ac: Temporarily deactivate creation of + ../../Jamfile. + * builds/unix/configure: Updated. + +2002-03-28 KUSANO Takayuki + + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fix serious typos. + +2002-03-28 Werner Lemberg + + * include/freetype/internal/psaux.h (PSAux_ServiceRec): Fix + compiler warnings. + * include/freetype/internal/t1types.h (T1_FaceRec): Use `const' for + some members. + * src/base/ftapi.c (FT_New_Memory_Stream): Fix typos. + * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Add + cast. + (t1_cmap_{standard,expert,custom,unicode}_class_rec): Use + `FT_CALLBACK_TABLE_DEF'. + * src/psaux/t1cmap.h: Updated. + * src/sfnt/ttcmap0.c (TT_Build_CMaps): Use `ft_encoding_none' + instead of zero. + * src/type1/t1objs.c (T1_Face_Init): Use casts. + +2002-03-26 David Turner + + * src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c: + Fixed a small bug in the FT_CMaps support code. + +2002-03-25 David Turner + + * src/truetype/ttinterp.c (Norm): Replaced with... + (TT_VecLen): This. + (TT_MulFix14, TT_DotFix14): New functions. + (Project, Dual_Project, Free_Project, Compute_Point_Displacement, + Ins_SHPIX, Ins_MIAP, Ins_MIRP): Use them. + [FT_CONFIG_OPTION_OLD_CALCS]: Removed all code. + +2002-03-22 David Turner + + * src/base/ftobjs.c, src/sfnt/ttcmap0.c, src/type1/t1objs.c: + Various fixes to make the FT_CMaps support work correctly (more + tests are still needed). + + * include/freetype/internal/ftobjs.h, src/sfnt/Jamfile, + src/sfnt/rules.mk, src/sfnt/sfnt.c, src/sfnt/sfobjs.c, + src/sfnt/ttload.c, src/sfnt/ttcmap0.c, src/sfnt/ttcmap0.h: Updated + the SFNT charmap support to use FT_CMaps. + + * include/freetype/fterrdef.h: New file. + * include/freetype/fterrors.h: Include it. It contains all error + codes. + * include/freetype/config/ftheader.h (FT_ERROR_DEFINITIONS_H): New + macro. + + * include/freetype/internal/ftmemory.h, and a lot of other files: + Changed the names of memory macros. Examples: + + MEM_Set => FT_MEM_SET + MEM_Copy => FT_MEM_COPY + MEM_Move => FT_MEM_MOVE + + ALLOC => FT_ALLOC + FREE => FT_FREE + REALLOC = >FT_REALLOC + + FT_NEW was introduced to allocate a new object from a _typed_ + pointer. + + Note that ALLOC_ARRAY and REALLOC_ARRAY have been replaced by + FT_NEW_ARRAY and FT_RENEW_ARRAY which take _typed_ pointer + arguments. + + This results in _lots_ of sources being changed, but makes the code + more generic and less error-prone. + + * include/freetype/internal/ftstream.h, src/base/ftstream.c, + src/cff/cffload.c, src/pcf/pcfread.c, src/sfnt/ttcmap.c, + src/sfnt/ttcmap0.c, src/sfnt/ttload.c, src/sfnt/ttpost.c, + src/sfnt/ttsbit.c, src/truetype/ttgload.c, src/truetype/ttpload.c, + src/winfonts/winfnt.c: Changed the definitions of stream macros. + Examples: + + NEXT_Byte => FT_NEXT_BYTE + NEXT_Short => FT_NEXT_SHORT + NEXT_UShortLE => FT_NEXT_USHORT_LE + READ_Short => FT_READ_SHORT + GET_Long => FT_GET_LONG + etc. + + Also introduced the FT_PEEK_XXXX functions. + + * src/cff/cffobjs.c (CFF_Build_Unicode_Charmap): Removed commented + out function. + (find_encoding): Removed. + (CFF_Face_Init): Remove charmap support. + + * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_CMAPS, + TT_CONFIG_CMAP_FORMAT{0,2,4,6,8,10,12}): New macros to fine-tune + support of cmaps. + +2002-03-21 David Turner + + * src/base/ftobjs.c, src/pcf/pcfdriver.c, src/pcf/pcfread.c: Updated + to new FT_CMap definitions. + + * src/psaux/t1cmap.h, src/psaux/t1cmap.c, src/type1/t1cmap.h, + src/type1/t1cmap.c: Updating and moving the Type 1 FT_CMap support + from `src/type1' to `src/psaux' since it is going to be shared by + the Type 1 and CID font drivers. + + * src/psaux/Jamfile, src/psaux/psaux.c, src/psaux/psauxmod.c, + src/psaux/rules.mk, include/freetype/internal/psaux.h: Added support + for Type 1 FT_CMaps. + +2002-03-20 David Turner + + * src/base/ftgloadr.c (FT_GlyphLoader_CheckSubGlyphs): Fixed a + memory allocation bug that was due to un-careful renaming of the + FT_SubGlyph type. + + * src/base/ftdbgmem.c (ft_mem_table_destroy): Fixed a small bug that + caused the library to crash with Electric Fence when memory + debugging is used. + + * Renaming stream macros. Examples: + + FILE_Skip => FT_STREAM_SKIP + FILE_Read => FT_STREAM_READ + ACCESS_Frame => FT_FRAME_ENTER + FORGET_Frame => FT_FRAME_EXIT + etc. + + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed memory leak. + + * include/freetype/internal/ftobjs.h: Changing the definition of + FT_CMap_CharNextFunc slightly. + + * src/cff/*.c: Updating CFF type definitions. + +2002-03-14 David Turner + + * include/freetype/internal/autohint.h, src/autohint/ahmodule.c, + src/base/ftapi.c, src/base/ftobjs.c: Updating the type definitions + for the auto-hinter module. + + FT_AutoHinter_Interface => FT_AutoHinter_ServiceRec + FT_AutoHinter_Interface* => FT_AutoHinter_Service + etc. + + FT_AutoHinter_Get_Global_Func => FT_AutoHinter_GlobalGetFunc + FT_AutoHinter_Done_Global_Func => FT_AutoHinter_GlobalDoneFunc + etc. + + * ahloader.h [_STANDALONE_]: Removed all conditional code. + + * include/freetype/internal/cfftypes.h, src/cff/*.c: Updating the + type definitions of the CFF font driver. + + CFF_Font => CFF_FontRec + CFF_Font* => CFF_Font + etc. + + * include/freetype/internal/fnttypes.h, src/winfonts/*.c: Updating + type definitions of the Windows FNT font driver. + + * include/freetype/internal/ftdriver.h, + include/freetype/internal/ftobjs.h, src/base/ftapi.c, + src/base/ftobjs.c, src/cff/cffdrivr.c, src/cff/cffdrivr.h, + src/cid/cidriver.c, src/cid/cidriver.h, src/pcf/pcfdriver.c, + src/pcf/pcfdriver.h, src/truetype/ttdriver.c, + src/truetype/ttdriver.h, src/type1/t1driver.c, src/type1/t1driver.h, + src/winfonts/winfnt.c, src/winfonts/winfnt.h: Updating type + definitions for font drivers. + + FTDriver_initFace => FT_Face_InitFunc + FTDriver_initGlyphSlot => FT_Slot_InitFunc + etc. + + * src/cid/cidobjs.c (CID_Face_Init): Remove dead code. + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c: Updated a + few face method definitions: + + FT_PSName_Requester => FT_Face_GetPostscriptNameFunc + FT_Glyph_Name_Requester => FT_Face_GetGlyphNameFunc + FT_Name_Index_Requester => FT_Face_GetGlyphNameIndexFunc + + * src/base/ftapi.c: New file. It contains backwards compatibility + functions. + + * include/freetype/internal/psaux.h, src/cid/cidload.c, + src/cidtoken.h, src/psaux/psobjs.c, src/psaux/psobjs.h, + src/psaux/t1decode.c, stc/type1/t1load.c, src/type1/t1tokens.h: + Updated common PostScript type definitions. + Renamed all enumeration values like to uppercase variants: + + t1_token_any => T1_TOKEN_TYPE_ANY + t1_field_cid_info => T1_FIELD_LOCATION_CID_INFO + etc. + + * include/freetype/internal/psglobals.h: Removed. + * include/freetype/internal/pshints.h, src/pshinter/pshglob.h: + Updated. + + * include/freetype/internal/tttypes.h, + include/freetype/internal/sfnt.h, src/base/ftnames.c, + src/cff/cffdrivr.c, src/sfnt/*.c, src/truetype/*.c: Updated + SFNT/TrueType type definitions. + + * include/freetype/freetype.h, include/freetype/internal/ftgloadr.h: + Updating type definitions for the glyph loader. + +2002-03-13 Antoine Leca + + * include/freetype/config/ftoption.h: Changed the automatic + detection of Microsoft C compilers to automatically support 64-bit + integers only since revision 9.00 (i.e. >= Visual C++ 2.0). + +2002-03-08 Werner Lemberg + + * src/base/ftutil.c (FT_Realloc): Use MEM_Set instead of memset. + +2002-03-07 Werner Lemberg + + * src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new, + ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free, + ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug, + FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings. + * src/base/ftcalc.c (FT_MulFix): Ditto. + * src/cff/cffdrivr.c (cff_get_name_index): Ditto. + * src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init, + CFF_GlyphSlot_Init): Ditto. + * src/cid/cidobjs.c (CID_GlyphSlot_Init, + CID_Size_Get_Globals_Funcs): Ditto. + * src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init): + Ditto. + * src/pshinter/pshmod.c (pshinter_interface): Use `static const'. + * src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused + variables. + + * include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed + to... + (T1_Builder_FuncsRec): This. + (T1_Builder_Funcs): New typedef. + (PSAux_Interface): Remove compiler warnings. + * src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h + (t1_builder_funcs): Updated. + + * src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ... + (PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines. + (PSH_AlignmentRec): Updated. + + * include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix + typo. + * include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto. + * src/base/ftstream (FT_Get_Char): Rename to... + (FT_Stream_Get_Char): This. + + * src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is + a built-in function in gcc, causing warning messages with gcc 3.0. + * src/autohint/ahglyph.c (ah_outline_load): Ditto. + * src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto. + * src/cache/ftcmanag.c (ftc_family_table_alloc, + ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache): + Ditto. + * src/cff/cffload.c (cff_new_index, cff_done_index, + cff_explicit_index, CFF_Access_Element, CFF_Forget_Element, + CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font, + CFF_Done_Font): Ditto. + * src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto. + * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto. + * src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit, + ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3, + * src/pshinter/pshalgo1.c (psh1_hint_table_record, + psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto. + * src/pshinter/pshalgo2.c (psh2_hint_table_record, + psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto. + * src/sfnt/ttpost.c (Load_Format_20, Load_Format_25, + TT_Get_PS_Name): Ditto. + * src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics, + load_truetype_glyph): Ditto. + * src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto. + * src/type1/t1afm.c (T1_Get_Kerning): Ditto. + * include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto. + +2002-03-06 David Turner + + * src/type1/t1objs.c (T1_Face_Init), src/cid/cidobjs.c + (CID_Face_Init): Fixed another bug related to the + ascender/descender/text height of Postscript fonts. + + * src/pshinter/pshalgo2.c (print_zone): Renamed to ... + (psh2_print_zone): This. + * src/pshinter/pshalgo1.c (print_zone): Renamed to ... + (psh1_print_zone): This. + + * include/freetype/freetype.h, include/freetype/internal/ftobjs.h, + src/base/ftobjs.c: Adding the new FT_Library_Version API to return + the library's current version in dynamic links. + * src/base/ftinit.c (FT_Init_FreeType): Updated. + +2002-03-06 Werner Lemberg + + * src/pshinter/pshglob.h (PSH_DimensionRec): s/std/stdw/. + * src/pshinter/pshglob.c (psh_global_scale_widths, + psh_dimension_snap_width, psh_globals_destroy, psh_globals_new): + Ditto. + +2002-03-05 David Turner + + * src/type1/t1objs.c (T1_Face_Init), src/cff/cffobjs.c + (CFF_Face_Init), src/cid/cidobjs.c (CID_Face_Init): Removing the bug + that returned global BBox values in 16.16 fixed format (instead of + integer font units). + + * src/cid/cidriver.c (cid_get_postscript_name): Fixed a bug that + caused the CID driver to return Postscript font names with a leading + slash (`/') as in `/MOEKai-Regular'. + + * src/sfnt/ttload.c (TT_Load_Names), src/sfnt/sfobjs.c (Get_Name), + src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed the loader so + that it accepts broken fonts like `foxjump.ttf', which made FreeType + crash when trying to load them. + + Also improved the name table parser to be able to load + Windows-encoded entries before Macintosh or Unicode ones, since it + seems some fonts don't have reliable values here anyway. + + * include/freetype/internal/psnames.h: Add typedef for + `PSNames_Service'. + +2002-03-05 Werner Lemberg + + * builds/unix/aclocal.m4, builds/unix/ltmain.sh: Update to libtool + 1.4.2. + Apply a small patch for AIX to make shared libraries work (this + patch is already in the CVS version of libtool). + + * builds/unix/config.sub, builds/unix/config.guess: Updated to + recent versions. + + * builds/unix/configure.ac: Fix typo + (AC_CONFIG_FILE->AC_CONFIG_FILES). + + * builds/unix/configure: Regenerated. + +2002-02-28 David Turner + + * include/freetype/ftconfig.h: Changed `FT_LOCAL xxxx' to + `FT_LOCAL( xxxx )' everywhere in the source. The same goes for + `FT_LOCAL_DEF xxxx' which is translated to `FT_LOCAL_DEF( xxxxx )'. + + * include/freetype/freetype.h (FREETYPE_MINOR, FREETYPE_PATCH): + Changing version to 2.1.0 to indicate an unstable branch. + Added the declarations of FT_Get_First_Char and FT_Get_Next_Char. + + * src/base/ftobjs.c: Implement FT_Get_First_Char and + FT_Get_Next_Char. + + * include/freetype/t1tables.h: Renaming structure types. This + + typedef T1_Struct_ + { + } T1_Struct; + + becomes + + typedef PS_StructRec_ + { + } PS_StructRec, *PS_Struct; + + typedef PS_StructRec T1_Struct; /* backwards-compatibility */ + + Hence, we increase the coherency of the source code by effectively + using the `Rec' prefix for structure types. + +2002-02-27 David Turner + + * src/sfnt/ttload.c (TT_Load_Names): Simplifying and securing the + names table loader. Invalid individual name entries are now handled + correctly. This allows the loading of very buggy fonts like + `foxjump.ttf' without allocating tons of memory and causing crashes. + + * src/otlayout/otlcommon.h, src/otlayout/otlcommon.c: Adding (still + experimental) code for OpenType Layout tables validation and + parsing. + + * src/type1/t1cmap.h, src/type1/t1cmap.c: Adding (still + experimental) code for Type 1 charmap processing. + + * src/sfnt/ttcmap0.c: New file. It contains a new, still + experimental SFNT charmap processing support. + + * include/freetype/internal/ftobjs.h: Adding validation support as + well as internal charmap object definitions (FT_CMap != FT_CharMap). + +2002-02-24 David Turner + + * Renaming stream functions to the FT__ scheme: + + FT_Seek_Stream => FT_Stream_Seek + FT_Skip_Stream => FT_Stream_Skip + FT_Read_Stream => FT_Stream_Read + FT_Read_Stream_At => FT_Stream_Read_At + FT_Access_Frame => FT_Stream_Enter_Frame + FT_Forget_Frame => FT_Stream_Exit_Frame + FT_Extract_Frame => FT_Stream_Extract_Frame + FT_Release_Frame => FT_Stream_Release_Frame + FT_Get_XXXX => FT_Stream_Get_XXXX + FT_Read_XXXX => FT_Stream_Read_XXXX + + FT_New_Stream( filename, stream ) => + FT_Stream_Open( stream, filename ) + + (The function doesn't create the FT_Stream structure, it simply + initializes it for reading.) + + FT_New_Memory_Stream( library, FT_Byte* base, size, stream ) => + FT_Stream_Open_Memory( stream, const FT_Byte* base, size ) + + FT_Done_Stream => FT_Stream_Close + FT_Stream_IO => FT_Stream_IOFunc + FT_Stream_Close => FT_Stream_CloseFunc + + ft_close_stream => ft_ansi_stream_close (in base/ftsystem.c only) + ft_io_stream => ft_ansi_stream_io (in base/ftsystem.c only) + + * src/base/ftutil.c: New file. Contains all memory and list + management code (previously in `ftobjs.c' and `ftlist.c', + respectively). + + * include/freetype/internal/ftobjs.h: Moving all code related to + glyph loaders to ... + * include/freetype/internal/ftgloadr.h: This new file. + `FT_GlyphLoader' is now a pointer to the structure + `FT_GlyphLoaderRec'. + (ft_glyph_own_bitmap): Renamed to ... + (FT_GLYPH_OWN_BITMAP): This. + * src/base/ftobjs.c: Moving all code related to glyph loaders + to ... + * src/base/ftgloadr.c: This new file. + +2002-02-22 Werner Lemberg + + * include/freetype/internal/ftdebug.h (FT_Trace): Remove comma in + enum to avoid compiler warnings. + +2002-02-21 David Turner + + Modified the debug sub-system initialization. Trace levels can now + be specified within the `FT2_DEBUG' environment variable. See the + comments within `ftdebug.c' for more details. + + * src/base/ftdebug.c: (FT_SetTraceLevel): Removed. + (ft_debug_init): New function. + (ft_debug_dummy): Removed. + Updated to changes in ftdebug.h + + * include/freetype/internal/ftdebug.h: Always define + FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE is defined. + (FT_Assert): Renamed to ... + (FT_ASSERT): This. + Some stuff from ftdebug.h has been moved to ... + + * include/freetype/internal/fttrace.h: New file, to define the trace + levels used for debugging. It is used both to define enums and + toggle names for FT2_DEBUG. + + * include/freetype/internal/internal.h: Updated. + + * src/base/ftobjs.c, src/base/ftstream.c: Updated. + + * include/freetype/internal/ftextend.h, src/base/ftextend.c: + Removed. Both files are now completely obsolete. + * src/base/Jamfile, src/base/rules.mk: Updated. + + * include/freetype/fterrors.h: Adding `#undef FT_ERR_CAT' and + `#undef FT_ERR_XCAT' to avoid warnings with certain compilers (like + LCC). + + * src/pshinter/pshalgo2.c (print_zone): Renamed to ... + (psh2_print_zone): This to avoid errors during compilation of debug + library. + + * src/smooth/ftgrays.c (FT_COMPONENT): Change definition to as + `trace_smooth'. + +2002-02-20 David Turner + + * README: Adding `devel@freetype.org' address for bug reports. + +2002-02-20 Werner Lemberg + + * builds/unix/install.mk (check): New dummy target. + (.PHONY): Add it. + +2002-02-19 Werner Lemberg + + * builds/freetype.mk (FT_CFLAGS): Use $(INCLUDE_FLAGS) first. + + * src/cache/ftccache.c (ftc_cache_resize): Mark `error' as unused + to avoid compiler warning. + * src/cff/cffload.c (CFF_Get_String): Ditto. + * src/cff/cffobjs.c (CFF_StrCopy): Ditto. + * src/psaux/psobjs.c (PS_Table_Done): Ditto. + * src/pcf/pcfread.c (pcf_seek_to_table_type): Ditto. + * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto. + (pcf_get_bitmaps): The same for `sizebitmaps'. + * src/psaux/t1decode.c (T1_Decode_Parse_Charstrings): The same for + `orig_y'. + (t1operator_seac): Comment out more dead code. + * src/pshinter/pshalgo2.c (ps2_hints_apply): Add `DEBUG_HINTER' + conditional. + * src/truetype/ttgload.c (TT_Process_Simple_Glyph, + load_truetype_glyph): Add `TT_CONFIG_OPTION_BYTECODE_INTERPRETER' + conditional. + +2002-02-18 Werner Lemberg + + * src/autohint/ahglyph.c (ah_outline_link_segments): Remove unused + variables. + * src/autohint/ahhint.c (ah_align_serif_edge): Use FT_UNUSED instead + of UNUSED. + * src/autohint/ahmodule.c (ft_autohinter_reset): Ditto. + * src/pshinter/pshrec.c (ps_mask_table_merge): Fix typo in variable + swapping code. + * src/pshinter/pshglob.h (PSH_Blue_Align): Add PSH_BLUE_ALIGN_NONE. + * src/pshinter/pshglob.c (psh_blues_snap_stem): Use it. + * src/pshinter/pshalgo1.c (psh1_hint_table_optimize): Ditto. + * src/pshinter/pshalgo2.c (psh2_hint_align): Ditto. + * include/freetype/internal/ftobjs.h (UNUSED): Removed. + +2002-02-10 Roberto Alameda + + Add support for ISOLatin1 PS encoding. + + * include/freetype/freetype.h (ft_encoding_latin_1): New tag + (`lat1'). + * include/freetype/internal/t1types.h (T1_Encoding_Type): Add + `t1_encoding_isolatin1'. + * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Handle + ft_encoding_latin_1. + * src/type1/t1load.c (parse_encoding): Handle `ISOLatin1Encoding'. + * src/type1/t1objs.c (T1_Face_Init): Handle `t1_encoding_isolatin1'. + +---------------------------------------------------------------------------- + +Copyright 2002, 2003, 2004, 2005, 2007, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/alienblaster/project/jni/freetype/ChangeLog.22 b/alienblaster/project/jni/freetype/ChangeLog.22 new file mode 100644 index 000000000..4144288a5 --- /dev/null +++ b/alienblaster/project/jni/freetype/ChangeLog.22 @@ -0,0 +1,2837 @@ +2006-05-12 Werner Lemberg + + + * Version 2.2.1 released. + ========================= + + + Tag sources with `VER-2-2-1'. + +2006-05-12 Werner Lemberg + + * src/tools/docmaker/sources.py (re_source_keywords): Add word + boundary markers. + * src/tools/docmaker/content.py (re_field): Allow `.' in field names + (but not at the beginning or end). + * src/tools/docmaker/tohtml.py (html_header_1): Use `utf-8' charset. + (block_footer): Split into... + (block_footer_start, block_footer_middle, block_footer_end): This to + add navigation buttons. + (HtmlFormatter::block_exit): Updated. + + * include/freetype/*: Many minor documentation improvements (adding + links, spelling errors, etc.). + +2006-05-11 Werner Lemberg + + * README: Minor updates. + + * include/freetype/*: s/scale/scaling value/ where appropriate. + Many other minor documentation improvements. + + * src/tools/docmaker/sources.py (re_italic, re_bold): Handle + trailing punctuation. + * src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_word): Add + warning message for undefined cross references. + Update handling of re_italic and re_bold. + +2006-05-11 Masatake YAMATO + + * builds/unix/ftsystem.c (FT_Stream_Open): Check errno only if + read system call returns -1. + Remove a redundant parenthesis. + +2006-05-10 Werner Lemberg + + * builds/unix/ftsystem.c (FT_Stream_Open): Avoid infinite loop if + given an empty, un-mmap()able file. Reported and suggested fix in + Savannah bug #16555. + + * builds/freetype.mk (refdoc): Write-protect the `docmaker' + directory to suppress generation of .pyc files. According to the + Python docs there isn't a more elegant solution (currently). + + * builds/toplevel.mk (dist): New target which builds .tar.gz, + .tar.bz2, and .zip files. Note that the version number is still + hard-coded. + (do-dist): Sub-target of `dist'. + (CONFIG_GUESS, CONFIG_SUB): New variables. + (.PHONY): Updated. + +2006-05-09 Rajeev Pahuja + + * builds/win32/visualc/freetype.sln, + builds/win32/visualc/freetype.vcproj: Upgraded to VS.NET 2005 from + VS.NET 2003 + Added files ftbbox.c, fttype1.c, ftwinfnt.c, ftsynth.c. + + * builds/win32/visualc/index.html: Updated. + +2006-05-07 Werner Lemberg + + Put version information into the configure script. Reported by Paul + Watson . + + * builds/unix/configure.ac: Renamed to... + * builds/unix/configure.raw: This which now serves (with appropriate + modifications) as a template for configure.ac. + + * version.sed: New script. + + * autogen.sh: Generate configure.ac from configure.raw, using + FREETYPE_MAJOR, FREETYPE_MINOR, and FREETYPE_PATCH from freetype.h. + +2006-05-06 Werner Lemberg + + * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1. + + * builds/unix/configure.ac (version_info): Set to 9:10:3. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj, builds/freetype.mk (refdoc), + Jamfile (RefDoc), README: s/220/221/, s/2.2.0/2.2.1/. + Minor updates. + + * docs/CHANGES, docs/VERSION.DLL, docs/PROBLEMS, README.CVS: + Updated. + + * builds/unix/install-sh: Updated from `texinfo' CVS module at + savannah.gnu.org. + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + +2006-05-04 Werner Lemberg + + * src/lzw/ftlzw2.c: Renamed to... + * src/lzw/ftlzw.c: This. + + * src/lzw/Jamfile, src/lzw/rules.mk: Updated. + + * builds/mac/FreeType.m68k_cfm.make.txt, + builds/mac/FreeType.m68k_far.make.txt, + builds/mac/FreeType.ppc_carbon.make.txt, + builds/mac/FreeType.ppc_classic.make.txt: Updated. + +2006-05-03 David Turner + + Allow compilation again with C++ compilers. + + * include/freetype/internal/ftmemory.h (FT_ASSIGNP, + FT_ASSIGNP_INNER): New macros which do the actual assignment, and + which exist in two variants (for C and C++). + Update callers accordingly. + +2006-05-03 Werner Lemberg + + * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): Removed. + +2006-05-02 Werner Lemberg + + * include/freetype/internal/ftmemory.h: s/new/newsz/ (for C++). + (FT_ALLOC): Remove redundant redefinition. + + * builds/compiler/gcc-dev.mk (CFLAGS) [g++]: Don't use + `-Wstrict-prototypes'. + + * src/base/ftstream.c (FT_Stream_EnterFrame): Add cast. + + * include/freetype/config/ftconfig.h (FT_BASE_DEF) [__cplusplus]: + Remove `extern'. + +2006-05-02 David Turner + + Update the memory management functions and macros to safely deal + with array size buffer overflows. This corresponds to attempts to + allocate arrays that are too large. For an example, consider the + following code: + + count = read_uint32_from_file(); array = malloc( sizeof ( Item ) * + count ); for ( nn = 0; nn < count; nn++ ) + array[nn] = read_item_from_file(); + + If `count' is larger than `FT_UINT_MAX/sizeof(Item)', the + multiplication overflows, and the array allocated os smaller than + the data read from the file. In this case, the heap will be + trashed, and this can be used as a denial-of-service attack, or make + the engine crash later. + + The FT_ARRAY_NEW and FT_ARRAY_RENEW macros now ensure that the new + count is no larger than `FT_INT_MAX/item_size', otherwise a new + error code `FT_Err_Array_Too_Large' will be returned. + + Note that the memory debugger now works again when FT_DEBUG_MEMORY + is defined. FT_STRICT_ALIASING has disappeared; the corresponding + code is now the default. + + + * include/freetype/config/ftconfig.h (FT_BASE_DEF) [!__cplusplus]: + Don't use `extern'. + + * include/freetype/fterrdef.h (FT_Err_Array_Too_Large): New error + code. + + * include/freetype/internal/ftmemory.h (FT_DEBUG_INNER) + [FT_DEBUG_MEMORY]: New macro. + (ft_mem_realloc, ft_mem_qrealloc): Pass new object size count also. + (ft_mem_alloc_debug, ft_mem_qalloc_debug, ft_mem_realloc_debug, + ft_mem_qrealloc_debug, ft_mem_free_debug): Removed. + (FT_MEM_ALLOC, FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, + FT_MEM_FREE): Redefine. + (FT_MEM_NEW_ARRAY, FT_MEM_RENEW_ARRAY, FT_MEM_QNEW_ARRAY, + FT_MEM_QRENEW_ARRAY): Redefine. + (FT_ALLOC_MULT, FT_REALLOC_MULT, FT_MEM_QALLOC_MULT, + FT_MEM_QREALLOC_MULT): New macros. Update callers where + appropriate. + (FT_MEM_SET_ERROR): Slightly redefine. + + + * src/base/ftdbgmem.c (_ft_debug_file, _ft_debug_lineno) + [FT_DEBUG_MEMORY]: New global variables, replacing... + (FT_MemTable_Rec) [FT_DEBUG_MEMORY]: Remove `filename' and + `line_no'. Update all callers. + (ft_mem_debug_alloc) [FT_DEBUG_MEMORY]: Avoid possible integer + overflow. + (ft_mem_alloc_debug, ft_mem_realloc_debug, ft_mem_qalloc_debug, + ft_mem_qrealloc_debug, ft_mem_free_debug): Removed. + + * src/base/ftmac.c (read_lwfn): Catch integer overflow. + * src/base/ftrfork.c (raccess_guess_darwin_hfsplus): Ditto. + * src/base/ftutil.c: Remove special code for FT_STRICT_ALIASING. + (ft_mem_alloc, ft_mem_realloc, ft_mem_qrealloc): Rewrite. + + + * include/freetype/ftstream.h (FT_FRAME_ENTER, FT_FRAME_EXIT, + FT_FRAME_EXTRACT, FT_FRAME_RELEASE): Use FT_DEBUG_INNER to report the + place where the frames were entered, extracted, exited or released + in the memory debugger. + + * src/base/ftstream.c (FT_Stream_ReleaseFrame) [FT_DEBUG_MEMORY]: + Call ft_mem_free. + (FT_Stream_EnterFrame) [FT_DEBUG_MEMORY]: Use ft_mem_qalloc. + (FT_Stream_ExitFrame) [FT_DEBUG_MEMORY]: Use ft_mem_free. + +2006-04-30 suzuki toshiya + + * src/base/ftobjs.c (Mac_Read_POST_Resource): Correct pfb_pos + initialization, remove extra cast to copy to pfb_lenpos. This fixes + parsing of PFB fonts with MacOS resource fork (bug introduced + 2003-09-11). Patch provided by Huib-Jan Imbens . + +2006-04-29 Werner Lemberg + + Further C library abstraction. Based on a patch from + msn2@bidyut.com. + + * include/freetype/config/ftstdlib.h (FT_CHAR_BIT, FT_FILE, + ft_fopen, ft_fclose, ft_fseek, ft_ftell, ft_fread, ft_smalloc, + ft_scalloc, ft_srealloc, ft_sfree, ft_labs): New wrapper macros for + C library functions. Update all users accordingly (and catch some + other places where the C library function was used instead of the + wrapper functions). + + * src/base/ftsystem.c: Don't include stdio.h and stdlib.h. + * src/gzip/zutil.h [MSDOS && !(__TURBOC__ || __BORLANDC__)]: Don't + include malloc.h. + + + * builds/unix/unix-def.in (datarootdir): Define, for autoconf 2.59c + and forthcoming versions. + +2006-04-28 Werner Lemberg + + * src/lzw/ftlzw.c, src/lzw/zopen.c, src/lzw/zopen.h: Removed, + obsolete. + +2006-04-27 yi luo + + * builds/win32/visualc/freetype.vcproj: Updated. + +2006-04-26 David Turner + + + * Version 2.2 released. + ======================= + + + Tag sources with `VER-2-2-0'. + +2006-04-26 Werner Lemberg + + * src/psaux/psobjs.c (shift_elements): Don't use FT_Long but + FT_PtrDiff for `delta'. Reported by Céline PILLET + . + +2006-04-21 David Turner + + * include/freetype/ftincrem.h: Documentation updates. + (FT_Incremental_Interface): New typedef. + + * include/freetype/ftmodapi.h, include/freetype/ftglyph.h: + Documentation updates. + + * include/freetype/freetype.h: Documentation update. + (FT_HAS_FAST_GLYPHS): Always set to 0. + + * include/freetype/ftstroke.h, src/base/ftstroke.c (FT_Stroker_New): + Take an FT_Library argument instead of FT_Memory. + + * src/sfnt/ttcmap.c: Remove compiler warnings (gcc-4.0.2). + +2006-04-13 David Turner + + * src/autofit/afloader.c (af_loader_init, af_loader_load_g): Remove + superfluous code in the auto-fitter's loader. + +2006-04-05 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile: Added FT2_BUILD_LIBRARY define. + +2006-04-03 luoyi + + * builds/compiler/intelc.mk (TE): New variable. + (ANSIFLAGS): Updated. + +2006-04-03 Werner Lemberg + + * builds/exports.mk (clean_symbols_list, clean_apinames): Removed. + (CLEAN): Add $(EXPORTS_LIST) and $(APINAMES_EXE). + (.PHONY): Updated. + + * configure.ac: Minor fixes to improve --help output. + + + * docs/PROBLEMS: New file. + +2006-04-01 David Turner + + * docs/CHANGES: Updated. + + * include/freetype/ftcache.h, include/freetype/config/ftheader.h: + Update documentation comments. + +2006-04-01 Werner Lemberg + + * builds/unix/install.mk (uninstall): Don't handle `cache' + directory which no longer exists. + +2006-03-29 Detlef Würkner + + * src/psaux/psconv.c: Changed some variables which are expected to + hold negative values from `char' to `FT_Char' to allow building with + a compiler where `char' is unsigned by default. + +2006-03-27 David Turner + + * src/sfnt/ttkern.c (tt_face_get_kerning): Fix a serious bug that + causes some programs to go into an infinite loop when dealing with + fonts that don't have a properly sorted kerning sub-table. + +2006-03-26 Werner Lemberg + + * src/bdf/bdflib.c (ERRMSG4): New macro. + (_bdf_parse_glyphs): Handle invalid BBX values. + + * include/freetype/fterrdef.h (FT_Err_Bbx_Too_Big): New error + macro. + +2006-03-23 Werner Lemberg + + * docs/CHANGES: Updated. + + + * src/tools/docmaker/tohtml.py (html_header_2): Add horizontal + padding between table elements. + (html_header_1): The `DOCTYPE' comment must be in uppercase. + (make_html_para): Convert `...' quotations into real left and + right single quotes. + Use `para_header' and `para_footer'. + + * src/tools/docmaker/sources.py (re_bold, re_italic): Accept "'" + also. + +2006-03-23 David Turner + + Add FT_Get_SubGlyph_Info API to retrieve subglyph data. Note that + we do not expose the FT_SubGlyphRec structure. + + * include/freetype/internal/ftgloadr.h (FT_SUBGLYPH_FLAGS_*): Moved + to... + * include/freetype/freetype.h (FT_SUBGLYPH_FLAGS_*): Here. + (FT_Get_SybGlyph_Info): New declaration. + + * src/base/ftobjs.c (FT_Get_SubGlyph_Info): New function. + + + * src/autofit/afloader.c (af_loader_load_g): Compute lsb_delta and + rsb_delta correctly in edge cases. + +2006-03-22 Werner Lemberg + + * src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup) + [!FTC_INLINE]: Compile conditionally. + * src/cache/ftccache.h: Updated. + + * src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily, + FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New): + s/FT_EXPORT/FT_LOCAL/. + (FTC_GCache_Init, FTC_GCache_Done): Commented out. + (FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally. + s/FT_EXPORT/FT_LOCAL/. + * src/cache/ftcglyph.h: Updated. + + * src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New): + s/FT_EXPORT/FT_LOCAL/. + (FTC_INode_Weight): Commented out. + * src/cache/ftcimage.h: Updated. + + * src/cache/ftmanag.c (FTC_Manager_Compress, + FTC_Manager_RegisterCache, FTC_Manager_FlushN): + s/FT_EXPORT/FT_LOCAL/. + * src/cache/ftmanag.h: Updated. + + * src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New, + FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/. + (FTC_SNode_Weight): Commented out. + * src/cache/ftcsbits.h: Updated. + +2006-03-22 Werner Lemberg + + * src/cache/ftccache.c, src/cache/ftccache.h (FTC_Node_Destroy): + Remove, unused. + + * src/cache/ftccmap.h: Remove, unused. + + * src/cache/rules.mk (CACHE_DRV_H): Remove ftccmap.h. + +2006-03-21 Zhe Su + + * src/base/ftoutln.c (FT_Outline_Get_Orientation): Improve + algorithm. + +2006-03-21 Werner Lemberg + + * src/cff/cfftypes.h (CFF_CharsetRec): Add `max_cid' member. + + * src/cff/cffload.c (cff_charset_load): Set `charset->max_cid'. + + * src/cff/cffgload.c (cff_slot_load): Change type of third parameter + to `FT_UInt'. + Check range of `glyph_index'. + * src/cff/cffgload.h: Updated. + + + * src/sfnt/ttcmap.c (tt_face_build_cmaps): Handle invalid offset + correctly. + + + * builds/freetype.mk (refdoc), docs/CHANGES, Jamfile (RefDoc), + README: s/2.1.10/2.2/. + +2006-03-21 David Turner + + * src/autofit/aflatin.c (af_latin_metrics_scale): Fix small bug + that crashes the auto-hinter (introduced by previous patch). + +2006-03-20 Werner Lemberg + + * builds/freetype.mk (CACHE_DIR, CACHE_H): Remove. + (FREETYPE_H): Updated. + + * src/cache/rules.mk (CACHE_H_DIR): Remove. + (CACHE_DRV_H): Updated. + +2006-03-20 David Turner + + * include/freetype/cache/ftccache.h, + include/freetype/cache/ftccmap.h, include/freetype/cache/ftcglyph.h + include/freetype/cache/ftcimage.h include/freetype/cache/ftcmanag.h + include/freetype/cache/ftcmru.h include/freetype/cache/ftcsbits.h: + Move to... + + * src/cache/ftccache.h, src/cache/ftcglyph.h, src/cache/ftcimage.h, + src/cache/ftcsbits.h, src/cache/ftcmanag.h, src/cache/ftccmap.h, + src/cache/ftcmru.h: This new location. + Update declarations according to the changes in the corresponding + source files. + + Note that these files are not used by FreeType clients; all public + APIs of the cache module have been already moved to + `include/freetype/ftcache.h', and all FT_CACHE_INTERNAL_XXXX_H + macros resolve to it. + + Reason for the move is to allow modifications of the internals + without interferences with rogue clients. Note that there are no + known clients that access the cache internals at the moment. + + * builds/unix/install.mk (install): Don't install headers from + $(CACHE_H). + Remove `freetype/cache' from the target directory. + + * include/freetype/config/ftheader.h (FT_CACHE_MANAGER_H, + FT_CACHE_INTERNAL_MRU_H, FT_CACHE_INTERNAL_MANAGER_H, + FT_CACHE_INTERNAL_CACHE_H, FT_CACHE_INTERNAL_GLYPH_H, + FT_CACHE_INTERNAL_IMAGE_H, FT_CACHE_INTERNAL_SBITS_H): Point to + FT_CACHE_H. + + * src/cache/ftcbasic.c, src/cache/ftccache.h, src/cache/ftccback.h, + src/cache/ftccmap.c, src/cache/ftcglyph.c, src/cache/ftcglyph.h, + src/cache/ftcimage.c, src/cache/ftcimage.h, src/cache/ftcmanag.c, + src/cache/ftcmanag.h, src/cache/ftcmru.h, src/cache/ftcsbits.c, + src/cache/ftcsbits.h: Don't use the FT_CACHE_INTERNAL_XXX_H macros + but include the headers directly (which are now in `src/cache'). + + * src/cache/ftccache.c: Don't use the FT_CACHE_INTERNAL_XXX_H + macros but include the headers directly. + (FTC_Cache_Init, FTC_Cache_Done, FTC_Cache_NewNode, + FTC_Cache_Lookup, FTC_Cache_RemoveFaceID): Declare as FT_LOCAL_DEF. + + * src/cache/ftccache.c: Don't use the FT_CACHE_INTERNAL_XXX_H + macros but include the headers directly. + (FTC_MruNode_Prepend, FTC_MruNode_Up, FTC_MruNode_Remove, + FTC_MruList_Init, FTC_MruList_Reset, FTC_MruList_Done, + FTC_MruList_New, FTC_MruList_Remove, FTC_MruList_RemoveSelection): + Declare as FT_LOCAL_DEF. + (FTC_MruListFind, FTC_MruList_Lookup) [!FTC_INLINE]: Compile + conditionally. + Declare as FT_LOCAL_DEF. + + + * builds/win32/visualc/freetype.dsp: Update project file, add + missing base source files (ftstroke.c, ftxf86.c, etc.). + + + * src/autofit/afcjk.c, src/autofit/aflatin.c, src/base/ftobjs.c, + src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrobjs.c, + src/sfnt/sfobjs.c, src/sfnt/ttmtx.c, src/type1/t1afm.c, + src/type1/t1objs.c: Remove compiler warnings when building with + Visual C++ 6 and /W4. + + * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal + hinting for italic/oblique fonts. + + + + * src/truetype/ttpload.c, src/truetype/ttpload.h + (tt_face_get_device_metrics): Change second argument to `FT_UInt'. + +2006-03-06 David Turner + + * src/cache/ftcmanag.c (FTC_Manager_Lookup_Size): Prevent crashes in + Mozilla/FireFox print preview in Ubuntu Hoary. + +2006-02-28 Chia-I Wu + + * src/base/ftutil.c (ft_mem_qalloc) [FT_STRICT_ALIASING]: Do not + return error when size == 0. + +2006-02-28 Chia-I Wu + + * src/base/ftobjs.c (FT_Done_Library): Remove modules in reverse + order so that type42 module is removed before truetype module. This + avoids double free in some occasions. + +2006-02-28 David Turner + + * Release candidate VER-2-2-0-RC4. + ---------------------------------- + + * docs/CHANGES: Documentation updates. + +2006-02-28 suzuki toshiya + + * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to + build ftvalid in ft2demos. It works as dummy ABI if gxvalid is not + built. + +2006-02-27 Werner Lemberg + + * include/freetype/cache/ftccache.h + [FT_CONFIG_OPTION_OLD_INTERNALS]: Remove declaration of + ftc_node_done. + + * src/cache/ftccache.c (ftc_node_destroy) + [!FT_CONFIG_OPTION_OLD_INTERNALS]: Mark as FT_LOCAL_DEF. This + should now fix all possible compilation options. + +2006-02-27 David Turner + + * src/base/ftutil.c (ft_mem_alloc, ft_mem_qalloc, ft_mem_realloc, + ft_mem_qrealloc): Return an error if a negative size is passed in + parameters. + + * src/cache/ftccache.c (ftc_node_destroy): Mark as FT_BASE_DEF since + it needs to be exported for rogue clients. + + * src/pshinter/pshglob.c (psh_blues_set_zones_0): Prevent problems + with malformed fonts which have an odd number of blue values (these + are broken according to the specs). + + * src/cff/cffload.c (cff_subfont_load), src/type1/t1load.c + (T1_Open_Face): Modify the loaders to force even-ness of + `num_blue_values'. + + (cff_index_access_element): Ignore invalid entries in index files. + +2006-02-27 Chia-I Wu + + * src/base/ftobjs.c (FT_Set_Char_Size): Check the case where width + or height is 0. + +2006-02-27 suzuki toshiya + + * builds/mac/FreeType.m68k_cfm.make.txt, + builds/mac/FreeType.m68k_far.make.txt, + builds/mac/FreeType.ppc_carbon.make.txt, + builds/mac/FreeType.ppc_classic.make.txt: Update to new header + inclusion introduced on 2006-02-16. + +2006-02-27 Chia-I Wu + + * src/base/ftobjs.c (GRID_FIT_METRICS): New macro. + (ft_glyphslot_grid_fit_metrics, FT_Load_Glyph) [GRID_FIT_METRICS]: + Re-enable glyph metrics grid-fitting. It is now done in the base + layer. + (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Make sure the width and + height are not too small or too large, just like we were doing in + 2.1.10. + + * src/autofit/afloader.c (af_loader_load_g): The vertical metrics + are not scaled. + +2006-02-26 Werner Lemberg + + * docs/release: Minor additions and clarifications. + + * docs/CHANGES: Updated to reflect many fixes for backwards + compatibility. Still incomplete. + +2006-02-26 David Turner + + * src/base/ftobjs.c (ft_recompute_scaled_metrics): Re-enable + conservative rounding of metrics to avoid breaking clients like + Pango (see http://bugzilla.gnome.org/show_bug.cgi?id=327852). + +2006-02-25 Werner Lemberg + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/cache/ftccache.c (ftc_node_destroy): Use FT_LOCAL_DEF (again). + +2006-02-25 David Turner + + Fix compiler warnings as well as C++ compilation problems. + Add missing prototypes. + + * src/autofit/afcjk.c, src/base/ftobjs.c, src/base/ftutil.c, + src/bdf/bdfdrivr.c, src/cff/cffcmap.c, src/cff/cffobjs.c, + src/psaux/afmparse.c,, src/psaux/t1cmap.c, src/smooth/ftgrays.c + src/tools/apinames.c, src/truetype/ttdriver.c: Add various casts, + initialize variables, and decorate functions with FT_CALLBACK_DEF, + etc., to fix compiler warnings (and C++ compiling errors). + + * src/cache/ftcbasic.c: Fix `-Wmissing-prototypes' warnings with + gcc. + + * builds/unix/ftsystem.c: Don't include FT_INTERNAL_OBJECTS_H but + FT_INTERNAL_STREAM_H. + + * src/base/ftsystem.c: Include FT_INTERNAL_STREAM_H. + + * include/freetype/config/ftheader.h (FT_PFR_H): New macro. + + * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): Don't + define for C++. + + * include/freetype/internal/services/svotval.h: Don't include + FT_OPENTYPE_VALIDATE_H but FT_INTERNAL_VALIDATE_H. + + * include/freetype/internal/services/svpfr.h: Include FT_PFR_H. + + * src/gzip/ftgzip.c: Include FT_GZIP_H. + + * src/lzw/ftlzw.c, src/lzw/ftlzw2.c: Include FT_LZW_H. + + * src/sfnt/ttbdf.c (tt_face_load_bdf_props): Rearrange code. + +2006-02-24 Chia-I Wu + + * src/base/ftoutln.c (FT_OUTLINE_GET_CONTOUR, ft_contour_has, + ft_contour_enclosed, ft_outline_get_orientation): Commented out. We + have to wait until `FT_GlyphSlot_Own_Bitmap' is stabilized. + (FT_Outline_Embolden): Use `FT_Outline_Get_Orientation'. + +2006-02-24 Chia-I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Update + documentation. + + * include/freetype/ftsynth.h (FT_GlyphSlot_Own_Bitmap), + src/base/ftsynth.c (FT_GlyphSlot_Own_Bitmap): New function to make + sure a glyph slot owns its bitmap. It is also marked experimental + and due to change. + (FT_GlyphSlot_Embolden): Undo the last change. It turns out that + rendering the outline confuses some applications. + +2006-02-24 David Turner + + * Release candidate VER-2-2-0-RC3. + ---------------------------------- + + * src/cache/ftcbasic.c: Correct compatibility hack bug. + +2006-02-24 Chia-I Wu + + * include/freetype/freetype.h (FT_Size_RequestRec): Change the type + of `width' and `height' to `FT_Long'. + (enum FT_Size_Request_Type), src/base/ftobjs.c (FT_Request_Metrics): + New request type `FT_SIZE_REQUEST_TYPE_SCALES' to specify the scales + directly. + +2006-02-23 David Turner + + Two BDF patches from Debian libfreetype6 for 2.1.10. + + * src/bdf/bdflib.c (_bdf_parse_glyphs): Fix a bug with zero-width + glyphs. + Fix a problem with large encodings. + + + Fix binary compatibility issues for gnustep-back (GNUstep backend + module) which still crashes under Sarge. + + * src/cache/ftccmap.c (FTC_OldCMapType, FTC_OldCMapIdRec, + FTC_OldCMapDesc) [FT_CONFIG_OPTION_OLD_INTERNALS]: New data + structures and enumerations. + (FTC_CMapCache_Lookup) [FT_CONFIG_OPTION_OLD_INTERNALS]: New + compatibility code. + + * src/cache/ftcbasic.c: Fix a silly bug that prevented our `hack' to + support rogue clients compiled against 2.1.7 to work correctly. + This probably explains the GNUstep crashes with the second release + candidate. + +2006-02-23 Chia-I Wu + + * include/freetype/ftoutln.h (enum FT_Orientation): New value + `FT_ORIENTATION_NONE'. + + * src/base/ftoutln.c (FT_OUTLINE_GET_CONTOUR, ft_contour_has, + ft_contour_enclosed, ft_outline_get_orientation): Another version of + `FT_Outline_Get_Orientation'. This version differs from the public + one in that each part (contour not enclosed in another contour) of the + outline is checked for orientation. + (FT_Outline_Embolden): Use `ft_outline_get_orientation'. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Render the outline and + use bitmap's embolden routine when the outline one failed. + +2006-02-22 Chia-I Wu + + * modules.cfg: Compile in ftotval.c and ftxf86.c by default for ABI + compatibility. + + * src/sfnt/sfobjs.c (sfnt_done_face): Fix a memory leak. + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned, + tt_sbit_decoder_load_byte_aligned) [FT_OPTIMIZE_MEMORY]: Fix sbit + loading. (Only tested with bit aligned sbit with x_pos == 0.) + + * src/truetype/ttpload.c (tt_face_load_hdmx, + tt_face_get_device_metrics) [FT_OPTIMIZE_MEMORY]: `hdmx' is not + actually used. + +2006-02-21 David Turner + + Add a new API named FT_Get_TrueType_Engine_Type to determine whether + we have a patented, unpatented, or unimplemented TrueType bytecode + interpreter. + + The FT_Get_Module_Flags API was removed consequently. + + * include/freetype/ftmodapi.h (FT_Module_Get_Flags): Removed. + Replaced with... + (FT_Get_TrueType_Engine_Type): This. + (FT_TrueTypeEngineType): New enumeration. + + * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_ENGINE_H): + New macro. + + * src/base/ftobjs.c: Include FT_SERVICE_TRUETYPE_ENGINE_H. + (FT_Module_Get_Flags): Removed. Replaced with... + (FT_Get_TrueType_Engine_Type): This. + + * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_ENGINE_H. + (tt_service_truetype_engine): New service structure. + (tt_services): Register it. + + * include/freetype/internal/services/svtteng.h: New file. + + + * src/sfnt/sfobjs.c (sfnt_load_face): Fix silly bug that prevented + embedded bitmaps from being correctly listed and used. + + + * src/sfnt/ttmtx.c (tt_face_load_hmtx): Disable memory optimization + if FT_CONFIG_OPTION_OLD_INTERNALS is used. The is necessary because + libXfont is directly accessing the HMTX data, unfortunately. + Fix some compiler warnings. + (tt_face_get_metrics): Ditto. + + + * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Fix handling of + character advances. + +2006-02-20 David Turner + + Support binary compatibility with the X.Org server's Xfont library. + Note that this change unfortunately prevents memory optimizations + for the embedded bitmap loader. + + * include/freetype/internal/sfnt.h (SFNT_Interface): Move + `set_sbit_strike' and `load_sbit_metrics' fields to the location of + version 2.1.8. + + * src/sfnt/sfdriver.c (tt_face_set_sbit_strike_stub): Call + FT_Size_Request. + (sfnt_interface): Updated. + + * src/sfnt/ttsbit.c [FT_CONFIG_OPTION_OLD_INTERNALS]: Don't load + ttsbit0.c. + (tt_load_sbit_metrics): Make `sbit_small_metrics_fields' static. + + * src/sfnt/ttsbit.h: Updated. + +2006-02-17 David Turner + + * builds/unix/unix-cc.in (LINK_LIBRARY): Don't filter out exported + functions anymore. This ensures that all FT_BASE internal functions + are available for dynamic linking. + + * include/freetype/ftcache.h (FTC_IMAGE_TYPE_COMPARE, + FTC_IMAGE_TYPE_HASH), src/cache/ftcbasic.c (FTC_OldFontRec, + FTC_OldImageDescRec, FTC_ImageCache_Lookup, FTC_Image_Cache_New, + FTC_OldImage_Desc, FTC_OLD_IMAGE_FORMAT, ftc_old_image_xxx, + ftc_image_type_from_old_desc, FTC_Image_Cache_Lookup, + FTC_SBitCache_Lookup, FTC_SBit_Cache_New, FTC_SBit_Cache_Lookup) + [FT_CONFIG_OPTION_OLD_INTERNALS]: Try to revive old functions of the + cache sub-system. We try to recognize old legacy signatures with a + gross hack (hope it works). + +2006-02-17 Werner Lemberg + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + +2006-02-16 David Turner + + Massive changes to the internals to respect the internal object + layouts and exported functions of FreeType 2.1.7. Note that the + cache sub-system cannot be fully retrofitted, unfortunately. + + * include/freetype/config/ftoption.h + (FT_CONFIG_OPTION_OLD_INTERNALS): New macro. + + * include/freetype/ftcache.h, include/freetype/cache/ftccache.h, + include/freetype/cache/ftccmap.h, + include/freetype/internal/ftcalc.h, + include/freetype/internal/ftdriver.h, + include/freetype/internal/ftmemory.h, + include/freetype/internal/ftobjs.h, + include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h, + include/freetype/internal/t1types.h, + include/freetype/internal/tttypes.h, src/base/ftcalc.c, + src/base/ftdbgmem.c, src/base/ftobjs.c, src/base/ftutil.c, + src/bdf/bdfdrivr.c, src/cache/ftccache.c, src/cache/ftccback.h, + src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c, + src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c, + src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c, + src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c: + Use FT_CONFIG_OPTION_OLD_INTERNALS to revive old functions and data + structures. + + Move newly added structure elements to the end of the affected + structure and add stub fields (if FT_CONFIG_OPTION_OLD_INTERNALS is + defined) to assure binary compatibility with older FreeType + versions. + Use FT_CONFIG_OPTION_OLD_INTERNALS to add function stubs for old + functions: + + ft_stub_set_char_sizes + ft_stub_set_pixel_sizes + + Rename the following internal functions to provide the old function + names as stubs: + + FT_Alloc -> ft_mem_alloc + FT_QAlloc -> ft_mem_qalloc + FT_Realloc -> ft_mem_realloc + FT_QRealloc -> ft_mem_qrealloc + FT_Free -> ft_mem_free + FT_Alloc_Debug -> ft_mem_alloc_debug + FT_QAlloc_Debug -> ft_mem_qalloc_debug + FT_Realloc_Debug -> ft_mem_realloc_debug + FT_QRealloc_Debug -> ft_mem_qrealloc_debug + FT_Free_Debug -> ft_mem_free_debug + +2006-02-15 Chia-I Wu + + * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove + unused `max_points' and `max_contours'. + + * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c + (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update. + + * include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused + `max_components'. + + * src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused + `loadSize' and `loadStack'. + + * src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context), + src/sfnt/ttload.c (tt_face_load_maxp): Update. + + * src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c + (sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix + compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not + defined. + + * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix + possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions. + (finally!) + + + For most OpenType tables, `tt_face_load_xxxx' simply loads the table + and `face->root' is set later in `sfnt_load_face'. Here, we try to + make this work for _all_ tables. Also improve tracing messages. + + * src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c, + src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and + then exit. Error handling or setting face->root is done later in + `sfnt_load_face'. + + * src/sfnt/sfobjs.c (sfnt_load_face): Work harder. + Mac bitmap-only fonts are not scalable. + Check that `face->header.Units_Per_EM' is not zero. + (LOAD_, LOADM_): Emit pretty trace messages. + + * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics + from `eblc'. + + * src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c + (load_format_20, load_format_25, tt_face_get_ps_name): Use + face->max_profile.numGlyphs, instead of face->root.num_glyphs. + +2006-02-14 Werner Lemberg + + * include/freetype/ftoutln.h (FT_Outline_Embolden): Mention in + documentation that negative strength values are possible. + Give an example call. + + * include/freetype/freetype.h (FT_GlyphSlotRec): Improve + documentation of `outline' field. + + * src/sfnt/sfobjc.s: Inckude FT_INTERNAL_DEBUG_H. + * src/sfnt/sfdriver.c: Include ttmtx.h. + + * src/autofit/afcjk.c: Include aftypes.h and aflatin.h. + +2006-02-14 Chia-I Wu + + * src/sfnt/ttmtx.c (tt_face_get_metrics): Typo. + +2006-02-14 Chia-I Wu + + * src/sfnt/ttmtx.c (tt_face_load_hhea, tt_face_load_hmtx): Simply + return error if table is missing. + Check table length in non-FT_OPTIMIZE_MEMORY'ed `tt_face_load_hmtx'. + + * src/sfnt/sfobjs.c (sfnt_load_face): Take care of missing metrics + tables. The last change makes Mac bitmap-only font not load and + this fixes it. + + * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation + error when FT_CONFIG_OPTION_INCREMENTAL is defined. + +2006-02-13 Chia-I Wu + + Clean up the SFNT_Interface. In this final pass, `load_hmtx' is + split from `load_hhea'. + + * include/freetype/internal/sfnt.h, src/sfnt/sfdriver.c, + src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: Split `hmtx' from `hhea'. + + * src/sfnt/sfobjs.c (sfnt_load_face): Update. + +2006-02-13 Chia-I Wu + + * src/sfnt/ttmtx.h, src/sfnt/ttmtx.c: Why are there two copies of + code... + +2006-02-13 Chia-I Wu + + Clean up the SFNT_Interface. In this pass, we want to treat the + font directory (offset table and table directory) as a normal table + like the others. This also means that TTCs are no longer recognized + there but in `init_face'. + + * include/freetype/internal/sfnt.h (SFNT_Interface), + src/sfnt/sfdriver.c: `load_sfnt_header' and `load_directory' are + combined and renamed to `load_font_dir'. + + * src/sfnt/ttload.h, src/sfnt/ttload.c: + s/sfnt_dir_check/check_table_dir/. + `sfnt_init' is moved to sfobjs.c and renamed to `sfnt_open_font'. + `tt_face_load_sfnt_header' and `tt_face_load_directory' are combined + and renamed to `tt_face_load_font_dir'. + + * src/sfnt/sfobjs.c (sfnt_init_face): Recognize TTC here. + +2006-02-13 Chia-I Wu + + Clean up the SFNT_Interface. Table loading functions are now named + after the tables' tags; `hdmx' is TrueType-specific and thus the + code is moved to the truetype module; `get_metrics' is moved here + from the truetype module so that the code can be shared with the cff + module. + + This pass involves no real changes. That is, the code is moved + verbatim mostly. The only exception is the return value of + `tt_face_get_metrics'. + + * include/freetype/internal/sfnt.h, src/sfnt/rules.mk, + src/sfnt/sfdriver.c, src/sfnt/sfnt.c, src/sfnt/sfobjs.c, + src/sfnt/ttload.c, src/sfnt/ttload.h, src/sfnt/ttsbit.c, + src/sfnt/ttsbit.h, src/sfnt/ttsbit0.c: Clean up the SFNT_Interface. + + * src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: New files. Metrics-related + tables' loading and parsing code is moved to here. + Move `tt_face_get_metrics' here from the truetype module. The + return value is changed from `void' to `FT_Error'. + + * include/freetype/internal/fttrace.h: New trace: ttmtx. + + * src/truetype/ttpload.c, src/truetype/ttpload.h: `hdmx' loading and + parsing code is moved here. + New function `tt_face_load_prep' split from `tt_face_load_fpgm'. + `tt_face_load_fpgm' returns `FT_Err_Ok' if `fpgm' doesn't exist. + + * src/cff/cffgload.c, src/cff/cffobjs.c: Update. + + * src/truetype/ttgload.c, src/truetype/ttobjs.c: Update. + +2006-02-11 Chia-I Wu + + * src/autofit/afcjk.c (af_cjk_metrics_init): Fix a stupid bug... + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Use + AF_LatinMetricsRec as the dummy metrics because we cast the metrics + to it later in `af_latin_hints_link_segments'. + +2006-02-11 Chia-I Wu + + * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_CJK): #define + to enable autofit CJK script support. (#define'd by default.) + + * src/autofit/aflatin.h (AF_LATIN_CONSTANT): New macro. + + * src/autofit/aflatin.c (af_latin_metrics_init_widths): Make sure + that `edge_distance_threshold' is always set. + (af_latin_hints_link_segments): Potential divide-by-zero bug. + Use latin constant in the scoring formula. + + * src/autofit/afcjk.c: Minor updates due to the above three changes. + + * docs/TODO, docs/CHANGES: Updated. + +2006-02-09 Chia-I Wu + + Introduce experimental autofit CJK module based on akito's autohint + patch. You need to #define AF_MOD_CJK in afcjk.c to enable it. + + * src/autofit/afglobal.c, src/autofit/afcjk.h, src/autofit/afcjk.c, + src/autofit/rules.mk, src/autofit/autofit.c, src/autofit/aftypes.h: + Add CJK module based on akito's autohint patch. + + * src/autofit/afhints.h (AF_SegmentRec): New field `len' for the + overlap length of the segments. + (AF_SEGMENT_LEN, AF_SEGMENT_DIST): New macros. + + * src/autofit/aflatin.h (af_latin_metrics_init_widths), + src/autofit/aflatin.c (af_latin_metrics_init_widths): Made + `FT_LOCAL'. + Use the character given by the caller. + (af_latin_metrics_init_widths, af_latin_hints_link_segments): Scale + the thresholds. + + * src/autofit/afloader.c (af_loader_load_g): Respect + AF_SCALER_FLAG_NO_ADVANCE. + +2006-02-09 Werner Lemberg + + * src/cid/cidparse.c (cid_parse_new): Remove shadowing variable. + +2006-02-09 suzuki toshiya + + * src/cid/cidparse.c (cid_parse_new): Fix for abnormally short or + broken CIDFont. Reported by Taek Kwan(TK) Lee (see ft-devel + 2005-11-02). + +2006-02-08 suzuki toshiya + + * builds/unix/configure.ac: Fix bug for `--with-old-mac-fonts' + option on UNIX platform. It has been broken since 2006-01-11. + +2006-02-01 Werner Lemberg + + * src/otvalid/module.mk: s/otvalid_module_class/otv_module_class/. + * src/gxvalid/module.mk: s/gxvalid_module_class/gxv_module_class/. + + * builds/unix/unixddef.mk: Actually do define PLATFORM (fixing + change from 2006-01-31). + (TOP_DIR, OBJ_DIR): Update. + + * builds/unix/install.mk (install): Fix path for ftmodule.h. + + * Makefile, *.mk, builds/unix/unix-cc.in, builds/unix-def.in: Use + `?=' where appropriate. + + * builds/detect.mk (TOP_DIR), builds/os2/os2-dev.mk (TOP_DIR), + builds/win32/w32-dev.mk (TOP_DIR): Removed. Defined elsewhere. + +2006-01-31 Werner Lemberg + + Implement new, simplified module selection. With GNU make it is now + sufficient to modify a single file, `modules.cfg', to control the + inclusion of modules and base extension files. + + This change also fixes the creation of ftmodule.h; it now depends on + `modules.cfg' and thus is rebuilt only if necessary. + + Finally, a version of `ftoption.h' in OBJ_DIR is preferred over the + default location. + + * modules.cfg: New file. + + * builds/freetype.mk: Don't include `modules.mk'. + Include all `rules.mk' files as specified in `modules.cfg'. + (FTOPTION_FLAG, FTOPTION_H): New variables. + (FT_CFLAGS): Add macro definition for FT_CONFIG_MODULES_H. + Add FTOPTION_FLAG. + ($(FT_INIT_OBJ)): Don't use FT_MODULE_LIST. + (CONFIG_H): Add FTMODULE_H and FTOPTION_H. + (INCLUDES): Add DEVEL_DIR. + (INCLUDE_FLAGS, FTSYS_SRC, FTSYS_OBJ, FTDEBUG_SRC, FTDEBUG_OBJ, + OBJ_M, OBJ_S): Use `:=', not `='. + (remove_ftmodule_h): New phony target to delete `ftmodule.h'. + (distclean): Add remove_ftmodule_h. + + * builds/modules.mk: (MODULE_LIST): Removed. + (make_module_list, clean_module_list): Replace targets + with... + (FTMODULE_H_INIT, FTMODULE_H_CREATE, FTMODULE_H_DONE): New + variables. Reason for the change is that it is not possible to have + a phony prerequisite which is run only if the target file must be + rebuilt (phony prerequisites act like subroutines and are *always* + executed). We only want to rebuild `ftmodule.h' if `module.cfg' is + changed. + Update all callers. + ($FTMODULE_H)): Rule to create `ftmodule.h', depending on + `modules.cfg'. + + * builds/toplevel.mk: Rewrite and simplify module handling. + (MODULES_CFG, FTMODULE_H): New variables. + Include MODULES_CFG. + (MODULES): New variable to include all `module.mk' and `rules.mk' + files. We no longer use make's `wildcard' function for this. + + * Makefile (USE_MODULES): Remove. Update all users. + (OBJ_DIR): Define it here. + + * src/*/module.mk: Change + + make_module_list: foo + foo: ... + + to + + FTMODULE_H_COMMANDS += FOO + define FOO + ... + endef + + in all files. `FTMODULE_H_COMMANDS' is used in `FTMODULE_H_CREATE'. + + * src/base/rules.mk (BASE_EXT_SRC): Use BASE_EXTENSIONS. + + * builds/unix/detect.mk (setup): Always execute `configure' script. + (have_mk): Rename to... + (have_Makefile): This. + Don't use `strip' function. + + * builds/unix/unix.mk: Include `install.mk' only if BUILD_PROJECT is + defined. + (have_mk): Don't use `strip' function. + Test for unix-def.mk in OBJ_DIR, not BUILD_DIR (and invert the test + accordingly). + + * builds/unix/install.mk (install, uninstall): Handle `ftmodule.h'. + + * builds/os2/os2-dev.mk, builds/unix/unix-dev.mk, + builds/win32/w32-bccd.mk, builds/win32/w32-dev.mk: Don't define + BUILD_DIR but DEVEL_DIR for development header files. + + * builds/ansi/ansi-def.mk (TOP_DIR, OBJ_DIR), + builds/beos/beos-def.mk (TOP_DIR, OBJ_DIR), builds/unix/unix-def.in + (TOP_DIR, OBJ_DIR): Removed. Defined elsewhere. + + * builds/dos/dos-def.mk (OBJ_DIR), builds/os2/os2-def.mk (OBJ_DIR), + builds/win32/win32-def.mk (OBJ_DIR): Removed. Defined elsewhere. + + * builds/unix/unixddef.mk: Don't define BUILD_DIR but DEVEL_DIR for + development header files. + Don't define PLATFORM. + + * configure: Copy `modules.cfg' to builddir if builddir != srcdir. + Update snippet taken from autoconf's m4sh.m4 to current CVS version. + Be more verbose. + + * include/freetype/config/ftmodule.h: Add comments -- this file is + no longer used if FreeType is built with GNU make. + + * docs/CHANGES, docs/CUSTOMIZE, docs/INSTALL, docs/INSTALL.ANY, + docs/INSTALL.GNU, docs/INSTALL.UNX: Document new build mechanism. + Other minor updates. + + * modules.txt: Removed. Contents included in `modules.cfg'. + + + * include/freetype/internal/ftmemory.h (FT_QAlloc_Debug, + FT_Free_Debug) [FT_STRICT_ALIASING]: Fix typos. + + * src/base/ftdbgmem.c (FT_Alloc_Debug, FT_Realloc_Debug, + FT_QAlloc_Debug, FT_QRealloc_Debug, FT_Free_Debug) + [FT_STRICT_ALIASING]: Implement. + +2006-01-31 Chia-I Wu + + * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c + (cid_face_init), src/pfr/pfrobjs.c (pfr_face_init), + src/type1/t1objs.c (T1_Face_Init): Set face->height to MAX(1.2 * + units_per_EM, ascender - descender). + +2006-01-31 Chia-I Wu + + * include/freetype/internal/t1types.h (AFM_FontInfo), + src/psaux/afmparse.c, src/tools/test_afm.c: Read `FontBBox', + `Ascender', and `Descender' from an AFM. + + * src/type1/t1afm.c (T1_Read_Metrics): Use the metrics from the AFM. + + * include/freetype/freetype.h (FT_FaceRec): Mention that fields may + be changed after file attachment. + +2006-01-28 Werner Lemberg + + * src/*/module.mk (.PHONY): Add. + +2006-01-27 Werner Lemberg + + * README, docs/FTL.TXT: Fix email address for bug reports. + Other minor formatting. + + * devel/ftoption.h: Synchronize with + include/freetype/config/ftoption.h. + + * src/autofit/module.mk (add_autofit_module), src/bdf/module.mk + (add_bdf_module), src/type42/module.mk (add_type42_driver): Fix + whitespace. + + * src/smooth/module.mk (add_smooth_renderer): Add lcd and lcdv + renderer classes. + +2006-01-27 David Turner + + * builds/unix/configure.ac: Fix build problem on Cygwin. + + * builds/unix/install.mk (install): Don't install the internal + headers, and remove existing ones if found in the target install + directory. + + * src/autofit/afwarp.c: Add simple #ifdef to prevent compilation + if the warp hinter isn't active (it shouldn't, still experimental). + + * Jamfile, include/freetype/config/ftmodule.h: Remove `gxvalid' + and `otvalid' from the list of modules that are linked statically + to a given FreeType library. Functionality has been moved to the + `ftvalid' CVS module. + + Note also that current Make-based build system still compiles the + modules though. + + * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): New macro + which controls the definitions of the memory management functions to + avoid warnings with recent versions of GCC. This macro is only here + to be disabled, in case we detect problems with the new scheme. + + NOTE: Disable macro to use the memory debugger -- this will be fixed + later! + + * include/freetype/internal/ftmemory.h, src/base/ftutil.c (FT_Alloc, + FT_QAlloc, FT_Realloc, FT_QRealloc, FT_Free) [FT_STRICT_ALIASING]: + New versions. + + + * builds/win32/visualc/freetype.dsp: Updating project file to + define FT2_BUILD_LIBRARY, and remove gxvalid + otvalid modules from + compilation. + + + * builds/freetype.mk (FT_CFLAGS), Jamfile (DEFINES): Define the + macro FT2_BUILD_LIBRARY when compiling the library. + + * include/freetype/config/ftheader.h: Remove inclusions of internal + headers except if the macro FT2_BUILD_LIBRARY is defined. + + + * include/freetype/internal/psaux.h (AFM_KernPair, AFM_TrackKern, + AFM_FontInfo): Move structure declarations to... + * include/freetype/internal/t1types.h: This file. + + + * (many files): Fix compiler warnings. + Various minor reorganizations. + + + * src/cff/cffload.c (cff_font_done): Don't free static array + `subfonts'. + + * src/otvalid/otvcommn.c (otv_ClassDef_validate), + src/otvalid/otvgpos.c (otv_x_sxy): Fix debugging information. + + + Get rid of writable static variables (i.e., the string table) in + afmparse, and fix compilation in FT2_MULTI mode. + + * src/psaux/afmparse.c: Include ft2build.h and FT_FREETYPE_H. + (AFM_MAX_ARGUMENTS): Define... + * src/psaux/afmparse.h: Here. + * src/psaux/Jamfile (_sources): Add afmparse. + + * src/psaux/psconv.c: Include psconv.h. + + * src/type1/t1afm.c: Don't include FT_INTERNAL_TYPE1_TYPES_H but + FT_INTERNAL_POSTSCRIPT_AUX_H. + * src/type1/t1afm.h: Include FT_INTERNAL_TYPE1_TYPES_H. + +2006-01-23 Chia-I Wu + + * include/freetype/freetype.h (FT_Select_Size): Rename the second + argument from `idx' to `strike_index'. + (FT_Size_Request_Type): Add FT_SIZE_REQUEST_TYPE_MAX to the end of + this enum. + + * include/freetype/internal/ftobjs.h (FT_REQUEST_WIDTH, + FT_REQUEST_HEIGHT): New macros to get the width and height of a + request, in fractional pixels. + + * include/freetype/internal/ftobjs.h (FT_Select_Metrics, + FT_Request_Metrics), src/base/ftobjs.c (FT_Select_Metrics, + FT_Request_Metrics): New base functions to set the font metrics. They + were part of FT_Select_Size/FT_Request_Size and are made independent + functions so that metrics are not set again and again. + + * src/base/ftobjs.c (FT_Select_Size, FT_Request_Size): Metrics are set + only when driver's size_select/size_request is NULL. That is, drivers + should set the metrics themselves. + (FT_Match_Size): Round before matching. This was what we did and it + does cause some problems without rounding. + + * src/cff/cffobjs.c (cff_size_select), src/truetype/ttdriver.c + (tt_size_select): Set the font metrics. + s/index/strike_index/. + The scaled metrics are always preferred over strikes' metrics, even + when some strike is selected. This is done because the strikes' + metrics are not reliable, e.g., the sign of the descender is wrong for + some fonts. + + * src/cff/cffobjs.c (cff_size_request), src/truetype/ttdriver.c + (tt_size_request): Set the font metrics. + Call cff_size_select/tt_size_select when some strike is matched. + + * src/bdf/bdfdrivr.c, src/cff/cffobjs.c, src/cid/cidobjs.c, + src/pcf/pcfdrivr.c, src/truetype/ttdriver.c, src/type1/t1objs.c, + src/type1/t1objs.h, src/type42/t42objs.c, src/winfonts/winfnt.c: + Set the font metrics. + s/index/strike_index/. + + * src/tools/test_afm.c, src/psaux/psconv.c: Older versions of these + files were committed. Just a catch-up. + (PS_Conv_ToFixed): Remove the `goto'. + (PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Speed up a little. + + * src/sfnt/ttsbit.c (tt_face_load_sbit_strikes, + tt_face_load_strike_metrics), src/sfnt/ttsbit0.c + (tt_face_load_sbit_strikes, tt_face_load_strike_metrics): The + advertised metrics in `available_sizes' are different from those + actually used. + +2006-01-23 Chia-I Wu + + * src/psaux/psaux.c src/psaux/psauxmod.c src/type1/t1driver.c: Make + AFM parser optional, controlled by `T1_CONFIG_OPTION_NO_AFM'. + +2006-01-22 Werner Lemberg + + * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from + `texinfo' CVS module at savannah.gnu.org. + +2006-01-21 Werner Lemberg + + * src/autofit/rules.mk (AUTOF_DRV_SRC): Add afwarp.c. + + * src/autofit/afloader.c (af_loader_load_g): Move AF_USE_WARPER up + to avoid compiler warnings. + + * src/autofit/afwarp.c (af_warper_compute_line_best): Remove + shadowing variable declarations. + Fix warning parameters and replace printf with AF_LOG. + (af_warper_compute): Remove unused variable. + +2006-01-20 David Turner + + Adding experimental implementation of `warp hinting' (new hinting + algorithm for gray-level and LCD rendering). It is disabled by + default, you need to #define AF_USE_WARPER in aftypes.h. + + * src/autofit/afhints.c (af_glyph_hints_scale_dim) [AF_USE_WARPER]: + New function. + * src/autofit/afhints.h: Updated. + + * src/autofit/aflatin.c [AF_USE_WARPER]: Include afwarp.h. + (af_latin_hints_init) [AF_USE_WARPER]: Reset mode to + FT_RENDER_MODE_NORMAL if an LCD mode is selected. + (af_latin_hints_apply) [AF_USE_WARPER]: Call af_warper_compute + appropriately. + + * src/autofit/afloader.c (af_loader_load_g) [!AF_USER_WARPER]: + Isolate code for adjusting metrics. + + * src/autofit/aftypes.h (AF_USE_WARPER): New macro (commented out by + default). + + * src/autofit/afwarp.c, src/autofit/afwarp.h: New files. + + * src/autofit/autofit.c [AF_USE_WARPER]: Include afwarp.c. + + * src/autofit/Jamfile (_sources): Add afwarp. + +2006-01-19 David Turner + + * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Fix small bug + that prevented compilation when FT_OPTIMIZE_MEMORY is defined. + +2006-01-19 Brian Weed + + * builds/win32/visualc/freetype.dsp: Updated. + +2006-01-17 Werner Lemberg + + Use pscmap service in CFF module. + + * src/cff/cffcmap.c (cff_cmap_uni_pair_compare): Removed. + (cff_sid_to_glyph_name): New function. + (cff_cmap_unicode_init, cff_cmap_unicode_done, + cff_cmap_unicode_char_index, cff_cmap_unicode_char next): Use pscmap + service. + (cff_cmap_unicode_class_rec): Updated. + * src/cff/cffcmap.h (CFF_CMapUnicode, CFF_CMap_UniPair): Removed. + + + * src/psnames/psmodule.c (ps_unicodes_char_next): Fix `unicode' + return value. + + + * src/psaux/afmparse.c (afm_parser_read_vals): Use double casting + to avoid compiler warnings regarding type-punning. + +2006-01-16 Chia-I Wu + + * src/psaux/afmparse.c, src/psaux/afmparse.h: New files which + implement an AFM parser. + + * src/psaux/psconv.c, src/psaux/psconv.h: New files to provide + conversion functions (e.g., PS real number => FT_Fixed) for the + PS_Parser and AFM_Parser. Some of the functions are taken, with + some modifications, from the file psobjs.c. + + * src/psaux/psobjs.c: Use functions from psconv.c. + + * include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Add + `AFM_Parser' to the `psaux' service. + + * src/psaux/psaux.c, src/psaux/rules.mk (PSAUX_DRV_SRC): Include + those new files. + + * src/tools/test_afm.c: A test program for AFM parser. + + * include/freetype/internal/services/svkern.h: New file providing a + `Kerning' service. It is currently only used to get the track + kerning information. + + * include/freetype/internal/ftserv.h (FT_SERVICE_KERNING_H): New + macro. + + * src/type1/t1driver.c, src/type1/t1objs.c, src/type1/t1afm.c, + src/type1/t1afm.h: Update to use the AFM parser. + Provide the `Kerning' service. + + * include/freetype/freetype.h, src/base/ftobjs.c: New API + `FT_Get_Track_Kerning'. + +2006-01-15 Chia-I Wu + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c, + src/bdf/bdfdrivr.c, src/cff/cffgload.c, src/cid/cidgload.c, + src/pcf/pcfdrivr.c, src/type1/t1gload.c, src/winfonts/winfnt.c: + s/ft_fake_vertical_metrics/ft_synthesize_vertical_metrics/. + + * docs/CHANGES: Mention that vertical metrics are synthesized for + fonts not having this info. + +2006-01-15 Chia-I Wu + + * include/freetype/internal/ftobjs.h (ft_fake_vertical_metrics), + src/base/ftobjs.c (ft_fake_vertical_metrics): New function to fake + vertical metrics. + + * src/cff/cffgload.c, src/cid/cidgload.c, src/pcf/pcfdrivr.c, + src/type1/t1gload.c, src/winfonts/winfnt.c: Fake vertical metrics, + which are monotone. + + * src/truetype/ttgload.c (compute_glyph_metrics): Some fixes and + formattings in vertical metrics faking. There is still room for + improvements (and so does the CFF module). + +2006-01-15 Chia-I Wu + + * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/pcf/pcfdrivr.c + (PCF_Glyph_Load), src/winfonts/winfnt.c (FNT_Load_Glyph): Don't set + the linear advance fields as they are only used by the outline + glyphs. + + * include/freetype/freetype.h: Documentation updates and + clarifications. + The meaning of FT_LOAD_FORCE_AUTOHINT is changed so that no real + change need be made to the code. + + * src/base/ftobjs.c (FT_Load_Glyph): Resolve flag dependencies and + decide whether to use the auto-hinter according to documentation. + There should to be no real difference. + Some checks (e.g., is text height positive?) after the glyph is + loaded. + (FT_Select_Size, FT_Request_Size): Scales are set to wrong values. + Be careful that scales won't be negative. + +2006-01-14 Chia-I Wu + + * docs/CHANGES: Mention the size selection change. + + * src/bdf/bdfdrivr.c (BDF_Size_Request, BDF_Size_Select), + src/pcf/pcfdrivr.c (PCF_Size_Request, PCF_Size_Select), + src/winfonts/winfnt.c (FNT_Size_Request, FNT_Size_Select): Do size + matching for requests of type NOMINAL and REAL_DIM. + + * src/winfonts/winfnt.c (FNT_Face_Init): Print trace message when + `pixel_height' is used for nominal height. + + * src/base/ftobjs.c (FT_Request_Size): Call `FT_Match_Size' if the + face is bitmap only and driver doesn't provide `request_size'. This + is added merely for completion as no driver satisfies the conditions. + +2006-01-13 Chia-I Wu + + Introduce new size selection interface. + + * include/freetype/internal/ftdriver.h (struct FT_Driver_ClassRec): + Replace `set_char_sizes' and `set_pixel_sizes' by `request_size' and + `select_size'. + + * include/freetype/freetype.h (FT_Select_Size, FT_Size_Request_Type, + FT_Size_Request, FT_Request_Size, FT_Select_Size), src/base/ftobjs.c + (FT_Select_Size, FT_Request_Size): API additions to export the new + size selection interface. + + * src/base/ftobjs.c (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Use + `FT_Request_Size'. + + * include/freetype/internal/ftobjs.h (FT_Match_Size), + src/base/ftobjs.c (FT_Match_Size): New function to match a size + request against `available_sizes'. Drivers supporting bitmap strikes + can use this function to implement `request_size'. + + * src/bdf/bdfdrivr.c, src/cid/cidobjs.c, src/cid/cidobjs.h, + src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/type1/t1driver.c, + src/type1/t1objs.c, src/type1/t1objs.h, src/type42/t42drivr.c, + src/type42/t42objs.c, src/type42/t42objs.h, src/winfonts/winfnt.c: + Update to new size selection interface. + + * src/cff/cffdrivr.c, src/cff/cffgload.c, src/cff/cffobjs.c, + src/cff/cffobjs.h, src/truetype/ttdriver.c, src/truetype/ttgload.c, + src/truetype/ttobjs.c, src/truetype/ttobjs.h: Update to new size + selection interface. + Make `strike_index' FT_ULong and always defined. + Use `load_strike_metrics' provided by SFNT interface. + +2006-01-13 Chia-I Wu + + * include/freetype/internal/sfnt.h (SFNT_Interface): New method + `load_strike_metrics' used to load the strike's metrics. + + * src/sfnt/sfdriver.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, + src/sfnt/ttsbit0.c: New function `tt_face_load_strike_metrics'. + + * src/pfr/pfrobjs.c (pfr_face_init): Set FT_Bitmap_Size correctly. + + * src/winfonts/winfnt.c (FNT_Face_Init): Use `nominal_point_size' for + nominal size unless it is obviously incorrect. + + * include/freetype/freetype.h (FT_Bitmap_Size): Update the comments on + FNT driver. + +2006-01-12 Werner Lemberg + + Prepare use of pscmap service within CFF module. + + * include/freetype/internal/services/svpscmap.h: Include + FT_INTERNAL_OBJECTS_H. + (PS_Unicode_Index_Func): Removed. Unused. + (PS_Macintosh_Name_Func): Renamed to... + (PS_Macintosh_NameFunc): This. + Update all callers. + (PS_Adobe_Std_Strings_Func): Renamed to... + (PS_Adobe_Std_StringsFunc): This. + Update all callers. + (PS_UnicodesRec): This is the former `PS_Unicodes' structure. + Add `cmap' member. + Update all callers. + (PS_Unicodes): This is now a typedef'd pointer to PS_UnicodesRec. + Update all callers. + (PS_Glyph_NameFunc): New typedef. + (PS_Unicodes_InitFunc): Change arguments to expect a function + and generic data pointer which returns a glyph name from a given + index. + + * src/psnames/psmodule.c (ps_unicodes_init, ps_unicodes_char_index, + ps_unicodes_char_next, pscmaps_interface): Updated. + + * include/freetype/internal/t1types.h (T1_FaceRec): Updated. + + * src/psaux/t1cmap.h (T1_CmapStdRec): Updated. + (T1_CmapUnicode, T1_CmapUnicodeRec): Removed. + + * src/psaux/t1cmap.c (t1_get_glyph_name): New callback function. + (t1_cmap_unicode_init, t1_cmap_unicode_done, + t1_cmap_unicode_char_index, t1_cmap_unicode_char_next, + t1_cmap_unicode_class_rec): Updated. + + * src/type42/t42types.h (T42_FaceRec): Updated. + +2006-01-11 suzuki toshiya + + * include/freetype/ftmac.h: Add declaration of new functions + FT_New_Face_From_FSRef and FT_GetFile_From_Mac_ATS_Name that + were introduced by the jumbo patch on 2006-01-11. + +2006-01-11 Werner Lemberg + + Fix Savannah bug #15056 and use pscmap service in psaux module. + + * include/freetype/internal/services/svpscmap.h (PS_UniMap): Use + FT_UInt32 for `glyph_index'. + (PS_Unicodes_InitFunc): Use FT_String for `glyph_names'. + (PS_Unicodes_CharIndexFunc): Use FT_UInt32 for `unicode'. + (PS_Unicodes_CharNextFunc): Make second argument a pointer to + FT_UInt32. + + * src/psnames/psmodule.c (VARIANT_BIT, BASE_GLYPH): New macros. + (ps_unicode_value): Set VARIANT_BIT in return value if glyph is a + variant glyph (this is, it has non-leading `.' in its name). + (compare_uni_maps): Sort base glyphs before variant glyphs. + (ps_unicodes_init): Use FT_String for `glyph_names' argument. + Reallocate only if number of used entries is much smaller. + Updated to handle variant glyphs. + (ps_unicodes_char_index, ps_unicodes_char_next): Prefer base glyphs + over variant glyphs. + Simplify code. + + * src/psaux/t1cmap.c (t1_cmap_uni_pair_compare): Removed. + (t1_cmap_unicode_init, t1_cmap_unicode_char_index, + t1_cmap_unicode_char_next): Use pscmap service. + (t1_cmap_unicode_done): Updated. + + * src/psaux/t1cmap.h (T1_CMapUniPair): Removed. + (T1_CMapUnicode): Use PS_Unicodes structure. + +2006-01-11 suzuki toshiya + + Jumbo patch to fix `deprecated' warning of cross-build for Tiger on + Intel, as reported by Sean McBride on + 2005-08-24. + + * src/base/ftmac.c: Heavy change to build without deprecated Carbon + functions on Tiger. + + * builds/unix/configure.ac: Add options and autochecks for Carbon + functions availabilities, for MacOS X. + + * builds/mac/ascii2mpw.py: Add converter for character `\305'. + * builds/mac/FreeType.m68k_{far|cfm}.make.txt: Add conditional + macros to avoid unavailable functions. + ftmac.c must be compiled without `-strict ansi', because it disables + cpp macro to use ToolBox system call. + + * builds/mac/FreeType.ppc_{classic|carbon}.make.txt: Add conditional + macros to avoid unavailable functions. + + * builds/mac/README: Detailed notes on function availabilities. + + * docs/CHANGES: Notes about (possible) incompatibilities. + +2006-01-08 Werner Lemberg + + * docs/CHANGES: Updated. + +2006-01-08 Huw D M Davies + + * include/freetype/ftmodapi.h (FT_Module_Get_Flags): New + declaration. + + * src/base/ftobjs.c (FT_Module_Get_Flags): New function. + +2006-01-07 Werner Lemberg + + * src/pcf/pcfread.c (pcf_get_bitmaps): Remove unused variable + `bitmaps'. Reported by Yu Lei . + + * src/base/ftutil.c (ft_highpow2): s/FT_BASE/FT_BASE_DEF/. + Reported by Niels Boldt . + +2005-12-28 suzuki toshiya + + * src/sfnt/sfnt/ttbdf.c: Add newline '\n' to the end of file, for + MPW compiler. + +2005-12-23 David Turner + + * Jamfile (RefDoc), docs/reference/README: Fix it so that `jam + refdoc' works correctly to generate the API reference in + `docs/reference'. + + * src/tools/docmaker/tohtml.py (print_html_field, + print_html_field_list): Update to output nicer fields lists in the + API reference. + + * src/base/ftobjs.c (FT_Load_Glyph): FT_LOAD_TARGET_LIGHT now + forces auto-hinting. + + * freetype/freetype.h: Updating the documentation for + FT_LOAD_TARGET_XXX and FT_Render_Mode values. + +2005-12-23 suzuki toshiya + + * src/base/ftmac.c (FT_New_Face_From_Suitcase): Count scalable faces + in supported formats (sfnt, LWFN) only, and ignore bitmap faces in + unsupported formats (fbit, NFNT). The number of available faces are + passed via face->num_faces. If bitmap faces are embedded in sfnt + resource, face->num_fixed_size is correctly set. In public API, + FT_New_Face() and FT_New_Face_From_FSSpec() count the faces as + FT_GetFile_From_Mac_Name(), which ignores NFNT resources. + + * doc/CHANGES: Mention the changes. + +2005-12-17 Chia-I Wu + + * src/truetype/ttinterp.c (Update_Max): Set current size of buffer + correctly (so that memory debug system won't panic). + +2005-12-16 Chia-I Wu + + * include/freetype/internal/ftobjs.h (ft_glyphslot_grid_fit_metrics), + src/base/ftobjs.c (ft_glyphslot_grid_fit_metrics): Removed. + + * src/base/ftobjs.c (ft_recompute_scaled_metrics): Do not round. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/truetype/ttgload.c (compute_glyph_metrics), + src/type1/t1gload.c (T1_Load_Glyph): Do not round glyph metrics. + + * doc/CHANGES: Mention the changes. + +2005-12-13 David Turner + + Change the implementation of the LIGHT hinting mode to completely + disable horizontal hinting. This is an experimental effort to + integrate David Chester's latest patch without affecting the other + hinting modes as well. + + Note that this doesn't force auto-hinting for all fonts, however. + + * src/autofit/afhints.c (af_glyph_hints_reload): Don't set + scaler_fiags here but... + (af_glyph_hints_rescale): Here. + + * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal + hinting for `light' hinting mode. + + + * Jamfile: Small fix to ensure that ftexport.sym is placed into the + same location as other generated objects (i.e., within the `objs' + directory of the current directory). + + + Add support for an embedded `BDF ' table within SFNT-based bitmap + font files. This is used to store atoms & properties from the + original BDF fonts that were used to generate the font file. + + The feature is controlled by TT_CONFIG_OPTION_BDF within + `ftoption.h' and is used to implement FT_Get_BDF_Property for these + font files. + + At the moment, this is still experimental, the BDF table format + isn't cast into stone yet. + + * include/freetype/config/ftoption.h (TT_CONFIG_OPTION_BDF): New + macro. + + * include/freetype/config/ftstdlib.h (ft_memchr): New macro. + + * include/freetype/internal/tttypes.h (TT_BDFRec, TT_BDF) + [TT_CONFIG_OPTION_BDF]: New structure. + (TT_FaceRec) [TT_CONFIG_OPTION_BDF]: New member `bdf'. + + * include/freetype/ttags.h (TTAG_BDF): New macro. + + * src/sfnt/Jamfile (_sources): Add ttbdf. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttbdf.c. + + * src/sfnt/sfdriver.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h and + FT_SERVICE_BDF_H. + (sfnt_get_charset_it) [TT_CONFIG_OPTION_BDF]: New function. + (sfnt_service_bdf) [TT_CONFIG_OPTION_BDF]: New service. + (sfnt_services) [TT_CONFIG_OPTION_BDF]: Add sfnt_service_bdf. + + * src/sfnt/sfnt.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.c. + + * src/sfnt/sfobjs.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h. + (sfnt_done_face) [TT_CONFIG_OPTION_BDF]: Call + tt_face_free_bdf_props. + + * src/sfnt/ttbdf.h, src/sfnt/ttbdf.c: New files. + +2005-12-07 Werner Lemberg + + * src/sfnt/sfobjc.c (sfnt_init_face): Move tag check to... + * src/sfnt/ttload.c (sfnt_init): Here, before handling TTCs. + +2005-12-06 Chia-I Wu + + * src/truetype/ttobjs.c (tt_size_init): size->ttmetrics.valid is + initialized twice. + size->strike_index is not initialized. + +2005-12-02 Taek Kwan(TK) Lee + + * src/type42/t42objs.c (T42_Face_Init): Replace call to + FT_New_Memory_Face with call to FT_Open_Face to pass `params'. + +2005-11-30 Werner Lemberg + + * docs/CHANGES: Document ftdump's `-v' option. + Document latest charmap code changes. + + * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: + s/TT_CMAP_FLAG_OVERLAPPED/TT_CMAP_FLAG_OVERLAPPING/. + +2005-11-30 Chia-I Wu + + * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary, + tt_cmap12_char_map_binary): Fix compiler warnings. + +2005-11-29 Chia-I Wu + + Major update to distinguish between unsorted and overlapping + segments for cmap format 4. For overlapping but sorted segments, + which is previously considered unsorted, we still use binary search. + + * src/sfnt/ttcmap.h (TT_CMapRec_): Replace `unsorted' by `flags'. + (TT_CMAP_FLAG_UNSORTED, TT_CMAP_FLAG_OVERLAPPED): New macros. + + * src/sfnt/ttcmap.c (OPT_CMAP4): Removed as it is always defined. + (TT_CMap4Rec_): Remove `old_charcode' and `table_length'. + (tt_cmap4_reset): Removed. + (tt_cmap4_init): Updated accordingly. + (tt_cmap4_next): Updated accordingly. + Take care of overlapping segments. + (tt_cmap4_validate): Make sure the subtable is large enough. + Do not check glyph_ids because some fonts set the length wrongly. + Also, if all segments have offset 0, glyph_ids is always invalid. + It does not cause any problem so far only because the check misses + equality. + Distinguish between unsorted and overlapping segments. + (tt_cmap4_char_map_linear, tt_cmap4_char_map_binary): New functions + to do `charcode => glyph index' by linear/binary search. + (tt_cmap4_char_index, tt_cmap4_char_next): Use + tt_cmap4_char_map_linear and tt_cmap4_char_map_binary. + (tt_face_build_cmaps): Treat the return value of validator as flags + for cmap. + +2005-11-29 Chia-I Wu + + * src/sfnt/ttcmap.c (TT_CMap12Rec_, tt_cmap12_init, tt_cmap12_next): + New structures and functions for fast `next char'. + (tt_cmap12_char_map_binary): New function to do `charcode => glyph + index' by binary search. + (tt_cmap12_char_index, tt_cmap12_char_next): Use + tt_cmap12_char_map_binary. + (tt_face_build_cmaps): Check table and offset correctly (equality is + missing). + +2005-11-15 Detlef Würkner + + * builds/amiga/smakefile: Adjusted the compiler options + to the current sources, now really builds the gxvalid, gzip + and psnames modules. + + * builds/amiga/src/base/ftsystem.c: The assumed Seek() position + in the file cache was off by one byte which could cause false + errors in font files. + +2005-11-24 suzuki toshiya + + * builds/mac/FreeType.m68k_far.make.txt, + builds/mac/FreeType.m68k_cfm.make.txt, + builds/mac/FreeType.ppc_classic.make.txt, + builds/mac/FreeType.ppc_carbon.make.txt: + Updated for MPW to build all available modules. + +2005-11-21 HÃ¥vard Wall + + * src/bdf/bdfdrivr.c (bdf_interpret_style, BDF_Face_Done): Fix small + memory leak. + +2005-11-21 Werner Lemberg + + * src/sfnt/ttload.c (sfnt_init): Add tracing message. + +2005-11-21 Chia-I Wu + + * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Image_offset was + added twice to image_start if image_format was 2 or 5. + +2005-11-21 Chia-I Wu + + * src/sfnt/sfobjs.c (sfnt_init_face): Check that format_tag is known + before loading the table directory. + + * src/sfnt/ttload.c (tt_face_load_sfnt_header, + tt_face_load_directory): Delay sfnt_dir_check from + tt_face_load_sfnt_header to tt_face_load_directory. + +2005-11-20 Chia-I Wu + + * src/sfnt/ttload.c (sfnt_dir_check): Clean up and return correct + error code. + (sfnt_init): New function to fill in face->ttc_header. A non-TTC font + is synthesized into a TTC font with one offset table. + (tt_face_load_sfnt_header): Use sfnt_init. + Fix an invalid access if the font is TTC and face_index is -1. + +2005-11-18 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_load_metrics): Ignore excess number + of metrics instead of aborting. Patch suggested by Derek Noonburg. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): Scale + the glyph properly if no hinter is available. + + * docs/CHANGES: Mention scaling bug. + +2005-11-18 susuzki toshiya + + * include/freetype/ftgxval.h, src/base/ftgxval.c + (FT_TrueTypeGX_Free, FT_ClassicKern_Free): New functions to free + buffers allocated by gxvalid module. + * include/freetype/ftotval.h, src/base/ftotval.c + (FT_OpenType_Free): New function to free buffer allocated by + otvalid module. + +2005-11-18 Chia-I Wu + + * builds/unix/ftsystem.c (FT_Stream_Open, FT_New_Memory, + FT_Done_Memory), builds/vms/ftsystem.c (FT_Stream_Open, FT_New_Memory, + FT_Done_Memory), builds/win32/ftdebug.c (FT_Message, FT_Panic): + s/FT_EXPORT/FT_BASE/. + +2005-11-17 Detlef Würkner + + * builds/amiga/src/base/ftdebug.c (FT_Trace_Get_Count, + FT_Trace_Get_Name, FT_Message, FT_Panic), + builds/amiga/src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory, + FT_Stream_Open): s/FT_EXPORT/FT_BASE/. + +2005-11-17 Detlef Würkner + + * builds/amiga/makefile, builds/amiga/makefile.os4, + builds/amiga/smakefile, + builds/amiga/include/freetype/config/ftmodule.h: Updated the Amiga + build files (added support for the gxvalid module). + +2005-11-17 Werner Lemberg + + Add vertical metrics support to OpenType CFF outlines. Based on a + patch from Mike Moening . + + * src/cff/cffgload.c (cff_face_get_vertical_metrics): New function. + (cff_slot_load): Use cff_face_get_vertical_metrics. + + * docs/CHANGES: Updated. + +2005-11-17 Chia-I Wu + + * src/base/ftcalc.c (FT_MulTo64): Commented out. + + * include/freetype/internal/ftcalc.h (FT_SqrtFixed), + src/base/ftcalc.c (FT_SqrtFixed), + include/freetype/internal/ftdebug.h (FT_Trace_Get_Count, + FT_Trace_Get_Name, FT_Message, FT_Panic), src/base/ftdebug.c + (FT_Trace_Get_Count, FT_Trace_Get_Name, FT_Message, FT_Panic), + include/freetype/internal/ftobjs.h (FT_New_Memory, FT_Done_Memory), + include/freetype/internal/ftstream.h (FT_Stream_Open), + src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory, FT_Stream_Open): + s/FT_EXPORT/FT_BASE/. + + * builds/exports.mk: Manually add TT_New_Context to EXPORTS_LIST + too. + +2005-11-15 David Turner + + * src/base/fttrigon.c (ft_trig_prenorm): Fix a bug that created + invalid computations, resulting in very weird bugs in TrueType + bytecode hinted fonts. + + * src/truetype/ttinterp.c (FT_UNUSED_EXEC): Don't perform a + structure copy each time. + +2005-11-11 Werner Lemberg + + * src/cache/ftccache.c (FTC_Cache_Clear), src/cache/ftcmanag.c + (FTC_Manager_Check): Remove FT_EXPORT_DEF tag. + + * src/base/ftcalc.c (FT_Add64): Remove FT_EXPORT_DEF tag. + (FT_Div64by32, FT_Sqrt32): Commented out. Unused. + + * include/freetype/internal/ftcalc.h (SQRT_32): Removed. Unused. + (FT_Sqrt32): Commented out. Unused. + + * include/freetype/cache/ftccache.h: + s/ftc_node_destroy/FTC_Node_Destroy/. + + * src/cache/ftccback.h (ftc_node_destroy): New declaration. + + * src/cache/ftccache.c (ftc_node_destroy): Use FT_LOCAL_DEF tag. + (FTC_Node_Destroy): New exported wrapper function for + ftc_node_destroy. + + * src/cache/ftcmanag.c: Include ftccback.c. + +2005-11-10 Werner Lemberg + + * src/autofit/afangles.c, src/autofit/aftypes.h (af_angle_diff): + Comment out. Unused. + + * builds/exports.mk ($(EXPORTS_LIST)): Add TT_RunIns. + +2005-11-10 Christian Biesinger + + * builds/beos/beos.mk: Call beos-def.mk before anything else to + define the separator. + + * builds/unix/unix-cc.in (LINK_LIBRARY): Add `-no-undefined' flag. + +2005-11-07 Werner Lemberg + + * src/type1/t1afm.c (T1_Read_PFM): Zero offset means `no kerning + table available'. From Sergey Tolstov . + +2005-11-03 Ville Syrjälä + + * src/base/ftobjs.c (FT_Open_Face): Avoid possible memory leak. + +2005-11-02 Werner Lemberg + + Make compiling instructions in docs/CUSTOMIZE work again. + + * builds/unix/unix-cc.in (CPPFLAGS): New variable. + (CFLAGS): Don't include @CPPFLAGS@. + * builds/freetype.mk (FT_CFLAGS): Add CPPFLAGS. + +2005-10-28 David Turner + + Update build system to support the generation of a list of exported + symbols or Windows .DEF files by parsing the public headers with the + `apinames' tool located in src/tools/apinames.c. + + Only tested on Unix at the moment. On Windows, the .DEF file is + generated but isn't used yet to generate a DLL. + + * builds/exports.mk: New file. + + * builds/freetype.mk: Include exports.mk. + (dll): New target. + (clean_project_dos): Fix rule. + + * builds/compiler/visualc.mk (TE), builds/dos/dos-def.mk (E), + builds/os2/os2-def.mk (E), builds/win32/win32-def.mk (E): New + variables for controlling executable extensions. + + * builds/unix/unix-cc.in (EXPORTS_LIST, CCexe), + builds/win32/w32-bcc.mk, builds/win32/w32-gcc.mk, + builds/win32/w32-icc.mk, builds/win32/w32-icc.mk, + builds/win32/w32-mingw32.mk, builds/win32/w32-vcc, + builds/win32/w32-wat.mk (EXPORTS_LIST, EXPORT_OPTIONS, + APINAMES_OPTIONS): New targets for controlling the `apinames' tool. + + * Jamfile (GenExportSymbols): Updated. + + + * src/pfr/pfrtypes.h, src/pfr/pfrload.c, src/pfr/pfrobjs.c + [!FT_OPTIMIZE_MEMORY]: Fold memory optimization code into + FT_OPTIMIZE_MEMORY chunks for better maintainability and simplicity. + + + * src/base/fttrigon.c (ft_trig_prenorm), src/base/ftcalc.c + (FT_MulFix): Performance optimizations. + + + * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P, + FT_GLYPHLOADER_CHECK_C, FT_GLYPHLOADER_CHECK_POINTS): New macros for + checking points and contours. Update callers to use + FT_GLYPHLOADER_CHECK_POINTS instead of FT_GlyphLoader_CheckPoints + at profile-detected hot-spots. + + * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Set `adjust' + to 0 to not call `AdjustPoints' every time. + + + * src/autofit/aftypes.h (AF_ANGLE_DIFF): New macro to inline + FT_Angle_Diff. + + * src/autofit/afhints.c (af_direction_compute): Re-implement. + (af_glyph_hints_compute_inflections, af_glyph_hints_reload): Use + AF_ANGLE_DIFF to speed up the detection of inflexions. + + + * src/tools/apinames.c: Include . + (OutputFormat): New enumeration. + (names_dump): Add two parameters to control output format and DLL + name. + (names_dump_windef): Removed. Code folded into `names_dump'. + (read_header_file): Use isalnum, not isalpha. Otherwise function + names with digits aren't read correctly. + (usage): Updated. + (main): New option `-o' to control output file name. + New option `-d' to indicate DLL file name. + Extend `-w' flag to handle Borland and Watcom compilers and linkers. + +2005-10-28 suzuki toshiya + + * builds/mac/ftlib.prj, builds/mac/freetype.mak: Removed. + ftlib.prj is unmaintained and incompatible with current tree. + freetype.mak is unrecoverably broken. + + * builds/mac/ftlib.prj.xml: Added. + Generated by Metrowerks CodeWarrior 9.0. + + * builds/mac/FreeType.m68k_far.make.txt, + builds/mac/FreeType.m68k_cfm.make.txt, + builds/mac/FreeType.ppc_classic.make.txt, + builds/mac/FreeType.ppc_carbon.make.txt: Added. + Skeleton files of MPW makefiles. + + * builds/mac/ascii2mpw.py: Added. + Python script to make MPW makefile from skeleton. + + * builds/mac/README: Updated. + Almost rewritten to use new files. + +2005-10-28 suzuki toshiya + + * src/base/ftmac.c: Fix invalid casts from NULL to integer typed + variables. Advised by David Turner, Masatake YAMATO, Sean McBride, + and George Williams. + +2005-10-27 Werner Lemberg + + * include/freetype/ftsysmem.h, include/freetype/ftsysio.h: Removed. + Obsolete. + +2005-10-25 Werner Lemberg + + * src/sfnt/sfdriver.c (sfnt_interface): Move out + `tt_face_get_kerning' from a #ifdef clause. Reported by Tony J. + Ibbs . + +2005-10-23 Werner Lemberg + + * src/base/ftdbgmem.c (ft_mem_debug_realloc): Make it compile with + C++. + +2005-10-21 David Turner + + * src/base/ftdbgmem.c (ft_mem_table_set, ft_mem_debug_realloc): + Another realloc memory counting bug fix. + + * src/tools/Jamfile: Add missing file. + + * src/lzw/Jamfile: Fix incorrect source file reference. + +2005-10-20 David Turner + + * src/base/ftdbgmem.c (ft_mem_table_set, ft_mem_table_remove, + ft_mem_debug_alloc, ft_mem_debug_free, ft_mem_debug_realloc): Fixes + to better account for memory reallocations. + + * src/lzw/ftlzw2.c, src/lzw/ftzopen.h, src/lzw/ftzopen.c, + src/lzw/rules.mk: First version of LZW loader re-implementation. + Apparently, this saves about 330 KB of heap memory when loading + timR24.pcf.Z. + +2005-10-20 Chia-I Wu + + * include/freetype/ftbitmap.h (FT_Bitmap_Copy, FT_Bitmap_Embolden), + src/base/ftbdf.c (FT_Get_BDF_Property), src/cache/ftcmru.c + (FTC_MruList_Reset, FTC_MruList_Done, FTC_MruList_Lookup): Fix + FT_EXPORT/FT_EXPORT_DEF tagging. + +2005-10-19 Chia-I Wu + + * src/truetype/ttgload.c (TT_Load_Glyph): Allow size->ttmetrics to + be invalid when FT_LOAD_NO_SCALE is set. + +2005-10-17 David Turner + + * src/base/ftobjs.c (FT_Open_Face): Don't call FT_New_GlyphSlot and + FT_New_Size if we are opening a face with face_index < 0 (which is + only used for testing the format). + + * src/gxvalid/gxvmort0.c (gxv_mort_subtable_type0_entry_validate): + Remove compiler warning. + +2005-10-16 David Turner + + * src/tools/apinames.c: Add new tool to extract public API function + names from header files. + +2005-10-05 Werner Lemberg + + Add FT_FACE_FLAG_HINTER to indicate that a specific font driver has + a hinting engine of its own. + + * include/freetype/freetype.h (FT_FACE_FLAG_HINTER): New macro. + + * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c + (cid_face_init), src/truetype/ttobjs.c (tt_face_init) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER], src/type1/t1objs.c + (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Update face flags. + + * docs/CHANGES: Document it. + +2005-09-27 Werner Lemberg + + * builds/unix/freetype2.m4: Add license exception so that the file + can be used in any other autoconf script. + +2005-09-26 David Turner + + * src/autofit/aflatin.c (af_latin_compute_stem_width): Fix bad + computation of the `vertical' flag, causing ugly things in LCD mode + and others. + +2005-09-23 David Turner + + * src/autofit/aflatin.c (af_latin_hints_init): Fix a bug that + prevented internal hint mode bitflags from being computed correctly. + + * src/base/Jamfile: Adding src/base/ftgxval.c. + + * src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c, + src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, src/gxvalid/gxvkern.c, + src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c, + src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c, + src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c, + src/gxvalid/gxvmort5.c, src/gxvalid/gxvmorx.c, + src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c, + src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx5.c, + src/gxvalid/gxvopbd.c, src/gxvalid/gxvprop.c, + src/truetype/ttgload.c: Remove _many_ compiler warnings when + compiling with Visual C++ at maximum level (/W4). + + * src/autofit/afangles.c (af_angle_atan): Replaced CORDIC-based + implementation with one using lookup tables. This simple thing + speeds up glyph loading by 18%, according to ftbench! + + * src/sfnt/sfdriver.c (sfnt_get_interface): Don't check for + `get_sfnt' and `load_sfnt' module interfaces. + +2005-09-22 Werner Lemberg + + * docs/CHANGES: Mention SING Glyphlet support. + +2005-09-22 David Turner + + * src/base/Jamfile: Disable compilation of ftgxval module + temporarily. + +2005-09-19 David Somers + + * src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a + font to have no `head' table if tables `SING' and `META' are + present; this is to support `SING Glyphlet'. + + `SING Glyphlet' is an extension to OpenType developed by Adobe + primarily to facilitate adding supplemental glyphs to an OpenType + font (with emphasis on, but not necessarily limited to, gaiji to a + CJK font). A SING Glyphlet Font is an OpenType font that contains + the outline(s), either in a `glyf' or `CFF' table, for a glyph; + `cmap', `BASE', and `GSUB' tables are present with the same format + and functionaliy as a regular OpenType font; there are no `name', + `head', `OS/2', and `post' tables; there are two new tables, `SING' + which contains details about the glyphlet, and `META' which contains + metadata. + + Further information on the SING Glyphlet format can be found at: + + http://www.adobe.com/products/indesign/sing_gaiji.html + + * include/freetype/ttags.h (TTAG_SING, TTAG_META): New macros for + the OpenType tables `SING' and `META'. These two tables are used in + SING Glyphlet Format fonts. + +2005-09-09 Werner Lemberg + + * src/sfnt/sfobjs.c (sfnt_load_face): Reactivate code to set + FT_FACE_FLAG_KERNING which has been commented out erroneously. + + * docs/CHANGES: Document it. + +2005-09-05 Werner Lemberg + + Fixes for `make multi' and using C++ compiler. + + * src/gxvalid/gxvcommn.c (gxv_set_length_by_ushort_offset, + gxv_set_length_by_ulong_offset, gxv_array_getlimits_byte, + gxv_array_getlimits_ushort): Declare with FT_LOCAL_DEF. + (gxv_compare_ranges): Make it static. + (gxv_LookupTable_fmt0_validate, gxv_LookupTable_fmt2_validate, + gxv_LookupTable_fmt4_validate, gxv_LookupTable_fmt6_validate, + gxv_LookupTable_fmt8_validate, gxv_LookupTable_validate): Improve + trace messages. + (gxv_StateArray_validate, gxv_XStateArray_validate): s/class/clazz/. + (GXV_STATETABLE_HEADER_SIZE, GXV_STATEHEADER_SIZE, + GXV_XSTATETABLE_HEADER_SIZE, GXV_XSTATEHEADER_SIZE): Move to + gxvcommn.h. + + * src/gxvalid/gxvcommn.h: Add prototypes for + gxv_StateTable_subtable_setup, gxv_XStateTable_subtable_setup, + gxv_XStateTable_validate, gxv_array_getlimits_byte, + gxv_array_getlimits_ushort, gxv_set_length_by_ushort_offset, + gxv_set_length_by_ulong_offset, gxv_odtect_add_range, + gxv_odtect_validate. + (GXV_STATETABLE_HEADER_SIZE, GXV_STATEHEADER_SIZE, + GXV_XSTATETABLE_HEADER_SIZE, GXV_XSTATEHEADER_SIZE): Moved from + gxvcommn.c. + + * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate, + gxv_bsln_parts_fmt1_validate): Improve trace messages. + + * src/gxvalid/gxvfeat.c: Split off predefined registry stuff to... + * src/gxvalid/gxvfeat.h: New file. + + * src/gxvalid/gxvjust.c (gxv_just_wdc_entry_validate): Improve trace + message. + + * src/gxvalid/gxvkern.c (GXV_kern_Dialect): Add KERN_DIALECT_UNKNOWN. + (gxv_kern_subtable_fmt1_valueTable_load, + gxv_kern_subtable_fmt1_subtable_setup, + gxv_kern_subtable_fmt1_entry_validate): Fix C++ compiler errors. + (gxv_kern_coverage_validate): Use KERN_DIALECT_UNKWOWN. + Improve trace message. + (gxv_kern_validate_generic): Fix C++ compiler error. + Improve trace message. + (gxv_kern_validate_classic): Fix C++ compiler error. + + * src/gxvalid/gxvmort0.c (gxv_mort_subtable_type0_validate): Declare + with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort1.c + (gxv_mort_subtable_type1_substitutionTable_load, + gxv_mort_subtable_type1_subtable_setup): Fix C++ compiler errors. + (gxv_mort_subtable_type1_substTable_validate): Improve trace + message. + (gxv_mort_subtable_type1_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort2.c (gxv_mort_subtable_type2_opttable_load, + gxv_mort_subtable_type2_subtable_setup, + gxv_mort_subtable_type2_ligActionOffset_validate, + gxv_mort_subtable_type2_ligatureTable_validate): Fix C++ compiler + errors. + (gxv_mort_subtable_type2_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort4.c (gxv_mort_subtable_type4_validate): Declare + with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort5.c (gxv_mort_subtable_type5_subtable_setup, + gxv_mort_subtable_type5_InsertList_validate): Fix C++ compiler + errors. + (gxv_mort_subtable_type5_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmort.c: Include gxvfeat.h. + (gxv_mort_featurearray_validate, gxv_mort_coverage_validate): + Declare with FT_LOCAL_DEF. + (gxv_mort_subtables_validate, gxv_mort_validate): Improve trace + messages. + + * src/gxvalid/gxvmort.h (gxv_mort_feature_validate): Remove. + + * src/gxvalid/gxvmorx0.c (gxv_morx_subtable_type0_validate): Declare + with FT_LOCAL_DEF. + + * src/gxvalid/gxvmorx1.c + (gxv_morx_subtable_type1_substitutionTable_load, + gxv_morx_subtable_type1_subtable_setup, + gxv_morx_subtable_type1_entry_validate, + gxv_morx_subtable_type1_substitutionTable_validate): Fix C++ + compiler errors. + (gxv_morx_subtable_type1_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmorx2.c (gxv_morx_subtable_type2_opttable_load, + gxv_morx_subtable_type2_subtable_setup, + gxv_morx_subtable_type2_ligActionIndex_validate, + gxv_morx_subtable_type2_ligatureTable_validate): Fix C++ compiler + errors. + (gxv_morx_subtable_type2_validate): Declare with FT_LOCAL_DEF. + Fix typo. + + * src/gxvalid/gxvmorx4.c (gxv_morx_subtable_type4_validate): Declare + with FT_LOCAL_DEF. + + * src/gxvalid/gxvmorx5.c (gxv_morx_subtable_type5_insertionGlyph_load, + gxv_morx_subtable_type5_subtable_setup): Fix C++ compiler error. + (gxv_morx_subtable_type5_validate): Declare with FT_LOCAL_DEF. + + * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate, + gxv_morx_validate): Improve trace message. + + * src/gxvalid/gxvopbd.c (gxv_opbd_LookupFmt4_transit): Fix compiler + warnings. + (gxv_opbd_validate): Improve trace message. + + * src/gxvalid/gxvprop.c: Decorate constants with `U' and `L' where + appropriate. + (gxv_prop_zero_advance_validate, gxv_prop_validate): Improve trace + message. + + * src/gxvalid/gxvtrak.c (gxv_trak_trackTable_validate): Remove unused + parameter. Update all callers. + (gxv_trak_validate): Improve trace message. + + * rules.mk (GXV_DRV_H): Add gxvfeat.h. + +2005-09-01 Werner Lemberg + + * src/gxvalid/gxvbsln.c (GXV_BSLN_VALUE_EMPTY): Add `U'. + + * src/gxvalid/gxmort1.c (GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE), + src/gxvalid/gxmort2.c (GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE): Fix + typo. + + * src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c, + src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx4.c, + src/gxvalid/gxvmorx5.c, src/gxvalid/gxvmort.c: Improve trace + messages. + Decorate constants with `U' and `L' where appropriate. + Fix compiler warnings. + +2005-08-31 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix typo. + + * src/gxvalid/gxvbsln.c (gxv_bsln_validate): Fix trace message. + + * src/gxvalid/gxvcommn.c (gxv_odtect_add_range): Use `const'. + + * src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, + src/gxvalid/gxvkern.c, src/gxvalid/gxvlcar.c, src/gxvalid/gxvmod.c, + src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c, + src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c, + src/gxvalid/gxvmort5.c, src/gxvalid/gxvmort.c: Improve trace + messages. + Decorate constants with `U' and `L' where appropriate. + Fix compiler warnings. + +2005-08-30 Werner Lemberg + + * src/gxvalid/README: Revised. + * src/gxvalid/gxvbsln.c: Fix compiler warnings. + * src/gxvalid/gxvcommn.c: Fix compiler warnings. + (gxv_XEntryTable_validate, gxv_compare_ranges): Remove unused + parameter. Update all callers. + Improve trace messages. + Some formatting. + +2005-08-29 Werner Lemberg + + * include/freetype/freetype.h, include/freetype/ftchapters.h: Add + a preliminary section with some explanations about user allocation. + + * src/tools/docmaker/tohtml.py (HtmlFormatter.section_enter): + Don't abort if there are no data types, functions, etc., in a + section. + Print synopsis only if we have a data type, function, etc. + + * docs/INSTALL.ANY, docs/INSTALL, docs/INSTALL.UNX, docs/CUSTOMIZE, + docs/INSTALL.GNU, docs/TRUETYPE, docs/DEBUG, docs/UPGRADE.UNX, + docs/VERSION.DLL, docs/formats.txt: Revised, formatted. + +2005-08-28 George Williams + + * src/truetype/ttgload.c [TT_MAX_COMPOSITE_RECURSE]: Removed. + (load_truetype_glyph): Limit recursion depth by `maxComponentDepth'. + +2005-08-25 J. Ali Harlow + + * builds/unix/freetype2.in (CFlags): Add missing directory. + +2005-08-24 Werner Lemberg + + * docs/CHANGES: Mention gxvalid module. + +2005-08-23 Werner Lemberg + + * src/autofit/aflatin.c (af_latin_metrics_scale): Initialize + render mode properly. Reported by chris@dokein.co.uk. + +2005-08-23 suzuki toshiya + + Add gxvalid module to validate TrueType GX/AAT tables. + + Modifications on existing files: + + * Jamfile: Register gxvalid module. + * src/base/Jamfile: Register ftgxval.c. + * src/base/rule.mk: Register ftgxval.c. + * docs/INSTALL.ANY: Register gxvalid/gxvalid.c. + + * include/freetype/config/ftheader.h (FT_GX_VALIDATE_H): New macro + to include gxvalid header file. + * include/freetype/config/ftmodule.h: Register gxv_module_class. + + * include/freetype/ftchapters.h: Add comment about gx_validation. + * include/freetype/ftotval.h: Change keyword FT_VALIDATE_XXX + to FT_VALIDATE_OTXXX to co-exist with gxvalid. + * include/freetype/tttags.h: Add tags for TrueType GX/AAT tables. + + * include/freetype/internal/ftserv.h (FT_SERVICE_GX_VALIDATE_H): New + macro for gxvalid service. + * include/freetype/internal/fttrace.h: Add trace facilities for + gxvalid. + + New files on existing directories: + + * include/freetype/internal/services/svgxval.h: Registration of + validation service for TrueType GX/AAT and classic kern table. + * include/freetype/ftgxval.h: Public API definition to use gxvalid. + * src/base/ftgxval.c: Public API of gxvalid. + + New files under src/gxvalid/: + + * src/gxvalid/Jamfile src/gxvalid/README src/gxvalid/module.mk + src/gxvalid/rules.mk src/gxvalid/gxvalid.c src/gxvalid/gxvalid.h + src/gxvalid/gxvbsln.c src/gxvalid/gxvcommn.c src/gxvalid/gxvcommn.h + src/gxvalid/gxverror.h src/gxvalid/gxvfeat.c src/gxvalid/gxvfgen.c + src/gxvalid/gxvjust.c src/gxvalid/gxvkern.c src/gxvalid/gxvlcar.c + src/gxvalid/gxvmod.c src/gxvalid/gxvmod.h src/gxvalid/gxvmort.c + src/gxvalid/gxvmort.h src/gxvalid/gxvmort0.c src/gxvalid/gxvmort1.c + src/gxvalid/gxvmort2.c src/gxvalid/gxvmort4.c src/gxvalid/gxvmort5.c + src/gxvalid/gxvmorx.c src/gxvalid/gxvmorx.h src/gxvalid/gxvmorx0.c + src/gxvalid/gxvmorx1.c src/gxvalid/gxvmorx2.c src/gxvalid/gxvmorx4.c + src/gxvalid/gxvmorx5.c src/gxvalid/gxvopbd.c src/gxvalid/gxvprop.c + src/gxvalid/gxvtrak.c: New files, gxvalid body. + +2005-08-21 Werner Lemberg + + * src/truetype/ttgload.c (TT_Load_Glyph): Only translate outline + to (0,0) if bit 1 of the `head' table isn't set. This improves + rendering of buggy fonts. + +2005-08-20 Chia I Wu + + * src/truetype/ttdriver.c (Load_Glyph): Don't check the validity of + ttmetrics here. TrueType fonts with only sbits always have + ttmetrics.valid set to false. + + * src/truetype/ttgload.c (TT_Load_Glyph): Check that ttmetrics is + valid before loading outline glyph. + + * src/cache/ftcimage.c (FTC_INode_New): Fix a memory leak. + +2005-08-20 Werner Lemberg + + * src/sfnt/ttload.c (tt_face_load_metrics_header): Ignore missing + `hhea' table for SFNT Mac fonts. Change based on a patch by + mpsuzuki@hiroshima-u.ac.jp. + +2005-08-20 Masatake YAMATO + + * src/otvalid/otvmod.c (otv_validate): Use ft_validator_run instead + of ft_setjmp. + +2005-08-19 Werner Lemberg + + * src/truetype/ttgload.c (load_truetype_glyph): Fix compiler + warnings. + +2005-08-16 Chia I Wu + + * src/truetype/ttinterp.c, src/truetype/ttinterp.h: Update copyright + messages. + +2005-08-16 Chia I Wu + + * src/truetype/ttinterp.c, src/truetype/ttinterp.h: Remove original + TT_Done_Context and rename TT_Destroy_Context to TT_Done_Context + with slight changes. + Update all callers. + (TT_New_Context): Now takes TT_Driver argument directly. + Update all callers. + + * src/truetype/ttobjs.h (tt_slot_init): New function. + * src/truetype/ttobjs.c (tt_driver_init): Initialize execution + context here. + (tt_slot_init): New function to create extra points for the internal + glyph loader. We then use it directly, instead of face's glyph + loader, when loading glyph. + + * src/truetype/ttdriver.c (tt_driver_class): Use tt_slot_init for + glyph slot initialization. + (Load_Glyph): Load flag dependencies are handled here. Return error + if size is NULL. + + * src/truetype/ttgload.c: Heavy cleanup and refactoring. + (org_to_cur): Removed. + (TT_Load_Simple_Glyph): Call FT_GlyphLoader_CheckPoints. + (TT_Hint_Glyph): New function to hint a zone, prepared by caller. + (TT_Process_Simple_Glyph): s/load/loader/. + Use loader->pp values instead of recalculation. + Use TT_Hint_Glyph. + No need to save/restore loader->stream before and after + TT_Vary_Get_Glyph_Deltas now. + (TT_LOADER_SET_PP): New macro to calculate and set the four phantom + points. + (load_truetype_glyph): Never set exec->glyphSize to 0. This closes + Savannah bug #13107. + Forget glyph frame before calling TT_Process_Simple_Glyph. + Use TT_LOADER_SET_PP. + Scale all four phantom points. + Split off some functionality to ... + (TT_Process_Composite_Component, TT_Process_Composite_Glyph): These + new functions. + (TT_Load_Glyph): Set various fields of `glyph' here, not in + load_truetype_glyph and compute_glyph_metrics. + Split off some functionality to ... + (load_sbit_image, tt_loader_init): These new functions. + (compute_glyph_metrics): Call FT_Outline_Get_CBox. + +2005-08-08 Werner Lemberg + + * docs/INSTALL.ANY: Updated. + +2005-08-05 Werner Lemberg + + * src/cff/cffgload.c (cff_builder_close_contour), + src/psaux/psobjs.c (t1_builder_close_contour): Protect against + zero `outline' pointer. + + * src/base/ftgloadr.c (FT_GlyphLoader_Add): Protect against zero + `loader' address. + +2005-08-03 Werner Lemberg + + * src/sfnt/sfdriver.c (sfnt_interface) [FT_OPTIMIZE_MEMORY]: + Reactivate pointers to tt_find_sbit_image and tt_load_sbit_metrics + to make X work again. + +2005-08-02 Werner Lemberg + + * src/otvalid/otvcommn.h: Remove dead code. + +2005-07-31 Chia I Wu + + * src/truetype/ttobjs.h (tt_size_run_fpgm, tt_size_run_prep): New + functions. + + * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): New + functions. + (tt_size_init): Add 4, instead of 2, (phantom) points to twilight + zone. + Move code that runs fpgm to tt_size_run_fpgm. + (Reset_Outline_Size): Move code that runs prep to tt_size_run_prep. + (tt_glyphzone_new): Allocate right size of arrays. + Set max_points and max_contours properly. + +2005-07-26 Chia I Wu + + * src/truetype/ttdriver.c (Set_Char_Sizes): Avoid unnecessary + computations and clean up. + + * src/truetype/ttobjs.h (struct TT_SizeRec_): Comment on the + internal copy of metrics. + +2005-07-12 Werner Lemberg + + * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix prototype. + Reported by Xerxes. + +2005-07-04 Werner Lemberg + + * include/freetype/internal/ftmemory.h (FT_REALLOC_ARRAY): Fix typo. + Reported by Brett Hutley. + +2005-06-30 David Turner + + * src/sfnt/ftbitmap.c, src/truetype/ttgload.c, src/sfnt/ttcmap.c: + Removing compiler warnings (Visual C++ /W4). + + + Implement a work-around for broken C preprocessor in Visual C++ (it + has been confirmed by the MS developers that it is indeed a bug + which won't be fixed in the very near future). + + * Jamfile (FT2_COMPONENTS): Include otvalid (again). + + * src/otvalid/otvcommn.h (OTV_NAME, OTV_FUNC): New macros. + (OTV_NEST1, OTV_NEST2, OTV_NEST3): Use OTV_NAME and OTV_FUNC to + avoid argument expansion by argument prescan. + Append `Func' to all affected macros and change them to take just a + single argument. Example: `AttachList' is renamed to + `AttachListFunc'. + + * src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, + src/otvalid/otvgsub.c, src/otvjstf.c: Append `Func' to macros + affected by the changes to OTV_NESTx and modify them to take just a + single argument. + +2005-06-20 Chia I Wu + + * include/freetype/internal/ftobjs.h, src/base/ftobjs.c: New function + ft_glyphslot_grid_fit_metrics. + + * src/truetype/ttgload.c (compute_glyph_metrics): Use + ft_glyphslot_grid_fit_metrics. + + * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c + (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): Use + ft_glyphslot_grid_fit_metrics. + FT_Outline_Get_CBox is called twice. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Modify metrics to more + reasonable values when emboldening outline glyphs. The theoretic + ones are unrealistic. + +2005-06-16 Chia I Wu + + * src/base/ftoutln.c (FT_Outline_Embolden): Strength should be + halved. + + * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default + strength. + Don't increase slot->advance.y. + +2005-06-16 Werner Lemberg + + * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2. + (FREETYPE_PATCH): Set to 0. + + * builds/unix/configure.ac (version_info): Set to 9:9:3. + Currently, we are still binary compatible. + + * builds/win32/visualc/index.html, + builds/win32/visualc/freetype.dsp, + builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/. + + * builds/freetype.mk (refdoc), README, Jamfile (RefDoc): + s/2.1.9/2.1.10/. + + * docs/CHANGES, docs/VERSION.DLL: Updated. + + * ChangeLog: Split off older entries into... + * ChangeLog.20, ChangeLog.21: These new files. + +2005-06-15 Kirill Smelkov + + The next release will be 2.2.0, so don't worry about source code + backwards compatibility. + + * include/freetype/ftimage.h (FT_Outline_MoveToFunc, + FT_Outline_LineToFunc, FT_Outline_ConicToFunc, + FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc), + include/freetype/ftrender.h (FT_Glyph_TransformFunc, + FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate + parameters with `const' where appropriate. + +2005-06-15 Chia I Wu + + * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY + to make glyphs centered vertically. + + * src/truetype/ttgload.c (compute_glyph_metrics): Compute + vertBearingY to make glyphs centered vertically. + Fix some bugs in vertical metrics: + + . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font + units. + . As we use the glyph's cbox to calculate the top bearing now + there is no need to adjust `top'. + +2005-06-15 Werner Lemberg + + * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be + in sync with OTV_OPTIONAL_OFFSET. Reported by YAMATO Masatake. + +2005-06-13 Werner Lemberg + + * docs/release: Update. + +---------------------------------------------------------------------------- + +Copyright 2005, 2006, 2007, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: diff --git a/alienblaster/project/jni/freetype/Jamfile b/alienblaster/project/jni/freetype/Jamfile new file mode 100644 index 000000000..d8c1bbada --- /dev/null +++ b/alienblaster/project/jni/freetype/Jamfile @@ -0,0 +1,203 @@ +# FreeType 2 top Jamfile. +# +# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# The HDRMACRO is already defined in FTJam and is used to add +# the content of certain macros to the list of included header +# files. +# +# We can compile FreeType 2 with classic Jam however thanks to +# the following code +# +if ! $(JAM_TOOLSET) +{ + rule HDRMACRO + { + # nothing + } +} + + +# We need to invoke a SubDir rule if the FT2 source directory top is not the +# current directory. This allows us to build FreeType 2 as part of a larger +# project easily. +# +if $(FT2_TOP) != $(DOT) +{ + SubDir FT2_TOP ; +} + + +# The following macros define the include directory, the source directory, +# and the final library name (without library extensions). They can be +# replaced by other definitions when the library is compiled as part of +# a larger project. +# + +# Name of FreeType include directory during compilation. +# This is relative to FT2_TOP. +# +FT2_INCLUDE_DIR ?= include ; + +# Name of FreeType source directory during compilation. +# This is relative to FT2_TOP. +# +FT2_SRC_DIR ?= src ; + +# Name of final library, without extension. +# +FT2_LIB ?= $(LIBPREFIX)freetype ; + + +# Define FT2_BUILD_INCLUDE to point to your build-specific directory. +# This is prepended to FT2_INCLUDE_DIR. It can be used to specify +# the location of a custom which will point to custom +# versions of `ftmodule.h' and `ftoption.h', for example. +# +FT2_BUILD_INCLUDE ?= ; + +# The list of modules to compile on any given build of the library. +# By default, this will contain _all_ modules defined in FT2_SRC_DIR. +# +# IMPORTANT: You'll need to change the content of `ftmodule.h' as well +# if you modify this list or provide your own. +# +FT2_COMPONENTS ?= autofit # auto-fitter + base # base component (public APIs) + bdf # BDF font driver + cache # cache sub-system + cff # CFF/CEF font driver + cid # PostScript CID-keyed font driver + gzip # support for gzip-compressed files + lzw # support for LZW-compressed files + pcf # PCF font driver + pfr # PFR/TrueDoc font driver + psaux # common PostScript routines module + pshinter # PostScript hinter module + psnames # PostScript names handling + raster # monochrome rasterizer + smooth # anti-aliased rasterizer + sfnt # SFNT-based format support routines + truetype # TrueType font driver + type1 # PostScript Type 1 font driver + type42 # PostScript Type 42 (embedded TrueType) driver + winfonts # Windows FON/FNT font driver + ; + + +# Don't touch. +# +FT2_INCLUDE = $(FT2_BUILD_INCLUDE) + [ FT2_SubDir $(FT2_INCLUDE_DIR) ] ; + +FT2_SRC = [ FT2_SubDir $(FT2_SRC_DIR) ] ; + +# Location of API Reference Documentation +# +if $(DOC_DIR) +{ + DOC_DIR = $(DOCDIR:T) ; +} +else +{ + DOC_DIR = docs/reference ; +} + + +# Only used by FreeType developers. +# +if $(DEBUG_HINTER) +{ + CCFLAGS += -DDEBUG_HINTER ; +} + + +# We need `freetype2/include' in the current include path in order to +# compile any part of FreeType 2. +#: updating documentation for upcoming release + +HDRS += $(FT2_INCLUDE) ; + + +# We need to #define FT2_BUILD_LIBRARY so that our sources find the +# internal headers +# +DEFINES += FT2_BUILD_LIBRARY ; + +# Uncomment the following line if you want to build individual source files +# for each FreeType 2 module. This is only useful during development, and +# is better defined as an environment variable anyway! +# +# FT2_MULTI = true ; + + +# The file is used to define macros that are +# later used in #include statements. It needs to be parsed in order to +# record these definitions. +# +HDRMACRO [ FT2_SubDir include freetype config ftheader.h ] ; +HDRMACRO [ FT2_SubDir include freetype internal internal.h ] ; + + +# Now include the Jamfile in `freetype2/src', used to drive the compilation +# of each FreeType 2 component and/or module. +# +SubInclude FT2_TOP $(FT2_SRC_DIR) ; + +# Handle the generation of the `ftexport.sym' file which contain the list +# of exported symbols. This can be used on Unix by libtool. +# +SubInclude FT2_TOP $(FT2_SRC_DIR) tools ; + +rule GenExportSymbols +{ + local apinames = apinames$(SUFEXE) ; + local headers = [ Glob $(2) : *.h ] ; + + LOCATE on $(1) = $(ALL_LOCATE_TARGET) ; + + APINAMES on $(1) = apinames$(SUFEXE) ; + + Depends $(1) : $(apinames) $(headers) ; + GenExportSymbols1 $(1) : $(headers) ; + Clean clean : $(1) ; +} + +actions GenExportSymbols1 bind APINAMES +{ + $(APINAMES) $(2) > $(1) +} + +GenExportSymbols ftexport.sym : include/freetype include/freetype/cache ; + +# Test files (hinter debugging). Only used by FreeType developers. +# +if $(DEBUG_HINTER) +{ + SubInclude FT2_TOP tests ; +} + +rule RefDoc +{ + Depends $1 : all ; + NotFile $1 ; + Always $1 ; +} + +actions RefDoc +{ + python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.3.12 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h +} + +RefDoc refdoc ; + + +# end of top Jamfile diff --git a/alienblaster/project/jni/freetype/Jamrules b/alienblaster/project/jni/freetype/Jamrules new file mode 100644 index 000000000..d8d1c7e61 --- /dev/null +++ b/alienblaster/project/jni/freetype/Jamrules @@ -0,0 +1,71 @@ +# FreeType 2 JamRules. +# +# Copyright 2001, 2002, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# This file contains the Jam rules needed to build the FreeType 2 library. +# It is shared by all Jamfiles and is included only once in the build +# process. +# + + +# Call SubDirHdrs on a list of directories. +# +rule AddSubDirHdrs +{ + local x ; + + for x in $(<) + { + SubDirHdrs $(x) ; + } +} + + +# Determine prefix of library file. We must use "libxxxxx" on Unix systems, +# while all other simply use the real name. +# +if $(UNIX) +{ + LIBPREFIX ?= lib ; +} +else +{ + LIBPREFIX ?= "" ; +} + +# FT2_TOP contains the location of the FreeType source directory. You can +# set it to a specific value if you want to compile the library as part of a +# larger project. +# +FT2_TOP ?= $(DOT) ; + +# Define a new rule used to declare a sub directory of the Nirvana source +# tree. +# +rule FT2_SubDir +{ + if $(FT2_TOP) = $(DOT) + { + return [ FDirName $(<) ] ; + } + else + { + return [ FDirName $(FT2_TOP) $(<) ] ; + } +} + +# We also set ALL_LOCATE_TARGET in order to place all object and library +# files in "objs". +# +ALL_LOCATE_TARGET ?= [ FT2_SubDir objs ] ; + + +# end of Jamrules diff --git a/alienblaster/project/jni/freetype/Makefile b/alienblaster/project/jni/freetype/Makefile new file mode 100644 index 000000000..c1fa16cee --- /dev/null +++ b/alienblaster/project/jni/freetype/Makefile @@ -0,0 +1,34 @@ +# +# FreeType 2 build system -- top-level Makefile +# + + +# Copyright 1996-2000, 2002, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Project names +# +PROJECT := freetype +PROJECT_TITLE := FreeType + +# The variable TOP_DIR holds the path to the topmost directory in the project +# engine source hierarchy. If it is not defined, default it to `.'. +# +TOP_DIR ?= . + +# The variable OBJ_DIR gives the location where object files and the +# FreeType library are built. +# +OBJ_DIR ?= $(TOP_DIR)/objs + + +include $(TOP_DIR)/builds/toplevel.mk + +# EOF diff --git a/alienblaster/project/jni/freetype/README b/alienblaster/project/jni/freetype/README new file mode 100644 index 000000000..282791ef0 --- /dev/null +++ b/alienblaster/project/jni/freetype/README @@ -0,0 +1,64 @@ + Special notes to Unix users + =========================== + + Please read the file `docs/UPGRADE.UNIX'. It contains important + information regarding the installation of FreeType on Unix systems, + especially GNU based operating systems like GNU/Linux. + + FreeType 2's library is called `libfreetype', FreeType 1's library + is called `libttf'. They are *not* compatible! + + + FreeType 2.3.12 + =============== + + Please read the docs/CHANGES file, it contains IMPORTANT + INFORMATION. + + Read the files `docs/INSTALL' for installation instructions. + + The FreeType 2 API reference is located in `docs/reference'; use the + file `ft2-doc.html' as the top entry point. Additional + documentation is available as a separate package from our sites. Go + to + + http://download.savannah.gnu.org/releases/freetype/ + + and download one of the following files. + + freetype-doc-2.3.12.tar.bz2 + freetype-doc-2.3.12.tar.gz + ftdoc2312.zip + + + Bugs + ==== + + Please report bugs by e-mail to `freetype-devel@nongnu.org'. Don't + forget to send a detailed explanation of the problem -- there is + nothing worse than receiving a terse message that only says `it + doesn't work'. + + Alternatively, you may submit a bug report at + + https://savannah.nongnu.org/bugs/?group=freetype + + + Enjoy! + + + The FreeType Team + +---------------------------------------------------------------------- + +Copyright 2006, 2007, 2008, 2009, 2010 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of README --- diff --git a/alienblaster/project/jni/freetype/README.git b/alienblaster/project/jni/freetype/README.git new file mode 100644 index 000000000..89f290706 --- /dev/null +++ b/alienblaster/project/jni/freetype/README.git @@ -0,0 +1,46 @@ +The git archive doesn't contain pre-built configuration scripts for +UNIXish platforms. To generate them say + + sh autogen.sh + +which in turn depends on the following packages: + + automake (1.10.1) + libtool (2.2.4) + autoconf (2.62) + +The versions given in parentheses are known to work. Newer versions +should work too, of course. Note that autogen.sh also sets up proper +file permissions for the `configure' and auxiliary scripts. + +The autogen.sh script now checks the version of above three packages +whether they match the numbers above. Otherwise it will complain and +suggest either upgrading or using an environment variable to point to +a more recent version of the required tool(s). + +Note that `aclocal' is provided by the `automake' package on Linux, +and that `libtoolize' is called `glibtoolize' on Darwin (OS X). + + +For static builds which don't use platform specific optimizations, no +configure script is necessary at all; saying + + make setup ansi + make + +should work on all platforms which have GNU make (or makepp). + + +---------------------------------------------------------------------- + +Copyright 2005, 2006, 2007, 2008, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of README.CVS --- diff --git a/alienblaster/project/jni/freetype/autogen.sh b/alienblaster/project/jni/freetype/autogen.sh new file mode 100644 index 000000000..c28a51c13 --- /dev/null +++ b/alienblaster/project/jni/freetype/autogen.sh @@ -0,0 +1,163 @@ +#!/bin/sh + +# Copyright 2005, 2006, 2007, 2008, 2009, 2010 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +run () +{ + echo "running \`$*'" + eval $* + + if test $? != 0 ; then + echo "error while running \`$*'" + exit 1 + fi +} + +get_major_version () +{ + echo $1 | sed -e 's/\([0-9][0-9]*\)\..*/\1/g' +} + +get_minor_version () +{ + echo $1 | sed -e 's/[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/g' +} + +get_patch_version () +{ + # tricky: some version numbers don't include a patch + # separated with a point, but something like 1.4-p6 + patch=`echo $1 | sed -e 's/[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/g'` + if test "$patch" = "$1"; then + patch=`echo $1 | sed -e 's/[0-9][0-9]*\.[0-9][0-9]*\-p\([0-9][0-9]*\).*/\1/g'` + # if there isn't any patch number, default to 0 + if test "$patch" = "$1"; then + patch=0 + fi + fi + echo $patch +} + +# $1: version to check +# $2: minimum version + +compare_to_minimum_version () +{ + MAJOR1=`get_major_version $1` + MAJOR2=`get_major_version $2` + if test $MAJOR1 -lt $MAJOR2; then + echo 0 + return + else + if test $MAJOR1 -gt $MAJOR2; then + echo 1 + return + fi + fi + + MINOR1=`get_minor_version $1` + MINOR2=`get_minor_version $2` + if test $MINOR1 -lt $MINOR2; then + echo 0 + return + else + if test $MINOR1 -gt $MINOR2; then + echo 1 + return + fi + fi + + PATCH1=`get_patch_version $1` + PATCH2=`get_patch_version $2` + if test $PATCH1 -lt $PATCH2; then + echo 0 + else + echo 1 + fi +} + +# check the version of a given tool against a minimum version number +# +# $1: tool path +# $2: tool usual name (e.g. `aclocal') +# $3: tool variable (e.g. `ACLOCAL') +# $4: minimum version to check against +# $5: option field index used to extract the tool version from the +# output of --version + +check_tool_version () +{ + field=$5 + # assume the output of "[TOOL] --version" is "toolname (GNU toolname foo bar) version" + if test "$field"x = x; then + field=3 # default to 3 for all GNU autotools, after filtering enclosed string + fi + version=`$1 --version | head -1 | sed 's/([^)]*)/()/g' | cut -d ' ' -f $field` + version_check=`compare_to_minimum_version $version $4` + if test "$version_check"x = 0x; then + echo "ERROR: Your version of the \`$2' tool is too old." + echo " Minimum version $4 is required (yours is version $version)." + echo " Please upgrade or use the $3 variable to point to a more recent one." + echo "" + exit 1 + fi +} + +if test ! -f ./builds/unix/configure.raw; then + echo "You must be in the same directory as \`autogen.sh'." + echo "Bootstrapping doesn't work if srcdir != builddir." + exit 1 +fi + +# On MacOS X, the GNU libtool is named `glibtool'. +HOSTOS=`uname` +LIBTOOLIZE=libtoolize +if test "$HOSTOS"x = Darwinx; then + LIBTOOLIZE=glibtoolize +fi + +if test "$ACLOCAL"x = x; then + ACLOCAL=aclocal +fi + +if test "$AUTOCONF"x = x; then + AUTOCONF=autoconf +fi + +check_tool_version $ACLOCAL aclocal ACLOCAL 1.10.1 +check_tool_version $LIBTOOLIZE libtoolize LIBTOOLIZE 2.2.4 +check_tool_version $AUTOCONF autoconf AUTOCONF 2.62 + +# This sets freetype_major, freetype_minor, and freetype_patch. +eval `sed -nf version.sed include/freetype/freetype.h` + +# We set freetype-patch to an empty value if it is zero. +if test "$freetype_patch" = ".0"; then + freetype_patch= +fi + +cd builds/unix + +echo "generating \`configure.ac'" +sed -e "s;@VERSION@;$freetype_major$freetype_minor$freetype_patch;" \ + < configure.raw > configure.ac + +run aclocal -I . --force +run $LIBTOOLIZE --force --copy --install +run autoconf --force + +chmod +x mkinstalldirs +chmod +x install-sh + +cd ../.. + +chmod +x ./configure + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/amiga/README b/alienblaster/project/jni/freetype/builds/amiga/README new file mode 100644 index 000000000..2b8f8e87d --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/amiga/README @@ -0,0 +1,110 @@ + +README for the builds/amiga subdirectory. + +Copyright 2005 by +Werner Lemberg and Detlef Würkner. + +This file is part of the FreeType project, and may only be used, modified, +and distributed under the terms of the FreeType project license, +LICENSE.TXT. By continuing to use, modify, or distribute this file you +indicate that you have read the license and understand and accept it +fully. + + +The makefile.os4 is for the AmigaOS4 SDK. To use it, type +"make -f makefile.os4", it produces a link library libft2_ppc.a. + +The makefile is for ppc-morphos-gcc-2.95.3-bin.tgz (gcc 2.95.3 hosted on +68k-Amiga producing MorphOS-PPC-binaries from http://www.morphos.de). +To use it, type "make assign", then "make"; it produces a link library +libft2_ppc.a. + +The smakefile is a makefile for Amiga SAS/C 6.58 (no longer available, +latest sold version was 6.50, updates can be found in Aminet). It is +based on the version found in the sourcecode of ttf.library 0.83b for +FreeType 1.3.1 from Richard Griffith (ragriffi@sprynet.com, +http://ragriffi.home.sprynet.com). + +You will also need the latest include files and amiga.lib from the +Amiga web site (http://www.amiga.com/3.9/download/NDK3.9.lha) for +AmigaOS 3.9; the generated code should work under AmigaOS 2.04 and up. + +To use it, call "smake assign" and then "smake" from the builds/amiga +directory. The results are: + +- A link library "ft2_680x0.lib" (where x depends on the setting of + the CPU entry in the smakefile) containing all FreeType2 parts + except of the init code, debugging code, and the system interface + code. + +- ftsystem.o, an object module containing the standard version of the + system interface code which uses fopen() fclose() fread() fseek() + ftell() malloc() realloc() and free() from lib:sc.lib (not pure). + +- ftsystempure.o, an object module containing the pure version of the + system interface code which uses Open() Close() Read() Seek() + ExamineFH() AsmAllocPooled() AsmFreePooled() etc. This version can + be used in both normal programs and in Amiga run-time shared system + librarys (can be linked with lib:libinit.o, no copying of DATA and + BSS hunks for each OpenLibrary() necessary). Source code is in + src/base/ftsystem.c. + +- ftdebug.o, an object module containing the standard version of the + debugging code which uses vprintf() and exit() (not pure). + Debugging can be turned on in FT:include/freetype/config/ftoption.h + and with FT_SetTraceLevel(). + +- ftdebugpure.o, an object module containing the pure version of the + debugging code which uses KVPrintf() from lib:debug.lib and no + exit(). For debugging of Amiga run-time shared system libraries. + Source code is in src/base/ftdebug.c. + +- NO ftinit.o. Because linking with a link library should result in + linking only the needed object modules in it, but standard + ftsystem.o would force ALL FreeType2 modules to be linked to your + program, I decided to use a different scheme: You must #include + FT:src/base/ftinit.c in your sourcecode and specify with #define + statements which modules you need. See + include/freetype/config/ftmodule.h. + + +To use in your own programs: + +- Insert the #define and #include statements from top of + include/freetype/config/ftmodule.h in your source code and uncomment + the #define statements for the FreeType2 modules you need. + +- You can use either PARAMETERS=REGISTER or PARAMETERS=STACK for + calling the FreeType2 functions, because the link library and the + object files are compiled with PARAMETERS=BOTH. + +- "smake assign" (assign "FT:" to the FreeType2 main directory). + +- Compile your program. + +- Link with either ftsystem.o or ftsystempure.o, if debugging enabled + with either ftdebug.o or (ftdebugpure.o and lib:debug.lib), and with + ft2_680x0.lib as link library. + + +To adapt to other compilers: + +- The standard ANSI C maximum length of 31 significant characters in + identifiers is not enough for FreeType2. Check if your compiler has + a minimum length of 40 significant characters or can be switched to + it. "idlen=40" is the option for SAS/C. Setting #define + HAVE_LIMIT_ON_IDENTS in an include file may also work (not tested). + +- Make sure that the include directory in builds/amiga is searched + before the normal FreeType2 include directory, so you are able to + replace problematic include files with your own version (same may be + useful for the src directory). + +- An example of how to replace/workaround a problematic include file + is include/config/ftconfig.h; it changes a #define that would + prevent SAS/C from generating XDEF's where it should do that and + then includes the standard FreeType2 include file. + +Local Variables: +coding: latin-1 +End: diff --git a/alienblaster/project/jni/freetype/builds/amiga/include/freetype/config/ftconfig.h b/alienblaster/project/jni/freetype/builds/amiga/include/freetype/config/ftconfig.h new file mode 100644 index 000000000..c2c2ac8db --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/amiga/include/freetype/config/ftconfig.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* Amiga-specific configuration file (specification only). */ +/* */ +/* Copyright 2005, 2006, 2007 by */ +/* Werner Lemberg and Detlef Würkner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/* + * This is an example how to override the default FreeType2 header files + * with Amiga-specific changes. When the compiler searches this directory + * before the default directory, we can do some modifications. + * + * Here we must change FT_EXPORT_DEF so that SAS/C does + * generate the needed XDEFs. + */ + +#if 0 +#define FT_EXPORT_DEF( x ) extern x +#endif + +#undef FT_EXPORT_DEF +#define FT_EXPORT_DEF( x ) x + +/* Now include the original file */ +#ifndef __MORPHOS__ +#ifdef __SASC +#include "FT:include/freetype/config/ftconfig.h" +#else +#include "/FT/include/freetype/config/ftconfig.h" +#endif +#else +/* We must define that, it seems that + * lib/gcc-lib/ppc-morphos/2.95.3/include/syslimits.h is missing in + * ppc-morphos-gcc-2.95.3-bin.tgz (gcc for 68k producing MorphOS PPC elf + * binaries from http://www.morphos.de) + */ +#define _LIBC_LIMITS_H_ +#include "/FT/include/freetype/config/ftconfig.h" +#endif + +/* +Local Variables: +coding: latin-1 +End: +*/ diff --git a/alienblaster/project/jni/freetype/builds/amiga/include/freetype/config/ftmodule.h b/alienblaster/project/jni/freetype/builds/amiga/include/freetype/config/ftmodule.h new file mode 100644 index 000000000..5873bab74 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/amiga/include/freetype/config/ftmodule.h @@ -0,0 +1,160 @@ +/***************************************************************************/ +/* */ +/* ftmodule.h */ +/* */ +/* Amiga-specific FreeType module selection. */ +/* */ +/* Copyright 2005 by */ +/* Werner Lemberg and Detlef Würkner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/* + * To avoid that all your programs include all FreeType modules, + * you copy the following piece of source code into your own + * source file and specify which modules you really need in your + * application by uncommenting the appropriate lines. + */ +/* +//#define FT_USE_AUTOFIT // autofitter +//#define FT_USE_RASTER // monochrome rasterizer +//#define FT_USE_SMOOTH // anti-aliasing rasterizer +//#define FT_USE_TT // truetype font driver +//#define FT_USE_T1 // type1 font driver +//#define FT_USE_T42 // type42 font driver +//#define FT_USE_T1CID // cid-keyed type1 font driver // no cmap support +//#define FT_USE_CFF // opentype font driver +//#define FT_USE_BDF // bdf bitmap font driver +//#define FT_USE_PCF // pcf bitmap font driver +//#define FT_USE_PFR // pfr font driver +//#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver +//#define FT_USE_OTV // opentype validator +//#define FT_USE_GXV // truetype gx validator +#include "FT:src/base/ftinit.c" +*/ + +/* Make sure that the needed support modules are built in. + * Dependencies can be found by searching for FT_Get_Module. + */ + +#ifdef FT_USE_T42 +#define FT_USE_TT +#endif + +#ifdef FT_USE_TT +#define FT_USE_SFNT +#endif + +#ifdef FT_USE_CFF +#define FT_USE_SFNT +#define FT_USE_PSHINT +#define FT_USE_PSNAMES +#endif + +#ifdef FT_USE_T1 +#define FT_USE_PSAUX +#define FT_USE_PSHINT +#define FT_USE_PSNAMES +#endif + +#ifdef FT_USE_T1CID +#define FT_USE_PSAUX +#define FT_USE_PSHINT +#define FT_USE_PSNAMES +#endif + +#ifdef FT_USE_PSAUX +#define FT_USE_PSNAMES +#endif + +#ifdef FT_USE_SFNT +#define FT_USE_PSNAMES +#endif + +/* Now include the modules */ + +#ifdef FT_USE_AUTOFIT +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +#endif + +#ifdef FT_USE_TT +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +#endif + +#ifdef FT_USE_T1 +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +#endif + +#ifdef FT_USE_CFF +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +#endif + +#ifdef FT_USE_T1CID +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +#endif + +#ifdef FT_USE_PFR +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +#endif + +#ifdef FT_USE_T42 +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +#endif + +#ifdef FT_USE_WINFNT +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +#endif + +#ifdef FT_USE_PCF +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +#endif + +#ifdef FT_USE_PSAUX +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +#endif + +#ifdef FT_USE_PSNAMES +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +#endif + +#ifdef FT_USE_PSHINT +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +#endif + +#ifdef FT_USE_RASTER +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +#endif + +#ifdef FT_USE_SFNT +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +#endif + +#ifdef FT_USE_SMOOTH +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) +#endif + +#ifdef FT_USE_OTV +FT_USE_MODULE( FT_Module_Class, otv_module_class ) +#endif + +#ifdef FT_USE_BDF +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) +#endif + +#ifdef FT_USE_GXV +FT_USE_MODULE( FT_Module_Class, gxv_module_class ) +#endif + +/* +Local Variables: +coding: latin-1 +End: +*/ diff --git a/alienblaster/project/jni/freetype/builds/amiga/makefile b/alienblaster/project/jni/freetype/builds/amiga/makefile new file mode 100644 index 000000000..e874a1f29 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/amiga/makefile @@ -0,0 +1,294 @@ +# +# Makefile for FreeType2 link library using ppc-morphos-gcc-2.95.3-bin.tgz +# (gcc 2.95.3 hosted on 68k-Amiga producing MorphOS-PPC-binaries from +# http://www.morphos.de) +# + + +# Copyright 2005, 2006, 2007, 2009 by +# Werner Lemberg and Detlef Würkner. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# +# to build from the builds/amiga directory call +# +# make assign +# make +# +# Your programs source code should start with this +# (uncomment the parts you do not need to keep the program small): +# ---8<--- +#define FT_USE_AUTOFIT // autofitter +#define FT_USE_RASTER // monochrome rasterizer +#define FT_USE_SMOOTH // anti-aliasing rasterizer +#define FT_USE_TT // truetype font driver +#define FT_USE_T1 // type1 font driver +#define FT_USE_T42 // type42 font driver +#define FT_USE_T1CID // cid-keyed type1 font driver +#define FT_USE_CFF // opentype font driver +#define FT_USE_BDF // bdf bitmap font driver +#define FT_USE_PCF // pcf bitmap font driver +#define FT_USE_PFR // pfr font driver +#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver +#define FT_USE_OTV // opentype validator +#define FT_USE_GXV // truetype gx validator +#include "FT:src/base/ftinit.c" +# ---8<--- +# +# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o +# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or +# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). + +all: libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o + +assign: + assign FT: // + +FTSRC = /FT/src + +CC = ppc-morphos-gcc +AR = ppc-morphos-ar rc +RANLIB = ppc-morphos-ranlib +LD = ppc-morphos-ld +CFLAGS = -DFT2_BUILD_LIBRARY -O2 -I/emu/emulinclude/includegcc -I/emu/include -Iinclude -I$(FTSRC) -I/FT/include + +# +# FreeType2 library base +# +ftbase.ppc.o: $(FTSRC)/base/ftbase.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftinit.ppc.o: $(FTSRC)/base/ftinit.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftsystem.ppc.o: $(FTSRC)/base/ftsystem.c + $(CC) -c $(CFLAGS) -o $@ $< + +# pure version for use in run-time library etc +ftsystempure.ppc.o: src/base/ftsystem.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftdebug.ppc.o: $(FTSRC)/base/ftdebug.c + $(CC) -c $(CFLAGS) -o $@ $< + +# pure version for use in run-time library etc +ftdebugpure.ppc.o: src/base/ftdebug.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library base extensions +# +ftbbox.ppc.o: $(FTSRC)/base/ftbbox.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftbdf.ppc.o: $(FTSRC)/base/ftbdf.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftbitmap.ppc.o: $(FTSRC)/base/ftbitmap.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftcid.ppc.o: $(FTSRC)/base/ftcid.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftfstype.ppc.o: $(FTSRC)/base/ftfstype.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftgasp.ppc.o: $(FTSRC)/base/ftgasp.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftglyph.ppc.o: $(FTSRC)/base/ftglyph.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftgxval.ppc.o: $(FTSRC)/base/ftgxval.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftlcdfil.ppc.o: $(FTSRC)/base/ftlcdfil.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftmm.ppc.o: $(FTSRC)/base/ftmm.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftotval.ppc.o: $(FTSRC)/base/ftotval.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftpatent.ppc.o: $(FTSRC)/base/ftpatent.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftpfr.ppc.o: $(FTSRC)/base/ftpfr.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftstroke.ppc.o: $(FTSRC)/base/ftstroke.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftsynth.ppc.o: $(FTSRC)/base/ftsynth.c + $(CC) -c $(CFLAGS) -o $@ $< + +fttype1.ppc.o: $(FTSRC)/base/fttype1.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftwinfnt.ppc.o: $(FTSRC)/base/ftwinfnt.c + $(CC) -c $(CFLAGS) -o $@ $< + +ftxf86.ppc.o: $(FTSRC)/base/ftxf86.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library autofitting module +# +autofit.ppc.o: $(FTSRC)/autofit/autofit.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library postscript hinting module +# +pshinter.ppc.o: $(FTSRC)/pshinter/pshinter.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library PS support module +# +psaux.ppc.o: $(FTSRC)/psaux/psaux.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library PS glyph names module +# +psnames.ppc.o: $(FTSRC)/psnames/psnames.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library monochrome raster module +# +raster.ppc.o: $(FTSRC)/raster/raster.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library anti-aliasing raster module +# +smooth.ppc.o: $(FTSRC)/smooth/smooth.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library 'sfnt' module +# +sfnt.ppc.o: $(FTSRC)/sfnt/sfnt.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library glyph and image caching system +# +ftcache.ppc.o: $(FTSRC)/cache/ftcache.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library OpenType font driver +# +cff.ppc.o: $(FTSRC)/cff/cff.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library TrueType font driver +# +truetype.ppc.o: $(FTSRC)/truetype/truetype.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library Type1 font driver +# +type1.ppc.o: $(FTSRC)/type1/type1.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library Type42 font driver +# +type42.ppc.o: $(FTSRC)/type42/type42.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library CID-keyed Type1 font driver +# +type1cid.ppc.o: $(FTSRC)/cid/type1cid.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library BDF bitmap font driver +# +bdf.ppc.o: $(FTSRC)/bdf/bdf.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library PCF bitmap font driver +# +pcf.ppc.o: $(FTSRC)/pcf/pcf.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library gzip support for compressed PCF bitmap fonts +# +gzip.ppc.o: $(FTSRC)/gzip/ftgzip.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library compress support for compressed PCF bitmap fonts +# +lzw.ppc.o: $(FTSRC)/lzw/ftlzw.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library PFR font driver +# +pfr.ppc.o: $(FTSRC)/pfr/pfr.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library Windows FNT/FON bitmap font driver +# +winfnt.ppc.o: $(FTSRC)/winfonts/winfnt.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library TrueTypeGX Validator +# +gxvalid.ppc.o: $(FTSRC)/gxvalid/gxvalid.c + $(CC) -c $(CFLAGS) -o $@ $< + +# +# FreeType2 library OpenType validator +# +otvalid.ppc.o: $(FTSRC)/otvalid/otvalid.c + $(CC) -c $(CFLAGS) -o $@ $< + +BASEPPC = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o \ + ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o ftgxval.ppc.o \ + ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o ftpatent.ppc.o ftpfr.ppc.o \ + ftstroke.ppc.o ftsynth.ppc.o fttype1.ppc.o ftwinfnt.ppc.o \ + ftxf86.ppc.o + +DEBUGPPC = ftdebug.ppc.o ftdebugpure.ppc.o + +AFITPPC = autofit.ppc.o + +GXVPPC = gxvalid.ppc.o + +OTVPPC = otvalid.ppc.o + +PSPPC = psaux.ppc.o psnames.ppc.o pshinter.ppc.o + +RASTERPPC = raster.ppc.o smooth.ppc.o + +FONTDPPC = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\ + bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o + +libft2_ppc.a: $(BASEPPC) $(AFITPPC) $(GXVPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o lzw.ppc.o + $(AR) $@ $(BASEPPC) $(AFITPPC) $(GXVPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o lzw.ppc.o + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + +#Local Variables: +#coding: latin-1 +#End: diff --git a/alienblaster/project/jni/freetype/builds/amiga/makefile.os4 b/alienblaster/project/jni/freetype/builds/amiga/makefile.os4 new file mode 100644 index 000000000..edd88eba9 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/amiga/makefile.os4 @@ -0,0 +1,297 @@ +# +# Makefile for FreeType2 link library using gcc 4.0.3 from the +# AmigaOS4 SDK +# + + +# Copyright 2005, 2006, 2007, 2009 by +# Werner Lemberg and Detlef Würkner. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# to build from the builds/amiga directory call +# +# make -f makefile.os4 +# +# Your programs source code should start with this +# (uncomment the parts you do not need to keep the program small): +# ---8<--- +#define FT_USE_AUTOFIT // autofitter +#define FT_USE_RASTER // monochrome rasterizer +#define FT_USE_SMOOTH // anti-aliasing rasterizer +#define FT_USE_TT // truetype font driver +#define FT_USE_T1 // type1 font driver +#define FT_USE_T42 // type42 font driver +#define FT_USE_T1CID // cid-keyed type1 font driver +#define FT_USE_CFF // opentype font driver +#define FT_USE_BDF // bdf bitmap font driver +#define FT_USE_PCF // pcf bitmap font driver +#define FT_USE_PFR // pfr font driver +#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver +#define FT_USE_OTV // opentype validator +#define FT_USE_GXV // truetype gx validator +#include "FT:src/base/ftinit.c" +# ---8<--- +# +# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o +# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or +# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). + +all: assign libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o + +assign: + assign FT: // + +CC = ppc-amigaos-gcc +AR = ppc-amigaos-ar +RANLIB = ppc-amigaos-ranlib + +DIRFLAGS = -Iinclude -I/FT/src -I/FT/include -I/SDK/include + +WARNINGS = -Wall -W -Wundef -Wpointer-arith -Wbad-function-cast \ + -Waggregate-return -Wwrite-strings -Wshadow + +OPTIONS = -DFT2_BUILD_LIBRARY -DNDEBUG -fno-builtin +OPTIMIZE = -O2 -fomit-frame-pointer -fstrength-reduce -finline-functions + +CFLAGS = -mcrt=clib2 $(DIRFLAGS) $(WARNINGS) $(FT2FLAGS) $(OPTIONS) $(OPTIMIZE) + +# +# FreeType2 library base +# +ftbase.ppc.o: FT:src/base/ftbase.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbase.c + +ftinit.ppc.o: FT:src/base/ftinit.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftinit.c + +ftsystem.ppc.o: FT:src/base/ftsystem.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsystem.c + +# pure version for use in run-time library etc +ftsystempure.ppc.o: src/base/ftsystem.c + $(CC) -c $(CFLAGS) -o $@ src/base/ftsystem.c + +# +# FreeType2 library base extensions +# +ftbbox.ppc.o: FT:src/base/ftbbox.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbbox.c + +ftbdf.ppc.o: FT:src/base/ftbdf.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbdf.c + +ftbitmap.ppc.o: FT:src/base/ftbitmap.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbitmap.c + +ftcid.ppc.o: FT:src/base/ftcid.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftcid.c + +ftdebug.ppc.o: FT:src/base/ftdebug.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftdebug.c + +# pure version for use in run-time library etc +ftdebugpure.ppc.o: src/base/ftdebug.c + $(CC) -c $(CFLAGS) -o $@ src/base/ftdebug.c + +ftfstype.ppc.o: FT:src/base/ftfstype.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftfstype.c + +ftgasp.ppc.o: FT:src/base/ftgasp.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgasp.c + +ftglyph.ppc.o: FT:src/base/ftglyph.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftglyph.c + +ftgxval.ppc.o: FT:src/base/ftgxval.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgxval.c + +ftlcdfil.ppc.o: FT:src/base/ftlcdfil.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftlcdfil.c + +ftmm.ppc.o: FT:src/base/ftmm.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftmm.c + +ftotval.ppc.o: FT:src/base/ftotval.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftotval.c + +ftpatent.ppc.o: FT:src/base/ftpatent.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftpatent.c + +ftpfr.ppc.o: FT:src/base/ftpfr.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftpfr.c + +ftstroke.ppc.o: FT:src/base/ftstroke.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftstroke.c + +ftsynth.ppc.o: FT:src/base/ftsynth.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsynth.c + +fttype1.ppc.o: FT:src/base/fttype1.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/fttype1.c + +ftwinfnt.ppc.o: FT:src/base/ftwinfnt.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftwinfnt.c + +ftxf86.ppc.o: FT:src/base/ftxf86.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftxf86.c + +# +# FreeType2 library autofitting module +# +autofit.ppc.o: FT:src/autofit/autofit.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/autofit/autofit.c + +# +# FreeType2 library postscript hinting module +# +pshinter.ppc.o: FT:src/pshinter/pshinter.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/pshinter/pshinter.c + +# +# FreeType2 library PS support module +# +psaux.ppc.o: FT:src/psaux/psaux.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/psaux/psaux.c + +# +# FreeType2 library PS glyph names module +# +psnames.ppc.o: FT:src/psnames/psnames.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/psnames/psnames.c + +# +# FreeType2 library monochrome raster module +# +raster.ppc.o: FT:src/raster/raster.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/raster/raster.c + +# +# FreeType2 library anti-aliasing raster module +# +smooth.ppc.o: FT:src/smooth/smooth.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/smooth/smooth.c + +# +# FreeType2 library 'sfnt' module +# +sfnt.ppc.o: FT:src/sfnt/sfnt.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/sfnt/sfnt.c + +# +# FreeType2 library glyph and image caching system +# +ftcache.ppc.o: FT:src/cache/ftcache.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/cache/ftcache.c + +# +# FreeType2 library OpenType font driver +# +cff.ppc.o: FT:src/cff/cff.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/cff/cff.c + +# +# FreeType2 library TrueType font driver +# +truetype.ppc.o: FT:src/truetype/truetype.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/truetype/truetype.c + +# +# FreeType2 library Type1 font driver +# +type1.ppc.o: FT:src/type1/type1.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/type1/type1.c + +# +# FreeType2 library Type42 font driver +# +type42.ppc.o: FT:src/type42/type42.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/type42/type42.c + +# +# FreeType2 library CID-keyed Type1 font driver +# +type1cid.ppc.o: FT:src/cid/type1cid.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/cid/type1cid.c + +# +# FreeType2 library BDF bitmap font driver +# +bdf.ppc.o: FT:src/bdf/bdf.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/bdf/bdf.c + +# +# FreeType2 library PCF bitmap font driver +# +pcf.ppc.o: FT:src/pcf/pcf.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/pcf/pcf.c + +# +# FreeType2 library gzip support for compressed PCF bitmap fonts +# +gzip.ppc.o: FT:src/gzip/ftgzip.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/gzip/ftgzip.c + +# +# FreeType2 library compress support for compressed PCF bitmap fonts +# +lzw.ppc.o: FT:src/lzw/ftlzw.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/lzw/ftlzw.c + +# +# FreeType2 library PFR font driver +# +pfr.ppc.o: FT:src/pfr/pfr.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/pfr/pfr.c + +# +# FreeType2 library Windows FNT/FON bitmap font driver +# +winfnt.ppc.o: FT:src/winfonts/winfnt.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/winfonts/winfnt.c + +# +# FreeType2 library TrueTypeGX Validator +# +gxvalid.ppc.o: FT:src/gxvalid/gxvalid.c + $(CC) -c $(CFLAGS) -Wno-aggregate-return -o $@ /FT/src/gxvalid/gxvalid.c + +# +# FreeType2 library OpenType validator +# +otvalid.ppc.o: FT:src/otvalid/otvalid.c + $(CC) -c $(CFLAGS) -o $@ /FT/src/otvalid/otvalid.c + +BASE = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o \ + ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o ftgxval.ppc.o \ + ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o ftpatent.ppc.o ftpfr.ppc.o \ + ftstroke.ppc.o ftsynth.ppc.o fttype1.ppc.o ftwinfnt.ppc.o \ + ftxf86.ppc.o + +DEBUG = ftdebug.ppc.o ftdebugpure.ppc.o + +AFIT = autofit.ppc.o + +GXV = gxvalid.ppc.o + +OTV = otvalid.ppc.o + +PS = psaux.ppc.o psnames.ppc.o pshinter.ppc.o + +RASTER = raster.ppc.o smooth.ppc.o + +FONTD = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\ + bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o + +libft2_ppc.a: $(BASE) $(AFIT) $(GXV) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o + $(AR) r $@ $(BASE) $(AFIT) $(GXV) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o + $(RANLIB) $@ + +#Local Variables: +#coding: latin-1 +#End: diff --git a/alienblaster/project/jni/freetype/builds/amiga/smakefile b/alienblaster/project/jni/freetype/builds/amiga/smakefile new file mode 100644 index 000000000..2a561a882 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/amiga/smakefile @@ -0,0 +1,297 @@ +# +# Makefile for FreeType2 link library using Amiga SAS/C 6.58 +# + + +# Copyright 2005,2006, 2007, 2009 by +# Werner Lemberg and Detlef Würkner. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# to build from the builds/amiga directory call +# +# smake assign +# smake +# +# Your programs source code should start with this +# (uncomment the parts you do not need to keep the program small): +# ---8<--- +#define FT_USE_AUTOFIT // autofitter +#define FT_USE_RASTER // monochrome rasterizer +#define FT_USE_SMOOTH // anti-aliasing rasterizer +#define FT_USE_TT // truetype font driver +#define FT_USE_T1 // type1 font driver +#define FT_USE_T42 // type42 font driver +#define FT_USE_T1CID // cid-keyed type1 font driver +#define FT_USE_CFF // opentype font driver +#define FT_USE_BDF // bdf bitmap font driver +#define FT_USE_PCF // pcf bitmap font driver +#define FT_USE_PFR // pfr font driver +#define FT_USE_WINFNT // windows .fnt|.fon bitmap font driver +#define FT_USE_OTV // opentype validator +#define FT_USE_GXV // truetype gx validator +#include "FT:src/base/ftinit.c" +# ---8<--- +# +# link your programs with ft2_680x0.lib and either ftsystem.o or ftsystempure.o +# (and either ftdebug.o or ftdebugpure.o if you enabled FT_DEBUG_LEVEL_ERROR or +# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h). + +OBJBASE = ftbase.o ftbbox.o ftbdf.o ftbitmap.o ftcid.o ftfstype.o ftgasp.o \ + ftglyph.o ftgxval.o ftlcdfil.o ftmm.o ftotval.o ftpatent.o ftpfr.o \ + ftstroke.o ftsynth.o fttype1.o ftwinfnt.o ftxf86.o + +OBJSYSTEM = ftsystem.o ftsystempure.o + +OBJDEBUG = ftdebug.o ftdebugpure.o + +OBJAFIT = autofit.o + +OBJGXV = gxvalid.o + +OBJOTV = otvalid.o + +OBJPS = psaux.o psnames.o pshinter.o + +OBJRASTER = raster.o smooth.o + +OBJSFNT = sfnt.o + +OBJCACHE = ftcache.o + +OBJFONTD = cff.o type1.o type42.o type1cid.o\ + truetype.o winfnt.o bdf.o pcf.o pfr.o + +CORE = FT:src/ + +CPU = 68000 +#CPU = 68020 +#CPU = 68030 +#CPU = 68040 +#CPU = 68060 + +OPTIMIZER = optinlocal + +SCFLAGS = optimize opttime optsched strmerge data=faronly idlen=50 cpu=$(CPU)\ + idir=include/ idir=$(CORE) idir=FT:include/ nostackcheck nochkabort\ + noicons ignore=79,85,110,306 parameters=both define=FT2_BUILD_LIBRARY + +LIB = ft2_$(CPU).lib + +# sample linker options +OPTS = link lib=$(LIB),lib:sc.lib,lib:amiga.lib,lib:debug.lib\ + smallcode smalldata noicons utillib + +# sample program entry +#myprog: myprog.c ftsystem.o $(LIB) +# sc $< programname=$@ ftsystem.o $(SCFLAGS) $(OPTS) + +all: $(LIB) $(OBJSYSTEM) $(OBJDEBUG) + +assign: + assign FT: // + +# uses separate object modules in lib to make for easier debugging +# also, can make smaller programs if entire engine is not used +ft2_$(CPU).lib: $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o gzip.o + oml $@ r $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o gzip.o + +clean: + -delete \#?.o + +realclean: clean + -delete ft2$(CPU).lib + +# +# freetype library base +# +ftbase.o: $(CORE)base/ftbase.c + sc $(SCFLAGS) objname=$@ $< +ftinit.o: $(CORE)base/ftinit.c + sc $(SCFLAGS) objname=$@ $< +ftsystem.o: $(CORE)base/ftsystem.c + sc $(SCFLAGS) objname=$@ $< +ftsystempure.o: src/base/ftsystem.c ## pure version for use in run-time library etc + sc $(SCFLAGS) objname=$@ $< +ftdebug.o: $(CORE)base/ftdebug.c + sc $(SCFLAGS) objname=$@ $< +ftdebugpure.o: src/base/ftdebug.c ## pure version for use in run-time library etc + sc $(SCFLAGS) objname=$@ $< +# +# freetype library base extensions +# +ftbbox.o: $(CORE)base/ftbbox.c + sc $(SCFLAGS) objname=$@ $< +ftbdf.o: $(CORE)base/ftbdf.c + sc $(SCFLAGS) objname=$@ $< +ftbitmap.o: $(CORE)base/ftbitmap.c + sc $(SCFLAGS) objname=$@ $< +ftcid.o: $(CORE)base/ftcid.c + sc $(SCFLAGS) objname=$@ $< +ftfstype.o: $(CORE)base/ftfstype.c + sc $(SCFLAGS) objname=$@ $< +ftgasp.o: $(CORE)base/ftgasp.c + sc $(SCFLAGS) objname=$@ $< +ftglyph.o: $(CORE)base/ftglyph.c + sc $(SCFLAGS) objname=$@ $< +ftgxval.o: $(CORE)base/ftgxval.c + sc $(SCFLAGS) objname=$@ $< +ftlcdfil.o: $(CORE)base/ftlcdfil.c + sc $(SCFLAGS) objname=$@ $< +ftmm.o: $(CORE)base/ftmm.c + sc $(SCFLAGS) objname=$@ $< +ftotval.o: $(CORE)base/ftotval.c + sc $(SCFLAGS) objname=$@ $< +ftpatent.o: $(CORE)base/ftpatent.c + sc $(SCFLAGS) objname=$@ $< +ftpfr.o: $(CORE)base/ftpfr.c + sc $(SCFLAGS) objname=$@ $< +ftstroke.o: $(CORE)base/ftstroke.c + sc $(SCFLAGS) objname=$@ $< +ftsynth.o: $(CORE)base/ftsynth.c + sc $(SCFLAGS) objname=$@ $< +fttype1.o: $(CORE)base/fttype1.c + sc $(SCFLAGS) objname=$@ $< +ftwinfnt.o: $(CORE)base/ftwinfnt.c + sc $(SCFLAGS) objname=$@ $< +ftxf86.o: $(CORE)base/ftxf86.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library autofitter module +# +autofit.o: $(CORE)autofit/autofit.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library PS hinting module +# +pshinter.o: $(CORE)pshinter/pshinter.c + sc $(SCFLAGS) objname=$@ $< +# +# freetype library PS support module +# +psaux.o: $(CORE)psaux/psaux.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library PS glyph names module +# +psnames.o: $(CORE)psnames/psnames.c + sc $(SCFLAGS) code=far objname=$@ $< + +# +# freetype library monochrome raster module +# +raster.o: $(CORE)raster/raster.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library anti-aliasing raster module +# +smooth.o: $(CORE)smooth/smooth.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library 'sfnt' module +# +sfnt.o: $(CORE)sfnt/sfnt.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library glyph and image caching system (still experimental) +# +ftcache.o: $(CORE)cache/ftcache.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library OpenType font driver +# +cff.o: $(CORE)cff/cff.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library TrueType font driver +# +truetype.o: $(CORE)truetype/truetype.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library Type1 font driver +# +type1.o: $(CORE)type1/type1.c + sc $(SCFLAGS) objname=$@ $< + +# +# FreeType2 library Type42 font driver +# +type42.o: $(CORE)type42/type42.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library CID-keyed Type1 font driver +# +type1cid.o: $(CORE)cid/type1cid.c + sc $(SCFLAGS) objname=$@ $< +# +# freetype library CID-keyed Type1 font driver extensions +# +#cidafm.o: $(CORE)cid/cidafm.c +# sc $(SCFLAGS) objname=$@ $< + +# +# freetype library BDF bitmap font driver +# +bdf.o: $(CORE)bdf/bdf.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library PCF bitmap font driver +# +pcf.o: $(CORE)pcf/pcf.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library gzip support for compressed PCF bitmap fonts +# +gzip.o: $(CORE)gzip/ftgzip.c + sc $(SCFLAGS) define FAR objname=$@ $< + +# +# freetype library compress support for compressed PCF bitmap fonts +# +lzw.o: $(CORE)lzw/ftlzw.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library PFR font driver +# +pfr.o: $(CORE)pfr/pfr.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library Windows FNT/FON bitmap font driver +# +winfnt.o: $(CORE)winfonts/winfnt.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library TrueTypeGX validator +# +gxvalid.o: $(CORE)gxvalid/gxvalid.c + sc $(SCFLAGS) objname=$@ $< + +# +# freetype library OpenType validator +# +otvalid.o: $(CORE)otvalid/otvalid.c + sc $(SCFLAGS) objname=$@ $< + +#Local Variables: +#coding: latin-1 +#End: diff --git a/alienblaster/project/jni/freetype/builds/amiga/src/base/ftdebug.c b/alienblaster/project/jni/freetype/builds/amiga/src/base/ftdebug.c new file mode 100644 index 000000000..5284e697a --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/amiga/src/base/ftdebug.c @@ -0,0 +1,279 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +/* + * Based on the default ftdebug.c, + * replaced vprintf() with KVPrintF(), + * commented out exit(), + * replaced getenv() with GetVar(). + */ + +#include +#include +#include +#include +#define __NOLIBBASE__ +#define __NOLOBALIFACE__ +#define __USE_INLINE__ +#include +#include + +#ifndef __amigaos4__ +extern struct Library *DOSBase; +#else +extern struct DOSIFace *IDOS; +#endif + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H + + +#if defined( FT_DEBUG_LEVEL_ERROR ) + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); +/* vprintf( fmt, ap ); */ + KVPrintF( fmt, ap ); + va_end( ap ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); +/* vprintf( fmt, ap ); */ + KVPrintF( fmt, ap ); + va_end( ap ); + +/* exit( EXIT_FAILURE ); */ + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the `FT2_DEBUG' environment variable. It must be a list of */ + /* toggles, separated by spaces, `;', or `,'. Example: */ + /* */ + /* export FT2_DEBUG="any:3 memory:7 stream:5" */ + /* */ + /* This requests that all levels be set to 3, except the trace level for */ + /* the memory and stream components which are set to 7 and 5, */ + /* respectively. */ + /* */ + /* See the file for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 7; 0 means quiet (except for serious */ + /* runtime errors), and 7 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { +/* const char* ft2_debug = getenv( "FT2_DEBUG" ); */ + char buf[256]; + const char* ft2_debug = &buf[0]; + + +/* if ( ft2_debug ) */ + if ( GetVar( "FT2_DEBUG", (STRPTR)ft2_debug, 256, LV_VAR ) > 0 ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + +/* +Local Variables: +coding: latin-1 +End: +*/ +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/amiga/src/base/ftsystem.c b/alienblaster/project/jni/freetype/builds/amiga/src/base/ftsystem.c new file mode 100644 index 000000000..016f1e29e --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/amiga/src/base/ftsystem.c @@ -0,0 +1,522 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* Amiga-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file contains the Amiga interface used by FreeType to access */ + /* low-level, i.e. memory management, i/o access as well as thread */ + /* synchronisation. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Maintained by Detlef Würkner */ + /* */ + /* Based on the original ftsystem.c, */ + /* modified to avoid fopen(), fclose(), fread(), fseek(), ftell(), */ + /* malloc(), realloc(), and free(). */ + /* */ + /* Those C library functions are often not thread-safe or cant be */ + /* used in a shared Amiga library. If that's not a problem for you, */ + /* you can of course use the default ftsystem.c with C library calls */ + /* instead. */ + /* */ + /* This implementation needs exec V39+ because it uses AllocPooled() etc */ + /* */ + /*************************************************************************/ + +#define __NOLIBBASE__ +#define __NOGLOBALIFACE__ +#define __USE_INLINE__ +#include +#include +#include +#ifdef __amigaos4__ +extern struct ExecIFace *IExec; +extern struct DOSIFace *IDOS; +#else +extern struct Library *SysBase; +extern struct Library *DOSBase; +#endif + +#define IOBUF_SIZE 512 + +/* structure that helps us to avoid + * useless calls of Seek() and Read() + */ +struct SysFile +{ + BPTR file; + ULONG iobuf_start; + ULONG iobuf_end; + UBYTE iobuf[IOBUF_SIZE]; +}; + +#ifndef __amigaos4__ +/* C implementation of AllocVecPooled (see autodoc exec/AllocPooled) */ +APTR +Alloc_VecPooled( APTR poolHeader, + ULONG memSize ) +{ + ULONG newSize = memSize + sizeof ( ULONG ); + ULONG *mem = AllocPooled( poolHeader, newSize ); + + if ( !mem ) + return NULL; + *mem = newSize; + return mem + 1; +} + +/* C implementation of FreeVecPooled (see autodoc exec/AllocPooled) */ +void +Free_VecPooled( APTR poolHeader, + APTR memory ) +{ + ULONG *realmem = (ULONG *)memory - 1; + + FreePooled( poolHeader, realmem, *realmem ); +} +#endif + +#include +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* It is not necessary to do any error checking for the */ + /* allocation-related functions. This is done by the higher level */ + /* routines like ft_mem_alloc() or ft_mem_realloc(). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_alloc */ + /* */ + /* */ + /* The memory allocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { +#ifdef __amigaos4__ + return AllocVecPooled( memory->user, size ); +#else + return Alloc_VecPooled( memory->user, size ); +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_realloc */ + /* */ + /* */ + /* The memory reallocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + void* new_block; + +#ifdef __amigaos4__ + new_block = AllocVecPooled ( memory->user, new_size ); +#else + new_block = Alloc_VecPooled ( memory->user, new_size ); +#endif + if ( new_block != NULL ) + { + CopyMem ( block, new_block, + ( new_size > cur_size ) ? cur_size : new_size ); +#ifdef __amigaos4__ + FreeVecPooled ( memory->user, block ); +#else + Free_VecPooled ( memory->user, block ); +#endif + } + return new_block; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_free */ + /* */ + /* */ + /* The memory release function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { +#ifdef __amigaos4__ + FreeVecPooled( memory->user, block ); +#else + Free_VecPooled( memory->user, block ); +#endif + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (struct SysFile *)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* */ + /* ft_amiga_stream_close */ + /* */ + /* */ + /* The function to close a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_amiga_stream_close( FT_Stream stream ) + { + struct SysFile* sysfile; + + sysfile = STREAM_FILE( stream ); + Close ( sysfile->file ); + FreeMem ( sysfile, sizeof ( struct SysFile )); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_amiga_stream_io */ + /* */ + /* */ + /* The function to open a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + /* offset :: The position in the data stream to start reading. */ + /* */ + /* buffer :: The address of buffer to store the read data. */ + /* */ + /* count :: The number of bytes to read from the stream. */ + /* */ + /* */ + /* The number of bytes actually read. */ + /* */ + FT_CALLBACK_DEF( unsigned long ) + ft_amiga_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + struct SysFile* sysfile; + unsigned long read_bytes; + + if ( count != 0 ) + { + sysfile = STREAM_FILE( stream ); + + /* handle the seek */ + if ( (offset < sysfile->iobuf_start) || (offset + count > sysfile->iobuf_end) ) + { + /* requested offset implies we need a buffer refill */ + if ( !sysfile->iobuf_end || offset != sysfile->iobuf_end ) + { + /* a physical seek is necessary */ + Seek( sysfile->file, offset, OFFSET_BEGINNING ); + } + sysfile->iobuf_start = offset; + sysfile->iobuf_end = 0; /* trigger a buffer refill */ + } + + /* handle the read */ + if ( offset + count <= sysfile->iobuf_end ) + { + /* we have buffer and requested bytes are all inside our buffer */ + CopyMem( &sysfile->iobuf[offset - sysfile->iobuf_start], buffer, count ); + read_bytes = count; + } + else + { + /* (re)fill buffer */ + if ( count <= IOBUF_SIZE ) + { + /* requested bytes is a subset of the buffer */ + read_bytes = Read( sysfile->file, sysfile->iobuf, IOBUF_SIZE ); + if ( read_bytes == -1UL ) + { + /* error */ + read_bytes = 0; + } + else + { + sysfile->iobuf_end = offset + read_bytes; + CopyMem( sysfile->iobuf, buffer, count ); + if ( read_bytes > count ) + { + read_bytes = count; + } + } + } + else + { + /* we actually need more than our buffer can hold, so we decide + ** to do a single big read, and then copy the last IOBUF_SIZE + ** bytes of that to our internal buffer for later use */ + read_bytes = Read( sysfile->file, buffer, count ); + if ( read_bytes == -1UL ) + { + /* error */ + read_bytes = 0; + } + else + { + ULONG bufsize; + + bufsize = ( read_bytes > IOBUF_SIZE ) ? IOBUF_SIZE : read_bytes; + sysfile->iobuf_end = offset + read_bytes; + sysfile->iobuf_start = sysfile->iobuf_end - bufsize; + CopyMem( &buffer[read_bytes - bufsize] , sysfile->iobuf, bufsize ); + } + } + } + } + else + { + read_bytes = 0; + } + + return read_bytes; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + struct FileInfoBlock* fib; + struct SysFile* sysfile; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + +#ifdef __amigaos4__ + sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_SHARED ); +#else + sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_PUBLIC ); +#endif + if ( !sysfile ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + sysfile->file = Open( (STRPTR)filepathname, MODE_OLDFILE ); + if ( !sysfile->file ) + { + FreeMem ( sysfile, sizeof ( struct SysFile )); + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + + fib = AllocDosObject( DOS_FIB, NULL ); + if ( !fib ) + { + Close ( sysfile->file ); + FreeMem ( sysfile, sizeof ( struct SysFile )); + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + if ( !( ExamineFH( sysfile->file, fib ) ) ) + { + FreeDosObject( DOS_FIB, fib ); + Close ( sysfile->file ); + FreeMem ( sysfile, sizeof ( struct SysFile )); + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + stream->size = fib->fib_Size; + FreeDosObject( DOS_FIB, fib ); + + stream->descriptor.pointer = (void *)sysfile; + stream->pathname.pointer = (char*)filepathname; + sysfile->iobuf_start = 0; + sysfile->iobuf_end = 0; + stream->pos = 0; + + stream->read = ft_amiga_stream_io; + stream->close = ft_amiga_stream_close; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + +#ifdef __amigaos4__ + memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_SHARED ); +#else + memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_PUBLIC ); +#endif + if ( memory ) + { +#ifdef __amigaos4__ + memory->user = CreatePool( MEMF_SHARED, 16384, 16384 ); +#else + memory->user = CreatePool( MEMF_PUBLIC, 16384, 16384 ); +#endif + if ( memory->user == NULL ) + { + FreeVec( memory ); + memory = NULL; + } + else + { + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + + DeletePool( memory->user ); + FreeVec( memory ); + } + +/* +Local Variables: +coding: latin-1 +End: +*/ +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/ansi/ansi-def.mk b/alienblaster/project/jni/freetype/builds/ansi/ansi-def.mk new file mode 100644 index 000000000..2c5857295 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/ansi/ansi-def.mk @@ -0,0 +1,74 @@ +# +# FreeType 2 configuration rules for a `normal' ANSI system +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := rm -f +CAT := cat +SEP := / +BUILD_DIR := $(TOP_DIR)/builds/ansi +PLATFORM := ansi + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := lib$(PROJECT) + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/ansi/ansi.mk b/alienblaster/project/jni/freetype/builds/ansi/ansi.mk new file mode 100644 index 000000000..32b3bac3e --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/ansi/ansi.mk @@ -0,0 +1,21 @@ +# +# FreeType 2 configuration rules for a `normal' pseudo ANSI compiler/system +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP_DIR)/builds/ansi/ansi-def.mk +include $(TOP_DIR)/builds/compiler/ansi-cc.mk +include $(TOP_DIR)/builds/link_std.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/atari/ATARI.H b/alienblaster/project/jni/freetype/builds/atari/ATARI.H new file mode 100644 index 000000000..9f78c924b --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/atari/ATARI.H @@ -0,0 +1,20 @@ +#if defined( __GXVALID_H__ ) +#pragma warn -aus /* too many unevaluated variables in gxvalid */ +#endif + +#ifndef ATARI_H +#define ATARI_H + +#pragma warn -stu + +/* PureC doesn't like 32bit enumerations */ + +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value +#endif /* FT_IMAGE_TAG */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) value +#endif /* FT_ENC_TAG */ + +#endif /* ATARI_H */ diff --git a/alienblaster/project/jni/freetype/builds/atari/FNames.SIC b/alienblaster/project/jni/freetype/builds/atari/FNames.SIC new file mode 100644 index 000000000..f3657179d --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/atari/FNames.SIC @@ -0,0 +1,37 @@ +/* the following changes file names for PureC projects */ + +if (argc > 0) +{ + ordner = argv[0]; + if (basename(ordner) == "") /* ist Ordner */ + { + ChangeFilenames(ordner); + } +} + +proc ChangeFilenames(folder) +local i,entries,directory,file; +{ + entries = filelist(directory,folder); + for (i = 0; i < entries; ++i) + { + file = directory[i,0]; + if ((directory[i,3]&16) > 0) /* subdirectory */ + { + ChangeFilenames(folder+file+"\\"); + } + else + { + if ((stricmp(suffix(file),".h")==0)|(stricmp(suffix(file),".c")==0)) + ChangeFilename(folder,file); + } + } +} + +proc ChangeFilename(path,datei) +local newfile,err; +{ + newfile=datei; + newfile[0]=(newfile[0] | 32) ^ 32; + err=files.rename("-q",path+datei,newfile); +} diff --git a/alienblaster/project/jni/freetype/builds/atari/FREETYPE.PRJ b/alienblaster/project/jni/freetype/builds/atari/FREETYPE.PRJ new file mode 100644 index 000000000..4776a5bc6 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/atari/FREETYPE.PRJ @@ -0,0 +1,32 @@ +;FreeType project file + +FREETYPE.LIB + +.C [-K -P -R -A] +.L [-J -V] +.S + += + +..\..\src\base\ftsystem.c +..\..\src\base\ftdebug.c + +..\..\src\base\ftinit.c +..\..\src\base\ftglyph.c +..\..\src\base\ftmm +..\..\src\base\ftbbox + +..\..\src\base\ftbase.c +..\..\src\autohint\autohint.c +;..\..\src\cache\ftcache.c +..\..\src\cff\cff.c +..\..\src\cid\type1cid.c +..\..\src\psaux\psaux.c +..\..\src\pshinter\pshinter.c +..\..\src\psnames\psnames.c +..\..\src\raster\raster.c +..\..\src\sfnt\sfnt.c +..\..\src\smooth\smooth.c +..\..\src\truetype\truetype.c +..\..\src\type1\type1.c +..\..\src\type42\type42.c diff --git a/alienblaster/project/jni/freetype/builds/atari/README.TXT b/alienblaster/project/jni/freetype/builds/atari/README.TXT new file mode 100644 index 000000000..04eec6351 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/atari/README.TXT @@ -0,0 +1,51 @@ +Compiling FreeType 2 with PureC compiler +======================================== + +[See below for a German version.] + +To compile FreeType 2 as a library the following changes must be applied: + +- All *.c files must start with an uppercase letter. + (In case GEMSCRIPT is available: + Simply drag the whole FreeType 2 directory to the file `FNames.SIC'.) + +- You have to change the INCLUDE directory in PureC's compiler options + to contain both the `INCLUDE' and `freetype2\include' directory. + Example: + + INCLUDE;E:\freetype2\include + +- The file `freetype2/include/Ft2build.h' must be patched as follows to + include ATARI.H: + + #ifndef __FT2_BUILD_GENERIC_H__ + #define __FT2_BUILD_GENERIC_H__ + + #include "ATARI.H" + + + +Compilieren von FreeType 2 mit PureC +==================================== + +Um FreeType 2 als eine Bibliothek (library) zu compilieren, muss folgendes +ge„ndert werden: + +- Alle *.c-files mssen mit einem GROSSBUCHSTABEN beginnen. + (Falls GEMSCRIPT zur Verfgung steht: + Den kompletten Ordner freetype2 auf die Datei `FNames.SIC' draggen.) + +- In den Compiler-Optionen von PureC muss das INCLUDE directory auf INCLUDE + und freetype2\include verweisen. Z.B.: + + INCLUDE;E:\freetype2\include + +- In der Datei freetype2/include/Ft2build.h muss zu Beginn + ein #include "ATARI.H" wie folgt eingefgt werden: + + #ifndef __FT2_BUILD_GENERIC_H__ + #define __FT2_BUILD_GENERIC_H__ + + #include "ATARI.H" + +--- end of README.TXT --- diff --git a/alienblaster/project/jni/freetype/builds/atari/deflinejoiner.awk b/alienblaster/project/jni/freetype/builds/atari/deflinejoiner.awk new file mode 100644 index 000000000..c872a70d8 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/atari/deflinejoiner.awk @@ -0,0 +1,181 @@ +#!/usr/bin/env awk + + +function shift( array, \ + junk, elm0, l ) +{ + elm0 = array[0] + for ( l = 0; l < asorti( array, junk ) - 1; l++ ) + array[l] = array[l+1]; + delete array[l] + return elm0 +} + + +function init_cpp_src_line() +{ + logical_line = "" + delete break_pos +} + + +function shift_valid_bp( array, \ + junk, elm ) +{ + elm = -1 + + if ( 0 < asorti( array, junk ) ) + do { + elm = shift( array ) + } while ( 0 > elm ); + + return elm +} + + +function check_cpp_src_line_break_pos( \ + i, junk ) +{ + printf( "break_pos:" ) + for ( i = 0; i < asorti( break_pos, junk ); i++ ) + printf( " %d", break_pos[i] ); + printf( "\n" ) +} + + +function check_cpp_src_line() +{ + printf( "logical_line[%s]\n", logical_line ) + check_cpp_src_line_break_pos() +} + + +function append_line( phys_line, \ + filt_line, bp_len ) +{ + filt_line = phys_line + sub( /\\$/, " ", filt_line ) + logical_line = logical_line filt_line + bp_len = asorti( break_pos, junk ) + break_pos[bp_len] = length( logical_line ) - 1 +} + + +function print_line( \ + c0, c1, i, junk, part_str ) +{ + c0 = 0 + + while( asorti( break_pos, junk ) > 1 ) + { + if ( ( c1 = shift_valid_bp( break_pos ) ) < 1 ) + { + part_str = substr( logical_line, c0 + 1 ) + printf( "%s\n", part_str ) + return + } + + part_str = substr( logical_line, c0 + 1, c1 - c0 + 1 ) + gsub( / $/, "\\", part_str ) + printf( "%s\n", part_str ) + c0 = c1 + 1 + } + + part_str = substr( logical_line, c0 + 1 ) + printf( "%s\n", part_str ) +} + + +function shrink_spaces( pos, \ + tail, removed_length, k ) +{ + tail = substr( logical_line, pos ) + sub( /^[ \t]+/, " ", tail ) + removed_length = length( logical_line ) - pos - length( tail ) + 1 + logical_line = substr( logical_line, 0, pos - 1 ) tail + + + for ( k = 0; k < asorti( break_pos, junk ); k++ ) + if ( ( pos + removed_length ) <= break_pos[k] ) + break_pos[k] = break_pos[k] - removed_length; + else if ( pos <= break_pos[k] ) + break_pos[k] = -1; + + return removed_length +} + + +function shrink_spaces_to_linebreak( pos, \ + junk, part_str, removed_length, i ) +{ + for ( i = 0; i < asorti( break_pos, junk ) && break_pos[i] < pos ; i++ ) + ; + + if ( break_pos[i] < 1 ) + return; + + part_str = substr( logical_line, pos, break_pos[i] - pos + 1 ) + sub( /^[ \t]+/, " ", part_str ) + removed_length = ( break_pos[i] - pos + 1 ) - length( part_str ) + + tail = substr( logical_line, pos + removed_length ) + logical_line = substr( logical_line, 0, pos - 1 ) tail + + for ( ; i < asorti( break_pos, junk ); i++ ) + break_pos[i] -= removed_length; + + return removed_length +} + + +function delete_linebreaks_in_2nd_token( \ + tail, paren_depth, junk, i, j, k, l ) +{ + if ( logical_line ~ /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+\(/ ) + { + tail = logical_line + sub( /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+/, "", tail ) + + paren_depth = 0 + l = 0 + i = length( logical_line ) - length( tail ) + 1 # seek to the 1st op paren + j = i + do { + if ( substr( logical_line, j, 2 ) ~ /[ \t][ \t]/ ) + l = shrink_spaces( j ); + else if ( substr( logical_line, j, 1 ) == "(" ) + paren_depth += 1; + else if ( substr( logical_line, j, 1 ) == ")" ) + paren_depth -= 1; + j += 1 + } while ( j < length( logical_line ) && paren_depth != 0 ) + + for ( k = 0; k < asorti( break_pos, junk ); k++ ) + if ( i <= break_pos[k] && break_pos[k] < j ) + break_pos[k] = -1; + + if ( l > 0 ) + shrink_spaces_to_linebreak( j ); + } +} + + +BEGIN{ + init_cpp_src_line() +} +{ + append_line( $0 ) + if ( $0 !~ /\\$/ ) + { + delete_linebreaks_in_2nd_token() + print_line() + init_cpp_src_line() + } +} +END{ + if ( 0 < length( logical_line ) ) + { + delete_linebreaks_in_2nd_token() + print_line() + } +} diff --git a/alienblaster/project/jni/freetype/builds/atari/gen-purec-patch.sh b/alienblaster/project/jni/freetype/builds/atari/gen-purec-patch.sh new file mode 100755 index 000000000..1ec050c11 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/atari/gen-purec-patch.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +TOP_DIR=. +OBJ_DIR=. + +for x in "$@" +do + case x"$x" in + x--srcdir=* | x--topdir=* ) + TOP_DIR=`echo $x | sed 's/^--[a-z]*dir=//'` + ;; + x--builddir=* | x--objdir=* ) + OBJ_DIR=`echo $x | sed 's/^--[a-z]*dir=//'` + ;; + esac +done + +mkdir -p ${OBJ_DIR}/builds/atari/tmp/orig + +( cd ${TOP_DIR} && find . -name '*.[CHch]' -type f | fgrep -v builds/atari/tmp | cpio -o ) | \ +( cd ${OBJ_DIR}/builds/atari/tmp/orig && cpio -idum ) +cp ${TOP_DIR}/builds/atari/deflinejoiner.awk ${OBJ_DIR}/builds/atari/tmp + +pushd ${OBJ_DIR}/builds/atari/tmp + + cp -pr orig purec + for f in `cd orig && find . -type f` + do + echo filter $f + env LANG=C awk -f deflinejoiner.awk < orig/$f > purec/$f + done + + echo '#define FT2_BUILD_LIBRARY' > purec/include/ft2build.h + echo '#include "ATARI.H"' >> purec/include/ft2build.h + env LANG=C awk -f deflinejoiner.awk < orig/include/ft2build.h >> purec/include/ft2build.h + + env LANG=C diff -ur orig purec > ../purec.diff + +popd +rm -rf ${OBJ_DIR}/builds/atari/tmp diff --git a/alienblaster/project/jni/freetype/builds/beos/beos-def.mk b/alienblaster/project/jni/freetype/builds/beos/beos-def.mk new file mode 100644 index 000000000..4371a30aa --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/beos/beos-def.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 configuration rules for a BeOS system +# +# this is similar to the "ansi-def.mk" file, except for BUILD and PLATFORM +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := rm -f +CAT := cat +SEP := / +BUILD_DIR := $(TOP_DIR)/builds/beos +PLATFORM := beos + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := lib$(PROJECT) + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/beos/beos.mk b/alienblaster/project/jni/freetype/builds/beos/beos.mk new file mode 100644 index 000000000..b5c8bdabe --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/beos/beos.mk @@ -0,0 +1,19 @@ +# +# FreeType 2 configuration rules for a BeOS system +# + +# Copyright 1996-2000, 2002, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +include $(TOP_DIR)/builds/beos/beos-def.mk +include $(TOP_DIR)/builds/compiler/ansi-cc.mk +include $(TOP_DIR)/builds/link_std.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/beos/detect.mk b/alienblaster/project/jni/freetype/builds/beos/detect.mk new file mode 100644 index 000000000..24a087886 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/beos/detect.mk @@ -0,0 +1,41 @@ +# +# FreeType 2 configuration file to detect an BeOS host platform. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +.PHONY: setup + + +ifeq ($(PLATFORM),ansi) + + ifdef BE_HOST_CPU + + PLATFORM := beos + + endif # test MACHTYPE beos +endif + +ifeq ($(PLATFORM),beos) + + DELETE := rm -f + CAT := cat + SEP := / + BUILD_DIR := $(TOP_DIR)/builds/beos + CONFIG_FILE := beos.mk + + setup: std_setup + +endif # test PLATFORM beos + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/ansi-cc.mk b/alienblaster/project/jni/freetype/builds/compiler/ansi-cc.mk new file mode 100644 index 000000000..3b668e201 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/ansi-cc.mk @@ -0,0 +1,80 @@ +# +# FreeType 2 generic pseudo ANSI compiler +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := cc +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# we assume the compiler is already strictly ANSI +# +ANSIFLAGS := + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(AR) -r $@ $(subst /,$(COMPILER_SEP),$(OBJECTS_LIST)) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/bcc-dev.mk b/alienblaster/project/jni/freetype/builds/compiler/bcc-dev.mk new file mode 100644 index 000000000..63a46ad16 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/bcc-dev.mk @@ -0,0 +1,86 @@ +# +# FreeType 2 Borland C++-specific with NO OPTIMIZATIONS + DEBUGGING +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := bcc32 +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := + + +# Target flag -- no trailing space. +# +T := -o +TE := -e + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -q -c -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -A + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = tlib /u /P128 $(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST:%=+%)) + + +# Borland C++ specific temporary files +# +CLEAN += \ + $(subst /,$(SEP),$(TOP_DIR)/apinames.$(O)) \ + $(subst /,$(SEP),$(OBJ_DIR)/apinames.tds) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/bcc.mk b/alienblaster/project/jni/freetype/builds/compiler/bcc.mk new file mode 100644 index 000000000..855edadf0 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/bcc.mk @@ -0,0 +1,86 @@ +# +# FreeType 2 Borland C++-specific rules +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := bcc32 +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := + + +# Target flag -- no trailing space. +# +T := -o +TE := -e + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -q -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -A + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = tlib /u /P128 $(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST:%=+%)) + + +# Borland C++ specific temporary files +# +CLEAN += \ + $(subst /,$(SEP),$(TOP_DIR)/apinames.$(O)) \ + $(subst /,$(SEP),$(OBJ_DIR)/apinames.tds) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/emx.mk b/alienblaster/project/jni/freetype/builds/compiler/emx.mk new file mode 100644 index 000000000..c237005cb --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/emx.mk @@ -0,0 +1,77 @@ +# +# FreeType 2 emx-specific definitions +# + + +# Copyright 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := set GCCOPT="-ansi -pedantic"; gcc +COMPILER_SEP := / + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -g -O6 -Wall + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(foreach m,$(OBJECTS_LIST),$(AR) -r $@ $(m);) echo > nul + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/gcc-dev.mk b/alienblaster/project/jni/freetype/builds/compiler/gcc-dev.mk new file mode 100644 index 000000000..c63e1262e --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/gcc-dev.mk @@ -0,0 +1,95 @@ +# +# FreeType 2 gcc-specific with NO OPTIMIZATIONS + DEBUGGING +# + + +# Copyright 1996-2000, 2003, 2004, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := gcc +COMPILER_SEP := / + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +ifndef CFLAGS + ifeq ($(findstring g++,$(CC)),) + nested_externs := -Wnested-externs + strict_prototypes := -Wstrict-prototypes + endif + + CFLAGS := -c -g -O0 \ + -Wall \ + -W \ + -Wundef \ + -Wshadow \ + -Wpointer-arith \ + -Wwrite-strings \ + -Wredundant-decls \ + -Wno-long-long \ + $(nested_externs) \ + $(strict_prototypes) +endif + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -ansi -pedantic + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/gcc.mk b/alienblaster/project/jni/freetype/builds/compiler/gcc.mk new file mode 100644 index 000000000..f6b7101b3 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/gcc.mk @@ -0,0 +1,77 @@ +# +# FreeType 2 gcc-specific definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := gcc +COMPILER_SEP := / + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -g -O3 -Wall + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -ansi -pedantic + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/intelc.mk b/alienblaster/project/jni/freetype/builds/compiler/intelc.mk new file mode 100644 index 000000000..413ce5bac --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/intelc.mk @@ -0,0 +1,85 @@ +# +# FreeType 2 Intel C/C++ definitions (VC++ compatibility mode) +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# compiler command line name +# +CC := icl +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := /I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := /D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := /Fl + + +# Target flag. +# +T := /Fo +TE := /Fe + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +# Note that the Intel C/C++ compiler version 4.5 complains about +# the use of FT_FIELD_OFFSET with "value must be arithmetic type"! +# This really looks like a bug in the compiler because the macro +# _does_ compute an arithmetic value, so we disable this warning +# with "/Qwd32". +# +CFLAGS ?= /nologo /c /Ox /G5 /W3 /Qwd32 + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := /Qansi_alias /Za + +# Library linking +# +#CLEAN_LIBRARY = +LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/unix-lcc.mk b/alienblaster/project/jni/freetype/builds/compiler/unix-lcc.mk new file mode 100644 index 000000000..d79f50846 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/unix-lcc.mk @@ -0,0 +1,83 @@ +# +# FreeType 2 Unix LCC specific definitions +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Command line name +# +CC := lcc +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := o +SO := o + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := a +SA := a + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -g + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# LCC is pure ANSI anyway! +# +# the "-A" flag simply increments verbosity about non ANSI code +# +ANSIFLAGS := -A + + +# library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(PROJECT_LIBRARY) +LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/visualage.mk b/alienblaster/project/jni/freetype/builds/compiler/visualage.mk new file mode 100644 index 000000000..c109659bf --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/visualage.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 Visual Age C++ specific definitions +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# command line compiler name +# +CC := icc +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := /I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := /D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := /Fl + + +# Target flag. +# +T := /Fo + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +CFLAGS ?= /Q- /Gd+ /O2 /G5 /W3 /C + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSI_FLAGS := /Sa + + +# Library linking +# +#CLEAN_LIBRARY := +LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/visualc.mk b/alienblaster/project/jni/freetype/builds/compiler/visualc.mk new file mode 100644 index 000000000..2e19ef86a --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/visualc.mk @@ -0,0 +1,82 @@ +# +# FreeType 2 Visual C++ definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# compiler command line name +# +CC := cl +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := /I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := /D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := /Fl + + +# Target flag. +# +T := /Fo + +# Target executable flag +# +TE := /Fe + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= /nologo /c /Ox /W3 /WX + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := /Za /D_CRT_SECURE_NO_DEPRECATE + + +# Library linking +# +#CLEAN_LIBRARY = +LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/watcom.mk b/alienblaster/project/jni/freetype/builds/compiler/watcom.mk new file mode 100644 index 000000000..4db1e7fec --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/watcom.mk @@ -0,0 +1,81 @@ +# +# FreeType 2 Watcom-specific definitions +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Compiler command line name +# +CC := wcc386 +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I= + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -FO= + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -zq + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := -za + + +# Library linking +# +CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY)) +LINK_LIBRARY = $(subst /,$(COMPILER_SEP), \ + wlib -q -n $@; \ + $(foreach m, $(OBJECTS_LIST), wlib -q $@ +$(m);) \ + echo > nul) + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/compiler/win-lcc.mk b/alienblaster/project/jni/freetype/builds/compiler/win-lcc.mk new file mode 100644 index 000000000..5d02d8246 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/compiler/win-lcc.mk @@ -0,0 +1,81 @@ +# +# FreeType 2 Win32-LCC specific definitions +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Command line name +# +CC := lcc +COMPILER_SEP := $(SEP) + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := obj +SO := obj + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := lib +SA := lib + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -Fl + + +# Target flag. +# +T := -Fo + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +CFLAGS ?= -c -g2 -O + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +# LCC is pure ANSI anyway! +# +ANSIFLAGS := + + +# library linking +# +#CLEAN_LIBRARY := +LINK_LIBRARY = lcclib /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST)) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/detect.mk b/alienblaster/project/jni/freetype/builds/detect.mk new file mode 100644 index 000000000..987ae51c4 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/detect.mk @@ -0,0 +1,154 @@ +# +# FreeType 2 host platform detection rules +# + + +# Copyright 1996-2000, 2001, 2002, 2003, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# This sub-Makefile is in charge of detecting the current platform. It sets +# the following variables: +# +# BUILD_DIR The configuration and system-specific directory. Usually +# `freetype/builds/$(PLATFORM)' but can be different for +# custom builds of the library. +# +# The following variables must be defined in system specific `detect.mk' +# files: +# +# PLATFORM The detected platform. This will default to `ansi' if +# auto-detection fails. +# CONFIG_FILE The configuration sub-makefile to use. This usually depends +# on the compiler defined in the `CC' environment variable. +# DELETE The shell command used to remove a given file. +# COPY The shell command used to copy one file. +# SEP The platform-specific directory separator. +# COMPILER_SEP The separator used in arguments of the compilation tools. +# CC The compiler to use. +# +# You need to set the following variable(s) before calling it: +# +# TOP_DIR The top-most directory in the FreeType library source +# hierarchy. If not defined, it will default to `.'. + +# Set auto-detection default to `ansi' resp. UNIX-like operating systems. +# +PLATFORM := ansi +DELETE := $(RM) +COPY := cp +CAT := cat +SEP := / + +BUILD_CONFIG := $(TOP_DIR)/builds + +# These two assignments must be delayed. +BUILD_DIR = $(BUILD_CONFIG)/$(PLATFORM) +CONFIG_RULES = $(BUILD_DIR)/$(CONFIG_FILE) + +# We define the BACKSLASH variable to hold a single back-slash character. +# This is needed because a line like +# +# SEP := \ +# +# does not work with GNU Make (the backslash is interpreted as a line +# continuation). While a line like +# +# SEP := \\ +# +# really defines $(SEP) as `\' on Unix, and `\\' on Dos and Windows! +# +BACKSLASH := $(strip \ ) + +# Find all auto-detectable platforms. +# +PLATFORMS := $(notdir $(subst /detect.mk,,$(wildcard $(BUILD_CONFIG)/*/detect.mk))) +.PHONY: $(PLATFORMS) ansi + +# Filter out platform specified as setup target. +# +PLATFORM := $(firstword $(filter $(MAKECMDGOALS),$(PLATFORMS))) + +# If no setup target platform was specified, enable auto-detection/ +# default platform. +# +ifeq ($(PLATFORM),) + PLATFORM := ansi +endif + +# If the user has explicitly asked for `ansi' on the command line, +# disable auto-detection. +# +ifeq ($(findstring ansi,$(MAKECMDGOALS)),) + # Now, include all detection rule files found in the `builds/' + # directories. Note that the calling order of the various `detect.mk' + # files isn't predictable. + # + include $(wildcard $(BUILD_CONFIG)/*/detect.mk) +endif + +# In case no detection rule file was successful, use the default. +# +ifndef CONFIG_FILE + CONFIG_FILE := ansi.mk + setup: std_setup + .PHONY: setup +endif + +# The following targets are equivalent, with the exception that they use +# a slightly different syntax for the `echo' command. +# +# std_setup: defined for most (i.e. Unix-like) platforms +# dos_setup: defined for Dos-ish platforms like Dos, Windows & OS/2 +# +.PHONY: std_setup dos_setup + +std_setup: + @echo "" + @echo "$(PROJECT_TITLE) build system -- automatic system detection" + @echo "" + @echo "The following settings are used:" + @echo "" + @echo " platform $(PLATFORM)" + @echo " compiler $(CC)" + @echo " configuration directory $(BUILD_DIR)" + @echo " configuration rules $(CONFIG_RULES)" + @echo "" + @echo "If this does not correspond to your system or settings please remove the file" + @echo "\`$(CONFIG_MK)' from this directory then read the INSTALL file for help." + @echo "" + @echo "Otherwise, simply type \`$(MAKE)' again to build the library," + @echo "or \`$(MAKE) refdoc' to build the API reference (the latter needs python)." + @echo "" + @$(COPY) $(CONFIG_RULES) $(CONFIG_MK) + + +# Special case for Dos, Windows, OS/2, where echo "" doesn't work correctly! +# +dos_setup: + @type builds$(SEP)newline + @echo $(PROJECT_TITLE) build system -- automatic system detection + @type builds$(SEP)newline + @echo The following settings are used: + @type builds$(SEP)newline + @echo platformÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(PLATFORM) + @echo compilerÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(CC) + @echo configuration directoryÿÿÿÿÿÿ$(subst /,$(SEP),$(BUILD_DIR)) + @echo configuration rulesÿÿÿÿÿÿÿÿÿÿ$(subst /,$(SEP),$(CONFIG_RULES)) + @type builds$(SEP)newline + @echo If this does not correspond to your system or settings please remove the file + @echo '$(CONFIG_MK)' from this directory then read the INSTALL file for help. + @type builds$(SEP)newline + @echo Otherwise, simply type 'make' again to build the library. + @echo or 'make refdoc' to build the API reference (the latter needs python). + @type builds$(SEP)newline + @$(COPY) $(subst /,$(SEP),$(CONFIG_RULES) $(CONFIG_MK)) > nul + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/dos/detect.mk b/alienblaster/project/jni/freetype/builds/dos/detect.mk new file mode 100644 index 000000000..700a12268 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/dos/detect.mk @@ -0,0 +1,142 @@ +# +# FreeType 2 configuration file to detect a DOS host platform. +# + + +# Copyright 1996-2000, 2003, 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +.PHONY: setup + + +ifeq ($(PLATFORM),ansi) + + # Test for DJGPP by checking the DJGPP environment variable, which must be + # set in order to use the system (ie. it will always be present when the + # `make' utility is run). + # + # We test for the COMSPEC environment variable, then run the `ver' + # command-line program to see if its output contains the word `Dos' or + # `DOS'. + # + # If this is true, we are running a Dos-ish platform (or an emulation). + # + ifdef DJGPP + PLATFORM := dos + else + ifdef COMSPEC + is_dos := $(findstring DOS,$(subst Dos,DOS,$(shell ver))) + + # We try to recognize a Dos session under OS/2. The `ver' command + # returns `Operating System/2 ...' there, so `is_dos' should be empty. + # + # To recognize a Dos session under OS/2, we check COMSPEC for the + # substring `MDOS\COMMAND' + # + ifeq ($(is_dos),) + is_dos := $(findstring MDOS\COMMAND,$(COMSPEC)) + endif + + # We also try to recognize Dos 7.x without Windows 9X launched. + # See builds/win32/detect.mk for explanations about the logic. + # + ifeq ($(is_dos),) + ifdef winbootdir +#ifneq ($(OS),Windows_NT) + # If win32 is available, do not trigger this test. + ifndef windir + is_dos := $(findstring Windows,$(strip $(shell ver))) + endif +#endif + endif + endif + + endif # test COMSPEC + + ifneq ($(is_dos),) + + PLATFORM := dos + + endif # test Dos + endif # test DJGPP +endif # test PLATFORM ansi + +ifeq ($(PLATFORM),dos) + + # Use DJGPP (i.e. gcc) by default. + # + CONFIG_FILE := dos-gcc.mk + CC ?= gcc + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring emx,$(MAKECMDGOALS)),) # EMX gcc + CONFIG_FILE := dos-emx.mk + CC := gcc + emx: setup + .PHONY: emx + endif + + ifneq ($(findstring turboc,$(MAKECMDGOALS)),) # Turbo C + CONFIG_FILE := dos-tcc.mk + CC := tcc + turboc: setup + .PHONY: turboc + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := dos-wat.mk + CC := wcc386 + watcom: setup + .PHONY: watcom + endif + + ifneq ($(findstring borlandc,$(MAKECMDGOALS)),) # Borland C/C++ 32-bit + CONFIG_FILE := dos-bcc.mk + CC := bcc32 + borlandc: setup + .PHONY: borlandc + endif + + ifneq ($(findstring borlandc16,$(MAKECMDGOALS)),) # Borland C/C++ 16-bit + CONFIG_FILE := dos-bcc.mk + CC := bcc + borlandc16: setup + .PHONY: borlandc16 + endif + + ifneq ($(findstring bash,$(SHELL)),) # check for bash + SEP := / + DELETE := rm + COPY := cp + CAT := cat + setup: std_setup + else + SEP := $(BACKSLASH) + DELETE := del + CAT := type + + # Setting COPY is a bit trickier. We can be running DJGPP on some + # Windows NT derivatives, like XP. See builds/win32/detect.mk for + # explanations why we need hacking here. + # + ifeq ($(OS),Windows_NT) + COPY := cmd.exe /c copy + else + COPY := copy + endif # test NT + + setup: dos_setup + endif + +endif # test PLATFORM dos + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/dos/dos-def.mk b/alienblaster/project/jni/freetype/builds/dos/dos-def.mk new file mode 100644 index 000000000..950f581a0 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/dos/dos-def.mk @@ -0,0 +1,45 @@ +# +# FreeType 2 DOS specific definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := del +CAT := type +SEP := $(strip \ ) +BUILD_DIR := $(TOP_DIR)/builds/dos +PLATFORM := dos + + +# The executable file extension (for tools), *with* leading dot. +# +E := .exe + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := $(PROJECT) + + +# The NO_OUTPUT macro is used to ignore the output of commands. +# +NO_OUTPUT = > nul + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/dos/dos-emx.mk b/alienblaster/project/jni/freetype/builds/dos/dos-emx.mk new file mode 100644 index 000000000..6ea8f6d87 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/dos/dos-emx.mk @@ -0,0 +1,21 @@ +# +# FreeType 2 configuration rules for the EMX gcc compiler +# + + +# Copyright 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP_DIR)/builds/dos/dos-def.mk +include $(TOP_DIR)/builds/compiler/emx.mk +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/dos/dos-gcc.mk b/alienblaster/project/jni/freetype/builds/dos/dos-gcc.mk new file mode 100644 index 000000000..e14255c1f --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/dos/dos-gcc.mk @@ -0,0 +1,21 @@ +# +# FreeType 2 configuration rules for the DJGPP compiler +# + + +# Copyright 1996-2000, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP_DIR)/builds/dos/dos-def.mk +include $(TOP_DIR)/builds/compiler/gcc.mk +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/dos/dos-wat.mk b/alienblaster/project/jni/freetype/builds/dos/dos-wat.mk new file mode 100644 index 000000000..c763b163c --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/dos/dos-wat.mk @@ -0,0 +1,20 @@ +# +# FreeType 2 configuration rules for the Watcom C/C++ compiler +# + + +# Copyright 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +include $(TOP_DIR)/builds/dos/dos-def.mk +include $(TOP_DIR)/builds/compiler/watcom.mk +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/exports.mk b/alienblaster/project/jni/freetype/builds/exports.mk new file mode 100644 index 000000000..52f2912d3 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/exports.mk @@ -0,0 +1,76 @@ +# +# FreeType 2 exports sub-Makefile +# + + +# Copyright 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY +# OTHER MAKEFILES. + + +# This sub-Makefile is used to compute the list of exported symbols whenever +# the EXPORTS_LIST variable is defined by one of the platform or compiler +# specific build files. +# +# EXPORTS_LIST contains the name of the `list' file, for example a Windows +# .DEF file. +# +ifneq ($(EXPORTS_LIST),) + + # CCexe is the compiler used to compile the `apinames' tool program + # on the host machine. This isn't necessarily the same as the compiler + # which can be a cross-compiler for a different architecture, for example. + # + ifeq ($(CCexe),) + CCexe := $(CC) + endif + + # TE acts like T, but for executables instead of object files. + ifeq ($(TE),) + TE := $T + endif + + # The list of public headers we're going to parse. + PUBLIC_HEADERS := $(wildcard $(PUBLIC_DIR)/*.h) + + # The `apinames' source and executable. We use $E_BUILD as the host + # executable suffix, which *includes* the final dot. + # + # Note that $(APINAMES_OPTIONS) is empty, except for Windows compilers. + # + APINAMES_SRC := $(subst /,$(SEP),$(TOP_DIR)/src/tools/apinames.c) + APINAMES_EXE := $(subst /,$(SEP),$(OBJ_DIR)/apinames$(E_BUILD)) + + $(APINAMES_EXE): $(APINAMES_SRC) + $(CCexe) $(TE)$@ $< + + .PHONY: symbols_list + + symbols_list: $(EXPORTS_LIST) + + # We manually add TT_New_Context and TT_RunIns, which are needed by TT + # debuggers, to the EXPORTS_LIST. + # + $(EXPORTS_LIST): $(APINAMES_EXE) $(PUBLIC_HEADERS) + $(subst /,$(SEP),$(APINAMES_EXE)) -o$@ $(APINAMES_OPTIONS) $(PUBLIC_HEADERS) + @echo TT_New_Context >> $(EXPORTS_LIST) + @echo TT_RunIns >> $(EXPORTS_LIST) + + $(PROJECT_LIBRARY): $(EXPORTS_LIST) + + CLEAN += $(EXPORTS_LIST) \ + $(APINAMES_EXE) + +endif + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/freetype.mk b/alienblaster/project/jni/freetype/builds/freetype.mk new file mode 100644 index 000000000..7a89c8e3d --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/freetype.mk @@ -0,0 +1,361 @@ +# +# FreeType 2 library sub-Makefile +# + + +# Copyright 1996-2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY +# OTHER MAKEFILES. + + +# The following variables (set by other Makefile components, in the +# environment, or on the command line) are used: +# +# BUILD_DIR The architecture dependent directory, +# e.g. `$(TOP_DIR)/builds/unix'. Added to INCLUDES also. +# +# OBJ_DIR The directory in which object files are created. +# +# LIB_DIR The directory in which the library is created. +# +# DOC_DIR The directory in which the API reference is created. +# +# INCLUDES A list of directories to be included additionally. +# +# DEVEL_DIR Development directory which is added to the INCLUDES +# variable before the standard include directories. +# +# CFLAGS Compilation flags. This overrides the default settings +# in the platform-specific configuration files. +# +# FTSYS_SRC If set, its value is used as the name of a replacement +# file for `src/base/ftsystem.c'. +# +# FTDEBUG_SRC If set, its value is used as the name of a replacement +# file for `src/base/ftdebug.c'. [For a normal build, this +# file does nothing.] +# +# FTMODULE_H The file which contains the list of module classes for +# the current build. Usually, this is automatically +# created by `modules.mk'. +# +# BASE_OBJ_S +# BASE_OBJ_M A list of base objects (for single object and multiple +# object builds, respectively). Set up in +# `src/base/rules.mk'. +# +# BASE_EXT_OBJ A list of base extension objects. Set up in +# `src/base/rules.mk'. +# +# DRV_OBJ_S +# DRV_OBJ_M A list of driver objects (for single object and multiple +# object builds, respectively). Set up cumulatively in +# `src//rules.mk'. +# +# CLEAN +# DISTCLEAN The sub-makefiles can append additional stuff to these two +# variables which is to be removed for the `clean' resp. +# `distclean' target. +# +# TOP_DIR, SEP, +# COMPILER_SEP, +# LIBRARY, CC, +# A, I, O, T Check `config.mk' for details. + + +# The targets `objects' and `library' are defined at the end of this +# Makefile after all other rules have been included. +# +.PHONY: single multi objects library refdoc + +# default target -- build single objects and library +# +single: objects library + +# `multi' target -- build multiple objects and library +# +multi: objects library + + +# The FreeType source directory, usually `./src'. +# +SRC_DIR := $(TOP_DIR)/src + +# The directory where the base layer components are placed, usually +# `./src/base'. +# +BASE_DIR := $(SRC_DIR)/base + +# Other derived directories. +# +PUBLIC_DIR := $(TOP_DIR)/include/freetype +INTERNAL_DIR := $(PUBLIC_DIR)/internal +SERVICES_DIR := $(INTERNAL_DIR)/services +CONFIG_DIR := $(PUBLIC_DIR)/config + +# The documentation directory. +# +DOC_DIR ?= $(TOP_DIR)/docs/reference + +# The final name of the library file. +# +PROJECT_LIBRARY := $(LIB_DIR)/$(LIBRARY).$A + + +# include paths +# +# IMPORTANT NOTE: The architecture-dependent directory must ALWAYS be placed +# before the standard include list. Porters are then able to +# put their own version of some of the FreeType components +# in the `freetype/builds/' directory, as these +# files will override the default sources. +# +INCLUDES := $(subst /,$(COMPILER_SEP),$(OBJ_DIR) \ + $(DEVEL_DIR) \ + $(BUILD_DIR) \ + $(TOP_DIR)/include) + +INCLUDE_FLAGS := $(INCLUDES:%=$I%) + + +# C flags used for the compilation of an object file. This must include at +# least the paths for the `base' and `builds/' directories; +# debug/optimization/warning flags + ansi compliance if needed. +# +# $(INCLUDE_FLAGS) should come before $(CFLAGS) to avoid problems with +# old FreeType versions. +# +# Note what we also define the macro FT2_BUILD_LIBRARY when building +# FreeType. This is required to let our sources include the internal +# headers (something forbidden by clients). +# +# Finally, we define FT_CONFIG_MODULES_H so that the compiler uses the +# generated version of `ftmodule.h' in $(OBJ_DIR). If there is an +# `ftoption.h' files in $(OBJ_DIR), define FT_CONFIG_OPTIONS_H too. +# +ifneq ($(wildcard $(OBJ_DIR)/ftoption.h),) + FTOPTION_H := $(OBJ_DIR)/ftoption.h + FTOPTION_FLAG := $DFT_CONFIG_OPTIONS_H="" +endif + +FT_CFLAGS = $(CPPFLAGS) \ + $(INCLUDE_FLAGS) \ + $(CFLAGS) \ + $DFT2_BUILD_LIBRARY \ + $DFT_CONFIG_MODULES_H="" \ + $(FTOPTION_FLAG) +FT_CC = $(CC) $(FT_CFLAGS) +FT_COMPILE = $(CC) $(ANSIFLAGS) $(FT_CFLAGS) + + +# Include the `exports' rules file. +# +include $(TOP_DIR)/builds/exports.mk + + +# Initialize the list of objects. +# +OBJECTS_LIST := + + +# Define $(PUBLIC_H) as the list of all public header files located in +# `$(TOP_DIR)/include/freetype'. $(INTERNAL_H), and $(CONFIG_H) are defined +# similarly. +# +# This is used to simplify the dependency rules -- if one of these files +# changes, the whole library is recompiled. +# +PUBLIC_H := $(wildcard $(PUBLIC_DIR)/*.h) +INTERNAL_H := $(wildcard $(INTERNAL_DIR)/*.h) \ + $(wildcard $(SERVICES_DIR)/*.h) +CONFIG_H := $(wildcard $(CONFIG_DIR)/*.h) \ + $(wildcard $(BUILD_DIR)/freetype/config/*.h) \ + $(FTMODULE_H) \ + $(FTOPTION_H) +DEVEL_H := $(wildcard $(TOP_DIR)/devel/*.h) + +FREETYPE_H := $(PUBLIC_H) $(INTERNAL_H) $(CONFIG_H) $(DEVEL_H) + + +# ftsystem component +# +FTSYS_SRC ?= $(BASE_DIR)/ftsystem.c + +FTSYS_OBJ := $(OBJ_DIR)/ftsystem.$O + +OBJECTS_LIST += $(FTSYS_OBJ) + +$(FTSYS_OBJ): $(FTSYS_SRC) $(FREETYPE_H) + $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# ftdebug component +# +FTDEBUG_SRC ?= $(BASE_DIR)/ftdebug.c + +FTDEBUG_OBJ := $(OBJ_DIR)/ftdebug.$O + +OBJECTS_LIST += $(FTDEBUG_OBJ) + +$(FTDEBUG_OBJ): $(FTDEBUG_SRC) $(FREETYPE_H) + $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# Include all rule files from FreeType components. +# +include $(SRC_DIR)/base/rules.mk +include $(patsubst %,$(SRC_DIR)/%/rules.mk,$(MODULES)) + + +# ftinit component +# +# The C source `ftinit.c' contains the FreeType initialization routines. +# It is able to automatically register one or more drivers when the API +# function FT_Init_FreeType() is called. +# +# The set of initial drivers is determined by the driver Makefiles +# includes above. Each driver Makefile updates the FTINIT_xxx lists +# which contain additional include paths and macros used to compile the +# single `ftinit.c' source. +# +FTINIT_SRC := $(BASE_DIR)/ftinit.c +FTINIT_OBJ := $(OBJ_DIR)/ftinit.$O + +OBJECTS_LIST += $(FTINIT_OBJ) + +$(FTINIT_OBJ): $(FTINIT_SRC) $(FREETYPE_H) + $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# All FreeType library objects. +# +OBJ_M := $(BASE_OBJ_M) $(BASE_EXT_OBJ) $(DRV_OBJS_M) +OBJ_S := $(BASE_OBJ_S) $(BASE_EXT_OBJ) $(DRV_OBJS_S) + + +# The target `multi' on the Make command line indicates that we want to +# compile each source file independently. +# +# Otherwise, each module/driver is compiled in a single object file through +# source file inclusion (see `src/base/ftbase.c' or +# `src/truetype/truetype.c' for examples). +# +BASE_OBJECTS := $(OBJECTS_LIST) + +ifneq ($(findstring multi,$(MAKECMDGOALS)),) + OBJECTS_LIST += $(OBJ_M) +else + OBJECTS_LIST += $(OBJ_S) +endif + +objects: $(OBJECTS_LIST) + +library: $(PROJECT_LIBRARY) + +dll: $(PROJECT_LIBRARY) exported_symbols + +.c.$O: + $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +ifneq ($(findstring refdoc,$(MAKECMDGOALS)),) + # poor man's `sed' emulation with make's built-in string functions + work := $(strip $(shell $(CAT) $(PUBLIC_DIR)/freetype.h)) + work := $(subst |,x,$(work)) + work := $(subst $(space),|,$(work)) + work := $(subst \#define|FREETYPE_MAJOR|,$(space),$(work)) + work := $(word 2,$(work)) + major := $(subst |,$(space),$(work)) + major := $(firstword $(major)) + + work := $(subst \#define|FREETYPE_MINOR|,$(space),$(work)) + work := $(word 2,$(work)) + minor := $(subst |,$(space),$(work)) + minor := $(firstword $(minor)) + + work := $(subst \#define|FREETYPE_PATCH|,$(space),$(work)) + work := $(word 2,$(work)) + patch := $(subst |,$(space),$(work)) + patch := $(firstword $(patch)) + + version := $(major).$(minor).$(patch) +endif + +# We write-protect the docmaker directory to suppress generation +# of .pyc files. +# +refdoc: + -chmod -w $(SRC_DIR)/tools/docmaker + python $(SRC_DIR)/tools/docmaker/docmaker.py \ + --prefix=ft2 \ + --title=FreeType-$(version) \ + --output=$(DOC_DIR) \ + $(PUBLIC_DIR)/*.h \ + $(PUBLIC_DIR)/config/*.h \ + $(PUBLIC_DIR)/cache/*.h + -chmod +w $(SRC_DIR)/tools/docmaker + + +.PHONY: clean_project_std distclean_project_std + +# Standard cleaning and distclean rules. These are not accepted +# on all systems though. +# +clean_project_std: + -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) $(CLEAN) + +distclean_project_std: clean_project_std + -$(DELETE) $(PROJECT_LIBRARY) + -$(DELETE) *.orig *~ core *.core $(DISTCLEAN) + + +.PHONY: clean_project_dos distclean_project_dos + +# The Dos command shell does not support very long list of arguments, so +# we are stuck with wildcards. +# +# Don't break the command lines with \; this prevents the "del" command from +# working correctly on Win9x. +# +clean_project_dos: + -$(DELETE) $(subst /,$(SEP),$(OBJ_DIR)/*.$O $(CLEAN) $(NO_OUTPUT)) + +distclean_project_dos: clean_project_dos + -$(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY) $(DISTCLEAN) $(NO_OUTPUT)) + + +.PHONY: remove_config_mk remove_ftmodule_h + +# Remove configuration file (used for distclean). +# +remove_config_mk: + -$(DELETE) $(subst /,$(SEP),$(CONFIG_MK) $(NO_OUTPUT)) + +# Remove module list (used for distclean). +# +remove_ftmodule_h: + -$(DELETE) $(subst /,$(SEP),$(FTMODULE_H) $(NO_OUTPUT)) + + +.PHONY: clean distclean + +# The `config.mk' file must define `clean_freetype' and +# `distclean_freetype'. Implementations may use to relay these to either +# the `std' or `dos' versions from above, or simply provide their own +# implementation. +# +clean: clean_project +distclean: distclean_project remove_config_mk remove_ftmodule_h + -$(DELETE) $(subst /,$(SEP),$(DOC_DIR)/*.html $(NO_OUTPUT)) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/link_dos.mk b/alienblaster/project/jni/freetype/builds/link_dos.mk new file mode 100644 index 000000000..c37ac7e52 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/link_dos.mk @@ -0,0 +1,42 @@ +# +# Link instructions for Dos-like systems (Dos, Win32, OS/2) +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +ifdef BUILD_PROJECT + + .PHONY: clean_project distclean_project + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP_DIR)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_dos + distclean_project: distclean_project_dos + + # This final rule is used to link all object files into a single library. + # this is compiler-specific + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + +endif + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/link_std.mk b/alienblaster/project/jni/freetype/builds/link_std.mk new file mode 100644 index 000000000..0bd2163bb --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/link_std.mk @@ -0,0 +1,42 @@ +# +# Link instructions for standard systems +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +ifdef BUILD_PROJECT + + .PHONY: clean_project distclean_project + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP_DIR)/builds/$(PROJECT).mk + + # The cleanup targets. + # + clean_project: clean_project_std + distclean_project: distclean_project_std + + # This final rule is used to link all object files into a single library. + # this is compiler-specific + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + +endif + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/mac/FreeType.m68k_cfm.make.txt b/alienblaster/project/jni/freetype/builds/mac/FreeType.m68k_cfm.make.txt new file mode 100644 index 000000000..3360d9176 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/mac/FreeType.m68k_cfm.make.txt @@ -0,0 +1,208 @@ +# File: FreeType.m68k_cfm.make +# Target: FreeType.m68k_cfm +# Created: Thursday, October 27, 2005 09:23:25 PM + + +MAKEFILE = FreeType.m68k_cfm.make +\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = :objs: +Includes = \xB6 + -ansi strict \xB6 + -includes unix \xB6 + -i :include: \xB6 + -i :src: \xB6 + -i :include:freetype:config: + +Sym-68K = -sym off + +COptions = \xB6 + -d HAVE_FSSPEC=1 \xB6 + -d HAVE_FSREF=0 \xB6 + -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 + -d HAVE_QUICKDRAW_CARBON=0 \xB6 + -d HAVE_ATS=0 \xB6 + -d FT2_BUILD_LIBRARY \xB6 + -d FT_CONFIG_CONFIG_H="" \xB6 + -d FT_CONFIG_MODULES_H="" \xB6 + {Includes} {Sym-68K} -model cfmseg + + +### Source Files ### + +SrcFiles = \xB6 + :src:autofit:autofit.c \xB6 + :builds:mac:ftbase.c \xB6 + :src:base:ftbbox.c \xB6 + :src:base:ftbdf.c \xB6 + :src:base:ftbitmap.c \xB6 + :src:base:ftdebug.c \xB6 + :src:base:ftfstype.c \xB6 + :src:base:ftglyph.c \xB6 + :src:base:ftgxval.c \xB6 + :src:base:ftinit.c \xB6 + :src:base:ftmm.c \xB6 + :src:base:ftotval.c \xB6 + :src:base:ftpfr.c \xB6 + :src:base:ftstroke.c \xB6 + :src:base:ftsynth.c \xB6 + :src:base:ftsystem.c \xB6 + :src:base:fttype1.c \xB6 + :src:base:ftwinfnt.c \xB6 + :src:base:ftxf86.c \xB6 + :src:cache:ftcache.c \xB6 + :src:bdf:bdf.c \xB6 + :src:cff:cff.c \xB6 + :src:cid:type1cid.c \xB6 +# :src:gxvalid:gxvalid.c \xB6 + :src:gzip:ftgzip.c \xB6 + :src:lzw:ftlzw.c \xB6 + :src:otvalid:otvalid.c \xB6 + :src:pcf:pcf.c \xB6 + :src:pfr:pfr.c \xB6 + :src:psaux:psaux.c \xB6 + :src:pshinter:pshinter.c \xB6 + :src:psnames:psmodule.c \xB6 + :src:raster:raster.c \xB6 + :src:sfnt:sfnt.c \xB6 + :src:smooth:smooth.c \xB6 + :src:truetype:truetype.c \xB6 + :src:type1:type1.c \xB6 + :src:type42:type42.c \xB6 + :src:winfonts:winfnt.c + + +### Object Files ### + +ObjFiles-68K = \xB6 + "{ObjDir}autofit.c.o" \xB6 + "{ObjDir}ftbase.c.o" \xB6 + "{ObjDir}ftbbox.c.o" \xB6 + "{ObjDir}ftbdf.c.o" \xB6 + "{ObjDir}ftbitmap.c.o" \xB6 + "{ObjDir}ftdebug.c.o" \xB6 + "{ObjDir}ftfstype.c.o" \xB6 + "{ObjDir}ftglyph.c.o" \xB6 + "{ObjDir}ftgxval.c.o" \xB6 + "{ObjDir}ftinit.c.o" \xB6 + "{ObjDir}ftmm.c.o" \xB6 + "{ObjDir}ftotval.c.o" \xB6 + "{ObjDir}ftpfr.c.o" \xB6 + "{ObjDir}ftstroke.c.o" \xB6 + "{ObjDir}ftsynth.c.o" \xB6 + "{ObjDir}ftsystem.c.o" \xB6 + "{ObjDir}fttype1.c.o" \xB6 + "{ObjDir}ftwinfnt.c.o" \xB6 + "{ObjDir}ftxf86.c.o" \xB6 + "{ObjDir}ftcache.c.o" \xB6 + "{ObjDir}bdf.c.o" \xB6 + "{ObjDir}cff.c.o" \xB6 + "{ObjDir}type1cid.c.o" \xB6 +# "{ObjDir}gxvalid.c.o" \xB6 + "{ObjDir}ftgzip.c.o" \xB6 + "{ObjDir}ftlzw.c.o" \xB6 + "{ObjDir}otvalid.c.o" \xB6 + "{ObjDir}pcf.c.o" \xB6 + "{ObjDir}pfr.c.o" \xB6 + "{ObjDir}psaux.c.o" \xB6 + "{ObjDir}pshinter.c.o" \xB6 + "{ObjDir}psmodule.c.o" \xB6 + "{ObjDir}raster.c.o" \xB6 + "{ObjDir}sfnt.c.o" \xB6 + "{ObjDir}smooth.c.o" \xB6 + "{ObjDir}truetype.c.o" \xB6 + "{ObjDir}type1.c.o" \xB6 + "{ObjDir}type42.c.o" \xB6 + "{ObjDir}winfnt.c.o" + + +### Libraries ### + +LibFiles-68K = + + +### Default Rules ### + +.c.o \xC4 .c {\xA5MondoBuild\xA5} + {C} {depDir}{default}.c -o {targDir}{default}.c.o {COptions} + + +### Build Rules ### + +:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c + Duplicate :src:base:ftbase.c :builds:mac:ftbase.c + +"{ObjDir}ftbase.c.o" \xC4\xC4 :builds:mac:ftbase.c + {C} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.o" \xB6 + -i :builds:mac: \xB6 + -i :src:base: \xB6 + {COptions} + +FreeType.m68k_cfm \xC4\xC4 FreeType.m68k_cfm.o + +FreeType.m68k_cfm.o \xC4\xC4 {ObjFiles-68K} {LibFiles-68K} {\xA5MondoBuild\xA5} + Lib \xB6 + -o {Targ} \xB6 + {ObjFiles-68K} \xB6 + {LibFiles-68K} \xB6 + {Sym-68K} \xB6 + -mf -d + + + +### Required Dependencies ### + +"{ObjDir}autofit.c.o" \xC4 :src:autofit:autofit.c +# "{ObjDir}ftbase.c.o" \xC4 :src:base:ftbase.c +"{ObjDir}ftbbox.c.o" \xC4 :src:base:ftbbox.c +"{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c +"{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c +"{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c +"{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c +"{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c +"{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c +"{ObjDir}ftinit.c.o" \xC4 :src:base:ftinit.c +"{ObjDir}ftmm.c.o" \xC4 :src:base:ftmm.c +"{ObjDir}ftotval.c.o" \xC4 :src:base:ftotval.c +"{ObjDir}ftpfr.c.o" \xC4 :src:base:ftpfr.c +"{ObjDir}ftstroke.c.o" \xC4 :src:base:ftstroke.c +"{ObjDir}ftsynth.c.o" \xC4 :src:base:ftsynth.c +"{ObjDir}ftsystem.c.o" \xC4 :src:base:ftsystem.c +"{ObjDir}fttype1.c.o" \xC4 :src:base:fttype1.c +"{ObjDir}ftwinfnt.c.o" \xC4 :src:base:ftwinfnt.c +"{ObjDir}ftxf86.c.o" \xC4 :src:base:ftxf86.c +"{ObjDir}ftcache.c.o" \xC4 :src:cache:ftcache.c +"{ObjDir}bdf.c.o" \xC4 :src:bdf:bdf.c +"{ObjDir}cff.c.o" \xC4 :src:cff:cff.c +"{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c +# "{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c +"{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c +"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c +"{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c +"{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c +"{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c +"{ObjDir}psaux.c.o" \xC4 :src:psaux:psaux.c +"{ObjDir}pshinter.c.o" \xC4 :src:pshinter:pshinter.c +"{ObjDir}psmodule.c.o" \xC4 :src:psnames:psmodule.c +"{ObjDir}raster.c.o" \xC4 :src:raster:raster.c +"{ObjDir}sfnt.c.o" \xC4 :src:sfnt:sfnt.c +"{ObjDir}smooth.c.o" \xC4 :src:smooth:smooth.c +"{ObjDir}truetype.c.o" \xC4 :src:truetype:truetype.c +"{ObjDir}type1.c.o" \xC4 :src:type1:type1.c +"{ObjDir}type42.c.o" \xC4 :src:type42:type42.c +"{ObjDir}winfnt.c.o" \xC4 :src:winfonts:winfnt.c + + +### Optional Dependencies ### +### Build this target to generate "include file" dependencies. ### + +Dependencies \xC4 $OutOfDate + MakeDepend \xB6 + -append {MAKEFILE} \xB6 + -ignore "{CIncludes}" \xB6 + -objdir "{ObjDir}" \xB6 + -objext .o \xB6 + {Includes} \xB6 + {SrcFiles} + + diff --git a/alienblaster/project/jni/freetype/builds/mac/FreeType.m68k_far.make.txt b/alienblaster/project/jni/freetype/builds/mac/FreeType.m68k_far.make.txt new file mode 100644 index 000000000..224f8e180 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/mac/FreeType.m68k_far.make.txt @@ -0,0 +1,207 @@ +# File: FreeType.m68k_far.make +# Target: FreeType.m68k_far +# Created: Tuesday, October 25, 2005 03:34:05 PM + + +MAKEFILE = FreeType.m68k_far.make +\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = :objs: +Includes = \xB6 + -includes unix \xB6 + -i :include: \xB6 + -i :src: \xB6 + -i :include:freetype:config: + +Sym-68K = -sym off + +COptions = \xB6 + -d HAVE_FSSPEC=1 \xB6 + -d HAVE_FSREF=0 \xB6 + -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 + -d HAVE_QUICKDRAW_CARBON=0 \xB6 + -d HAVE_ATS=0 \xB6 + -d FT2_BUILD_LIBRARY \xB6 + -d FT_CONFIG_CONFIG_H="" \xB6 + -d FT_CONFIG_MODULES_H="" \xB6 + {Includes} {Sym-68K} -model far + + +### Source Files ### + +SrcFiles = \xB6 + :src:autofit:autofit.c \xB6 + :builds:mac:ftbase.c \xB6 + :src:base:ftbbox.c \xB6 + :src:base:ftbdf.c \xB6 + :src:base:ftbitmap.c \xB6 + :src:base:ftdebug.c \xB6 + :src:base:ftfstype.c \xB6 + :src:base:ftglyph.c \xB6 + :src:base:ftgxval.c \xB6 + :src:base:ftinit.c \xB6 + :src:base:ftmm.c \xB6 + :src:base:ftotval.c \xB6 + :src:base:ftpfr.c \xB6 + :src:base:ftstroke.c \xB6 + :src:base:ftsynth.c \xB6 + :src:base:ftsystem.c \xB6 + :src:base:fttype1.c \xB6 + :src:base:ftwinfnt.c \xB6 + :src:base:ftxf86.c \xB6 + :src:cache:ftcache.c \xB6 + :src:bdf:bdf.c \xB6 + :src:cff:cff.c \xB6 + :src:cid:type1cid.c \xB6 + :src:gxvalid:gxvalid.c \xB6 + :src:gzip:ftgzip.c \xB6 + :src:lzw:ftlzw.c \xB6 + :src:otvalid:otvalid.c \xB6 + :src:pcf:pcf.c \xB6 + :src:pfr:pfr.c \xB6 + :src:psaux:psaux.c \xB6 + :src:pshinter:pshinter.c \xB6 + :src:psnames:psmodule.c \xB6 + :src:raster:raster.c \xB6 + :src:sfnt:sfnt.c \xB6 + :src:smooth:smooth.c \xB6 + :src:truetype:truetype.c \xB6 + :src:type1:type1.c \xB6 + :src:type42:type42.c \xB6 + :src:winfonts:winfnt.c + + +### Object Files ### + +ObjFiles-68K = \xB6 + "{ObjDir}autofit.c.o" \xB6 + "{ObjDir}ftbase.c.o" \xB6 + "{ObjDir}ftbbox.c.o" \xB6 + "{ObjDir}ftbdf.c.o" \xB6 + "{ObjDir}ftbitmap.c.o" \xB6 + "{ObjDir}ftdebug.c.o" \xB6 + "{ObjDir}ftfstype.c.o" \xB6 + "{ObjDir}ftglyph.c.o" \xB6 + "{ObjDir}ftgxval.c.o" \xB6 + "{ObjDir}ftinit.c.o" \xB6 + "{ObjDir}ftmm.c.o" \xB6 + "{ObjDir}ftotval.c.o" \xB6 + "{ObjDir}ftpfr.c.o" \xB6 + "{ObjDir}ftstroke.c.o" \xB6 + "{ObjDir}ftsynth.c.o" \xB6 + "{ObjDir}ftsystem.c.o" \xB6 + "{ObjDir}fttype1.c.o" \xB6 + "{ObjDir}ftwinfnt.c.o" \xB6 + "{ObjDir}ftxf86.c.o" \xB6 + "{ObjDir}ftcache.c.o" \xB6 + "{ObjDir}bdf.c.o" \xB6 + "{ObjDir}cff.c.o" \xB6 + "{ObjDir}type1cid.c.o" \xB6 + "{ObjDir}gxvalid.c.o" \xB6 + "{ObjDir}ftgzip.c.o" \xB6 + "{ObjDir}ftlzw.c.o" \xB6 + "{ObjDir}otvalid.c.o" \xB6 + "{ObjDir}pcf.c.o" \xB6 + "{ObjDir}pfr.c.o" \xB6 + "{ObjDir}psaux.c.o" \xB6 + "{ObjDir}pshinter.c.o" \xB6 + "{ObjDir}psmodule.c.o" \xB6 + "{ObjDir}raster.c.o" \xB6 + "{ObjDir}sfnt.c.o" \xB6 + "{ObjDir}smooth.c.o" \xB6 + "{ObjDir}truetype.c.o" \xB6 + "{ObjDir}type1.c.o" \xB6 + "{ObjDir}type42.c.o" \xB6 + "{ObjDir}winfnt.c.o" + + +### Libraries ### + +LibFiles-68K = + + +### Default Rules ### + +.c.o \xC4 .c {\xA5MondoBuild\xA5} + {C} {depDir}{default}.c -o {targDir}{default}.c.o {COptions} \xB6 + -ansi strict + +### Build Rules ### + +:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c + Duplicate :src:base:ftbase.c :builds:mac:ftbase.c + +"{ObjDir}ftbase.c.o" \xC4\xC4 :builds:mac:ftbase.c + {C} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.o" \xB6 + -i :builds:mac: \xB6 + -i :src:base: \xB6 + {COptions} + +FreeType.m68k_far \xC4\xC4 FreeType.m68k_far.o + +FreeType.m68k_far.o \xC4\xC4 {ObjFiles-68K} {LibFiles-68K} {\xA5MondoBuild\xA5} + Lib \xB6 + -o {Targ} \xB6 + {ObjFiles-68K} \xB6 + {LibFiles-68K} \xB6 + {Sym-68K} \xB6 + -mf -d + + + +### Required Dependencies ### + +"{ObjDir}autofit.c.o" \xC4 :src:autofit:autofit.c +# "{ObjDir}ftbase.c.o" \xC4 :src:base:ftbase.c +"{ObjDir}ftbbox.c.o" \xC4 :src:base:ftbbox.c +"{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c +"{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c +"{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c +"{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c +"{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c +"{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c +"{ObjDir}ftinit.c.o" \xC4 :src:base:ftinit.c +"{ObjDir}ftmm.c.o" \xC4 :src:base:ftmm.c +"{ObjDir}ftotval.c.o" \xC4 :src:base:ftotval.c +"{ObjDir}ftpfr.c.o" \xC4 :src:base:ftpfr.c +"{ObjDir}ftstroke.c.o" \xC4 :src:base:ftstroke.c +"{ObjDir}ftsynth.c.o" \xC4 :src:base:ftsynth.c +"{ObjDir}ftsystem.c.o" \xC4 :src:base:ftsystem.c +"{ObjDir}fttype1.c.o" \xC4 :src:base:fttype1.c +"{ObjDir}ftwinfnt.c.o" \xC4 :src:base:ftwinfnt.c +"{ObjDir}ftxf86.c.o" \xC4 :src:base:ftxf86.c +"{ObjDir}ftcache.c.o" \xC4 :src:cache:ftcache.c +"{ObjDir}bdf.c.o" \xC4 :src:bdf:bdf.c +"{ObjDir}cff.c.o" \xC4 :src:cff:cff.c +"{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c +"{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c +"{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c +"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c +"{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c +"{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c +"{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c +"{ObjDir}psaux.c.o" \xC4 :src:psaux:psaux.c +"{ObjDir}pshinter.c.o" \xC4 :src:pshinter:pshinter.c +"{ObjDir}psmodule.c.o" \xC4 :src:psnames:psmodule.c +"{ObjDir}raster.c.o" \xC4 :src:raster:raster.c +"{ObjDir}sfnt.c.o" \xC4 :src:sfnt:sfnt.c +"{ObjDir}smooth.c.o" \xC4 :src:smooth:smooth.c +"{ObjDir}truetype.c.o" \xC4 :src:truetype:truetype.c +"{ObjDir}type1.c.o" \xC4 :src:type1:type1.c +"{ObjDir}type42.c.o" \xC4 :src:type42:type42.c +"{ObjDir}winfnt.c.o" \xC4 :src:winfonts:winfnt.c + + +### Optional Dependencies ### +### Build this target to generate "include file" dependencies. ### + +Dependencies \xC4 $OutOfDate + MakeDepend \xB6 + -append {MAKEFILE} \xB6 + -ignore "{CIncludes}" \xB6 + -objdir "{ObjDir}" \xB6 + -objext .o \xB6 + {Includes} \xB6 + {SrcFiles} + + diff --git a/alienblaster/project/jni/freetype/builds/mac/FreeType.ppc_carbon.make.txt b/alienblaster/project/jni/freetype/builds/mac/FreeType.ppc_carbon.make.txt new file mode 100644 index 000000000..0b80deb4e --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/mac/FreeType.ppc_carbon.make.txt @@ -0,0 +1,211 @@ +# File: FreeType.ppc_carbon.make +# Target: FreeType.ppc_carbon +# Created: Friday, October 28, 2005 03:40:06 PM + + +MAKEFILE = FreeType.ppc_carbon.make +\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = :objs: +Includes = \xB6 + -ansi strict \xB6 + -includes unix \xB6 + -i :include: \xB6 + -i :src: \xB6 + -i :include:freetype:config: + +Sym-PPC = -sym off + +PPCCOptions = \xB6 + -d HAVE_FSSPEC=1 \xB6 + -d HAVE_FSREF=1 \xB6 + -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 + -d HAVE_QUICKDRAW_CARBON=1 \xB6 + -d HAVE_ATS=0 \xB6 + -d FT2_BUILD_LIBRARY \xB6 + -d FT_CONFIG_CONFIG_H="" \xB6 + -d FT_CONFIG_MODULES_H="" \xB6 + {Includes} {Sym-PPC} -d TARGET_API_MAC_CARBON=1 + + +### Source Files ### + +SrcFiles = \xB6 + :src:autofit:autofit.c \xB6 + :builds:mac:ftbase.c \xB6 + :src:base:ftbbox.c \xB6 + :src:base:ftbdf.c \xB6 + :src:base:ftbitmap.c \xB6 + :src:base:ftdebug.c \xB6 + :src:base:ftfstype.c \xB6 + :src:base:ftglyph.c \xB6 + :src:base:ftgxval.c \xB6 + :src:base:ftinit.c \xB6 + :src:base:ftmm.c \xB6 + :src:base:ftotval.c \xB6 + :src:base:ftpfr.c \xB6 + :src:base:ftstroke.c \xB6 + :src:base:ftsynth.c \xB6 + :src:base:ftsystem.c \xB6 + :src:base:fttype1.c \xB6 + :src:base:ftwinfnt.c \xB6 + :src:base:ftxf86.c \xB6 + :src:cache:ftcache.c \xB6 + :src:bdf:bdf.c \xB6 + :src:cff:cff.c \xB6 + :src:cid:type1cid.c \xB6 + :src:gxvalid:gxvalid.c \xB6 + :src:gzip:ftgzip.c \xB6 + :src:lzw:ftlzw.c \xB6 + :src:otvalid:otvalid.c \xB6 + :src:pcf:pcf.c \xB6 + :src:pfr:pfr.c \xB6 + :src:psaux:psaux.c \xB6 + :src:pshinter:pshinter.c \xB6 + :src:psnames:psmodule.c \xB6 + :src:raster:raster.c \xB6 + :src:sfnt:sfnt.c \xB6 + :src:smooth:smooth.c \xB6 + :src:truetype:truetype.c \xB6 + :src:type1:type1.c \xB6 + :src:type42:type42.c \xB6 + :src:winfonts:winfnt.c + + +### Object Files ### + +ObjFiles-PPC = \xB6 + "{ObjDir}autofit.c.x" \xB6 + "{ObjDir}ftbase.c.x" \xB6 + "{ObjDir}ftbbox.c.x" \xB6 + "{ObjDir}ftbdf.c.x" \xB6 + "{ObjDir}ftbitmap.c.x" \xB6 + "{ObjDir}ftdebug.c.x" \xB6 + "{ObjDir}ftfstype.c.x" \xB6 + "{ObjDir}ftglyph.c.x" \xB6 + "{ObjDir}ftgxval.c.x" \xB6 + "{ObjDir}ftinit.c.x" \xB6 + "{ObjDir}ftmm.c.x" \xB6 + "{ObjDir}ftotval.c.x" \xB6 + "{ObjDir}ftpfr.c.x" \xB6 + "{ObjDir}ftstroke.c.x" \xB6 + "{ObjDir}ftsynth.c.x" \xB6 + "{ObjDir}ftsystem.c.x" \xB6 + "{ObjDir}fttype1.c.x" \xB6 + "{ObjDir}ftwinfnt.c.x" \xB6 + "{ObjDir}ftxf86.c.x" \xB6 + "{ObjDir}ftcache.c.x" \xB6 + "{ObjDir}bdf.c.x" \xB6 + "{ObjDir}cff.c.x" \xB6 + "{ObjDir}type1cid.c.x" \xB6 + "{ObjDir}gxvalid.c.x" \xB6 + "{ObjDir}ftgzip.c.x" \xB6 + "{ObjDir}ftlzw.c.x" \xB6 + "{ObjDir}otvalid.c.x" \xB6 + "{ObjDir}pcf.c.x" \xB6 + "{ObjDir}pfr.c.x" \xB6 + "{ObjDir}psaux.c.x" \xB6 + "{ObjDir}pshinter.c.x" \xB6 + "{ObjDir}psmodule.c.x" \xB6 + "{ObjDir}raster.c.x" \xB6 + "{ObjDir}sfnt.c.x" \xB6 + "{ObjDir}smooth.c.x" \xB6 + "{ObjDir}truetype.c.x" \xB6 + "{ObjDir}type1.c.x" \xB6 + "{ObjDir}type42.c.x" \xB6 + "{ObjDir}winfnt.c.x" + + +### Libraries ### + +LibFiles-PPC = + + +### Default Rules ### + +.c.x \xC4 .c {\xA5MondoBuild\xA5} + {PPCC} {depDir}{default}.c -o {targDir}{default}.c.x {PPCCOptions} + + +### Build Rules ### + +:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c + Duplicate :src:base:ftbase.c :builds:mac:ftbase.c + +"{ObjDir}ftbase.c.x" \xC4\xC4 :builds:mac:ftbase.c + {PPCC} :builds:mac:ftbase.c -o {ObjDir}ftbase.c.x \xB6 + -i :builds:mac: \xB6 + -i :src:base: \xB6 + {PPCCOptions} + +FreeType.ppc_carbon \xC4\xC4 FreeType.ppc_carbon.o + +FreeType.ppc_carbon.o \xC4\xC4 {ObjFiles-PPC} {LibFiles-PPC} {\xA5MondoBuild\xA5} + PPCLink \xB6 + -o {Targ} \xB6 + {ObjFiles-PPC} \xB6 + {LibFiles-PPC} \xB6 + {Sym-PPC} \xB6 + -mf -d \xB6 + -t 'XCOF' \xB6 + -c 'MPS ' \xB6 + -xm l + + + +### Required Dependencies ### + +"{ObjDir}autofit.c.x" \xC4 :src:autofit:autofit.c +# "{ObjDir}ftbase.c.x" \xC4 :builds:mac:ftbase.c +"{ObjDir}ftbbox.c.x" \xC4 :src:base:ftbbox.c +"{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c +"{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c +"{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c +"{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c +"{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c +"{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c +"{ObjDir}ftinit.c.x" \xC4 :src:base:ftinit.c +"{ObjDir}ftmm.c.x" \xC4 :src:base:ftmm.c +"{ObjDir}ftotval.c.x" \xC4 :src:base:ftotval.c +"{ObjDir}ftpfr.c.x" \xC4 :src:base:ftpfr.c +"{ObjDir}ftstroke.c.x" \xC4 :src:base:ftstroke.c +"{ObjDir}ftsynth.c.x" \xC4 :src:base:ftsynth.c +"{ObjDir}ftsystem.c.x" \xC4 :src:base:ftsystem.c +"{ObjDir}fttype1.c.x" \xC4 :src:base:fttype1.c +"{ObjDir}ftwinfnt.c.x" \xC4 :src:base:ftwinfnt.c +"{ObjDir}ftxf86.c.x" \xC4 :src:base:ftxf86.c +"{ObjDir}ftcache.c.x" \xC4 :src:cache:ftcache.c +"{ObjDir}bdf.c.x" \xC4 :src:bdf:bdf.c +"{ObjDir}cff.c.x" \xC4 :src:cff:cff.c +"{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c +"{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c +"{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c +"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c +"{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c +"{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c +"{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c +"{ObjDir}psaux.c.x" \xC4 :src:psaux:psaux.c +"{ObjDir}pshinter.c.x" \xC4 :src:pshinter:pshinter.c +"{ObjDir}psmodule.c.x" \xC4 :src:psnames:psmodule.c +"{ObjDir}raster.c.x" \xC4 :src:raster:raster.c +"{ObjDir}sfnt.c.x" \xC4 :src:sfnt:sfnt.c +"{ObjDir}smooth.c.x" \xC4 :src:smooth:smooth.c +"{ObjDir}truetype.c.x" \xC4 :src:truetype:truetype.c +"{ObjDir}type1.c.x" \xC4 :src:type1:type1.c +"{ObjDir}type42.c.x" \xC4 :src:type42:type42.c +"{ObjDir}winfnt.c.x" \xC4 :src:winfonts:winfnt.c + + +### Optional Dependencies ### +### Build this target to generate "include file" dependencies. ### + +Dependencies \xC4 $OutOfDate + MakeDepend \xB6 + -append {MAKEFILE} \xB6 + -ignore "{CIncludes}" \xB6 + -objdir "{ObjDir}" \xB6 + -objext .x \xB6 + {Includes} \xB6 + {SrcFiles} + + diff --git a/alienblaster/project/jni/freetype/builds/mac/FreeType.ppc_classic.make.txt b/alienblaster/project/jni/freetype/builds/mac/FreeType.ppc_classic.make.txt new file mode 100644 index 000000000..ffa23b264 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/mac/FreeType.ppc_classic.make.txt @@ -0,0 +1,212 @@ +# File: FreeType.ppc_classic.make +# Target: FreeType.ppc_classic +# Created: Thursday, October 27, 2005 07:42:43 PM + + +MAKEFILE = FreeType.ppc_classic.make +\xA5MondoBuild\xA5 = {MAKEFILE} # Make blank to avoid rebuilds when makefile is modified + +ObjDir = :objs: +Includes = \xB6 + -ansi strict \xB6 + -includes unix \xB6 + -i :include: \xB6 + -i :src: \xB6 + -i :include:freetype:config: + +Sym-PPC = -sym off + +PPCCOptions = \xB6 + -d HAVE_FSSPEC=1 \xB6 + -d HAVE_FSREF=0 \xB6 + -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6 + -d HAVE_QUICKDRAW_CARBON=0 \xB6 + -d HAVE_ATS=0 \xB6 + -d FT2_BUILD_LIBRARY \xB6 + -d FT_CONFIG_CONFIG_H="" \xB6 + -d FT_CONFIG_MODULES_H="" \xB6 + {Includes} {Sym-PPC} + + +### Source Files ### + +SrcFiles = \xB6 + :src:autofit:autofit.c \xB6 + :builds:mac:ftbase.c \xB6 + :src:base:ftbbox.c \xB6 + :src:base:ftbdf.c \xB6 + :src:base:ftbitmap.c \xB6 + :src:base:ftdebug.c \xB6 + :src:base:ftfstype.c \xB6 + :src:base:ftglyph.c \xB6 + :src:base:ftgxval.c \xB6 + :src:base:ftinit.c \xB6 + :src:base:ftmm.c \xB6 + :src:base:ftotval.c \xB6 + :src:base:ftpfr.c \xB6 + :src:base:ftstroke.c \xB6 + :src:base:ftsynth.c \xB6 + :src:base:ftsystem.c \xB6 + :src:base:fttype1.c \xB6 + :src:base:ftwinfnt.c \xB6 + :src:base:ftxf86.c \xB6 + :src:cache:ftcache.c \xB6 + :src:bdf:bdf.c \xB6 + :src:cff:cff.c \xB6 + :src:cid:type1cid.c \xB6 + :src:gxvalid:gxvalid.c \xB6 + :src:gzip:ftgzip.c \xB6 + :src:lzw:ftlzw.c \xB6 + :src:otvalid:otvalid.c \xB6 + :src:pcf:pcf.c \xB6 + :src:pfr:pfr.c \xB6 + :src:psaux:psaux.c \xB6 + :src:pshinter:pshinter.c \xB6 + :src:psnames:psmodule.c \xB6 + :src:raster:raster.c \xB6 + :src:sfnt:sfnt.c \xB6 + :src:smooth:smooth.c \xB6 + :src:truetype:truetype.c \xB6 + :src:type1:type1.c \xB6 + :src:type42:type42.c \xB6 + :src:winfonts:winfnt.c + + +### Object Files ### + +ObjFiles-PPC = \xB6 + "{ObjDir}autofit.c.x" \xB6 + "{ObjDir}ftbase.c.x" \xB6 + "{ObjDir}ftbbox.c.x" \xB6 + "{ObjDir}ftbdf.c.x" \xB6 + "{ObjDir}ftbitmap.c.x" \xB6 + "{ObjDir}ftdebug.c.x" \xB6 + "{ObjDir}ftfstype.c.x" \xB6 + "{ObjDir}ftglyph.c.x" \xB6 + "{ObjDir}ftgxval.c.x" \xB6 + "{ObjDir}ftinit.c.x" \xB6 + "{ObjDir}ftmm.c.x" \xB6 + "{ObjDir}ftotval.c.x" \xB6 + "{ObjDir}ftpfr.c.x" \xB6 + "{ObjDir}ftstroke.c.x" \xB6 + "{ObjDir}ftsynth.c.x" \xB6 + "{ObjDir}ftsystem.c.x" \xB6 + "{ObjDir}fttype1.c.x" \xB6 + "{ObjDir}ftwinfnt.c.x" \xB6 + "{ObjDir}ftxf86.c.x" \xB6 + "{ObjDir}ftcache.c.x" \xB6 + "{ObjDir}bdf.c.x" \xB6 + "{ObjDir}cff.c.x" \xB6 + "{ObjDir}type1cid.c.x" \xB6 + "{ObjDir}gxvalid.c.x" \xB6 + "{ObjDir}ftgzip.c.x" \xB6 + "{ObjDir}ftlzw.c.x" \xB6 + "{ObjDir}otvalid.c.x" \xB6 + "{ObjDir}pcf.c.x" \xB6 + "{ObjDir}pfr.c.x" \xB6 + "{ObjDir}psaux.c.x" \xB6 + "{ObjDir}pshinter.c.x" \xB6 + "{ObjDir}psmodule.c.x" \xB6 + "{ObjDir}raster.c.x" \xB6 + "{ObjDir}sfnt.c.x" \xB6 + "{ObjDir}smooth.c.x" \xB6 + "{ObjDir}truetype.c.x" \xB6 + "{ObjDir}type1.c.x" \xB6 + "{ObjDir}type42.c.x" \xB6 + "{ObjDir}winfnt.c.x" + + +### Libraries ### + +LibFiles-PPC = + + +### Default Rules ### + +.c.x \xC4 .c {\xA5MondoBuild\xA5} + {PPCC} {depDir}{default}.c -o {targDir}{default}.c.x {PPCCOptions} + + +### Build Rules ### + +:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c + Duplicate :src:base:ftbase.c :builds:mac:ftbase.c + +"{ObjDir}ftbase.c.x" \xC4\xC4 :builds:mac:ftbase.c + {PPCC} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.x" \xB6 + -i :builds:mac: \xB6 + -i :src:base: \xB6 + {PPCCOptions} + +FreeType.ppc_classic \xC4\xC4 FreeType.ppc_classic.o + +FreeType.ppc_classic.o \xC4\xC4 {ObjFiles-PPC} {LibFiles-PPC} {\xA5MondoBuild\xA5} + PPCLink \xB6 + -o {Targ} \xB6 + {ObjFiles-PPC} \xB6 + {LibFiles-PPC} \xB6 + {Sym-PPC} \xB6 + -mf -d \xB6 + -t 'XCOF' \xB6 + -c 'MPS ' \xB6 + -xm l + + + +### Required Dependencies ### + +"{ObjDir}autofit.c.x" \xC4 :src:autofit:autofit.c +# "{ObjDir}ftbase.c.x" \xC4 :builds:mac:ftbase.c +"{ObjDir}ftbbox.c.x" \xC4 :src:base:ftbbox.c +"{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c +"{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c +"{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c +"{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c +"{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c +"{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c +"{ObjDir}ftinit.c.x" \xC4 :src:base:ftinit.c +"{ObjDir}ftmm.c.x" \xC4 :src:base:ftmm.c +"{ObjDir}ftotval.c.x" \xC4 :src:base:ftotval.c +"{ObjDir}ftpfr.c.x" \xC4 :src:base:ftpfr.c +"{ObjDir}ftstroke.c.x" \xC4 :src:base:ftstroke.c +"{ObjDir}ftsynth.c.x" \xC4 :src:base:ftsynth.c +"{ObjDir}ftsystem.c.x" \xC4 :src:base:ftsystem.c +"{ObjDir}fttype1.c.x" \xC4 :src:base:fttype1.c +"{ObjDir}ftwinfnt.c.x" \xC4 :src:base:ftwinfnt.c +"{ObjDir}ftxf86.c.x" \xC4 :src:base:ftxf86.c +"{ObjDir}ftcache.c.x" \xC4 :src:cache:ftcache.c +"{ObjDir}bdf.c.x" \xC4 :src:bdf:bdf.c +"{ObjDir}cff.c.x" \xC4 :src:cff:cff.c +"{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c +"{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c +"{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c +"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c +"{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c +"{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c +"{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c +"{ObjDir}psaux.c.x" \xC4 :src:psaux:psaux.c +"{ObjDir}pshinter.c.x" \xC4 :src:pshinter:pshinter.c +"{ObjDir}psmodule.c.x" \xC4 :src:psnames:psmodule.c +"{ObjDir}raster.c.x" \xC4 :src:raster:raster.c +"{ObjDir}sfnt.c.x" \xC4 :src:sfnt:sfnt.c +"{ObjDir}smooth.c.x" \xC4 :src:smooth:smooth.c +"{ObjDir}truetype.c.x" \xC4 :src:truetype:truetype.c +"{ObjDir}type1.c.x" \xC4 :src:type1:type1.c +"{ObjDir}type42.c.x" \xC4 :src:type42:type42.c +"{ObjDir}winfnt.c.x" \xC4 :src:winfonts:winfnt.c + + + +### Optional Dependencies ### +### Build this target to generate "include file" dependencies. ### + +Dependencies \xC4 $OutOfDate + MakeDepend \xB6 + -append {MAKEFILE} \xB6 + -ignore "{CIncludes}" \xB6 + -objdir "{ObjDir}" \xB6 + -objext .x \xB6 + {Includes} \xB6 + {SrcFiles} + + diff --git a/alienblaster/project/jni/freetype/builds/mac/README b/alienblaster/project/jni/freetype/builds/mac/README new file mode 100644 index 000000000..bd3df8ada --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/mac/README @@ -0,0 +1,403 @@ +This folder contains + + * Makefile skeltons for Apple MPW (Macintosh's Programmers Workshop) + + * Python script to generate MPW makefile from skelton + + * Metrowerks CodeWarrior 9.0 project file in XML format + +------------------------------------------------------------ + +1. What is this +--------------- + +Files in this directory are designed to build FreeType +running on classic MacOS. To build FreeType running on +Mac OS X, build as the system is UNIX. + +However, Mac OS X is most useful to manipulate files in +vanilla FreeType to fit classic MacOS. + +The information about MacOS specific API is written in +appendix of this document. + +2. Requirement +-------------- + +You can use MPW: a free-charged developer environment +by Apple, or CodeWarrior: a commercial developer +environment by Metrowerks. GCC for MPW and Symantec +"Think C" are not tested at present. + + + 2-1. Apple MPW + -------------- + + Following C compilers are tested: + + m68k target: Apple SC 8.9.0d3e1 + ppc target: Apple MrC 5.0.0d3c1 + + The final MPW-GM (official release on 1999/Dec) is too + old and cannot compile FreeType, because bundled C + compilers cannot search header files in sub directories. + Updating by the final MPW-PR (pre-release on 2001/Feb) + is required. + + Required files are downloadable from: + + http://developer.apple.com/tools/mpw-tools/index.html + + Also you can find documents how to update by MPW-PR. + + Python is required to restore MPW makefiles from the + skeltons. Python bundled to Mac OS X is enough. For + classic MacOS, MacPython is available: + + http://homepages.cwi.nl/~jack/macpython/ + + MPW requires all files are typed by resource fork. + ResEdit bundled to MPW is enough. In Mac OS X, + /Developer/Tools/SetFile of DevTool is useful to + manipulate from commandline. + + 2-2. Metrowerks CodeWarrior + --------------------------- + + XML project file is generated and tested by + CodeWarrior 9.0. Older versions are not tested + at all. At present, static library for ppc target + is available in the project file. + + +3. How to build +--------------- + + 3-1. Apple MPW + -------------- + Detailed building procedure by Apple MPW is + described in following. + + 3-1-1. Generate MPW makefiles from the skeltons + ------------------------------------------------ + + Here are 4 skeltons for following targets are + included. + + - FreeType.m68k_far.make.txt + Ancient 32bit binary executable format for + m68k MacOS: System 6, with 32bit addressing + mode (far-pointer-model) So-called "Toolbox" + API is used. + + - FreeType.m68k_cfm.make.txt + CFM binary executable format for m68k MacOS: + System 7. So-called "Toolbox" API is used. + + - FreeType.ppc_classic.make.txt + CFM binary executable format for ppc MacOS: + System 7, MacOS 8, MacOS 9. So-called "Toolbox" + API is used. + + - FreeType.ppc_carbon.make.txt + CFM binary executable format for ppc MacOS: + MacOS 9. Carbon API is used. + + At present, static library is only supported, + although targets except of m68k_far are capable + to use shared library. + + MPW makefile syntax uses 8bit characters. To keep + from violating them during version control, here + we store skeltons in pure ASCII format. You must + generate MPW makefile by Python script ascii2mpw.py. + + In Mac OS X terminal, you can convert as: + + python builds/mac/ascii2mpw.py \ + < builds/mac/FreeType.m68k_far.make.txt \ + > FreeType.m68k_far.make + + The skeltons are designed to use in the top + directory where there are builds, include, src etc. + You must name the generated MPW makefile by removing + ".txt" from source skelton name. + + 3-1-2. Add resource forks to related files + ------------------------------------------ + + MPW's Make and C compilers cannot recognize files + without resource fork. You have to add resource + fork to the files that MPW uses. In Mac OS X + terminal of the system, you can do as: + + find . -name '*.[ch]' -exec \ + /Developer/Tools/SetFile -a l -c "MPS " -t TEXT \{\} \; + + find . -name '*.make' -exec \ + /Developer/Tools/SetFile -a l -c "MPS " -t TEXT \{\} \; + + + 3-1-3. Open MPW shell and build + ------------------------------- + + Open MPW shell and go to the top directory that + FreeType sources are extracted (MPW makefile must + be located in there), from "Set Directory" in + "Directory" menu. + + Choose "Build" from "Build" menu, and type the + name of project by removing ".make" from MPW + makefile, as: FreeType.m68k_far + + If building is successfully finished, you can find + built library in objs/ directory. + + + 3-2. Metrowerks CodeWarrior + --------------------------- + + Detailed building procedure by Metrowerks + CodeWarrior (CW) 9.0 is described in following. + + 3-2-1. Import XML project file + ------------------------------ + + CW XML project file is not ready for double- + click. Start CodeWarrior IDE, and choose + "Import project" in "File" menu. Choose XML + project file: builds/mac/ftlib.prj.xml. + In next, you will be asked where to save CW + native project file: you must choose + "builds/mac/ftlib.prj". The project file is + designed with relative path from there. After + CW native project file is generated, it is + automatically loaded, small project window + titled "ftlib.prj" is displayed. + + 3-2-2. Building + --------------- + Choose "Make" from "Project" menu. If building + is successfully finished, you can find built + library at objs/FreeTypeLib. + +4. TODO +------- + + 4-1. All modules should be included + ----------------------------------- + + At present, MPW makefiles and CW project file are + just updated versions of these by Leonard. Some + modules are added after the last maintenance, they + are not included. + + 4-2. Working test with ftdemos + ------------------------------ + + At present, MPW makefiles and CW project file can + build FreeType for classic MacOS. But their working + behaviours are not tested at all. Building ftdemos + for classic MacOS and working test is required. + + 4-3. Porting Jam onto MPW + ------------------------- + + FreeType uses Jam (and FT-Jam) for unified cross- + platform building tool. At present, Jam is not ported + to MPW. To update classic MacOS support easily, + building by Jam is expected on MPW. + + +APPENDIX I +---------- + + A-1. Framework dependencies + --------------------------- + + src/base/ftmac.c adds two Mac-specific features to + FreeType. These features are based on MacOS libraries. + + * accessing resource-fork font + The fonts for classic MacOS store their graphical data + in resource forks which cannot be accessed via ANSI C + functions. FreeType2 provides functions to handle such + resource fork fonts, they are based on File Manager + framework of MacOS. In addition, HFS and HFS+ file + system driver of Linux is supported. Following + functions are for this purpose. + + FT_New_Face_From_Resource() + FT_New_Face_From_FSSpec() + FT_New_Face_From_FSRef() + + * resolving font name to font file + The font menu of MacOS application prefers font name + written in FOND resource than sfnt resource. FreeType2 + provides functions to find font file by name in MacOS + application, they are based on QuickDraw Font Manager + and Apple Type Service framework of MacOS. + + FT_GetFile_From_Mac_Name() + FT_GetFile_From_Mac_ATS_Name() + + Working functions for each MacOS are summarized as + following. + + upto MacOS 6: + not tested (you have to obtain MPW 2.x) + + MacOS 7.x, 8.x, 9.x (without CarbonLib): + FT_GetFile_From_Mac_Name() + FT_New_Face_From_Resource() + FT_New_Face_From_FSSpec() + + MacOS 9.x (with CarbonLib): + FT_GetFile_From_Mac_Name() + FT_New_Face_From_Resource() + FT_New_Face_From_FSSpec() + FT_New_Face_From_FSRef() + + Mac OS X upto 10.4.x: + FT_GetFile_From_Mac_Name() deprecated + FT_New_Face_From_FSSpec() deprecated + FT_GetFile_From_Mac_ATS_Name() deprecated? + FT_New_Face_From_FSRef() + + A-2. Deprecated Functions + ------------------------- + + A-2-1. FileManager + ------------------ + + For convenience to write MacOS application, ftmac.c + provides functions to specify a file by FSSpec and FSRef, + because the file identification pathname had ever been + unrecommended method in MacOS programming. + + Toward to MacOS X 10.4 & 5, Carbon functions using FSSpec + datatype is noticed as deprecated, and recommended to + migrate to FSRef datatype. The big differences of FSRef + against FSSpec are explained in Apple TechNotes 2078. + + http://developer.apple.com/technotes/tn2002/tn2078.html + + - filename length: the max length of file + name of FSRef is 255 chars (it is limit of HFS+), + that of FSSpec is 31 chars (it is limit of HFS). + + - filename encoding: FSSpec is localized by + legacy encoding for each language system, + FSRef is Unicode enabled. + + A-2-2. FontManager + ------------------ + + Following functions receive QuickDraw fontname: + + FT_GetFile_From_Mac_Name() + + QuickDraw is deprecated and replaced by Quartz + since Mac OS X 10.4. They are still kept for + backward compatibility. By undefinition of + HAVE_QUICKDRAW in building, you can change these + functions to return FT_Err_Unimplemented always. + + Replacement functions are added for migration. + + FT_GetFile_From_Mac_ATS_Name() + + They are usable on Mac OS X only. On older systems, + these functions return FT_Err_Unimplemented always. + + The detailed incompatibilities and possibility + of FontManager emulation without QuickDraw is + explained in + + http://www.gyve.org/~mpsuzuki/ats_benchmark.html + + A-3. Framework Availabilities + ----------------------------- + + The framework of MacOS are often revised, especially + when new format of binary executable is introduced. + Following table is the minimum version of frameworks + to use functions used in FreeType2. The table is + extracted from MPW header files for assembly language. + + *** NOTE *** + The conditional definition of available data type + in MPW compiler is insufficient. You can compile + program using FSRef data type for older systems + (MacOS 7, 8) that don't know FSRef data type. + + + +-------------------+-----------------------------+ + CPU | mc680x0 | PowerPC | + +---------+---------+---------+---------+---------+ + Binary Executable Format | Classic | 68K-CFM | CFM | CFM | Mach-O | + +---------+---------+---------+---------+---------+ + Framework API | Toolbox | Toolbox | Toolbox | Carbon | Carbon | + +---------+---------+---------+---------+---------+ + + +---------+---------+---------+---------+---------+ + | ?(*) |Interface|Interface|CarbonLib|Mac OS X | + | |Lib |Lib | | | +* Files.h +---------+---------+---------+---------+---------+ +PBGetFCBInfoSync() | o | 7.1- | 7.1- | 1.0- | o | +FSMakeFSSpec() | o | 7.1- | 7.1- | 1.0- | o | +FSGetForkCBInfo() | o | (**) | 9.0- | 1.0- | o | +FSpMakeFSRef() | o | (**) | 9.0- | 1.0- | o | +FSGetCatalogInfo() | o | (**) | 9.0- | 1.0- | -10.3 | +FSPathMakeRef() | x | x | x | 1.1- | -10.3 | + +---------+---------+---------+---------+---------+ + + +---------+---------+---------+---------+---------+ + | ?(*) |Font |Font |CarbonLib|Mac OS X | + | |Manager |Manager | | | +* Fonts.h +---------+---------+---------+---------+---------+ +FMCreateFontFamilyIterator() | x | x | 9.0- | 1.0- | -10.3 | +FMDisposeFontFamilyIterator() | x | x | 9.0- | 1.0- | -10.3 | +FMGetNextFontFamily() | x | x | 9.0- | 1.0- | -10.3 | +FMGetFontFamilyName() | x | x | 9.0- | 1.0- | -10.3 | +FMCreateFontFamilyInstanceIterator() | x | x | 9.0- | 1.0- | -10.3 | +FMDisposeFontFamilyInstanceIterator() | x | x | 9.0- | 1.0- | -10.3 | +FMGetNextFontFamilyInstance() | x | x | 9.0- | 1.0- | -10.3 | + +---------+---------+---------+---------+---------+ + + +---------+---------+---------+---------+---------+ + | - | - | - |CarbonLib|Mac OS X | +* ATSFont.h (***) +---------+---------+---------+---------+---------+ +ATSFontFindFromName() | x | x | x | x | o | +ATSFontGetFileSpecification() | x | x | x | x | o | + +---------+---------+---------+---------+---------+ + + (*) + In the "Classic": the original binary executable + format, these framework functions are directly + transformed to MacOS system call. Therefore, the + exact availability should be checked by running + system. + + (**) + InterfaceLib is bundled to MacOS and its version + is usually equal to MacOS. There's no separate + update for InterfaceLib. It is supposed that + there's no InterfaceLib 9.x for m68k platforms. + In fact, these functions are FSRef dependent. + + (***) + ATSUI framework is available on ATSUnicode 8.5 on + ppc Toolbox CFM, CarbonLib 1.0 too. But its base: + ATS font manager is not published in these versions. + +------------------------------------------------------------ +Last update: 2009-Jul-25. + +Currently maintained by + suzuki toshiya, +Originally prepared by + Leonard Rosenthol, + Just van Rossum, + +This directory is now actively maintained as part of the FreeType Project. diff --git a/alienblaster/project/jni/freetype/builds/mac/ascii2mpw.py b/alienblaster/project/jni/freetype/builds/mac/ascii2mpw.py new file mode 100755 index 000000000..ad32b2197 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/mac/ascii2mpw.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +import sys +import string + +if len( sys.argv ) == 1 : + for asc_line in sys.stdin.readlines(): + mpw_line = string.replace(asc_line, "\\xA5", "\245") + mpw_line = string.replace(mpw_line, "\\xB6", "\266") + mpw_line = string.replace(mpw_line, "\\xC4", "\304") + mpw_line = string.replace(mpw_line, "\\xC5", "\305") + mpw_line = string.replace(mpw_line, "\\xFF", "\377") + mpw_line = string.replace(mpw_line, "\n", "\r") + mpw_line = string.replace(mpw_line, "\\n", "\n") + sys.stdout.write(mpw_line) +elif sys.argv[1] == "-r" : + for mpw_line in sys.stdin.readlines(): + asc_line = string.replace(mpw_line, "\n", "\\n") + asc_line = string.replace(asc_line, "\r", "\n") + asc_line = string.replace(asc_line, "\245", "\\xA5") + asc_line = string.replace(asc_line, "\266", "\\xB6") + asc_line = string.replace(asc_line, "\304", "\\xC4") + asc_line = string.replace(asc_line, "\305", "\\xC5") + asc_line = string.replace(asc_line, "\377", "\\xFF") + sys.stdout.write(asc_line) diff --git a/alienblaster/project/jni/freetype/builds/mac/ftlib.prj.xml b/alienblaster/project/jni/freetype/builds/mac/ftlib.prj.xml new file mode 100644 index 000000000..cbbc45ee5 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/mac/ftlib.prj.xml @@ -0,0 +1,1194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + + FreeTypeLib + + + + UserSourceTrees + + + AlwaysSearchUserPathstrue + InterpretDOSAndUnixPathstrue + RequireFrameworkStyleIncludesfalse + SourceRelativeIncludesfalse + UserSearchPaths + + SearchPath + Path: + PathFormatMacOS + PathRootProject + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + SearchPath + Path:::include: + PathFormatMacOS + PathRootProject + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + SearchPath + Path:::src: + PathFormatMacOS + PathRootProject + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + SearchPath + Path:: + PathFormatMacOS + PathRootProject + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + SystemSearchPaths + + SearchPath + Path: + PathFormatMacOS + PathRootCodeWarrior + + Recursivetrue + FrameworkPathfalse + HostFlagsAll + + + + + MWRuntimeSettings_WorkingDirectory + MWRuntimeSettings_CommandLine + MWRuntimeSettings_HostApplication + Path + PathFormatGeneric + PathRootAbsolute + + MWRuntimeSettings_EnvVars + + + LinkerMacOS PPC Linker + PreLinker + PostLinker + TargetnameFreeTypeLib + OutputDirectory + Path:::objs: + PathFormatMacOS + PathRootProject + + SaveEntriesUsingRelativePathsfalse + + + FileMappings + + FileTypeAPPL + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeAppl + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeMMLB + FileExtension + CompilerLib Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeMPLF + FileExtension + CompilerLib Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeMWCD + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeRSRC + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.bh + CompilerBalloon Help + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.c + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.c++ + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.cc + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.cp + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.cpp + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.exp + Compiler + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.h + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMaketrue + + + FileTypeTEXT + FileExtension.p + CompilerMW Pascal PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.pas + CompilerMW Pascal PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.pch + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompiletrue + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.pch++ + CompilerMW C/C++ PPC + EditLanguageC/C++ + Precompiletrue + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.ppu + CompilerMW Pascal PPC + EditLanguage + Precompiletrue + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.r + CompilerRez + EditLanguageRez + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeTEXT + FileExtension.s + CompilerPPCAsm + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypeXCOF + FileExtension + CompilerXCOFF Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypedocu + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypersrc + FileExtension + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileTypeshlb + FileExtension + CompilerPEF Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileTypestub + FileExtension + CompilerPEF Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileExtension.doc + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFilefalse + IgnoredByMaketrue + + + FileExtension.o + CompilerXCOFF Import PPC + EditLanguage + Precompilefalse + Launchablefalse + ResourceFilefalse + IgnoredByMakefalse + + + FileExtension.ppob + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + FileExtension.rsrc + Compiler + EditLanguage + Precompilefalse + Launchabletrue + ResourceFiletrue + IgnoredByMakefalse + + + + + CacheModDatestrue + DumpBrowserInfofalse + CacheSubprojectstrue + UseThirdPartyDebuggerfalse + BrowserGenerator1 + DebuggerAppPath + Path + PathFormatGeneric + PathRootAbsolute + + DebuggerCmdLineArgs + DebuggerWorkingDir + Path + PathFormatGeneric + PathRootAbsolute + + CodeCompletionPrefixFileNameMacHeaders.c + CodeCompletionMacroFileNameMacOS_Carbon_C++_Macros.h + + + ConsoleEncoding0 + LogSystemMessagestrue + AutoTargetDLLsfalse + StopAtWatchpointstrue + PauseWhileRunningfalse + PauseInterval5 + PauseUIFlags0 + AltExePath + Path + PathFormatGeneric + PathRootAbsolute + + StopAtTempBPOnLaunchtrue + CacheSymbolicstrue + TempBPFunctionNamemain + TempBPType0 + + + Enabledfalse + ConnectionName + DownloadPath + LaunchRemoteAppfalse + RemoteAppPath + CoreID0 + JTAGClockSpeed8000 + IsMultiCorefalse + OSDownloadfalse + UseGlobalOSDownloadfalse + OSDownloadConnectionName + OSDownloadPath + AltDownloadfalse + AltDownloadConnectionName + + + OtherExecutables + + + AnalyzerConnectionName + + + CustomColor1 + Red0 + Green32767 + Blue0 + + CustomColor2 + Red0 + Green32767 + Blue0 + + CustomColor3 + Red0 + Green32767 + Blue0 + + CustomColor4 + Red0 + Green32767 + Blue0 + + + + MWFrontEnd_C_cplusplus0 + MWFrontEnd_C_checkprotos1 + MWFrontEnd_C_arm0 + MWFrontEnd_C_trigraphs0 + MWFrontEnd_C_onlystdkeywords0 + MWFrontEnd_C_enumsalwaysint0 + MWFrontEnd_C_ansistrict1 + MWFrontEnd_C_wchar_type1 + MWFrontEnd_C_enableexceptions1 + MWFrontEnd_C_dontreusestrings0 + MWFrontEnd_C_poolstrings0 + MWFrontEnd_C_dontinline0 + MWFrontEnd_C_useRTTI1 + MWFrontEnd_C_unsignedchars0 + MWFrontEnd_C_autoinline0 + MWFrontEnd_C_booltruefalse1 + MWFrontEnd_C_inlinelevel0 + MWFrontEnd_C_ecplusplus0 + MWFrontEnd_C_defer_codegen0 + MWFrontEnd_C_templateparser0 + MWFrontEnd_C_c990 + MWFrontEnd_C_bottomupinline1 + MWFrontEnd_C_gcc_extensions0 + MWFrontEnd_C_instance_manager0 + + + C_CPP_Preprocessor_EmitFiletrue + C_CPP_Preprocessor_EmitLinefalse + C_CPP_Preprocessor_EmitFullPathfalse + C_CPP_Preprocessor_KeepCommentsfalse + C_CPP_Preprocessor_PCHUsesPrefixTextfalse + C_CPP_Preprocessor_EmitPragmastrue + C_CPP_Preprocessor_KeepWhiteSpacefalse + C_CPP_Preprocessor_MultiByteEncodingencASCII_Unicode + C_CPP_Preprocessor_PrefixText/* settings imported from old "C/C++ Language" panel */ + +#if !__option(precompile) +#include "ftoption.h" /* was "Prefix file" */ +#endif + + + + MWWarning_C_warn_illpragma0 + MWWarning_C_warn_emptydecl0 + MWWarning_C_warn_possunwant0 + MWWarning_C_warn_unusedvar1 + MWWarning_C_warn_unusedarg1 + MWWarning_C_warn_extracomma0 + MWWarning_C_pedantic0 + MWWarning_C_warningerrors0 + MWWarning_C_warn_hidevirtual0 + MWWarning_C_warn_implicitconv0 + MWWarning_C_warn_notinlined0 + MWWarning_C_warn_structclass0 + MWWarning_C_warn_missingreturn0 + MWWarning_C_warn_no_side_effect0 + MWWarning_C_warn_resultnotused0 + MWWarning_C_warn_padding0 + MWWarning_C_warn_impl_i2f_conv0 + MWWarning_C_warn_impl_f2i_conv0 + MWWarning_C_warn_impl_s2u_conv0 + MWWarning_C_warn_illtokenpasting0 + MWWarning_C_warn_filenamecaps0 + MWWarning_C_warn_filenamecapssystem0 + MWWarning_C_warn_undefmacro0 + MWWarning_C_warn_ptrintconv0 + + + MWMerge_MacOS_projectTypeApplication + MWMerge_MacOS_outputNameMerge Out + MWMerge_MacOS_outputCreator???? + MWMerge_MacOS_outputTypeAPPL + MWMerge_MacOS_suppressWarning0 + MWMerge_MacOS_copyFragments1 + MWMerge_MacOS_copyResources1 + MWMerge_MacOS_flattenResource0 + MWMerge_MacOS_flatFileNamea.rsrc + MWMerge_MacOS_flatFileOutputPath + Path: + PathFormatMacOS + PathRootProject + + MWMerge_MacOS_skipResources + DLGX + ckid + Proj + WSPC + + + + FileLockedfalse + ResourcesMapIsReadOnlyfalse + PrinterDriverIsMultiFinderCompatiblefalse + Invisiblefalse + HasBundlefalse + NameLockedfalse + Stationeryfalse + HasCustomIconfalse + Sharedfalse + HasBeenInitedfalse + Label0 + Comments + HasCustomBadgefalse + HasRoutingInfofalse + + + MWCodeGen_PPC_structalignmentPPC_mw + MWCodeGen_PPC_tracebacktablesNone + MWCodeGen_PPC_processorGeneric + MWCodeGen_PPC_function_align4 + MWCodeGen_PPC_tocdata1 + MWCodeGen_PPC_largetoc0 + MWCodeGen_PPC_profiler0 + MWCodeGen_PPC_vectortocdata0 + MWCodeGen_PPC_poolconst0 + MWCodeGen_PPC_peephole0 + MWCodeGen_PPC_readonlystrings0 + MWCodeGen_PPC_linkerpoolsstrings0 + MWCodeGen_PPC_volatileasm0 + MWCodeGen_PPC_schedule0 + MWCodeGen_PPC_altivec0 + MWCodeGen_PPC_altivec_move_block0 + MWCodeGen_PPC_strictIEEEfp0 + MWCodeGen_PPC_fpcontract1 + MWCodeGen_PPC_genfsel0 + MWCodeGen_PPC_orderedfpcmp0 + + + MWCodeGen_MachO_structalignmentPPC_mw + MWCodeGen_MachO_profiler_enumOff + MWCodeGen_MachO_processorGeneric + MWCodeGen_MachO_function_align4 + MWCodeGen_MachO_common0 + MWCodeGen_MachO_boolisint0 + MWCodeGen_MachO_peephole1 + MWCodeGen_MachO_readonlystrings0 + MWCodeGen_MachO_linkerpoolsstrings1 + MWCodeGen_MachO_volatileasm0 + MWCodeGen_MachO_schedule0 + MWCodeGen_MachO_altivec0 + MWCodeGen_MachO_vecmove0 + MWCodeGen_MachO_fp_ieee_strict0 + MWCodeGen_MachO_fpcontract1 + MWCodeGen_MachO_genfsel0 + MWCodeGen_MachO_fp_cmps_ordered0 + + + MWDisassembler_PPC_showcode1 + MWDisassembler_PPC_extended1 + MWDisassembler_PPC_mix0 + MWDisassembler_PPC_nohex0 + MWDisassembler_PPC_showdata1 + MWDisassembler_PPC_showexceptions1 + MWDisassembler_PPC_showsym0 + MWDisassembler_PPC_shownames1 + + + GlobalOptimizer_PPC_optimizationlevelLevel0 + GlobalOptimizer_PPC_optforSpeed + + + MWLinker_PPC_linksym1 + MWLinker_PPC_symfullpath1 + MWLinker_PPC_linkmap0 + MWLinker_PPC_nolinkwarnings0 + MWLinker_PPC_dontdeadstripinitcode0 + MWLinker_PPC_permitmultdefs0 + MWLinker_PPC_linkmodeFast + MWLinker_PPC_code_foldingNone + MWLinker_PPC_initname + MWLinker_PPC_mainname + MWLinker_PPC_termname + + + MWLinker_MacOSX_linksym1 + MWLinker_MacOSX_symfullpath0 + MWLinker_MacOSX_nolinkwarnings0 + MWLinker_MacOSX_linkmap0 + MWLinker_MacOSX_dontdeadstripinitcode0 + MWLinker_MacOSX_permitmultdefs0 + MWLinker_MacOSX_use_objectivec_semantics0 + MWLinker_MacOSX_strip_debug_symbols0 + MWLinker_MacOSX_split_segs0 + MWLinker_MacOSX_report_msl_overloads0 + MWLinker_MacOSX_objects_follow_linkorder0 + MWLinker_MacOSX_linkmodeNormal + MWLinker_MacOSX_exportsReferencedGlobals + MWLinker_MacOSX_sortcodeNone + MWLinker_MacOSX_mainname + MWLinker_MacOSX_initname + MWLinker_MacOSX_code_foldingNone + MWLinker_MacOSX_stabsgenNone + + + MWProject_MacOSX_typeExecutable + MWProject_MacOSX_outfile + MWProject_MacOSX_filecreator???? + MWProject_MacOSX_filetypeMEXE + MWProject_MacOSX_vmaddress4096 + MWProject_MacOSX_usedefaultvmaddr1 + MWProject_MacOSX_flatrsrc0 + MWProject_MacOSX_flatrsrcfilename + MWProject_MacOSX_flatrsrcoutputdir + Path: + PathFormatMacOS + PathRootProject + + MWProject_MacOSX_installpath./ + MWProject_MacOSX_dont_prebind0 + MWProject_MacOSX_flat_namespace0 + MWProject_MacOSX_frameworkversionA + MWProject_MacOSX_currentversion0 + MWProject_MacOSX_flat_oldimpversion0 + MWProject_MacOSX_AddrMode1 + + + MWPEF_exportsNone + MWPEF_libfolder0 + MWPEF_sortcodeNone + MWPEF_expandbss0 + MWPEF_sharedata0 + MWPEF_olddefversion0 + MWPEF_oldimpversion0 + MWPEF_currentversion0 + MWPEF_fragmentname + MWPEF_collapsereloads0 + + + MWProject_PPC_typeLibrary + MWProject_PPC_outfileFreeTypeLib + MWProject_PPC_filecreator???? + MWProject_PPC_filetype???? + MWProject_PPC_size0 + MWProject_PPC_minsize0 + MWProject_PPC_stacksize0 + MWProject_PPC_flags0 + MWProject_PPC_symfilename + MWProject_PPC_rsrcname + MWProject_PPC_rsrcheaderNative + MWProject_PPC_rsrctype???? + MWProject_PPC_rsrcid0 + MWProject_PPC_rsrcflags0 + MWProject_PPC_rsrcstore0 + MWProject_PPC_rsrcmerge0 + MWProject_PPC_flatrsrc0 + MWProject_PPC_flatrsrcoutputdir + Path: + PathFormatMacOS + PathRootProject + + MWProject_PPC_flatrsrcfilename + + + MWAssembler_PPC_auxheader0 + MWAssembler_PPC_symmodeMac + MWAssembler_PPC_dialectPPC + MWAssembler_PPC_prefixfile + MWAssembler_PPC_typecheck0 + MWAssembler_PPC_warnings0 + MWAssembler_PPC_casesensitive0 + + + PList_OutputTypeFile + PList_OutputEncodingUTF-8 + PList_PListVersion1.0 + PList_Prefix + PList_FileFilenameInfo.plist + PList_FileDirectory + Path: + PathFormatMacOS + PathRootProject + + PList_ResourceTypeplst + PList_ResourceID0 + PList_ResourceName + + + MWRez_Language_maxwidth80 + MWRez_Language_scriptRoman + MWRez_Language_alignmentAlign1 + MWRez_Language_filtermodeFilterSkip + MWRez_Language_suppresswarnings0 + MWRez_Language_escapecontrolchars1 + MWRez_Language_prefixname + MWRez_Language_filteredtypes'CODE' 'DATA' 'PICT' + + + + Name + ftsystem.c + MacOS + Text + Debug + + + Name + ftbase.c + MacOS + Text + Debug + + + Name + ftinit.c + MacOS + Text + Debug + + + Name + sfnt.c + MacOS + Text + Debug + + + Name + psnames.c + MacOS + Text + Debug + + + Name + ftdebug.c + MacOS + Text + Debug + + + Name + type1cid.c + MacOS + Text + Debug + + + Name + cff.c + MacOS + Text + Debug + + + Name + smooth.c + MacOS + Text + Debug + + + Name + winfnt.c + MacOS + Text + Debug + + + Name + truetype.c + MacOS + Text + Debug + + + Name + ftmac.c + MacOS + Text + Debug + + + Name + psaux.c + MacOS + Text + + + + Name + ftcache.c + MacOS + Text + + + + Name + ftglyph.c + MacOS + Text + + + + Name + type1.c + MacOS + Text + Debug + + + Name + pshinter.c + MacOS + Text + Debug + + + Name + pcf.c + MacOS + Text + Debug + + + Name + ftraster.c + MacOS + Text + Debug + + + Name + ftrend1.c + MacOS + Text + Debug + + + + + Name + ftsystem.c + MacOS + + + Name + ftbase.c + MacOS + + + Name + ftinit.c + MacOS + + + Name + sfnt.c + MacOS + + + Name + psnames.c + MacOS + + + Name + ftdebug.c + MacOS + + + Name + type1cid.c + MacOS + + + Name + cff.c + MacOS + + + Name + smooth.c + MacOS + + + Name + winfnt.c + MacOS + + + Name + truetype.c + MacOS + + + Name + ftmac.c + MacOS + + + Name + psaux.c + MacOS + + + Name + ftcache.c + MacOS + + + Name + ftglyph.c + MacOS + + + Name + type1.c + MacOS + + + Name + pshinter.c + MacOS + + + Name + pcf.c + MacOS + + + Name + ftraster.c + MacOS + + + Name + ftrend1.c + MacOS + + + + + + + FreeTypeLib + + + + base + + FreeTypeLib + Name + ftbase.c + MacOS + + + FreeTypeLib + Name + ftdebug.c + MacOS + + + FreeTypeLib + Name + ftglyph.c + MacOS + + + FreeTypeLib + Name + ftinit.c + MacOS + + + FreeTypeLib + Name + ftsystem.c + MacOS + + + FreeTypeLib + Name + ftmac.c + MacOS + + + ftmodules + + FreeTypeLib + Name + cff.c + MacOS + + + FreeTypeLib + Name + ftcache.c + MacOS + + + FreeTypeLib + Name + psaux.c + MacOS + + + FreeTypeLib + Name + psnames.c + MacOS + + + FreeTypeLib + Name + sfnt.c + MacOS + + + FreeTypeLib + Name + smooth.c + MacOS + + + FreeTypeLib + Name + truetype.c + MacOS + + + FreeTypeLib + Name + type1cid.c + MacOS + + + FreeTypeLib + Name + winfnt.c + MacOS + + + FreeTypeLib + Name + type1.c + MacOS + + + FreeTypeLib + Name + pshinter.c + MacOS + + + FreeTypeLib + Name + pcf.c + MacOS + + + FreeTypeLib + Name + ftraster.c + MacOS + + + FreeTypeLib + Name + ftrend1.c + MacOS + + + + + diff --git a/alienblaster/project/jni/freetype/builds/mac/ftmac.c b/alienblaster/project/jni/freetype/builds/mac/ftmac.c new file mode 100644 index 000000000..c974f670f --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/mac/ftmac.c @@ -0,0 +1,1531 @@ +/***************************************************************************/ +/* */ +/* ftmac.c */ +/* */ +/* Mac FOND support. Written by just@letterror.com. */ +/* Heavily Fixed by mpsuzuki, George Williams and Sean McBride */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + Notes + + Mac suitcase files can (and often do!) contain multiple fonts. To + support this I use the face_index argument of FT_(Open|New)_Face() + functions, and pretend the suitcase file is a collection. + + Warning: fbit and NFNT bitmap resources are not supported yet. In old + sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' + resources instead of the `bdat' table in the sfnt resource. Therefore, + face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' + resource is unavailable at present. + + The Mac FOND support works roughly like this: + + - Check whether the offered stream points to a Mac suitcase file. This + is done by checking the file type: it has to be 'FFIL' or 'tfil'. The + stream that gets passed to our init_face() routine is a stdio stream, + which isn't usable for us, since the FOND resources live in the + resource fork. So we just grab the stream->pathname field. + + - Read the FOND resource into memory, then check whether there is a + TrueType font and/or(!) a Type 1 font available. + + - If there is a Type 1 font available (as a separate `LWFN' file), read + its data into memory, massage it slightly so it becomes PFB data, wrap + it into a memory stream, load the Type 1 driver and delegate the rest + of the work to it by calling FT_Open_Face(). (XXX TODO: after this + has been done, the kerning data from the FOND resource should be + appended to the face: On the Mac there are usually no AFM files + available. However, this is tricky since we need to map Mac char + codes to ps glyph names to glyph ID's...) + + - If there is a TrueType font (an `sfnt' resource), read it into memory, + wrap it into a memory stream, load the TrueType driver and delegate + the rest of the work to it, by calling FT_Open_Face(). + + - Some suitcase fonts (notably Onyx) might point the `LWFN' file to + itself, even though it doesn't contains `POST' resources. To handle + this special case without opening the file an extra time, we just + ignore errors from the `LWFN' and fallback to the `sfnt' if both are + available. + */ + + +#include +#include FT_FREETYPE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_STREAM_H +#include "ftbase.h" + +#if defined( __GNUC__ ) || defined( __IBMC__ ) + /* This is for Mac OS X. Without redefinition, OS_INLINE */ + /* expands to `static inline' which doesn't survive the */ + /* -ansi compilation flag of GCC. */ +#if !HAVE_ANSI_OS_INLINE +#undef OS_INLINE +#define OS_INLINE static __inline__ +#endif +#include +#include +#include /* PATH_MAX */ +#else +#include +#include +#include +#include +#include +#include +#endif + +#ifndef PATH_MAX +#define PATH_MAX 1024 /* same with Mac OS X's syslimits.h */ +#endif + +#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO +#include +#endif + +#define FT_DEPRECATED_ATTRIBUTE + +#include FT_MAC_H + + /* undefine blocking-macros in ftmac.h */ +#undef FT_GetFile_From_Mac_Name +#undef FT_GetFile_From_Mac_ATS_Name +#undef FT_New_Face_From_FOND +#undef FT_New_Face_From_FSSpec +#undef FT_New_Face_From_FSRef + + + /* FSSpec functions are deprecated since Mac OS X 10.4 */ +#ifndef HAVE_FSSPEC +#if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON +#define HAVE_FSSPEC 1 +#else +#define HAVE_FSSPEC 0 +#endif +#endif + + /* most FSRef functions were introduced since Mac OS 9 */ +#ifndef HAVE_FSREF +#if TARGET_API_MAC_OSX +#define HAVE_FSREF 1 +#else +#define HAVE_FSREF 0 +#endif +#endif + + /* QuickDraw is deprecated since Mac OS X 10.4 */ +#ifndef HAVE_QUICKDRAW_CARBON +#if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON +#define HAVE_QUICKDRAW_CARBON 1 +#else +#define HAVE_QUICKDRAW_CARBON 0 +#endif +#endif + + /* AppleTypeService is available since Mac OS X */ +#ifndef HAVE_ATS +#if TARGET_API_MAC_OSX +#define HAVE_ATS 1 +#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */ +#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault +#endif +#else +#define HAVE_ATS 0 +#endif +#endif + + /* `configure' checks the availability of `ResourceIndex' strictly */ + /* and sets HAVE_TYPE_RESOURCE_INDEX to 1 or 0 always. If it is */ + /* not set (e.g., a build without `configure'), the availability */ + /* is guessed from the SDK version. */ +#ifndef HAVE_TYPE_RESOURCE_INDEX +#if !defined( MAC_OS_X_VERSION_10_5 ) || \ + ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 ) +#define HAVE_TYPE_RESOURCE_INDEX 0 +#else +#define HAVE_TYPE_RESOURCE_INDEX 1 +#endif +#endif /* !HAVE_TYPE_RESOURCE_INDEX */ + +#if ( HAVE_TYPE_RESOURCE_INDEX == 0 ) +typedef short ResourceIndex; +#endif + + /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over + TrueType in case *both* are available (this is not common, + but it *is* possible). */ +#ifndef PREFER_LWFN +#define PREFER_LWFN 1 +#endif + + +#if !HAVE_QUICKDRAW_CARBON /* QuickDraw is deprecated since Mac OS X 10.4 */ + + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; + } + +#else + + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + OptionBits options = kFMUseGlobalScopeOption; + + FMFontFamilyIterator famIter; + OSStatus status = FMCreateFontFamilyIterator( NULL, NULL, + options, + &famIter ); + FMFont the_font = 0; + FMFontFamily family = 0; + + + *face_index = 0; + while ( status == 0 && !the_font ) + { + status = FMGetNextFontFamily( &famIter, &family ); + if ( status == 0 ) + { + int stat2; + FMFontFamilyInstanceIterator instIter; + Str255 famNameStr; + char famName[256]; + + + /* get the family name */ + FMGetFontFamilyName( family, famNameStr ); + CopyPascalStringToC( famNameStr, famName ); + + /* iterate through the styles */ + FMCreateFontFamilyInstanceIterator( family, &instIter ); + + *face_index = 0; + stat2 = 0; + + while ( stat2 == 0 && !the_font ) + { + FMFontStyle style; + FMFontSize size; + FMFont font; + + + stat2 = FMGetNextFontFamilyInstance( &instIter, &font, + &style, &size ); + if ( stat2 == 0 && size == 0 ) + { + char fullName[256]; + + + /* build up a complete face name */ + ft_strcpy( fullName, famName ); + if ( style & bold ) + ft_strcat( fullName, " Bold" ); + if ( style & italic ) + ft_strcat( fullName, " Italic" ); + + /* compare with the name we are looking for */ + if ( ft_strcmp( fullName, fontName ) == 0 ) + { + /* found it! */ + the_font = font; + } + else + ++(*face_index); + } + } + + FMDisposeFontFamilyInstanceIterator( &instIter ); + } + } + + FMDisposeFontFamilyIterator( &famIter ); + + if ( the_font ) + { + FMGetFontContainer( the_font, pathSpec ); + return FT_Err_Ok; + } + else + return FT_Err_Unknown_File_Format; + } + +#endif /* HAVE_QUICKDRAW_CARBON */ + + +#if HAVE_ATS + + /* Private function. */ + /* The FSSpec type has been discouraged for a long time, */ + /* unfortunately an FSRef replacement API for */ + /* ATSFontGetFileSpecification() is only available in */ + /* Mac OS X 10.5 and later. */ + static OSStatus + FT_ATSFontGetFileReference( ATSFontRef ats_font_id, + FSRef* ats_font_ref ) + { + OSStatus err; + +#if !defined( MAC_OS_X_VERSION_10_5 ) || \ + MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + FSSpec spec; + + + err = ATSFontGetFileSpecification( ats_font_id, &spec ); + if ( noErr == err ) + err = FSpMakeFSRef( &spec, ats_font_ref ); +#else + err = ATSFontGetFileReference( ats_font_id, ats_font_ref ); +#endif + + return err; + } + + + static FT_Error + FT_GetFileRef_From_Mac_ATS_Name( const char* fontName, + FSRef* ats_font_ref, + FT_Long* face_index ) + { + CFStringRef cf_fontName; + ATSFontRef ats_font_id; + + + *face_index = 0; + + cf_fontName = CFStringCreateWithCString( NULL, fontName, + kCFStringEncodingMacRoman ); + ats_font_id = ATSFontFindFromName( cf_fontName, + kATSOptionFlagsUnRestrictedScope ); + CFRelease( cf_fontName ); + + if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) + return FT_Err_Unknown_File_Format; + + if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) ) + return FT_Err_Unknown_File_Format; + + /* face_index calculation by searching preceding fontIDs */ + /* with same FSRef */ + { + ATSFontRef id2 = ats_font_id - 1; + FSRef ref2; + + + while ( id2 > 0 ) + { + if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) ) + break; + if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) ) + break; + + id2--; + } + *face_index = ats_font_id - ( id2 + 1 ); + } + + return FT_Err_Ok; + } + +#endif + +#if !HAVE_ATS + + FT_EXPORT_DEF( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( path ); + FT_UNUSED( maxPathSize ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; + } + +#else + + FT_EXPORT_DEF( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + { + FSRef ref; + FT_Error err; + + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( FT_Err_Ok != err ) + return err; + + if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) ) + return FT_Err_Unknown_File_Format; + + return FT_Err_Ok; + } + +#endif /* HAVE_ATS */ + + +#if !HAVE_FSSPEC || !HAVE_ATS + + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_Err_Unimplemented_Feature; + } + +#else + + /* This function is deprecated because FSSpec is deprecated in Mac OS X. */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FSRef ref; + FT_Error err; + + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( FT_Err_Ok != err ) + return err; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, + pathSpec, NULL ) ) + return FT_Err_Unknown_File_Format; + + return FT_Err_Ok; + } + +#endif + + +#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO + +#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) + + + FT_CALLBACK_DEF( void ) + ft_FSp_stream_close( FT_Stream stream ) + { + ft_fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + FT_CALLBACK_DEF( unsigned long ) + ft_FSp_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_FILE* file; + + + file = STREAM_FILE( stream ); + + ft_fseek( file, offset, SEEK_SET ); + + return (unsigned long)ft_fread( buffer, 1, count, file ); + } + +#endif /* __MWERKS__ && !TARGET_RT_MAC_MACHO */ + + +#if HAVE_FSSPEC && !HAVE_FSREF + + /* isDirectory is a dummy to synchronize API with FSPathMakeRef() */ + static OSErr + FT_FSPathMakeSpec( const UInt8* pathname, + FSSpec* spec_p, + Boolean isDirectory ) + { + const char *p, *q; + short vRefNum; + long dirID; + Str255 nodeName; + OSErr err; + FT_UNUSED( isDirectory ); + + + p = q = (const char *)pathname; + dirID = 0; + vRefNum = 0; + + while ( 1 ) + { + int len = ft_strlen( p ); + + + if ( len > 255 ) + len = 255; + + q = p + len; + + if ( q == p ) + return 0; + + if ( 255 < ft_strlen( (char *)pathname ) ) + { + while ( p < q && *q != ':' ) + q--; + } + + if ( p < q ) + *(char *)nodeName = q - p; + else if ( ft_strlen( p ) < 256 ) + *(char *)nodeName = ft_strlen( p ); + else + return errFSNameTooLong; + + ft_strncpy( (char *)nodeName + 1, (char *)p, *(char *)nodeName ); + err = FSMakeFSSpec( vRefNum, dirID, nodeName, spec_p ); + if ( err || '\0' == *q ) + return err; + + vRefNum = spec_p->vRefNum; + dirID = spec_p->parID; + + p = q; + } + } + + + static OSErr + FT_FSpMakePath( const FSSpec* spec_p, + UInt8* path, + UInt32 maxPathSize ) + { + OSErr err; + FSSpec spec = *spec_p; + short vRefNum; + long dirID; + Str255 parDir_name; + + + FT_MEM_SET( path, 0, maxPathSize ); + while ( 1 ) + { + int child_namelen = ft_strlen( (char *)path ); + unsigned char node_namelen = spec.name[0]; + unsigned char* node_name = spec.name + 1; + + + if ( node_namelen + child_namelen > maxPathSize ) + return errFSNameTooLong; + + FT_MEM_MOVE( path + node_namelen + 1, path, child_namelen ); + FT_MEM_COPY( path, node_name, node_namelen ); + if ( child_namelen > 0 ) + path[node_namelen] = ':'; + + vRefNum = spec.vRefNum; + dirID = spec.parID; + parDir_name[0] = '\0'; + err = FSMakeFSSpec( vRefNum, dirID, parDir_name, &spec ); + if ( noErr != err || dirID == spec.parID ) + break; + } + return noErr; + } + +#endif /* HAVE_FSSPEC && !HAVE_FSREF */ + + + static OSErr + FT_FSPathMakeRes( const UInt8* pathname, + ResFileRefNum* res ) + { + +#if HAVE_FSREF + + OSErr err; + FSRef ref; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + /* at present, no support for dfont format */ + err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); + if ( noErr == err ) + return err; + + /* fallback to original resource-fork font */ + *res = FSOpenResFile( &ref, fsRdPerm ); + err = ResError(); + +#else + + OSErr err; + FSSpec spec; + + + if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + /* at present, no support for dfont format without FSRef */ + /* (see above), try original resource-fork font */ + *res = FSpOpenResFile( &spec, fsRdPerm ); + err = ResError(); + +#endif /* HAVE_FSREF */ + + return err; + } + + + /* Return the file type for given pathname */ + static OSType + get_file_type_from_path( const UInt8* pathname ) + { + +#if HAVE_FSREF + + FSRef ref; + FSCatalogInfo info; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return ( OSType ) 0; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info, + NULL, NULL, NULL ) ) + return ( OSType ) 0; + + return ((FInfo *)(info.finderInfo))->fdType; + +#else + + FSSpec spec; + FInfo finfo; + + + if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) ) + return ( OSType ) 0; + + if ( noErr != FSpGetFInfo( &spec, &finfo ) ) + return ( OSType ) 0; + + return finfo.fdType; + +#endif /* HAVE_FSREF */ + + } + + + /* Given a PostScript font name, create the Macintosh LWFN file name. */ + static void + create_lwfn_name( char* ps_name, + Str255 lwfn_file_name ) + { + int max = 5, count = 0; + FT_Byte* p = lwfn_file_name; + FT_Byte* q = (FT_Byte*)ps_name; + + + lwfn_file_name[0] = 0; + + while ( *q ) + { + if ( ft_isupper( *q ) ) + { + if ( count ) + max = 3; + count = 0; + } + if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) ) + { + *++p = *q; + lwfn_file_name[0]++; + count++; + } + q++; + } + } + + + static short + count_faces_sfnt( char* fond_data ) + { + /* The count is 1 greater than the value in the FOND. */ + /* Isn't that cute? :-) */ + + return EndianS16_BtoN( *( (short*)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + } + + + static short + count_faces_scalable( char* fond_data ) + { + AsscEntry* assoc; + FamRec* fond; + short i, face, face_all; + + + fond = (FamRec*)fond_data; + face_all = EndianS16_BtoN( *( (short *)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + face = 0; + + for ( i = 0; i < face_all; i++ ) + { + if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) ) + face++; + } + return face; + } + + + /* Look inside the FOND data, answer whether there should be an SFNT + resource, and answer the name of a possible LWFN Type 1 file. + + Thanks to Paul Miller (paulm@profoundeffects.com) for the fix + to load a face OTHER than the first one in the FOND! + */ + + static void + parse_fond( char* fond_data, + short* have_sfnt, + ResID* sfnt_id, + Str255 lwfn_file_name, + short face_index ) + { + AsscEntry* assoc; + AsscEntry* base_assoc; + FamRec* fond; + + + *sfnt_id = 0; + *have_sfnt = 0; + lwfn_file_name[0] = 0; + + fond = (FamRec*)fond_data; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + base_assoc = assoc; + + /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */ + if ( 47 < face_index ) + return; + + /* Let's do a little range checking before we get too excited here */ + if ( face_index < count_faces_sfnt( fond_data ) ) + { + assoc += face_index; /* add on the face_index! */ + + /* if the face at this index is not scalable, + fall back to the first one (old behavior) */ + if ( EndianS16_BtoN( assoc->fontSize ) == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( assoc->fontID ); + } + else if ( base_assoc->fontSize == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( base_assoc->fontID ); + } + } + + if ( EndianS32_BtoN( fond->ffStylOff ) ) + { + unsigned char* p = (unsigned char*)fond_data; + StyleTable* style; + unsigned short string_count; + char ps_name[256]; + unsigned char* names[64]; + int i; + + + p += EndianS32_BtoN( fond->ffStylOff ); + style = (StyleTable*)p; + p += sizeof ( StyleTable ); + string_count = EndianS16_BtoN( *(short*)(p) ); + p += sizeof ( short ); + + for ( i = 0; i < string_count && i < 64; i++ ) + { + names[i] = p; + p += names[i][0]; + p++; + } + + { + size_t ps_name_len = (size_t)names[0][0]; + + + if ( ps_name_len != 0 ) + { + ft_memcpy(ps_name, names[0] + 1, ps_name_len); + ps_name[ps_name_len] = 0; + } + if ( style->indexes[face_index] > 1 && + style->indexes[face_index] <= FT_MIN( string_count, 64 ) ) + { + unsigned char* suffixes = names[style->indexes[face_index] - 1]; + + + for ( i = 1; i <= suffixes[0]; i++ ) + { + unsigned char* s; + size_t j = suffixes[i] - 1; + + + if ( j < string_count && ( s = names[j] ) != NULL ) + { + size_t s_len = (size_t)s[0]; + + + if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) ) + { + ft_memcpy( ps_name + ps_name_len, s + 1, s_len ); + ps_name_len += s_len; + ps_name[ps_name_len] = 0; + } + } + } + } + } + + create_lwfn_name( ps_name, lwfn_file_name ); + } + } + + + static FT_Error + lookup_lwfn_by_fond( const UInt8* path_fond, + ConstStr255Param base_lwfn, + UInt8* path_lwfn, + int path_size ) + { + +#if HAVE_FSREF + + FSRef ref, par_ref; + int dirname_len; + + + /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */ + /* We should not extract parent directory by string manipulation. */ + + if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) ) + return FT_Err_Invalid_Argument; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, &par_ref ) ) + return FT_Err_Invalid_Argument; + + if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) ) + return FT_Err_Invalid_Argument; + + if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size ) + return FT_Err_Invalid_Argument; + + /* now we have absolute dirname in path_lwfn */ + if ( path_lwfn[0] == '/' ) + ft_strcat( (char *)path_lwfn, "/" ); + else + ft_strcat( (char *)path_lwfn, ":" ); + + dirname_len = ft_strlen( (char *)path_lwfn ); + ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); + path_lwfn[dirname_len + base_lwfn[0]] = '\0'; + + if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, NULL ) ) + return FT_Err_Cannot_Open_Resource; + + return FT_Err_Ok; + +#else + + int i; + FSSpec spec; + + + /* pathname for FSSpec is always HFS format */ + if ( ft_strlen( (char *)path_fond ) > path_size ) + return FT_Err_Invalid_Argument; + + ft_strcpy( (char *)path_lwfn, (char *)path_fond ); + + i = ft_strlen( (char *)path_lwfn ) - 1; + while ( i > 0 && ':' != path_lwfn[i] ) + i--; + + if ( i + 1 + base_lwfn[0] > path_size ) + return FT_Err_Invalid_Argument; + + if ( ':' == path_lwfn[i] ) + { + ft_strcpy( (char *)path_lwfn + i + 1, (char *)base_lwfn + 1 ); + path_lwfn[i + 1 + base_lwfn[0]] = '\0'; + } + else + { + ft_strcpy( (char *)path_lwfn, (char *)base_lwfn + 1 ); + path_lwfn[base_lwfn[0]] = '\0'; + } + + if ( noErr != FT_FSPathMakeSpec( path_lwfn, &spec, FALSE ) ) + return FT_Err_Cannot_Open_Resource; + + return FT_Err_Ok; + +#endif /* HAVE_FSREF */ + + } + + + static short + count_faces( Handle fond, + const UInt8* pathname ) + { + ResID sfnt_id; + short have_sfnt, have_lwfn; + Str255 lwfn_file_name; + UInt8 buff[PATH_MAX]; + FT_Error err; + short num_faces; + + + have_sfnt = have_lwfn = 0; + + HLock( fond ); + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); + + if ( lwfn_file_name[0] ) + { + err = lookup_lwfn_by_fond( pathname, lwfn_file_name, + buff, sizeof ( buff ) ); + if ( FT_Err_Ok == err ) + have_lwfn = 1; + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + num_faces = 1; + else + num_faces = count_faces_scalable( *fond ); + + HUnlock( fond ); + return num_faces; + } + + + /* Read Type 1 data from the POST resources inside the LWFN file, + return a PFB buffer. This is somewhat convoluted because the FT2 + PFB parser wants the ASCII header as one chunk, and the LWFN + chunks are often not organized that way, so we glue chunks + of the same type together. */ + static FT_Error + read_lwfn( FT_Memory memory, + ResFileRefNum res, + FT_Byte** pfb_data, + FT_ULong* size ) + { + FT_Error error = FT_Err_Ok; + ResID res_id; + unsigned char *buffer, *p, *size_p = NULL; + FT_ULong total_size = 0; + FT_ULong old_total_size = 0; + FT_ULong post_size, pfb_chunk_size; + Handle post_data; + char code, last_code; + + + UseResFile( res ); + + /* First pass: load all POST resources, and determine the size of */ + /* the output buffer. */ + res_id = 501; + last_code = -1; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( post_data == NULL ) + break; /* we are done */ + + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( code == 5 ) + total_size += 2; /* just the end code */ + else + total_size += 6; /* code + 4 bytes chunk length */ + } + + total_size += GetHandleSize( post_data ) - 2; + last_code = code; + + /* detect integer overflows */ + if ( total_size < old_total_size ) + { + error = FT_Err_Array_Too_Large; + goto Error; + } + + old_total_size = total_size; + } + + if ( FT_ALLOC( buffer, (FT_Long)total_size ) ) + goto Error; + + /* Second pass: append all POST data to the buffer, add PFB fields. */ + /* Glue all consecutive chunks of the same type together. */ + p = buffer; + res_id = 501; + last_code = -1; + pfb_chunk_size = 0; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( post_data == NULL ) + break; /* we are done */ + + post_size = (FT_ULong)GetHandleSize( post_data ) - 2; + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( last_code != -1 ) + { + /* we are done adding a chunk, fill in the size field */ + if ( size_p != NULL ) + { + *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF ); + } + pfb_chunk_size = 0; + } + + *p++ = 0x80; + if ( code == 5 ) + *p++ = 0x03; /* the end */ + else if ( code == 2 ) + *p++ = 0x02; /* binary segment */ + else + *p++ = 0x01; /* ASCII segment */ + + if ( code != 5 ) + { + size_p = p; /* save for later */ + p += 4; /* make space for size field */ + } + } + + ft_memcpy( p, *post_data + 2, post_size ); + pfb_chunk_size += post_size; + p += post_size; + last_code = code; + } + + *pfb_data = buffer; + *size = total_size; + + Error: + CloseResFile( res ); + return error; + } + + + /* Create a new FT_Face from a file spec to an LWFN file. */ + static FT_Error + FT_New_Face_From_LWFN( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Byte* pfb_data; + FT_ULong pfb_size; + FT_Error error; + ResFileRefNum res; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res ) ) + return FT_Err_Cannot_Open_Resource; + + pfb_data = NULL; + pfb_size = 0; + error = read_lwfn( library->memory, res, &pfb_data, &pfb_size ); + CloseResFile( res ); /* PFB is already loaded, useless anymore */ + if ( error ) + return error; + + return open_face_from_buffer( library, + pfb_data, + pfb_size, + face_index, + "type1", + aface ); + } + + + /* Create a new FT_Face from an SFNT resource, specified by res ID. */ + static FT_Error + FT_New_Face_From_SFNT( FT_Library library, + ResID sfnt_id, + FT_Long face_index, + FT_Face* aface ) + { + Handle sfnt = NULL; + FT_Byte* sfnt_data; + size_t sfnt_size; + FT_Error error = FT_Err_Ok; + FT_Memory memory = library->memory; + int is_cff, is_sfnt_ps; + + + sfnt = GetResource( TTAG_sfnt, sfnt_id ); + if ( sfnt == NULL ) + return FT_Err_Invalid_Handle; + + sfnt_size = (FT_ULong)GetHandleSize( sfnt ); + if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) ) + { + ReleaseResource( sfnt ); + return error; + } + + HLock( sfnt ); + ft_memcpy( sfnt_data, *sfnt, sfnt_size ); + HUnlock( sfnt ); + ReleaseResource( sfnt ); + + is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 ); + + if ( is_sfnt_ps ) + { + FT_Stream stream; + + + if ( FT_NEW( stream ) ) + goto Try_OpenType; + + FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size ); + if ( !open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ) ) + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + FT_FREE( sfnt_data ); + goto Exit; + } + + FT_FREE( stream ); + } + Try_OpenType: + error = open_face_from_buffer( library, + sfnt_data, + sfnt_size, + face_index, + is_cff ? "cff" : "truetype", + aface ); + Exit: + return error; + } + + + /* Create a new FT_Face from a file spec to a suitcase file. */ + static FT_Error + FT_New_Face_From_Suitcase( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error = FT_Err_Cannot_Open_Resource; + ResFileRefNum res_ref; + ResourceIndex res_index; + Handle fond; + short num_faces_in_res, num_faces_in_fond; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) ) + return FT_Err_Cannot_Open_Resource; + + UseResFile( res_ref ); + if ( ResError() ) + return FT_Err_Cannot_Open_Resource; + + num_faces_in_res = 0; + for ( res_index = 1; ; ++res_index ) + { + fond = Get1IndResource( TTAG_FOND, res_index ); + if ( ResError() ) + break; + + num_faces_in_fond = count_faces( fond, pathname ); + num_faces_in_res += num_faces_in_fond; + + if ( 0 <= face_index && face_index < num_faces_in_fond && error ) + error = FT_New_Face_From_FOND( library, fond, face_index, aface ); + + face_index -= num_faces_in_fond; + } + + CloseResFile( res_ref ); + if ( FT_Err_Ok == error && NULL != aface ) + (*aface)->num_faces = num_faces_in_res; + return error; + } + + + /* documentation is in ftmac.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face* aface ) + { + short have_sfnt, have_lwfn = 0; + ResID sfnt_id, fond_id; + OSType fond_type; + Str255 fond_name; + Str255 lwfn_file_name; + UInt8 path_lwfn[PATH_MAX]; + OSErr err; + FT_Error error = FT_Err_Ok; + + + GetResInfo( fond, &fond_id, &fond_type, fond_name ); + if ( ResError() != noErr || fond_type != TTAG_FOND ) + return FT_Err_Invalid_File_Format; + + HLock( fond ); + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index ); + HUnlock( fond ); + + if ( lwfn_file_name[0] ) + { + ResFileRefNum res; + + + res = HomeResFile( fond ); + if ( noErr != ResError() ) + goto found_no_lwfn_file; + +#if HAVE_FSREF + + { + UInt8 path_fond[PATH_MAX]; + FSRef ref; + + + err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, + NULL, NULL, NULL, &ref, NULL ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); + if ( noErr != err ) + goto found_no_lwfn_file; + + error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, + path_lwfn, sizeof ( path_lwfn ) ); + if ( FT_Err_Ok == error ) + have_lwfn = 1; + } + +#elif HAVE_FSSPEC + + { + UInt8 path_fond[PATH_MAX]; + FCBPBRec pb; + Str255 fond_file_name; + FSSpec spec; + + + FT_MEM_SET( &spec, 0, sizeof ( FSSpec ) ); + FT_MEM_SET( &pb, 0, sizeof ( FCBPBRec ) ); + + pb.ioNamePtr = fond_file_name; + pb.ioVRefNum = 0; + pb.ioRefNum = res; + pb.ioFCBIndx = 0; + + err = PBGetFCBInfoSync( &pb ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FSMakeFSSpec( pb.ioFCBVRefNum, pb.ioFCBParID, + fond_file_name, &spec ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FT_FSpMakePath( &spec, path_fond, sizeof ( path_fond ) ); + if ( noErr != err ) + goto found_no_lwfn_file; + + error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, + path_lwfn, sizeof ( path_lwfn ) ); + if ( FT_Err_Ok == error ) + have_lwfn = 1; + } + +#endif /* HAVE_FSREF, HAVE_FSSPEC */ + + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + error = FT_New_Face_From_LWFN( library, + path_lwfn, + face_index, + aface ); + else + error = FT_Err_Unknown_File_Format; + + found_no_lwfn_file: + if ( have_sfnt && FT_Err_Ok != error ) + error = FT_New_Face_From_SFNT( library, + sfnt_id, + face_index, + aface ); + + return error; + } + + + /* Common function to load a new FT_Face from a resource file. */ + static FT_Error + FT_New_Face_From_Resource( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + OSType file_type; + FT_Error error; + + + /* LWFN is a (very) specific file format, check for it explicitly */ + file_type = get_file_type_from_path( pathname ); + if ( file_type == TTAG_LWFN ) + return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); + + /* Otherwise the file type doesn't matter (there are more than */ + /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ + /* if it works, fine. */ + + error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); + if ( error == 0 ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.); */ + /* we signal this by returning no error and no FT_Face */ + *aface = NULL; + return 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face */ + /* */ + /* */ + /* This is the Mac-specific implementation of FT_New_Face. In */ + /* addition to the standard FT_New_Face() functionality, it also */ + /* accepts pathnames to Mac suitcase files. For further */ + /* documentation see the original FT_New_Face() in freetype.h. */ + /* */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Open_Args args; + FT_Error error; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + error = FT_Err_Ok; + *aface = NULL; + + /* try resourcefork based font: LWFN, FFIL */ + error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, + face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.) */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face_From_FSRef */ + /* */ + /* */ + /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */ + /* accepts an FSRef instead of a path. */ + /* */ + /* This function is deprecated because Carbon data types (FSRef) */ + /* are not cross-platform, and thus not suitable for the freetype API. */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef* ref, + FT_Long face_index, + FT_Face* aface ) + { + +#if !HAVE_FSREF + + FT_UNUSED( library ); + FT_UNUSED( ref ); + FT_UNUSED( face_index ); + FT_UNUSED( aface ); + + return FT_Err_Unimplemented_Feature; + +#else + + FT_Error error; + FT_Open_Args args; + OSErr err; + UInt8 pathname[PATH_MAX]; + + + if ( !ref ) + return FT_Err_Invalid_Argument; + + err = FSRefMakePath( ref, pathname, sizeof ( pathname ) ); + if ( err ) + error = FT_Err_Cannot_Open_Resource; + + error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* fallback to datafork font */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + +#endif /* HAVE_FSREF */ + + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* */ + /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */ + /* accepts an FSSpec instead of a path. */ + /* */ + /* This function is deprecated because Carbon data types (FSSpec) */ + /* are not cross-platform, and thus not suitable for the freetype API. */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec* spec, + FT_Long face_index, + FT_Face* aface ) + { + +#if HAVE_FSREF + + FSRef ref; + + + if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) + return FT_Err_Invalid_Argument; + else + return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); + +#elif HAVE_FSSPEC + + FT_Error error; + FT_Open_Args args; + OSErr err; + UInt8 pathname[PATH_MAX]; + + + if ( !spec ) + return FT_Err_Invalid_Argument; + + err = FT_FSpMakePath( spec, pathname, sizeof ( pathname ) ); + if ( err ) + error = FT_Err_Cannot_Open_Resource; + + error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); + if ( error != 0 || *aface != NULL ) + return error; + + /* fallback to datafork font */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + +#else + + FT_UNUSED( library ); + FT_UNUSED( spec ); + FT_UNUSED( face_index ); + FT_UNUSED( aface ); + + return FT_Err_Unimplemented_Feature; + +#endif /* HAVE_FSREF, HAVE_FSSPEC */ + + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/modules.mk b/alienblaster/project/jni/freetype/builds/modules.mk new file mode 100644 index 000000000..c4a882cbd --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/modules.mk @@ -0,0 +1,79 @@ +# +# FreeType 2 modules sub-Makefile +# + + +# Copyright 1996-2000, 2003, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# DO NOT INVOKE THIS MAKEFILE DIRECTLY! IT IS MEANT TO BE INCLUDED BY +# OTHER MAKEFILES. + + +# This file is in charge of handling the generation of the modules list +# file. + + +# Build the modules list. +# +$(FTMODULE_H): $(MODULES_CFG) + $(FTMODULE_H_INIT) + $(FTMODULE_H_CREATE) + $(FTMODULE_H_DONE) + +ifneq ($(findstring $(PLATFORM),dos win32 win16 os2),) + OPEN_MODULE := @echo$(space) + CLOSE_MODULE := >> $(subst /,$(SEP),$(FTMODULE_H)) + REMOVE_MODULE := @-$(DELETE) $(subst /,$(SEP),$(FTMODULE_H)) +else + OPEN_MODULE := @echo " + CLOSE_MODULE := " >> $(FTMODULE_H) + REMOVE_MODULE := @-$(DELETE) $(FTMODULE_H) +endif + + +define FTMODULE_H_INIT +$(REMOVE_MODULE) +@-echo Generating modules list in $(FTMODULE_H)... +$(OPEN_MODULE)/* This is a generated file. */$(CLOSE_MODULE) +endef + +# It is no mistake that the final closing parenthesis is on the +# next line -- it produces proper newlines during the expansion +# of `foreach'. +# +define FTMODULE_H_CREATE +$(foreach COMMAND,$(FTMODULE_H_COMMANDS),$($(COMMAND)) +) +endef + +define FTMODULE_H_DONE +$(OPEN_MODULE)/* EOF */$(CLOSE_MODULE) +@echo done. +endef + + +# $(OPEN_DRIVER) & $(CLOSE_DRIVER) are used to specify a given font driver +# in the `module.mk' rules file. +# +OPEN_DRIVER := $(OPEN_MODULE)FT_USE_MODULE( +CLOSE_DRIVER := )$(CLOSE_MODULE) + +ECHO_DRIVER := @echo "* module:$(space) +ECHO_DRIVER_DESC := ( +ECHO_DRIVER_DONE := )" + +# Each `module.mk' in the `src/*' subdirectories adds a variable with +# commands to $(FTMODULE_H_COMMANDS). Note that we can't use SRC_DIR here. +# +-include $(patsubst %,$(TOP_DIR)/src/%/module.mk,$(MODULES)) + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/newline b/alienblaster/project/jni/freetype/builds/newline new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/newline @@ -0,0 +1 @@ + diff --git a/alienblaster/project/jni/freetype/builds/os2/detect.mk b/alienblaster/project/jni/freetype/builds/os2/detect.mk new file mode 100644 index 000000000..47a40a2f8 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/os2/detect.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 configuration file to detect an OS/2 host platform. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +.PHONY: setup + + +ifeq ($(PLATFORM),ansi) + + ifdef OS2_SHELL + + PLATFORM := os2 + + endif # test OS2_SHELL +endif + +ifeq ($(PLATFORM),os2) + + COPY := copy + DELETE := del + CAT := type + SEP := $(BACKSLASH) + + # gcc-emx by default + CONFIG_FILE := os2-gcc.mk + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring visualage,$(MAKECMDGOALS)),) # Visual Age C++ + CONFIG_FILE := os2-icc.mk + CC := icc + visualage: setup + .PHONY: visualage + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := os2-wat.mk + CC := wcc386 + watcom: setup + .PHONY: watcom + endif + + ifneq ($(findstring borlandc,$(MAKECMDGOALS)),) # Borland C++ 32-bit + CONFIG_FILE := os2-bcc.mk + CC := bcc32 + borlandc: setup + .PHONY: borlandc + endif + + ifneq ($(findstring devel,$(MAKECMDGOALS)),) # development target + CONFIG_FILE := os2-dev.mk + CC := gcc + devel: setup + .PHONY: devel + endif + + setup: dos_setup + +endif # test PLATFORM os2 + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/os2/os2-def.mk b/alienblaster/project/jni/freetype/builds/os2/os2-def.mk new file mode 100644 index 000000000..01cda9285 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/os2/os2-def.mk @@ -0,0 +1,44 @@ +# +# FreeType 2 OS/2 specific definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := del +CAT := type +SEP := $(strip \ ) +BUILD_DIR := $(TOP_DIR)/builds/os2 +PLATFORM := os2 + +# The executable file extension (for tools), *with* leading dot. +# +E := .exe + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := $(PROJECT) + + +# The NO_OUTPUT macro is used to ignore the output of commands. +# +NO_OUTPUT = 2> nul + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/os2/os2-dev.mk b/alienblaster/project/jni/freetype/builds/os2/os2-dev.mk new file mode 100644 index 000000000..83da8dea3 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/os2/os2-dev.mk @@ -0,0 +1,30 @@ +# +# FreeType 2 configuration rules for OS/2 + GCC +# +# Development version without optimizations. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DEVEL_DIR := $(TOP_DIR)/devel + +# include OS/2-specific definitions +include $(TOP_DIR)/builds/os2/os2-def.mk + +# include gcc-specific definitions +include $(TOP_DIR)/builds/compiler/gcc-dev.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/os2/os2-gcc.mk b/alienblaster/project/jni/freetype/builds/os2/os2-gcc.mk new file mode 100644 index 000000000..446073e4f --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/os2/os2-gcc.mk @@ -0,0 +1,26 @@ +# +# FreeType 2 configuration rules for the OS/2 + gcc +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# include OS/2-specific definitions +include $(TOP_DIR)/builds/os2/os2-def.mk + +# include gcc-specific definitions +include $(TOP_DIR)/builds/compiler/gcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/symbian/bld.inf b/alienblaster/project/jni/freetype/builds/symbian/bld.inf new file mode 100644 index 000000000..7932dcbf2 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/symbian/bld.inf @@ -0,0 +1,65 @@ +// +// FreeType 2 project for the symbian platform +// + +// Copyright 2008, 2009 by +// David Turner, Robert Wilhelm, and Werner Lemberg. +// +// This file is part of the FreeType project, and may only be used, modified, +// and distributed under the terms of the FreeType project license, +// LICENSE.TXT. By continuing to use, modify, or distribute this file you +// indicate that you have read the license and understand and accept it +// fully. + +PRJ_PLATFORMS +DEFAULT + +PRJ_MMPFILES +freetype.mmp + +PRJ_EXPORTS +../../include/ft2build.h +../../include/freetype/config/ftconfig.h freetype/config/ftconfig.h +../../include/freetype/config/ftheader.h freetype/config/ftheader.h +../../include/freetype/config/ftmodule.h freetype/config/ftmodule.h +../../include/freetype/config/ftoption.h freetype/config/ftoption.h +../../include/freetype/config/ftstdlib.h freetype/config/ftstdlib.h +../../include/freetype/freetype.h freetype/freetype.h +../../include/freetype/ftbbox.h freetype/ftbbox.h +../../include/freetype/ftbdf.h freetype/ftbdf.h +../../include/freetype/ftbitmap.h freetype/ftbitmap.h +../../include/freetype/ftcache.h freetype/ftcache.h +../../include/freetype/ftcid.h freetype/ftcid.h +../../include/freetype/fterrdef.h freetype/fterrdef.h +../../include/freetype/fterrors.h freetype/fterrors.h +../../include/freetype/ftgasp.h freetype/ftgasp.h +../../include/freetype/ftglyph.h freetype/ftglyph.h +../../include/freetype/ftgxval.h freetype/ftgxval.h +../../include/freetype/ftgzip.h freetype/ftgzip.h +../../include/freetype/ftimage.h freetype/ftimage.h +../../include/freetype/ftincrem.h freetype/ftincrem.h +../../include/freetype/ftlcdfil.h freetype/ftlcdfil.h +../../include/freetype/ftlist.h freetype/ftlist.h +../../include/freetype/ftlzw.h freetype/ftlzw.h +../../include/freetype/ftmac.h freetype/ftmac.h +../../include/freetype/ftmm.h freetype/ftmm.h +../../include/freetype/ftmodapi.h freetype/ftmodapi.h +../../include/freetype/ftmoderr.h freetype/ftmoderr.h +../../include/freetype/ftotval.h freetype/ftotval.h +../../include/freetype/ftoutln.h freetype/ftoutln.h +../../include/freetype/ftpfr.h freetype/ftpfr.h +../../include/freetype/ftrender.h freetype/ftrender.h +../../include/freetype/ftsizes.h freetype/ftsizes.h +../../include/freetype/ftsnames.h freetype/ftsnames.h +../../include/freetype/ftstroke.h freetype/ftstroke.h +../../include/freetype/ftsynth.h freetype/ftsynth.h +../../include/freetype/ftsystem.h freetype/ftsystem.h +../../include/freetype/fttrigon.h freetype/fttrigon.h +../../include/freetype/fttypes.h freetype/fttypes.h +../../include/freetype/ftwinfnt.h freetype/ftwinfnt.h +../../include/freetype/ftxf86.h freetype/ftxf86.h +../../include/freetype/t1tables.h freetype/t1tables.h +../../include/freetype/ttnameid.h freetype/ttnameid.h +../../include/freetype/tttables.h freetype/tttables.h +../../include/freetype/tttags.h freetype/tttags.h +../../include/freetype/ttunpat.h freetype/ttunpat.h diff --git a/alienblaster/project/jni/freetype/builds/symbian/freetype.mmp b/alienblaster/project/jni/freetype/builds/symbian/freetype.mmp new file mode 100644 index 000000000..c10f35748 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/symbian/freetype.mmp @@ -0,0 +1,142 @@ +// +// FreeType 2 makefile for the symbian platform +// + +// Copyright 2008, 2009 by +// David Turner, Robert Wilhelm, and Werner Lemberg. +// +// This file is part of the FreeType project, and may only be used, modified, +// and distributed under the terms of the FreeType project license, +// LICENSE.TXT. By continuing to use, modify, or distribute this file you +// indicate that you have read the license and understand and accept it +// fully. + +target freetype.lib +targettype lib + +macro NDEBUG +macro FT2_BUILD_LIBRARY + +sourcepath ..\..\src\autofit + +source autofit.c + +sourcepath ..\..\src\base + +source ftbase.c +source ftbbox.c +source ftbdf.c +source ftbitmap.c +source ftcid.c +source ftfstype.c +source ftgasp.c +source ftglyph.c +source ftgxval.c +source ftinit.c +source ftlcdfil.c +source ftmm.c +source ftotval.c +source ftpatent.c +source ftpfr.c +source ftstroke.c +source ftsynth.c +source ftsystem.c +source fttype1.c +source ftwinfnt.c + +sourcepath ..\..\src\bdf + +source bdf.c + +sourcepath ..\..\src\cache + +source ftcache.c + +sourcepath ..\..\src\cff + +source cff.c + +sourcepath ..\..\src\cid + +source type1cid.c + +sourcepath ..\..\src\gzip + +source ftgzip.c + +sourcepath ..\..\src\lzw + +source ftlzw.c + +sourcepath ..\..\src\pcf + +source pcf.c + +sourcepath ..\..\src\pfr + +source pfr.c + +sourcepath ..\..\src\psaux + +source psaux.c + +sourcepath ..\..\src\pshinter + +source pshinter.c + +sourcepath ..\..\src\psnames + +source psmodule.c + +sourcepath ..\..\src\raster + +source raster.c + +sourcepath ..\..\src\sfnt + +source sfnt.c + +sourcepath ..\..\src\smooth + +source smooth.c + +sourcepath ..\..\src\truetype + +source truetype.c + +sourcepath ..\..\src\type1 + +source type1.c + +sourcepath ..\..\src\type42 + +source type42.c + +sourcepath ..\..\src\winfonts + +source winfnt.c + + +systeminclude ..\..\include +systeminclude \epoc32\include\stdapis +userinclude ..\..\src\autofit +userinclude ..\..\src\bdf +userinclude ..\..\src\cache +userinclude ..\..\src\cff +userinclude ..\..\src\cid +userinclude ..\..\src\gxvalid +userinclude ..\..\src\gzip +userinclude ..\..\src\lzw +userinclude ..\..\src\otvalid +userinclude ..\..\src\pcf +userinclude ..\..\src\pfr +userinclude ..\..\src\psaux +userinclude ..\..\src\pshinter +userinclude ..\..\src\psnames +userinclude ..\..\src\raster +userinclude ..\..\src\sfnt +userinclude ..\..\src\smooth +userinclude ..\..\src\truetype +userinclude ..\..\src\type1 +userinclude ..\..\src\type42 +userinclude ..\..\src\winfonts diff --git a/alienblaster/project/jni/freetype/builds/toplevel.mk b/alienblaster/project/jni/freetype/builds/toplevel.mk new file mode 100644 index 000000000..6a8280173 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/toplevel.mk @@ -0,0 +1,255 @@ +# +# FreeType build system -- top-level sub-Makefile +# + + +# Copyright 1996-2000, 2001, 2003, 2006, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# This file is designed for GNU Make, do not use it with another Make tool! +# +# It works as follows: +# +# - When invoked for the first time, this Makefile includes the rules found +# in `PROJECT/builds/detect.mk'. They are in charge of detecting the +# current platform. +# +# A summary of the detection is displayed, and the file `config.mk' is +# created in the current directory. +# +# - When invoked later, this Makefile includes the rules found in +# `config.mk'. This sub-Makefile defines some system-specific variables +# (like compiler, compilation flags, object suffix, etc.), then includes +# the rules found in `PROJECT/builds/PROJECT.mk', used to build the +# library. +# +# See the comments in `builds/detect.mk' and `builds/PROJECT.mk' for more +# details on host platform detection and library builds. + + +# First of all, check whether we have `$(value ...)'. We do this by testing +# for `$(eval ...)' which has been introduced in the same GNU make version. + +eval_available := +$(eval eval_available := T) +ifneq ($(eval_available),T) + $(error FreeType's build system needs a Make program which supports $$(value)) +endif + + +.PHONY: all dist distclean modules setup + + +# The `space' variable is used to avoid trailing spaces in defining the +# `T' variable later. +# +empty := +space := $(empty) $(empty) + + +# The main configuration file, defining the `XXX_MODULES' variables. We +# prefer a `modules.cfg' file in OBJ_DIR over TOP_DIR. +# +ifndef MODULES_CFG + MODULES_CFG := $(TOP_DIR)/modules.cfg + ifneq ($(wildcard $(OBJ_DIR)/modules.cfg),) + MODULES_CFG := $(OBJ_DIR)/modules.cfg + endif +endif + + +# FTMODULE_H, as its name suggests, indicates where the FreeType module +# class file resides. +# +FTMODULE_H ?= $(OBJ_DIR)/ftmodule.h + + +include $(MODULES_CFG) + + +# The list of modules we are using. +# +MODULES := $(FONT_MODULES) \ + $(HINTING_MODULES) \ + $(RASTER_MODULES) \ + $(AUX_MODULES) + + +CONFIG_MK ?= config.mk + +# If no configuration sub-makefile is present, or if `setup' is the target +# to be built, run the auto-detection rules to figure out which +# configuration rules file to use. +# +# Note that the configuration file is put in the current directory, which is +# not necessarily $(TOP_DIR). + +# If `config.mk' is not present, set `check_platform'. +# +ifeq ($(wildcard $(CONFIG_MK)),) + check_platform := 1 +endif + +# If `setup' is one of the targets requested, set `check_platform'. +# +ifneq ($(findstring setup,$(MAKECMDGOALS)),) + check_platform := 1 +endif + +# Include the automatic host platform detection rules when we need to +# check the platform. +# +ifdef check_platform + + all modules: setup + + include $(TOP_DIR)/builds/detect.mk + + # This rule makes sense for Unix only to remove files created by a run + # of the configure script which hasn't been successful (so that no + # `config.mk' has been created). It uses the built-in $(RM) command of + # GNU make. Similarly, `nul' is created if e.g. `make setup win32' has + # been erroneously used. + # + # Note: This test is duplicated in `builds/unix/detect.mk'. + # + is_unix := $(strip $(wildcard /sbin/init) \ + $(wildcard /usr/sbin/init) \ + $(wildcard /hurd/auth)) + ifneq ($(is_unix),) + + distclean: + $(RM) builds/unix/config.cache + $(RM) builds/unix/config.log + $(RM) builds/unix/config.status + $(RM) builds/unix/unix-def.mk + $(RM) builds/unix/unix-cc.mk + $(RM) builds/unix/freetype2.pc + $(RM) nul + + endif # test is_unix + + # IMPORTANT: + # + # `setup' must be defined by the host platform detection rules to create + # the `config.mk' file in the current directory. + +else + + # A configuration sub-Makefile is present -- simply run it. + # + all: single + + BUILD_PROJECT := yes + include $(CONFIG_MK) + +endif # test check_platform + + +# We always need the list of modules in ftmodule.h. +# +all setup: $(FTMODULE_H) + + +# The `modules' target unconditionally rebuilds the module list. +# +modules: + $(FTMODULE_H_INIT) + $(FTMODULE_H_CREATE) + $(FTMODULE_H_DONE) + +include $(TOP_DIR)/builds/modules.mk + + +# This target builds the tarballs. +# +# Not to be run by a normal user -- there are no attempts to make it +# generic. + +# we check for `dist', not `distclean' +ifneq ($(findstring distx,$(MAKECMDGOALS)x),) + FT_H := include/freetype/freetype.h + + major := $(shell sed -n 's/.*FREETYPE_MAJOR[^0-9]*\([0-9]\+\)/\1/p' < $(FT_H)) + minor := $(shell sed -n 's/.*FREETYPE_MINOR[^0-9]*\([0-9]\+\)/\1/p' < $(FT_H)) + patch := $(shell sed -n 's/.*FREETYPE_PATCH[^0-9]*\([0-9]\+\)/\1/p' < $(FT_H)) + + version := $(major).$(minor).$(patch) + winversion := $(major)$(minor)$(patch) +endif + +dist: + -rm -rf tmp + rm -f freetype-$(version).tar.gz + rm -f freetype-$(version).tar.bz2 + rm -f ft$(winversion).zip + + for d in `find . -wholename '*/.git' -prune \ + -o -type f \ + -o -print` ; do \ + mkdir -p tmp/$$d ; \ + done ; + + currdir=`pwd` ; \ + for f in `find . -wholename '*/.git' -prune \ + -o -name .cvsignore \ + -o -type d \ + -o -print` ; do \ + ln -s $$currdir/$$f tmp/$$f ; \ + done + + @# Prevent generation of .pyc files. Python follows (soft) links if + @# the link's directory is write protected, so we have temporarily + @# disable write access here too. + chmod -w src/tools/docmaker + + cd tmp ; \ + $(MAKE) devel ; \ + $(MAKE) do-dist + + chmod +w src/tools/docmaker + + mv tmp freetype-$(version) + + tar cfh - freetype-$(version) \ + | gzip -9 -c > freetype-$(version).tar.gz + tar cfh - freetype-$(version) \ + | bzip2 -c > freetype-$(version).tar.bz2 + + @# Use CR/LF for zip files. + zip -lr9 ft$(winversion).zip freetype-$(version) + + rm -fr freetype-$(version) + + +# The locations of the latest `config.guess' and `config.sub' versions (from +# GNU `config' CVS), relative to the `tmp' directory used during `make dist'. +# +CONFIG_GUESS = ~/git/config/config.guess +CONFIG_SUB = ~/git/config/config.sub + + +# Don't say `make do-dist'. Always use `make dist' instead. +# +.PHONY: do-dist + +do-dist: distclean refdoc + @# Without removing the files, `autoconf' and friends follow links. + rm -f builds/unix/aclocal.m4 + rm -f builds/unix/configure.ac + rm -f builds/unix/configure + + sh autogen.sh + rm -rf builds/unix/autom4te.cache + + cp $(CONFIG_GUESS) builds/unix + cp $(CONFIG_SUB) builds/unix + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/.gitignore b/alienblaster/project/jni/freetype/builds/unix/.gitignore new file mode 100644 index 000000000..86b8c409b --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/.gitignore @@ -0,0 +1,16 @@ +aclocal.m4 +autom4te.cache +config.cache +config.guess +config.log +config.status +config.sub +configure +configure.ac +freetype2.pc +freetype-config +ftconfig.h +libtool +ltmain.sh +unix-cc.mk +unix-def.mk diff --git a/alienblaster/project/jni/freetype/builds/unix/configure.raw b/alienblaster/project/jni/freetype/builds/unix/configure.raw new file mode 100644 index 000000000..ff16dfe33 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/configure.raw @@ -0,0 +1,684 @@ +# This file is part of the FreeType project. +# +# Process this file with autoconf to produce a configure script. +# +# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +AC_INIT([FreeType], [@VERSION@], [freetype@nongnu.org], [freetype]) +AC_CONFIG_SRCDIR([ftconfig.in]) + + +# Don't forget to update docs/VERSION.DLL! + +version_info='10:0:4' +AC_SUBST([version_info]) +ft_version=`echo $version_info | tr : .` +AC_SUBST([ft_version]) + + +# checks for system type + +AC_CANONICAL_HOST + + +# checks for programs + +AC_PROG_CC +AC_PROG_CPP +AC_SUBST(EXEEXT) + + +# checks for native programs to generate building tool + +if test ${cross_compiling} = yes; then + AC_CHECK_PROG(CC_BUILD, ${build}-gcc, ${build}-gcc) + test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, gcc, gcc) + test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, cc, cc, , , /usr/ucb/cc) + test -z "${CC_BUILD}" && AC_MSG_ERROR([cannot find native C compiler]) + + AC_MSG_CHECKING([for suffix of native executables]) + rm -f a.* b.* a_out.exe conftest.* + echo > conftest.c "int main() { return 0;}" + ${CC_BUILD} conftest.c || AC_MSG_ERROR([native C compiler is not working]) + rm -f conftest.c + if test -x a.out -o -x b.out -o -x conftest; then + EXEEXT_BUILD="" + elif test -x a_out.exe -o -x conftest.exe; then + EXEEXT_BUILD=".exe" + elif test -x conftest.* ; then + EXEEXT_BUILD=`echo conftest.* | sed -n '1s/^.*\././'` + fi + rm -f a.* b.* a_out.exe conftest.* + AC_MSG_RESULT($EXEEXT_BUILD) +else + CC_BUILD=${CC} + EXEEXT_BUILD=${EXEEXT} +fi + +AC_SUBST(CC_BUILD) +AC_SUBST(EXEEXT_BUILD) + + + +# get compiler flags right + +if test "x$GCC" = xyes; then + XX_CFLAGS="-Wall" + XX_ANSIFLAGS="-pedantic -ansi" +else + case "$host" in + *-dec-osf*) + CFLAGS= + XX_CFLAGS="-std1 -g3" + XX_ANSIFLAGS= + ;; + *) + XX_CFLAGS= + XX_ANSIFLAGS= + ;; + esac +fi +AC_SUBST([XX_CFLAGS]) +AC_SUBST([XX_ANSIFLAGS]) + + +# auxiliary programs + +AC_CHECK_PROG([RMF], [rm], [rm -f]) +AC_CHECK_PROG([RMDIR], [rmdir], [rmdir]) + + +# Since this file will be finally moved to another directory we make +# the path of the install script absolute. This small code snippet has +# been taken from automake's `ylwrap' script. + +AC_PROG_INSTALL +case "$INSTALL" in +/*) + ;; +*/*) + INSTALL="`pwd`/$INSTALL" ;; +esac + + +# checks for header files + +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h unistd.h]) + + +# checks for typedefs, structures, and compiler characteristics + +AC_C_CONST +AC_CHECK_SIZEOF([int]) +AC_CHECK_SIZEOF([long]) + + +# check whether cpp computation of size of int and long in ftconfig.in works + +AC_MSG_CHECKING([cpp computation of bit length in ftconfig.in works]) +orig_CPPFLAGS="${CPPFLAGS}" +CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}" +ac_clean_files="ft2build.h ftoption.h ftstdlib.h" +touch ft2build.h ftoption.h ftstdlib.h + +cat > conftest.c <<\_ACEOF +#include +#define FT_CONFIG_OPTIONS_H "ftoption.h" +#define FT_CONFIG_STANDARD_LIBRARY_H "ftstdlib.h" +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX +#include "ftconfig.in" +_ACEOF +echo >> conftest.c "#if FT_SIZEOF_INT == "${ac_cv_sizeof_int} +echo >> conftest.c "ac_cpp_ft_sizeof_int="${ac_cv_sizeof_int} +echo >> conftest.c "#endif" +echo >> conftest.c "#if FT_SIZEOF_LONG == "${ac_cv_sizeof_long} +echo >> conftest.c "ac_cpp_ft_sizeof_long="${ac_cv_sizeof_long} +echo >> conftest.c "#endif" + +${CPP} ${CPPFLAGS} conftest.c | ${GREP} ac_cpp_ft > conftest.sh +eval `cat conftest.sh` +${RMF} conftest.c conftest.sh confft2build.h ftoption.h ftstdlib.h + +if test x != "x${ac_cpp_ft_sizeof_int}" \ + -a x != x"${ac_cpp_ft_sizeof_long}"; then + unset ft_use_autoconf_sizeof_types +else + ft_use_autoconf_sizeof_types=yes +fi + +AC_ARG_ENABLE(biarch-config, +[ --enable-biarch-config install biarch ftconfig.h to support multiple + architectures by single file], [], []) + +case :${ft_use_autoconf_sizeof_types}:${enable_biarch_config}: in + :yes:yes:) + AC_MSG_RESULT([broken but use it]) + unset ft_use_autoconf_sizeof_types + ;; + ::no:) + AC_MSG_RESULT([works but ignore it]) + ft_use_autoconf_sizeof_types=yes + ;; + ::yes: | :::) + AC_MSG_RESULT([yes]) + unset ft_use_autoconf_sizeof_types + ;; + *) + AC_MSG_RESULT([no]) + ft_use_autoconf_sizeof_types=yes + ;; +esac + +if test x"${ft_use_autoconf_sizeof_types}" = xyes; then + AC_DEFINE([FT_USE_AUTOCONF_SIZEOF_TYPES]) +fi + +CPPFLAGS="${orig_CPPFLAGS}" + + +# checks for library functions + +# Here we check whether we can use our mmap file component. + +AC_FUNC_MMAP +if test "$ac_cv_func_mmap_fixed_mapped" != yes; then + FTSYS_SRC='$(BASE_DIR)/ftsystem.c' +else + FTSYS_SRC='$(BUILD_DIR)/ftsystem.c' + + AC_CHECK_DECLS([munmap], + [], + [], + [ + +#ifdef HAVE_UNISTD_H +#include +#endif +#include + + ]) + + FT_MUNMAP_PARAM +fi +AC_SUBST([FTSYS_SRC]) + +AC_CHECK_FUNCS([memcpy memmove]) + + +# check for system zlib + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([zlib], + AS_HELP_STRING([--without-zlib], + [use internal zlib instead of system-wide])) +if test x$with_zlib != xno && test -z "$LIBZ"; then + AC_CHECK_LIB([z], [gzsetparams], [AC_CHECK_HEADER([zlib.h], [LIBZ='-lz'])]) +fi +if test x$with_zlib != xno && test -n "$LIBZ"; then + CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB" + LDFLAGS="$LDFLAGS $LIBZ" + SYSTEM_ZLIB=yes +fi + + +# Some options handling SDKs/archs in CFLAGS should be copied +# to LDFLAGS. Apple TechNote 2137 recommends to include these +# options in CFLAGS but not in LDFLAGS. + +save_config_args=$* +set dummy ${CFLAGS} +i=1 +while test $i -lt $# +do + c=$1 + + case "${c}" in + -isysroot|-arch) # options taking 1 argument + a=$2 + AC_MSG_CHECKING([whether CFLAGS and LDFLAGS share ${c} ${a}]) + if expr " ${LDFLAGS} " : ".* ${c} *${a}.*" > /dev/null + then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no, copy to LDFLAGS]) + LDFLAGS="${LDFLAGS} ${c} ${a}" + fi + shift 1 + ;; + -m32|-m64) # options taking no argument + AC_MSG_RESULT([whether CFLAGS and LDFLAGS share ${c}]) + if expr " ${LDFLAGS} " : ".* ${c} *${a}.*" > /dev/null + then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no, copy to LDFLAGS]) + LDFLAGS="${LDFLAGS} ${c}" + fi + ;; + # *) + # AC_MSG_RESULT([${c} is not copied to LDFLAGS]) + # ;; + esac + + shift 1 +done +set ${save_config_args} + + +# Whether to use Mac OS resource-based fonts. + +ftmac_c="" # src/base/ftmac.c should not be included in makefiles by default + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([old-mac-fonts], + AS_HELP_STRING([--with-old-mac-fonts], + [allow Mac resource-based fonts to be used])) +if test x$with_old_mac_fonts = xyes; then + orig_LDFLAGS="${LDFLAGS}" + AC_MSG_CHECKING([CoreServices & ApplicationServices of Mac OS X]) + FT2_EXTRA_LIBS="-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices" + LDFLAGS="$LDFLAGS $FT2_EXTRA_LIBS" + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + short res = 0; + + + UseResFile( res ); + + ])], + [AC_MSG_RESULT([ok]) + ftmac_c='ftmac.c' + AC_MSG_CHECKING([OS_INLINE macro is ANSI compatible]) + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + /* OSHostByteOrder() is typed as OS_INLINE */ + int32_t os_byte_order = OSHostByteOrder(); + + + if ( OSBigEndian != os_byte_order ) + return 1; + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_ANSI_OS_INLINE=1" + ], + [AC_MSG_RESULT([no, ANSI incompatible]) + CFLAGS="$orig_CFLAGS" + ]) + AC_MSG_CHECKING([type ResourceIndex]) + orig_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS" + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +# include +#endif + + ], + [ + + ResourceIndex i = 0; + return i; + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=1" + ], + [AC_MSG_RESULT([no]) + CFLAGS="$orig_CFLAGS" + CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=0" + ])], + [AC_MSG_RESULT([not found]) + FT2_EXTRA_LIBS="" + LDFLAGS="${orig_LDFLAGS}" + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"]) +else + case x$host_os in + xdarwin*) + dnl AC_MSG_WARN([host system is MacOS but configured to build without Carbon]) + CFLAGS="$CFLAGS -DDARWIN_NO_CARBON" + ;; + *) ;; + esac +fi + + +# Whether to use FileManager which is deprecated since Mac OS X 10.4. + +AC_ARG_WITH([fsspec], + AS_HELP_STRING([--with-fsspec], + [use obsolete FSSpec API of MacOS, if available (default=yes)])) +if test x$with_fsspec = xno; then + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0" +elif test x$with_old_mac_fonts = xyes -a x$with_fsspec != x; then + AC_MSG_CHECKING([FSSpec-based FileManager]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FCBPBPtr paramBlock; + short vRefNum; + long dirID; + ConstStr255Param fileName; + FSSpec* spec; + + + /* FSSpec functions: deprecated since Mac OS X 10.4 */ + PBGetFCBInfoSync( paramBlock ); + FSMakeFSSpec( vRefNum, dirID, fileName, spec ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_FSSPEC=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_FSSPEC=0"]) +fi + + +# Whether to use FileManager in Carbon since MacOS 9.x. + +AC_ARG_WITH([fsref], + AS_HELP_STRING([--with-fsref], + [use Carbon FSRef API of MacOS, if available (default=yes)])) +if test x$with_fsref = xno; then + AC_MSG_WARN([ +*** WARNING + FreeType2 built without FSRef API cannot load + data-fork fonts on MacOS, except of XXX.dfont. + ]) + CFLAGS="$CFLAGS -DHAVE_FSREF=0" +elif test x$with_old_mac_fonts = xyes -a x$with_fsref != x; then + AC_MSG_CHECKING([FSRef-based FileManager]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + short vRefNum; + long dirID; + ConstStr255Param fileName; + + Boolean* isDirectory; + UInt8* path; + SInt16 desiredRefNum; + SInt16* iterator; + SInt16* actualRefNum; + HFSUniStr255* outForkName; + FSVolumeRefNum volume; + FSCatalogInfoBitmap whichInfo; + FSCatalogInfo* catalogInfo; + FSForkInfo* forkInfo; + FSRef* ref; + +#if HAVE_FSSPEC + FSSpec* spec; +#endif + + /* FSRef functions: no need to check? */ + FSGetForkCBInfo( desiredRefNum, volume, iterator, + actualRefNum, forkInfo, ref, + outForkName ); + FSPathMakeRef( path, ref, isDirectory ); + +#if HAVE_FSSPEC + FSpMakeFSRef ( spec, ref ); + FSGetCatalogInfo( ref, whichInfo, catalogInfo, + outForkName, spec, ref ); +#endif + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_FSREF=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_FSREF=0"]) +fi + + +# Whether to use QuickDraw API in ToolBox which is deprecated since +# Mac OS X 10.4. + +AC_ARG_WITH([quickdraw-toolbox], + AS_HELP_STRING([--with-quickdraw-toolbox], + [use MacOS QuickDraw in ToolBox, if available (default=yes)])) +if test x$with_quickdraw_toolbox = xno; then + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0" +elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_toolbox != x; then + AC_MSG_CHECKING([QuickDraw FontManager functions in ToolBox]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + Str255 familyName; + SInt16 familyID = 0; + FMInput* fmIn = NULL; + FMOutput* fmOut = NULL; + + + GetFontName( familyID, familyName ); + GetFNum( familyName, &familyID ); + fmOut = FMSwapFont( fmIn ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0"]) +fi + + +# Whether to use QuickDraw API in Carbon which is deprecated since +# Mac OS X 10.4. + +AC_ARG_WITH([quickdraw-carbon], + AS_HELP_STRING([--with-quickdraw-carbon], + [use MacOS QuickDraw in Carbon, if available (default=yes)])) +if test x$with_quickdraw_carbon = xno; then + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0" +elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_carbon != x; then + AC_MSG_CHECKING([QuickDraw FontManager functions in Carbon]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FMFontFamilyIterator famIter; + FMFontFamily family; + Str255 famNameStr; + FMFontFamilyInstanceIterator instIter; + FMFontStyle style; + FMFontSize size; + FMFont font; + FSSpec* pathSpec; + + + FMCreateFontFamilyIterator( NULL, NULL, kFMUseGlobalScopeOption, + &famIter ); + FMGetNextFontFamily( &famIter, &family ); + FMGetFontFamilyName( family, famNameStr ); + FMCreateFontFamilyInstanceIterator( family, &instIter ); + FMGetNextFontFamilyInstance( &instIter, &font, &style, &size ); + FMDisposeFontFamilyInstanceIterator( &instIter ); + FMDisposeFontFamilyIterator( &famIter ); + FMGetFontContainer( font, pathSpec ); + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0"]) +fi + + +# Whether to use AppleTypeService since Mac OS X. + +# don't quote AS_HELP_STRING! +AC_ARG_WITH([ats], + AS_HELP_STRING([--with-ats], + [use AppleTypeService, if available (default=yes)])) +if test x$with_ats = xno; then + CFLAGS="$CFLAGS -DHAVE_ATS=0" +elif test x$with_old_mac_fonts = xyes -a x$with_ats != x ; then + AC_MSG_CHECKING([AppleTypeService functions]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([ + +#if defined(__GNUC__) && defined(__APPLE_CC__) +# include +# include +#else +# include +# include +#endif + + ], + [ + + FSSpec* pathSpec; + + + ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope ); +#if HAVE_FSSPEC + ATSFontGetFileSpecification( 0, pathSpec ); +#endif + + ])], + [AC_MSG_RESULT([ok]) + CFLAGS="$CFLAGS -DHAVE_ATS=1"], + [AC_MSG_RESULT([not found]) + CFLAGS="$CFLAGS -DHAVE_ATS=0"]) +fi + +case "$CFLAGS" in + *HAVE_FSSPEC* | *HAVE_FSREF* | *HAVE_QUICKDRAW* | *HAVE_ATS* ) + AC_MSG_WARN([ +*** WARNING + FSSpec/FSRef/QuickDraw/ATS options are explicitly given, + thus it is recommended to replace src/base/ftmac.c by builds/mac/ftmac.c. + ]) + CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/' + ;; + *) + ;; +esac + + +AC_SUBST([ftmac_c]) +AC_SUBST([LIBZ]) +AC_SUBST([CFLAGS]) +AC_SUBST([LDFLAGS]) +AC_SUBST([FT2_EXTRA_LIBS]) +AC_SUBST([SYSTEM_ZLIB]) + + +LT_INIT(win32-dll) + +AC_SUBST([hardcode_libdir_flag_spec]) +AC_SUBST([wl]) +AC_SUBST([build_libtool_libs]) + + +# configuration file -- stay in 8.3 limit +# +# since #undef doesn't survive in configuration header files we replace +# `/undef' with `#undef' after creating the output file + +AC_CONFIG_HEADERS([ftconfig.h:ftconfig.in], + [mv ftconfig.h ftconfig.tmp + sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h + rm ftconfig.tmp]) + +# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk' +# and `builds/unix/unix-cc.mk' that will be used by the build system +# +AC_CONFIG_FILES([unix-cc.mk:unix-cc.in + unix-def.mk:unix-def.in + freetype-config + freetype2.pc:freetype2.in]) + +# re-generate the Jamfile to use libtool now +# +# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in]) + +AC_OUTPUT + +# end of configure.raw diff --git a/alienblaster/project/jni/freetype/builds/unix/detect.mk b/alienblaster/project/jni/freetype/builds/unix/detect.mk new file mode 100644 index 000000000..e74af5730 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/detect.mk @@ -0,0 +1,91 @@ +# +# FreeType 2 configuration file to detect a UNIX host platform. +# + + +# Copyright 1996-2000, 2002, 2003, 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +.PHONY: setup + +ifeq ($(PLATFORM),ansi) + + # Note: this test is duplicated in "builds/toplevel.mk". + # + is_unix := $(strip $(wildcard /sbin/init) \ + $(wildcard /usr/sbin/init) \ + $(wildcard /hurd/auth)) + ifneq ($(is_unix),) + + PLATFORM := unix + + endif # test is_unix +endif # test PLATFORM ansi + +ifeq ($(PLATFORM),unix) + COPY := cp + DELETE := rm -f + CAT := cat + + # If `devel' is the requested target, we use a special configuration + # file named `unix-dev.mk'. It disables optimization and libtool. + # + ifneq ($(findstring devel,$(MAKECMDGOALS)),) + CONFIG_FILE := unix-dev.mk + CC := gcc + devel: setup + .PHONY: devel + else + + # If `lcc' is the requested target, we use a special configuration + # file named `unix-lcc.mk'. It disables libtool for LCC. + # + ifneq ($(findstring lcc,$(MAKECMDGOALS)),) + CONFIG_FILE := unix-lcc.mk + CC := lcc + lcc: setup + .PHONY: lcc + else + + # If a Unix platform is detected, the configure script is called and + # `unix-def.mk' together with `unix-cc.mk' is created. + # + # Arguments to `configure' should be in the CFG variable. Example: + # + # make CFG="--prefix=/usr --disable-static" + # + # If you need to set CFLAGS or LDFLAGS, do it here also. + # + # Feel free to add support for other platform specific compilers in + # this directory (e.g. solaris.mk + changes here to detect the + # platform). + # + CONFIG_FILE := unix.mk + unix: setup + must_configure := 1 + .PHONY: unix + endif + endif + + have_Makefile := $(wildcard $(OBJ_DIR)/Makefile) + + setup: std_setup + ifdef must_configure + ifneq ($(have_Makefile),) + # we are building FT2 not in the src tree + $(TOP_DIR)/builds/unix/configure $(value CFG) + else + cd builds/unix; ./configure $(value CFG) + endif + endif + +endif # test PLATFORM unix + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/freetype-config.in b/alienblaster/project/jni/freetype/builds/unix/freetype-config.in new file mode 100644 index 000000000..0a7a767d6 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/freetype-config.in @@ -0,0 +1,160 @@ +#! /bin/sh +# +# Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no +includedir=@includedir@ +libdir=@libdir@ +enable_shared=@build_libtool_libs@ +wl=@wl@ +hardcode_libdir_flag_spec='@hardcode_libdir_flag_spec@' + +usage() +{ + cat <&2 +fi + +while test $# -gt 0 ; do + case "$1" in + -*=*) + optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` + ;; + *) + optarg= + ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + local_prefix=yes + ;; + --prefix) + echo_prefix=yes + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + local_prefix=yes + ;; + --exec-prefix) + echo_exec_prefix=yes + ;; + --version) + echo @ft_version@ + exit 0 + ;; + --ftversion) + echo_ft_version=yes + ;; + --cflags) + echo_cflags=yes + ;; + --libs) + echo_libs=yes + ;; + --libtool) + echo_libtool=yes + ;; + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$local_prefix" = "yes" ; then + if test "$exec_prefix_set" != "yes" ; then + exec_prefix=$prefix + fi +fi + +if test "$echo_prefix" = "yes" ; then + echo ${SYSROOT}$prefix +fi + +if test "$echo_exec_prefix" = "yes" ; then + echo ${SYSROOT}$exec_prefix +fi + +if test "$exec_prefix_set" = "yes" ; then + libdir=$exec_prefix/lib +else + if test "$local_prefix" = "yes" ; then + includedir=$prefix/include + libdir=$prefix/lib + fi +fi + +if test "$echo_ft_version" = "yes" ; then + major=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \ + | grep FREETYPE_MAJOR \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + minor=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \ + | grep FREETYPE_MINOR \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + patch=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \ + | grep FREETYPE_PATCH \ + | sed 's/.*[ ]\([0-9][0-9]*\).*/\1/'` + echo $major.$minor.$patch +fi + +if test "$echo_cflags" = "yes" ; then + cflags="-I${SYSROOT}$includedir/freetype2" + if test "${SYSROOT}$includedir" != "/usr/include" ; then + echo $cflags -I${SYSROOT}$includedir + else + echo $cflags + fi +fi + +if test "$echo_libs" = "yes" ; then + rpath= + if test "$enable_shared" = "yes" ; then + eval "rpath=\"$hardcode_libdir_flag_spec\"" + fi + libs="-lfreetype @LIBZ@ @FT2_EXTRA_LIBS@" + if test "${SYSROOT}$libdir" != "/usr/lib" && test "${SYSROOT}$libdir" != "/usr/lib64"; then + echo -L${SYSROOT}$libdir $libs + else + echo $libs + fi +fi + +if test "$echo_libtool" = "yes" ; then + convlib="libfreetype.la" + echo ${SYSROOT}$libdir/$convlib +fi + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/freetype2.in b/alienblaster/project/jni/freetype/builds/unix/freetype2.in new file mode 100644 index 000000000..7e948f437 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/freetype2.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: FreeType 2 +Description: A free, high-quality, and portable font engine. +Version: @ft_version@ +Requires: +Libs: -L${libdir} -lfreetype +Libs.private: @LIBZ@ @FT2_EXTRA_LIBS@ +Cflags: -I${includedir}/freetype2 -I${includedir} diff --git a/alienblaster/project/jni/freetype/builds/unix/freetype2.m4 b/alienblaster/project/jni/freetype/builds/unix/freetype2.m4 new file mode 100644 index 000000000..3d0ecb355 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/freetype2.m4 @@ -0,0 +1,194 @@ +# Configure paths for FreeType2 +# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor +# +# Copyright 2001, 2003, 2007, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +# +# As a special exception to the FreeType project license, this file may be +# distributed as part of a program that contains a configuration script +# generated by Autoconf, under the same distribution terms as the rest of +# that program. +# +# serial 3 + +# AC_CHECK_FT2([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +# Test for FreeType 2, and define FT2_CFLAGS and FT2_LIBS. +# MINIMUM-VERSION is what libtool reports; the default is `7.0.1' (this is +# FreeType 2.0.4). +# +AC_DEFUN([AC_CHECK_FT2], + [# Get the cflags and libraries from the freetype-config script + # + AC_ARG_WITH([ft-prefix], + dnl don't quote AS_HELP_STRING! + AS_HELP_STRING([--with-ft-prefix=PREFIX], + [Prefix where FreeType is installed (optional)]), + [ft_config_prefix="$withval"], + [ft_config_prefix=""]) + + AC_ARG_WITH([ft-exec-prefix], + dnl don't quote AS_HELP_STRING! + AS_HELP_STRING([--with-ft-exec-prefix=PREFIX], + [Exec prefix where FreeType is installed (optional)]), + [ft_config_exec_prefix="$withval"], + [ft_config_exec_prefix=""]) + + AC_ARG_ENABLE([freetypetest], + dnl don't quote AS_HELP_STRING! + AS_HELP_STRING([--disable-freetypetest], + [Do not try to compile and run a test FreeType program]), + [], + [enable_fttest=yes]) + + if test x$ft_config_exec_prefix != x ; then + ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix" + if test x${FT2_CONFIG+set} != xset ; then + FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config + fi + fi + + if test x$ft_config_prefix != x ; then + ft_config_args="$ft_config_args --prefix=$ft_config_prefix" + if test x${FT2_CONFIG+set} != xset ; then + FT2_CONFIG=$ft_config_prefix/bin/freetype-config + fi + fi + + if test "x$FT2_CONFIG" = x ; then + AC_PATH_PROG([FT2_CONFIG], [freetype-config], [no]) + fi + + min_ft_version=m4_if([$1], [], [7.0.1], [$1]) + AC_MSG_CHECKING([for FreeType -- version >= $min_ft_version]) + no_ft="" + if test "$FT2_CONFIG" = "no" ; then + no_ft=yes + else + FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` + FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` + ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + ft_min_major_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + ft_min_minor_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + ft_min_micro_version=`echo $min_ft_version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test x$enable_fttest = xyes ; then + ft_config_is_lt="" + if test $ft_config_major_version -lt $ft_min_major_version ; then + ft_config_is_lt=yes + else + if test $ft_config_major_version -eq $ft_min_major_version ; then + if test $ft_config_minor_version -lt $ft_min_minor_version ; then + ft_config_is_lt=yes + else + if test $ft_config_minor_version -eq $ft_min_minor_version ; then + if test $ft_config_micro_version -lt $ft_min_micro_version ; then + ft_config_is_lt=yes + fi + fi + fi + fi + fi + if test x$ft_config_is_lt = xyes ; then + no_ft=yes + else + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $FT2_CFLAGS" + LIBS="$FT2_LIBS $LIBS" + + # + # Sanity checks for the results of freetype-config to some extent. + # + AC_RUN_IFELSE([ + AC_LANG_SOURCE([[ + +#include +#include FT_FREETYPE_H +#include +#include + +int +main() +{ + FT_Library library; + FT_Error error; + + error = FT_Init_FreeType(&library); + + if (error) + return 1; + else + { + FT_Done_FreeType(library); + return 0; + } +} + + ]]) + ], + [], + [no_ft=yes], + [echo $ECHO_N "cross compiling; assuming OK... $ECHO_C"]) + + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi # test $ft_config_version -lt $ft_min_version + fi # test x$enable_fttest = xyes + fi # test "$FT2_CONFIG" = "no" + + if test x$no_ft = x ; then + AC_MSG_RESULT([yes]) + m4_if([$2], [], [:], [$2]) + else + AC_MSG_RESULT([no]) + if test "$FT2_CONFIG" = "no" ; then + AC_MSG_WARN([ + + The freetype-config script installed by FreeType 2 could not be found. + If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in + your path, or set the FT2_CONFIG environment variable to the + full path to freetype-config. + ]) + else + if test x$ft_config_is_lt = xyes ; then + AC_MSG_WARN([ + + Your installed version of the FreeType 2 library is too old. + If you have different versions of FreeType 2, make sure that + correct values for --with-ft-prefix or --with-ft-exec-prefix + are used, or set the FT2_CONFIG environment variable to the + full path to freetype-config. + ]) + else + AC_MSG_WARN([ + + The FreeType test program failed to run. If your system uses + shared libraries and they are installed outside the normal + system library path, make sure the variable LD_LIBRARY_PATH + (or whatever is appropriate for your system) is correctly set. + ]) + fi + fi + + FT2_CFLAGS="" + FT2_LIBS="" + m4_if([$3], [], [:], [$3]) + fi + + AC_SUBST([FT2_CFLAGS]) + AC_SUBST([FT2_LIBS])]) + +# end of freetype2.m4 diff --git a/alienblaster/project/jni/freetype/builds/unix/ft-munmap.m4 b/alienblaster/project/jni/freetype/builds/unix/ft-munmap.m4 new file mode 100644 index 000000000..68b3361e2 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/ft-munmap.m4 @@ -0,0 +1,32 @@ +## FreeType specific autoconf tests +# +# Copyright 2002, 2003, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# serial 2 + +AC_DEFUN([FT_MUNMAP_PARAM], + [AC_MSG_CHECKING([for munmap's first parameter type]) + AC_COMPILE_IFELSE([ + AC_LANG_SOURCE([[ + +#include +#include +int munmap(void *, size_t); + + ]]) + ], + [AC_MSG_RESULT([void *]) + AC_DEFINE([MUNMAP_USES_VOIDP], + [], + [Define to 1 if the first argument of munmap is of type void *])], + [AC_MSG_RESULT([char *])]) + ]) + +# end of ft-munmap.m4 diff --git a/alienblaster/project/jni/freetype/builds/unix/ft2unix.h b/alienblaster/project/jni/freetype/builds/unix/ft2unix.h new file mode 100644 index 000000000..6a3b8d90e --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/ft2unix.h @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is a Unix-specific version of that should be used */ + /* exclusively *after* installation of the library. */ + /* */ + /* It assumes that `/usr/local/include/freetype2' (or whatever is */ + /* returned by the `freetype-config --cflags' or `pkg-config --cflags' */ + /* command) is in your compilation include path. */ + /* */ + /* We don't need to do anything special in this release. However, for */ + /* a future FreeType 2 release, the following installation changes will */ + /* be performed: */ + /* */ + /* - The contents of `freetype-2.x/include/freetype' will be installed */ + /* to `/usr/local/include/freetype2' instead of */ + /* `/usr/local/include/freetype2/freetype'. */ + /* */ + /* - This file will #include , instead */ + /* of . */ + /* */ + /* - The contents of `ftheader.h' will be processed with `sed' to */ + /* replace all `' with `'. */ + /* */ + /* - Adding `/usr/local/include/freetype2' to your compilation include */ + /* path will not be necessary anymore. */ + /* */ + /* These changes will be transparent to client applications which use */ + /* freetype-config (or pkg-config). No modifications will be necessary */ + /* to compile with the new scheme. */ + /* */ + /*************************************************************************/ + + +#ifndef __FT2_BUILD_UNIX_H__ +#define __FT2_BUILD_UNIX_H__ + + /* `/include/freetype2' must be in your current inclusion path */ +#include + +#endif /* __FT2_BUILD_UNIX_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/unix/ftconfig.in b/alienblaster/project/jni/freetype/builds/unix/ftconfig.in new file mode 100644 index 000000000..c5e4e46b4 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/ftconfig.in @@ -0,0 +1,476 @@ +/***************************************************************************/ +/* */ +/* ftconfig.in */ +/* */ +/* UNIX-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + +#undef HAVE_UNISTD_H +#undef HAVE_FCNTL_H +#undef HAVE_STDINT_H + + + /* There are systems (like the Texas Instruments 'C54x) where a `char' */ + /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ + /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ + /* `char' type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + +#undef FT_USE_AUTOCONF_SIZEOF_TYPES +#ifdef FT_USE_AUTOCONF_SIZEOF_TYPES + +#undef SIZEOF_INT +#undef SIZEOF_LONG +#define FT_SIZEOF_INT SIZEOF_INT +#define FT_SIZEOF_LONG SIZEOF_LONG + +#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + /* Following cpp computation of the bit length of int and long */ + /* is copied from default include/freetype/config/ftconfig.h. */ + /* If any improvement is required for this file, it should be */ + /* applied to the original header file for the builders that */ + /* does not use configure script. */ + + /* The size of an `int' type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `long' type!" +#endif + +#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */ + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /* Fix compiler warning with sgi compiler */ +#if defined( __sgi ) && !defined( __GNUC__ ) +#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 ) +#pragma set woff 3505 +#endif +#endif + + + /*************************************************************************/ + /* */ + /* IntN types */ + /* */ + /* Used to guarantee the size of some specific integers. */ + /* */ + typedef signed short FT_Int16; + typedef unsigned short FT_UInt16; + +#if FT_SIZEOF_INT == 4 + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == 4 + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == 8 */ + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */ + /* is defined. You can however ignore this rule by defining the */ + /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* Undefine the 64-bit macros in strict ANSI compilation mode. */ + /* Since `#undef' doesn't survive in configuration header files */ + /* we use the postprocessing facility of AC_CONFIG_HEADERS to */ + /* replace the leading `/' with `#'. */ +/undef FT_LONG64 +/undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + /* Provide assembler fragments for performance-critical functions. */ + /* These must be defined `static __inline__' with GCC. */ + +#ifdef __GNUC__ + +#if defined( __arm__ ) && !defined( __thumb__ ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + static __inline__ FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 t, t2; + + + __asm__ __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ + "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ + "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) ); + return a; + } + +#endif /* __arm__ && !__thumb__ */ + +#if defined( i386 ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + static __inline__ FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 result; + + + __asm__ __volatile__ ( + "imul %%edx\n" + "movl %%edx, %%ecx\n" + "sarl $31, %%ecx\n" + "addl $0x8000, %%ecx\n" + "addl %%ecx, %%eax\n" + "adcl $0, %%edx\n" + "shrl $16, %%eax\n" + "shll $16, %%edx\n" + "addl %%edx, %%eax\n" + : "=a"(result), "+d"(b) + : "a"(a) + : "%ecx" ); + return result; + } + +#endif /* i386 */ + +#endif /* __GNUC__ */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifdef FT_CONFIG_OPTION_INLINE_MULFIX +#ifdef FT_MULFIX_ASSEMBLER +#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER +#endif +#endif + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/unix/ftsystem.c b/alienblaster/project/jni/freetype/builds/unix/ftsystem.c new file mode 100644 index 000000000..95f8271ec --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/ftsystem.c @@ -0,0 +1,419 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* Unix-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include + /* we use our special ftconfig.h file, not the standard one */ +#include +#include FT_INTERNAL_DEBUG_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H +#include FT_INTERNAL_STREAM_H + + /* memory-mapping includes and definitions */ +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#ifndef MAP_FILE +#define MAP_FILE 0x00 +#endif + +#ifdef MUNMAP_USES_VOIDP +#define MUNMAP_ARG_CAST void * +#else +#define MUNMAP_ARG_CAST char * +#endif + +#ifdef NEED_MUNMAP_DECL + +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int + munmap( char* addr, + int len ); + +#define MUNMAP_ARG_CAST char * + +#endif /* NEED_DECLARATION_MUNMAP */ + + +#include +#include + +#ifdef HAVE_FCNTL_H +#include +#endif + +#include +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_alloc */ + /* */ + /* */ + /* The memory allocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return malloc( size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_realloc */ + /* */ + /* */ + /* The memory reallocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return realloc( block, new_size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_free */ + /* */ + /* */ + /* The memory release function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + free( block ); + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* */ + /* ft_close_stream_by_munmap */ + /* */ + /* */ + /* The function to close a stream which is opened by mmap. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_close_stream_by_munmap( FT_Stream stream ) + { + munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_close_stream_by_free */ + /* */ + /* */ + /* The function to close a stream which is created by ft_alloc. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_close_stream_by_free( FT_Stream stream ) + { + ft_free( NULL, stream->descriptor.pointer ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + int file; + struct stat stat_buf; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + + /* open the file */ + file = open( filepathname, O_RDONLY ); + if ( file < 0 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + return FT_Err_Cannot_Open_Resource; + } + + /* Here we ensure that a "fork" will _not_ duplicate */ + /* our opened input streams on Unix. This is critical */ + /* since it avoids some (possible) access control */ + /* issues and cleans up the kernel file table a bit. */ + /* */ +#ifdef F_SETFD +#ifdef FD_CLOEXEC + (void)fcntl( file, F_SETFD, FD_CLOEXEC ); +#else + (void)fcntl( file, F_SETFD, 1 ); +#endif /* FD_CLOEXEC */ +#endif /* F_SETFD */ + + if ( fstat( file, &stat_buf ) < 0 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `fstat' file `%s'\n", filepathname )); + goto Fail_Map; + } + + /* XXX: TODO -- real 64bit platform support */ + /* */ + /* `stream->size' is typedef'd to unsigned long (in */ + /* freetype/ftsystem.h); `stat_buf.st_size', however, is usually */ + /* typedef'd to off_t (in sys/stat.h). */ + /* On some platforms, the former is 32bit and the latter is 64bit. */ + /* To avoid overflow caused by fonts in huge files larger than */ + /* 2GB, do a test. Temporary fix proposed by Sean McBride. */ + /* */ + if ( stat_buf.st_size > LONG_MAX ) + { + FT_ERROR(( "FT_Stream_Open: file is too big\n" )); + goto Fail_Map; + } + else if ( stat_buf.st_size == 0 ) + { + FT_ERROR(( "FT_Stream_Open: zero-length file\n" )); + goto Fail_Map; + } + + /* This cast potentially truncates a 64bit to 32bit! */ + stream->size = (unsigned long)stat_buf.st_size; + stream->pos = 0; + stream->base = (unsigned char *)mmap( NULL, + stream->size, + PROT_READ, + MAP_FILE | MAP_PRIVATE, + file, + 0 ); + + /* on some RTOS, mmap might return 0 */ + if ( (long)stream->base != -1 && stream->base != NULL ) + stream->close = ft_close_stream_by_munmap; + else + { + ssize_t total_read_count; + + + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); + + stream->base = (unsigned char*)ft_alloc( NULL, stream->size ); + + if ( !stream->base ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `alloc' memory\n" )); + goto Fail_Map; + } + + total_read_count = 0; + do { + ssize_t read_count; + + + read_count = read( file, + stream->base + total_read_count, + stream->size - total_read_count ); + + if ( read_count <= 0 ) + { + if ( read_count == -1 && errno == EINTR ) + continue; + + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " error while `read'ing file `%s'\n", filepathname )); + goto Fail_Read; + } + + total_read_count += read_count; + + } while ( (unsigned long)total_read_count != stream->size ); + + stream->close = ft_close_stream_by_free; + } + + close( file ); + + stream->descriptor.pointer = stream->base; + stream->pathname.pointer = (char*)filepathname; + + stream->read = 0; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + + Fail_Read: + ft_free( NULL, stream->base ); + + Fail_Map: + close( file ); + + stream->base = NULL; + stream->size = 0; + stream->pos = 0; + + return FT_Err_Cannot_Open_Stream; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)malloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = 0; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + memory->free( memory, memory ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/unix/install-sh b/alienblaster/project/jni/freetype/builds/unix/install-sh new file mode 100755 index 000000000..6781b987b --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/alienblaster/project/jni/freetype/builds/unix/install.mk b/alienblaster/project/jni/freetype/builds/unix/install.mk new file mode 100644 index 000000000..2e5ef080e --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/install.mk @@ -0,0 +1,97 @@ +# +# FreeType 2 installation instructions for Unix systems +# + + +# Copyright 1996-2000, 2002, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# If you say +# +# make install DESTDIR=/tmp/somewhere/ +# +# don't forget the final backslash (this command is mainly for package +# maintainers). + + +.PHONY: install uninstall check + +# Unix installation and deinstallation targets. +# +# Note that we no longer install internal headers, and we remove any +# `internal' subdirectory found in `$(includedir)/freetype2/freetype'. +# +install: $(PROJECT_LIBRARY) + $(MKINSTALLDIRS) $(DESTDIR)$(libdir) \ + $(DESTDIR)$(libdir)/pkgconfig \ + $(DESTDIR)$(includedir)/freetype2/freetype/config \ + $(DESTDIR)$(includedir)/freetype2/freetype/cache \ + $(DESTDIR)$(bindir) \ + $(DESTDIR)$(datadir)/aclocal + $(LIBTOOL) --mode=install $(INSTALL) \ + $(PROJECT_LIBRARY) $(DESTDIR)$(libdir) + -for P in $(PUBLIC_H) ; do \ + $(INSTALL_DATA) \ + $$P $(DESTDIR)$(includedir)/freetype2/freetype ; \ + done + -for P in $(CONFIG_H) ; do \ + $(INSTALL_DATA) \ + $$P $(DESTDIR)$(includedir)/freetype2/freetype/config ; \ + done + -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/cache/* + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/cache + -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/internal/* + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/internal + $(INSTALL_DATA) $(BUILD_DIR)/ft2unix.h \ + $(DESTDIR)$(includedir)/ft2build.h + $(INSTALL_DATA) $(OBJ_BUILD)/ftconfig.h \ + $(DESTDIR)$(includedir)/freetype2/freetype/config/ftconfig.h + $(INSTALL_DATA) $(OBJ_DIR)/ftmodule.h \ + $(DESTDIR)$(includedir)/freetype2/freetype/config/ftmodule.h + $(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config \ + $(DESTDIR)$(bindir)/freetype-config + $(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4 \ + $(DESTDIR)$(datadir)/aclocal/freetype2.m4 + $(INSTALL_SCRIPT) -m 644 $(OBJ_BUILD)/freetype2.pc \ + $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc + + +uninstall: + -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(LIBRARY).$A + -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/config/* + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/config + -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/* + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype + -$(DELDIR) $(DESTDIR)$(includedir)/freetype2 + -$(DELETE) $(DESTDIR)$(includedir)/ft2build.h + -$(DELETE) $(DESTDIR)$(bindir)/freetype-config + -$(DELETE) $(DESTDIR)$(datadir)/aclocal/freetype2.m4 + -$(DELETE) $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc + + +check: + @echo There is no validation suite for this package. + + +.PHONY: clean_project_unix distclean_project_unix + +# Unix cleaning and distclean rules. +# +clean_project_unix: + -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) + -$(DELETE) $(patsubst %.$O,%.$(SO),$(BASE_OBJECTS) $(OBJ_M) $(OBJ_S)) \ + $(CLEAN) + +distclean_project_unix: clean_project_unix + -$(DELETE) $(PROJECT_LIBRARY) + -$(DELETE) $(OBJ_DIR)/.libs/* + -$(DELDIR) $(OBJ_DIR)/.libs + -$(DELETE) *.orig *~ core *.core $(DISTCLEAN) + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/mkinstalldirs b/alienblaster/project/jni/freetype/builds/unix/mkinstalldirs new file mode 100755 index 000000000..ef7e16fda --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/mkinstalldirs @@ -0,0 +1,161 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2006-05-11.19 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' +IFS=" "" $nl" +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/alienblaster/project/jni/freetype/builds/unix/unix-cc.in b/alienblaster/project/jni/freetype/builds/unix/unix-cc.in new file mode 100644 index 000000000..9c6d5de6e --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/unix-cc.in @@ -0,0 +1,113 @@ +# +# FreeType 2 template for Unix-specific compiler definitions +# + +# Copyright 1996-2000, 2002, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CC := @CC@ +COMPILER_SEP := $(SEP) + +LIBTOOL ?= $(BUILD_DIR)/libtool + + +# The object file extension (for standard and static libraries). This can be +# .o, .tco, .obj, etc., depending on the platform. +# +O := lo +SO := o + + +# The executable file extension. Although most Unix platforms use no +# extension, we copy the extension detected by autoconf. Useful for cross +# building on Unix systems for non-Unix systems. +# +E := @EXEEXT@ + + +# The library file extension (for standard and static libraries). This can +# be .a, .lib, etc., depending on the platform. +# +A := la +SA := a + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := lib$(PROJECT) + + +# Path inclusion flag. Some compilers use a different flag than `-I' to +# specify an additional include path. Examples are `/i=' or `-J'. +# +I := -I + + +# C flag used to define a macro before the compilation of a given source +# object. Usually it is `-D' like in `-DDEBUG'. +# +D := -D + + +# The link flag used to specify a given library file on link. Note that +# this is only used to compile the demo programs, not the library itself. +# +L := -l + + +# Target flag. +# +T := -o$(space) + + +# C flags +# +# These should concern: debug output, optimization & warnings. +# +# Use the ANSIFLAGS variable to define the compiler flags used to enfore +# ANSI compliance. +# +# We use our own FreeType configuration file. +# +CPPFLAGS := @CPPFLAGS@ +CFLAGS := -c @XX_CFLAGS@ @CFLAGS@ -DFT_CONFIG_CONFIG_H="" + +# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant. +# +ANSIFLAGS := @XX_ANSIFLAGS@ + +# C compiler to use -- we use libtool! +# +# +CCraw := $(CC) +CC := $(LIBTOOL) --mode=compile $(CCraw) + +# Linker flags. +# +LDFLAGS := @LDFLAGS@ + + +# export symbols +# +CCraw_build := @CC_BUILD@ # native CC of building system +E_BUILD := @EXEEXT_BUILD@ # extension for exexutable on building system +EXPORTS_LIST := $(OBJ_DIR)/ftexport.sym +CCexe := $(CCraw_build) # used to compile `apinames' only + + +# Library linking +# +LINK_LIBRARY = $(LIBTOOL) --mode=link $(CCraw) -o $@ $(OBJECTS_LIST) \ + -rpath $(libdir) -version-info $(version_info) \ + $(LDFLAGS) -no-undefined \ + # -export-symbols $(EXPORTS_LIST) + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/unix-def.in b/alienblaster/project/jni/freetype/builds/unix/unix-def.in new file mode 100644 index 000000000..e0a7a3a61 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/unix-def.in @@ -0,0 +1,85 @@ +# +# FreeType 2 configuration rules templates for Unix + configure +# + + +# Copyright 1996-2000, 2002, 2004, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +TOP_DIR := $(shell cd $(TOP_DIR); pwd) + +DELETE := @RMF@ +DELDIR := @RMDIR@ +CAT := cat +SEP := / + +# this is used for `make distclean' and `make install' +OBJ_BUILD ?= $(BUILD_DIR) + +# don't use `:=' here since the path stuff will be included after this file +# +FTSYS_SRC = @FTSYS_SRC@ + +INSTALL := @INSTALL@ +INSTALL_DATA := @INSTALL_DATA@ +INSTALL_PROGRAM := @INSTALL_PROGRAM@ +INSTALL_SCRIPT := @INSTALL_SCRIPT@ +MKINSTALLDIRS := $(BUILD_DIR)/mkinstalldirs + +DISTCLEAN += $(OBJ_BUILD)/config.cache \ + $(OBJ_BUILD)/config.log \ + $(OBJ_BUILD)/config.status \ + $(OBJ_BUILD)/unix-def.mk \ + $(OBJ_BUILD)/unix-cc.mk \ + $(OBJ_BUILD)/ftconfig.h \ + $(OBJ_BUILD)/freetype-config \ + $(OBJ_BUILD)/freetype2.pc \ + $(LIBTOOL) \ + $(OBJ_BUILD)/Makefile + + +# Standard installation variables. +# +prefix := @prefix@ +exec_prefix := @exec_prefix@ +libdir := @libdir@ +bindir := @bindir@ +includedir := @includedir@ +datarootdir := @datarootdir@ +datadir := @datadir@ + +version_info := @version_info@ + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + +# The BASE_SRC macro lists all source files that should be included in +# src/base/ftbase.c. When configure sets up CFLAGS to build ftmac.c, +# ftmac.c should be added to BASE_SRC. +ftmac_c := @ftmac_c@ + +# The SYSTEM_ZLIB macro is defined if the user wishes to link dynamically +# with its system wide zlib. If SYSTEM_ZLIB is 'yes', the zlib part of the +# ftgzip module is not compiled in. +SYSTEM_ZLIB := @SYSTEM_ZLIB@ + + +# The NO_OUTPUT macro is appended to command lines in order to ignore +# the output of some programs. +# +NO_OUTPUT := 2> /dev/null + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/unix-dev.mk b/alienblaster/project/jni/freetype/builds/unix/unix-dev.mk new file mode 100644 index 000000000..76bae3862 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/unix-dev.mk @@ -0,0 +1,26 @@ +# +# FreeType 2 Configuration rules for Unix + GCC +# +# Development version without optimizations & libtool +# and no installation. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DEVEL_DIR := $(TOP_DIR)/devel + +include $(TOP_DIR)/builds/unix/unixddef.mk +include $(TOP_DIR)/builds/compiler/gcc-dev.mk +include $(TOP_DIR)/builds/link_std.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/unix-lcc.mk b/alienblaster/project/jni/freetype/builds/unix/unix-lcc.mk new file mode 100644 index 000000000..6038e5239 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/unix-lcc.mk @@ -0,0 +1,24 @@ +# +# FreeType 2 Configuration rules for Unix + LCC +# +# Development version without optimizations & libtool +# and no installation. +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +include $(TOP_DIR)/builds/unix/unixddef.mk +include $(TOP_DIR)/builds/compiler/unix-lcc.mk +include $(TOP_DIR)/builds/link_std.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/unix.mk b/alienblaster/project/jni/freetype/builds/unix/unix.mk new file mode 100644 index 000000000..7f9d9a34f --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/unix.mk @@ -0,0 +1,62 @@ +# +# FreeType 2 configuration rules for UNIX platforms +# + + +# Copyright 1996-2000, 2002, 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# We need these declarations here since unix-def.mk is a generated file. +BUILD_DIR := $(TOP_DIR)/builds/unix +PLATFORM := unix + +have_mk := $(wildcard $(OBJ_DIR)/unix-def.mk) +ifneq ($(have_mk),) + # We are building FreeType 2 not in the src tree. + include $(OBJ_DIR)/unix-def.mk + include $(OBJ_DIR)/unix-cc.mk +else + include $(BUILD_DIR)/unix-def.mk + include $(BUILD_DIR)/unix-cc.mk +endif + +ifdef BUILD_PROJECT + + .PHONY: clean_project distclean_project + + # Now include the main sub-makefile. It contains all the rules used to + # build the library with the previous variables defined. + # + include $(TOP_DIR)/builds/$(PROJECT).mk + + + # The cleanup targets. + # + clean_project: clean_project_unix + distclean_project: distclean_project_unix + + + # This final rule is used to link all object files into a single library. + # It is part of the system-specific sub-Makefile because not all + # librarians accept a simple syntax like + # + # librarian library_file {list of object files} + # + $(PROJECT_LIBRARY): $(OBJECTS_LIST) + ifdef CLEAN_LIBRARY + -$(CLEAN_LIBRARY) $(NO_OUTPUT) + endif + $(LINK_LIBRARY) + + include $(TOP_DIR)/builds/unix/install.mk + +endif + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/unix/unixddef.mk b/alienblaster/project/jni/freetype/builds/unix/unixddef.mk new file mode 100644 index 000000000..130d6b0f6 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/unix/unixddef.mk @@ -0,0 +1,45 @@ +# +# FreeType 2 configuration rules templates for +# development under Unix with no configure script (gcc only) +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +TOP_DIR := $(shell cd $(TOP_DIR); pwd) +OBJ_DIR := $(shell cd $(OBJ_DIR); pwd) + +PLATFORM := unix + +DELETE := rm -f +CAT := cat +SEP := / + +# we use a special devel ftoption.h +DEVEL_DIR := $(TOP_DIR)/devel + + +# library file name +# +LIBRARY := lib$(PROJECT) + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +NO_OUTPUT := 2> /dev/null + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/vms/ftconfig.h b/alienblaster/project/jni/freetype/builds/vms/ftconfig.h new file mode 100644 index 000000000..1659d039e --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/vms/ftconfig.h @@ -0,0 +1,346 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* VMS-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + + + /* Include the header file containing all developer build options */ +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + +#define HAVE_UNISTD_H 1 +#define HAVE_FCNTL_H 1 + +#define SIZEOF_INT 4 +#define SIZEOF_LONG 4 + +#define FT_SIZEOF_INT 4 +#define FT_SIZEOF_LONG 4 + +#define FT_CHAR_BIT 8 + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /*************************************************************************/ + /* */ + /* IntN types */ + /* */ + /* Used to guarantee the size of some specific integers. */ + /* */ + typedef signed short FT_Int16; + typedef unsigned short FT_UInt16; + +#if FT_SIZEOF_INT == 4 + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == 4 + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= 4 + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= 4 + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == 8 + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == 8 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable their use if */ + /* __STDC__ is defined. You can however ignore this rule by */ + /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* undefine the 64-bit macros in strict ANSI compilation mode */ +#undef FT_LONG64 +#undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) extern "C" x +#else +#define FT_BASE_DEF( x ) extern x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/vms/ftsystem.c b/alienblaster/project/jni/freetype/builds/vms/ftsystem.c new file mode 100644 index 000000000..76bfae9f4 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/vms/ftsystem.c @@ -0,0 +1,321 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* VMS-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include + /* we use our special ftconfig.h file, not the standard one */ +#include +#include FT_INTERNAL_DEBUG_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H +#include FT_INTERNAL_OBJECTS_H + + /* memory-mapping includes and definitions */ +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#ifndef MAP_FILE +#define MAP_FILE 0x00 +#endif + +#ifdef MUNMAP_USES_VOIDP +#define MUNMAP_ARG_CAST void * +#else +#define MUNMAP_ARG_CAST char * +#endif + +#ifdef NEED_MUNMAP_DECL + +#ifdef __cplusplus + extern "C" +#else + extern +#endif + int + munmap( char* addr, + int len ); + +#define MUNMAP_ARG_CAST char * + +#endif /* NEED_DECLARATION_MUNMAP */ + + +#include +#include + +#ifdef HAVE_FCNTL_H +#include +#endif + +#include +#include +#include + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_alloc */ + /* */ + /* */ + /* The memory allocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return malloc( size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_realloc */ + /* */ + /* */ + /* The memory reallocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return realloc( block, new_size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_free */ + /* */ + /* */ + /* The memory release function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + free( block ); + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FILE*)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* */ + /* ft_close_stream */ + /* */ + /* */ + /* The function to close a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_close_stream( FT_Stream stream ) + { + munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + int file; + struct stat stat_buf; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + + /* open the file */ + file = open( filepathname, O_RDONLY ); + if ( file < 0 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not open `%s'\n", filepathname )); + return FT_Err_Cannot_Open_Resource; + } + + if ( fstat( file, &stat_buf ) < 0 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `fstat' file `%s'\n", filepathname )); + goto Fail_Map; + } + + stream->size = stat_buf.st_size; + stream->pos = 0; + stream->base = (unsigned char *)mmap( NULL, + stream->size, + PROT_READ, + MAP_FILE | MAP_PRIVATE, + file, + 0 ); + + if ( (long)stream->base == -1 ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " could not `mmap' file `%s'\n", filepathname )); + goto Fail_Map; + } + + close( file ); + + stream->descriptor.pointer = stream->base; + stream->pathname.pointer = (char*)filepathname; + + stream->close = ft_close_stream; + stream->read = 0; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + + Fail_Map: + close( file ); + + stream->base = NULL; + stream->size = 0; + stream->pos = 0; + + return FT_Err_Cannot_Open_Stream; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)malloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = 0; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + memory->free( memory, memory ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/win32/detect.mk b/alienblaster/project/jni/freetype/builds/win32/detect.mk new file mode 100644 index 000000000..190653960 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/detect.mk @@ -0,0 +1,183 @@ +# +# FreeType 2 configuration file to detect a Win32 host platform. +# + + +# Copyright 1996-2000, 2003, 2004, 2006, 2007 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +.PHONY: setup + + +ifeq ($(PLATFORM),ansi) + + # Detecting Windows NT is easy, as the OS variable must be defined and + # contains `Windows_NT'. This also works with Windows 2000 and XP. + # + ifeq ($(OS),Windows_NT) + + PLATFORM := win32 + + else + + # Detecting Windows 9X + + # We used to run the `ver' command to see if its output contains the + # word `Windows'. If this is true, we are running Windows 95 or later: + # + # ifdef COMSPEC + # # First, check if we have the COMSPEC environment variable, which + # # indicates we can use COMMAND.COM's internal commands + # is_windows := $(findstring Windows,$(strip $(shell ver))) + # endif + # + # Unfortunately, this also detects the case when one is running + # DOS 7.x (the MS-DOS version that lies below Windows) without actually + # launching the GUI. + # + # A better test is to check whether there are both the environment + # variables `winbootdir' and `windir'. The first indicates an + # underlying DOS 7.x, while the second is set only if win32 is available. + # + # Note that on Windows NT, such an environment variable will not be seen + # from DOS-based tools like DJGPP's make; this is not actually a problem + # since NT is detected independently above. But do not try to be clever! + # + ifdef winbootdir + ifdef windir + + PLATFORM := win32 + + endif + endif + + endif # test NT + +endif # test PLATFORM ansi + +ifeq ($(PLATFORM),win32) + + DELETE := del + CAT := type + SEP := $(BACKSLASH) + + # Setting COPY is a bit trickier. Plain COPY on NT will not work + # correctly, because it will uppercase 8.3 filenames, creating a + # `CONFIG.MK' file which isn't found later on by `make'. + # Since we do not want that, we need to force execution of CMD.EXE. + # Unfortunately, CMD.EXE is not available on Windows 9X. + # So we need to hack. + # + # Kudos to Eli Zaretskii (DJGPP guru) that helped debug it. + # Details are available in threads of the freetype mailing list + # (2004-11-11), and then in the devel mailing list (2004-11-20 to -23). + # + ifeq ($(OS),Windows_NT) + COPY := cmd.exe /c copy + else + COPY := copy + endif # test NT + + + # gcc Makefile by default + CONFIG_FILE := w32-gcc.mk + ifeq ($(firstword $(CC)),cc) + CC := gcc + endif + + ifneq ($(findstring list,$(MAKECMDGOALS)),) # test for the "list" target + dump_target_list: + @echo ÿ + @echo $(PROJECT_TITLE) build system -- supported compilers + @echo ÿ + @echo Several command-line compilers are supported on Win32: + @echo ÿ + @echo ÿÿmake setupÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgcc (with Mingw) + @echo ÿÿmake setup visualcÿÿÿÿÿÿÿÿÿÿÿÿÿMicrosoft Visual C++ + @echo ÿÿmake setup bcc32ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBorland C/C++ + @echo ÿÿmake setup lccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWin32-LCC + @echo ÿÿmake setup intelcÿÿÿÿÿÿÿÿÿÿÿÿÿÿIntel C/C++ + @echo ÿ + + setup: dump_target_list + .PHONY: dump_target_list list + else + setup: dos_setup + endif + + # additionally, we provide hooks for various other compilers + # + ifneq ($(findstring visualc,$(MAKECMDGOALS)),) # Visual C/C++ + CONFIG_FILE := w32-vcc.mk + CC := cl + visualc: setup + .PHONY: visualc + endif + + ifneq ($(findstring intelc,$(MAKECMDGOALS)),) # Intel C/C++ + CONFIG_FILE := w32-intl.mk + CC := cl + visualc: setup + .PHONY: intelc + endif + + ifneq ($(findstring watcom,$(MAKECMDGOALS)),) # Watcom C/C++ + CONFIG_FILE := w32-wat.mk + CC := wcc386 + watcom: setup + .PHONY: watcom + endif + + ifneq ($(findstring visualage,$(MAKECMDGOALS)),) # Visual Age C++ + CONFIG_FILE := w32-icc.mk + CC := icc + visualage: setup + .PHONY: visualage + endif + + ifneq ($(findstring lcc,$(MAKECMDGOALS)),) # LCC-Win32 + CONFIG_FILE := w32-lcc.mk + CC := lcc + lcc: setup + .PHONY: lcc + endif + + ifneq ($(findstring mingw32,$(MAKECMDGOALS)),) # mingw32 + CONFIG_FILE := w32-mingw32.mk + CC := gcc + mingw32: setup + .PHONY: mingw32 + endif + + ifneq ($(findstring bcc32,$(MAKECMDGOALS)),) # Borland C++ + CONFIG_FILE := w32-bcc.mk + CC := bcc32 + bcc32: setup + .PHONY: bcc32 + endif + + ifneq ($(findstring devel-bcc,$(MAKECMDGOALS)),) # development target + CONFIG_FILE := w32-bccd.mk + CC := bcc32 + devel-bcc: setup + .PHONY: devel-bcc + endif + + ifneq ($(findstring devel-gcc,$(MAKECMDGOALS)),) # development target + CONFIG_FILE := w32-dev.mk + CC := gcc + devel-gcc: setup + .PHONY: devel-gcc + endif + +endif # test PLATFORM win32 + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/ftdebug.c b/alienblaster/project/jni/freetype/builds/win32/ftdebug.c new file mode 100644 index 000000000..d1ca15ac9 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/ftdebug.c @@ -0,0 +1,214 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component for Win32 (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + + +#ifdef FT_DEBUG_LEVEL_ERROR + + +#include +#include +#include + +#include + + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + static char buf[8192]; + va_list ap; + + + va_start( ap, fmt ); + vprintf( fmt, ap ); + /* send the string to the debugger as well */ + vsprintf( buf, fmt, ap ); + OutputDebugStringA( buf ); + va_end( ap ); + } + + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + static char buf[8192]; + va_list ap; + + + va_start( ap, fmt ); + vsprintf( buf, fmt, ap ); + OutputDebugStringA( buf ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + + +#ifdef FT_DEBUG_LEVEL_TRACE + + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the "FT2_DEBUG" environment variable. It must be a list of */ + /* toggles, separated by spaces, `;' or `,'. Example: */ + /* */ + /* "any:3 memory:6 stream:5" */ + /* */ + /* This will request that all levels be set to 3, except the trace level */ + /* for the memory and stream components which are set to 6 and 5, */ + /* respectively. */ + /* */ + /* See the file for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 6; 0 means quiet (except for serious */ + /* runtime errors), and 6 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + const char* ft2_debug = getenv( "FT2_DEBUG" ); + + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + int n, i, len = p - q; + int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for "any" */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/win32/vc2005/freetype.sln b/alienblaster/project/jni/freetype/builds/win32/vc2005/freetype.sln new file mode 100644 index 000000000..ec3345d18 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/vc2005/freetype.sln @@ -0,0 +1,31 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + LIB Debug Multithreaded|Win32 = LIB Debug Multithreaded|Win32 + LIB Debug Singlethreaded|Win32 = LIB Debug Singlethreaded|Win32 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Release Multithreaded|Win32 = LIB Release Multithreaded|Win32 + LIB Release Singlethreaded|Win32 = LIB Release Singlethreaded|Win32 + LIB Release|Win32 = LIB Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.ActiveCfg = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.Build.0 = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/alienblaster/project/jni/freetype/builds/win32/vc2005/freetype.vcproj b/alienblaster/project/jni/freetype/builds/win32/vc2005/freetype.vcproj new file mode 100644 index 000000000..3df9fdad5 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/vc2005/freetype.vcproj @@ -0,0 +1,644 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/alienblaster/project/jni/freetype/builds/win32/vc2005/index.html b/alienblaster/project/jni/freetype/builds/win32/vc2005/index.html new file mode 100644 index 000000000..777388228 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/vc2005/index.html @@ -0,0 +1,37 @@ + +
      + + FreeType 2 Project Files for VS.NET 2005 + + + +

      + FreeType 2 Project Files for VS.NET 2005 +

      + +

      This directory contains project files for Visual C++, named +freetype.vcproj, and Visual Studio, called freetype.sln. It +compiles the following libraries from the FreeType 2.3.12 sources:

      + +
        +
        +    freetype2312.lib     - release build; single threaded
        +    freetype2312_D.lib   - debug build;   single threaded
        +    freetype2312MT.lib   - release build; multi-threaded
        +    freetype2312MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/alienblaster/project/jni/freetype/builds/win32/vc2008/freetype.sln b/alienblaster/project/jni/freetype/builds/win32/vc2008/freetype.sln new file mode 100644 index 000000000..6c522f943 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/vc2008/freetype.sln @@ -0,0 +1,31 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + LIB Debug Multithreaded|Win32 = LIB Debug Multithreaded|Win32 + LIB Debug Singlethreaded|Win32 = LIB Debug Singlethreaded|Win32 + LIB Debug|Win32 = LIB Debug|Win32 + LIB Release Multithreaded|Win32 = LIB Release Multithreaded|Win32 + LIB Release Singlethreaded|Win32 = LIB Release Singlethreaded|Win32 + LIB Release|Win32 = LIB Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.ActiveCfg = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.Build.0 = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/alienblaster/project/jni/freetype/builds/win32/vc2008/freetype.vcproj b/alienblaster/project/jni/freetype/builds/win32/vc2008/freetype.vcproj new file mode 100644 index 000000000..57d0bd3f5 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/vc2008/freetype.vcproj @@ -0,0 +1,2176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/alienblaster/project/jni/freetype/builds/win32/vc2008/index.html b/alienblaster/project/jni/freetype/builds/win32/vc2008/index.html new file mode 100644 index 000000000..aa16c384c --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/vc2008/index.html @@ -0,0 +1,37 @@ + +
      + + FreeType 2 Project Files for VS.NET 2008 + + + +

      + FreeType 2 Project Files for VS.NET 2008 +

      + +

      This directory contains project files for Visual C++, named +freetype.vcproj, and Visual Studio, called freetype.sln. It +compiles the following libraries from the FreeType 2.3.12 sources:

      + +
        +
        +    freetype2312.lib     - release build; single threaded
        +    freetype2312_D.lib   - debug build;   single threaded
        +    freetype2312MT.lib   - release build; multi-threaded
        +    freetype2312MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.dsp b/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.dsp new file mode 100644 index 000000000..31046c752 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.dsp @@ -0,0 +1,400 @@ +# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=freetype - Win32 Debug Singlethreaded +!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 Singlethreaded" +!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 "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.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 "..\..\..\objs\release" +# PROP Intermediate_Dir "..\..\..\objs\release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /MD /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312.lib" + +!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 "..\..\..\objs\debug" +# PROP Intermediate_Dir "..\..\..\objs\debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /MDd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312_D.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Debug Multithreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\objs\debug_mt" +# PROP Intermediate_Dir "..\..\..\objs\debug_mt" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c +# SUBTRACT BASE CPP /X +# ADD CPP /MTd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"lib\freetype2312_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312MT_D.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Release Multithreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\objs\release_mt" +# PROP Intermediate_Dir "..\..\..\objs\release_mt" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\freetype\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c +# ADD CPP /MT /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"lib\freetype2312.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312MT.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Release Singlethreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\objs\release_st" +# PROP Intermediate_Dir "..\..\..\objs\release_st" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype2312.lib" +# ADD LIB32 /out:"..\..\..\objs\freetype2312ST.lib" +# SUBTRACT LIB32 /nologo + +!ELSEIF "$(CFG)" == "freetype - Win32 Debug Singlethreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\objs\debug_st" +# PROP Intermediate_Dir "..\..\..\objs\debug_st" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c +# SUBTRACT BASE CPP /X /YX +# ADD CPP /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype2312_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312ST_D.lib" + +!ENDIF + +# Begin Target + +# Name "freetype - Win32 Release" +# Name "freetype - Win32 Debug" +# Name "freetype - Win32 Debug Multithreaded" +# Name "freetype - Win32 Release Multithreaded" +# Name "freetype - Win32 Release Singlethreaded" +# Name "freetype - Win32 Debug Singlethreaded" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\..\src\autofit\autofit.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\bdf\bdf.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cff\cff.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbase.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbbox.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbdf.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbitmap.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftfstype.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftgasp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cache\ftcache.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\ftdebug.c +# ADD CPP /Ze +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftglyph.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftgxval.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\gzip\ftgzip.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftinit.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\lzw\ftlzw.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftmm.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftotval.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftpfr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftstroke.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftsynth.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftsystem.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\fttype1.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftwinfnt.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftxf86.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pcf\pcf.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pfr\pfr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\psaux\psaux.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pshinter\pshinter.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\psnames\psmodule.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\raster\raster.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\sfnt\sfnt.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\smooth\smooth.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\truetype\truetype.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\type1\type1.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cid\type1cid.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\type42\type42.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\winfonts\winfnt.c +# SUBTRACT CPP /Fr +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\..\include\ft2build.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftconfig.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftheader.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftmodule.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftoption.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftstdlib.h +# End Source File +# End Group +# End Target +# End Project diff --git a/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.dsw b/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.dsw new file mode 100644 index 000000000..b149e769b --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.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/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.sln b/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.sln new file mode 100644 index 000000000..1f64be282 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.sln @@ -0,0 +1,31 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Multithreaded|Win32 = Debug Multithreaded|Win32 + Debug Singlethreaded|Win32 = Debug Singlethreaded|Win32 + Debug|Win32 = Debug|Win32 + Release Multithreaded|Win32 = Release Multithreaded|Win32 + Release Singlethreaded|Win32 = Release Singlethreaded|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32 + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.vcproj b/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.vcproj new file mode 100644 index 000000000..98fd29533 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualc/freetype.vcproj @@ -0,0 +1,2175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/alienblaster/project/jni/freetype/builds/win32/visualc/index.html b/alienblaster/project/jni/freetype/builds/win32/visualc/index.html new file mode 100644 index 000000000..eaf3a5c5b --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualc/index.html @@ -0,0 +1,37 @@ + +
      + + FreeType 2 Project Files for Visual C++ and VS.NET 2005 + + + +

      + FreeType 2 Project Files for Visual C++ and VS.NET 2005 +

      + +

      This directory contains project files for Visual C++, named +freetype.dsp, and Visual Studio, called freetype.sln. It +compiles the following libraries from the FreeType 2.3.12 sources:

      + +
        +
        +    freetype2312.lib     - release build; single threaded
        +    freetype2312_D.lib   - debug build;   single threaded
        +    freetype2312MT.lib   - release build; multi-threaded
        +    freetype2312MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.dsp b/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.dsp new file mode 100644 index 000000000..31046c752 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.dsp @@ -0,0 +1,400 @@ +# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=freetype - Win32 Debug Singlethreaded +!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 Singlethreaded" +!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 "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library") +!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.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 "..\..\..\objs\release" +# PROP Intermediate_Dir "..\..\..\objs\release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /MD /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312.lib" + +!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 "..\..\..\objs\debug" +# PROP Intermediate_Dir "..\..\..\objs\debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /MDd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312_D.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Debug Multithreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\objs\debug_mt" +# PROP Intermediate_Dir "..\..\..\objs\debug_mt" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c +# SUBTRACT BASE CPP /X +# ADD CPP /MTd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"lib\freetype2312_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312MT_D.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Release Multithreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\objs\release_mt" +# PROP Intermediate_Dir "..\..\..\objs\release_mt" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\freetype\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c +# ADD CPP /MT /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"lib\freetype2312.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312MT.lib" + +!ELSEIF "$(CFG)" == "freetype - Win32 Release Singlethreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\..\objs\release_st" +# PROP Intermediate_Dir "..\..\..\objs\release_st" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c +# SUBTRACT BASE CPP /YX +# ADD CPP /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c +# SUBTRACT CPP /nologo /Z /YX +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype2312.lib" +# ADD LIB32 /out:"..\..\..\objs\freetype2312ST.lib" +# SUBTRACT LIB32 /nologo + +!ELSEIF "$(CFG)" == "freetype - Win32 Debug Singlethreaded" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded" +# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\..\objs\debug_st" +# PROP Intermediate_Dir "..\..\..\objs\debug_st" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c +# SUBTRACT BASE CPP /X /YX +# ADD CPP /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c +# SUBTRACT CPP /nologo /X /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype2312_D.lib" +# ADD LIB32 /nologo /out:"..\..\..\objs\freetype2312ST_D.lib" + +!ENDIF + +# Begin Target + +# Name "freetype - Win32 Release" +# Name "freetype - Win32 Debug" +# Name "freetype - Win32 Debug Multithreaded" +# Name "freetype - Win32 Release Multithreaded" +# Name "freetype - Win32 Release Singlethreaded" +# Name "freetype - Win32 Debug Singlethreaded" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\..\..\src\autofit\autofit.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\bdf\bdf.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cff\cff.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbase.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbbox.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbdf.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftbitmap.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftfstype.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftgasp.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cache\ftcache.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\ftdebug.c +# ADD CPP /Ze +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftglyph.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftgxval.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\gzip\ftgzip.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftinit.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\lzw\ftlzw.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftmm.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftotval.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftpfr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftstroke.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftsynth.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftsystem.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\fttype1.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftwinfnt.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\base\ftxf86.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pcf\pcf.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pfr\pfr.c +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\psaux\psaux.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\pshinter\pshinter.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\psnames\psmodule.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\raster\raster.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\sfnt\sfnt.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\smooth\smooth.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\truetype\truetype.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\type1\type1.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\cid\type1cid.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\type42\type42.c +# SUBTRACT CPP /Fr +# End Source File +# Begin Source File + +SOURCE=..\..\..\src\winfonts\winfnt.c +# SUBTRACT CPP /Fr +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\..\..\include\ft2build.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftconfig.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftheader.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftmodule.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftoption.h +# End Source File +# Begin Source File + +SOURCE=..\..\..\include\freetype\config\ftstdlib.h +# End Source File +# End Group +# End Target +# End Project diff --git a/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.dsw b/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.dsw new file mode 100644 index 000000000..b149e769b --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.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/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.vcproj b/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.vcproj new file mode 100644 index 000000000..49fb23b4c --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualce/freetype.vcproj @@ -0,0 +1,13881 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/alienblaster/project/jni/freetype/builds/win32/visualce/index.html b/alienblaster/project/jni/freetype/builds/win32/visualce/index.html new file mode 100644 index 000000000..f4ac4945c --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/visualce/index.html @@ -0,0 +1,47 @@ + +
      + + FreeType 2 Project Files for Visual C++ and VS.NET 2005 + (Pocket PC) + + + +

      + FreeType 2 Project Files for Visual C++ and VS.NET 2005 + (Pocket PC) +

      + +

      This directory contains project files for Visual C++, named +freetype.dsp, and Visual Studio, called freetype.sln for +the following targets: + +

        +
      • PPC/SP 2003 (Pocket PC 2003)
      • +
      • PPC/SP WM5 (Windows Mobile 5)
      • +
      • PPC/SP WM6 (Windows Mobile 6)
      • +
      + +It compiles the following libraries from the FreeType 2.3.12 sources:

      + +
        +
        +    freetype2312.lib     - release build; single threaded
        +    freetype2312_D.lib   - debug build;   single threaded
        +    freetype2312MT.lib   - release build; multi-threaded
        +    freetype2312MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-bcc.mk b/alienblaster/project/jni/freetype/builds/win32/w32-bcc.mk new file mode 100644 index 000000000..a9f48fc60 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-bcc.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 Borland C++ on Win32 +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -wB + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/bcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-bccd.mk b/alienblaster/project/jni/freetype/builds/win32/w32-bccd.mk new file mode 100644 index 000000000..51b15d903 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-bccd.mk @@ -0,0 +1,26 @@ +# +# FreeType 2 Borland C++ on Win32 + debugging +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DEVEL_DIR := $(TOP_DIR)/devel + +include $(TOP_DIR)/builds/win32/win32-def.mk + +include $(TOP_DIR)/builds/compiler/bcc-dev.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-dev.mk b/alienblaster/project/jni/freetype/builds/win32/w32-dev.mk new file mode 100644 index 000000000..00cacb0f6 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-dev.mk @@ -0,0 +1,32 @@ +# +# FreeType 2 configuration rules for Win32 + GCC +# +# Development version without optimizations. +# + + +# Copyright 1996-2000, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# NOTE: This version requires that GNU Make is invoked from the Windows +# Shell (_not_ Cygwin BASH)! +# + +DEVEL_DIR := $(TOP_DIR)/devel + +include $(TOP_DIR)/builds/win32/win32-def.mk + +include $(TOP_DIR)/builds/compiler/gcc-dev.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-gcc.mk b/alienblaster/project/jni/freetype/builds/win32/w32-gcc.mk new file mode 100644 index 000000000..580afc5c9 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-gcc.mk @@ -0,0 +1,31 @@ +# +# FreeType 2 configuration rules for Win32 + GCC +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = $(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +# include Win32-specific definitions +include $(TOP_DIR)/builds/win32/win32-def.mk + +# include gcc-specific definitions +include $(TOP_DIR)/builds/compiler/gcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-icc.mk b/alienblaster/project/jni/freetype/builds/win32/w32-icc.mk new file mode 100644 index 000000000..8819a1f49 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-icc.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 configuration rules for Win32 + IBM Visual Age C++ +# + + +# Copyright 1996-2000, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/visualage.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-intl.mk b/alienblaster/project/jni/freetype/builds/win32/w32-intl.mk new file mode 100644 index 000000000..ae62e1bcd --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-intl.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 configuration rules for Intel C/C++ on Win32 +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/intelc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-lcc.mk b/alienblaster/project/jni/freetype/builds/win32/w32-lcc.mk new file mode 100644 index 000000000..a147c4cb6 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-lcc.mk @@ -0,0 +1,24 @@ +# +# FreeType 2 configuration rules for Win32 + LCC +# + + +# Copyright 1996-2000 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +SEP := / +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/win-lcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + +# EOF + diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-mingw32.mk b/alienblaster/project/jni/freetype/builds/win32/w32-mingw32.mk new file mode 100644 index 000000000..04e9e211c --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-mingw32.mk @@ -0,0 +1,33 @@ +# +# FreeType 2 configuration rules for mingw32 +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# default definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = $(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +# include Win32-specific definitions +include $(TOP_DIR)/builds/win32/win32-def.mk + +LIBRARY := lib$(PROJECT) + +# include gcc-specific definitions +include $(TOP_DIR)/builds/compiler/gcc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-vcc.mk b/alienblaster/project/jni/freetype/builds/win32/w32-vcc.mk new file mode 100644 index 000000000..7fb879486 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-vcc.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 Visual C++ on Win32 +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# definitions of the export list +# +EXPORTS_LIST = $(OBJ_DIR)/freetype.def +EXPORTS_OPTIONS = /DEF:$(EXPORTS_LIST) +APINAMES_OPTIONS := -dfreetype.dll -w + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/visualc.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/w32-wat.mk b/alienblaster/project/jni/freetype/builds/win32/w32-wat.mk new file mode 100644 index 000000000..820b81735 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/w32-wat.mk @@ -0,0 +1,28 @@ +# +# FreeType 2 configuration rules for Watcom C/C++ +# + + +# Copyright 1996-2000, 2003, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +# redefine export symbol definitions +# +EXPORTS_LIST = $(OBJ_DIR)/watcom-ftexports.lbc +EXPORTS_OPTIONS = -\"export @$(EXPORTS_LIST)\"- +APINAMES_OPTIONS := -wW + +include $(TOP_DIR)/builds/win32/win32-def.mk +include $(TOP_DIR)/builds/compiler/watcom.mk + +# include linking instructions +include $(TOP_DIR)/builds/link_dos.mk + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/win32/win32-def.mk b/alienblaster/project/jni/freetype/builds/win32/win32-def.mk new file mode 100644 index 000000000..e6ae31c3b --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/win32/win32-def.mk @@ -0,0 +1,47 @@ +# +# FreeType 2 Win32 specific definitions +# + + +# Copyright 1996-2000, 2003, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +DELETE := del +CAT := type +SEP := $(strip \ ) +BUILD_DIR := $(TOP_DIR)/builds/win32 +PLATFORM := win32 + +# The executable file extension (for tools). NOTE: WE INCLUDE THE DOT HERE !! +# +E := .exe +E_BUILD := .exe + + +# The directory where all library files are placed. +# +# By default, this is the same as $(OBJ_DIR); however, this can be changed +# to suit particular needs. +# +LIB_DIR := $(OBJ_DIR) + + +# The name of the final library file. Note that the DOS-specific Makefile +# uses a shorter (8.3) name. +# +LIBRARY := $(PROJECT) + + +# The NO_OUTPUT macro is used to ignore the output of commands. +# +NO_OUTPUT = 2> nul + + +# EOF diff --git a/alienblaster/project/jni/freetype/builds/wince/ftdebug.c b/alienblaster/project/jni/freetype/builds/wince/ftdebug.c new file mode 100644 index 000000000..272415d3d --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/wince/ftdebug.c @@ -0,0 +1,236 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component for WinCE (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + + +#ifdef FT_DEBUG_LEVEL_ERROR + + +#include +#include +#include + +#include + + + void + OutputDebugStringEx( const char* str ) + { + static WCHAR buf[8192]; + + + int sz = MultiByteToWideChar( CP_ACP, 0, str, -1, buf, + sizeof ( buf ) / sizeof ( *buf ) ); + if ( !sz ) + lstrcpyW( buf, L"OutputDebugStringEx: MultiByteToWideChar failed" ); + + OutputDebugStringW( buf ); + } + + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + static char buf[8192]; + va_list ap; + + + va_start( ap, fmt ); + vprintf( fmt, ap ); + /* send the string to the debugger as well */ + vsprintf( buf, fmt, ap ); + OutputDebugStringEx( buf ); + va_end( ap ); + } + + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + static char buf[8192]; + va_list ap; + + + va_start( ap, fmt ); + vsprintf( buf, fmt, ap ); + OutputDebugStringEx( buf ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + + +#ifdef FT_DEBUG_LEVEL_TRACE + + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the "FT2_DEBUG" environment variable. It must be a list of */ + /* toggles, separated by spaces, `;' or `,'. Example: */ + /* */ + /* "any:3 memory:6 stream:5" */ + /* */ + /* This will request that all levels be set to 3, except the trace level */ + /* for the memory and stream components which are set to 6 and 5, */ + /* respectively. */ + /* */ + /* See the file for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 6; 0 means quiet (except for serious */ + /* runtime errors), and 6 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* Windows Mobile doesn't have environment API: */ + /* GetEnvironmentStrings, GetEnvironmentVariable, getenv. */ + /* */ + /* FIXME!!! How to set debug mode? */ + + /* const char* ft2_debug = getenv( "FT2_DEBUG" ); */ + + const char* ft2_debug = 0; + + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + int n, i, len = p - q; + int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for "any" */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/freetype.sln b/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/freetype.sln new file mode 100644 index 000000000..76e52d8e1 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/freetype.sln @@ -0,0 +1,158 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) = LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) + LIB Debug Multithreaded|Smartphone 2003 (ARMV4) = LIB Debug Multithreaded|Smartphone 2003 (ARMV4) + LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) + LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) = LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) + LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Debug|Pocket PC 2003 (ARMV4) = LIB Debug|Pocket PC 2003 (ARMV4) + LIB Debug|Smartphone 2003 (ARMV4) = LIB Debug|Smartphone 2003 (ARMV4) + LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release Multithreaded|Pocket PC 2003 (ARMV4) = LIB Release Multithreaded|Pocket PC 2003 (ARMV4) + LIB Release Multithreaded|Smartphone 2003 (ARMV4) = LIB Release Multithreaded|Smartphone 2003 (ARMV4) + LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) + LIB Release Singlethreaded|Smartphone 2003 (ARMV4) = LIB Release Singlethreaded|Smartphone 2003 (ARMV4) + LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release|Pocket PC 2003 (ARMV4) = LIB Release|Pocket PC 2003 (ARMV4) + LIB Release|Smartphone 2003 (ARMV4) = LIB Release|Smartphone 2003 (ARMV4) + LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).ActiveCfg = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Build.0 = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Deploy.0 = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).ActiveCfg = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Build.0 = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Deploy.0 = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Releaase|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I) + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/freetype.vcproj b/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/freetype.vcproj new file mode 100644 index 000000000..083056328 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/freetype.vcproj @@ -0,0 +1,3839 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/index.html b/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/index.html new file mode 100644 index 000000000..5d0e2b7d3 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/wince/vc2005-ce/index.html @@ -0,0 +1,47 @@ + +
      + + FreeType 2 Project Files for VS.NET 2005 + (Pocket PC) + + + +

      + FreeType 2 Project Files for VS.NET 2005 + (Pocket PC) +

      + +

      This directory contains project files for Visual C++, named +freetype.vcproj, and Visual Studio, called freetype.sln for +the following targets: + +

        +
      • PPC/SP 2003 (Pocket PC 2003)
      • +
      • PPC/SP WM5 (Windows Mobile 5)
      • +
      • PPC/SP WM6 (Windows Mobile 6)
      • +
      + +It compiles the following libraries from the FreeType 2.3.12 sources:

      + +
        +
        +    freetype2312.lib     - release build; single threaded
        +    freetype2312_D.lib   - debug build;   single threaded
        +    freetype2312MT.lib   - release build; multi-threaded
        +    freetype2312MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/freetype.sln b/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/freetype.sln new file mode 100644 index 000000000..d8efd96f0 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/freetype.sln @@ -0,0 +1,158 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) = LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) + LIB Debug Multithreaded|Smartphone 2003 (ARMV4) = LIB Debug Multithreaded|Smartphone 2003 (ARMV4) + LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) + LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) = LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) + LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Debug|Pocket PC 2003 (ARMV4) = LIB Debug|Pocket PC 2003 (ARMV4) + LIB Debug|Smartphone 2003 (ARMV4) = LIB Debug|Smartphone 2003 (ARMV4) + LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release Multithreaded|Pocket PC 2003 (ARMV4) = LIB Release Multithreaded|Pocket PC 2003 (ARMV4) + LIB Release Multithreaded|Smartphone 2003 (ARMV4) = LIB Release Multithreaded|Smartphone 2003 (ARMV4) + LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) + LIB Release Singlethreaded|Smartphone 2003 (ARMV4) = LIB Release Singlethreaded|Smartphone 2003 (ARMV4) + LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + LIB Release|Pocket PC 2003 (ARMV4) = LIB Release|Pocket PC 2003 (ARMV4) + LIB Release|Smartphone 2003 (ARMV4) = LIB Release|Smartphone 2003 (ARMV4) + LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) + LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).ActiveCfg = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Build.0 = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Deploy.0 = Debug|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Multithreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Multithreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).ActiveCfg = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Build.0 = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Deploy.0 = Release|Smartphone 2003 (ARMV4) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I) + {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I) + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/freetype.vcproj b/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/freetype.vcproj new file mode 100644 index 000000000..8568d6649 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/freetype.vcproj @@ -0,0 +1,13495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/index.html b/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/index.html new file mode 100644 index 000000000..781e05f11 --- /dev/null +++ b/alienblaster/project/jni/freetype/builds/wince/vc2008-ce/index.html @@ -0,0 +1,47 @@ + +
      + + FreeType 2 Project Files for VS.NET 2008 + (Pocket PC) + + + +

      + FreeType 2 Project Files for VS.NET 2008 + (Pocket PC) +

      + +

      This directory contains project files for Visual C++, named +freetype.dsp, and Visual Studio, called freetype.sln for +the following targets: + +

        +
      • PPC/SP 2003 (Pocket PC 2003)
      • +
      • PPC/SP WM5 (Windows Mobile 5)
      • +
      • PPC/SP WM6 (Windows Mobile 6)
      • +
      + +It compiles the following libraries from the FreeType 2.3.12 sources:

      + +
        +
        +    freetype2312.lib     - release build; single threaded
        +    freetype2312_D.lib   - debug build;   single threaded
        +    freetype2312MT.lib   - release build; multi-threaded
        +    freetype2312MT_D.lib - debug build;   multi-threaded
        +
      + +

      Be sure to extract the files with the Windows (CR+LF) line endings. ZIP +archives are already stored this way, so no further action is required. If +you use some .tar.*z archives, be sure to configure your extracting +tool to convert the line endings. For example, with WinZip, you should activate the TAR +file smart CR/LF Conversion option. Alternatively, you may consider +using the unix2dos or u2d utilities that are floating +around, which specifically deal with this particular problem. + +

      Build directories are placed in the top-level objs +directory.

      + + + diff --git a/alienblaster/project/jni/freetype/configure b/alienblaster/project/jni/freetype/configure new file mode 100755 index 000000000..2efa26967 --- /dev/null +++ b/alienblaster/project/jni/freetype/configure @@ -0,0 +1,120 @@ +#!/bin/sh +# +# Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +# +# +# Call the `configure' script located in `builds/unix'. +# + +rm -f config.mk builds/unix/unix-def.mk builds/unix/unix-cc.mk + +if test "x$GNUMAKE" = x; then + GNUMAKE=make +fi + +if test -z "`$GNUMAKE -v 2>/dev/null | grep GNU`"; then + if test -z "`$GNUMAKE -v 2>/dev/null | grep makepp`"; then + echo "GNU make (>= 3.80) or makepp (>= 1.19) is required to build FreeType2." >&2 + echo "Please try" >&2 + echo " \`GNUMAKE= $0'." >&2 + echo "or >&2" + echo " \`GNUMAKE=\"makepp --norc-substitution\" $0'." >&2 + exit 1 + fi +fi + +# Get `dirname' functionality. This is taken and adapted from autoconf's +# m4sh.m4 (_AS_EXPR_PREPARE, AS_DIRNAME_EXPR, and AS_DIRNAME_SED). + +if expr a : '\(a\)' >/dev/null 2>&1; then + ft_expr=expr +else + ft_expr=false +fi + +ft2_dir=`(dirname "$0") 2>/dev/null || + $ft_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || + echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +abs_curr_dir=`pwd` +abs_ft2_dir=`cd "$ft2_dir" && pwd` + +# `--srcdir=' option can override abs_ft2_dir + +if test $# -gt 0; then + for x in "$@"; do + case x"$x" in + x--srcdir=*) + abs_ft2_dir=`echo $x | sed 's/^--srcdir=//'` ;; + esac + done +fi + +# build a dummy Makefile if we are not building in the source tree + +if test "$abs_curr_dir" != "$abs_ft2_dir"; then + mkdir reference + if test ! -r $abs_curr_dir/modules.cfg; then + echo "Copying \`modules.cfg'" + cp $abs_ft2_dir/modules.cfg $abs_curr_dir + fi + echo "Generating \`Makefile'" + echo "TOP_DIR := $abs_ft2_dir" > Makefile + echo "OBJ_DIR := $abs_curr_dir" >> Makefile + echo "OBJ_BUILD := \$(OBJ_DIR)" >> Makefile + echo "DOC_DIR := \$(OBJ_DIR)/reference" >> Makefile + echo "LIBTOOL := \$(OBJ_DIR)/libtool" >> Makefile + echo "ifndef FT2DEMOS" >> Makefile + echo " include \$(TOP_DIR)/Makefile" >> Makefile + echo "else" >> Makefile + echo " TOP_DIR_2 := \$(TOP_DIR)/../ft2demos" >> Makefile + echo " PROJECT := freetype" >> Makefile + echo " CONFIG_MK := \$(OBJ_DIR)/config.mk" >> Makefile + echo " include \$(TOP_DIR_2)/Makefile" >> Makefile + echo "endif" >> Makefile +fi + +# call make + +CFG= +# work around zsh bug which doesn't like `${1+"$@"}' +case $# in +0) ;; +*) for x in "$@"; do + case x"$x" in + x--srcdir=* ) CFG="$CFG '$x'/builds/unix" ;; + *) CFG="$CFG '$x'" ;; + esac + done ;; +esac +CFG=$CFG $GNUMAKE setup unix + +# eof diff --git a/alienblaster/project/jni/freetype/devel/ft2build.h b/alienblaster/project/jni/freetype/devel/ft2build.h new file mode 100644 index 000000000..c1d38c35a --- /dev/null +++ b/alienblaster/project/jni/freetype/devel/ft2build.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* FreeType 2 build and setup macros. */ +/* (Generic version) */ +/* */ +/* Copyright 1996-2001, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + * This is a development version of that is used + * to build the library in debug mode. Its only difference with + * the reference is that it forces the use of the local `ftoption.h' + * which contains different settings for all configuration macros. + * + * To use it, you must define the environment variable FT2_BUILD_INCLUDE + * to point to the directory containing these two files (`ft2build.h' and + * `ftoption.h'), then invoke Jam as usual. + */ + +#ifndef __FT2_BUILD_DEVEL_H__ +#define __FT2_BUILD_DEVEL_H__ + +#define FT_CONFIG_OPTIONS_H + +#include + +#endif /* __FT2_BUILD_DEVEL_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/devel/ftoption.h b/alienblaster/project/jni/freetype/devel/ftoption.h new file mode 100644 index 000000000..9c6c2fe45 --- /dev/null +++ b/alienblaster/project/jni/freetype/devel/ftoption.h @@ -0,0 +1,710 @@ +/***************************************************************************/ +/* */ +/* ftoption.h (for development) */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#include + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* This file contains the default configuration macro definitions for */ + /* a standard build of the FreeType library. There are three ways to */ + /* use this file to build project-specific versions of the library: */ + /* */ + /* - You can modify this file by hand, but this is not recommended in */ + /* cases where you would like to build several versions of the */ + /* library from a single source directory. */ + /* */ + /* - You can put a copy of this file in your build directory, more */ + /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ + /* is the name of a directory that is included _before_ the FreeType */ + /* include path during compilation. */ + /* */ + /* The default FreeType Makefiles and Jamfiles use the build */ + /* directory `builds/' by default, but you can easily change */ + /* that for your own projects. */ + /* */ + /* - Copy the file to `$BUILD/ft2build.h' and modify it */ + /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ + /* locate this file during the build. For example, */ + /* */ + /* #define FT_CONFIG_OPTIONS_H */ + /* #include */ + /* */ + /* will use `$BUILD/myftoptions.h' instead of this file for macro */ + /* definitions. */ + /* */ + /* Note also that you can similarly pre-define the macro */ + /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ + /* that are statically linked to the library at compile time. By */ + /* default, this file is . */ + /* */ + /* We highly recommend using the third method whenever possible. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Uncomment the line below if you want to activate sub-pixel rendering */ + /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ + /* */ + /* Note that this feature is covered by several Microsoft patents */ + /* and should not be activated in any default build of the library. */ + /* */ + /* This macro has no impact on the FreeType API, only on its */ + /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ + /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */ + /* the original size in case this macro isn't defined; however, each */ + /* triplet of subpixels has R=G=B. */ + /* */ + /* This is done to allow FreeType clients to run unmodified, forcing */ + /* them to display normal gray-level anti-aliased glyphs. */ + /* */ +#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + + /*************************************************************************/ + /* */ + /* Many compilers provide a non-ANSI 64-bit data type that can be used */ + /* by FreeType to speed up some computations. However, this will create */ + /* some problems when compiling the library in strict ANSI mode. */ + /* */ + /* For this reason, the use of 64-bit integers is normally disabled when */ + /* the __STDC__ macro is defined. You can however disable this by */ + /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ + /* */ + /* For most compilers, this will only create compilation warnings when */ + /* building the library. */ + /* */ + /* ObNote: The compiler-specific 64-bit integers are detected in the */ + /* file `ftconfig.h' either statically or through the */ + /* `configure' script on supported platforms. */ + /* */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /*************************************************************************/ + /* */ + /* If this macro is defined, do not try to use an assembler version of */ + /* performance-critical functions (e.g. FT_MulFix). You should only do */ + /* that to verify that the assembler function works properly, or to */ + /* execute benchmark tests of the various implementations. */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /*************************************************************************/ + /* */ + /* If this macro is defined, try to use an inlined assembler version of */ + /* the `FT_MulFix' function, which is a `hotspot' when loading and */ + /* hinting glyphs, and which should be executed as fast as possible. */ + /* */ + /* Note that if your compiler or CPU is not supported, this will default */ + /* to the standard and portable implementation found in `ftcalc.c'. */ + /* */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + + /*************************************************************************/ + /* */ + /* Gzip-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `gzip' program. This is mostly used to parse many of the PCF files */ + /* that come with XFree86. The implementation uses `zlib' to */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ + /* */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /*************************************************************************/ + /* */ + /* ZLib library selection */ + /* */ + /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ + /* It allows FreeType's `ftgzip' component to link to the system's */ + /* installation of the ZLib library. This is useful on systems like */ + /* Unix or VMS where it generally is already available. */ + /* */ + /* If you let it undefined, the component will use its own copy */ + /* of the zlib sources instead. These have been modified to be */ + /* included directly within the component and *not* export external */ + /* function names. This allows you to link any program with FreeType */ + /* _and_ ZLib without linking conflicts. */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /*************************************************************************/ + /* */ + /* DLL export compilation */ + /* */ + /* When compiling FreeType as a DLL, some systems/compilers need a */ + /* special keyword in front OR after the return type of function */ + /* declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ + /* */ + /* FT_EXPORT( return_type ) */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* */ + /* */ + /* FT_EXPORT_DEF( return_type ) */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* */ + /* You can provide your own implementation of FT_EXPORT and */ + /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ + /* will be later automatically defined as `extern return_type' to */ + /* allow normal compilation. */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_EXPORT(x) extern x */ +/* #define FT_EXPORT_DEF(x) x */ + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `psnames' module. This */ + /* module is in charge of converting a glyph name string into a */ + /* Unicode value, or return a Macintosh standard glyph name for the */ + /* use with the TrueType `post' table. */ + /* */ + /* Undefine this macro if you do not want `psnames' compiled in your */ + /* build of FreeType. This has the following effects: */ + /* */ + /* - The TrueType driver will provide its own set of glyph names, */ + /* if you build it to support postscript names in the TrueType */ + /* `post' table. */ + /* */ + /* - The Type 1 driver will not be able to synthesize a Unicode */ + /* charmap out of the glyphs found in the fonts. */ + /* */ + /* You would normally undefine this configuration macro when building */ + /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ + /* */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Postscript Names to Unicode Values support */ + /* */ + /* By default, FreeType 2 is built with the `PSNames' module compiled */ + /* in. Among other things, the module is used to convert a glyph name */ + /* into a Unicode value. This is especially useful in order to */ + /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ + /* through a big table named the `Adobe Glyph List' (AGL). */ + /* */ + /* Undefine this macro if you do not want the Adobe Glyph List */ + /* compiled in your `PSNames' module. The Type 1 driver will not be */ + /* able to synthesize a Unicode charmap out of the glyphs found in the */ + /* fonts. */ + /* */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /*************************************************************************/ + /* */ + /* Support for Mac fonts */ + /* */ + /* Define this macro if you want support for outline fonts in Mac */ + /* format (mac dfont, mac resource, macbinary containing a mac */ + /* resource) on non-Mac platforms. */ + /* */ + /* Note that the `FOND' resource isn't checked. */ + /* */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /*************************************************************************/ + /* */ + /* Allow the use of FT_Incremental_Interface to load typefaces that */ + /* contain no glyph data, but supply it via a callback function. */ + /* This is required by clients supporting document formats which */ + /* supply font data incrementally as the document is parsed, such */ + /* as the Ghostscript interpreter for the PostScript language. */ + /* */ +#define FT_CONFIG_OPTION_INCREMENTAL + + + /*************************************************************************/ + /* */ + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ + /* */ + /* This must be greater than 4KByte if you use FreeType to rasterize */ + /* glyphs; otherwise, you may set it to zero to avoid unnecessary */ + /* allocation of the render pool. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384L + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 32 is the default. */ + /* */ +#define FT_MAX_MODULES 32 + + + /*************************************************************************/ + /* */ + /* Debug level */ + /* */ + /* FreeType can be compiled in debug or trace mode. In debug mode, */ + /* errors are reported through the `ftdebug' component. In trace */ + /* mode, additional messages are sent to the standard output during */ + /* execution. */ + /* */ + /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ + /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ + /* */ + /* Don't define any of these macros to compile in `release' mode! */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +#define FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_TRACE + + + /*************************************************************************/ + /* */ + /* Memory Debugging */ + /* */ + /* FreeType now comes with an integrated memory debugger that is */ + /* capable of detecting simple errors like memory leaks or double */ + /* deletes. To compile it within your build of the library, you */ + /* should define FT_DEBUG_MEMORY here. */ + /* */ + /* Note that the memory debugger is only activated at runtime when */ + /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +#define FT_DEBUG_MEMORY + + + /*************************************************************************/ + /* */ + /* Module errors */ + /* */ + /* If this macro is set (which is _not_ the default), the higher byte */ + /* of an error code gives the module in which the error has occurred, */ + /* while the lower byte is the real error code. */ + /* */ + /* Setting this macro makes sense for debugging purposes only, since */ + /* it would break source compatibility of certain programs that use */ + /* FreeType 2. */ + /* */ + /* More details can be found in the files ftmoderr.h and fterrors.h. */ + /* */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /*************************************************************************/ + /* */ + /* Position Independent Code */ + /* */ + /* If this macro is set (which is _not_ the default), FreeType2 will */ + /* avoid creating constants that require address fixups. Instead the */ + /* constants will be moved into a struct and additional intialization */ + /* code will be used. */ + /* */ + /* Setting this macro is needed for systems that prohibit address */ + /* fixups, such as BREW. */ + /* */ +/* #define FT_CONFIG_OPTION_PIC */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ + /* embedded bitmaps in all formats using the SFNT module (namely */ + /* TrueType & OpenType). */ + /* */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ + /* load and enumerate the glyph Postscript names in a TrueType or */ + /* OpenType file. */ + /* */ + /* Note that when you do not compile the `PSNames' module by undefining */ + /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ + /* contain additional code used to read the PS Names table from a font. */ + /* */ + /* (By default, the module uses `PSNames' to extract glyph names.) */ + /* */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ + /* access the internal name table in a SFNT-based format like TrueType */ + /* or OpenType. The name table contains various strings used to */ + /* describe the font, like family name, copyright, version, etc. It */ + /* does not contain any glyph name though. */ + /* */ + /* Accessing SFNT names is done through the functions declared in */ + /* `freetype/ftsnames.h'. */ + /* */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /*************************************************************************/ + /* */ + /* TrueType CMap support */ + /* */ + /* Here you can fine-tune which TrueType CMap table format shall be */ + /* supported. */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ + /* a bytecode interpreter in the TrueType driver. Note that there are */ + /* important patent issues related to the use of the interpreter. */ + /* */ + /* By undefining this, you will only compile the code necessary to load */ + /* TrueType glyphs without hinting. */ + /* */ + /* Do not #undef this macro here, since the build system might */ + /* define it for certain configurations only. */ + /* */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ + /* of the TrueType bytecode interpreter is used that doesn't implement */ + /* any of the patented opcodes and algorithms. Note that the */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you define */ + /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, either define */ + /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ + /* */ + /* This macro is only useful for a small number of font files (mostly */ + /* for Asian scripts) that require bytecode interpretation to properly */ + /* load glyphs. For all other fonts, this produces unpleasant results, */ + /* thus the unpatented interpreter is never used to load glyphs from */ + /* TrueType fonts unless one of the following two options is used. */ + /* */ + /* - The unpatented interpreter is explicitly activated by the user */ + /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ + /* when opening the FT_Face. */ + /* */ + /* - FreeType detects that the FT_Face corresponds to one of the */ + /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ + /* contains a hard-coded list of font names and other matching */ + /* parameters (see function `tt_face_init' in file */ + /* `src/truetype/ttobjs.c'). */ + /* */ + /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ + /* */ + /* { */ + /* FT_Parameter parameter; */ + /* FT_Open_Args open_args; */ + /* */ + /* */ + /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ + /* */ + /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ + /* open_args.pathname = my_font_pathname; */ + /* open_args.num_params = 1; */ + /* open_args.params = ¶meter; */ + /* */ + /* error = FT_Open_Face( library, &open_args, index, &face ); */ + /* ... */ + /* } */ + /* */ +/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ + /* bytecode interpreter with a huge switch statement, rather than a call */ + /* table. This results in smaller and faster code for a number of */ + /* architectures. */ + /* */ + /* Note however that on some compiler/processor combinations, undefining */ + /* this macro will generate faster, though larger, code. */ + /* */ +#define TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ + /* TrueType glyph loader to use Apple's definition of how to handle */ + /* component offsets in composite glyphs. */ + /* */ + /* Apple and MS disagree on the default behavior of component offsets */ + /* in composites. Apple says that they should be scaled by the scaling */ + /* factors in the transformation matrix (roughly, it's more complex) */ + /* while MS says they should not. OpenType defines two bits in the */ + /* composite flags array which can be used to disambiguate, but old */ + /* fonts will not have them. */ + /* */ + /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ + /* support for Apple's distortable font technology (fvar, gvar, cvar, */ + /* and avar tables). This has many similarities to Type 1 Multiple */ + /* Masters support. */ + /* */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ + /* */ +#define TT_CONFIG_OPTION_BDF + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ + /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ + /* required. */ + /* */ +#define T1_MAX_DICT_DEPTH 5 + + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 16 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ + /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ + /* files into an existing face. Note that if set, the T1 driver will be */ + /* unable to produce kerning distances. */ + /* */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of the Multiple Masters font support in the Type 1 */ + /* driver. */ + /* */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ + /* support. */ + /* */ +#define AF_CONFIG_OPTION_CJK + + /*************************************************************************/ + /* */ + /* Compile autofit module with Indic script support. */ + /* */ +#define AF_CONFIG_OPTION_INDIC + + /* */ + + + /* + * Define this variable if you want to keep the layout of internal + * structures that was used prior to FreeType 2.2. This also compiles in + * a few obsolete functions to avoid linking problems on typical Unix + * distributions. + * + * For embedded systems or building a new distribution from scratch, it + * is recommended to disable the macro since it reduces the library's code + * size and activates a few memory-saving optimizations as well. + */ +/* #define FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * This macro is defined if either unpatented or native TrueType + * hinting is requested by the definitions above. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER +#undef TT_CONFIG_OPTION_UNPATENTED_HINTING +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/docs/CHANGES b/alienblaster/project/jni/freetype/docs/CHANGES new file mode 100644 index 000000000..018d16c57 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/CHANGES @@ -0,0 +1,3396 @@ +CHANGES BETWEEN 2.3.11 and 2.3.12 + + I. IMPORTANT CHANGES + + - For `FT_Open_Face', new parameters are available to ignore + preferred family names: FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY and + FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY. + + II. MISCELLANEOUS + + - Support for incremental font loading (controlled with the + FT_CONFIG_OPTION_INCREMENTAL macro) is now active by default. + + - Better support for vertical metrics. + + - Various minor bug fixes. + + +====================================================================== + +CHANGES BETWEEN 2.3.10 and 2.3.11 + + I. IMPORTANT BUG FIXES + + - Version 2.3.10 broke PCF support. + + +====================================================================== + +CHANGES BETWEEN 2.3.10 and 2.3.9 + + I. IMPORTANT BUG FIXES + + - If all ASCII digits in a font have the same (unscaled) width, + the autohinter respects this and won't change it. + + - TrueType fonts are now rasterized correctly if the horizontal + and vertical resolution differ. + + - Type 1 fonts are now handled with increased precision internally + to avoid serious rounding issues if non-integral coordinates are + encountered. + + - Horizontally condensed CFF fonts (using the font matrix) were + rendered incorrectly. This bug has been introduced after + release 2.3.5. + + + II. IMPORTANT CHANGES + + - Support for the SFNT cmap 13 table format (as defined by the new + OpenType 1.6 specification) has been added. + + - B/W rasterization of well-hinted TrueType fonts at small sizes + has been greatly improved. + + - Calculation of vertical metrics in OpenType fonts has been + improved. + + + III. MISCELLANEOUS + + - It is now possible to change the emboldening factor in the + `ftview' demo program with keys `e' and `E'. + + - It is now possible to change the slant value in the `ftview' + demo program with keys `s' and `S'. + + - The 5-levels grayscale mode of the `ftraster' module (which + FreeType doesn't use by default) was broken since version 2.3.0. + + - Compilation of the `ftgrays' and `ftraster' modules was broken + in stand-alone mode. + + - Various fixes for compilation on 64bit and 16bit architectures. + + +====================================================================== + +CHANGES BETWEEN 2.3.9 and 2.3.8 + + I. IMPORTANT BUG FIXES + + - Very unfortunately, FreeType 2.3.8 contained a change that broke + its official ABI. The end result is that programs compiled + against previous versions of the library, but dynamically linked + to 2.3.8 can experience memory corruption if they call the + `FT_Get_PS_Font_Info' function. + + We recommend all users to upgrade to 2.3.9 as soon as possible, + or to downgrade to a previous release of the library if this is + not an option. + + The origin of the bug is that a new field was added to the + publicly defined `PS_FontInfoRec' structure. Unfortunately, + objects of this type can be stack or heap allocated by callers + of `FT_Get_PS_Font_Info', resulting in a memory buffer + overwrite with its implementation in 2.3.8. + + If you want to know whether your code is vulnerable to this + issue, simply search for the substrings `PS_FontInfo' and + `PS_Font_Info' in your source code. If none is found, your code + is safe and is not affected. + + The FreeType team apologizes for the problem. + + - The POSIX support of MacOS resource-fork fonts (Suitcase fonts + and LaserWriter Type1 PostScript fonts) was broken in 2.3.8. If + FreeType2 is built without Carbon framework, these fonts are not + handled correctly. Version 2.3.7 didn't have this bug. + + - `FT_Get_Advance' (and `FT_Get_Advances') returned bad values for + almost all font formats except TrueType fonts. + + - Fix a bug in the SFNT kerning table loader/parser which could + crash the engine if certain malformed tables were encountered. + + - Composite SFNT bitmaps are now handled correctly. + + + II. IMPORTANT CHANGES + + - The new functions `FT_Get_CID_Is_Internally_CID_keyed' and + `FT_Get_CID_From_Glyph_Index' can be used to access CID-keyed + CFF fonts via CID values. This code has been contributed by + Michael Toftdal. + + + III. MISCELLANEOUS + + - `FT_Outline_Get_InsideBorder' returns FT_STROKER_BORDER_RIGHT + for empty outlines. This was incorrectly documented. + + - The `ftview' demo program now supports UTF-8 encoded strings. + + +====================================================================== + +CHANGES BETWEEN 2.3.8 and 2.3.7 + + I. IMPORTANT BUG FIXES + + - CID-keyed fonts in an SFNT wrapper were not handled correctly. + + - The smooth renderer produced truncated images (on the right) for + outline parts with negative horizontal values. Most fonts don't + contain outlines left to the y coordinate axis, but the effect + was very noticeable for outlines processed with FT_Glyph_Stroke, + using thick strokes. + + - `FT_Get_TrueType_Engine_Type' returned a wrong value if both + configuration macros TT_CONFIG_OPTION_BYTECODE_INTERPRETER and + TT_CONFIG_OPTION_UNPATENTED_HINTING were defined. + + - The `face_index' field in the `FT_Face' structure wasn't + initialized properly after calling FT_Open_Face and friends with + a positive face index for CFFs, WinFNTs, and, most importantly, + for TrueType Collections (TTCs). + + + II. IMPORTANT CHANGES + + - Rudimentary support for Type 1 fonts and CID-keyed Type 1 fonts + in an SFNT wrapper has been added -- such fonts are used on the + Mac. The core SFNT tables `TYP1' and `CID ' are passed to the + PS Type 1 and CID-keyed PS font drivers; other tables (`ALMX', + `BBOX', etc.) are not supported yet. + + - A new interface to extract advance values of glyphs without + loading their outlines has been added. The functions are called + `FT_Get_Advance' and `FT_Get_Advances'; they are defined in file + `ftadvanc.h' (to be accessed as FT_ADVANCES_H). + + - A new function `FT_Get_FSType_Flags' (in FT_FREETYPE_H) has been + contributed by David Bevan to access the embedding and + subsetting restriction information of fonts. + + + III. MISCELLANEOUS + + - FT_MulFix is now an inlined function; by default, assembler code + is provided for x86 and ARM. See FT_CONFIG_OPTION_INLINE_MULFIX + and FT_CONFIG_OPTION_NO_ASSEMBLER (in ftoption.h) for more. + + - The handling of `tricky' fonts (this is, fonts which don't work + with the autohinter, needing the font format's hinting engine) + has been generalized and changed slightly: + + . A new face flag FT_FACE_FLAG_TRICKY indicates that the font + format's hinting engine is necessary for correct rendering. + The macro FT_IS_TRICKY can be used to check this flag. + + . FT_LOAD_NO_HINTING is now ignored for tricky fonts. To really + force raw loading of such fonts (without hinting), both + FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT must be used -- + this is something which you probably never want to do. + + . Tricky TrueType fonts always use the bytecode interpreter, + either the patented or unpatented version. + + - The function `FT_GlyphSlot_Own_Bitmap' has been moved from + FT_SYNTHESIS_H to FT_BITMAP_H; it is now part of the `official' + API. (The functions in FT_SYNTHESIS_H are still subject to + change, however.) + + - In the `ftdiff' demo program you can now toggle the use of + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH with key `a'. + + +====================================================================== + +CHANGES BETWEEN 2.3.7 and 2.3.6 + + I. IMPORTANT BUG FIXES + + - If the library was compiled on an i386 platform using gcc, and + compiler option -O3 was given, `FT_MulFix' sometimes returned + incorrect results which could have caused problems with + `FT_Request_Metrics' and `FT_Select_Metrics', returning an + incorrect descender size. + + - Pure CFFs without subfonts were scaled incorrectly if the font + matrix was non-standard. This bug has been introduced in + version 2.3.6. + + - The `style_name' field in the `FT_FaceRec' structure often + contained a wrong value for Type 1 fonts. This misbehaviour + has been introduced in version 2.3.6 while trying to fix + another problem. [Note, however, that this value is + informative only since the used algorithm to extract it is + very simplistic.] + + + II. IMPORTANT CHANGES + + - Two new macros, FT_OUTLINE_SMART_DROPOUTS and + FT_OUTLINE_EXCLUDE_STUBS, have been introduced. Together with + FT_OUTLINE_IGNORE_DROPOUTS (which was ignored previously) it is + now possible to control the dropout mode of the `raster' module + (for B&W rasterization), using the `flags' field in the + `FT_Outline' structure. + + - The TrueType bytecode interpreter now passes the dropout mode to + the B&W rasterizer. This greatly increases the output for small + ppem values of many fonts like `pala.ttf'. + + +====================================================================== + +CHANGES BETWEEN 2.3.6 and 2.3.5 + + I. IMPORTANT BUG FIXES + + - A bunch of potential security problems have been found. All + users should update. + + - Microsoft Unicode cmaps in TrueType fonts are now always + preferred over Apple cmaps. This is not a bug per se, but there + exist some buggy fonts created for MS which have broken Apple + cmaps. This affects only the automatic selection of FreeType; + it's always possible to manually select an Apple Unicode cmap if + desired. + + - Many bug fixes to the TrueType bytecode interpreter. + + - Improved Mac support. + + - Subsetted CID-keyed CFFs are now supported correctly. + + - CID-keyed CFFs with subfonts which are scaled in a non-standard + way are now handled correctly. + + - A call to FT_Open_Face with `face_index' < 0 crashed FreeType if + the font was a Windows (bitmap) FNT/FON. + + + II. IMPORTANT CHANGES + + - The new function `FT_Get_CID_Registry_Ordering_Supplement' gives + access to those fields in a CID-keyed font. The code has been + contributed by Derek Clegg. + + - George Williams contributed code to validate the new `MATH' + OpenType table (within the `otvalid' module). The `ftvalid' + demo program has been extended accordingly. + + - An API for cmap 14 support (for Unicode Variant Selectors, UVS) + has been contributed by George Williams. + + - A new face flag FT_FACE_FLAG_CID_KEYED has been added, together + with a macro FT_IS_CID_KEYED which evaluates to 1 if the font is + CID-keyed. + + + III. MISCELLANEOUS + + - Build support for symbian has been contributed. + + - Better WGL4 glyph name support, contributed by Sergey Tolstov. + + - Debugging output of the various FT_TRACEX macros is now sent to + stderr. + + - The `ftview' demo program now provides artificial slanting too. + + - The `ftvalid' demo program has a new option `-f' to select the + font index. + + +====================================================================== + +CHANGES BETWEEN 2.3.5 and 2.3.4 + + I. IMPORTANT BUG FIXES + + - Some subglyphs in TrueType fonts were handled incorrectly due to + a missing graphics state reinitialization. + + - Large .Z files (as distributed with some X11 packages) weren't + handled correctly, making FreeType increase the heap stack in an + endless loop. + + - A large number of bugs have been fixed to avoid crashes and + endless loops with invalid fonts. + + + II. IMPORTANT CHANGES + + - The two new cache functions `FTC_ImageCache_LookupScaler' and + `FTC_SBit_Cache_LookupScaler' have been added to allow lookup of + glyphs using an `FTC_Scaler' object; this makes it possible to + use fractional pixel sizes in the cache. The demo programs have + been updated accordingly to use this feature. + + - A new API `FT_Get_CMap_Format' has been added to get the cmap + format of a TrueType font. This is useful in handling PDF + files. The code has been contributed by Derek Clegg. + + - The auto-hinter now produces better output by default for + non-Latin scripts like Indic. This was done by using the CJK + hinting module as the default instead of the Latin one. Thanks + to Rahul Bhalerao for this suggestion. + + - A new API `FT_Face_CheckTrueTypePatents' has been added to find + out whether a given TrueType font uses patented bytecode + instructions. The `ft2demos' bundle contains a new program + called `ftpatchk' which demonstrates its usage. + + - A new API `FT_Face_SetUnpatentedHinting' has been added to + enable or disable the unpatented hinter. + + - Support for Windows FON files in PE format has been contributed + by Dmitry Timoshkov. + + + III. MISCELLANEOUS + + - Vincent Richomme contributed Visual C++ project files for Pocket + PCs. + + +====================================================================== + +CHANGES BETWEEN 2.3.4 and 2.3.3 + + I. IMPORTANT BUG FIXES + + - A serious bug in the handling of bitmap fonts (and bitmap + strikes of outline fonts) has been introduced in 2.3.3. + + +====================================================================== + +CHANGES BETWEEN 2.3.3 and 2.3.2 + + I. IMPORTANT BUG FIXES + + - Remove a serious regression in the TrueType bytecode interpreter + that was introduced in version 2.3.2. Note that this does not + disable the improvements introduced to the interpreter in + version 2.3.2, only some ill cases that occurred with certain + fonts (though a few popular ones). + + - The auto-hinter now ignores single-point contours for computing + blue zones. This bug created `wavy' baselines when rendering + text with various fonts that use these contours to model + mark-attach points (these are points that are never rasterized + and are placed outside of the glyph's real outline). + + - The `rsb_delta' and `lsb_delta' glyph slot fields are now set to + zero for mono-spaced fonts. Otherwise code that uses them would + essentially ruin the fixed-advance property. + + - Fix CVE-2007-1351 which can cause an integer overflow while + parsing BDF fonts, leading to a potentially exploitable heap + overflow condition. + + + II. MISCELLANEOUS + + - Fixed compilation issues on some 64-bit platforms (see ChangeLog + for details). + + - A new demo program `ftdiff' has been added to compare TrueType + hinting, FreeType's auto hinting, and rendering without hinting + in three columns. + + +====================================================================== + +CHANGES BETWEEN 2.3.2 and 2.3.1 + + I. IMPORTANT BUG FIXES + + - FreeType returned incorrect kerning information from TrueType + fonts when the bytecode interpreter was enabled. This happened + due to a typo introduced in version 2.3.0. + + - Negative kerning values from PFM files are now reported + correctly (they were read as 16-bit unsigned values from the + file). + + - Fixed a small memory leak when `FT_Init_FreeType' failed for + some reason. + + - The Postscript hinter placed and sized very thin and ghost stems + incorrectly. + + - The TrueType bytecode interpreter has been fixed to get rid of + most of the rare differences seen in comparison to the Windows + font loader. + + + II. IMPORTANT CHANGES + + - The auto-hinter now better deals with serifs and corner cases + (e.g., glyph '9' in Arial at 9pt, 96dpi). It also improves + spacing adjustments and doesn't change widths for non-spacing + glyphs. + + - Many Mac-specific functions are deprecated (but still + available); modern replacements have been provided for them. + See the documentation in file `ftmac.h'. + + +====================================================================== + +CHANGES BETWEEN 2.3.1 and 2.3.0 + + I. IMPORTANT BUG FIXES + + - The TrueType interpreter sometimes returned incorrect horizontal + metrics due to a bug in the handling of the SHZ instruction. + + - A typo in a security check introduced after version 2.2.1 + prevented FreeType to render some glyphs in CFF fonts. + + +====================================================================== + +CHANGES BETWEEN 2.3.0 and 2.2.1 + + I. IMPORTANT BUG FIXES + + - The PCF font loader is now much more robust while loading + malformed font files. + + - Various memory leaks have been found and fixed. + + - The TrueType name loader now deals properly with some fonts that + encode their names in UTF-16 (the specification was vague, and + the code incorrectly assumed UCS-4). + + - Fixed the TrueType bytecode loader to deal properly with subtle + monochrome/gray issues when scaling the CVT. Some fonts + exhibited bad rendering artifacts otherwise. + + - `FT_GlyphSlot_Embolden' now supports vertical layouts correctly + (it mangled the vertical advance height). + + - Fixed byte endian issues of `ftmac.c' to support Mac OS X on + i386. + + - The PFR font loader no longer erroneously tags font files + without any outlines as FT_FACE_FLAG_SCALABLE. + + + II. NEW API FUNCTIONS + + - `FT_Library_SetLcdFilter' allows you to select a special filter + to be applied to the bitmaps generated by `FT_Render_Glyph' if + one of the FT_RENDER_MODE_LCD and FT_RENDER_MODE_LCD_V modes has + been selected. This filter is used to reduce color fringes; + several settings are available through the FT_LCD_FILTER_XXX + enumeration. + + Its declaration and documentation can be found in file + `include/freetype/ftlcdfil.h' (to be accessed with macro + FT_LCD_FILTER_H). + + *IMPORTANT*: This function returns an error + (FT_Err_Unimplemented_Feature) in default builds of the library + for patent reasons. See below. + + - `FT_Get_Gasp' allows you to query the flags of the TrueType + `gasp' table for a given character pixel size. This is useful + to duplicate the text rendering of MS Windows when the native + bytecode interpreter is enabled (which isn't the default for + other patent reasons). + + Its declaration and documentation can be found in file + `include/freetype/ftgasp.h' (to be accessed with macro + FT_GASP_H). + + + III. IMPORTANT CHANGES + + - The auto-hinter has been tuned a lot to improve its results with + serif fonts, resulting in much better font rendering of many web + pages. + + - The unpatented hinter is now part of the default build of the + library; we have added code to automatically support `tricky' + fonts that need it. + + This means that FreeType should `just work' with certain Asian + fonts, like MingLiU, which cannot properly be loaded without a + bytecode interpreter, but which fortunately do not use any of + the patented bytecode opcodes. We detect these fonts by name, + so please report any font file that doesn't seem to work with + FreeType, and we shall do what we can to support it in a next + release. + + Note that the API hasn't changed, so you can still force + unpatented hinting with a special parameter to `FT_Open_Face' as + well. This might be useful in same cases; for example, a PDF + reader might present a user option to activate it to deal with + certain `tricky' embedded fonts which cannot be clearly + identified. + + If you are a developer for embedded systems, you might want to + *disable* the feature to save code space by undefining + TT_CONFIG_OPTION_UNPATENTED_HINTING in file `ftoption.h'. + + - LCD-optimized rendering is now *disabled* in all default builds + of the library, mainly due to patent issues. For more + information see: + + http://lists.gnu.org/archive/html/freetype/2006-09/msg00064.html + + A new configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING + has been introduced in `ftoption.h'; manually define it in this + file if you want to re-enable the feature. + + The change only affects the implementation, not the FreeType + API. This means that clients don't need to be modified, because + the library still generates LCD decimated bitmaps, but with the + added constraint that R=G=B on each triplet. + + The displayed result should be equal to normal anti-aliased + rendering. + + Additionally, if FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + defined, the new `FT_Library_SetLcdFilter' function returns the + FT_Err_Unimplemented_Feature error code. + + - Some computation bugs in the TrueType bytecode interpreter were + found, which allow us to get rid of very subtle and rare + differences we had experienced with the Windows renderer. + + - It is now possible to cross-compile the library easily. See the + file `docs/INSTALL.CROSS' for details. + + - The file `src/base/ftmac.c' now contains code for Mac OS X only; + its deprecated function `FT_GetFile_From_Mac_Font_Name' always + returns an error even if the QuickDraw framework is available. + The previous version has been moved to `builds/mac/ftmac.c'. + + Selecting configure option `--with-quickdraw-carbon' makes the + build process use the original `ftmac.c' file instead of the Mac + OS X-only version. + + + IV. MISCELLANEOUS + + - Various performance and memory footprint optimizations have been + performed on the TrueType and CFF font loaders, sometimes with + very drastic benefits (e.g., the TrueType loader is now about + 25% faster; FreeType should use less heap memory under nearly + all conditions). + + - The anti-aliased rasterizer has been optimized and is now 15% to + 25% percent faster than in previous versions, depending on + content. + + - The Type 1 loader has been improved; as an example, it now skips + top-level dictionaries properly. + + - Better support for Mac fonts on POSIX systems, plus compilation + fixes for Mac OS X on ppc64 where `ftmac.c' cannot be built. + + - Configuration without `--with-old-mac-fonts' does not include + `ftmac.c' (this was the behaviour in FreeType version 2.1.10). + + - The TrueTypeGX validator (gxvalid) checks the order of glyph IDs + in the kern table. + + +====================================================================== + +CHANGES BETWEEN 2.2.1 and 2.2 + + I. IMPORTANT BUG FIXES + + - Various integer overflows have been fixed. + + - PFB fonts with MacOS resource fork weren't handled correctly on + non-MacOS platforms. + + +====================================================================== + +CHANGES BETWEEN 2.2 and 2.1.10 + +(not released officially) + + I. IMPORTANT BUG FIXES + + - Vertical metrics for SFNT fonts were incorrect sometimes. + + - The FT_HAS_KERNING macro always returned 0. + + - CFF OpenType fonts didn't return correct vertical metrics for + glyphs with outlines. + + - If FreeType was compiled without hinters, all font formats based + on PS outlines weren't scaled correctly. + + + II. IMPORTANT CHANGES + + - Version 2.2 no longer exposes its internals, this is, the header + files located in the `include/freetype/internal' directory of + the source package are not copied anymore by the `make install' + command. Consequently, a number of rogue clients which directly + access FreeType's internal functions and structures won't + compile without modification. + + We provide patches for most of those rogue clients. See the + following page for more information: + + http://www.freetype.org/freetype2/patches/rogue-patches.html + + Note that, as a convenience to our Unix desktop users, version + 2.2 is *binary* compatible with FreeType 2.1.7, which means that + installing this release on an existing distribution shall not + break any working desktop. + + - FreeType's build mechanism has been redesigned. With GNU make + it is now sufficient in most cases to edit two files: + `modules.cfg', to select the library components, and the + configuration file `include/freetype/config/ftoption.h' (which + can be copied to the objects directory). Removing unused module + directories to prevent its compilation and editing + `include/freetype/config/ftmodule.h' is no longer necessary. + + - The LIGHT hinting algorithm produces more pleasant results. + Also, using the FT_LOAD_TARGET_LIGHT flags within FT_Load_Glyph + always forces auto-hinting, as a special exception. This allows + you to experiment with it even if you have enabled the TrueType + bytecode interpreter in your build. + + - The auto hinter now employs a new algorithm for CJK fonts, based + on Akito Hirai's patch. Note that this only works for fonts + with a Unicode charmap at the moment. + + - The following callback function types have changed slightly (by + adding the `const' keyword where appropriate): + + FT_Outline_MoveToFunc + FT_Outline_LineToFunc + FT_Outline_ConicToFunc + FT_Outline_CubicToFunc + FT_SpanFunc + FT_Raster_RenderFunc + + FT_Glyph_TransformFunc + FT_Renderer_RenderFunc + FT_Renderer_TransformFunc + + Note that this doesn't affect binary backward compatibility. + + - On MacOS, new APIs have been added as replacements for legacy + APIs: `FT_New_Face_From_FSRef' for `FT_New_Face_From_FSSpec', + and `FT_GetFile_From_Mac_ATS_Name' for + `FT_GetFile_From_Mac_Name'. Legacy APIs are still available, if + FreeType is built without disabling them. + + - A new API `FT_Select_Size' has been added to select a bitmap + strike by its index. Code using other functions to select + bitmap strikes should be updated to use this function. + + - A new API `FT_Get_SubGlyph_Info' has been added to retrieve + subglyph data. This can be used by rogue clients which used to + access the internal headers to get the corresponding data. + + - In 2.1.10, the behaviour of `FT_Set_Pixel_Sizes' was changed for + BDF/PCF fonts, and only for them. This causes inconsistency. + In this release, we undo the change. The intent of the change + in 2.1.10 is to allow size selection through real dimensions, + which can now be done through `FT_Request_Size'. + + - Some security issues were discovered and fixed in the CFF and + Type 1 loader, causing crashes of FreeType by malformed font + files. + + + III. MISCELLANEOUS + + - The documentation for FT_LOAD_TARGET_XXX and FT_RENDER_MODE_XXX + values now better reflects its usage and differences: One set is + used to specify the hinting algorithm, the other to specify the + pixel rendering mode. + + - `FT_New_Face' and `FT_New_Face_From_FSSpec' in ftmac.c have been + changed to count supported scalable faces (sfnt, LWFN) only, and + to return the number of available faces via face->num_faces. + Unsupported bitmap faces (fbit, NFNT) are ignored. + + - builds/unix/configure has been improved for MacOS X. It now + automatically checks available functions in Carbon library, and + prepare to use newest functions by default. Options to specify + the dependencies of each Carbon APIs (FSSpec, FSRef, old/new + QuickDraw, ATS) are available too. By manual disabling of all + QuickDraw functionality, FreeType can be built without + `deprecated function' warnings on MacOS 10.4.x, but + FT_GetFile_Mac_Name in ftmac.c then is changed to a dummy + function, and returns an `unimplemented' error. For details see + builds/mac/README. + + - SFNT cmap handling has been improved, mainly to run much faster + with CJK fonts. + + - A new function `FT_Get_TrueType_Engine_Type (declared in + `FT_MODULE_H') is provided to determine the status of the + TrueType bytecode interpreter compiled into the library + (patented, unpatented, unimplemented). + + - Vertical metrics of glyphs are synthesized if the font does not + provide such information. You can tell whether the metrics are + synthesized or not by checking the FT_FACE_FLAG_VERTICAL flag of + the face. + + - The demo programs `ftview' and `ftstring' have been rewritten + for better readability. `ftview' has a new switch `-p' to test + FT_New_Memory_Face (instead of FT_New_Face). + + - FreeType now honours bit 1 in the `head' table of TrueType fonts + (meaning `left sidebearing point at x=0'). This helps with some + buggy fonts. + + - Rudimentary support for Adobe's new `SING Glyphlet' format. See + + http://www.adobe.com/products/indesign/sing_gaiji.html + + for more information. + + - The `ftdump' program from the `ft2demos' bundle now shows some + information about charmaps. It also supports a new switch `-v' + to increase verbosity. + + - Better AFM support. This includes track kerning support. + + +====================================================================== + +CHANGES BETWEEN 2.1.10 and 2.1.9 + + I. IMPORTANT BUG FIXES + + - The size comparison for BDF and PCF files could fail sometimes. + + - Some CFF files were still not loaded correctly. Patch from + Derek Noonburg. + + - The stroker still had some serious bugs. + + - Boris Letocha fixed a bug in the TrueType interpreter: The + NPUSHW instruction wasn't skipped correctly in IF clauses. Some + fonts like `Helvetica 75 Bold' failed. + + - Another serious bug in handling TrueType hints caused many + distortions. It has been introduced in version 2.1.8, and it is + highly recommended to upgrade. + + - FreeType didn't properly parse empty Type 1 glyphs. + + - An unbound dynamic buffer growth was fixed in the PFR loader. + + - Several bugs have been fixed in the cache sub-system. + + - FreeType behaved incorrectly when resizing two distinct but very + close character pixel sizes through `FT_Set_Char_Size' (Savannah + bug #12263). + + - The auto-hinter didn't work properly for fonts without a Unicode + charmap -- it even refused to load the glyphs. + + + II. IMPORTANT CHANGES + + - Many fixes have been applied to drastically reduce the amount of + heap memory used by FreeType, especially when using + memory-mapped font files (which is the default on Unix systems + which support them). + + - The auto-hinter has been replaced with a new module, called the + `auto-fitter'. It consumes less memory than its predecessor, + and it is prepared to support non-latin scripts better in next + releases. + + - George Williams contributed code to read kerning data from PFM + files. + + - FreeType now uses the TT_NAME_ID_PREFERRED_FAMILY and + TT_NAME_ID_PREFERRED_SUBFAMILY strings (if available) for + setting family and style in SFNT fonts (patch from Kornfeld + Eliyahu Peter). + + - A new API `FT_Sfnt_Table_Info' (in FT_TRUETYPE_TABLES_H) has + been added to retrieve name and size information of SFNT tables. + + - A new API `FT_OpenType_Validate' (in FT_OPENTYPE_VALIDATE_H) has + been added to validate OpenType tables (BASE, GDEF, GPOS, GSUB, + JSTF). After validation it is no longer necessary to check + for errors in those tables while accessing them. + + Note that this module might be moved to another library in the + future to avoid a tight dependency between FreeType and the + OpenType specification. + + - A new API in FT_BITMAP_H (`FT_Bitmap_New', `FT_Bitmap_Convert', + `FT_Bitmap_Copy', `FT_Bitmap_Embolden', `FT_Bitmap_Done') has + been added. Its use is to convert an FT_Bitmap structure in + 1bpp, 2bpp, 4bpp, or 8bpp format into another 8bpp FT_Bitmap, + probably using a different pitch, and to further manipulate it. + + - A new API `FT_Outline_Embolden' (in FT_OUTLINE_H) gives finer + control how outlines are embolded. + + - `FT_GlyphSlot_Embolden' (in FT_SYNTHESIS_H) now handles bitmaps + also (code contributed by Chia I Wu). Note that this function + is still experimental and may be replaced with a better API. + + - The method how BDF and PCF bitmap fonts are accessed has been + refined. Formerly, FT_Set_Pixel_Sizes and FT_Set_Char_Size + were synonyms in FreeType's BDF and PCF interface. This has + changed now. FT_Set_Pixel_Sizes should be used to select the + actual font dimensions (the `strike', which is the sum of the + `FONT_ASCENT' and `FONT_DESCENT' properties), while + FT_Set_Char_Size selects the `nominal' size (the `PIXELSIZE' + property). In both functions, the width parameter is ignored. + + + III. MISCELLANEOUS + + - The BDF driver no longer converts all returned bitmaps with a + depth of 2bpp or 4bpp to a depth of 8bpp. The documentation has + not mentioned this explicitly, but implementors might have + relied on this after looking into the source files. + + - A new option `--ftversion' has been added to freetype-config to + return the FreeType version. + + - The memory debugger has been updated to dump allocation + statistics on all allocation sources in the library. This is + useful to spot greedy allocations when loading and processing + fonts. + + - We removed a huge array of constant pointers to constant strings + in the `psnames' module. The problem was that compilations in + PIC mode (i.e., when generating a Unix shared object/dll) put + the array into the non-shared writable section of the library + since absolute pointers are not relocatable by nature. + + This reduces the memory consumption by approximately 16KByte per + process linked to FreeType. We now also store the array in a + compressed form (as a trie) which saves about 20KByte of code as + well. + + - Kirill Smelkov provided patches to make src/raster/ftraster.c + compile stand-alone again. + + +====================================================================== + +CHANGES BETWEEN 2.1.9 and 2.1.8 + + I. IMPORTANT BUG FIXES + + - The function `FT_Get_CharMap_Index' was only declared, without + any real code. For consistency, it has been renamed to + `FT_Get_Charmap_Index'. (This function is needed to implement + cmap caches.) + + - `FT_Outline_Get_BBox' sometimes returned incorrect values for + conic outlines (e.g., for TrueType fonts). + + - Handling of `bhed' table has been fixed. + + - The TrueType driver with enabled byte code interpreter sometimes + returned artifacts due to incorrect rounding. This bug has been + introduced after version 2.1.4. + + - The BDF driver dropped the last glyph in the font. + + - The BDF driver now uses the DEFAULT_CHAR property (if available) + to select a glyph shape for the undefined glyph. + + - The stroker failed for closed outlines and single points. + + + II. IMPORTANT CHANGES + + - George Williams contributed code to handle Apple's font + distortion technology found in GX fonts (`avar', `cvar', `fvar', + and `gvar' tables; the Multiple Masters API has been slightly + extended to cope with the new functionality). + + - The `FT_GlyphSlotRec' structure has been extended: The elements + `lsb_delta' and `rsb_delta' give the difference between hinted + and unhinted left and right side bearings if autohinting is + active. Using those values can improve the inter-letter spacing + considerably. See the documentation of `FT_GlyphSlotRec' and + the `ftstring' demo program how to use it. + + - Loading TrueType and Type 1 fonts has been made much faster. + + - The stroker is no longer experimental (but the cache subsystem + still is). + + + III. MISCELLANEOUS + + - A new documentation file `formats.txt' describes various font + formats supported (and not supported) by FreeType. + + +====================================================================== + +CHANGES BETWEEN 2.1.8 and 2.1.7 + + I. IMPORTANT BUG FIXES + + - The native TrueType hinter contained some bugs which prevented + some fonts to be rendered correctly, most notably Legendum.otf. + + - The PostScript hinter now produces improved results. + + - The linear advance width and height values were incorrectly + rounded, making them virtually unusable if not loaded with + FT_LOAD_LINEAR_DESIGN. + + - Indexing CID-keyed CFF fonts is now working: The glyph index is + correctly treated as a CID, similar to FreeType's CID driver + module. Note that CID CMap support is still missing. + + - The FT_FACE_FLAGS_GLYPH_NAMES flag is now set correctly for all + font formats. + + - Some subsetted Type 1 fonts weren't parsed correctly. This bug + has been introduced in 2.1.7. In summary, the Type 1 parser has + become more robust. + + - Non-decimal numbers weren't parsed correctly in PS fonts. + + - The WinFNT driver now correctly reports FT_ENCODING_NONE for all + but one encoding. Use the new FT_WinFNT_ID_XXX values together + with `FT_Get_WinFNT_Header' to get the WinFNT charset ID. + + - The descender metrics (face->size->metrics.descender) for WinFNT + bitmap fonts had the wrong sign. + + - The (emulated) `seac' support for CFF fonts was broken. + + - The `flex' operator didn't work for CFF fonts. + + - PS glyphs which use the `hintmask' operator haven't been + rendered correctly in some cases. + + - Metrics for BDF and PCF bitmap font formats have been fixed. + + - Autohinting is now disabled for glyphs which are vertically + distorted or mirrored (using a transformation matrix). This + fixes a bug which produced zero-height glyphs. + + - The `freetype-config' script now handles --prefix and + --exec-prefix correctly; it also returns the proper --rpath (or + -R) value if FreeType has been built as a shared library. + + + II. IMPORTANT CHANGES + + - Both PCF and BDF drivers now handle the SETWIDTH_NAME and + ADD_STYLE_NAME properties. Values are appended to + face->style_name; example: `Bold SemiCondensed'. + + - The PCF driver now handles bitmap fonts compressed with the LZW + algorithm (extension .pcf.Z, compressed with `compress'). + + - A new API function `FT_Get_CMap_Language_ID' (declared in + `tttables.h') is available to get the language ID of a + TrueType/SFNT cmap. + + - The hexadecimal format of data after the `StartData' command in + CID-keyed Type 1 fonts is now supported. While this can't occur + in file-based fonts, it can happen in document-embedded + resources of PostScript documents. + + - Embedded bitmaps in SFNT-based CFF fonts are now supported. + + - A simple API is now available to control FreeType's tracing + mechanism if compiled with FT_DEBUG_LEVEL_TRACE. See the file + `ftdebug.h' for more details. + + - YAMATO Masatake contributed improved handling of MacOS resource + forks on non-MacOS platforms (for example, Linux can mount MacOS + file systems). + + - Support for MacOS has been improved; there is now a new function + `FT_New_Face_From_FSSpec' similar to `FT_New_Face' except that + it accepts an FSSpec instead of a path. + + - The cache sub-system has been rewritten. + + - There is now support for deinstallation of faces. + + - A new API function `FTC_Manager_RemoveFaceID' has been added + to delete all `idle' nodes that correspond to a given + FTC_FaceID. All `locked' nodes (i.e., those with a reference + count > 0), will be modified to prevent them from appearing in + further lookups (they will be cleaned normally when their + reference count reaches 0). + + - There is now support for point scaling (i.e., providing + character sizes in points + dpis, instead of pixels). + + - Three abstract cache classes are now available: + + FTC_GCache: Used to store one glyph item per cache node, + with the ability to group common attributes into + `families'. This replaces the old + FTC_GlyphCache class. + + FTC_ICache: Used to store one FT_Glyph per cache node. This + extends FTC_GCache. Family definition, family + comparison, and glyph loading are however left + to sub-classes. + + FTC_SCache: Used to store up to 16 small bitmaps per cache + node. This extends FTC_GCache. Family + definition, family comparison and glyph loading + are however left to sub-classes. + + - The file `src/cache/ftcbasic.c' implements: + + FTC_ImageCache: Extends FTC_ICache; implements family + definitions and glyph loading similar to the + old API. + + FTC_SBitCache: Extends FTC_SCache, implements family + definitions and glyph loading similar to the + old API + + Client applications should be able to extend FTC_GCache, + FTC_ICache, or FTC_SCache much more easily (i.e., less code to + write, and less callbacks). For example, one could envision + caches that are capable of storing transformed (obliqued), + stroked, emboldened, or colored glyph images. Use + `ftcbasic.c' as an example. + + - All public APIs are now in `include/freetype/ftcache.h', (to + be accessed as `FT_CACHE_H'). The contents of + `include/freetype/cache/' is only needed by applications that + wish to implement their own caches. + + - There were some major performance improvements through the use + of various programming tricks. Cache hits are up to 70% + faster than in the old code. + + - The FTC_CMapCache has been simplified. Charmaps can only be + accessed by index right now. There is also a new API named + `FT_Charmap_GetIndex' for this purpose. + + - The demo programs have been updated to the new code. The + previous versions will not work with the current one. + + - Using an invalid face index in FT_Open_Face and friends now + causes an error even if the font contains a single face only. + + + III. MISCELLANEOUS + + - Wolfgang Domröse contributed support files for building FreeType + on the Atari using the PureC compiler. Note that the Atari is a + 16bit platform. + + - Vitaliy Pasternak contributed project files for VS.NET 2003. + + +====================================================================== + +CHANGES BETWEEN 2.1.7 and 2.1.6 + + I. IMPORTANT BUG FIXES + + - Updated to newest libtool version, fixing build problems on + various platforms. + + - On Unix platforms, `make install' didn't copy the correct + `ftconfig.h' file. + + Note that version 2.1.7 contains the same library C source code as + version 2.1.6. + + +====================================================================== + +CHANGES BETWEEN 2.1.6 and 2.1.5 + + I. IMPORTANT BUG FIXES + + - The PFR font driver didn't load kerning tables correctly, and + the functions in FT_PFR_H didn't work at all. + + - Type 1 font files in binary format (PFB) with an end-of-file + indicator weren't accepted by the FreeType engine. + + - Fonts which contain /PaintType and /StrokeWidth no longer cause + a segfault. This bug has been introduced in version 2.1.5. + + - Fonts loaded with FT_LOAD_RENDER no longer cause strange + results. This bug has been introduced in version 2.1.5. + + - Some Windows (bitmap) FNT/FON files couldn't be handled + correctly. + + + II. IMPORTANT CHANGES + + - The internal module API has been heavily changed in favor of + massive simplifications within the font engine. This also means + that authors of third-party modules must adapt their code to the + new scheme. + + NOTE: THE NEW SCHEME IS NOT COMPLETED YET. PLEASE WAIT UNTIL A + FINAL ANNOUNCEMENT! + + - The PostScript parser has been enhanced to handle comments and + strings correctly. Additionally, more syntax forms are + recognized. + + - Added the optional unpatented hinting system for TrueType. It + allows typefaces which need hinting to produce correct glyph + forms (e.g., Chinese typefaces from Dynalab) to work acceptably + without infringing Apple patents. This system is compiled only + if TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING is defined in + ftoption.h (activated by default). + + + III. MISCELLANEOUS + + - There is now a guard in the public header files to protect + against inclusion of freetype.h from FreeType 1. + + - Direct inclusion of freetype.h and other public header files no + longer works. You have to use the documented scheme + + #include + #include FT_FREETYPE_H + + to load freetype.h with a symbolic name. This protects against + renaming of public header files (which shouldn't happen but + actually has, avoiding two public header files with the same + name). + + +====================================================================== + +CHANGES BETWEEN 2.1.5 and 2.1.4 + + I. IMPORTANT BUG FIXES + + - Parsing the /CIDFontName field now removes the leading slash to + be in sync with other font drivers. + + - gzip support was buggy. Some fonts could not be read. + + - Fonts which have nested subglyphs more than one level deep no + longer cause a segfault. + + - Creation of synthetic cmaps for fonts in CFF format was broken + partially. + + - Numeric font dictionary entries for synthetic fonts are no + longer overwritten. + + - The font matrix wasn't applied to the advance width for Type1, + CID, and CFF fonts. This caused problems when loading certain + synthetic Type 1 fonts like `Helvetica Narrow'. + + - The test for the charset registry in BDF and PCF fonts is now + case-insensitive. + + - FT_Vector_Rotate sometimes returned strange values due to + rounding errors. + + - The PCF driver now returns the correct number of glyphs + (including an artificial `notdef' glyph at index 0). + + - FreeType now supports buggy CMaps which are contained in many + CJK fonts from Dynalab. + + - Opening an invalid font on a Mac caused a segfault due to + double-freeing memory. + + - BDF fonts with more than 32768 glyphs weren't supported + properly. + + + II. IMPORTANT CHANGES + + - Accessing bitmap font formats has been synchronized. To do that + the FT_Bitmap_Size structure has been extended to contain new + fields `size', `x_ppem', and `y_ppem'. + + - The FNT driver now returns multiple faces, not multiple strikes. + + - The `psnames' module has been updated to the Adobe Glyph List + version 2.0. + + - The `psnames' module now understands `uXXXX[X[X]]' glyph names. + + - The algorithm for guessing the font style has been improved. + + - For fonts in SFNT format, root->height is no longer increased if + the line gap is zero. There exist fonts (containing e.g. form + drawing characters) which intentionally have a zero line gap + value. + + - ft_glyph_bbox_xxx flags are now deprecated in favour of + FT_GLYPH_BBOX_XXX. + + - ft_module_xxx flags are now deprecated in favour of + FT_MODULE_XXX. + + - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB} are now + deprecated in favour of + FT_ENCODING_{SJIS,GB2312,GIB5,WANSONG,JOHAB} -- those encodings + are not specific to Microsoft. + + + III. MISCELLANEOUS + + - The autohinter has been further improved; for example, `m' + glyphs now retain its vertical symmetry. + + - Partial support of Mac fonts on non-Mac platforms. + + - `make refdoc' (after first `make') builds the HTML + documentation. You need Python for this. + + - The make build system should now work more reliably on DOS-like + platforms. + + - Support for EMX gcc and Watson C/C++ compilers on MS-DOS has + been added. + + - Better VMS build support. + + - Support for the pkg-config package by providing a `freetype.pc' + file. + + - New configure option --with-old-mac-fonts for Darwin. + + - Some source files have been renamed (mainly to fit into the 8.3 + naming scheme). + + +====================================================================== + +CHANGES BETWEEN 2.1.4 and 2.1.3 + + I. IMPORTANT BUG FIXES + + - Updated to newest libtool version, fixing build problems on + various platforms. + + - A fix in the Gzip stream reader: It couldn't read certain .gz + files properly due to a small typo. In certain cases, FreeType + could also loop endlessly when trying to load tiny gzipped + files. + + - The configure script now tries to use the system-wide zlib when + it finds one (instead of the copy found in src/gzip). And + `freetype-config' has been updated to return relevant flags in + this case when invoked with `--libs' (e.g. `-lzlib'). + + - Certain fonts couldn't be loaded by 2.1.3 because they lacked a + Unicode charmap (e.g. SYMBOL.TTF). FreeType erroneously + rejected them. + + - The CFF loader was modified to accept fonts which only contain a + subset of their reference charset. This prevented the correct + use of PDF-embedded fonts. + + - The logic to detect Unicode charmaps has been modified. This is + required to support fonts which include both 16-bit and 32-bit + charmaps (like very recent asian ones) using the new 10 and 12 + SFNT formats. + + - The TrueType loader now limits the depth of composite glyphs. + This is necessary to prevent broken fonts to break the engine by + blowing the stack with recursive glyph definitions. + + - The CMap cache is now capable of managing UCS-4 character codes + that are mapped through extended charmaps in recent + TrueType/OpenType fonts. + + - The cache sub-system now properly manages out-of-memory + conditions instead of blindly reporting them to the caller. + This means that it will try to empty the cache before restarting + its allocations to see if that can help. + + - The PFR driver didn't return the list of available embedded + bitmaps properly. + + - There was a nasty memory leak when using embedded bitmaps in + certain font formats. + + + II. IMPORTANT CHANGES + + - David Chester contributed some enhancements to the auto-hinter + that significantly increase the quality of its output. The + Postscript hinter was also improved in several ways. + + - The FT_RENDER_MODE_LIGHT render mode was implemented. + + - A new API function called `FT_Get_BDF_Property' has been added + to FT_BDF_H to retrieve BDF properties from BDF _and_ PCF font + files. THIS IS STILL EXPERIMENTAL, since it hasn't been + properly tested yet. + + - A Windows FNT specific API has been added, mostly to access font + headers. This is used by Wine. + + - TrueType tables without an `hmtx' table are now tolerated when + an incremental interface is used. This happens for certain + Type42 fonts passed from Ghostscript to FreeType. + + - The PFR font driver is now capable of returning the font family + and style names when they are available (instead of the sole + `FontID'). This is performed by parsing an *undocumented* + portion of the font file! + + + III. MISCELLANEOUS + + - The path stroker in FT_STROKER_H has entered beta stage. It now + works very well, but its interface might change a bit in the + future. More on this in later releases. + + - The documentation for FT_Size_Metrics didn't appear properly in + the API reference. + + - The file docs/VERSION.DLL has been updated to explain versioning + with FreeType (i.e., comparing release/libtool/so numbers, and + how to use them in autoconf scripts). + + - The installation documentation has been seriously revamped. + Everything is now in the `docs' directory. + + +====================================================================== + +CHANGES BETWEEN 2.1.3 and 2.1.2 + + I. IMPORTANT BUG FIXES + + - FT_Vector_Transform had been incorrectly modified in 2.1.2, + resulting in incorrect transformations being applied (for + example, rotations were processed in opposite angles). + + - The format 8 and 12 TrueType charmap enumeration routines have + been fixed (FT_Get_Next_Char returned invalid values). + + - The PFR font driver returned incorrect advance widths if the + outline and metrics resolution defined in the font file were + different. + + - FT_Glyph_To_Bitmap now returns successfully when called with an + FT_BitmapGlyph argument (it previously returned an error). + + - A bug in the Type 1 loader that prevented valid font bounding + boxes to be loaded from multiple master fonts. + + - The SFNT validation code has been rewritten. FreeType can now + load `broken' fonts that were usable on Windows, but not with + previous versions of the library. + + - The computation of bearings in the BDF driver has been fixed. + + - The Postscript hinter crashed when trying to hint certain glyphs + (more precisely, when trying to apply hints to an empty glyph + outline). + + - The TrueType glyph loader now supports composites in `Apple + format' (they differ slightly from Microsoft/OpenType ones in + the way transformation offsets are computed). + + - FreeType was very slow at opening certain asian CID/CFF fonts, + due to fixed increment in dynamic array re-allocations. This + has been changed to exponential behaviour to get acceptable + performance. + + + + II. IMPORTANT CHANGES + + - The PCF driver now supports gzip-compressed font files natively. + This means that you will be able to use all these bitmap fonts + that come with XFree86 with FreeType (and libXft/libXft2, by + extension). + + - The automatic and postscript hinters have both been updated. + This results in a relatively important increase of rendering + quality since many nasty defaults have been suppressed. Please + visit the web page: + + http://www.freetype.org/hinting/smooth-hinting.html + + for additional details on this topic. + + - The `load_flags' parameter of `FT_Load_Glyph' is now an FT_Int32 + (instead of just being an FT_Int). This breaks source and + binary compatibility for 16bit systems only, while retaining + both of them for 32 and 64 bit ones. + + Some new flags have been added consequently: + + FT_LOAD_NO_AUTOHINT :: Disable the use of the auto-hinter + (but not native format hinters). + + FT_LOAD_TARGET_NORMAL :: Hint and render for normal + anti-aliased displays. + + FT_LOAD_TARGET_MONO :: Hint and render for 1-bit displays. + + FT_LOAD_TARGET_LCD :: Hint and render for horizontal RGB or + BGR sub-pixel displays (like LCD + screens). THIS IS STILL + EXPERIMENTAL! + + FT_LOAD_TARGET_LCD_V :: Same as FT_LOAD_TARGET_LCD, for + vertical sub-pixel displays (like + rotated LCD screens). THIS IS STILL + EXPERIMENTAL! + + FT_LOAD_MONOCHROME is still supported, but only affects + rendering, not the hinting. + + Note that the `ftview' demo program available in the `ft2demos' + package has been updated to support LCD-optimized display on + non-paletted displays (under Win32 and X11). + + - The PFR driver now supports embedded bitmaps (all formats + supported), and returns correct kerning metrics for all glyphs. + + - The TrueType charmap loader now supports certain `broken' fonts + that load under Windows without problems. + + - The cache API has been slightly modified (it's still a beta!): + + - The type FTC_ImageDesc has been removed; it is now replaced + by FTC_ImageTypeRec. Note that one of its fields is a + `load_flag' parameter for FT_Load_Glyph. + + - The field `num_grays' of FT_SBitRec has been changed to + `max_grays' in order to fit within a single byte. Its + maximum value is thus 255 (instead of 256 as previously). + + + III. MISCELLANEOUS + + - Added support for the DESTDIR variable during `make install'. + This simplifies packaging of FreeType. + + - Included modified copies of the ZLib sources in `src/gzip' in + order to support gzip-compressed PCF fonts. We do not use the + system-provided zlib for now, though this is a probable + enhancement for future releases. + + - The DocMaker tool used to generate the on-line API reference has + been completely rewritten. It is now located in + `src/tools/docmaker/docmaker.py'. Features: + + - better cross-referenced output + - more polished output + - uses Python regular expressions (though it didn't speed the + program) + - much more modular structure, which allows for different + `backends' in order to generate HTML, XML, or whatever + format. + + One can regenerate the API reference by calling: + + python src/tools/docmaker/docmaker.py \ + --prefix=ft2 \ + --title=FreeType-2.1.3 \ + --output= + include/freetype/*.h \ + include/freetype/config/*.h \ + include/freetype/cache/*.h + + - A new, experimental, support for incremental font loading (i.e., + loading of fonts where the glyphs are not in the font file + itself, but provided by an external component, like a Postscript + interpreter) has been added by Graham Asher. This is still work + in progress, however. + + - A new, EXPERIMENTAL, path stroker has been added. It doesn't + suffer from severe rounding errors and treat bezier arcs + directly. Still work in progress (i.e. not part of the official + API). See the file for some of the + details. + + - The massive re-formatting of sources and internal re-design is + still under-way. Many internal functions, constants, and types + have been renamed. + + +====================================================================== + +CHANGES BETWEEN 2.1.2 and 2.1.1 + + I. IMPORTANT BUG FIXES + + - Many font drivers didn't select a Unicode charmap by default + when a new face was opened (with the FT_CONFIG_OPTION_USE_CMAPS + options enabled), causing many applications to not be able to + display text correctly with the 2.1.x releases. + + - The PFR driver had a bug in its composite loading code that + produces incorrectly placed accents with many fonts. + + - The Type42 driver crashed sometimes due to a nasty bug. + + - The Type 1 custom encoding charmap didn't handle the case where + the first glyph index wasn't 0. + + - A serious typo in the TrueType composite loader produced + incorrectly placed glyphs in fonts like `Wingdings' and a few + others. + + + II. MISCELLANEOUS + + - The Win32 Visual C++ project file has been updated to include + the PFR driver as well. + + - `freetype.m4' is now installed by default by `make install' on + Unix systems. + + - The function FT_Get_PS_Font_Info now works with CID and Type42 + fonts as well. + + +====================================================================== + +CHANGES BETWEEN 2.1.1 and 2.1.0 + + I. IMPORTANT BUG FIXES + + - The `version_info' returned by `freetype-config' in 2.1.0 + returned an invalid value. It now returns 9:1:3 (2.0.9 returned + 9:0:3). + + - Version 2.1.0 couldn't be linked against applications on Win32 + and Amiga systems due to a new debug function that wasn't + properly propagated to the system-specific directory in + `builds'. + + - Various MacOS and Mac OS X specific fixes. + + - Fixed a bug in the TrueType charmap validation routines that + made version 2.1.0 too restrictive -- many popular fonts have + been rejected. + + - There was still a very small difference between the monochrome + glyph bitmaps produced by FreeType 1.x and FreeType 2.x with the + bytecode interpreter enabled. This was caused by an invalid + flag setting in the TrueType glyph loader, making the rasterizer + change its drop-out control mode. Now the results should + _really_ be completely identical. + + - The TrueType name table loader has been improved to support many + popular though buggy Asian fonts. It now ignores empty name + entries, invalid pointer offsets and a few other incorrect + subtleties. Moreover, name strings are now loaded on demand, + which reduces the memory load of many faces (e.g. the ARIAL.TTF + font file contains a 10kByte name table with 70 names). + + - Fixed a bug in the Postscript hinter that prevented family blues + substitution to happen correctly. + + + II. NEW FEATURES + + - Three new font drivers in this release: + + * A BDF font driver, contributed by Franco Zappa Nardelli, + heavily modified by Werner Lemberg. It also supports + anti-aliased bitmaps (using a slightly extended BDF format). + + * A Type42 font driver, contributed by Roberto Alameda. It is + still experimental but seems to work relatively well. + + * A PFR font driver, contributed by David Turner himself. It + doesn't support PFR hinting -- note that BitStream has at + least two patents on this format! + + + III. MISCELLANEOUS + + - The cache sub-system has been optimized in important ways. + Cache hits are now significantly faster. For example, using the + CMap cache is about twice faster than calling FT_Get_Char_Index + on most platforms. Similarly, using an SBit cache is about five + times faster than loading the bitmaps from a bitmap file, and + 300 to 500 times faster than generating them from a scalable + format. + + Note that you should recompile your sources if you designed a + custom cache class for the FT2 Cache subsystem, since the + changes performed are source, but not binary, compatible. + + +====================================================================== + +CHANGES BETWEEN 2.1.0 and 2.0.9 + + I. IMPORTANT BUG FIXES + + - The TrueType bytecode interpreter has been fixed to produce + _exactly_ the same output as FreeType 1.x. Previous differences + were due to slightly distinct fixed-point computation routines + used to perform dot products and vector length measurements. + + It seems that native TrueType hinting is _extremely_ sensitive + to rounding errors. The required vector computation routines + have been optimized and placed within the `ttinterp.c' file. + + - Fixed the parsing of accelerator tables in the PCF font driver. + + - Fixed the Type1 glyph loader routine used to compute the font's + maximum advance width. + + + II. NEW FEATURES + + - The `configure' script used on Unix systems has been modified to + check that GNU Make is being used to build the library. + Otherwise, it will display a message proposing to use the + GNUMAKE environment variable to name it. + + The Unix-specific file README.UNX has been modified accordingly. + + + III. MISCELLANEOUS + + - The FreeType License in `docs/FTL.TXT' has been updated to + include a proposed preferred disclaimer. If you are using + FreeType in your products, you are encouraged (but not mandated) + to use the following text in your documentation: + + """ + Portions of this software are copyright © 1996-2002 The + FreeType Project (www.freetype.org). All rights reserved. + """ + + - The default size of the render pool has been reduced to 16kByte. + This shouldn't result in any noticeable performance penalty, + unless you are using the engine as-is to render very large and + complex glyphs. + + - The FreeType 2 redesign has begun. More information can be + found at this URL: + + http://www.freetype.org/freetype2/redesign.html + + The following internal changes have been performed within the + sources of this release: + + - Many internal types have been renamed to increase + consistency. The following should be true, except for + public types: + + * All structure types have a name ending in `Rec' (short + for `record'). + + * A pointer-to-structure type has the same name as the + structure, _without_ the `Rec' suffix. + + Example: + + typedef struct FooRec_ + { + ... + + } FooRec, *Foo; + + - Many internal macros have been renamed to increase + consistency. The following should be true: + + * All macros have a name beginning with `FT_'. This + required a few changes like + + ALLOC => FT_ALLOC + FREE => FT_FREE + REALLOC => FT_REALLOC + + * All macros are completely UPPERCASE. This required a + few changes like: + + READ_Short => FT_READ_SHORT + NEXT_Short => FT_NEXT_SHORT + GET_ULongLE => FT_GET_ULONG_LE + MEM_Set => FT_MEM_SET + MEM_Copy => FT_MEM_COPY + etc. + + * Whenever possible, all macro names follow the + FT__ pattern. For example + + ACCESS_Frame => FT_FRAME_ENTER + FORGET_Frame => FT_FRAME_EXIT + EXTRACT_Frame => FT_FRAME_EXTRACT + RELEASE_Frame => FT_FRAME_RELEASE + + FILE_Pos => FT_STREAM_POS + FILE_Seek => FT_STREAM_SEEK + FILE_Read => FT_STREAM_READ + FILE_ReadAt => FT_STREAM_READ_AT + READ_Fields => FT_STREAM_READ_FIELDS + + - Many internal functions have been renamed to follow the + FT__ pattern. For example: + + FT_Seek_Stream => FT_Stream_Seek + FT_Read_Stream_At => FT_Stream_ReadAt + FT_Done_Stream => FT_Stream_Close + FT_New_Stream => FT_Stream_Open + FT_New_Memory_Stream => FT_Stream_OpenMemory + FT_Extract_Frame => FT_Stream_ExtractFrame + + Note that method names do not contain `_'. + + - The FT_ALLOC_ARRAY and FT_REALLOC_ARRAY have been replaced + with FT_NEW_ARRAY and FT_RENEW_ARRAY which do not take a + type as the fourth argument. Instead, the array element + type size is computed automatically from the type of the + target pointer used. + + - A new object class, FT_CMap, has been introduced. These + internal objects are used to model character maps. This + eases the support of additional charmap types within the + engine. + + - A new configuration file named `ftstdlib.h' has been added + to `include/freetype/config'. It is used to define aliases + for _every_ routine of the ISO C library that the font + engine uses. Each aliases has a `ft_' prefix + (e.g. `ft_strlen' is an alias for `strlen'). + + This is used to ease the porting of FreeType 2 to exotic + runtime environments where the ISO C Library isn't available + (e.g. XFree86 extension modules). + + More details are available in the `ChangeLog' file. + + +====================================================================== + +CHANGES BETWEEN 2.0.9 and 2.0.8 + + I. IMPORTANT BUG FIXES + + - Certain fonts like `foxjump.ttf' contain broken name tables with + invalid entries and wild offsets. This caused FreeType to crash + when trying to load them. + + The SFNT `name' table loader has been fixed to be able to + support these strange fonts. + + Moreover, the code in charge of processing this table has been + changed to always favour Windows-formatted entries over other + ones. Hence, a font that works on Windows but not on the Mac + will load cleanly in FreeType and report accurate values for + Family & PostScript names. + + - The CID font driver has been fixed. It unfortunately returned a + Postscript Font name with a leading slash, as in + `/MunhwaGothic-Regular'. + + - FreeType 2 should now compile fine on AIX 4.3.3 as a shared + library. + + - A bug in the Postscript hinter has been found and fixed, + removing un-even stem widths at small pixel sizes (like 14-17). + + This improves the quality of a certain number of Postscript + fonts. + + + II. NEW FEATURES + + - A new function named `FT_Library_Version' has been added to + return the current library's major, minor, and patch version + numbers. This is important since the macros FREETYPE_MAJOR, + FREETYPE_MINOR, and FREETYPE_PATCH cannot be used when the + library is dynamically linked by a program. + + - Two new APIs have been added: `FT_Get_First_Char' and + `FT_Get_Next_Char'. + + Together, these can be used to iterate efficiently over the + currently selected charmap of a given face. Read the API + reference for more details. + + + III. MISCELLANEOUS + + - The FreeType sources are under heavy internal re-factoring. As + a consequence, we have created a branch named `STABLE' on the + CVS to hold all future releases/fixes in the 2.0.x family. + + The HEAD branch now contains the re-factored sources and + shouldn't be used for testing or packaging new releases. In + case you would like to access the 2.0.9 sources from our CVS + repository, use the tag `VER-2-0-9'. + + +====================================================================== + +CHANGES BETWEEN 2.0.8 and 2.0.7 + + I. IMPORTANT BUG FIXES + + - There was a small but nasty bug in `freetype-config.in' which + caused the `freetype-config' script to fail on Unix. + + This didn't prevent the installation of the library or even its + execution, but caused problems when trying to compile many Unix + packages that depend on it. + + - Some TrueType or OpenType fonts embedded in PDF documents do not + have a 'cmap', 'post' and 'name' as is required by the + specification. FreeType no longer refuses to load such fonts. + + - Various fixes to the PCF font driver. + + +====================================================================== + +CHANGES BETWEEN 2.0.7 and 2.0.6 + + I. IMPORTANT BUG FIXES + + - Fixed two bugs in the Type 1 font driver. The first one + resulted in a memory leak in subtle cases. The other one caused + FreeType to crash when trying to load `.gsf' files (Ghostscript + so-called Postscript fonts). + + (This made _many_ KDE applications crash on certain systems. + FreeType _is_ becoming a critical system component on Linux :-) + + - Fixed a memory leak in the CFF font driver. + + - Fixed a memory leak in the PCF font driver. + + - Fixed the Visual C++ project file + `builds/win32/visualc/freetype.dsp' since it didn't include the + Postscript hinter component, causing errors at build time. + + - Fixed a small rendering bug in the anti-aliased renderer that + only occurred when trying to draw thin (less than 1 pixel) + strokes. + + - Fixed `builds/unix/freetype2.a4' which is used to generate a + valid `freetype2.m4' for use with autoconf. + + - Fixed the OpenVMS Makefiles. + + + II. MISCELLANEOUS + + - Added `configure' and `install' scripts to the top-level + directory. A GNU-style installation is thus now easily possible + with + + ./configure + make + make install + + +====================================================================== + +CHANGES BETWEEN 2.0.6 and 2.0.5 + + I. IMPORTANT BUG FIXES + + - It wasn't possible to load embedded bitmaps when the auto-hinter + was used. This is now fixed. + + - The TrueType font driver didn't load some composites properly + (the sub-glyphs were slightly shifted, and this was only + noticeable when using monochrome rendering). + + - Various fixes to the auto-hinter. They merely improve the + output of sans-serif fonts. Note that there are still problems + with serifed fonts and composites (accented characters). + + - All scalable font drivers erroneously returned un-fitted glyph + advances when hinting was requested. This created problems for + a number of layout applications. This is a very old bug that + got undetected mainly because most test/demo program perform + rounding explicitly or implicitly (through the cache). + + - `FT_Glyph_To_Bitmap' did erroneously modify the source glyph in + certain cases. + + - `glnames.py' still contained a bug that made FreeType return + invalid names for certain glyphs. + + - The library crashed when loading certain Type 1 fonts like + `sadn.pfb' (`Stalingrad Normal'), which appear to contain + pathetic font info dictionaries. + + - The TrueType glyph loader is now much more paranoid and checks + everything when loading a given glyph image. This was necessary + to avoid problems (crashes and/or memory overwrites) with broken + fonts that came from a really buggy automatic font converter. + + + II. IMPORTANT UPDATES AND NEW FEATURES + + - Important updates to the Mac-specific parts of the library. + + - The caching sub-system has been completely re-designed, and its + API has evolved (the old one is still supported for backward + compatibility). + + The documentation for it is not yet completed, sorry. For now, + you are encouraged to continue using the old API. However, the + ftview demo program in the ft2demos package has already been + updated to use the new caching functions. + + - A new charmap cache is provided too. See `FTC_CMapCache'. This + is useful to perform character code -> glyph index translations + quickly, without the need for an opened FT_Face. + + - A NEW POSTSCRIPT HINTER module has been added to support native + hints in the following formats: PostScript Type 1, PostScript + CID, and CFF/CEF. + + Please test! Note that the auto-hinter produces better results + for a number of badly-hinted fonts (mostly auto-generated ones) + though. + + - A memory debugger is now part of the standard FreeType sources. + To enable it, define FT_DEBUG_MEMORY in + , and recompile the library. + + Additionally, define the _environment_ variable FT_DEBUG_MEMORY + and run any program using FreeType. When the library is exited, + a summary of memory footprints and possible leaks will be + displayed. + + This works transparently with _any_ program that uses FreeType. + However, you will need a lot of memory to use this (allocated + blocks are never released to the heap to detect double deletes + easily). + + + III. MISCELLANEOUS + + - We are aware of subtle differences between the output of + FreeType versions 1 and 2 when it comes to monochrome + TrueType-hinted glyphs. These are most probably due to small + differences in the monochrome rasterizers and will be worked out + in an upcoming release. + + - We have decided to fork the sources in a `stable' branch, and an + `unstable' one, since FreeType is becoming a critical component + of many Unix systems. + + The next bug-fix releases of the library will be named 2.0.7, + 2.0.8, etc., while the `2.1' branch will contain a version of + the sources where we will start major reworking of the library's + internals, in order to produce FreeType 2.2.0 (or even 3.0) in a + more distant future. + + We also hope that this scheme will allow much more frequent + releases than in the past. + + +====================================================================== + +CHANGES BETWEEN 2.0.5 and 2.0.4 + + NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER. THIS MODULE + WILL BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1) + + - Fixed a bug that made certain glyphs, like `Cacute', `cacute' and + `lslash' unavailable from Unicode charmaps of Postscript fonts. + This prevented the correct display of Polish text, for example. + + - The kerning table of Type 1 fonts was loaded by FreeType, when its + AFM file was attached to its face, but the + FT_FACE_FLAG_HAS_KERNING bit flags was not set correctly, + preventing FT_Get_Kerning to return meaningful values. + + - Improved SFNT (TrueType & OpenType) charmap support. Slightly + better performance, as well as support for the new formats defined + by the OpenType 1.3 specification (8, 10, and 12) + + - Fixed a serious typo in `src/base/ftcalc.c' which caused invalid + computations in certain rare cases, producing ugly artefacts. + + - The size of the EM square is computed with a more accurate + algorithm for Postscript fonts. The old one caused slight errors + with embedded fonts found in PDF documents. + + - Fixed a bug in the cache manager that prevented normal LRU + behaviour within the cache manager, causing unnecessary reloads + (for FT_Face and FT_Size objects only). + + - Added a new function named `FT_Get_Name_Index' to retrieve the + glyph index of a given glyph name, when found in a face. + + - Added a new function named `FT_Get_Postscript_Name' to retrieve + the `unique' Postscript font name of a given face. + + - Added a new public header size named FT_SIZES_H (or + ) providing new FT_Size-management functions: + FT_New_Size, FT_Activate_Size, FT_Done_Size. + + - Fixed a reallocation bug that generated a dangling pointer (and + possibly memory leaks) with Postscript fonts (in + src/psaux/psobjs.c). + + - Many fixes for 16-bit correctness. + + - Removed many pedantic compiler warnings from the sources. + + - Added an Amiga build directory in `builds/amiga'. + + +====================================================================== + +CHANGES BETWEEN 2.0.4 and 2.0.3 + + - Fixed a rather annoying bug that was introduced in 2.0.3. Namely, + the font transformation set through FT_Set_Transform was applied + twice to auto-hinted glyphs, resulting in incorrectly rotated text + output. + + - Fixed _many_ compiler warnings. FT2 should now compile cleanly + with Visual C++'s most pedantic warning level (/W4). It already + compiled fine with GCC and a few other compilers. + + - Fixed a bug that prevented the linear advance width of composite + TrueType glyphs to be correctly returned. + + - Fixed the Visual C++ project files located in + `builds/win32/visualc' (previous versions used older names of the + library). + + - Many 32-bit constants have an `L' appended to their value, in + order to improve the 16-bitness of the code. Someone is actually + trying to use FT2 on an Atari ST machine! + + - Updated the `builds/detect.mk' file in order to automatically + build FT2 on AIX systems. AIX uses `/usr/sbin/init' instead of + `/sbin/init' and wasn't previously detected as a Unix platform by + the FreeType build system. + + - Updated the Unix-specific portions of the build system (new + libtool version, etc.). + + - The SFNT kerning loader now ensures that the table is sorted + (since some problem fonts do not meet this requirement). + + +======================================================================= + +CHANGES BETWEEN 2.0.3 and 2.0.2 + + I. CHANGES TO THE MODULES / FONT DRIVERS + + - THE AUTO-HINTER HAS BEEN SLIGHTLY IMPROVED, in order to fix + several annoying artefacts, mainly: + + - Blue zone alignment of horizontal stems wasn't performed + correctly, resulting in artefacts like the `d' being placed + one pixel below the `b' in some fonts like Time New Roman. + + - Overshoot thresholding wasn't performed correctly, creating + unpleasant artefacts at large character pixel sizes. + + - Composite glyph loading has been simplified. This gets rid + of various artefacts where the components of a composite + glyphs were not correctly spaced. + + These are the last changes to the current auto-hinting module. + A new hinting sub-system is currently in the work in order to + support native hints in Type 1 / CFF / OpenType fonts, as well + as globally improve rendering. + + - The PCF driver has been fixed. It reported invalid glyph + dimensions for the fonts available on Solaris. + + - The Type 1, CID and CFF drivers have been modified to fix the + computation of the EM size. + + - The Type 1 driver has been fixed to avoid a dangerous bug that + crashed the library with non-conforming fonts (i.e. ones that do + not place the .notdef glyph at position 0). + + - The TrueType driver had a rather subtle bug (dangling pointer + when loading composite glyphs) that could crash the library in + rare occasions! + + + II. HIGH-LEVEL API CHANGES + + - The error code enumeration values have been changed. An error + value is decomposed in a generic error code, and a module + number. see for details. + + - A new public header file has been introduced, named + FT_TRIGONOMETRY_H (include/freetype/fttrig.h), providing + trigonometric functions to compute sines, cosines, arctangents, + etc. with 16.16 fixed precision. The implementation is based on + the CORDIC algorithm and is very fast while being sufficiently + accurate. + + + III. INTERNALS + + - Added BeOS-specific files in the old build sub-system. Note + that no changes were required to compile the library with Jam. + + - The configuration is now capable of automatically detecting + 64-bit integers on a set of predefined compilers (GCC, Visual + C++, Borland C++) and will use them by default. This provides a + small performance boost. + + - A small memory leak that happened when opening 0-sized files + (duh!) have been fixed. + + - Fixed bezier stack depth bug in the routines provided by the + FT_BBOX_H header file. Also fixed similar bugs in the + rasterizers. + + - The outline bounding box code has been rewritten to use direct + computations, instead of bezier sub-division, to compute the + exact bounding box of glyphs. This is slightly slower but more + accurate. + + - The build system has been improved and fixed, mainly to support + `make' on Windows 2000 correctly, avoid problems with `make + distclean' on non Unix systems, etc. + + - Hexadecimal constants have been suffixed with `U' to avoid + problems with certain compilers on 64-bit platforms. + + - A new directory named `src/tools' has been created. It contains + Python scripts and simple unit test programs used to develop the + library. + + - The DocMaker tool has been moved from `docs' to `src/tools' and + has been updated with the following: + + - Now accepts the `--title=XXXX' or `-t XXXX' option from the + command line to set the project's name in the generated API + reference. + + - Now accepts the `--output=DIR' or `-o DIR' option from the + command line to set the output directory for all generated + HTML files. + + - Now accepts the `--prefix=XXXX' or `-p XXX' option from the + command line to set the file prefix to use for all + generated HTML files. + + - Now generates the current time/data on each generated page + in order to distinguish between versions. + + DocMaker can be used with other projects now, not only FT2 + (e.g. MLib, FTLayout, etc.). + + +====================================================================== + +CHANGES BETWEEN 2.0.2 and 2.0.1 + + I. CHANGES TO THE MODULES / FONT DRIVERS + + - THE TRUETYPE BYTECODE INTERPRETER IS NOW TURNED OFF, in order to + avoid legal problems with the Apple patents. It seems that we + mistakenly turned this option on in previous releases of the + build. + + Note that if you want to use the bytecode interpreter in order + to get high-quality TrueType rendering, you will need to toggle + by hand the definition of the + TT_CONFIG_OPTION_BYTECODE_INTERPRETER macro in the file + `include/freetype/config/ftoption.h'. + + - The CFF driver has been improved by Tom Kacvinsky and Sander van + der Wal: + + * Support for `seac' emulation. + * Support for `dotsection'. + * Support for retrieving glyph names through + `FT_Get_Glyph_Name'. + + The first two items are necessary to correctly a large number of + Type 1 fonts converted to the CFF formats by Adobe Acrobat. + + - The Type 1 driver was also improved by Tom & others: + + * Better EM size computation. + * Better support for synthetic (transformed) fonts. + * The Type 1 driver returns the charstrings corresponding to + each glyph in the `glyph->control_data' field after a call to + `FT_Load_Glyph' (thanks Ha Shao). + + - Various other bugfixes, including the following: + + * Fixed a nasty memory leak in the Type 1 driver. + * The autohinter and the pcf driver used static writable data + when they shouldn't. + * Many casts were added to make the code more 64-bits safe. It + also now compiles on Windows XP 64-bits without warnings. + * Some incorrect writable statics were removed in the `autohint' + and `pcf' drivers. FreeType 2 now compiles on Epoc again. + + + II. CHANGES TO THE HIGH-LEVEL API + + - The library header files inclusion scheme has been changed. The + old scheme looked like: + + #include + #include + #include + #include + + Now you should use: + + #include + #include FT_FREETYPE_H + #include FT_GLYPH_H + #include FT_CACHE_H + #include FT_CACHE_IMAGE_H + + NOTE THAT THE OLD INCLUSION SCHEME WILL STILL WORK WITH THIS + RELEASE. HOWEVER, WE DO NOT GUARANTEE THAT THIS WILL STILL BE + TRUE IN THE NEXT ONE (A.K.A. FREETYPE 2.1). + + The file is used to define the header filename + macros. The complete and commented list of macros is available + in the API reference under the section name `Header File Macros' + in Chapter I. + + For more information, see section I of the following document: + + http://www.freetype.org/ + freetype2/docs/tutorial/step1.html + + or + + http://freetype.sourceforge.net/ + freetype2/docs/tutorial/step1.html + + - Many, many comments have been added to the public source file in + order to automatically generate the API Reference through the + `docmaker.py' Python script. + + The latter has been updated to support the grouping of sections + in chapters and better index sort. See: + + http://www.freetype.org/freetype2/docs/reference/ft2-toc.html + + + III. CHANGES TO THE BUILD PROCESS + + - If you are not building FreeType 2 with its own build system + (but with your own Makefiles or project files), you will need to + be aware that the build process has changed a little bit. + + You don't need to put the `src' directory in the include path + when compiling any FT2 component. Instead, simply put the + component's directory in the current include path. + + So, if you were doing something like: + + cc -c -Iinclude -Isrc src/base/ftbase.c + + change the line to: + + cc -c -Iinclude -Isrc/base src/base/ftbase.c + + If you were doing something like: + + cd src/base + cc -c -I../../include -I.. ftbase.c + + change it to: + + cd src/base + cc -c -I../../include ftbase.c + + +====================================================================== + +CHANGES BETWEEN 2.0.1 and 2.0 + + 2.0.1 introduces a few changes: + + - Fixed many bugs related to the support of CFF / OpenType fonts. + These formats are now much better supported though there is + still work planned to deal with charset tables and PDF-embedded + CFF files that use the old `seac' command. + + - The library could not be compiled in debug mode with a very + small number of C compilers whose pre-processors didn't + implement the `##' directive correctly (i.e. per se the ANSI C + specification!) An elegant fix was found. + + - Added support for the free Borland command-line C++ Builder + compiler. Use `make setup bcc32'. Also fixed a few source + lines that generated new warnings with BCC32. + + - Fixed a bug in FT_Outline_Get_BBox when computing the extrema of + a conic Bezier arc. + + - Updated the INSTALL file to add IDE compilation. + + - Other minor bug fixes, from invalid Type 1 style flags to + correct support of synthetic (obliqued) fonts in the + auto-hinter, better support for embedded bitmaps in a SFNT font. + + - Fixed some problems with `freetype-config'. + + Finally, the `standard' scheme for including FreeType headers is now + gradually changing, but this will be explained in a later release + (probably 2.0.2). + + And very special thanks to Tom Kacvinsky and YAMANO-UCHI Hidetoshi + for their contributions! + + +====================================================================== + +CHANGES BETWEEN beta8 and 2.0 + + - Changed the default installation path for public headers from + `include/freetype' to `include/freetype2'. + + Also added a new `freetype-config' that is automatically generated + and installed on Unix and Cygwin systems. The script itself is + used to retrieve the current install path, C compilation flags as + well as linker flags. + + - Fixed several small bugs: + + * Incorrect max advance width for fixed-pitch Type 1 fonts. + * Incorrect glyph names for certain TrueType fonts. + * The glyph advance was not copied when FT_Glyph_To_Bitmap was + called. + * The linearHoriAdvance and linearVertAdvance fields were not + correctly returned for glyphs processed by the auto-hinter. + * `type1z' renamed back to `type1'; the old `type1' module has + been removed. + + - Revamped the build system to make it a lot more generic. This + will allow us to re-use nearly un-modified in lots of other + projects (including FreeType Layout). + + - Changed `cid' to use `psaux' too. + + - Added the cache sub-system. See as well as + the sources in `src/cache'. Note that it compiles but is still + untested for now. + + - Updated `docs/docmaker.py', a draft API reference is available at + http://www.freetype.org/ft2api.html. + + - Changed `type1' to use `psaux'. + + - Created a new module named `psaux' to hold the Type 1 & Type 2 + parsing routines. It should be used by `type1', `cid', and `cff' + in the future. + + - Fixed an important bug in `FT_Glyph_Get_CBox'. + + - Fixed some compiler warnings that happened since the TrueType + bytecode decoder was deactivated by default. + + - Fixed two memory leaks: + + * The memory manager (16 bytes) isn't released in + FT_Done_FreeType! + * Using custom input streams, the copy of the original stream was + never released. + + - Fixed the auto-hinter by performing automatic computation of the + `filling direction' of each glyph. This is done through a simple + and fast approximation, and seems to work (problems spotted by + Werner though). The Arphic fonts are a lot nicer though there are + still a lot of things to do to handle Asian fonts correctly. + + +====================================================================== + +BETA-8 (RELEASE CANDIDATE) CHANGES + + - Deactivated the TrueType bytecode interpreter by default. + + - Deactivated the `src/type1' font driver. Now `src/type1z' is used + by default. + + - Updates to the build system. We now compile the library correctly + under Unix system through `configure' which is automatically + called on the first `make' invocation. + + - Added the auto-hinting module! Fixing some bugs here and there. + + - Found some bugs in the composite loader (seac) of the Type1-based + font drivers. + + - Renamed the directory `freetype2/config' to `freetype2/builds' and + updated all relevant files. + + - Found a memory leak in the `type1' driver. + + - Incorporated Tom's patches to support flex operators correctly in + OpenType/CFF fonts. Now all I need is to support pure CFF and CEF + fonts to be done with this driver :-) + + - Added the Windows FNT/FON driver in `src/winfonts'. For now, it + always `simulates' a Unicode charmap, so it shouldn't be + considered completed right now. + + It is there to be more a proof of concept than anything else + anyway. The driver is a single C source file, that compiles to 3 + Kb of code. + + I'm still working on the PCF/BDF drivers, but I'm too lazy to + finish them now. + + - CHANGES TO THE HIGH-LEVEL API + + * FT_Get_Kerning has a new parameter that allows you to select the + coordinates of the kerning vector (font units, scaled, scaled + + grid-fitted). + * The outline functions are now in and not + part of anymore. + * now contains declarations for + FT_New_Library, FT_Done_Library, FT_Add_Default_Modules. + * The so-called convenience functions have moved from `ftoutln.c' + to `ftglyph.c', and are thus available with this optional + component of the library. They are declared in + now. + * Anti-aliased rendering is now the default for FT_Render_Glyph + (i.e. corresponds to render_mode == 0 == ft_render_mode_normal). + To generate a monochrome bitmap, use ft_render_mode_mono, or the + FT_LOAD_MONOCHROME flag in FT_Load_Glyph/FT_Load_Char. + FT_LOAD_ANTI_ALIAS is still defined, but values to 0. + * now include , + solving a few headaches :-) + * The type FT_GlyphSlotRec has now a `library' field. + + - CHANGES TO THE `ftglyph.h' API + + This API has been severely modified in order to make it simpler, + clearer, and more efficient. It certainly now looks like a real + `glyph factory' object, and allows client applications to manage + (i.e. transform, bbox and render) glyph images without ever + knowing their original format. + + - Added support for CID-keyed fonts to the CFF driver. Maybe + support for pure CFF + CEF fonts should come in? + + - Cleaned up source code in order to avoid two functions with the + same name. Also changed the names of the files in `type1z' from + `t1XXXX' to `z1XXXX' in order to avoid any conflicts. + + `make multi' now works well :-) + + Also removed the use of `cidafm' for now, even if the source files + are still there. This functionality will certainly go into a + specific module. + + - ADDED SUPPORT FOR THE AUTO-HINTER + + It works :-) I have a demo program which simply is a copy of + `ftview' that does a `FT_Add_Module(library, + &autohinter_module_class)' after library initialization, and Type + 1 & OpenType/CFF fonts are now hinted. + + CID fonts are not hinted, as they include no charmap and the + auto-hinter doesn't include `generic' global metrics computations + yet. + + Now, I need to release this thing to the FreeType 2 source. + + - CHANGES TO THE RENDERER MODULES + + The monochrome and smooth renderers are now in two distinct + directories, namely `src/raster1' and `src/smooth'. Note that the + old `src/renderer' is now gone. + + I ditched the 5-gray-levels renderers. Basically, it involved a + simple #define toggle in 'src/raster1/ftraster.c'. + + FT_Render_Glyph, FT_Outline_Render & FT_Outline_Get_Bitmap now + select the best renderer available, depending on render mode. If + the current renderer for a given glyph image format isn't capable + of supporting the render mode, another one will be found in the + library's list. This means that client applications do not need + to switch or set the renderers themselves (as in the latest + change), they'll get what they want automatically. At last. + + Changed the demo programs accordingly. + + - MAJOR INTERNAL REDESIGN: + + A lot of internal modifications have been performed lately on the + source in order to provide the following enhancements: + + * More generic module support: + + The FT_Module type is now defined to represent a handle to a + given module. The file contains the + FT_Module_Class definition, as well as the module-loading public + API. + + The FT_Driver type is still defined, and still represents a + pointer to a font driver. Note that FT_Add_Driver is replaced + by FT_Add_Module, FT_Get_Driver by FT_Get_Module, etc. + + * Support for generic glyph image types: + + The FT_Renderer type is a pointer to a module used to perform + various operations on glyph image. + + Each renderer is capable of handling images in a single format + (e.g. ft_glyph_format_outline). Its functions are used to: + + - transform an glyph image + - render a glyph image into a bitmap + - return the control box (dimensions) of a given glyph image + + The scan converters `ftraster.c' and `ftgrays.c' have been moved + to the new directory `src/renderer', and are used to provide two + default renderer modules. + + One corresponds to the `standard' scan-converter, the other to + the `smooth' one. + + he current renderer can be set through the new function + FT_Set_Renderer. + + The old raster-related function FT_Set_Raster, FT_Get_Raster and + FT_Set_Raster_Mode have now disappeared, in favor of the new: + + FT_Get_Renderer + FT_Set_Renderer + + See the file for more details. + + These changes were necessary to properly support different + scalable formats in the future, like bi-color glyphs, etc. + + * Glyph loader object: + + A new internal object, called a 'glyph loader' has been + introduced in the base layer. It is used by all scalable format + font drivers to load glyphs and composites. + + This object has been created to reduce the code size of each + driver, as each one of them basically re-implemented its + functionality. + + See and the FT_GlyphLoader type for + more information. + + * FT_GlyphSlot has new fields: + + In order to support extended features (see below), the + FT_GlyphSlot structure has a few new fields: + + linearHoriAdvance: + + This field gives the linearly scaled (i.e. scaled but + unhinted) advance width for the glyph, expressed as a 16.16 + fixed pixel value. This is useful to perform WYSIWYG text. + + linearVertAdvance: + This field gives the linearly scaled advance height for the + glyph (relevant in vertical glyph layouts only). This is + useful to perform WYSIWYG text. + + Note that the two above field replace the removed `metrics2' + field in the glyph slot. + + advance: + This field is a vector that gives the transformed advance for + the glyph. By default, it corresponds to the advance width, + unless FT_LOAD_VERTICAL_LAYOUT was specified when calling + FT_Load_Glyph or FT_Load_Char. + + bitmap_left: + This field gives the distance in integer pixels from the + current pen position to the left-most pixel of a glyph image + IF IT IS A BITMAP. It is only valid when the `format' field + is set to `ft_glyph_format_bitmap', for example, after calling + the new function FT_Render_Glyph. + + bitmap_top: + This field gives the distance in integer pixels from the + current pen position (located on the baseline) to the top-most + pixel of the glyph image IF IT IS A BITMAP. Positive values + correspond to upwards Y. + + loader: + This is a new private field for the glyph slot. Client + applications should not touch it. + + + * Support for transforms and direct rendering in FT_Load_Glyph: + + Most of the functionality found in has been + moved to the core library. Hence, the following: + + - A transform can be specified for a face through + FT_Set_Transform. this transform is applied by FT_Load_Glyph + to scalable glyph images (i.e. NOT TO BITMAPS) before the + function returns, unless the bit flag FT_LOAD_IGNORE_TRANSFORM + was set in the load flags. + + - Once a glyph image has been loaded, it can be directly + converted to a bitmap by using the new FT_Render_Glyph + function. Note that this function takes the glyph image from + the glyph slot, and converts it to a bitmap whose properties + are returned in `face.glyph.bitmap', `face.glyph.bitmap_left' + and `face.glyph.bitmap_top'. The original native image might + be lost after the conversion. + + - When using the new bit flag FT_LOAD_RENDER, the FT_Load_Glyph + and FT_Load_Char functions will call FT_Render_Glyph + automatically when needed. + + - Reformatted all modules source code in order to get rid of the + basic data types redifinitions (i.e. `TT_Int' instead of `FT_Int', + `T1_Fixed' instead of `FT_Fixed'). Hence the format-specific + prefixes like `TT_', `T1_', `T2_' and `CID_' are only used for + relevant structures. + + +====================================================================== + +OLD CHANGES FOR BETA 7 + + - bug-fixed the OpenType/CFF parser. It now loads and displays my + two fonts nicely, but I'm pretty certain that more testing is + needed :-) + + - fixed the crummy Type 1 hinter, it now handles accented characters + correctly (well, the accent is not always well placed, but that's + another problem..) + + - added the CID-keyed Type 1 driver in `src/cid'. Works pretty well + for only 13 Kb of code ;-) Doesn't read AFM files though, nor the + really useful CMAP files.. + + - fixed two bugs in the smooth renderer (src/base/ftgrays.c). + Thanks to Boris Letocha for spotting them and providing a fix. + + - fixed potential `divide by zero' bugs in ftcalc.c. + + - added source code for the OpenType/CFF driver (still incomplete + though..) + + - modified the SFNT driver slightly to perform more robust header + checks in TT_Load_SFNT_Header. This prevents certain font files + (e.g. some Type 1 Multiple Masters) from being incorrectly + `recognized' as TrueType font files.. + + - moved a lot of stuff from the TrueType driver to the SFNT module, + this allows greater code re-use between font drivers + (e.g. TrueType, OpenType, Compact-TrueType, etc..) + + - added a tiny segment cache to the SFNT Charmap 4 decoder, in order + to minimally speed it up.. + + - added support for Multiple Master fonts in `type1z'. There is + also a new file named which defines functions to + manage them from client applications. + + The new file `src/base/ftmm.c' is also optional to the engine.. + + - various formatting changes (e.g. EXPORT_DEF -> FT_EXPORT_DEF) + + small bug fixes in FT_Load_Glyph, the `type1' driver, etc.. + + - a minor fix to the Type 1 driver to let them apply the font matrix + correctly (used for many oblique fonts..) + + - some fixes for 64-bit systems (mainly changing some FT_TRACE calls + to use %p instead of %lx). Thanks to Karl Robillard. + + - fixed some bugs in the sbit loader (src/base/sfnt/ttsbit.c) + + added a new flag, FT_LOAD_CROP_BITMAP to query that bitmaps be + cropped when loaded from a file (maybe I should move the bitmap + cropper to the base layer ??). + + - changed the default number of gray levels of the smooth renderer + to 256 (instead of the previous 128). Of course, the human eye + can't see any difference ;-) + + - removed TT_MAX_SUBGLYPHS, there is no static limit on the number + of subglyphs in a TrueType font now.. + + +====================================================================== + +OLD CHANGES 16 May 2000 + + - tagged `BETA-6' in the CVS tree. This one is a serious release + candidate even though it doesn't incorporate the auto-hinter yet.. + + - various obsolete files were removed, and copyright header updated + + - finally updated the standard raster to fix the monochrome + rendering bug + re-enable support for 5-gray levels anti-aliasing + (suck, suck..) + + - created new header files, and modified sources accordingly: + + + - simple FreeType types, without the API + + - definition of memory-management macros + + - added the `DSIG' (OpenType Digital Signature) tag to + + + - light update/cleaning of the build system + changes to the sources + in order to get rid of _all_ compiler warnings with three + compilers, i.e: + + gcc with `-ansi -pedantic -Wall -W', Visual C++ with `/W3 /WX' and + LCC + + IMPORTANT NOTE FOR WIN32-LCC USERS: + | + | It seems the C pre-processor that comes with LCC is broken, it + | doesn't recognize the ANSI standard directives # and ## + | correctly when one of the argument is a macro. Also, + | something like: + | + | #define F(x) print##x + | + | F(("hello")) + | + | will get incorrectly translated to: + | + | print "hello") + | + | by its pre-processor. For this reason, you simply cannot build + | FreeType 2 in debug mode with this compiler.. + + - yet another massive grunt work. I've changed the definition of + the EXPORT_DEF, EXPORT_FUNC, BASE_DEF & BASE_FUNC macros. These + now take an argument, which is the function's return value type. + + This is necessary to compile FreeType as a DLL on Windows and + OS/2. Depending on the compiler used, a compiler-specific keyword + like __export or __system must be placed before (VisualC++) or + after (BorlandC++) the type.. + + Of course, this needed a lot of changes throughout the source code + to make it compile again... All cleaned up now, apparently.. + + Note also that there is a new EXPORT_VAR macro defined to allow + the _declaration_ of an exportable public (constant) + variable. This is the case of the raster interfaces (see + ftraster.h and ftgrays.h), as well as each module's interface (see + sfdriver.h, psdriver.h, etc..) + + - new feature: it is now possible to pass extra parameters to font + drivers when creating a new face object. For now, + this capability is unused. It could however prove to + be useful in a near future.. + + the FT_Open_Args structure was changes, as well as the internal + driver interface (the specific `init_face' module function has + now a different signature). + + - updated the tutorial (not finished though). + + - updated the top-level BUILD document + + - fixed a potential memory leak that could occur when loading + embedded bitmaps. + + - added the declaration of FT_New_Memory_Face in + , as it was missing from the public header + (the implementation was already in `ftobjs.c'). + + - the file has been seriously updated in order + to allow the automatic generation of error message tables. See + the comments within it for more information. + + - major directory hierarchy re-organisation. This was done for two + things: + + * first, to ease the `manual' compilation of the library by + requiring at lot less include paths :-) + + * second, to allow external programs to effectively access + internal data fields. For example, this can be extremely + useful if someone wants to write a font producer or a font + manager on top of FreeType. + + Basically, you should now use the 'freetype/' prefix for header + inclusion, as in: + + #include + #include + + Some new include sub-directories are available: + + a. the `freetype/config' directory, contains two files used to + configure the build of the library. Client applications + should not need to look at these normally, but they can if + they want. + + #include + #include + + b. the `freetype/internal' directory, contains header files that + describes library internals. These are the header files that + were previously found in the `src/base' and `src/shared' + directories. + + + As usual, the build system and the demos have been updated to + reflect the change.. + + Here's a layout of the new directory hierarchy: + + TOP_DIR + include/ + freetype/ + freetype.h + ... + config/ + ftoption.h + ftconfig.h + ftmodule.h + + internal/ + ftobjs.h + ftstream.h + ftcalc.h + ... + + src/ + base/ + ... + + sfnt/ + psnames/ + truetype/ + type1/ + type1z/ + + + Compiling a module is now much easier, for example, the following + should work when in the TOP_DIR directory on an ANSI build: + + gcc -c -I./include -I./src/base src/base/ftbase.c + gcc -c -I./include -I./src/sfnt src/sfnt/sfnt.c + etc.. + + (of course, using -Iconfig/ if you provide system-specific + configuration files). + + - updated the structure of FT_Outline_Funcs in order to allow direct + coordinate scaling within the outline decomposition routine (this + is important for virtual `on' points with TrueType outlines) + + updates to the rasters to support this.. + + - updated the OS/2 table loading code in `src/sfnt/ttload.c' in + order to support version 2 of the table (see OpenType 1.2 spec) + + - created `include/tttables.h' and `include/t1tables.h' to allow + client applications to access some of the SFNT and T1 tables of a + face with a procedural interface (see `FT_Get_Sfnt_Table') + + updates to internal source files to reflect the change.. + + - some cleanups in the source code to get rid of warnings when + compiling with the `-Wall -W -ansi -pedantic' options in gcc. + + - debugged and moved the smooth renderer to `src/base/ftgrays.c' and + its header to `include/ftgrays.h' + + - updated TT_MAX_SUBGLYPHS to 96 as some CJK fonts have composites + with up to 80 sub-glyphs !! Thanks to Werner + + +====================================================================== + +OLD CHANGES - 14-apr-2000 + + - fixed a bug in the TrueType glyph loader that prevented the + correct loading of some CJK glyphs in mingli.ttf + + - improved the standard Type 1 hinter in `src/type1' + + - fixed two bugs in the experimental Type 1 driver in `src/type1z' + to handle the new XFree86 4.0 fonts (and a few other ones..) + + - the smooth renderer is now complete and supports sub-banding to + render large glyphs at high speed. However, it is still located + in `demos/src/ftgrays.c' and should move to the library itself in + the next beta. NOTE: The smooth renderer doesn't compile in + stand-alone mode anymore, but this should be fixed RSN.. + + - introduced convenience functions to more easily deal with glyph + images, see `include/ftglyph.h' for more details, as well as the + new demo program named `demos/src/ftstring.c' that demonstrates + its use + + - implemented FT_LOAD_NO_RECURSE in both the TrueType and Type 1 + drivers (this is required by the auto-hinter to improve its + results). + + - changed the raster interface, in order to allow client + applications to provide their own span-drawing callbacks. + However, only the smooth renderer supports this. See + `FT_Raster_Params' in the file `include/ftimage.h'. + + - fixed a small bug in FT_MulFix that caused incorrect transform + computation! + + - Note: The tutorial is out-of-date. + + +====================================================================== + +OLD CHANGES - 12-mar-2000 + + - changed the layout of configuration files : now, all ANSI + configuration files are located in + `freetype2/config'. System-specific over-rides can be placed in + `freetype2/config/'. + + - moved all configuration macros to `config/ftoption.h' + + - improvements in the Type 1 driver with AFM support + + - changed the fields in the FT_Outline structure : the old `flags' + array is re-named `tags', while all ancient flags are encoded into + a single unsigned int named `flags'. + + - introduced new flags in FT_Outline.flags (see + ft_outline_.... enums in `ftimage.h'). + + - changed outline functions to `FT_Outline_' syntax + + - added a smooth anti-alias renderer to the demonstration programs + + - added Mac graphics driver (thanks Just) + + - FT_Open_Face changed in order to received a pointer to a + FT_Open_Args descriptor.. + + - various cleanups, a few more API functions implemented (see + FT_Attach_File) + + - updated some docs + + +====================================================================== + +OLD CHANGES - 22-feb-2000 + + - introduced the `psnames' module. It is used to: + + o convert a Postscript glyph name into the equivalent Unicode + character code (used by the Type 1 driver(s) to synthesize on + the fly a Unicode charmap). + + o provide an interface to retrieve the Postscript names of the + Macintosh, Adobe Standard & Adobe Expert character codes. + (the Macintosh names are used by the SFNT-module postscript + names support routines, while the other two tables are used by + the Type 1 driver(s)). + + - introduced the `type1z' alternate Type 1 driver. This is a (still + experimental) driver for the Type 1 format that will ultimately + replace the one in `src/type1'. It uses pattern matching to load + data from the font, instead of a finite state analyzer. It works + much better than the `old' driver with `broken' fonts. It is also + much smaller (under 15 Kb). + + - the Type 1 drivers (both in `src/type1' and `src/type1z') are + nearly complete. They both provide automatic Unicode charmap + synthesis through the `psnames' module. No re-encoding vector is + needed. (note that they still leak memory due to some code + missing, and I'm getting lazy). + + Trivial AFM support has been added to read kerning information but + wasn't exactly tested as it should ;-) + + - The TrueType glyph loader has been seriously rewritten (see the + file `src/truetype/ttgload.c'. It is now much, much simpler as + well as easier to read, maintain and understand :-) Preliminary + versions introduced a memory leak that has been reported by Jack + Davis, and is now fixed.. + + - introduced the new `ft_glyph_format_plotter', used to represent + stroked outlines like Windows `Vector' fonts, and certain Type 1 + fonts like `Hershey'. The corresponding raster will be written + soon. + + - FT_New_Memory_Face is gone. Likewise, FT_Open_Face has a new + interface that uses a structure to describe the input stream, the + driver (if required), etc.. + + +TODO + + - Write FT_Get_Glyph_Bitmap and FT_Load_Glyph_Bitmap + + - Add a function like FT_Load_Character(face, char_code, load_flags) + that would really embed a call to FT_Get_Char_Index then + FT_Load_Glyph to ease developer's work. + + - Update the tutorial! + + - consider adding support for Multiple Master fonts in the Type 1 + drivers. + + - Test the AFM routines of the Type 1 drivers to check that kerning + information is returned correctly. + + - write a decent auto-gridding component !! We need this to release + FreeType 2.0 gold ! + + +less urgent needs: + + - add a CFF/Type2 driver + - add a BDF driver + - add a FNT/PCF/HBF driver + - add a Speedo driver from the X11 sources + + +====================================================================== + +OLDER CHANGES - 27-jan-2000 + + - updated the `sfnt' module interface to allow several SFNT-based + drivers to co-exist peacefully + + - updated the `T1_Face' type to better separate Postscript font + content from the rest of the FT_Face structure. Might be used + later by the CFF/Type2 driver.. + + - added an experimental replacement Type 1 driver featuring advanced + (and speedy) pattern matching to retrieve the data from postscript + fonts. + + - very minor changes in the implementation of FT_Set_Char_Size and + FT_Set_Pixel_Sizes (they now implement default to lighten the font + driver's code). + + +====================================================================== + +OLD MESSAGE + +This file summarizes the changes that occurred since the last `beta' +of FreeType 2. Because the list is important, it has been divided into +separate sections: + +Table Of Contents: + + I High-Level Interface (easier !) + II Directory Structure + III Glyph Image Formats + IV Build System + V Portability + VI Font Drivers + + +---------------------------------------------------------------------- + +High-Level Interface: + + The high-level API has been considerably simplified. Here is how: + + - resource objects have disappeared. this means that face objects + can now be created with a single function call (see FT_New_Face + and FT_Open_Face) + + - when calling either FT_New_Face & FT_Open_Face, a size object + and a glyph slot object are automatically created for the face, + and can be accessed through `face->glyph' and `face->size' if + one really needs to. In most cases, there's no need to call + FT_New_Size or FT_New_Glyph. + + - similarly, FT_Load_Glyph now only takes a `face' argument + (instead of a glyph slot and a size). Also, its `result' + parameter is gone, as the glyph image type is returned in the + field `face->glyph.format' + + - the list of available charmaps is directly accessible through + `face->charmaps', counting `face->num_charmaps' elements. Each + charmap has an 'encoding' field which specifies which known + encoding it deals with. Valid values are, for example: + + ft_encoding_unicode (for ASCII, Latin-1 and Unicode) + ft_encoding_apple_roman + ft_encoding_sjis + ft_encoding_adobe_standard + ft_encoding_adobe_expert + + other values may be added in the future. Each charmap still + holds its `platform_id' and `encoding_id' values in case the + encoding is too exotic for the current library + + +---------------------------------------------------------------------- + +Directory Structure: + + Should seem obvious to most of you: + + freetype/ + config/ -- configuration sub-makefiles + ansi/ + unix/ -- platform-specific configuration files + win32/ + os2/ + msdos/ + + include/ -- public header files, those to be included + directly by client apps + + src/ -- sources of the library + base/ -- the base layer + sfnt/ -- the sfnt `driver' (see the drivers section + below) + truetype/ -- the truetype driver + type1/ -- the type1 driver + shared/ -- some header files shared between drivers + + demos/ -- demos/tools + + docs/ -- documentation (a bit empty for now) + + +---------------------------------------------------------------------- + +Glyph Image Formats: + + Drivers are now able to register new glyph image formats within the + library. For now, the base layer supports of course bitmaps and + vector outlines, but one could imagine something different like + colored bitmaps, bi-color vectors or whatever else (Metafonts anyone + ??). + + See the file `include/ftimage.h'. Note also that the type + FT_Raster_Map is gone, and is now replaced by FT_Bitmap, which + should encompass all known bitmap types. + + Each new image format must provide at least one `raster', i.e. a + module capable of transforming the glyph image into a bitmap. It's + also possible to change the default raster used for a given glyph + image format. + + The default outline scan-converter now uses 128 levels of grays by + default, which tends to smooth many things. Note that the demo + programs have been updated significantly in order to display these.. + + +---------------------------------------------------------------------- + +Build system: + + You still need GNU Make to build the library. The build system has + been very seriously re-vamped in order to provide things like : + + - automatic host platform detection (reverting to 'config/ansi' if + it is not detected, with pseudo-standard compilation flags) + + - the ability to compile from the Makefiles with very different and + exotic compilers. Note that linking the library can be difficult + for some platforms. + + For example, the file `config/win32/lcclib.bat' is invoked by the + build system to create the `.lib' file with LCC-Win32 because its + librarian has too many flaws to be invoked directly from the + Makefile. + + Here's how it works: + + - the first time you type `make', the build system runs a series of + sub-makefiles in order to detect your host platform. It then + dumps what it found, and creates a file called `config.mk' in the + current directory. This is a sub-Makefile used to define many + important Make variables used to build the library. + + - the second time, the build system detects the `config.mk' then use + it to build the library. All object files go into 'obj' by + default, as well as the library file, but this can easily be + changed. + + Note that you can run `make setup' to force another host platform + detection even if a `config.mk' is present in the current + directory. Another solution is simply to delete the file, then + re-run make. + + Finally, the default compiler for all platforms is gcc (for now, + this will hopefully changed in the future). You can however specify + a different compiler by specifying it after the 'setup' target as + in: + + gnumake setup lcc on Win32 to use the LCC compiler + gnumake setup visualc on Win32 to use Visual C++ + + See the file `config//detect.mk' for a list of supported + compilers for your platforms. + + It should be relatively easy to write new detection rules files and + config.mk.. + + Finally, to build the demo programs, go to `demos' and launch GNU + Make, it will use the `config.mk' in the top directory to build the + test programs.. + + +---------------------------------------------------------------------- + +Portability: + + In the previous beta, a single FT_System object was used to + encompass all low-level operations like thread synchronisation, + memory management and i/o access. This has been greatly simplified: + + - thread synchronisation has been dropped, for the simple reason + that the library is already re-entrant, and that if you really + need two threads accessing the same FT_Library, you should + really synchronize access to it yourself with a simple mutex. + + - memory management is performed through a very simple object + called `FT_Memory', which really is a table containing a table + of pointers to functions like malloc, realloc and free as well + as some user data (closure). + + - resources have disappeared (they created more problems than they + solved), and i/o management have been simplified greatly as a + result. Streams are defined through FT_Stream objects, which + can be either memory-based or disk-based. + + Note that each face has its own stream, which is closed only + when the face object is destroyed. Hence, a function like + TT_Flush_Face in 1.x cannot be directly supported. However, if + you really need something like this, you can easily tailor your + own streams to achieve the same feature at a lower level (and + use FT_Open_Face instead of FT_New_Face to create the face). + + See the file `include/ftsystem.h' for more details, as well as the + implementations found in `config/unix' and `config/ansi'. + + +---------------------------------------------------------------------- + +Font Drivers: + + The Font Driver interface has been modified in order to support + extensions & versioning. + + + The list of the font drivers that are statically linked to the + library at compile time is managed through a new configuration file + called `config//ftmodule.h'. + + This file is autogenerated when invoking `make modules'. This + target will parse all sub-directories of 'src', looking for a + `module.mk' rules file, used to describe the driver to the build + system. + + Hence, one should call `make modules' each time a font driver is + added or removed from the `src' directory. + + Finally, this version provides a `pseudo-driver' in `src/sfnt'. + This driver doesn't support font files directly, but provides + services used by all TrueType-like font drivers. Hence, its code is + shared between the TrueType & OpenType font formats, and possibly + more formats to come if we're lucky.. + + +---------------------------------------------------------------------- + +Extensions support: + + The extensions support is inspired by the one found in 1.x. + + Now, each font driver has its own `extension registry', which lists + which extensions are available for the font faces managed by the + driver. + + Extension ids are now strings, rather than 4-byte tags, as this is + usually more readable. + + Each extension has: + - some data, associated to each face object + - an interface (table of function pointers) + + An extension that is format-specific should simply register itself + to the correct font driver. Here is some example code: + + // Registering an extensions + // + FT_Error FT_Init_XXXX_Extension( FT_Library library ) + { + FT_DriverInterface* tt_driver; + + driver = FT_Get_Driver( library, "truetype" ); + if (!driver) return FT_Err_Unimplemented_Feature; + + return FT_Register_Extension( driver, &extension_class ); + } + + + // Implementing the extensions + // + FT_Error FT_Proceed_Extension_XXX( FT_Face face ) + { + FT_XXX_Extension ext; + FT_XXX_Extension_Interface ext_interface; + + ext = FT_Get_Extension( face, "extensionid", &ext_interface ); + if (!ext) return error; + + return ext_interface->do_it(ext); + } + +------------------------------------------------------------------------ + +Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +Local Variables: +version-control: never +coding: utf-8 +End: + +--- end of CHANGES --- diff --git a/alienblaster/project/jni/freetype/docs/CUSTOMIZE b/alienblaster/project/jni/freetype/docs/CUSTOMIZE new file mode 100644 index 000000000..7d7d474ec --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/CUSTOMIZE @@ -0,0 +1,150 @@ +How to customize the compilation of the library +=============================================== + + FreeType is highly customizable to fit various needs, and this + document describes how it is possible to select options and + components at compilation time. + + +I. Configuration macros + + The file found in `include/freetype/config/ftoption.h' contains a + list of commented configuration macros that can be toggled by + developers to indicate which features should be active while + building the library. + + These options range from debug level to availability of certain + features, like native TrueType hinting through a bytecode + interpreter. + + We invite you to read this file for more information. You can + change the file's content to suit your needs, or override it with + one of the techniques described below. + + +II. Modules list + + If you use GNU make please edit the top-level file `modules.cfg'. + It contains a list of available FreeType modules and extensions to + be compiled. Change it to suit your own preferences. Be aware that + certain modules depend on others, as described in the file. GNU + make uses `modules.cfg' to generate `ftmodule.h' (in the object + directory). + + If you don't use GNU make you have to manually edit the file + `include/freetype/config/ftmodule.h' (which is *not* used with if + compiled with GNU make) to add or remove the drivers and components + you want to compile into the library. See `INSTALL.ANY' for more + information. + + +III. System interface + + FreeType's default interface to the system (i.e., the parts that + deal with memory management and i/o streams) is located in + `src/base/ftsystem.c'. + + The current implementation uses standard C library calls to manage + memory and to read font files. It is however possible to write + custom implementations to suit specific systems. + + To tell the GNU Make-based build system to use a custom system + interface, you have to define the environment variable FTSYS_SRC to + point to the relevant implementation: + + on Unix: + + ./configure + export FTSYS_SRC=foo/my_ftsystem.c + make + make install + + on Windows: + + make setup + set FTSYS_SRC=foo/my_ftsystem.c + make + + +IV. Overriding default configuration and module headers + + It is possible to override the default configuration and module + headers without changing the original files. There are three ways + to do that: + + + 1. With GNU make + + [This is actually a combination of method 2 and 3.] + + Just put your custom `ftoption.h' file into the objects directory + (normally `/objs'), which GNU make prefers over the + standard location. No action is needed for `ftmodule.h' because + it is generated automatically in the objects directory. + + + 2. Using the C include path + + Use the C include path to ensure that your own versions of the + files are used at compile time when the lines + + #include FT_CONFIG_OPTIONS_H + #include FT_CONFIG_MODULES_H + + are compiled. Their default values being + and , you + can do something like: + + custom/ + freetype/ + config/ + ftoption.h => custom options header + ftmodule.h => custom modules list + + include/ => normal FreeType 2 include + freetype/ + ... + + then change the C include path to always give the path to `custom' + before the FreeType 2 `include'. + + + 3. Redefining FT_CONFIG_OPTIONS_H and FT_CONFIG_MODULES_H + + Another way to do the same thing is to redefine the macros used to + name the configuration headers. To do so, you need a custom + `ft2build.h' whose content can be as simple as: + + #ifndef __FT2_BUILD_MY_PLATFORM_H__ + #define __FT2_BUILD_MY_PLATFORM_H__ + + #define FT_CONFIG_OPTIONS_H + #define FT_CONFIG_MODULES_H + + #include + + #endif /* __FT2_BUILD_MY_PLATFORM_H__ */ + + Place those files in a separate directory, e.g., + + custom/ + ft2build.h => custom version described above + my-ftoption.h => custom options header + my-ftmodule.h => custom modules list header + + and change the C include path to ensure that `custom' is always + placed before the FT2 `include' during compilation. + +---------------------------------------------------------------------- + +Copyright 2003, 2005, 2006 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of CUSTOMIZE --- diff --git a/alienblaster/project/jni/freetype/docs/DEBUG b/alienblaster/project/jni/freetype/docs/DEBUG new file mode 100644 index 000000000..3d6acd3bb --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/DEBUG @@ -0,0 +1,202 @@ +Debugging within the FreeType sources +===================================== + +I. Configuration macros +----------------------- + +There are several ways to enable debugging features in a FreeType 2 +builds. This is controlled through the definition of special macros +located in the file `ftoptions.h'. The macros are: + + + FT_DEBUG_LEVEL_ERROR + + #define this macro if you want to compile the FT_ERROR macro calls + to print error messages during program execution. This will not + stop the program. Very useful to spot invalid fonts during + development and to code workarounds for them. + + FT_DEBUG_LEVEL_TRACE + + #define this macro if you want to compile both macros FT_ERROR and + FT_TRACE. This also includes the variants FT_TRACE0, FT_TRACE1, + FT_TRACE2, ..., FT_TRACE7. + + The trace macros are used to send debugging messages when an + appropriate `debug level' is configured at runtime through the + FT2_DEBUG environment variable (more on this later). + + FT_DEBUG_MEMORY + + If this macro is #defined, the FreeType engine is linked with a + small but effective debugging memory manager that tracks all + allocations and frees that are performed within the font engine. + + When the FT2_DEBUG_MEMORY environment variable is defined at + runtime, a call to FT_Done_FreeType will dump memory statistics, + including the list of leaked memory blocks with the source locations + where these were allocated. It is always a very good idea to define + this in development builds. This works with _any_ program linked to + FreeType, but requires a big deal of memory (the debugging memory + manager never frees the blocks to the heap in order to detect double + frees). + + When FT2_DEBUG_MEMORY isn't defined at runtime, the debugging memory + manager is ignored, and performance is unaffected. + + +II. Debugging macros +-------------------- + +Several macros can be used within the FreeType sources to help debugging +its code: + + + 1. FT_ERROR(( ... )) + + This macro is used to send debug messages that indicate relatively + serious errors (like broken font files), but will not stop the + execution of the running program. Its code is compiled only when + either FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined in + `ftoption.h'. + + Note that you have to use a printf-like signature, but with double + parentheses, like in + + FT_ERROR(( "your %s is not %s\n", "foo", "bar" )); + + + 2. FT_ASSERT( condition ) + + This macro is used to check strong assertions at runtime. If its + condition isn't TRUE, the program will abort with a panic message. + Its code is compiled when either FT_DEBUG_LEVEL_ERROR or + FT_DEBUG_LEVEL_TRACE are defined. You don't need double parentheses + here. For example + + FT_ASSERT( ptr != NULL ); + + + 3. FT_TRACE( level, (message...) ) + + The FT_TRACE macro is used to send general-purpose debugging + messages during program execution. This macro uses an *implicit* + macro named FT_COMPONENT used to name the current FreeType component + being run. + + The developer should always define FT_COMPONENT as appropriate, for + example as in + + #undef FT_COMPONENT + #define FT_COMPONENT trace_io + + The value of the FT_COMPONENT macro is an enumeration named + trace_XXXX where XXXX is one of the component names defined in the + internal file `freetype/internal/fttrace.h'. If you modify FreeType + source and insert new trace_XXXX macro, you must register it in + fttrace.h. If you insert or remove many trace macros, you can check + the undefined or the unused trace macro by src/tools/chktrcmp.py. + + Each such component is assigned a `debug level', ranging from 0 + to 7, through the use of the FT2_DEBUG environment variable + (described below) when a program linked with FreeType starts. + + When FT_TRACE is called, its level is compared to the one of the + corresponding component. Messages with trace levels *higher* than + the corresponding component level are filtered and never printed. + + This means that trace messages with level 0 are always printed, + those with level 2 are only printed when the component level is *at + least* 2. + + The second parameter to FT_TRACE must contain parentheses and + correspond to a printf-like call, as in + + FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) ) + + The shortcut macros FT_TRACE0, FT_TRACE1, FT_TRACE2, ..., FT_TRACE7 + can be used with constant level indices, and are much cleaner to + use, as in + + FT_TRACE2(( "your %s is not %s\n", "foo", "bar" )); + + +III. Environment variables +-------------------------- + +The following environment variables control debugging output and +behaviour of FreeType at runtime. + + + FT2_DEBUG + + This variable is only used when FreeType is built with + FT_DEBUG_LEVEL_TRACE defined. It contains a list of component level + definitions, following this format: + + component1:level1 component2:level2 component3:level3 ... + + where `componentX' is the name of a tracing component, as defined in + `fttrace.h', but without the `trace_' prefix. `levelX' is the + corresponding level to use at runtime. + + `any' is a special component name that will be interpreted as + `any/all components'. For example, the following definitions + + set FT2_DEBUG=any:2 memory:5 io:4 (on Windows) + export FT2_DEBUG="any:2 memory:5 io:4" (on Linux with bash) + + both stipulate that all components should have level 2, except for + the memory and io components which will be set to trace levels 5 and + 4, respectively. + + + FT2_DEBUG_MEMORY + + This environment variable, when defined, tells FreeType to use a + debugging memory manager that will track leaking memory blocks as + well as other common errors like double frees. It is also capable + of reporting _where_ the leaking blocks were allocated, which + considerably saves time when debugging new additions to the library. + + This code is only compiled when FreeType is built with the + FT_DEBUG_MEMORY macro #defined in `ftoption.h' though, it will be + ignored in other builds. + + + FT2_ALLOC_TOTAL_MAX + + This variable is ignored if FT2_DEBUG_MEMORY is not defined. It + allows you to specify a maximum heap size for all memory allocations + performed by FreeType. This is very useful to test the robustness + of the font engine and programs that use it in tight memory + conditions. + + If it is undefined, or if its value is not strictly positive, then + no allocation bounds are checked at runtime. + + + FT2_ALLOC_COUNT_MAX + + This variable is ignored if FT2_DEBUG_MEMORY is not defined. It + allows you to specify a maximum number of memory allocations + performed by FreeType before returning the error + FT_Err_Out_Of_Memory. This is useful for debugging and testing the + engine's robustness. + + If it is undefined, or if its value is not strictly positive, then + no allocation bounds are checked at runtime. + +------------------------------------------------------------------------ + +Copyright 2002, 2003, 2004, 2005, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of DEBUG --- diff --git a/alienblaster/project/jni/freetype/docs/FTL.TXT b/alienblaster/project/jni/freetype/docs/FTL.TXT new file mode 100644 index 000000000..bbaba33f4 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/FTL.TXT @@ -0,0 +1,169 @@ + The FreeType Project LICENSE + ---------------------------- + + 2006-Jan-27 + + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + + + +Introduction +============ + + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + + + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + + """ + Portions of this software are copyright © The FreeType + Project (www.freetype.org). All rights reserved. + """ + + Please replace with the value from the FreeType version you + actually use. + + +Legal Terms +=========== + +0. Definitions +-------------- + + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + +1. No Warranty +-------------- + + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + +2. Redistribution +----------------- + + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + +3. Advertising +-------------- + + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + +4. Contacts +----------- + + There are two mailing lists related to FreeType: + + o freetype@nongnu.org + + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + + o freetype-devel@nongnu.org + + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + + Our home page can be found at + + http://www.freetype.org + + +--- end of FTL.TXT --- diff --git a/alienblaster/project/jni/freetype/docs/GPL.TXT b/alienblaster/project/jni/freetype/docs/GPL.TXT new file mode 100644 index 000000000..b2fe7b6af --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/GPL.TXT @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/alienblaster/project/jni/freetype/docs/INSTALL b/alienblaster/project/jni/freetype/docs/INSTALL new file mode 100644 index 000000000..de50d0c2e --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/INSTALL @@ -0,0 +1,91 @@ + +There are several ways to build the FreeType library, depending on +your system and the level of customization you need. Here is a short +overview of the documentation available: + + +I. Normal installation and upgrades +=================================== + + 1. Native TrueType Hinting + + Native TrueType hinting is disabled by default[1]. If you really + need it, read the file `TRUETYPE' for information. + + + 2. Unix Systems (including Mac OS X, Cygwin, and MSys on Windows) + + Please read *both* `UPGRADE.UNIX' and `INSTALL.UNIX' to install or + upgrade FreeType 2 on a Unix system. Note that you *need* GNU + Make for automatic compilation, since other make tools won't work + (this includes BSD Make). + + GNU Make VERSION 3.80 OR NEWER IS NEEDED! + + + 3. On VMS with the `mms' build tool + + See `INSTALL.VMS' for installation instructions on this platform. + + + 4. Other systems using GNU Make + + On non-Unix platforms, it is possible to build the library using + GNU Make utility. Note that *NO OTHER MAKE TOOL WILL WORK*[2]! + This methods supports several compilers on Windows, OS/2, and + BeOS, including MinGW, Visual C++, Borland C++, and more. + + Instructions are provided in the file `INSTALL.GNU'. + + + 5. With an IDE Project File (e.g., for Visual Studio or CodeWarrior) + + We provide a small number of `project files' for various IDEs to + automatically build the library as well. Note that these files + are not supported and only sporadically maintained by FreeType + developers, so don't expect them to work in each release. + + To find them, have a look at the content of the `builds/' + directory, where stands for your OS or environment. + + + 6. From you own IDE, or own Makefiles + + If you want to create your own project file, follow the + instructions given in the `INSTALL.ANY' document of this + directory. + + +II. Custom builds of the library +================================ + + Customizing the compilation of FreeType is easy, and allows you to + select only the components of the font engine that you really need. + For more details read the file `CUSTOMIZE'. + + +---------------------------------------------------------------------- + +[1] More details on: http://www.freetype.org/patents.html + +[2] make++, a make tool written in Perl, has sufficient support of GNU + make extensions to build FreeType. See + + http://makepp.sourceforge.net + + for more information; you need version 1.19 or newer, and you must + pass option `--norc-substitution'. + +---------------------------------------------------------------------- + +Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL --- diff --git a/alienblaster/project/jni/freetype/docs/INSTALL.ANY b/alienblaster/project/jni/freetype/docs/INSTALL.ANY new file mode 100644 index 000000000..44b785c67 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/INSTALL.ANY @@ -0,0 +1,151 @@ +Instructions on how to build FreeType with your own build tool +============================================================== + +See the file `CUSTOMIZE' to learn how to customize FreeType to +specific environments. + + +I. Standard procedure +--------------------- + + * DISABLE PRE-COMPILED HEADERS! This is very important for Visual + C++, because FreeType uses lines like: + + #include FT_FREETYPE_H + + which are not correctly supported by this compiler while being ISO + C compliant! + + * You need to add the directories `freetype2/include' to your + include path when compiling the library. + + * FreeType 2 is made of several components; each of them is located + in a subdirectory of `freetype2/src'. For example, + `freetype2/src/truetype/' contains the TrueType font driver. + + * DO NOT COMPILE ALL C FILES! Rather, compile the following ones. + + -- base components (required) + + src/base/ftsystem.c + src/base/ftinit.c + src/base/ftdebug.c + + src/base/ftbase.c + + src/base/ftbbox.c -- recommended, see + src/base/ftglyph.c -- recommended, see + + src/base/ftbdf.c -- optional, see + src/base/ftbitmap.c -- optional, see + src/base/ftcid.c -- optional, see + src/base/ftfstype.c -- optional + src/base/ftgasp.c -- optional, see + src/base/ftgxval.c -- optional, see + src/base/ftlcdfil.c -- optional, see + src/base/ftmm.c -- optional, see + src/base/ftotval.c -- optional, see + src/base/ftpatent.c -- optional + src/base/ftpfr.c -- optional, see + src/base/ftstroke.c -- optional, see + src/base/ftsynth.c -- optional, see + src/base/fttype1.c -- optional, see + src/base/ftwinfnt.c -- optional, see + src/base/ftxf86.c -- optional, see + + src/base/ftmac.c -- only on the Macintosh + + -- font drivers (optional; at least one is needed) + + src/bdf/bdf.c -- BDF font driver + src/cff/cff.c -- CFF/OpenType font driver + src/cid/type1cid.c -- Type 1 CID-keyed font driver + src/pcf/pcf.c -- PCF font driver + src/pfr/pfr.c -- PFR/TrueDoc font driver + src/sfnt/sfnt.c -- SFNT files support + (TrueType & OpenType) + src/truetype/truetype.c -- TrueType font driver + src/type1/type1.c -- Type 1 font driver + src/type42/type42.c -- Type 42 font driver + src/winfonts/winfnt.c -- Windows FONT / FNT font driver + + -- rasterizers (optional; at least one is needed for vector + formats) + + src/raster/raster.c -- monochrome rasterizer + src/smooth/smooth.c -- anti-aliasing rasterizer + + -- auxiliary modules (optional) + + src/autofit/autofit.c -- auto hinting module + src/cache/ftcache.c -- cache sub-system (in beta) + src/gzip/ftgzip.c -- support for compressed fonts (.gz) + src/lzw/ftlzw.c -- support for compressed fonts (.Z) + src/gxvalid/gxvalid.c -- TrueTypeGX/AAT table validation + src/otvalid/otvalid.c -- OpenType table validation + src/psaux/psaux.c -- PostScript Type 1 parsing + src/pshinter/pshinter.c -- PS hinting module + src/psnames/psnames.c -- PostScript glyph names support + + + Notes: + + `ftcache.c' needs `ftglyph.c' + `ftfstype.c' needs `fttype1.c' + `ftglyph.c' needs `ftbitmap.c' + `ftstroke.c' needs `ftglyph.c' + `ftsynth.c' needs `ftbitmap.c' + + `cff.c' needs `sfnt.c', `pshinter.c', and `psnames.c' + `truetype.c' needs `sfnt.c' and `psnames.c' + `type1.c' needs `psaux.c' `pshinter.c', and `psnames.c' + `type1cid.c' needs `psaux.c', `pshinter.c', and `psnames.c' + `type42.c' needs `truetype.c' + + + Read the file `CUSTOMIZE' in case you want to compile only a subset + of the drivers, renderers, and optional modules; a detailed + description of the various base extension is given in the top-level + file `modules.cfg'. + + You are done. In case of problems, see the archives of the FreeType + development mailing list. + + +II. Support for flat-directory compilation +------------------------------------------ + + It is possible to put all FreeType 2 source files into a single + directory, with the *exception* of the `include' hierarchy. + + 1. Copy all files in current directory + + cp freetype2/src/base/*.[hc] . + cp freetype2/src/raster1/*.[hc] . + cp freetype2/src/smooth/*.[hc] . + etc. + + 2. Compile sources + + cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftsystem.c + cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftinit.c + cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftdebug.c + cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftbase.c + etc. + + You don't need to define the FT_FLAT_COMPILATION macro (as this + was required in previous releases of FreeType 2). + +---------------------------------------------------------------------- + +Copyright 2003, 2005, 2006, 2009, 2010 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL.ANY --- diff --git a/alienblaster/project/jni/freetype/docs/INSTALL.CROSS b/alienblaster/project/jni/freetype/docs/INSTALL.CROSS new file mode 100644 index 000000000..3def12c8c --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/INSTALL.CROSS @@ -0,0 +1,135 @@ +This document contains instructions on how to cross-build the FreeType +library on Unix systems, for example, building binaries for Linux/MIPS +on FreeBSD/i386. Before reading this document, please consult +INSTALL.UNIX for required tools and the basic self-building procedure. + + + 1. Required Tools + ----------------- + + For self-building the FreeType library on a Unix system, GNU Make + 3.80 or newer is required. INSTALL.UNIX contains hints how to + check the installed `make'. + + The GNU C compiler to cross-build the target system is required. + At present, using non-GNU cross compiler is not tested. The cross + compiler is expected to be installed with a system prefix. For + example, if your building system is FreeBSD/i386 and the target + system is Linux/MIPS, the cross compiler should be installed with + the name `mips-ip22-linuxelf-gcc'. + + A C compiler for a self-build is required also, to build a tool + that is executed during the building procedure. Non-GNU self + compilers are acceptable, but such a setup is not tested yet. + + + 2. Configuration + ---------------- + + 2.1. Building and target system + + To configure for cross-build, the options `--host=' and + `--build=' must be passed to configure. For example, if + your building system is FreeBSD/i386 and the target system is + Linux/MIPS, say + + ./configure \ + --build=i386-unknown-freebsd \ + --host=mips-ip22-linuxelf \ + [other options] + + It should be noted that `--host=' specifies the system + where the built binaries will be executed, not the system where + the build actually happens. Older versions of GNU autoconf use + the option pair `--host=' and `--target='. This is broken and + doesn't work. Similarly, an explicit CC specification like + + env CC=mips-ip22-linux-gcc ./configure + + or + + env CC=/usr/local/mips-ip22-linux/bin/gcc ./configure + + doesn't work either; such a configuration confuses the + `configure' script while trying to find the cross and native C + compilers. + + + 2.2. The prefix to install FreeType2 + + Setting `--prefix=' properly is important. The prefix + to install FreeType2 is written into the freetype-config script + and freetype2.pc configuration file. + + If the built FreeType 2 library is used as a part of the + cross-building system, the prefix is expected to be different + from the self-building system. For example, configuration with + `--prefix=/usr/local' installs binaries into the system wide + `/usr/local' directory which then can't be executed. This + causes confusion in configuration of all applications which use + FreeType2. Instead, use a prefix to install the cross-build + into a separate system tree, for example, + `--prefix=/usr/local/mips-ip22-linux/'. + + On the other hand, if the built FreeType2 is used as a part of + the target system, the prefix to install should reflect the file + system structure of the target system. + + + 3. Building command + ------------------- + + If the configuration finishes successfully, invoking GNU make + builds FreeType2. Just say + + make + + or + + gmake + + depending on the name the GNU make binary actually has. + + + 4. Installation + --------------- + + Saying + + make install + + as usual to install FreeType2 into the directory tree specified by + the argument of the `--prefix' option. + + As noted in section 2.2, FreeType2 is sometimes configured to be + installed into the system directory of the target system, and + should not be installed in the cross-building system. In such + cases, the make variable `DESTDIR' is useful to change the root + directory in the installation. For example, after + + make DESTDIR=/mnt/target_system_root/ install + + the built FreeType2 library files are installed into the directory + `/mnt/target_system_root//lib'. + + + 5. TODO + ------- + + Cross building between Cygwin (or MSys) and Unix must be tested. + + +---------------------------------------------------------------------- + +Copyright 2006, 2008 by suzuki toshiya +David Turner, Robert Wilhelm, and Werner Lemberg. + + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL.CROSS --- diff --git a/alienblaster/project/jni/freetype/docs/INSTALL.GNU b/alienblaster/project/jni/freetype/docs/INSTALL.GNU new file mode 100644 index 000000000..72df50a4e --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/INSTALL.GNU @@ -0,0 +1,159 @@ +This document contains instructions how to build the FreeType library +on non-Unix systems with the help of GNU Make. Note that if you are +running Cygwin or MSys in Windows, you should follow the instructions +in the file INSTALL.UNIX instead. + + + FreeType 2 includes a powerful and flexible build system that allows + you to easily compile it on a great variety of platforms from the + command line. To do so, just follow these simple instructions. + + 1. Install GNU Make + ------------------- + + Because GNU Make is the only Make tool supported to compile + FreeType 2, you should install it on your machine. + + The FreeType 2 build system relies on many features special to GNU + Make. + + NEARLY ALL OTHER MAKE TOOLS FAIL, INCLUDING `BSD MAKE', SO REALLY + INSTALL A RECENT VERSION OF GNU MAKE ON YOUR SYSTEM! + + Note that make++, a make tool written in Perl, supports enough + features of GNU make to compile FreeType. See + + http://makepp.sourceforge.net + + for more information; you need version 1.19 or newer, and you must + pass option `--norc-substitution'. + + Make sure that you are invoking GNU Make from the command line, by + typing something like: + + make -v + + to display its version number. + + VERSION 3.80 OR NEWER IS NEEDED! + + + 2. Invoke `make' + ---------------- + + Go to the root directory of FreeType 2, then simply invoke GNU + Make from the command line. This will launch the FreeType 2 host + platform detection routines. A summary will be displayed, for + example, on Win32. + + + ============================================================== + FreeType build system -- automatic system detection + + The following settings are used: + + platform win32 + compiler gcc + configuration directory .\builds\win32 + configuration rules .\builds\win32\w32-gcc.mk + + If this does not correspond to your system or settings please + remove the file 'config.mk' from this directory then read the + INSTALL file for help. + + Otherwise, simply type 'make' again to build the library + or 'make refdoc' to build the API reference (the latter needs + python). + ============================================================= + + + If the detected settings correspond to your platform and compiler, + skip to step 5. Note that if your platform is completely alien to + the build system, the detected platform will be `ansi'. + + + 3. Configure the build system for a different compiler + ------------------------------------------------------ + + If the build system correctly detected your platform, but you want + to use a different compiler than the one specified in the summary + (for most platforms, gcc is the default compiler), invoke GNU Make + with + + make setup + + Examples: + + to use Visual C++ on Win32, type: `make setup visualc' + to use Borland C++ on Win32, type `make setup bcc32' + to use Watcom C++ on Win32, type `make setup watcom' + to use Intel C++ on Win32, type `make setup intelc' + to use LCC-Win32 on Win32, type: `make setup lcc' + to use Watcom C++ on OS/2, type `make setup watcom' + to use VisualAge C++ on OS/2, type `make setup visualage' + + The name to use is platform-dependent. The list of + available compilers for your system is available in the file + `builds//detect.mk'. + + If you are satisfied by the new configuration summary, skip to + step 5. + + + 4. Configure the build system for an unknown platform/compiler + -------------------------------------------------------------- + + The auto-detection/setup phase of the build system copies a file + to the current directory under the name `config.mk'. + + For example, on OS/2+gcc, it would simply copy + `builds/os2/os2-gcc.mk' to `./config.mk'. + + If for some reason your platform isn't correctly detected, copy + manually the configuration sub-makefile to `./config.mk' and go to + step 5. + + Note that this file is a sub-Makefile used to specify Make + variables for compiler and linker invocation during the build. + You can easily create your own version from one of the existing + configuration files, then copy it to the current directory under + the name `./config.mk'. + + + 5. Build the library + -------------------- + + The auto-detection/setup phase should have copied a file in the + current directory, called `./config.mk'. This file contains + definitions of various Make variables used to invoke the compiler + and linker during the build. [It has also generated a file called + `ftmodule.h' in the objects directory (which is normally + `/objs/'); please read the file `docs/CUSTOMIZE' for + customization of FreeType.] + + To launch the build, simply invoke GNU Make again: The top + Makefile will detect the configuration file and run the build with + it. + + + Final note + + The build system builds a statically linked library of the font + engine in the `objs' directory. It does _not_ support the build + of DLLs on Windows and OS/2. If you need these, you have to + either use an IDE-specific project file, or follow the + instructions in `INSTALL.ANY' to create your own Makefiles. + +---------------------------------------------------------------------- + +Copyright 2003, 2004, 2005, 2006, 2008 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL.GNU --- diff --git a/alienblaster/project/jni/freetype/docs/INSTALL.MAC b/alienblaster/project/jni/freetype/docs/INSTALL.MAC new file mode 100644 index 000000000..42bb0d863 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/INSTALL.MAC @@ -0,0 +1,32 @@ +Please follow the instructions in INSTALL.UNIX to install FreeType on +Mac OS X. + +Currently FreeType2 functions based on some deprecated Carbon APIs +return FT_Err_Unimplemented_Feature always, even if FreeType2 is +configured and built on the system that deprecated Carbon APIs are +available. To enable deprecated FreeType2 functions as far as possible, +replace src/base/ftmac.c by builds/mac/ftmac.c. + +Starting with Mac OS X 10.5, gcc defaults the deployment target +to 10.5. In previous versions of Mac OS X, this defaulted to 10.1. +If you want your built binaries to run only on 10.5, this change +does not concern you. If you want them to also run on older versions +of Mac OS X, then you must either set the MACOSX_DEPLOYMENT_TARGET +environment variable or pass -mmacosx-version-min to gcc. You should +specify the oldest version of Mac OS you want the code to run on. +For example, if you use Bourne shell: + + export MACOSX_DEPLOYMENT_TARGET=10.2 + +or, if you use C shell: + + setenv MACOSX_DEPLOYMENT_TARGET 10.2 + +Alternatively, you could pass "-mmacosx-version-min=10.2" to gcc. + +Here the number 10.2 is the lowest version that the built binaries +can run on. In the cases in above, the built binaries will run on +Mac OS X 10.2 and later, but _not_ earlier. If you want to run on +earlier, you have to set lower version, e.g. 10.0. + +For classic Mac OS (Mac OS 7, 8, 9) please refer to builds/mac/README. diff --git a/alienblaster/project/jni/freetype/docs/INSTALL.UNIX b/alienblaster/project/jni/freetype/docs/INSTALL.UNIX new file mode 100644 index 000000000..1d5af993f --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/INSTALL.UNIX @@ -0,0 +1,96 @@ +This document contains instructions on how to build the FreeType +library on Unix systems. This also works for emulations like Cygwin +or MSys on Win32: + + + 1. Ensure that you are using GNU Make + ------------------------------------- + + The FreeType build system _exclusively_ works with GNU Make. You + will not be able to compile the library with the instructions + below using any other alternative (including BSD Make). + + Check that you have GNU make by running the command: + + make -v + + This should dump some text that begins with: + + GNU Make + Copyright (C) Free Software Foundation Inc. + + Note that version 3.80 or higher is *required* or the build will + fail. + + It is also fine to have GNU Make under another name (e.g. 'gmake') + if you use the GNUMAKE variable as described below. + + As a special exception, 'makepp' can also be used to build + FreeType 2. See the file docs/MAKEPP for details. + + + 2. Regenerate the configure script if needed + -------------------------------------------- + + This only applies if you are building a CVS snapshot or checkout, + *not* if you grabbed the sources of an official release. + + You need to invoke the `autogen.sh' script in the top-level + directory in order to create the `configure' script for your + platform. Normally, this simply means typing: + + sh autogen.sh + + In case of problems, you may need to install or upgrade Automake, + Autoconf or Libtool. See README.CVS in the top-level directory + for more information. + + + 3. Build and install the library + -------------------------------- + + The following should work on all Unix systems where the `make' + command invokes GNU Make: + + ./configure [options] + make + make install (as root) + + The default installation path is `/usr/local'. It can be changed + with the `--prefix=' option. Example: + + ./configure --prefix=/usr + + When using a different command to invoke GNU Make, use the GNUMAKE + variable. For example, if `gmake' is the command to use on your + system, do something like: + + GNUMAKE=gmake ./configure [options] + gmake + gmake install (as root) + + If this still doesn't work, there must be a problem with your + system (e.g., you are using a very old version of GNU Make). + + It is possible to compile FreeType in a different directory. + Assuming the FreeType source files in directory `/src/freetype' a + compilation in directory `foo' works as follows: + + cd foo + /src/freetype/configure [options] + make + make install + +---------------------------------------------------------------------- + +Copyright 2003, 2004, 2005, 2006, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of INSTALL.UNIX --- diff --git a/alienblaster/project/jni/freetype/docs/INSTALL.VMS b/alienblaster/project/jni/freetype/docs/INSTALL.VMS new file mode 100644 index 000000000..994e56688 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/INSTALL.VMS @@ -0,0 +1,62 @@ +How to build the freetype2 library on VMS +----------------------------------------- + +It is actually very straightforward to install the Freetype2 library. +Just execute vms_make.com from the toplevel directory to build the +library. This procedure currently accepts the following options: + +DEBUG + Build the library with debug information and without optimization. + +lopts= + Options to pass to the link command e.g. lopts=/traceback + +ccopt= + Options to pass to the C compiler e.g. ccopt=/float=ieee + +In case you did download the demos, place them in a separate directory +sharing the same toplevel as the directory of Freetype2 and follow the +same instructions as above for the demos from there. The build +process relies on this to figure the location of the Freetype2 include +files. + + +To rebuild the sources it is necessary to have MMS/MMK installed on +the system. + +The library is available in the directory + + [.LIB] + +To compile applications using FreeType 2 you have to define the +logical FREETYPE pointing to the directory + + [.INCLUDE.FREETYPE] + +i.e., if the directory in which this INSTALL.VMS file is located is +$disk:[freetype] then define the logical with + + define freetype $disk:[freetype.include.freetype] + +This version has been tested with Compaq C V6.2-006 on OpenVMS Alpha +V7.2-1. + + + Any problems can be reported to + + Jouk Jansen or + Martin P.J. Zinser + +------------------------------------------------------------------------ + +Copyright 2000, 2004 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of INSTALL.VMS --- diff --git a/alienblaster/project/jni/freetype/docs/LICENSE.TXT b/alienblaster/project/jni/freetype/docs/LICENSE.TXT new file mode 100644 index 000000000..abebbcc78 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/LICENSE.TXT @@ -0,0 +1,31 @@ + +The FreeType 2 font engine is copyrighted work and cannot be used +legally without a software license. In order to make this project +usable to a vast majority of developers, we distribute it under two +mutually exclusive open-source licenses. + +This means that *you* must choose *one* of the two licenses described +below, then obey all its terms and conditions when using FreeType 2 in +any of your projects or products. + + - The FreeType License, found in the file `FTL.TXT', which is similar + to the original BSD license *with* an advertising clause that forces + you to explicitly cite the FreeType project in your product's + documentation. All details are in the license file. This license + is suited to products which don't use the GNU General Public + License. + + - The GNU General Public License version 2, found in `GPL.TXT' (any + later version can be used also), for programs which already use the + GPL. Note that the FTL is incompatible with the GPL due to its + advertisement clause. + +The contributed BDF and PCF drivers come with a license similar to that +of the X Window System. It is compatible to the above two licenses (see +file src/bdf/README and src/pcf/README). + +The gzip module uses the zlib license (see src/gzip/zlib.h) which too is +compatible to the above two licenses. + + +--- end of LICENSE.TXT --- diff --git a/alienblaster/project/jni/freetype/docs/MAKEPP b/alienblaster/project/jni/freetype/docs/MAKEPP new file mode 100644 index 000000000..58eaf551d --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/MAKEPP @@ -0,0 +1,5 @@ +As a special exception, FreeType can also be built with the 'makepp' +build tool, available from http://makepp.sourceforge.net. + +Note, however. that you will need at least version 1.19 and pass the +option --norc-substitution to have it work correctly. diff --git a/alienblaster/project/jni/freetype/docs/PATENTS b/alienblaster/project/jni/freetype/docs/PATENTS new file mode 100644 index 000000000..f36778b5e --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/PATENTS @@ -0,0 +1,27 @@ + + FreeType Patents Disclaimer + August 1999 + + + +WE HAVE DISCOVERED THAT APPLE OWNS SEVERAL PATENTS RELATED TO THE +RENDERING OF TRUETYPE FONTS. THIS COULD MEAN THAT THE FREE USE OF +FREETYPE MIGHT BE ILLEGAL IN THE USA, JAPAN, AND POSSIBLY OTHER +COUNTRIES, BE IT IN PROPRIETARY OR FREE SOFTWARE PRODUCTS. + +FOR MORE DETAILS, WE STRONGLY ADVISE YOU TO GO TO THE FREETYPE +PATENTS PAGE AT THE FOLLOWING WEB ADDRESS: + + http://www.freetype.org/patents.html + +WE WILL NOT PLACE INFORMATION IN THIS FILE AS THE SITUATION IS STILL +UNDETERMINED FOR NOW. AT THE TIME THESE LINES ARE WRITTEN, WE HAVE +CONTACTED APPLE'S LEGAL DEPARTMENT AND ARE STILL WAITING FOR THEIR +ANSWER ON THE SUBJECT. + +PLEASE READ THE `INSTALL' FILE TO SEE HOW TO DISABLE THE ENGINE'S +BYTECODE INTERPRETER IN ORDER TO BUILD A PATENT-FREE ENGINE, AT THE +COST OF RENDERING QUALITY. + + +--- end of PATENTS --- diff --git a/alienblaster/project/jni/freetype/docs/PROBLEMS b/alienblaster/project/jni/freetype/docs/PROBLEMS new file mode 100644 index 000000000..9b598966a --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/PROBLEMS @@ -0,0 +1,77 @@ +This file describes various problems that have been encountered in +compiling, installing and running FreeType 2. Suggestions for +additions or other improvements to this file are welcome. + +---------------------------------------------------------------------- + +Running Problems +================ + + +* Some Type 1, Multiple Masters, and CID-keyed PostScript fonts aren't + handled correctly. + +----- + +Of course, there might be bugs in FreeType, but some fonts based on +the PostScript format can't behandled indeed. The reason is that +FreeType doesn't contain a full PostScript interpreter but applies +pattern matching instead. In case a font doesn't follow the standard +structure of the given font format, FreeType fails. A typical example +is Adobe's `Optima' font family which contains extra code to switch +between low and high resolution versions of the glyphs. + +It might be possible to patch FreeType in some situations, though. +Please report failing fonts so that we investigate the problem and set +up a list of such problematic fonts. + +---------------------------------------------------------------------- + + +Compilation Problems +==================== + + +* I get an `internal compilation error' (ICE) while compiling FreeType + 2.2.1 with Intel C++. + + This has been reported for the following compiler version: + + Intel(R) C++ Compiler for 32-bit applications, + Version 9.0 Build 20050430Z Package ID: W_CC_P_9.0.019 + +----- + +The best solution is to update the compiler to version + + Intel(R) C++ Compiler for 32-bit applications, + Version 9.1 Build 20060323Z Package ID: W_CC_P_9.1.022 + +or newer. If this isn't feasible, apply the following patch. + + +--- src/cache/ftcbasic.c 20 Mar 2006 12:10:24 -0000 1.20 ++++ src/cache/ftcbasic.c.patched 15 May 2006 02:51:02 -0000 +@@ -252,7 +252,7 @@ + */ + + FT_CALLBACK_TABLE_DEF +- const FTC_IFamilyClassRec ftc_basic_image_family_class = ++ FTC_IFamilyClassRec ftc_basic_image_family_class = + { + { + sizeof ( FTC_BasicFamilyRec ), +@@ -266,7 +266,7 @@ + + + FT_CALLBACK_TABLE_DEF +- const FTC_GCacheClassRec ftc_basic_image_cache_class = ++ FTC_GCacheClassRec ftc_basic_image_cache_class = + { + { + ftc_inode_new, + + +---------------------------------------------------------------------- + +--- end of PROBLEMS --- diff --git a/alienblaster/project/jni/freetype/docs/TODO b/alienblaster/project/jni/freetype/docs/TODO new file mode 100644 index 000000000..be60d6f04 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/TODO @@ -0,0 +1,40 @@ +Here is a list of items that need to be addressed in FreeType 2 +--------------------------------------------------------------- + +* Implement stem3/counter hints properly in the Postscript hinter. + +* Add CIDCMap support to the CID driver. + +* Add track kerning support to the PFR driver. + +* Add kerning (AFM file) support to the CID driver. + + +Here is a list of bugs which should be handled +---------------------------------------------- + +Other bugs have been registered at the savannah bugzilla of FreeType. + +* CID driver: + Handle the case where a CID font has a top-level font matrix also + (see PLRM, 5.11.3, Type 0 CIDFonts). Since CID_FaceInfoRec lacks + a font_matrix entry we have to directly apply it to all subfont + matrices. + +* CID driver: + Use top-level font matrix entry for setting the upem value, not the + entries in the FDarray. If absent, use 1000. + +------------------------------------------------------------------------ + +Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of TODO --- diff --git a/alienblaster/project/jni/freetype/docs/TRUETYPE b/alienblaster/project/jni/freetype/docs/TRUETYPE new file mode 100644 index 000000000..3e1614ad4 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/TRUETYPE @@ -0,0 +1,40 @@ +How to enable the TrueType native hinter if you need it +------------------------------------------------------- + + The TrueType bytecode interpreter is disabled in all public releases + of the FreeType packages for patents reasons; see + + http://www.freetype.org/patents.html + + for more details. + + However, many Linux distributions do enable the interpreter in the + FreeType packages (DEB/RPM/etc.) they produce for their platforms. If + you are using TrueType fonts on your system, you most probably want to + enable it manually by doing the following: + + - open the file `include/freetype/config/ftoption.h' + + - locate a line that says: + + /* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + - change it to: + + #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + These steps must be done _before_ compiling the library. + +------------------------------------------------------------------------ + +Copyright 2003, 2005, 2006 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of TRUETYPE --- diff --git a/alienblaster/project/jni/freetype/docs/UPGRADE.UNIX b/alienblaster/project/jni/freetype/docs/UPGRADE.UNIX new file mode 100644 index 000000000..48c746d70 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/UPGRADE.UNIX @@ -0,0 +1,137 @@ + +SPECIAL NOTE FOR UNIX USERS +=========================== + + If you are installing this release of FreeType on a system that + already uses release 2.0.5 (or even an older version), you have to + perform a few special steps to ensure that everything goes well. + + + 1. Enable the TrueType bytecode hinter if you need it + ----------------------------------------------------- + + See the instructions in the file `TRUETYPE' of this directory. + + Note that FreeType supports TrueType fonts without the bytecode + interpreter through its auto-hinter, which now generates relatively + good results with most fonts. + + + 2. Determine the correct installation path + ------------------------------------------ + + By default, the configure script installs the library in + `/usr/local'. However, many Unix distributions now install the + library in `/usr', since FreeType is becoming a critical system + component. + + If FreeType is already installed on your system, type + + freetype-config --prefix + + on the command line. This should return the installation path + (e.g., `/usr' or `/usr/local'). To avoid problems of parallel + FreeType versions, use this path for the --prefix option of the + configure script. + + Otherwise, simply use `/usr' (or whatever you think is adequate for + your installation). + + + 3. Ensure that you are using GNU Make + ------------------------------------- + + The FreeType build system _exclusively_ works with GNU Make (as an + exception you can use make++ which emulates GNU Make sufficiently; + see http://makepp.sourceforge.net). You will not be able to compile + the library with the instructions below using any other alternative + (including BSD Make). + + Trying to compile the library with a different Make tool prints a + message like: + + Sorry, GNU make is required to build FreeType2. + + and the build process is aborted. If this happens, install GNU Make + on your system, and use the GNUMAKE environment variable to name it. + + + 4. Build and install the library + -------------------------------- + + The following should work on all Unix systems where the `make' + command invokes GNU Make: + + ./configure --prefix= + make + make install (as root) + + where `' must be replaced by the prefix returned by the + `freetype-config' command. + + When using a different command to invoke GNU Make, use the GNUMAKE + variable. For example, if `gmake' is the command to use on your + system, do something like: + + GNUMAKE=gmake ./configure --prefix= + gmake + gmake install (as root) + + + 5. Take care of XFree86 version 4 + --------------------------------- + + Certain Linux distributions install _several_ versions of FreeType + on your system. For example, on a fresh Mandrake 8.1 system, you + can find the following files: + + /usr/lib/libfreetype.so which links to + /usr/lib/libfreetype.6.1.0.so + + and + + /usr/X11R6/lib/libfreetype.so which links to + /usr/X11R6/lib/libfreetype.6.0.so + + Note that these files correspond to two distinct versions of the + library! It seems that this surprising issue is due to the install + scripts of recent XFree86 servers (from 4.1.0) which install their + own (dated) version of the library in `/usr/X11R6/lib'. + + In certain _rare_ cases you may experience minor problems if you + install this release of the library in `/usr' only, namely, that + certain applications do not benefit from the bug fixes and rendering + improvements you would expect. + + There are two good ways to deal with this situation: + + - Install the library _twice_, in `/usr' and in `/usr/X11R6' (you + have to do that each time you install a new FreeType release + though). + + - Change the link in /usr/X11R6/lib/libfreetype.so to point to + + /usr/lib/libfreetype.so, + + and get rid of + + /usr/X11R6/lib/libfreetype.6.0.so + + The FreeType Team is not responsible for this problem, so please + contact either the XFree86 development team or your Linux + distributor to help clear this issue in case the information given + here doesn't help. + +------------------------------------------------------------------------ + +Copyright 2003, 2005 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +---- end of UPGRADE.UNIX --- diff --git a/alienblaster/project/jni/freetype/docs/VERSION.DLL b/alienblaster/project/jni/freetype/docs/VERSION.DLL new file mode 100644 index 000000000..bb55c3dda --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/VERSION.DLL @@ -0,0 +1,138 @@ +Due to our use of `libtool' to generate and install the FreeType 2 +libraries on Unix systems, as well as other historical events, it is +generally very difficult to know precisely which release of the font +engine is installed on a given system. + +This file tries to explain why and to document ways to properly detect +FreeType on Unix. + + +1. Version and Release numbers +------------------------------ + +For each new public release of FreeType 2, there are generally *three* +distinct `version' numbers to consider: + + * The official FreeType 2 release number, like 2.0.9 or 2.1.3. + + * The libtool (and Unix) specific version number, like 9.2.3. This is + what `freetype-config --version' returns. + + * The platform-specific shared object number, used for example when + the library is installed as `/usr/lib/libfreetype.so.6.3.2'. + +The platform-specific number is, unsurprisingly, platform-specific and +varies with the operating system you are using (several variants of +Linux, FreeBSD, Solaris, etc.). You should thus _never_ use it, even +for simple tests. + +The libtool-specific number does not equal the release number but is +tied to it. + +The release number is available at *compile* time through the following +macros defined in FT_FREETYPE_H: + + - FREETYPE_MAJOR: major release number + - FREETYPE_MINOR: minor release number + - FREETYPE_PATCH: patch release number + +See below for a small autoconf fragment. + +The release number is also available at *runtime* through the +`FT_Library_Version' API. Unfortunately, this one wasn't available or +working correctly before the 2.1.3 official release. + + +2. History +---------- + +The following table gives, for each official release, the corresponding +libtool number, as well as the shared object number found on _most_ +systems, but not all of them: + + + release libtool so + ------------------------------- + 2.3.12 10.0.4 6.4.0 + 2.3.11 9.22.3 6.3.22 + 2.3.10 9.21.3 6.3.21 + 2.3.9 9.20.3 6.3.20 + 2.3.8 9.19.3 6.3.19 + 2.3.7 9.18.3 6.3.18 + 2.3.6 9.17.3 6.3.17 + 2.3.5 9.16.3 6.3.16 + 2.3.4 9.15.3 6.3.15 + 2.3.3 9.14.3 6.3.14 + 2.3.2 9.13.3 6.3.13 + 2.3.1 9.12.3 6.3.12 + 2.3.0 9.11.3 6.3.11 + 2.2.1 9.10.3 6.3.10 + 2.2.0 9.9.3 6.3.9 + 2.1.10 9.8.3 6.3.8 + 2.1.9 9.7.3 6.3.7 + 2.1.8 9.6.3 6.3.6 + 2.1.7 9.5.3 6.3.5 + 2.1.6 9.5.3 6.3.5 + 2.1.5 9.4.3 6.3.4 + 2.1.4 9.3.3 6.3.3 + 2.1.3 9.2.3 6.3.2 + 2.1.2 9.1.3 6.3.1 + 2.1.1 9.0.3 ? + 2.1.0 8.0.2 ? + 2.0.9 9.0.3 ? + 2.0.8 8.0.2 ? + 2.0.4 7.0.1 ? + 2.0.1 6.1.0 ? + +The libtool numbers are a bit inconsistent due to the library's history: + + - 2.1.0 was created as a development branch from 2.0.8 (hence the same + libtool numbers). + + - 2.0.9 was a bug-fix release of the `stable' branch, and we + incorrectly increased its libtool number. + + - 2.1.4 was a development version, however it was stable enough to be + the basis of the 2.2.0 release. + + +3. Autoconf Code Fragment +------------------------- + +Lars Clausen contributed the following autoconf fragment to detect which +version of FreeType is installed on a system. This one tests for a +version that is at least 2.0.9; you should change it to check against +other release numbers. + + + AC_MSG_CHECKING([whether FreeType version is 2.0.9 or higher]) + old_CPPFLAGS="$CPPFLAGS" + CPPFLAGS=`freetype-config --cflags` + AC_TRY_CPP([ + +#include +#include FT_FREETYPE_H +#if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009 +#error Freetype version too low. +#endif + ], + [AC_MSG_RESULT(yes) + FREETYPE_LIBS=`freetype-config --libs` + AC_SUBST(FREETYPE_LIBS) + AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library]) + CPPFLAGS="$old_CPPFLAGS"], + [AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])]) + +------------------------------------------------------------------------ + +Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of VERSION.DLL --- diff --git a/alienblaster/project/jni/freetype/docs/formats.txt b/alienblaster/project/jni/freetype/docs/formats.txt new file mode 100644 index 000000000..571f5ff50 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/formats.txt @@ -0,0 +1,164 @@ +This file contains a list of various font formats. It gives the +reference document and whether it is supported in FreeType 2. + + + file type: + The only special case is `MAC'; on older Mac OS versions, a `file' + is stored as a data and a resource fork, this is, within two + separate data chunks. In all other cases, the font data is stored + in a single file. + + wrapper format: + The format used to represent the font data. In the table below it + is used only if the font format differs. Possible values are `SFNT' + (binary), `PS' (a text header, followed by binary or text data), and + `LZW' (compressed with either `gzip' or `compress'). + + font format: + How the font is to be accessed, possibly after converting the file + type and wrapper format into a generic form. Bitmap formats are + `BDF', `PCF', and one form of `WINFNT'; all others are vector + formats. + + font type: + Sub-formats of the font format. `SBIT' and `MACSBIT' are bitmap + formats, `MM' and `VAR' support optical axes. + + glyph access: + If not specified, the glyph access is `standard' to the font format. + Values are `CID' for CID-keyed fonts, `SYNTHETIC' for fonts which + are modified versions of other fonts by means of a transformation + matrix, `COLLECTION' for collecting multiple fonts (sharing most of + the data) into a single file, and `TYPE_0' for PS fonts which are to + be accessed in a tree-like structure. + + FreeType driver: + The module in the FreeType library which handles the specific font + format. A missing entry means that FreeType doesn't support the + font format (yet). + + +Please send additions and/or corrections to wl@gnu.org or to the +FreeType developer's list at freetype-devel@nongnu.org (for subscribers +only). If you can provide a font example for a format which isn't +supported yet please send a mail too. + + +file wrapper font font glyph FreeType reference +type format format type access driver documents +---------------------------------------------------------------------------- + +--- --- BDF --- --- bdf 5005.BDF_Spec.pdf, X11 + + +--- SFNT PS TYPE_1 --- type1 Type 1 GX Font Format + (for the Mac) [3] +MAC SFNT PS TYPE_1 --- type1 Type 1 GX Font Format + (for the Mac) [3] +--- SFNT PS TYPE_1 CID cid 5180.sfnt.pdf (for the Mac) + [3] +MAC SFNT PS TYPE_1 CID cid 5180.sfnt.pdf (for the Mac) + [3] +--- SFNT PS CFF --- cff OT spec, 5176.CFF.pdf + (`OTTO' format) +MAC SFNT PS CFF --- cff OT spec, 5176.CFF.pdf + (`OTTO' format) +--- SFNT PS CFF CID cff OT spec, 5176.CFF.pdf +MAC SFNT PS CFF CID cff OT spec, 5176.CFF.pdf +--- SFNT PS CFF SYNTHETIC --- OT spec, 5176.CFF.pdf +MAC SFNT PS CFF SYNTHETIC --- OT spec, 5176.CFF.pdf +--- SFNT TT SBIT --- sfnt XFree86 (bitmaps only; + with `head' table) +--- SFNT TT MACSBIT --- sfnt OT spec (for the Mac; + bitmaps only; `bhed' table) +MAC SFNT TT MACSBIT --- sfnt OT spec (for the Mac; + bitmaps only; `bhed' table) +--- SFNT TT --- --- truetype OT spec (`normal' TT font) +MAC SFNT TT --- --- truetype OT spec (`normal' TT font) +MAC SFNT TT VAR --- truetype GX spec (`?var' tables) +--- SFNT TT --- COLLECTION truetype OT spec (this can't be CFF) +MAC SFNT TT --- COLLECTION truetype OT spec (this can't be CFF) + + +--- --- PS TYPE_1 --- type1 T1_SPEC.pdf + (`normal' Type 1 font) +MAC --- PS TYPE_1 --- type1 T1_SPEC.pdf + (`normal' Type 1 font) +--- --- PS TYPE_1 CID cid PLRM.pdf (CID Font Type 0; + Type 9 font) +--- --- PS MM --- type1 5015.Type1_Supp.pdf + (Multiple Masters) +--- --- PS CFF --- cff 5176.CFF.pdf (`pure' CFF) +--- --- PS CFF CID cff 5176.CFF.pdf (`pure' CFF) +--- --- PS CFF SYNTHETIC --- 5176.CFF.pdf (`pure' CFF) +--- PS PS CFF --- --- PLRM.pdf (Type 2) [1] +--- PS PS CFF CID --- PLRM.pdf (Type 2) [1] +--- PS PS CFF SYNTHETIC --- PLRM.pdf (Type 2) [1] +--- --- PS --- TYPE_0 --- PLRM.pdf +--- --- PS TYPE_3 --- --- PLRM.pdf (never supported) +--- --- PS TYPE_3 CID --- PLRM.pdf (CID Font Type 1; + Type 10 font; never supported) +--- PS PS TYPE_14 --- --- PLRM.pdf (Chameleon font; + Type 14 font; never supported?) +--- --- PS TYPE_32 CID --- PLRM.pdf (CID Font Type 4; + Type 32 font; never supported?) +--- PS TT --- --- type42 5012.Type42_Spec.pdf + (Type 42 font) +--- PS TT --- CID --- PLRM.pdf (CID Font Type 2; + Type 11 font) + + +--- ? ? CEF ? cff ? + + +--- --- PCF --- --- pcf X11, [4] +--- LZW PCF --- --- pcf X11, [4] + + +--- --- PFR PFR0 --- pfr [2] +--- --- PFR PFR1 --- --- (undocumented, proprietary; + probably never supported) + + +--- --- WINFNT --- --- winfonts MS Windows 3 Developer's Notes +--- --- WINFNT VECTOR --- --- MS Windows 3 Developer's Notes + + +[1] Support should be rather simple since this is identical to `CFF' but + in a PS wrapper. + +[2] Official PFR specification: + + http://www.bitstream.com/categories/developer/truedoc/pfrspec.html + http://www.bitstream.com/categories/developer/truedoc/pfrspec1.2.pdf + + The syntax of the auxiliary data is not defined there, but is + partially defined in MHP 1.0.3 (also called ETSI TS 101812 V1.3.1) + section 7.4. + + http://www.etsi.org/ + http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=18799 + + (free registration required). + +[3] Support is rudimentary currently; some tables are not loaded yet. + +[4] There is no formal PCF specification; you have to deduce the exact + format from the source code within X11. George Williams did this for + his FontForge editor: + + http://fontforge.sourceforge.net/pcf-format.html + +------------------------------------------------------------------------ + +Copyright 2004, 2005, 2008, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of formats.txt --- diff --git a/alienblaster/project/jni/freetype/docs/raster.txt b/alienblaster/project/jni/freetype/docs/raster.txt new file mode 100644 index 000000000..95d9e2401 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/raster.txt @@ -0,0 +1,635 @@ + + How FreeType's rasterizer work + + by David Turner + + Revised 2007-Feb-01 + + +This file is an attempt to explain the internals of the FreeType +rasterizer. The rasterizer is of quite general purpose and could +easily be integrated into other programs. + + + I. Introduction + + II. Rendering Technology + 1. Requirements + 2. Profiles and Spans + a. Sweeping the Shape + b. Decomposing Outlines into Profiles + c. The Render Pool + d. Computing Profiles Extents + e. Computing Profiles Coordinates + f. Sweeping and Sorting the Spans + + +I. Introduction +=============== + + A rasterizer is a library in charge of converting a vectorial + representation of a shape into a bitmap. The FreeType rasterizer + has been originally developed to render the glyphs found in + TrueType files, made up of segments and second-order Béziers. + Meanwhile it has been extended to render third-order Bézier curves + also. This document is an explanation of its design and + implementation. + + While these explanations start from the basics, a knowledge of + common rasterization techniques is assumed. + + +II. Rendering Technology +======================== + +1. Requirements +--------------- + + We assume that all scaling, rotating, hinting, etc., has been + already done. The glyph is thus described by a list of points in + the device space. + + - All point coordinates are in the 26.6 fixed float format. The + used orientation is: + + + ^ y + | reference orientation + | + *----> x + 0 + + + `26.6' means that 26 bits are used for the integer part of a + value and 6 bits are used for the fractional part. + Consequently, the `distance' between two neighbouring pixels is + 64 `units' (1 unit = 1/64th of a pixel). + + Note that, for the rasterizer, pixel centers are located at + integer coordinates. The TrueType bytecode interpreter, + however, assumes that the lower left edge of a pixel (which is + taken to be a square with a length of 1 unit) has integer + coordinates. + + + ^ y ^ y + | | + | (1,1) | (0.5,0.5) + +-----------+ +-----+-----+ + | | | | | + | | | | | + | | | o-----+-----> x + | | | (0,0) | + | | | | + o-----------+-----> x +-----------+ + (0,0) (-0.5,-0.5) + + TrueType bytecode interpreter FreeType rasterizer + + + A pixel line in the target bitmap is called a `scanline'. + + - A glyph is usually made of several contours, also called + `outlines'. A contour is simply a closed curve that delimits an + outer or inner region of the glyph. It is described by a series + of successive points of the points table. + + Each point of the glyph has an associated flag that indicates + whether it is `on' or `off' the curve. Two successive `on' + points indicate a line segment joining the two points. + + One `off' point amidst two `on' points indicates a second-degree + (conic) Bézier parametric arc, defined by these three points + (the `off' point being the control point, and the `on' ones the + start and end points). Similarly, a third-degree (cubic) Bézier + curve is described by four points (two `off' control points + between two `on' points). + + Finally, for second-order curves only, two successive `off' + points forces the rasterizer to create, during rendering, an + `on' point amidst them, at their exact middle. This greatly + facilitates the definition of successive Bézier arcs. + + The parametric form of a second-order Bézier curve is: + + P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3 + + (P1 and P3 are the end points, P2 the control point.) + + The parametric form of a third-order Bézier curve is: + + P(t) = (1-t)^3*P1 + 3*t*(1-t)^2*P2 + 3*t^2*(1-t)*P3 + t^3*P4 + + (P1 and P4 are the end points, P2 and P3 the control points.) + + For both formulae, t is a real number in the range [0..1]. + + Note that the rasterizer does not use these formulae directly. + They exhibit, however, one very useful property of Bézier arcs: + Each point of the curve is a weighted average of the control + points. + + As all weights are positive and always sum up to 1, whatever the + value of t, each arc point lies within the triangle (polygon) + defined by the arc's three (four) control points. + + In the following, only second-order curves are discussed since + rasterization of third-order curves is completely identical. + + Here some samples for second-order curves. + + + * # on curve + * off curve + __---__ + #-__ _-- -_ + --__ _- - + --__ # \ + --__ # + -# + Two `on' points + Two `on' points and one `off' point + between them + + * + # __ Two `on' points with two `off' + \ - - points between them. The point + \ / \ marked `0' is the middle of the + - 0 \ `off' points, and is a `virtual + -_ _- # on' point where the curve passes. + -- It does not appear in the point + * list. + + +2. Profiles and Spans +--------------------- + + The following is a basic explanation of the _kind_ of computations + made by the rasterizer to build a bitmap from a vector + representation. Note that the actual implementation is slightly + different, due to performance tuning and other factors. + + However, the following ideas remain in the same category, and are + more convenient to understand. + + + a. Sweeping the Shape + + The best way to fill a shape is to decompose it into a number of + simple horizontal segments, then turn them on in the target + bitmap. These segments are called `spans'. + + __---__ + _-- -_ + _- - + - \ + / \ + / \ + | \ + + __---__ Example: filling a shape + _----------_ with spans. + _-------------- + ----------------\ + /-----------------\ This is typically done from the top + / \ to the bottom of the shape, in a + | | \ movement called a `sweep'. + V + + __---__ + _----------_ + _-------------- + ----------------\ + /-----------------\ + /-------------------\ + |---------------------\ + + + In order to draw a span, the rasterizer must compute its + coordinates, which are simply the x coordinates of the shape's + contours, taken on the y scanlines. + + + /---/ |---| Note that there are usually + /---/ |---| several spans per scanline. + | /---/ |---| + | /---/_______|---| When rendering this shape to the + V /----------------| current scanline y, we must + /-----------------| compute the x values of the + a /----| |---| points a, b, c, and d. + - - - * * - - - - * * - - y - + / / b c| |d + + + /---/ |---| + /---/ |---| And then turn on the spans a-b + /---/ |---| and c-d. + /---/_______|---| + /----------------| + /-----------------| + a /----| |---| + - - - ####### - - - - ##### - - y - + / / b c| |d + + + b. Decomposing Outlines into Profiles + + For each scanline during the sweep, we need the following + information: + + o The number of spans on the current scanline, given by the + number of shape points intersecting the scanline (these are + the points a, b, c, and d in the above example). + + o The x coordinates of these points. + + x coordinates are computed before the sweep, in a phase called + `decomposition' which converts the glyph into *profiles*. + + Put it simply, a `profile' is a contour's portion that can only + be either ascending or descending, i.e., it is monotonic in the + vertical direction (we also say y-monotonic). There is no such + thing as a horizontal profile, as we shall see. + + Here are a few examples: + + + this square + 1 2 + ---->---- is made of two + | | | | + | | profiles | | + ^ v ^ + v + | | | | + | | | | + ----<---- + + up down + + + this triangle + + P2 1 2 + + |\ is made of two | \ + ^ | \ \ | \ + | | \ \ profiles | \ | + | | \ v ^ | \ | + | \ | | + \ v + | \ | | \ + P1 ---___ \ ---___ \ + ---_\ ---_ \ + <--__ P3 up down + + + + A more general contour can be made of more than two profiles: + + __ ^ + / | / ___ / | + / | / | / | / | + | | / / => | v / / + | | | | | | ^ | + ^ | |___| | | ^ + | + | + v + | | | v | | + | | | up | + |___________| | down | + + <-- up down + + + Successive profiles are always joined by horizontal segments + that are not part of the profiles themselves. + + For the rasterizer, a profile is simply an *array* that + associates one horizontal *pixel* coordinate to each bitmap + *scanline* crossed by the contour's section containing the + profile. Note that profiles are *oriented* up or down along the + glyph's original flow orientation. + + In other graphics libraries, profiles are also called `edges' or + `edgelists'. + + + c. The Render Pool + + FreeType has been designed to be able to run well on _very_ + light systems, including embedded systems with very few memory. + + A render pool will be allocated once; the rasterizer uses this + pool for all its needs by managing this memory directly in it. + The algorithms that are used for profile computation make it + possible to use the pool as a simple growing heap. This means + that this memory management is actually quite easy and faster + than any kind of malloc()/free() combination. + + Moreover, we'll see later that the rasterizer is able, when + dealing with profiles too large and numerous to lie all at once + in the render pool, to immediately decompose recursively the + rendering process into independent sub-tasks, each taking less + memory to be performed (see `sub-banding' below). + + The render pool doesn't need to be large. A 4KByte pool is + enough for nearly all renditions, though nearly 100% slower than + a more comfortable 16KByte or 32KByte pool (that was tested with + complex glyphs at sizes over 500 pixels). + + + d. Computing Profiles Extents + + Remember that a profile is an array, associating a _scanline_ to + the x pixel coordinate of its intersection with a contour. + + Though it's not exactly how the FreeType rasterizer works, it is + convenient to think that we need a profile's height before + allocating it in the pool and computing its coordinates. + + The profile's height is the number of scanlines crossed by the + y-monotonic section of a contour. We thus need to compute these + sections from the vectorial description. In order to do that, + we are obliged to compute all (local and global) y extrema of + the glyph (minima and maxima). + + + P2 For instance, this triangle has only + two y-extrema, which are simply + |\ + | \ P2.y as a vertical maximum + | \ P3.y as a vertical minimum + | \ + | \ P1.y is not a vertical extremum (though + | \ it is a horizontal minimum, which we + P1 ---___ \ don't need). + ---_\ + P3 + + + Note that the extrema are expressed in pixel units, not in + scanlines. The triangle's height is certainly (P3.y-P2.y+1) + pixel units, but its profiles' heights are computed in + scanlines. The exact conversion is simple: + + - min scanline = FLOOR ( min y ) + - max scanline = CEILING( max y ) + + A problem arises with Bézier Arcs. While a segment is always + necessarily y-monotonic (i.e., flat, ascending, or descending), + which makes extrema computations easy, the ascent of an arc can + vary between its control points. + + + P2 + * + # on curve + * off curve + __-x--_ + _-- -_ + P1 _- - A non y-monotonic Bézier arc. + # \ + - The arc goes from P1 to P3. + \ + \ P3 + # + + + We first need to be able to easily detect non-monotonic arcs, + according to their control points. I will state here, without + proof, that the monotony condition can be expressed as: + + P1.y <= P2.y <= P3.y for an ever-ascending arc + + P1.y >= P2.y >= P3.y for an ever-descending arc + + with the special case of + + P1.y = P2.y = P3.y where the arc is said to be `flat'. + + As you can see, these conditions can be very easily tested. + They are, however, extremely important, as any arc that does not + satisfy them necessarily contains an extremum. + + Note also that a monotonic arc can contain an extremum too, + which is then one of its `on' points: + + + P1 P2 + #---__ * P1P2P3 is ever-descending, but P1 + -_ is an y-extremum. + - + ---_ \ + -> \ + \ P3 + # + + + Let's go back to our previous example: + + + P2 + * + # on curve + * off curve + __-x--_ + _-- -_ + P1 _- - A non-y-monotonic Bézier arc. + # \ + - Here we have + \ P2.y >= P1.y && + \ P3 P2.y >= P3.y (!) + # + + + We need to compute the vertical maximum of this arc to be able + to compute a profile's height (the point marked by an `x'). The + arc's equation indicates that a direct computation is possible, + but we rely on a different technique, which use will become + apparent soon. + + Bézier arcs have the special property of being very easily + decomposed into two sub-arcs, which are themselves Bézier arcs. + Moreover, it is easy to prove that there is at most one vertical + extremum on each Bézier arc (for second-degree curves; similar + conditions can be found for third-order arcs). + + For instance, the following arc P1P2P3 can be decomposed into + two sub-arcs Q1Q2Q3 and R1R2R3: + + + P2 + * + # on curve + * off curve + + + original Bézier arc P1P2P3. + __---__ + _-- --_ + _- -_ + - - + / \ + / \ + # # + P1 P3 + + + + P2 + * + + + + Q3 Decomposed into two subarcs + Q2 R2 Q1Q2Q3 and R1R2R3 + * __-#-__ * + _-- --_ + _- R1 -_ Q1 = P1 R3 = P3 + - - Q2 = (P1+P2)/2 R2 = (P2+P3)/2 + / \ + / \ Q3 = R1 = (Q2+R2)/2 + # # + Q1 R3 Note that Q2, R2, and Q3=R1 + are on a single line which is + tangent to the curve. + + + We have then decomposed a non-y-monotonic Bézier curve into two + smaller sub-arcs. Note that in the above drawing, both sub-arcs + are monotonic, and that the extremum is then Q3=R1. However, in + a more general case, only one sub-arc is guaranteed to be + monotonic. Getting back to our former example: + + + Q2 + * + + __-x--_ R1 + _-- #_ + Q1 _- Q3 - R2 + # \ * + - + \ + \ R3 + # + + + Here, we see that, though Q1Q2Q3 is still non-monotonic, R1R2R3 + is ever descending: We thus know that it doesn't contain the + extremum. We can then re-subdivide Q1Q2Q3 into two sub-arcs and + go on recursively, stopping when we encounter two monotonic + subarcs, or when the subarcs become simply too small. + + We will finally find the vertical extremum. Note that the + iterative process of finding an extremum is called `flattening'. + + + e. Computing Profiles Coordinates + + Once we have the height of each profile, we are able to allocate + it in the render pool. The next task is to compute coordinates + for each scanline. + + In the case of segments, the computation is straightforward, + using the Euclidean algorithm (also known as Bresenham). + However, for Bézier arcs, the job is a little more complicated. + + We assume that all Béziers that are part of a profile are the + result of flattening the curve, which means that they are all + y-monotonic (ascending or descending, and never flat). We now + have to compute the intersections of arcs with the profile's + scanlines. One way is to use a similar scheme to flattening + called `stepping'. + + + Consider this arc, going from P1 to + --------------------- P3. Suppose that we need to + compute its intersections with the + drawn scanlines. As already + --------------------- mentioned this can be done + directly, but the involved + * P2 _---# P3 algorithm is far too slow. + ------------- _-- -- + _- + _/ Instead, it is still possible to + ---------/----------- use the decomposition property in + / the same recursive way, i.e., + | subdivide the arc into subarcs + ------|-------------- until these get too small to cross + | more than one scanline! + | + -----|--------------- This is very easily done using a + | rasterizer-managed stack of + | subarcs. + # P1 + + + f. Sweeping and Sorting the Spans + + Once all our profiles have been computed, we begin the sweep to + build (and fill) the spans. + + As both the TrueType and Type 1 specifications use the winding + fill rule (but with opposite directions), we place, on each + scanline, the present profiles in two separate lists. + + One list, called the `left' one, only contains ascending + profiles, while the other `right' list contains the descending + profiles. + + As each glyph is made of closed curves, a simple geometric + property ensures that the two lists contain the same number of + elements. + + Creating spans is thus straightforward: + + 1. We sort each list in increasing horizontal order. + + 2. We pair each value of the left list with its corresponding + value in the right list. + + + / / | | For example, we have here + / / | | four profiles. Two of + >/ / | | | them are ascending (1 & + 1// / ^ | | | 2 3), while the two others + // // 3| | | v are descending (2 & 4). + / //4 | | | On the given scanline, + a / /< | | the left list is (1,3), + - - - *-----* - - - - *---* - - y - and the right one is + / / b c| |d (4,2) (sorted). + + There are then two spans, joining + 1 to 4 (i.e. a-b) and 3 to 2 + (i.e. c-d)! + + + Sorting doesn't necessarily take much time, as in 99 cases out + of 100, the lists' order is kept from one scanline to the next. + We can thus implement it with two simple singly-linked lists, + sorted by a classic bubble-sort, which takes a minimum amount of + time when the lists are already sorted. + + A previous version of the rasterizer used more elaborate + structures, like arrays to perform `faster' sorting. It turned + out that this old scheme is not faster than the one described + above. + + Once the spans have been `created', we can simply draw them in + the target bitmap. + +------------------------------------------------------------------------ + +Copyright 2003, 2007 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of raster.txt --- + +Local Variables: +coding: utf-8 +End: diff --git a/alienblaster/project/jni/freetype/docs/reference/.gitignore b/alienblaster/project/jni/freetype/docs/reference/.gitignore new file mode 100644 index 000000000..2d19fc766 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/reference/.gitignore @@ -0,0 +1 @@ +*.html diff --git a/alienblaster/project/jni/freetype/docs/reference/README b/alienblaster/project/jni/freetype/docs/reference/README new file mode 100644 index 000000000..51b04d6f1 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/reference/README @@ -0,0 +1,5 @@ +After saying `make refdoc' this directory contains the FreeType API +reference. You need python to make this target. + +This also works with Jam: Just type `jam refdoc' in the main directory. + diff --git a/alienblaster/project/jni/freetype/docs/release b/alienblaster/project/jni/freetype/docs/release new file mode 100644 index 000000000..5e2d51f88 --- /dev/null +++ b/alienblaster/project/jni/freetype/docs/release @@ -0,0 +1,195 @@ +How to prepare a new release +---------------------------- + +. include/freetype/freetype.h: Update FREETYPE_MAJOR, FREETYPE_MINOR, + and FREETYPE_PATCH. + +. Update version numbers in all files where necessary (for example, do + a grep for both `2.3.1' and `231' for release 2.3.1). + +. builds/unix/configure.raw: Update `version_info'. + +. docs/CHANGES: Document differences to last release. + +. README: Update. + +. docs/VERSION.DLL: Document changed `version_info'. + +. ChangeLog: Announce new release (both in the freetype2 and + freetype2-demos modules). + +. Clone the git archive to another directory with + + git clone -l -s . ../freetype2.test + + or something like this and run + + make distclean; make devel; make + make distclean; make devel; make multi + make distclean; make devel CC=g++; make CC=g++ + make distclean; make devel CC=g++; make multi CC=g++ + + sh autogen.sh + make distclean; ./configure; make + make distclean; ./configure CC=g++; make + + in the cloned repository to test compilation with both gcc and g++. + +. Test C++ compilation for freetype2-demos too (using `git clone' as + above). + +. Run src/tools/chktrcmp.py and check that there are no undefined + trace_XXXX macros. + +. Tag the git repositories (freetype2, freetype2-demos) with + + git tag VER- -m "" -u + + and push the tags with + + git push --tags + + TODO: Tag the home page CVS on savannah.nongnu.org. + +. Say `make dist' in both the freetype2 and freetype2-demos modules + to generate the .tar.gz, .tar.bz2, and .zip files. + +. Create the doc bundles (freetype-doc-.tar.gz, + freetype-doc-.tar.bz2, ftdoc.zip). This is + everything below + + freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/freetype2/docs/ + + except the `reference' subdirectory. Do *not* use option `-l' from + zip! + +. Run the following script (with updated `$VERSION', `$SAVANNAH_USER', + and $SOURCEFORGE_USER variables) to sign and upload the bundles to + both Savannah and SourceForge. The signing code has been taken from + the `gnupload' script (part of the automake bundle). + + #!/bin/sh + + VERSION=2.3.11 + SAVANNAH_USER=wl + SOURCEFORGE_USER=wlemb + + ##################################################################### + + GPG='/usr/bin/gpg --batch --no-tty' + + version=`echo $VERSION | sed "s/\\.//g"` + + FREETYPE_PACKAGES="freetype-$VERSION.tar.gz \ + freetype-$VERSION.tar.bz2 \ + ft$version.zip" + FT2DEMOS_PACKAGES="ft2demos-$VERSION.tar.gz \ + ft2demos-$VERSION.tar.bz2 \ + ftdmo$version.zip" + FTDOC_PACKAGES="freetype-doc-$VERSION.tar.gz \ + freetype-doc-$VERSION.tar.bz2 \ + ftdoc$version.zip" + + PACKAGE_LIST="$FREETYPE_PACKAGES \ + $FT2DEMOS_PACKAGES \ + $FTDOC_PACKAGES" + + set -e + unset passphrase + + PATH=/empty echo -n "Enter GPG passphrase: " + stty -echo + read -r passphrase + stty echo + echo + + for f in $PACKAGE_LIST; do + if test ! -f $f; then + echo "$0: Cannot find \`$f'" 1>&2 + exit 1 + else + : + fi + done + + for f in $PACKAGE_LIST; do + echo "Signing $f..." + rm -f $f.sig + echo $passphrase | $GPG --passphrase-fd 0 -ba -o $f.sig $f + done + + FREETYPE_SIGNATURES= + for i in $FREETYPE_PACKAGES; do + FREETYPE_SIGNATURES="$FREETYPE_SIGNATURES $i.sig" + done + + FT2DEMOS_SIGNATURES= + for i in $FT2DEMOS_PACKAGES; do + FT2DEMOS_SIGNATURES="$FT2DEMOS_SIGNATURES $i.sig" + done + + FTDOC_SIGNATURES= + for i in $FTDOC_PACKAGES; do + FTDOC_SIGNATURES="$FTDOC_SIGNATURES $i.sig" + done + + SIGNATURE_LIST="$FREETYPE_SIGNATURES \ + $FT2DEMOS_SIGNATURES \ + $FTDOC_SIGNATURES" + + scp $PACKAGE_LIST $SIGNATURE_LIST \ + $SAVANNAH_USER@dl.sv.nongnu.org:/releases/freetype/ + + rsync -avP -e ssh $FREETYPE_PACKAGES $FREETYPE_SIGNATURES \ + $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype2/$VERSION/ + rsync -avP -e ssh $FT2DEMOS_PACKAGES $FT2DEMOS_SIGNATURES \ + $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype-demos/$VERSION/ + rsync -avP -e ssh $FTDOC_PACKAGES $FTDOC_SIGNATURES \ + $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype-docs/$VERSION/ + + # EOF + +. While files on savannah.gnu.org are automatically moved to the right + directory, it must be done manually on SourceForge. Do that now. + +. Update the FreeType release notes on SourceForge. + +. Copy the reference files (generated by `make dist') to + + freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/freetype2/docs/reference + + and + + shell.sf.net:/home/groups/f/fr/freetype/htdocs/freetype2/docs/reference + + TODO: Create FreeType home page CVS on savannah.nongnu.org and + update it accordingly. + + Write script to automatically do this. + + Mirror FreeType's savannah home page everywhere. + +. Update + + freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/index2.html + + and copy it to + + shell.sf.net:/home/groups/f/fr/freetype/htdocs/index2.html + +. Announce new release on freetype-announce@nongnu.org and to relevant + newsgroups. + +---------------------------------------------------------------------- + +Copyright 2003, 2005, 2006, 2007, 2009 by +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute +this file you indicate that you have read the license and understand +and accept it fully. + + +--- end of release --- diff --git a/alienblaster/project/jni/freetype/include/freetype/config/ftconfig.h b/alienblaster/project/jni/freetype/include/freetype/config/ftconfig.h new file mode 100644 index 000000000..43d587e02 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/config/ftconfig.h @@ -0,0 +1,528 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* ANSI-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /* This ANSI version should stay in `include/freetype/config'. */ + /* */ + /*************************************************************************/ + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + + /* There are systems (like the Texas Instruments 'C54x) where a `char' */ + /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ + /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ + /* `char' type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + + /* The size of an `int' type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `long' type!" +#endif + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif + +#elif defined( __SC__ ) || defined( __MRC__ ) + /* Classic MacOS compilers */ +#include "ConditionalMacros.h" +#if TARGET_OS_MAC +#define FT_MACINTOSH 1 +#endif + +#endif + + + /*************************************************************************/ + /* */ + /*
      */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Int16 */ + /* */ + /* */ + /* A typedef for a 16bit signed integer type. */ + /* */ + typedef signed short FT_Int16; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UInt16 */ + /* */ + /* */ + /* A typedef for a 16bit unsigned integer type. */ + /* */ + typedef unsigned short FT_UInt16; + + /* */ + + + /* this #if 0 ... #endif clause is for documentation purposes */ +#if 0 + + /*************************************************************************/ + /* */ + /* */ + /* FT_Int32 */ + /* */ + /* */ + /* A typedef for a 32bit signed integer type. The size depends on */ + /* the configuration. */ + /* */ + typedef signed XXX FT_Int32; + + + /*************************************************************************/ + /* */ + /* */ + /* FT_UInt32 */ + /* */ + /* A typedef for a 32bit unsigned integer type. The size depends on */ + /* the configuration. */ + /* */ + typedef unsigned XXX FT_UInt32; + + /* */ + +#endif + +#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */ + /* is defined. You can however ignore this rule by defining the */ + /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* undefine the 64-bit macros in strict ANSI compilation mode */ +#undef FT_LONG64 +#undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + /* Provide assembler fragments for performance-critical functions. */ + /* These must be defined `static __inline__' with GCC. */ + +#if defined( __CC_ARM ) || defined( __ARMCC__ ) /* RVCT */ +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 t, t2; + + + __asm + { + smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ + mov a, t, asr #31 /* a = (hi >> 31) */ + add a, a, #0x8000 /* a += 0x8000 */ + adds t2, t2, a /* t2 += a */ + adc t, t, #0 /* t += carry */ + mov a, t2, lsr #16 /* a = t2 >> 16 */ + orr a, a, t, lsl #16 /* a |= t << 16 */ + } + return a; + } + +#endif /* __CC_ARM || __ARMCC__ */ + + +#ifdef __GNUC__ + +#if defined( __arm__ ) && !defined( __thumb__ ) && \ + !( defined( __CC_ARM ) || defined( __ARMCC__ ) ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_arm + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_arm( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 t, t2; + + + asm __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ + "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */ + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */ + "orr %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) ); + return a; + } + +#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */ + +#if defined( i386 ) +#define FT_MULFIX_ASSEMBLER FT_MulFix_i386 + + /* documentation is in freetype.h */ + + static __inline__ FT_Int32 + FT_MulFix_i386( FT_Int32 a, + FT_Int32 b ) + { + register FT_Int32 result; + + + __asm__ __volatile__ ( + "imul %%edx\n" + "movl %%edx, %%ecx\n" + "sarl $31, %%ecx\n" + "addl $0x8000, %%ecx\n" + "addl %%ecx, %%eax\n" + "adcl $0, %%edx\n" + "shrl $16, %%eax\n" + "shll $16, %%edx\n" + "addl %%edx, %%eax\n" + : "=a"(result), "=d"(b) + : "a"(a), "d"(b) + : "%ecx", "cc" ); + return result; + } + +#endif /* i386 */ + +#endif /* __GNUC__ */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#ifdef FT_CONFIG_OPTION_INLINE_MULFIX +#ifdef FT_MULFIX_ASSEMBLER +#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER +#endif +#endif + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/config/ftheader.h b/alienblaster/project/jni/freetype/include/freetype/config/ftheader.h new file mode 100644 index 000000000..b63945dcb --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/config/ftheader.h @@ -0,0 +1,780 @@ +/***************************************************************************/ +/* */ +/* ftheader.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FT_HEADER_H__ +#define __FT_HEADER_H__ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* nothing */ +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* nothing */ +#endif + + + /*************************************************************************/ + /* */ + /* Aliases for the FreeType 2 public and configuration files. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /*
      */ + /* header_file_macros */ + /* */ + /* */ + /* Header File Macros */ + /* */ + /* <Abstract> */ + /* Macro definitions used to #include specific header files. */ + /* */ + /* <Description> */ + /* The following macros are defined to the name of specific */ + /* FreeType~2 header files. They can be used directly in #include */ + /* statements as in: */ + /* */ + /* { */ + /* #include FT_FREETYPE_H */ + /* #include FT_MULTIPLE_MASTERS_H */ + /* #include FT_GLYPH_H */ + /* } */ + /* */ + /* There are several reasons why we are now using macros to name */ + /* public header files. The first one is that such macros are not */ + /* limited to the infamous 8.3~naming rule required by DOS (and */ + /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */ + /* */ + /* The second reason is that it allows for more flexibility in the */ + /* way FreeType~2 is installed on a given system. */ + /* */ + /*************************************************************************/ + + + /* configuration files */ + + /************************************************************************* + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType~2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h> +#endif + + /* */ + + /* public headers */ + + /************************************************************************* + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * base FreeType~2 API. + * + */ +#define FT_FREETYPE_H <freetype/freetype.h> + + + /************************************************************************* + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H <freetype/fterrors.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType~2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h> + + + /************************************************************************* + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H <freetype/ftsystem.h> + + + /************************************************************************* + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H <freetype/ftimage.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * basic data types defined by FreeType~2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H <freetype/fttypes.h> + + + /************************************************************************* + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list management API of FreeType~2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H <freetype/ftlist.h> + + + /************************************************************************* + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * scalable outline management API of FreeType~2. + * + */ +#define FT_OUTLINE_H <freetype/ftoutln.h> + + + /************************************************************************* + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H <freetype/ftsizes.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * module management API of FreeType~2. + * + */ +#define FT_MODULE_H <freetype/ftmodapi.h> + + + /************************************************************************* + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * renderer module management API of FreeType~2. + * + */ +#define FT_RENDER_H <freetype/ftrender.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the Type~1 format. + * + */ +#define FT_TYPE1_TABLES_H <freetype/t1tables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H <freetype/tttables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of TrueType four-byte `tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H <freetype/tttags.h> + + + /************************************************************************* + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a + * face. + * + */ +#define FT_BDF_H <freetype/ftbdf.h> + + + /************************************************************************* + * + * @macro: + * FT_CID_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which access CID font information from a + * face. + * + */ +#define FT_CID_H <freetype/ftcid.h> + + + /************************************************************************* + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H <freetype/ftgzip.h> + + + /************************************************************************* + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H <freetype/ftlzw.h> + + + /************************************************************************* + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H <freetype/ftwinfnt.h> + + + /************************************************************************* + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H <freetype/ftglyph.h> + + + /************************************************************************* + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H <freetype/ftbitmap.h> + + + /************************************************************************* + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H <freetype/ftbbox.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional FreeType~2 cache sub-system. + * + */ +#define FT_CACHE_H <freetype/ftcache.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `glyph image' API of the FreeType~2 cache sub-system. + * + * It is used to define a cache for @FT_Glyph elements. You can also + * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to + * store small glyph bitmaps, as it will use less memory. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * glyph image-related cache declarations. + * + */ +#define FT_CACHE_IMAGE_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_SMALL_BITMAPS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `small bitmaps' API of the FreeType~2 cache sub-system. + * + * It is used to define a cache for small glyph bitmaps in a relatively + * memory-efficient way. You can also use the API defined in + * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, + * including scalable outlines. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * small bitmaps-related cache declarations. + * + */ +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_CHARMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `charmap' API of the FreeType~2 cache sub-system. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * charmap-based cache declarations. + * + */ +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in #include statements to name the file containing the + * Macintosh-specific FreeType~2 API. The latter is used to access + * fonts embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H <freetype/ftmac.h> + + + /************************************************************************* + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional multiple-masters management API of FreeType~2. + * + */ +#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h> + + + /************************************************************************* + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which accesses embedded `name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H <freetype/ftsnames.h> + + + /************************************************************************* + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which validates OpenType tables (BASE, GDEF, + * GPOS, GSUB, JSTF). + * + */ +#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h> + + + /************************************************************************* + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat, + * mort, morx, bsln, just, kern, opbd, trak, prop). + * + */ +#define FT_GX_VALIDATE_H <freetype/ftgxval.h> + + + /************************************************************************* + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H <freetype/ftpfr.h> + + + /************************************************************************* + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H <freetype/ftstroke.h> + + + /************************************************************************* + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H <freetype/ftsynth.h> + + + /************************************************************************* + * + * @macro: + * FT_XFREE86_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which provides functions specific to the XFree86 and + * X.Org X11 servers. + */ +#define FT_XFREE86_H <freetype/ftxf86.h> + + + /************************************************************************* + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H <freetype/fttrigon.h> + + + /************************************************************************* + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H <freetype/ftlcdfil.h> + + + /************************************************************************* + * + * @macro: + * FT_UNPATENTED_HINTING_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h> + + + /************************************************************************* + * + * @macro: + * FT_INCREMENTAL_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which performs color filtering for subpixel rendering. + */ +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + + + /************************************************************************* + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H <freetype/ftgasp.h> + + + /************************************************************************* + * + * @macro: + * FT_ADVANCES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType~2 API which returns individual and ranged glyph advances. + */ +#define FT_ADVANCES_H <freetype/ftadvanc.h> + + + /* */ + +#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h> + + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to FT_CACHE_H at the moment just in case, but we know of */ + /* no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h> + + +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + +#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h> + + + /* + * Include internal headers definitions from <freetype/internal/...> + * only when building the library. + */ +#ifdef FT2_BUILD_LIBRARY +#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h> +#include FT_INTERNAL_INTERNAL_H +#endif /* FT2_BUILD_LIBRARY */ + + +#endif /* __FT2_BUILD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/config/ftmodule.h b/alienblaster/project/jni/freetype/include/freetype/config/ftmodule.h new file mode 100644 index 000000000..76d271a74 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/config/ftmodule.h @@ -0,0 +1,32 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `<topdir>/objs/') based on information + * from `<topdir>/modules.cfg'. + * + * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile + * FreeType without GNU make. + * + */ + +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) + +/* EOF */ diff --git a/alienblaster/project/jni/freetype/include/freetype/config/ftoption.h b/alienblaster/project/jni/freetype/include/freetype/config/ftoption.h new file mode 100644 index 000000000..217d7d0a8 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/config/ftoption.h @@ -0,0 +1,710 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* This file contains the default configuration macro definitions for */ + /* a standard build of the FreeType library. There are three ways to */ + /* use this file to build project-specific versions of the library: */ + /* */ + /* - You can modify this file by hand, but this is not recommended in */ + /* cases where you would like to build several versions of the */ + /* library from a single source directory. */ + /* */ + /* - You can put a copy of this file in your build directory, more */ + /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ + /* is the name of a directory that is included _before_ the FreeType */ + /* include path during compilation. */ + /* */ + /* The default FreeType Makefiles and Jamfiles use the build */ + /* directory `builds/<system>' by default, but you can easily change */ + /* that for your own projects. */ + /* */ + /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */ + /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ + /* locate this file during the build. For example, */ + /* */ + /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */ + /* #include <freetype/config/ftheader.h> */ + /* */ + /* will use `$BUILD/myftoptions.h' instead of this file for macro */ + /* definitions. */ + /* */ + /* Note also that you can similarly pre-define the macro */ + /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ + /* that are statically linked to the library at compile time. By */ + /* default, this file is <freetype/config/ftmodule.h>. */ + /* */ + /* We highly recommend using the third method whenever possible. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Uncomment the line below if you want to activate sub-pixel rendering */ + /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ + /* */ + /* Note that this feature is covered by several Microsoft patents */ + /* and should not be activated in any default build of the library. */ + /* */ + /* This macro has no impact on the FreeType API, only on its */ + /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ + /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */ + /* the original size in case this macro isn't defined; however, each */ + /* triplet of subpixels has R=G=B. */ + /* */ + /* This is done to allow FreeType clients to run unmodified, forcing */ + /* them to display normal gray-level anti-aliased glyphs. */ + /* */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /*************************************************************************/ + /* */ + /* Many compilers provide a non-ANSI 64-bit data type that can be used */ + /* by FreeType to speed up some computations. However, this will create */ + /* some problems when compiling the library in strict ANSI mode. */ + /* */ + /* For this reason, the use of 64-bit integers is normally disabled when */ + /* the __STDC__ macro is defined. You can however disable this by */ + /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ + /* */ + /* For most compilers, this will only create compilation warnings when */ + /* building the library. */ + /* */ + /* ObNote: The compiler-specific 64-bit integers are detected in the */ + /* file `ftconfig.h' either statically or through the */ + /* `configure' script on supported platforms. */ + /* */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /*************************************************************************/ + /* */ + /* If this macro is defined, do not try to use an assembler version of */ + /* performance-critical functions (e.g. FT_MulFix). You should only do */ + /* that to verify that the assembler function works properly, or to */ + /* execute benchmark tests of the various implementations. */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /*************************************************************************/ + /* */ + /* If this macro is defined, try to use an inlined assembler version of */ + /* the `FT_MulFix' function, which is a `hotspot' when loading and */ + /* hinting glyphs, and which should be executed as fast as possible. */ + /* */ + /* Note that if your compiler or CPU is not supported, this will default */ + /* to the standard and portable implementation found in `ftcalc.c'. */ + /* */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + + /*************************************************************************/ + /* */ + /* Gzip-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `gzip' program. This is mostly used to parse many of the PCF files */ + /* that come with XFree86. The implementation uses `zlib' to */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ + /* */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /*************************************************************************/ + /* */ + /* ZLib library selection */ + /* */ + /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ + /* It allows FreeType's `ftgzip' component to link to the system's */ + /* installation of the ZLib library. This is useful on systems like */ + /* Unix or VMS where it generally is already available. */ + /* */ + /* If you let it undefined, the component will use its own copy */ + /* of the zlib sources instead. These have been modified to be */ + /* included directly within the component and *not* export external */ + /* function names. This allows you to link any program with FreeType */ + /* _and_ ZLib without linking conflicts. */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +#define FT_CONFIG_OPTION_SYSTEM_ZLIB + + + /*************************************************************************/ + /* */ + /* DLL export compilation */ + /* */ + /* When compiling FreeType as a DLL, some systems/compilers need a */ + /* special keyword in front OR after the return type of function */ + /* declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ + /* */ + /* FT_EXPORT( return_type ) */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* */ + /* */ + /* FT_EXPORT_DEF( return_type ) */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* */ + /* You can provide your own implementation of FT_EXPORT and */ + /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ + /* will be later automatically defined as `extern return_type' to */ + /* allow normal compilation. */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_EXPORT(x) extern x */ +/* #define FT_EXPORT_DEF(x) x */ + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `psnames' module. This */ + /* module is in charge of converting a glyph name string into a */ + /* Unicode value, or return a Macintosh standard glyph name for the */ + /* use with the TrueType `post' table. */ + /* */ + /* Undefine this macro if you do not want `psnames' compiled in your */ + /* build of FreeType. This has the following effects: */ + /* */ + /* - The TrueType driver will provide its own set of glyph names, */ + /* if you build it to support postscript names in the TrueType */ + /* `post' table. */ + /* */ + /* - The Type 1 driver will not be able to synthesize a Unicode */ + /* charmap out of the glyphs found in the fonts. */ + /* */ + /* You would normally undefine this configuration macro when building */ + /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ + /* */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Postscript Names to Unicode Values support */ + /* */ + /* By default, FreeType 2 is built with the `PSNames' module compiled */ + /* in. Among other things, the module is used to convert a glyph name */ + /* into a Unicode value. This is especially useful in order to */ + /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ + /* through a big table named the `Adobe Glyph List' (AGL). */ + /* */ + /* Undefine this macro if you do not want the Adobe Glyph List */ + /* compiled in your `PSNames' module. The Type 1 driver will not be */ + /* able to synthesize a Unicode charmap out of the glyphs found in the */ + /* fonts. */ + /* */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /*************************************************************************/ + /* */ + /* Support for Mac fonts */ + /* */ + /* Define this macro if you want support for outline fonts in Mac */ + /* format (mac dfont, mac resource, macbinary containing a mac */ + /* resource) on non-Mac platforms. */ + /* */ + /* Note that the `FOND' resource isn't checked. */ + /* */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /*************************************************************************/ + /* */ + /* Allow the use of FT_Incremental_Interface to load typefaces that */ + /* contain no glyph data, but supply it via a callback function. */ + /* This is required by clients supporting document formats which */ + /* supply font data incrementally as the document is parsed, such */ + /* as the Ghostscript interpreter for the PostScript language. */ + /* */ +#define FT_CONFIG_OPTION_INCREMENTAL + + + /*************************************************************************/ + /* */ + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ + /* */ + /* This must be greater than 4KByte if you use FreeType to rasterize */ + /* glyphs; otherwise, you may set it to zero to avoid unnecessary */ + /* allocation of the render pool. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384L + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 32 is the default. */ + /* */ +#define FT_MAX_MODULES 32 + + + /*************************************************************************/ + /* */ + /* Debug level */ + /* */ + /* FreeType can be compiled in debug or trace mode. In debug mode, */ + /* errors are reported through the `ftdebug' component. In trace */ + /* mode, additional messages are sent to the standard output during */ + /* execution. */ + /* */ + /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ + /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ + /* */ + /* Don't define any of these macros to compile in `release' mode! */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Memory Debugging */ + /* */ + /* FreeType now comes with an integrated memory debugger that is */ + /* capable of detecting simple errors like memory leaks or double */ + /* deletes. To compile it within your build of the library, you */ + /* should define FT_DEBUG_MEMORY here. */ + /* */ + /* Note that the memory debugger is only activated at runtime when */ + /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_DEBUG_MEMORY */ + + + /*************************************************************************/ + /* */ + /* Module errors */ + /* */ + /* If this macro is set (which is _not_ the default), the higher byte */ + /* of an error code gives the module in which the error has occurred, */ + /* while the lower byte is the real error code. */ + /* */ + /* Setting this macro makes sense for debugging purposes only, since */ + /* it would break source compatibility of certain programs that use */ + /* FreeType 2. */ + /* */ + /* More details can be found in the files ftmoderr.h and fterrors.h. */ + /* */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /*************************************************************************/ + /* */ + /* Position Independent Code */ + /* */ + /* If this macro is set (which is _not_ the default), FreeType2 will */ + /* avoid creating constants that require address fixups. Instead the */ + /* constants will be moved into a struct and additional intialization */ + /* code will be used. */ + /* */ + /* Setting this macro is needed for systems that prohibit address */ + /* fixups, such as BREW. */ + /* */ +/* #define FT_CONFIG_OPTION_PIC */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ + /* embedded bitmaps in all formats using the SFNT module (namely */ + /* TrueType & OpenType). */ + /* */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ + /* load and enumerate the glyph Postscript names in a TrueType or */ + /* OpenType file. */ + /* */ + /* Note that when you do not compile the `PSNames' module by undefining */ + /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ + /* contain additional code used to read the PS Names table from a font. */ + /* */ + /* (By default, the module uses `PSNames' to extract glyph names.) */ + /* */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ + /* access the internal name table in a SFNT-based format like TrueType */ + /* or OpenType. The name table contains various strings used to */ + /* describe the font, like family name, copyright, version, etc. It */ + /* does not contain any glyph name though. */ + /* */ + /* Accessing SFNT names is done through the functions declared in */ + /* `freetype/ftsnames.h'. */ + /* */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /*************************************************************************/ + /* */ + /* TrueType CMap support */ + /* */ + /* Here you can fine-tune which TrueType CMap table format shall be */ + /* supported. */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ + /* a bytecode interpreter in the TrueType driver. Note that there are */ + /* important patent issues related to the use of the interpreter. */ + /* */ + /* By undefining this, you will only compile the code necessary to load */ + /* TrueType glyphs without hinting. */ + /* */ + /* Do not #undef this macro here, since the build system might */ + /* define it for certain configurations only. */ + /* */ +/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ + /* of the TrueType bytecode interpreter is used that doesn't implement */ + /* any of the patented opcodes and algorithms. Note that the */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you define */ + /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, either define */ + /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ + /* */ + /* This macro is only useful for a small number of font files (mostly */ + /* for Asian scripts) that require bytecode interpretation to properly */ + /* load glyphs. For all other fonts, this produces unpleasant results, */ + /* thus the unpatented interpreter is never used to load glyphs from */ + /* TrueType fonts unless one of the following two options is used. */ + /* */ + /* - The unpatented interpreter is explicitly activated by the user */ + /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ + /* when opening the FT_Face. */ + /* */ + /* - FreeType detects that the FT_Face corresponds to one of the */ + /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ + /* contains a hard-coded list of font names and other matching */ + /* parameters (see function `tt_face_init' in file */ + /* `src/truetype/ttobjs.c'). */ + /* */ + /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ + /* */ + /* { */ + /* FT_Parameter parameter; */ + /* FT_Open_Args open_args; */ + /* */ + /* */ + /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ + /* */ + /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ + /* open_args.pathname = my_font_pathname; */ + /* open_args.num_params = 1; */ + /* open_args.params = ¶meter; */ + /* */ + /* error = FT_Open_Face( library, &open_args, index, &face ); */ + /* ... */ + /* } */ + /* */ +#define TT_CONFIG_OPTION_UNPATENTED_HINTING + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ + /* bytecode interpreter with a huge switch statement, rather than a call */ + /* table. This results in smaller and faster code for a number of */ + /* architectures. */ + /* */ + /* Note however that on some compiler/processor combinations, undefining */ + /* this macro will generate faster, though larger, code. */ + /* */ +#define TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ + /* TrueType glyph loader to use Apple's definition of how to handle */ + /* component offsets in composite glyphs. */ + /* */ + /* Apple and MS disagree on the default behavior of component offsets */ + /* in composites. Apple says that they should be scaled by the scaling */ + /* factors in the transformation matrix (roughly, it's more complex) */ + /* while MS says they should not. OpenType defines two bits in the */ + /* composite flags array which can be used to disambiguate, but old */ + /* fonts will not have them. */ + /* */ + /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ + /* support for Apple's distortable font technology (fvar, gvar, cvar, */ + /* and avar tables). This has many similarities to Type 1 Multiple */ + /* Masters support. */ + /* */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ + /* */ +#define TT_CONFIG_OPTION_BDF + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ + /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ + /* required. */ + /* */ +#define T1_MAX_DICT_DEPTH 5 + + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 16 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ + /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ + /* files into an existing face. Note that if set, the T1 driver will be */ + /* unable to produce kerning distances. */ + /* */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of the Multiple Masters font support in the Type 1 */ + /* driver. */ + /* */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ + /* support. */ + /* */ +#define AF_CONFIG_OPTION_CJK + + /*************************************************************************/ + /* */ + /* Compile autofit module with Indic script support. */ + /* */ +#define AF_CONFIG_OPTION_INDIC + + /* */ + + + /* + * Define this variable if you want to keep the layout of internal + * structures that was used prior to FreeType 2.2. This also compiles in + * a few obsolete functions to avoid linking problems on typical Unix + * distributions. + * + * For embedded systems or building a new distribution from scratch, it + * is recommended to disable the macro since it reduces the library's code + * size and activates a few memory-saving optimizations as well. + */ +#define FT_CONFIG_OPTION_OLD_INTERNALS + + + /* + * This macro is defined if either unpatented or native TrueType + * hinting is requested by the definitions above. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER +#undef TT_CONFIG_OPTION_UNPATENTED_HINTING +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/config/ftstdlib.h b/alienblaster/project/jni/freetype/include/freetype/config/ftstdlib.h new file mode 100644 index 000000000..30ec14e74 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/config/ftstdlib.h @@ -0,0 +1,173 @@ +/***************************************************************************/ +/* */ +/* ftstdlib.h */ +/* */ +/* ANSI-specific library and header configuration file (specification */ +/* only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to group all #includes to the ANSI C library that */ + /* FreeType normally requires. It also defines macros to rename the */ + /* standard functions within the FreeType source code. */ + /* */ + /* Load a file which defines __FTSTDLIB_H__ before this one to override */ + /* it. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSTDLIB_H__ +#define __FTSTDLIB_H__ + + +#include <stddef.h> + +#define ft_ptrdiff_t ptrdiff_t + + + /**********************************************************************/ + /* */ + /* integer limits */ + /* */ + /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ + /* of `int' and `long' in bytes at compile-time. So far, this works */ + /* for all platforms the library has been tested on. */ + /* */ + /* Note that on the extremely rare platforms that do not provide */ + /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ + /* old Crays where `int' is 36 bits), we do not make any guarantee */ + /* about the correct behaviour of FT2 with all fonts. */ + /* */ + /* In these case, `ftconfig.h' will refuse to compile anyway with a */ + /* message like `couldn't find 32-bit type' or something similar. */ + /* */ + /**********************************************************************/ + + +#include <limits.h> + +#define FT_CHAR_BIT CHAR_BIT +#define FT_INT_MAX INT_MAX +#define FT_INT_MIN INT_MIN +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX + + + /**********************************************************************/ + /* */ + /* character and string processing */ + /* */ + /**********************************************************************/ + + +#include <string.h> + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /**********************************************************************/ + /* */ + /* file handling */ + /* */ + /**********************************************************************/ + + +#include <stdio.h> + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_sprintf sprintf + + + /**********************************************************************/ + /* */ + /* sorting */ + /* */ + /**********************************************************************/ + + +#include <stdlib.h> + +#define ft_qsort qsort + + + /**********************************************************************/ + /* */ + /* memory allocation */ + /* */ + /**********************************************************************/ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /**********************************************************************/ + /* */ + /* miscellaneous */ + /* */ + /**********************************************************************/ + + +#define ft_atol atol +#define ft_labs labs + + + /**********************************************************************/ + /* */ + /* execution control */ + /* */ + /**********************************************************************/ + + +#include <setjmp.h> + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* jmp_buf is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(jmp_buf*) &(b) ) /* same thing here */ + + + /* the following is only used for debugging purposes, i.e., if */ + /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ + +#include <stdarg.h> + + +#endif /* __FTSTDLIB_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/freetype.h b/alienblaster/project/jni/freetype/include/freetype/freetype.h new file mode 100644 index 000000000..942a740f0 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/freetype.h @@ -0,0 +1,3879 @@ +/***************************************************************************/ +/* */ +/* freetype.h */ +/* */ +/* FreeType high-level API and common types (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include <ft2build.h>" +#error " #include FT_FREETYPE_H" +#endif + + +#ifndef __FREETYPE_H__ +#define __FREETYPE_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* user_allocation */ + /* */ + /* <Title> */ + /* User allocation */ + /* */ + /* <Abstract> */ + /* How client applications should allocate FreeType data structures. */ + /* */ + /* <Description> */ + /* FreeType assumes that structures allocated by the user and passed */ + /* as arguments are zeroed out except for the actual data. In other */ + /* words, it is recommended to use `calloc' (or variants of it) */ + /* instead of `malloc' for allocation. */ + /* */ + /*************************************************************************/ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* base_interface */ + /* */ + /* <Title> */ + /* Base Interface */ + /* */ + /* <Abstract> */ + /* The FreeType~2 base font interface. */ + /* */ + /* <Description> */ + /* This section describes the public high-level API of FreeType~2. */ + /* */ + /* <Order> */ + /* FT_Library */ + /* FT_Face */ + /* FT_Size */ + /* FT_GlyphSlot */ + /* FT_CharMap */ + /* FT_Encoding */ + /* */ + /* FT_FaceRec */ + /* */ + /* FT_FACE_FLAG_SCALABLE */ + /* FT_FACE_FLAG_FIXED_SIZES */ + /* FT_FACE_FLAG_FIXED_WIDTH */ + /* FT_FACE_FLAG_HORIZONTAL */ + /* FT_FACE_FLAG_VERTICAL */ + /* FT_FACE_FLAG_SFNT */ + /* FT_FACE_FLAG_KERNING */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS */ + /* FT_FACE_FLAG_GLYPH_NAMES */ + /* FT_FACE_FLAG_EXTERNAL_STREAM */ + /* FT_FACE_FLAG_FAST_GLYPHS */ + /* FT_FACE_FLAG_HINTER */ + /* */ + /* FT_STYLE_FLAG_BOLD */ + /* FT_STYLE_FLAG_ITALIC */ + /* */ + /* FT_SizeRec */ + /* FT_Size_Metrics */ + /* */ + /* FT_GlyphSlotRec */ + /* FT_Glyph_Metrics */ + /* FT_SubGlyph */ + /* */ + /* FT_Bitmap_Size */ + /* */ + /* FT_Init_FreeType */ + /* FT_Done_FreeType */ + /* */ + /* FT_New_Face */ + /* FT_Done_Face */ + /* FT_New_Memory_Face */ + /* FT_Open_Face */ + /* FT_Open_Args */ + /* FT_Parameter */ + /* FT_Attach_File */ + /* FT_Attach_Stream */ + /* */ + /* FT_Set_Char_Size */ + /* FT_Set_Pixel_Sizes */ + /* FT_Request_Size */ + /* FT_Select_Size */ + /* FT_Size_Request_Type */ + /* FT_Size_Request */ + /* FT_Set_Transform */ + /* FT_Load_Glyph */ + /* FT_Get_Char_Index */ + /* FT_Get_Name_Index */ + /* FT_Load_Char */ + /* */ + /* FT_OPEN_MEMORY */ + /* FT_OPEN_STREAM */ + /* FT_OPEN_PATHNAME */ + /* FT_OPEN_DRIVER */ + /* FT_OPEN_PARAMS */ + /* */ + /* FT_LOAD_DEFAULT */ + /* FT_LOAD_RENDER */ + /* FT_LOAD_MONOCHROME */ + /* FT_LOAD_LINEAR_DESIGN */ + /* FT_LOAD_NO_SCALE */ + /* FT_LOAD_NO_HINTING */ + /* FT_LOAD_NO_BITMAP */ + /* FT_LOAD_CROP_BITMAP */ + /* */ + /* FT_LOAD_VERTICAL_LAYOUT */ + /* FT_LOAD_IGNORE_TRANSFORM */ + /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ + /* FT_LOAD_FORCE_AUTOHINT */ + /* FT_LOAD_NO_RECURSE */ + /* FT_LOAD_PEDANTIC */ + /* */ + /* FT_LOAD_TARGET_NORMAL */ + /* FT_LOAD_TARGET_LIGHT */ + /* FT_LOAD_TARGET_MONO */ + /* FT_LOAD_TARGET_LCD */ + /* FT_LOAD_TARGET_LCD_V */ + /* */ + /* FT_Render_Glyph */ + /* FT_Render_Mode */ + /* FT_Get_Kerning */ + /* FT_Kerning_Mode */ + /* FT_Get_Track_Kerning */ + /* FT_Get_Glyph_Name */ + /* FT_Get_Postscript_Name */ + /* */ + /* FT_CharMapRec */ + /* FT_Select_Charmap */ + /* FT_Set_Charmap */ + /* FT_Get_Charmap_Index */ + /* */ + /* FT_FSTYPE_INSTALLABLE_EMBEDDING */ + /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING */ + /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING */ + /* FT_FSTYPE_EDITABLE_EMBEDDING */ + /* FT_FSTYPE_NO_SUBSETTING */ + /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY */ + /* */ + /* FT_Get_FSType_Flags */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Glyph_Metrics */ + /* */ + /* <Description> */ + /* A structure used to model the metrics of a single glyph. The */ + /* values are expressed in 26.6 fractional pixel format; if the flag */ + /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */ + /* are expressed in font units instead. */ + /* */ + /* <Fields> */ + /* width :: */ + /* The glyph's width. */ + /* */ + /* height :: */ + /* The glyph's height. */ + /* */ + /* horiBearingX :: */ + /* Left side bearing for horizontal layout. */ + /* */ + /* horiBearingY :: */ + /* Top side bearing for horizontal layout. */ + /* */ + /* horiAdvance :: */ + /* Advance width for horizontal layout. */ + /* */ + /* vertBearingX :: */ + /* Left side bearing for vertical layout. */ + /* */ + /* vertBearingY :: */ + /* Top side bearing for vertical layout. */ + /* */ + /* vertAdvance :: */ + /* Advance height for vertical layout. */ + /* */ + /* <Note> */ + /* If not disabled with @FT_LOAD_NO_HINTING, the values represent */ + /* dimensions of the hinted glyph (in case hinting is applicable). */ + /* */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap_Size */ + /* */ + /* <Description> */ + /* This structure models the metrics of a bitmap strike (i.e., a set */ + /* of glyphs for a given point size and resolution) in a bitmap font. */ + /* It is used for the `available_sizes' field of @FT_Face. */ + /* */ + /* <Fields> */ + /* height :: The vertical distance, in pixels, between two */ + /* consecutive baselines. It is always positive. */ + /* */ + /* width :: The average width, in pixels, of all glyphs in the */ + /* strike. */ + /* */ + /* size :: The nominal size of the strike in 26.6 fractional */ + /* points. This field is not very useful. */ + /* */ + /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */ + /* pixels. */ + /* */ + /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */ + /* pixels. */ + /* */ + /* <Note> */ + /* Windows FNT: */ + /* The nominal size given in a FNT font is not reliable. Thus when */ + /* the driver finds it incorrect, it sets `size' to some calculated */ + /* values and sets `x_ppem' and `y_ppem' to the pixel width and */ + /* height given in the font, respectively. */ + /* */ + /* TrueType embedded bitmaps: */ + /* `size', `width', and `height' values are not contained in the */ + /* bitmap strike itself. They are computed from the global font */ + /* parameters. */ + /* */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Library */ + /* */ + /* <Description> */ + /* A handle to a FreeType library instance. Each `library' is */ + /* completely independent from the others; it is the `root' of a set */ + /* of objects like fonts, faces, sizes, etc. */ + /* */ + /* It also embeds a memory manager (see @FT_Memory), as well as a */ + /* scan-line converter object (see @FT_Raster). */ + /* */ + /* For multi-threading applications each thread should have its own */ + /* FT_Library object. */ + /* */ + /* <Note> */ + /* Library objects are normally created by @FT_Init_FreeType, and */ + /* destroyed with @FT_Done_FreeType. */ + /* */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Module */ + /* */ + /* <Description> */ + /* A handle to a given FreeType module object. Each module can be a */ + /* font driver, a renderer, or anything else that provides services */ + /* to the formers. */ + /* */ + typedef struct FT_ModuleRec_* FT_Module; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Driver */ + /* */ + /* <Description> */ + /* A handle to a given FreeType font driver object. Each font driver */ + /* is a special module capable of creating faces from font files. */ + /* */ + typedef struct FT_DriverRec_* FT_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Renderer */ + /* */ + /* <Description> */ + /* A handle to a given FreeType renderer. A renderer is a special */ + /* module in charge of converting a glyph image to a bitmap, when */ + /* necessary. Each renderer supports a given glyph image format, and */ + /* one or more target surface depths. */ + /* */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face */ + /* */ + /* <Description> */ + /* A handle to a given typographic face object. A face object models */ + /* a given typeface, in a given style. */ + /* */ + /* <Note> */ + /* Each face object also owns a single @FT_GlyphSlot object, as well */ + /* as one or more @FT_Size objects. */ + /* */ + /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ + /* a given filepathname or a custom input stream. */ + /* */ + /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ + /* */ + /* <Also> */ + /* See @FT_FaceRec for the publicly accessible fields of a given face */ + /* object. */ + /* */ + typedef struct FT_FaceRec_* FT_Face; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size */ + /* */ + /* <Description> */ + /* A handle to an object used to model a face scaled to a given */ + /* character size. */ + /* */ + /* <Note> */ + /* Each @FT_Face has an _active_ @FT_Size object that is used by */ + /* functions like @FT_Load_Glyph to determine the scaling */ + /* transformation which is used to load and hint glyphs and metrics. */ + /* */ + /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */ + /* @FT_Request_Size or even @FT_Select_Size to change the content */ + /* (i.e., the scaling values) of the active @FT_Size. */ + /* */ + /* You can use @FT_New_Size to create additional size objects for a */ + /* given @FT_Face, but they won't be used by other functions until */ + /* you activate it through @FT_Activate_Size. Only one size can be */ + /* activated at any given time per face. */ + /* */ + /* <Also> */ + /* See @FT_SizeRec for the publicly accessible fields of a given size */ + /* object. */ + /* */ + typedef struct FT_SizeRec_* FT_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a given `glyph slot'. A slot is a container where it */ + /* is possible to load any of the glyphs contained in its parent */ + /* face. */ + /* */ + /* In other words, each time you call @FT_Load_Glyph or */ + /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ + /* i.e., the glyph's metrics, its image (bitmap or outline), and */ + /* other control information. */ + /* */ + /* <Also> */ + /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */ + /* */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_CharMap */ + /* */ + /* <Description> */ + /* A handle to a given character map. A charmap is used to translate */ + /* character codes in a given encoding into glyph indexes for its */ + /* parent's face. Some font formats may provide several charmaps per */ + /* font. */ + /* */ + /* Each face object owns zero or more charmaps, but only one of them */ + /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */ + /* */ + /* The list of available charmaps in a face is available through the */ + /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */ + /* */ + /* The currently active charmap is available as `face->charmap'. */ + /* You should call @FT_Set_Charmap to change it. */ + /* */ + /* <Note> */ + /* When a new face is created (either through @FT_New_Face or */ + /* @FT_Open_Face), the library looks for a Unicode charmap within */ + /* the list and automatically activates it. */ + /* */ + /* <Also> */ + /* See @FT_CharMapRec for the publicly accessible fields of a given */ + /* character map. */ + /* */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_ENC_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags into an unsigned long. It is */ + /* used to define `encoding' identifiers (see @FT_Encoding). */ + /* */ + /* <Note> */ + /* Since many 16-bit compilers don't like 32-bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_ENC_TAG( value, a, b, c, d ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Encoding */ + /* */ + /* <Description> */ + /* An enumeration used to specify character sets supported by */ + /* charmaps. Used in the @FT_Select_Charmap API function. */ + /* */ + /* <Note> */ + /* Despite the name, this enumeration lists specific character */ + /* repertories (i.e., charsets), and not text encoding methods (e.g., */ + /* UTF-8, UTF-16, etc.). */ + /* */ + /* Other encodings might be defined in the future. */ + /* */ + /* <Values> */ + /* FT_ENCODING_NONE :: */ + /* The encoding value~0 is reserved. */ + /* */ + /* FT_ENCODING_UNICODE :: */ + /* Corresponds to the Unicode character set. This value covers */ + /* all versions of the Unicode repertoire, including ASCII and */ + /* Latin-1. Most fonts include a Unicode charmap, but not all */ + /* of them. */ + /* */ + /* For example, if you want to access Unicode value U+1F028 (and */ + /* the font contains it), use value 0x1F028 as the input value for */ + /* @FT_Get_Char_Index. */ + /* */ + /* FT_ENCODING_MS_SYMBOL :: */ + /* Corresponds to the Microsoft Symbol encoding, used to encode */ + /* mathematical symbols in the 32..255 character code range. For */ + /* more information, see `http://www.ceviz.net/symbol.htm'. */ + /* */ + /* FT_ENCODING_SJIS :: */ + /* Corresponds to Japanese SJIS encoding. More info at */ + /* at `http://langsupport.japanreference.com/encoding.shtml'. */ + /* See note on multi-byte encodings below. */ + /* */ + /* FT_ENCODING_GB2312 :: */ + /* Corresponds to an encoding system for Simplified Chinese as used */ + /* used in mainland China. */ + /* */ + /* FT_ENCODING_BIG5 :: */ + /* Corresponds to an encoding system for Traditional Chinese as */ + /* used in Taiwan and Hong Kong. */ + /* */ + /* FT_ENCODING_WANSUNG :: */ + /* Corresponds to the Korean encoding system known as Wansung. */ + /* For more information see */ + /* `http://www.microsoft.com/typography/unicode/949.txt'. */ + /* */ + /* FT_ENCODING_JOHAB :: */ + /* The Korean standard character set (KS~C 5601-1992), which */ + /* corresponds to MS Windows code page 1361. This character set */ + /* includes all possible Hangeul character combinations. */ + /* */ + /* FT_ENCODING_ADOBE_LATIN_1 :: */ + /* Corresponds to a Latin-1 encoding as defined in a Type~1 */ + /* PostScript font. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_ADOBE_STANDARD :: */ + /* Corresponds to the Adobe Standard encoding, as found in Type~1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_EXPERT :: */ + /* Corresponds to the Adobe Expert encoding, as found in Type~1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_CUSTOM :: */ + /* Corresponds to a custom encoding, as found in Type~1, CFF, and */ + /* OpenType/CFF fonts. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_APPLE_ROMAN :: */ + /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */ + /* and OpenType fonts contain a charmap for this encoding, since */ + /* older versions of Mac OS are able to use it. */ + /* */ + /* FT_ENCODING_OLD_LATIN_2 :: */ + /* This value is deprecated and was never used nor reported by */ + /* FreeType. Don't use or test for it. */ + /* */ + /* FT_ENCODING_MS_SJIS :: */ + /* Same as FT_ENCODING_SJIS. Deprecated. */ + /* */ + /* FT_ENCODING_MS_GB2312 :: */ + /* Same as FT_ENCODING_GB2312. Deprecated. */ + /* */ + /* FT_ENCODING_MS_BIG5 :: */ + /* Same as FT_ENCODING_BIG5. Deprecated. */ + /* */ + /* FT_ENCODING_MS_WANSUNG :: */ + /* Same as FT_ENCODING_WANSUNG. Deprecated. */ + /* */ + /* FT_ENCODING_MS_JOHAB :: */ + /* Same as FT_ENCODING_JOHAB. Deprecated. */ + /* */ + /* <Note> */ + /* By default, FreeType automatically synthesizes a Unicode charmap */ + /* for PostScript fonts, using their glyph names dictionaries. */ + /* However, it also reports the encodings defined explicitly in the */ + /* font file, for the cases when they are needed, with the Adobe */ + /* values as well. */ + /* */ + /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ + /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ + /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */ + /* which encoding is really present. If, for example, the */ + /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */ + /* the font is encoded in KOI8-R. */ + /* */ + /* FT_ENCODING_NONE is always set (with a single exception) by the */ + /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */ + /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */ + /* which encoding is really present. For example, */ + /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */ + /* Russian). */ + /* */ + /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */ + /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */ + /* FT_ENCODING_APPLE_ROMAN). */ + /* */ + /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */ + /* @FT_Get_CMap_Language_ID to query the Mac language ID which may */ + /* be needed to be able to distinguish Apple encoding variants. See */ + /* */ + /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */ + /* */ + /* to get an idea how to do that. Basically, if the language ID */ + /* is~0, don't use it, otherwise subtract 1 from the language ID. */ + /* Then examine `encoding_id'. If, for example, `encoding_id' is */ + /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */ + /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ + /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */ + /* variant the Arabic encoding. */ + /* */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backwards compatibility */ + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_encoding_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated; use the corresponding @FT_Encoding */ + /* values instead. */ + /* */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_GB2312 +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_CharMapRec */ + /* */ + /* <Description> */ + /* The base charmap structure. */ + /* */ + /* <Fields> */ + /* face :: A handle to the parent face object. */ + /* */ + /* encoding :: An @FT_Encoding tag identifying the charmap. Use */ + /* this with @FT_Select_Charmap. */ + /* */ + /* platform_id :: An ID number describing the platform for the */ + /* following encoding ID. This comes directly from */ + /* the TrueType specification and should be emulated */ + /* for other formats. */ + /* */ + /* encoding_id :: A platform specific encoding number. This also */ + /* comes from the TrueType specification and should be */ + /* emulated similarly. */ + /* */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Face_InternalRec' structure, used to */ + /* model private data of a given @FT_Face object. */ + /* */ + /* This structure might change between releases of FreeType~2 and is */ + /* not generally available to client applications. */ + /* */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_FaceRec */ + /* */ + /* <Description> */ + /* FreeType root face class structure. A face object models a */ + /* typeface in a font file. */ + /* */ + /* <Fields> */ + /* num_faces :: The number of faces in the font file. Some */ + /* font formats can have multiple faces in */ + /* a font file. */ + /* */ + /* face_index :: The index of the face in the font file. It */ + /* is set to~0 if there is only one face in */ + /* the font file. */ + /* */ + /* face_flags :: A set of bit flags that give important */ + /* information about the face; see */ + /* @FT_FACE_FLAG_XXX for the details. */ + /* */ + /* style_flags :: A set of bit flags indicating the style of */ + /* the face; see @FT_STYLE_FLAG_XXX for the */ + /* details. */ + /* */ + /* num_glyphs :: The number of glyphs in the face. If the */ + /* face is scalable and has sbits (see */ + /* `num_fixed_sizes'), it is set to the number */ + /* of outline glyphs. */ + /* */ + /* For CID-keyed fonts, this value gives the */ + /* highest CID used in the font. */ + /* */ + /* family_name :: The face's family name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's family (like `Times New */ + /* Roman', `Bodoni', `Garamond', etc). This */ + /* is a least common denominator used to list */ + /* fonts. Some formats (TrueType & OpenType) */ + /* provide localized and Unicode versions of */ + /* this string. Applications should use the */ + /* format specific interface to access them. */ + /* Can be NULL (e.g., in fonts embedded in a */ + /* PDF file). */ + /* */ + /* style_name :: The face's style name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's style (like `Italic', */ + /* `Bold', `Condensed', etc). Not all font */ + /* formats provide a style name, so this field */ + /* is optional, and can be set to NULL. As */ + /* for `family_name', some formats provide */ + /* localized and Unicode versions of this */ + /* string. Applications should use the format */ + /* specific interface to access them. */ + /* */ + /* num_fixed_sizes :: The number of bitmap strikes in the face. */ + /* Even if the face is scalable, there might */ + /* still be bitmap strikes, which are called */ + /* `sbits' in that case. */ + /* */ + /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */ + /* strikes in the face. It is set to NULL if */ + /* there is no bitmap strike. */ + /* */ + /* num_charmaps :: The number of charmaps in the face. */ + /* */ + /* charmaps :: An array of the charmaps of the face. */ + /* */ + /* generic :: A field reserved for client uses. See the */ + /* @FT_Generic type description. */ + /* */ + /* bbox :: The font bounding box. Coordinates are */ + /* expressed in font units (see */ + /* `units_per_EM'). The box is large enough */ + /* to contain any glyph from the font. Thus, */ + /* `bbox.yMax' can be seen as the `maximal */ + /* ascender', and `bbox.yMin' as the `minimal */ + /* descender'. Only relevant for scalable */ + /* formats. */ + /* */ + /* Note that the bounding box might be off by */ + /* (at least) one pixel for hinted fonts. See */ + /* @FT_Size_Metrics for further discussion. */ + /* */ + /* units_per_EM :: The number of font units per EM square for */ + /* this face. This is typically 2048 for */ + /* TrueType fonts, and 1000 for Type~1 fonts. */ + /* Only relevant for scalable formats. */ + /* */ + /* ascender :: The typographic ascender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMax'. Only relevant for scalable */ + /* formats. */ + /* */ + /* descender :: The typographic descender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMin'. Note that this field is */ + /* usually negative. Only relevant for */ + /* scalable formats. */ + /* */ + /* height :: The height is the vertical distance */ + /* between two consecutive baselines, */ + /* expressed in font units. It is always */ + /* positive. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_width :: The maximal advance width, in font units, */ + /* for all glyphs in this face. This can be */ + /* used to make word wrapping computations */ + /* faster. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_height :: The maximal advance height, in font units, */ + /* for all glyphs in this face. This is only */ + /* relevant for vertical layouts, and is set */ + /* to `height' for fonts that do not provide */ + /* vertical metrics. Only relevant for */ + /* scalable formats. */ + /* */ + /* underline_position :: The position, in font units, of the */ + /* underline line for this face. It is the */ + /* center of the underlining stem. Only */ + /* relevant for scalable formats. */ + /* */ + /* underline_thickness :: The thickness, in font units, of the */ + /* underline for this face. Only relevant for */ + /* scalable formats. */ + /* */ + /* glyph :: The face's associated glyph slot(s). */ + /* */ + /* size :: The current active size for this face. */ + /* */ + /* charmap :: The current active charmap for this face. */ + /* */ + /* <Note> */ + /* Fields may be changed after a call to @FT_Attach_File or */ + /* @FT_Attach_Stream. */ + /* */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness') */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; + void* extensions; + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FACE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `face_flags' field of the */ + /* @FT_FaceRec structure. They inform client applications of */ + /* properties of the corresponding face. */ + /* */ + /* <Values> */ + /* FT_FACE_FLAG_SCALABLE :: */ + /* Indicates that the face contains outline glyphs. This doesn't */ + /* prevent bitmap strikes, i.e., a face can have both this and */ + /* and @FT_FACE_FLAG_FIXED_SIZES set. */ + /* */ + /* FT_FACE_FLAG_FIXED_SIZES :: */ + /* Indicates that the face contains bitmap strikes. See also the */ + /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */ + /* */ + /* FT_FACE_FLAG_FIXED_WIDTH :: */ + /* Indicates that the face contains fixed-width characters (like */ + /* Courier, Lucido, MonoType, etc.). */ + /* */ + /* FT_FACE_FLAG_SFNT :: */ + /* Indicates that the face uses the `sfnt' storage scheme. For */ + /* now, this means TrueType and OpenType. */ + /* */ + /* FT_FACE_FLAG_HORIZONTAL :: */ + /* Indicates that the face contains horizontal glyph metrics. This */ + /* should be set for all common formats. */ + /* */ + /* FT_FACE_FLAG_VERTICAL :: */ + /* Indicates that the face contains vertical glyph metrics. This */ + /* is only available in some formats, not all of them. */ + /* */ + /* FT_FACE_FLAG_KERNING :: */ + /* Indicates that the face contains kerning information. If set, */ + /* the kerning distance can be retrieved through the function */ + /* @FT_Get_Kerning. Otherwise the function always return the */ + /* vector (0,0). Note that FreeType doesn't handle kerning data */ + /* from the `GPOS' table (as present in some OpenType fonts). */ + /* */ + /* FT_FACE_FLAG_FAST_GLYPHS :: */ + /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ + /* */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ + /* Indicates that the font contains multiple masters and is capable */ + /* of interpolating between them. See the multiple-masters */ + /* specific API for details. */ + /* */ + /* FT_FACE_FLAG_GLYPH_NAMES :: */ + /* Indicates that the font contains glyph names that can be */ + /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */ + /* fonts contain broken glyph name tables. Use the function */ + /* @FT_Has_PS_Glyph_Names when needed. */ + /* */ + /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ + /* Used internally by FreeType to indicate that a face's stream was */ + /* provided by the client application and should not be destroyed */ + /* when @FT_Done_Face is called. Don't read or test this flag. */ + /* */ + /* FT_FACE_FLAG_HINTER :: */ + /* Set if the font driver has a hinting machine of its own. For */ + /* example, with TrueType fonts, it makes sense to use data from */ + /* the SFNT `gasp' table only if the native TrueType hinting engine */ + /* (with the bytecode interpreter) is available and active. */ + /* */ + /* FT_FACE_FLAG_CID_KEYED :: */ + /* Set if the font is CID-keyed. In that case, the font is not */ + /* accessed by glyph indices but by CID values. For subsetted */ + /* CID-keyed fonts this has the consequence that not all index */ + /* values are a valid argument to FT_Load_Glyph. Only the CID */ + /* values for which corresponding glyphs in the subsetted font */ + /* exist make FT_Load_Glyph return successfully; in all other cases */ + /* you get an `FT_Err_Invalid_Argument' error. */ + /* */ + /* Note that CID-keyed fonts which are in an SFNT wrapper don't */ + /* have this flag set since the glyphs are accessed in the normal */ + /* way (using contiguous indices); the `CID-ness' isn't visible to */ + /* the application. */ + /* */ + /* FT_FACE_FLAG_TRICKY :: */ + /* Set if the font is `tricky', this is, it always needs the */ + /* font format's native hinting engine to get a reasonable result. */ + /* A typical example is the Chinese font `mingli.ttf' which uses */ + /* TrueType bytecode instructions to move and scale all of its */ + /* subglyphs. */ + /* */ + /* It is not possible to autohint such fonts using */ + /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */ + /* @FT_LOAD_NO_HINTING. You have to set both FT_LOAD_NO_HINTING */ + /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */ + /* probably never want this except for demonstration purposes. */ + /* */ + /* Currently, there are six TrueType fonts in the list of tricky */ + /* fonts; they are hard-coded in file `ttobjs.c'. */ + /* */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) +#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 ) +#define FT_FACE_FLAG_TRICKY ( 1L << 13 ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_HORIZONTAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains + * horizontal metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_VERTICAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains vertical + * metrics. + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_VERTICAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_KERNING( face ) + * + * @description: + * A macro that returns true whenever a face object contains kerning + * data that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( face->face_flags & FT_FACE_FLAG_KERNING ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SCALABLE( face ) + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF, + * and PFR font formats. + * + */ +#define FT_IS_SCALABLE( face ) \ + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SFNT( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font + * whose format is based on the SFNT storage scheme. This usually + * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded + * bitmap fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( face->face_flags & FT_FACE_FLAG_SFNT ) + + + /************************************************************************* + * + * @macro: + * FT_IS_FIXED_WIDTH( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or `monospace', `fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FIXED_SIZES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes' field of the + * @FT_FaceRec structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FAST_GLYPHS( face ) + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************* + * + * @macro: + * FT_HAS_GLYPH_NAMES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + + + /************************************************************************* + * + * @macro: + * FT_IS_CID_KEYED( face ) + * + * @description: + * A macro that returns true whenever a face object contains a CID-keyed + * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more + * details. + * + * If this macro is true, all functions defined in @FT_CID_H are + * available. + * + */ +#define FT_IS_CID_KEYED( face ) \ + ( face->face_flags & FT_FACE_FLAG_CID_KEYED ) + + + /************************************************************************* + * + * @macro: + * FT_IS_TRICKY( face ) + * + * @description: + * A macro that returns true whenever a face represents a `tricky' font. + * See the discussion of @FT_FACE_FLAG_TRICKY for more details. + * + */ +#define FT_IS_TRICKY( face ) \ + ( face->face_flags & FT_FACE_FLAG_TRICKY ) + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* FT_STYLE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit-flags used to indicate the style of a given face. */ + /* These are used in the `style_flags' field of @FT_FaceRec. */ + /* */ + /* <Values> */ + /* FT_STYLE_FLAG_ITALIC :: */ + /* Indicates that a given face style is italic or oblique. */ + /* */ + /* FT_STYLE_FLAG_BOLD :: */ + /* Indicates that a given face is bold. */ + /* */ + /* <Note> */ + /* The style information as provided by FreeType is very basic. More */ + /* details are beyond the scope and should be done on a higher level */ + /* (for example, by analyzing various fields of the `OS/2' table in */ + /* SFNT based fonts). */ + /* */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Size_InternalRec' structure, used to */ + /* model private data of a given @FT_Size object. */ + /* */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Metrics */ + /* */ + /* <Description> */ + /* The size metrics structure gives the metrics of a size object. */ + /* */ + /* <Fields> */ + /* x_ppem :: The width of the scaled EM square in pixels, hence */ + /* the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal width'. */ + /* */ + /* y_ppem :: The height of the scaled EM square in pixels, */ + /* hence the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal height'. */ + /* */ + /* x_scale :: A 16.16 fractional scaling value used to convert */ + /* horizontal metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* y_scale :: A 16.16 fractional scaling value used to convert */ + /* vertical metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* ascender :: The ascender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* descender :: The descender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* height :: The height in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* max_advance :: The maximal advance width in 26.6 fractional */ + /* pixels. See @FT_FaceRec for the details. */ + /* */ + /* <Note> */ + /* The scaling values, if relevant, are determined first during a */ + /* size changing operation. The remaining fields are then set by the */ + /* driver. For scalable formats, they are usually set to scaled */ + /* values of the corresponding fields in @FT_FaceRec. */ + /* */ + /* Note that due to glyph hinting, these values might not be exact */ + /* for certain fonts. Thus they must be treated as unreliable */ + /* with an error margin of at least one pixel! */ + /* */ + /* Indeed, the only way to get the exact metrics is to render _all_ */ + /* glyphs. As this would be a definite performance hit, it is up to */ + /* client applications to perform such computations. */ + /* */ + /* The FT_Size_Metrics structure is valid for bitmap fonts also. */ + /* */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SizeRec */ + /* */ + /* <Description> */ + /* FreeType root size class structure. A size object models a face */ + /* object at a given size. */ + /* */ + /* <Fields> */ + /* face :: Handle to the parent face object. */ + /* */ + /* generic :: A typeless pointer, which is unused by the FreeType */ + /* library or any of its drivers. It can be used by */ + /* client applications to link their own data to each size */ + /* object. */ + /* */ + /* metrics :: Metrics for this size object. This field is read-only. */ + /* */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SubGlyph */ + /* */ + /* <Description> */ + /* The subglyph structure is an internal object used to describe */ + /* subglyphs (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The subglyph implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + /* You can however retrieve subglyph information with */ + /* @FT_Get_SubGlyph_Info. */ + /* */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Slot_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */ + /* model private data of a given @FT_GlyphSlot object. */ + /* */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphSlotRec */ + /* */ + /* <Description> */ + /* FreeType root glyph slot class structure. A glyph slot is a */ + /* container where individual glyphs can be loaded, be they in */ + /* outline or bitmap format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library instance */ + /* this slot belongs to. */ + /* */ + /* face :: A handle to the parent face object. */ + /* */ + /* next :: In some cases (like some font tools), several */ + /* glyph slots per face object can be a good */ + /* thing. As this is rare, the glyph slots are */ + /* listed through a direct, single-linked list */ + /* using its `next' field. */ + /* */ + /* generic :: A typeless pointer which is unused by the */ + /* FreeType library or any of its drivers. It */ + /* can be used by client applications to link */ + /* their own data to each glyph slot object. */ + /* */ + /* metrics :: The metrics of the last loaded glyph in the */ + /* slot. The returned values depend on the last */ + /* load flags (see the @FT_Load_Glyph API */ + /* function) and can be expressed either in 26.6 */ + /* fractional pixels or font units. */ + /* */ + /* Note that even when the glyph image is */ + /* transformed, the metrics are not. */ + /* */ + /* linearHoriAdvance :: The advance width of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* linearVertAdvance :: The advance height of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* advance :: This shorthand is, depending on */ + /* @FT_LOAD_IGNORE_TRANSFORM, the transformed */ + /* advance width for the glyph (in 26.6 */ + /* fractional pixel format). As specified with */ + /* @FT_LOAD_VERTICAL_LAYOUT, it uses either the */ + /* `horiAdvance' or the `vertAdvance' value of */ + /* `metrics' field. */ + /* */ + /* format :: This field indicates the format of the image */ + /* contained in the glyph slot. Typically */ + /* @FT_GLYPH_FORMAT_BITMAP, */ + /* @FT_GLYPH_FORMAT_OUTLINE, or */ + /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */ + /* possible. */ + /* */ + /* bitmap :: This field is used as a bitmap descriptor */ + /* when the slot format is */ + /* @FT_GLYPH_FORMAT_BITMAP. Note that the */ + /* address and content of the bitmap buffer can */ + /* change between calls of @FT_Load_Glyph and a */ + /* few other functions. */ + /* */ + /* bitmap_left :: This is the bitmap's left bearing expressed */ + /* in integer pixels. Of course, this is only */ + /* valid if the format is */ + /* @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* bitmap_top :: This is the bitmap's top bearing expressed in */ + /* integer pixels. Remember that this is the */ + /* distance from the baseline to the top-most */ + /* glyph scanline, upwards y~coordinates being */ + /* *positive*. */ + /* */ + /* outline :: The outline descriptor for the current glyph */ + /* image if its format is */ + /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */ + /* loaded, `outline' can be transformed, */ + /* distorted, embolded, etc. However, it must */ + /* not be freed. */ + /* */ + /* num_subglyphs :: The number of subglyphs in a composite glyph. */ + /* This field is only valid for the composite */ + /* glyph format that should normally only be */ + /* loaded with the @FT_LOAD_NO_RECURSE flag. */ + /* For now this is internal to FreeType. */ + /* */ + /* subglyphs :: An array of subglyph descriptors for */ + /* composite glyphs. There are `num_subglyphs' */ + /* elements in there. Currently internal to */ + /* FreeType. */ + /* */ + /* control_data :: Certain font drivers can also return the */ + /* control data for a given glyph image (e.g. */ + /* TrueType bytecode, Type~1 charstrings, etc.). */ + /* This field is a pointer to such data. */ + /* */ + /* control_len :: This is the length in bytes of the control */ + /* data. */ + /* */ + /* other :: Really wicked formats can use this pointer to */ + /* present their own glyph image to client */ + /* applications. Note that the application */ + /* needs to know about the image format. */ + /* */ + /* lsb_delta :: The difference between hinted and unhinted */ + /* left side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* rsb_delta :: The difference between hinted and unhinted */ + /* right side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* <Note> */ + /* If @FT_Load_Glyph is called with default flags (see */ + /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */ + /* its native format (e.g., an outline glyph for TrueType and Type~1 */ + /* formats). */ + /* */ + /* This image can later be converted into a bitmap by calling */ + /* @FT_Render_Glyph. This function finds the current renderer for */ + /* the native image's format, then invokes it. */ + /* */ + /* The renderer is in charge of transforming the native image through */ + /* the slot's face transformation fields, then converting it into a */ + /* bitmap that is returned in `slot->bitmap'. */ + /* */ + /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */ + /* to specify the position of the bitmap relative to the current pen */ + /* position (e.g., coordinates (0,0) on the baseline). Of course, */ + /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* <Note> */ + /* Here a small pseudo code fragment which shows how to use */ + /* `lsb_delta' and `rsb_delta': */ + /* */ + /* { */ + /* FT_Pos origin_x = 0; */ + /* FT_Pos prev_rsb_delta = 0; */ + /* */ + /* */ + /* for all glyphs do */ + /* <compute kern between current and previous glyph and add it to */ + /* `origin_x'> */ + /* */ + /* <load glyph with `FT_Load_Glyph'> */ + /* */ + /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */ + /* origin_x -= 64; */ + /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */ + /* origin_x += 64; */ + /* */ + /* prev_rsb_delta = face->glyph->rsb_delta; */ + /* */ + /* <save glyph image, or render glyph, or ...> */ + /* */ + /* origin_x += face->glyph->advance.x; */ + /* endfor */ + /* } */ + /* */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt reserved; /* retained for binary compatibility */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Init_FreeType */ + /* */ + /* <Description> */ + /* Initialize a new FreeType library object. The set of modules */ + /* that are registered by this function is determined at build time. */ + /* */ + /* <Output> */ + /* alibrary :: A handle to a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* In case you want to provide your own memory allocating routines, */ + /* use @FT_New_Library instead, followed by a call to */ + /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_FreeType */ + /* */ + /* <Description> */ + /* Destroy a given FreeType library object and all of its children, */ + /* including resources, drivers, faces, sizes, etc. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OPEN_XXX */ + /* */ + /* <Description> */ + /* A list of bit-field constants used within the `flags' field of the */ + /* @FT_Open_Args structure. */ + /* */ + /* <Values> */ + /* FT_OPEN_MEMORY :: This is a memory-based stream. */ + /* */ + /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */ + /* */ + /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */ + /* name. */ + /* */ + /* FT_OPEN_DRIVER :: Use the `driver' field. */ + /* */ + /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */ + /* */ + /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */ + /* */ + /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */ + /* */ + /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */ + /* */ + /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */ + /* */ + /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */ + /* */ + /* <Note> */ + /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */ + /* flags are mutually exclusive. */ + /* */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + +#define ft_open_memory FT_OPEN_MEMORY /* deprecated */ +#define ft_open_stream FT_OPEN_STREAM /* deprecated */ +#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */ +#define ft_open_driver FT_OPEN_DRIVER /* deprecated */ +#define ft_open_params FT_OPEN_PARAMS /* deprecated */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Parameter */ + /* */ + /* <Description> */ + /* A simple structure used to pass more or less generic parameters to */ + /* @FT_Open_Face. */ + /* */ + /* <Fields> */ + /* tag :: A four-byte identification tag. */ + /* */ + /* data :: A pointer to the parameter data. */ + /* */ + /* <Note> */ + /* The ID and function of parameters are driver-specific. See the */ + /* various FT_PARAM_TAG_XXX flags for more information. */ + /* */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Open_Args */ + /* */ + /* <Description> */ + /* A structure used to indicate how to open a new font file or */ + /* stream. A pointer to such a structure can be used as a parameter */ + /* for the functions @FT_Open_Face and @FT_Attach_Stream. */ + /* */ + /* <Fields> */ + /* flags :: A set of bit flags indicating how to use the */ + /* structure. */ + /* */ + /* memory_base :: The first byte of the file in memory. */ + /* */ + /* memory_size :: The size in bytes of the file in memory. */ + /* */ + /* pathname :: A pointer to an 8-bit file pathname. */ + /* */ + /* stream :: A handle to a source stream object. */ + /* */ + /* driver :: This field is exclusively used by @FT_Open_Face; */ + /* it simply specifies the font driver to use to open */ + /* the face. If set to~0, FreeType tries to load the */ + /* face with each one of the drivers in its list. */ + /* */ + /* num_params :: The number of extra parameters. */ + /* */ + /* params :: Extra parameters passed to the font driver when */ + /* opening a new face. */ + /* */ + /* <Note> */ + /* The stream type is determined by the contents of `flags' which */ + /* are tested in the following order by @FT_Open_Face: */ + /* */ + /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */ + /* memory file of `memory_size' bytes, located at `memory_address'. */ + /* The data are are not copied, and the client is responsible for */ + /* releasing and destroying them _after_ the corresponding call to */ + /* @FT_Done_Face. */ + /* */ + /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */ + /* custom input stream `stream' is used. */ + /* */ + /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */ + /* is a normal file and use `pathname' to open it. */ + /* */ + /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */ + /* open the file with the driver whose handler is in `driver'. */ + /* */ + /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */ + /* `num_params' and `params' is used. They are ignored otherwise. */ + /* */ + /* Ideally, both the `pathname' and `params' fields should be tagged */ + /* as `const'; this is missing for API backwards compatibility. In */ + /* other words, applications should treat them as read-only. */ + /* */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font by its pathname. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* pathname :: A path to the font file. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font which has been */ + /* loaded into memory. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* file_base :: A pointer to the beginning of the font data. */ + /* */ + /* file_size :: The size of the memory chunk used by the font data. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You must not deallocate the memory before calling @FT_Done_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Open_Face */ + /* */ + /* <Description> */ + /* Create a face object from a given resource described by */ + /* @FT_Open_Args. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* args :: A pointer to an `FT_Open_Args' structure which must */ + /* be filled by the caller. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index~0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See note below. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Unlike FreeType 1.x, this function automatically creates a glyph */ + /* slot for the face object which can be accessed directly through */ + /* `face->glyph'. */ + /* */ + /* FT_Open_Face can be used to quickly check whether the font */ + /* format of a given font resource is supported by FreeType. If the */ + /* `face_index' field is negative, the function's return value is~0 */ + /* if the font format is recognized, or non-zero otherwise; */ + /* the function returns a more or less empty face handle in `*aface' */ + /* (if `aface' isn't NULL). The only useful field in this special */ + /* case is `face->num_faces' which gives the number of faces within */ + /* the font file. After examination, the returned @FT_Face structure */ + /* should be deallocated with a call to @FT_Done_Face. */ + /* */ + /* Each new face object created with this function also owns a */ + /* default @FT_Size object, accessible as `face->size'. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_File */ + /* */ + /* <Description> */ + /* This function calls @FT_Attach_Stream to attach a file. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* filepathname :: The pathname. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_Stream */ + /* */ + /* <Description> */ + /* `Attach' data to a face object. Normally, this is used to read */ + /* additional information for the face object. For example, you can */ + /* attach an AFM file that comes with a Type~1 font to get the */ + /* kerning values and other metrics. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* parameters :: A pointer to @FT_Open_Args which must be filled by */ + /* the caller. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The meaning of the `attach' (i.e., what really happens when the */ + /* new file is read) is not fixed by FreeType itself. It really */ + /* depends on the font format (and thus the font driver). */ + /* */ + /* Client applications are expected to know what they are doing */ + /* when invoking this function. Most drivers simply do not implement */ + /* file attachments. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Face */ + /* */ + /* <Description> */ + /* Discard a given face object, as well as all of its child slots and */ + /* sizes. */ + /* */ + /* <Input> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Size */ + /* */ + /* <Description> */ + /* Select a bitmap strike. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* strike_index :: The index of the bitmap strike in the */ + /* `available_sizes' field of @FT_FaceRec structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Size_Request_Type */ + /* */ + /* <Description> */ + /* An enumeration type that lists the supported size request types. */ + /* */ + /* <Values> */ + /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */ + /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */ + /* used to determine both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */ + /* The real dimension. The sum of the the `Ascender' and (minus */ + /* of) the `Descender' fields of @FT_FaceRec are used to determine */ + /* both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_BBOX :: */ + /* The font bounding box. The width and height of the `bbox' field */ + /* of @FT_FaceRec are used to determine the horizontal and vertical */ + /* scaling value, respectively. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_CELL :: */ + /* The `max_advance_width' field of @FT_FaceRec is used to */ + /* determine the horizontal scaling value; the vertical scaling */ + /* value is determined the same way as */ + /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */ + /* values are set to the smaller one. This type is useful if you */ + /* want to specify the font size for, say, a window of a given */ + /* dimension and 80x24 cells. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_SCALES :: */ + /* Specify the scaling values directly. */ + /* */ + /* <Note> */ + /* The above descriptions only apply to scalable formats. For bitmap */ + /* formats, the behaviour is up to the driver. */ + /* */ + /* See the note section of @FT_Size_Metrics if you wonder how size */ + /* requesting relates to scaling values. */ + /* */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_RequestRec */ + /* */ + /* <Description> */ + /* A structure used to model a size request. */ + /* */ + /* <Fields> */ + /* type :: See @FT_Size_Request_Type. */ + /* */ + /* width :: The desired width. */ + /* */ + /* height :: The desired height. */ + /* */ + /* horiResolution :: The horizontal resolution. If set to zero, */ + /* `width' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* vertResolution :: The vertical resolution. If set to zero, */ + /* `height' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* <Note> */ + /* If `width' is zero, then the horizontal scaling value is set equal */ + /* to the vertical scaling value, and vice versa. */ + /* */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Request */ + /* */ + /* <Description> */ + /* A handle to a size request structure. */ + /* */ + typedef struct FT_Size_RequestRec_ *FT_Size_Request; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Request_Size */ + /* */ + /* <Description> */ + /* Resize the scale of the active @FT_Size object in a face. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* req :: A pointer to a @FT_Size_RequestRec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Although drivers may select the bitmap strike matching the */ + /* request, you should not rely on this if you intend to select a */ + /* particular bitmap strike. Use @FT_Select_Size instead in that */ + /* case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Char_Size */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in points). */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* char_width :: The nominal width, in 26.6 fractional points. */ + /* */ + /* char_height :: The nominal height, in 26.6 fractional points. */ + /* */ + /* horz_resolution :: The horizontal resolution in dpi. */ + /* */ + /* vert_resolution :: The vertical resolution in dpi. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If either the character width or height is zero, it is set equal */ + /* to the other value. */ + /* */ + /* If either the horizontal or vertical resolution is zero, it is set */ + /* equal to the other value. */ + /* */ + /* A character width or height smaller than 1pt is set to 1pt; if */ + /* both resolution values are zero, they are set to 72dpi. */ + /* */ + /* Don't use this function if you are using the FreeType cache API. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Pixel_Sizes */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in pixels). */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* pixel_width :: The nominal width, in pixels. */ + /* */ + /* pixel_height :: The nominal height, in pixels. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Glyph */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* glyph_index :: The index of the glyph in the font file. For */ + /* CID-keyed fonts (either in PS or in CFF format) */ + /* this argument specifies the CID value. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The loaded glyph may be transformed. See @FT_Set_Transform for */ + /* the details. */ + /* */ + /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */ + /* returned for invalid CID values (this is, for CID values which */ + /* don't have a corresponding glyph in the font). See the discussion */ + /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Char */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object, according to its character code. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* char_code :: The glyph's character code, according to the */ + /* current charmap used in the face. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************* + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit-field constants used with @FT_Load_Glyph to indicate + * what kind of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to~0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. + * The bitmap data can be accessed from the glyph slot (see note + * below). + * + * 2. If no embedded bitmap is searched or found, FreeType looks for a + * scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then `hinted' to the pixel grid + * in order to optimize it. The outline data can be accessed from + * the glyph slot (see note below). + * + * Note that by default, the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the outline glyph loaded, but keep it in font units. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates `blurrier' bitmap glyph + * when the glyph is rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. _Don't_ use it as it is + * problematic currently. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Indicates that the auto-hinter is preferred over the font's native + * hinter. See also the note below. + * + * FT_LOAD_CROP_BITMAP :: + * Indicates that the font driver should crop the loaded bitmap glyph + * (i.e., remove all space around its black bits). Not all drivers + * implement this. + * + * FT_LOAD_PEDANTIC :: + * Indicates that the font driver should perform pedantic verifications + * during glyph loading. This is mostly used to detect broken glyphs + * in fonts. By default, FreeType tries to handle broken fonts also. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Indicates that the font driver should ignore the global advance + * width defined in the font. By default, that value is used as the + * advance width for all glyphs when the face has + * @FT_FACE_FLAG_FIXED_WIDTH set. + * + * This flag exists for historical reasons (to support buggy CJK + * fonts). + * + * FT_LOAD_NO_RECURSE :: + * This flag is only used internally. It merely indicates that the + * font driver should not load composite glyphs recursively. Instead, + * it should set the `num_subglyph' and `subglyphs' values of the + * glyph slot accordingly, and set `glyph->format' to + * @FT_GLYPH_FORMAT_COMPOSITE. + * + * The description of sub-glyphs is not available to client + * applications for now. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Indicates that the transform matrix set by @FT_Set_Transform should + * be ignored. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8~pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should rather use @FT_LOAD_TARGET_MONO so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Indicates that the `linearHoriAdvance' and `linearVertAdvance' + * fields of @FT_GlyphSlotRec should be kept in font units. See + * @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable auto-hinter. See also the note below. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be + * used at all. + * + * See the description of @FT_FACE_FLAG_TRICKY for a special exception + * (affecting only a handful of Asian fonts). + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + * + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE 0x1 +#define FT_LOAD_NO_HINTING 0x2 +#define FT_LOAD_RENDER 0x4 +#define FT_LOAD_NO_BITMAP 0x8 +#define FT_LOAD_VERTICAL_LAYOUT 0x10 +#define FT_LOAD_FORCE_AUTOHINT 0x20 +#define FT_LOAD_CROP_BITMAP 0x40 +#define FT_LOAD_PEDANTIC 0x80 +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 0x200 +#define FT_LOAD_NO_RECURSE 0x400 +#define FT_LOAD_IGNORE_TRANSFORM 0x800 +#define FT_LOAD_MONOCHROME 0x1000 +#define FT_LOAD_LINEAR_DESIGN 0x2000 +#define FT_LOAD_NO_AUTOHINT 0x8000U + + /* */ + + /* used internally only by certain font drivers! */ +#define FT_LOAD_ADVANCE_ONLY 0x100 +#define FT_LOAD_SBITS_ONLY 0x4000 + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values that are used to select a specific hinting algorithm + * to use by the hinter. You should OR one of these values to your + * `load_flags' when calling @FT_Load_Glyph. + * + * Note that font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it + * always implies @FT_LOAD_FORCE_AUTOHINT. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * This corresponds to the default hinting algorithm, optimized for + * standard gray-level rendering. For monochrome output, use + * @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for non-monochrome modes. Many + * generated glyphs are more fuzzy but better resemble its original + * shape. A bit like rendering on Mac OS~X. + * + * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT. + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your + * `load_flags'. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode which matches the used algorithm + * best) unless @FT_LOAD_MONOCHROME is set. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the `light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * { + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * } + * + */ +#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /************************************************************************** + * + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + * + */ +#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Transform */ + /* */ + /* <Description> */ + /* A function used to set the transformation that is applied to glyph */ + /* images when they are loaded into a glyph slot through */ + /* @FT_Load_Glyph. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */ + /* the identity matrix. */ + /* delta :: A pointer to the translation vector. Use~0 for the null */ + /* vector. */ + /* */ + /* <Note> */ + /* The transformation is only applied to scalable image formats after */ + /* the glyph has been loaded. It means that hinting is unaltered by */ + /* the transformation and is performed on the character size given in */ + /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */ + /* */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ + /* */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Render_Mode */ + /* */ + /* <Description> */ + /* An enumeration type that lists the render modes supported by */ + /* FreeType~2. Each mode corresponds to a specific type of scanline */ + /* conversion performed on the outline. */ + /* */ + /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */ + /* field in the @FT_GlyphSlotRec structure gives the format of the */ + /* returned bitmap. */ + /* */ + /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */ + /* */ + /* <Values> */ + /* FT_RENDER_MODE_NORMAL :: */ + /* This is the default render mode; it corresponds to 8-bit */ + /* anti-aliased bitmaps. */ + /* */ + /* FT_RENDER_MODE_LIGHT :: */ + /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */ + /* defined as a separate value because render modes are also used */ + /* indirectly to define hinting algorithm selectors. See */ + /* @FT_LOAD_TARGET_XXX for details. */ + /* */ + /* FT_RENDER_MODE_MONO :: */ + /* This mode corresponds to 1-bit bitmaps (with 2~levels of */ + /* opacity). */ + /* */ + /* FT_RENDER_MODE_LCD :: */ + /* This mode corresponds to horizontal RGB and BGR sub-pixel */ + /* displays like LCD screens. It produces 8-bit bitmaps that are */ + /* 3~times the width of the original glyph outline in pixels, and */ + /* which use the @FT_PIXEL_MODE_LCD mode. */ + /* */ + /* FT_RENDER_MODE_LCD_V :: */ + /* This mode corresponds to vertical RGB and BGR sub-pixel displays */ + /* (like PDA screens, rotated LCD displays, etc.). It produces */ + /* 8-bit bitmaps that are 3~times the height of the original */ + /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ + /* */ + /* <Note> */ + /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */ + /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */ + /* (not active in the default builds). It is up to the caller to */ + /* either call @FT_Library_SetLcdFilter (if available) or do the */ + /* filtering itself. */ + /* */ + /* The selected render mode only affects vector glyphs of a font. */ + /* Embedded bitmaps often have a different pixel mode like */ + /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */ + /* them into 8-bit pixmaps. */ + /* */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_render_mode_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Render_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */ + /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */ + /* */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Render_Glyph */ + /* */ + /* <Description> */ + /* Convert a given glyph image to a bitmap. It does so by inspecting */ + /* the glyph image format, finding the relevant renderer, and */ + /* invoking it. */ + /* */ + /* <InOut> */ + /* slot :: A handle to the glyph slot containing the image to */ + /* convert. */ + /* */ + /* <Input> */ + /* render_mode :: This is the render mode used to render the glyph */ + /* image into a bitmap. See @FT_Render_Mode for a */ + /* list of possible values. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Kerning_Mode */ + /* */ + /* <Description> */ + /* An enumeration used to specify which kerning values to return in */ + /* @FT_Get_Kerning. */ + /* */ + /* <Values> */ + /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */ + /* distances (value is~0). */ + /* */ + /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */ + /* distances. */ + /* */ + /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ + /* units. */ + /* */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_default */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */ + /* instead. */ + /* */ +#define ft_kerning_default FT_KERNING_DEFAULT + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unfitted */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */ + /* instead. */ + /* */ +#define ft_kerning_unfitted FT_KERNING_UNFITTED + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unscaled */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */ + /* instead. */ + /* */ +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Kerning */ + /* */ + /* <Description> */ + /* Return the kerning vector between two glyphs of a same face. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* kern_mode :: See @FT_Kerning_Mode for more information. */ + /* Determines the scale and dimension of the returned */ + /* kerning vector. */ + /* */ + /* <Output> */ + /* akerning :: The kerning vector. This is either in font units */ + /* or in pixels (26.6 format) for scalable formats, */ + /* and in pixels for fixed-sizes formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this method. Other layouts, or more sophisticated */ + /* kernings, are out of the scope of this API function -- they can be */ + /* implemented through format-specific interfaces. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Track_Kerning */ + /* */ + /* <Description> */ + /* Return the track kerning for a given face object at a given size. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* point_size :: The point size in 16.16 fractional points. */ + /* */ + /* degree :: The degree of tightness. */ + /* */ + /* <Output> */ + /* akerning :: The kerning in 16.16 fractional points. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII name of a given glyph in a face. This only */ + /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* buffer_max :: The maximal number of bytes available in the */ + /* buffer. */ + /* */ + /* <Output> */ + /* buffer :: A pointer to a target buffer where the name is */ + /* copied to. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* An error is returned if the face doesn't provide glyph names or if */ + /* the glyph index is invalid. In all cases of failure, the first */ + /* byte of `buffer' is set to~0 to indicate an empty name. */ + /* */ + /* The glyph name is truncated to fit within the buffer if it is too */ + /* long. The returned string is always zero-terminated. */ + /* */ + /* This function is not compiled within the library if the config */ + /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */ + /* `include/freetype/config/ftoptions.h'. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Postscript_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII PostScript name of a given face, if available. */ + /* This only works with PostScript and TrueType fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to the face's PostScript name. NULL if unavailable. */ + /* */ + /* <Note> */ + /* The returned pointer is owned by the face and is destroyed with */ + /* it. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap by its encoding tag (as listed in */ + /* `freetype.h'). */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* encoding :: A handle to the selected encoding. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function returns an error if no charmap in the face */ + /* corresponds to the encoding queried here. */ + /* */ + /* Because many fonts contain more than a single cmap for Unicode */ + /* encoding, this function has some special code to select the one */ + /* which covers Unicode best (`best' in the sense that a UCS-4 cmap */ + /* is preferred to a UCS-2 cmap). It is thus preferable to */ + /* @FT_Set_Charmap in this case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap for character code to glyph index mapping. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* charmap :: A handle to the selected charmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function returns an error if the charmap is not part of */ + /* the face (i.e., if it is not listed in the `face->charmaps' */ + /* table). */ + /* */ + /* It also fails if a type~14 charmap is selected. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************* + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap' belongs. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Char_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code. This function */ + /* uses a charmap object to do the mapping. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* charcode :: The character code. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means `undefined character code'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value~0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_First_Char */ + /* */ + /* <Description> */ + /* This function is used to return the first character code in the */ + /* current charmap of a given face. It also returns the */ + /* corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of first character code. 0~if charmap is */ + /* empty. */ + /* */ + /* <Return> */ + /* The charmap's first character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_Next_Char to be able to */ + /* parse all character codes available in a given charmap. The code */ + /* should look like this: */ + /* */ + /* { */ + /* FT_ULong charcode; */ + /* FT_UInt gindex; */ + /* */ + /* */ + /* charcode = FT_Get_First_Char( face, &gindex ); */ + /* while ( gindex != 0 ) */ + /* { */ + /* ... do something with (charcode,gindex) pair ... */ + /* */ + /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */ + /* } */ + /* } */ + /* */ + /* Note that `*agindex' is set to~0 if the charmap is empty. The */ + /* result itself can be~0 in two cases: if the charmap is empty or */ + /* if the value~0 is the first valid character code. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Next_Char */ + /* */ + /* <Description> */ + /* This function is used to return the next character code in the */ + /* current charmap of a given face following the value `char_code', */ + /* as well as the corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* char_code :: The starting character code. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of next character code. 0~if charmap */ + /* is empty. */ + /* */ + /* <Return> */ + /* The charmap's next character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_First_Char to walk */ + /* over all character codes available in a given charmap. See the */ + /* note for this function for a simple code example. */ + /* */ + /* Note that `*agindex' is set to~0 when there are no more codes in */ + /* the charmap. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Name_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given glyph name. This function uses */ + /* driver specific objects to do the translation. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* glyph_name :: The glyph name. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means `undefined character code'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ); + + + /************************************************************************* + * + * @macro: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants used to describe subglyphs. Please refer to the + * TrueType specification for the meaning of the various flags. + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************* + * + * @func: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is + * returned otherwise. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of the subglyph. Must be less than + * `glyph->num_subglyphs'. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be + * interpreted depending on the flags returned in `*p_flags'. See the + * TrueType specification for details. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FSTYPE_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `fsType' field of the OS/2 table */ + /* in a TrueType or OpenType font and the `FSType' entry in a */ + /* PostScript font. These bit flags are returned by */ + /* @FT_Get_FSType_Flags; they inform client applications of embedding */ + /* and subsetting restrictions associated with a font. */ + /* */ + /* See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for */ + /* more details. */ + /* */ + /* <Values> */ + /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */ + /* Fonts with no fsType bit set may be embedded and permanently */ + /* installed on the remote system by an application. */ + /* */ + /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */ + /* Fonts that have only this bit set must not be modified, embedded */ + /* or exchanged in any manner without first obtaining permission of */ + /* the font software copyright owner. */ + /* */ + /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */ + /* If this bit is set, the font may be embedded and temporarily */ + /* loaded on the remote system. Documents containing Preview & */ + /* Print fonts must be opened `read-only'; no edits can be applied */ + /* to the document. */ + /* */ + /* FT_FSTYPE_EDITABLE_EMBEDDING :: */ + /* If this bit is set, the font may be embedded but must only be */ + /* installed temporarily on other systems. In contrast to Preview */ + /* & Print fonts, documents containing editable fonts may be opened */ + /* for reading, editing is permitted, and changes may be saved. */ + /* */ + /* FT_FSTYPE_NO_SUBSETTING :: */ + /* If this bit is set, the font may not be subsetted prior to */ + /* embedding. */ + /* */ + /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */ + /* If this bit is set, only bitmaps contained in the font may be */ + /* embedded; no outline data may be embedded. If there are no */ + /* bitmaps available in the font, then the font is unembeddable. */ + /* */ + /* <Note> */ + /* While the fsType flags can indicate that a font may be embedded, a */ + /* license with the font vendor may be separately required to use the */ + /* font in this way. */ + /* */ +#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000 +#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002 +#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004 +#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008 +#define FT_FSTYPE_NO_SUBSETTING 0x0100 +#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_FSType_Flags */ + /* */ + /* <Description> */ + /* Return the fsType flags for a font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* The fsType flags, @FT_FSTYPE_XXX. */ + /* */ + /* <Note> */ + /* Use this function rather than directly reading the `fs_type' field */ + /* in the @PS_FontInfoRec structure which is only guaranteed to */ + /* return the correct results for Type~1 fonts. */ + /* */ + FT_EXPORT( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_variants */ + /* */ + /* <Title> */ + /* Glyph Variants */ + /* */ + /* <Abstract> */ + /* The FreeType~2 interface to Unicode Ideographic Variation */ + /* Sequences (IVS), using the SFNT cmap format~14. */ + /* */ + /* <Description> */ + /* Many CJK characters have variant forms. They are a sort of grey */ + /* area somewhere between being totally irrelevant and semantically */ + /* distinct; for this reason, the Unicode consortium decided to */ + /* introduce Ideographic Variation Sequences (IVS), consisting of a */ + /* Unicode base character and one of 240 variant selectors */ + /* (U+E0100-U+E01EF), instead of further extending the already huge */ + /* code range for CJK characters. */ + /* */ + /* An IVS is registered and unique; for further details please refer */ + /* to Unicode Technical Report #37, the Ideographic Variation */ + /* Database. To date (October 2007), the character with the most */ + /* variants is U+908A, having 8~such IVS. */ + /* */ + /* Adobe and MS decided to support IVS with a new cmap subtable */ + /* (format~14). It is an odd subtable because it is not a mapping of */ + /* input code points to glyphs, but contains lists of all variants */ + /* supported by the font. */ + /* */ + /* A variant may be either `default' or `non-default'. A default */ + /* variant is the one you will get for that code point if you look it */ + /* up in the standard Unicode cmap. A non-default variant is a */ + /* different glyph. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharVariantIndex */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code as modified by */ + /* the variation selector. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character code point in Unicode. */ + /* */ + /* variantSelector :: */ + /* The Unicode code point of the variation selector. */ + /* */ + /* <Return> */ + /* The glyph index. 0~means either `undefined character code', or */ + /* `undefined selector code', or `no variation selector cmap */ + /* subtable', or `current CharMap is not Unicode'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value~0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + /* This function is only meaningful if */ + /* a) the font has a variation selector cmap sub table, */ + /* and */ + /* b) the current charmap has a Unicode encoding. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharVariantIsDefault */ + /* */ + /* <Description> */ + /* Check whether this variant of this Unicode character is the one to */ + /* be found in the `cmap'. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character codepoint in Unicode. */ + /* */ + /* variantSelector :: */ + /* The Unicode codepoint of the variation selector. */ + /* */ + /* <Return> */ + /* 1~if found in the standard (Unicode) cmap, 0~if found in the */ + /* variation selector cmap, or -1 if it is not a variant. */ + /* */ + /* <Note> */ + /* This function is only meaningful if the font has a variation */ + /* selector cmap subtable. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetVariantSelectors */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode variant selectors found */ + /* in the font. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to an array of selector code points, or NULL if there is */ + /* no valid variant selector cmap subtable. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetVariantsOfChar */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode variant selectors found */ + /* for the specified character code. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* charcode :: */ + /* The character codepoint in Unicode. */ + /* */ + /* <Return> */ + /* A pointer to an array of variant selector code points which are */ + /* active for the given character, or NULL if the corresponding list */ + /* is empty. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_GetCharsOfVariant */ + /* */ + /* <Description> */ + /* Return a zero-terminated list of Unicode character codes found for */ + /* the specified variant selector. */ + /* */ + /* <Input> */ + /* face :: */ + /* A handle to the source face object. */ + /* */ + /* variantSelector :: */ + /* The variant selector code point in Unicode. */ + /* */ + /* <Return> */ + /* A list of all the code points which are specified by this selector */ + /* (both default and non-default codes are returned) or NULL if there */ + /* is no valid cmap or the variant selector is invalid. */ + /* */ + /* <Note> */ + /* The last item in the array is~0; the array is owned by the */ + /* @FT_Face object but can be overwritten or released on the next */ + /* call to a FreeType function. */ + /* */ + /* <Since> */ + /* 2.3.6 */ + /* */ + FT_EXPORT( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /* <Title> */ + /* Computations */ + /* */ + /* <Abstract> */ + /* Crunching fixed numbers and vectors. */ + /* */ + /* <Description> */ + /* This section contains various functions used to perform */ + /* computations on 16.16 fixed-float numbers or 2d vectors. */ + /* */ + /* <Order> */ + /* FT_MulDiv */ + /* FT_MulFix */ + /* FT_DivFix */ + /* FT_RoundFix */ + /* FT_CeilFix */ + /* FT_FloorFix */ + /* FT_Vector_Transform */ + /* FT_Matrix_Multiply */ + /* FT_Matrix_Invert */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* with maximal accuracy (it uses a 64-bit intermediate integer */ + /* whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /* */ + + /* The following #if 0 ... #endif is for the documentation formatter, */ + /* hiding the internal `FT_MULFIX_INLINED' macro. */ + +#if 0 + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*b)/0x10000' with maximal accuracy. Most of the time this is */ + /* used to multiply a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*b)/0x10000'. */ + /* */ + /* <Note> */ + /* This function has been optimized for the case where the absolute */ + /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ + /* As this happens mainly when scaling from notional units to */ + /* fractional pixels in FreeType, it resulted in noticeable speed */ + /* improvements between versions 2.x and 1.x. */ + /* */ + /* As a conclusion, always try to place a 16.16 factor as the */ + /* _second_ argument of this function; this can make a great */ + /* difference. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + /* */ +#endif + +#ifdef FT_MULFIX_INLINED +#define FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b ) +#else + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_DivFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*0x10000)/b' with maximal accuracy. Most of the time, this is */ + /* used to divide a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*0x10000)/b'. */ + /* */ + /* <Note> */ + /* The optimization for FT_DivFix() is simple: If (a~<<~16) fits in */ + /* 32~bits, then the division is computed directly. Otherwise, we */ + /* use a specialized version of @FT_MulDiv. */ + /* */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_RoundFix */ + /* */ + /* <Description> */ + /* A very simple function used to round a 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number to be rounded. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x8000) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_CeilFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the ceiling function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the ceiling function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x10000 - 1) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FloorFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the floor function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the floor function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `a & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Vector_Transform */ + /* */ + /* <Description> */ + /* Transform a single vector through a 2x2 matrix. */ + /* */ + /* <InOut> */ + /* vector :: The target vector to transform. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the source 2x2 matrix. */ + /* */ + /* <Note> */ + /* The result is undefined if either `vector' or `matrix' is invalid. */ + /* */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vec, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* version */ + /* */ + /* <Title> */ + /* FreeType Version */ + /* */ + /* <Abstract> */ + /* Functions and macros related to FreeType versions. */ + /* */ + /* <Description> */ + /* Note that those functions and macros are of limited use because */ + /* even a new release of FreeType with only documentation changes */ + /* increases the version number. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. + * Use @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: The major version number. + * FREETYPE_MINOR :: The minor version number. + * FREETYPE_PATCH :: The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library + * with the `libtool' package is _not_ controlled by these three + * macros. + * + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 3 +#define FREETYPE_PATCH 12 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Library_Version */ + /* */ + /* <Description> */ + /* Return the version of the FreeType library being used. This is */ + /* useful when dynamically linking to the library, since one cannot */ + /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */ + /* @FREETYPE_PATCH. */ + /* */ + /* <Input> */ + /* library :: A source library handle. */ + /* */ + /* <Output> */ + /* amajor :: The major version number. */ + /* */ + /* aminor :: The minor version number. */ + /* */ + /* apatch :: The patch version number. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' argument is because */ + /* certain programs implement library initialization in a custom way */ + /* that doesn't use @FT_Init_FreeType. */ + /* */ + /* In such cases, the library version might not be available before */ + /* the library object has been created. */ + /* */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_CheckTrueTypePatents */ + /* */ + /* <Description> */ + /* Parse all bytecode instructions of a TrueType font file to check */ + /* whether any of the patented opcodes are used. This is only useful */ + /* if you want to be able to use the unpatented hinter with */ + /* fonts that do *not* use these opcodes. */ + /* */ + /* Note that this function parses *all* glyph instructions in the */ + /* font file, which may be slow. */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* <Return> */ + /* 1~if this is a TrueType font that uses one of the patented */ + /* opcodes, 0~otherwise. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_SetUnpatentedHinting */ + /* */ + /* <Description> */ + /* Enable or disable the unpatented hinter for a given face. */ + /* Only enable it if you have determined that the face doesn't */ + /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* value :: New boolean setting. */ + /* */ + /* <Return> */ + /* The old setting value. This will always be false if this is not */ + /* an SFNT font, or if the unpatented hinter is not compiled in this */ + /* instance of the library. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* __FREETYPE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftadvanc.h b/alienblaster/project/jni/freetype/include/freetype/ftadvanc.h new file mode 100644 index 000000000..b2451bec4 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftadvanc.h @@ -0,0 +1,179 @@ +/***************************************************************************/ +/* */ +/* ftadvanc.h */ +/* */ +/* Quick computation of advance widths (specification only). */ +/* */ +/* Copyright 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTADVANC_H__ +#define __FTADVANC_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /************************************************************************** + * + * @section: + * quick_advance + * + * @title: + * Quick retrieval of advance values + * + * @abstract: + * Retrieve horizontal and vertical advance values without processing + * glyph outlines, if possible. + * + * @description: + * This section contains functions to quickly extract advance values + * without handling glyph outlines, if possible. + */ + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* FT_ADVANCE_FLAG_FAST_ONLY */ + /* */ + /* <Description> */ + /* A bit-flag to be OR-ed with the `flags' parameter of the */ + /* @FT_Get_Advance and @FT_Get_Advances functions. */ + /* */ + /* If set, it indicates that you want these functions to fail if the */ + /* corresponding hinting mode or font driver doesn't allow for very */ + /* quick advance computation. */ + /* */ + /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */ + /* or light-hinted can have their advance width computed very */ + /* quickly. */ + /* */ + /* Normal and bytecode hinted modes, which require loading, scaling, */ + /* and hinting of the glyph outline, are extremely slow by */ + /* comparison. */ + /* */ +#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Advance */ + /* */ + /* <Description> */ + /* Retrieve the advance value of a given glyph outline in an */ + /* @FT_Face. By default, the unhinted advance is returned in font */ + /* units. */ + /* */ + /* <Input> */ + /* face :: The source @FT_Face handle. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* load_flags :: A set of bit flags similar to those used when */ + /* calling @FT_Load_Glyph, used to determine what kind */ + /* of advances you need. */ + /* <Output> */ + /* padvance :: The advance value, in either font units or 16.16 */ + /* format. */ + /* */ + /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */ + /* vertical advance corresponding to a vertical layout. */ + /* Otherwise, it is the horizontal advance in a */ + /* horizontal layout. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ + /* if the corresponding font backend doesn't have a quick way to */ + /* retrieve the advances. */ + /* */ + /* A scaled advance is returned in 16.16 format but isn't transformed */ + /* by the affine transformation specified by @FT_Set_Transform. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags, + FT_Fixed *padvance ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Advances */ + /* */ + /* <Description> */ + /* Retrieve the advance values of several glyph outlines in an */ + /* @FT_Face. By default, the unhinted advances are returned in font */ + /* units. */ + /* */ + /* <Input> */ + /* face :: The source @FT_Face handle. */ + /* */ + /* start :: The first glyph index. */ + /* */ + /* count :: The number of advance values you want to retrieve. */ + /* */ + /* load_flags :: A set of bit flags similar to those used when */ + /* calling @FT_Load_Glyph. */ + /* */ + /* <Output> */ + /* padvance :: The advances, in either font units or 16.16 format. */ + /* This array must contain at least `count' elements. */ + /* */ + /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */ + /* vertical advances corresponding to a vertical layout. */ + /* Otherwise, they are the horizontal advances in a */ + /* horizontal layout. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */ + /* if the corresponding font backend doesn't have a quick way to */ + /* retrieve the advances. */ + /* */ + /* Scaled advances are returned in 16.16 format but aren't */ + /* transformed by the affine transformation specified by */ + /* @FT_Set_Transform. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 load_flags, + FT_Fixed *padvances ); + +/* */ + + +FT_END_HEADER + +#endif /* __FTADVANC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftbbox.h b/alienblaster/project/jni/freetype/include/freetype/ftbbox.h new file mode 100644 index 000000000..01fe3fb0d --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftbbox.h @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftbbox.h */ +/* */ +/* FreeType exact bbox computation (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /* It is separated from the rest of the engine for various technical */ + /* reasons. It may well be integrated in `ftoutln' later. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTBBOX_H__ +#define __FTBBOX_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_BBox */ + /* */ + /* <Description> */ + /* Compute the exact bounding box of an outline. This is slower */ + /* than computing the control box. However, it uses an advanced */ + /* algorithm which returns _very_ quickly when the two boxes */ + /* coincide. Otherwise, the outline Bézier arcs are traversed to */ + /* extract their extrema. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline. */ + /* */ + /* <Output> */ + /* abbox :: The outline's exact bounding box. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBBOX_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftbdf.h b/alienblaster/project/jni/freetype/include/freetype/ftbdf.h new file mode 100644 index 000000000..4f8baf840 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftbdf.h @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* ftbdf.h */ +/* */ +/* FreeType API for accessing BDF-specific strings (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBDF_H__ +#define __FTBDF_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bdf_fonts */ + /* */ + /* <Title> */ + /* BDF and PCF Files */ + /* */ + /* <Abstract> */ + /* BDF and PCF specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions specific to BDF */ + /* and PCF fonts. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value~0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /********************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given + * BDF/PCF property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /********************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieve a BDF font character set identity, according to + * the BDF specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C~string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C~string, owned by the face. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieve a BDF property from a BDF or PCF font file. + * + * @input: + * face :: A handle to the input face. + * + * name :: The property name. + * + * @output: + * aproperty :: The property. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * A `property' is a either key-value pair within the STARTPROPERTIES + * ... ENDPROPERTIES block of a BDF font or a key-value pair from the + * `info->props' array within a `FontRec' structure of a PCF font. + * + * Integer properties are always stored as `signed' within PCF fonts; + * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value + * for BDF fonts only. + * + * In case of error, `aproperty->type' is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* __FTBDF_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftbitmap.h b/alienblaster/project/jni/freetype/include/freetype/ftbitmap.h new file mode 100644 index 000000000..92742369b --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftbitmap.h @@ -0,0 +1,227 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.h */ +/* */ +/* FreeType utility functions for bitmaps (specification). */ +/* */ +/* Copyright 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBITMAP_H__ +#define __FTBITMAP_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bitmap_handling */ + /* */ + /* <Title> */ + /* Bitmap Handling */ + /* */ + /* <Abstract> */ + /* Handling FT_Bitmap objects. */ + /* */ + /* <Description> */ + /* This section contains functions for converting FT_Bitmap objects. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_New */ + /* */ + /* <Description> */ + /* Initialize a pointer to an @FT_Bitmap structure. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the bitmap structure. */ + /* */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Copy */ + /* */ + /* <Description> */ + /* Copy a bitmap into another one. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: A handle to the source bitmap. */ + /* */ + /* <Output> */ + /* target :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Embolden */ + /* */ + /* <Description> */ + /* Embolden a bitmap. The new bitmap will be about `xStrength' */ + /* pixels wider and `yStrength' pixels higher. The left and bottom */ + /* borders are kept unchanged. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* xStrength :: How strong the glyph is emboldened horizontally. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* yStrength :: How strong the glyph is emboldened vertically. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* <InOut> */ + /* bitmap :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The current implementation restricts `xStrength' to be less than */ + /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */ + /* */ + /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */ + /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Convert */ + /* */ + /* <Description> */ + /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a */ + /* bitmap object with depth 8bpp, making the number of used bytes per */ + /* line (a.k.a. the `pitch') a multiple of `alignment'. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: The source bitmap. */ + /* */ + /* alignment :: The pitch of the bitmap is a multiple of this */ + /* parameter. Common values are 1, 2, or 4. */ + /* */ + /* <Output> */ + /* target :: The target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* It is possible to call @FT_Bitmap_Convert multiple times without */ + /* calling @FT_Bitmap_Done (the memory is simply reallocated). */ + /* */ + /* Use @FT_Bitmap_Done to finally remove the bitmap object. */ + /* */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GlyphSlot_Own_Bitmap */ + /* */ + /* <Description> */ + /* Make sure that a glyph slot owns `slot->bitmap'. */ + /* */ + /* <Input> */ + /* slot :: The glyph slot. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function is to be used in combination with */ + /* @FT_Bitmap_Embolden. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Done */ + /* */ + /* <Description> */ + /* Destroy a bitmap object created with @FT_Bitmap_New. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* bitmap :: The bitmap object to be freed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBITMAP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftcache.h b/alienblaster/project/jni/freetype/include/freetype/ftcache.h new file mode 100644 index 000000000..0916d70a3 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftcache.h @@ -0,0 +1,1125 @@ +/***************************************************************************/ +/* */ +/* ftcache.h */ +/* */ +/* FreeType Cache subsystem (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCACHE_H__ +#define __FTCACHE_H__ + + +#include <ft2build.h> +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************* + * + * <Section> + * cache_subsystem + * + * <Title> + * Cache Sub-System + * + * <Abstract> + * How to cache face, size, and glyph data with FreeType~2. + * + * <Description> + * This section describes the FreeType~2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_' prefix. + * + * The cache is highly portable and thus doesn't know anything about the + * fonts installed on your system, or how to access them. This implies + * the following scheme: + * + * First, available or installed font faces are uniquely identified by + * @FTC_FaceID values, provided to the cache by the client. Note that + * the cache only stores and compares these values, and doesn't try to + * interpret them in any way. + * + * Second, the cache calls, only when needed, a client-provided function + * to convert a @FTC_FaceID into a new @FT_Face object. The latter is + * then completely managed by the cache, including its termination + * through @FT_Done_Face. + * + * Clients are free to map face IDs to anything else. The most simple + * usage is to associate them to a (pathname,face_index) pair that is + * used to call @FT_New_Face. However, more complex schemes are also + * possible. + * + * Note that for the cache to work correctly, the face ID values must be + * *persistent*, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * the cache get rid of any references to the old @FTC_FaceID it may + * keep internally. Failure to do so will lead to incorrect behaviour + * or even crashes. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * + * If you want to use the charmap caching, call @FTC_CMapCache_New, then + * later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then + * later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * If you need lots of small bitmaps, it is much more memory efficient + * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small + * bitmaps directly. (A small bitmap is one whose metrics and + * dimensions all fit into 8-bit integers). + * + * We hope to also provide a kerning cache in the near future. + * + * + * <Order> + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined + * structure containing a font file path, and face index. + * + * @note: + * Never use NULL as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager, which calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even + * memory leaks and crashes. + */ + typedef FT_Pointer FTC_FaceID; + + + /************************************************************************ + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * <Input> + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * <Output> + * aface :: + * A new @FT_Face handle. + * + * <Return> + * FreeType error code. 0~means success. + * + * <Note> + * The third parameter `req_data' is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer request_data, + FT_Face* aface ); + + /* */ + +#define FT_POINTER_TO_ULONG( p ) ( (FT_ULong)(FT_Pointer)(p) ) + +#define FTC_FACE_ID_HASH( i ) \ + ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \ + ( FT_POINTER_TO_ULONG( i ) << 7 ) ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Manager */ + /* */ + /* <Description> */ + /* This object corresponds to one instance of the cache-subsystem. */ + /* It is used to cache one or more @FT_Face objects, along with */ + /* corresponding @FT_Size objects. */ + /* */ + /* The manager intentionally limits the total number of opened */ + /* @FT_Face and @FT_Size objects to control memory usage. See the */ + /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */ + /* */ + /* The manager is also used to cache `nodes' of various types while */ + /* limiting their total memory usage. */ + /* */ + /* All limitations are enforced by keeping lists of managed objects */ + /* in most-recently-used order, and flushing old nodes to make room */ + /* for new ones. */ + /* */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Node */ + /* */ + /* <Description> */ + /* An opaque handle to a cache node object. Each cache node is */ + /* reference-counted. A node with a count of~0 might be flushed */ + /* out of a full cache whenever a lookup request is performed. */ + /* */ + /* If you lookup nodes, you have the ability to `acquire' them, i.e., */ + /* to increment their reference count. This will prevent the node */ + /* from being flushed out of the cache until you explicitly `release' */ + /* it (see @FTC_Node_Unref). */ + /* */ + /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */ + /* */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_New */ + /* */ + /* <Description> */ + /* Create a new cache manager. */ + /* */ + /* <Input> */ + /* library :: The parent FreeType library handle to use. */ + /* */ + /* max_faces :: Maximum number of opened @FT_Face objects managed by */ + /* this cache instance. Use~0 for defaults. */ + /* */ + /* max_sizes :: Maximum number of opened @FT_Size objects managed by */ + /* this cache instance. Use~0 for defaults. */ + /* */ + /* max_bytes :: Maximum number of bytes to use for cached data nodes. */ + /* Use~0 for defaults. Note that this value does not */ + /* account for managed @FT_Face and @FT_Size objects. */ + /* */ + /* requester :: An application-provided callback used to translate */ + /* face IDs into real @FT_Face objects. */ + /* */ + /* req_data :: A generic pointer that is passed to the requester */ + /* each time it is called (see @FTC_Face_Requester). */ + /* */ + /* <Output> */ + /* amanager :: A handle to a new manager object. 0~in case of */ + /* failure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Reset */ + /* */ + /* <Description> */ + /* Empty a given cache manager. This simply gets rid of all the */ + /* currently cached @FT_Face and @FT_Size objects within the manager. */ + /* */ + /* <InOut> */ + /* manager :: A handle to the manager. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Done */ + /* */ + /* <Description> */ + /* Destroy a given manager after emptying it. */ + /* */ + /* <Input> */ + /* manager :: A handle to the target cache manager object. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupFace */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Face object that corresponds to a given face ID */ + /* through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* face_id :: The ID of the face object. */ + /* */ + /* <Output> */ + /* aface :: A handle to the face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Face object is always owned by the manager. You */ + /* should never try to discard it yourself. */ + /* */ + /* The @FT_Face object doesn't necessarily have a current size object */ + /* (i.e., face->size can be 0). If you need a specific `font size', */ + /* use @FTC_Manager_LookupSize instead. */ + /* */ + /* Never change the face's transformation matrix (i.e., never call */ + /* the @FT_Set_Transform function) on a returned face! If you need */ + /* to transform glyphs, do it yourself after glyph loading. */ + /* */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory was available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_ScalerRec */ + /* */ + /* <Description> */ + /* A structure used to describe a given character size in either */ + /* pixels or points to the cache manager. See */ + /* @FTC_Manager_LookupSize. */ + /* */ + /* <Fields> */ + /* face_id :: The source face ID. */ + /* */ + /* width :: The character width. */ + /* */ + /* height :: The character height. */ + /* */ + /* pixel :: A Boolean. If 1, the `width' and `height' fields are */ + /* interpreted as integer pixel character sizes. */ + /* Otherwise, they are expressed as 1/64th of points. */ + /* */ + /* x_res :: Only used when `pixel' is value~0 to indicate the */ + /* horizontal resolution in dpi. */ + /* */ + /* y_res :: Only used when `pixel' is value~0 to indicate the */ + /* vertical resolution in dpi. */ + /* */ + /* <Note> */ + /* This type is mainly used to retrieve @FT_Size objects through the */ + /* cache manager. */ + /* */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_Scaler */ + /* */ + /* <Description> */ + /* A handle to an @FTC_ScalerRec structure. */ + /* */ + typedef struct FTC_ScalerRec_* FTC_Scaler; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupSize */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Size object that corresponds to a given */ + /* @FTC_ScalerRec pointer through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* scaler :: A scaler handle. */ + /* */ + /* <Output> */ + /* asize :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Size object is always owned by the manager. You */ + /* should never try to discard it by yourself. */ + /* */ + /* You can access the parent @FT_Face object simply as `size->face' */ + /* if you need it. Note that this object is also owned by the */ + /* manager. */ + /* */ + /* <Note> */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory is available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Node_Unref */ + /* */ + /* <Description> */ + /* Decrement a cache node's internal reference count. When the count */ + /* reaches 0, it is not destroyed but becomes eligible for subsequent */ + /* cache flushes. */ + /* */ + /* <Input> */ + /* node :: The cache node handle. */ + /* */ + /* manager :: The cache manager handle. */ + /* */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************* + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that + * a given @FTC_FaceID is no longer valid, either because its + * content changed, or because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id', with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear + * in later lookups with the same `face_id' value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to + * hold character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************* + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************ + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. Any negative value + * means to use the cache @FT_Face's default charmap. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0~means `no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_Int width; + FT_Int height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************* + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + +#define FTC_IMAGE_TYPE_HASH( d ) \ + (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id ) ^ \ + ( (d)->width << 8 ) ^ (d)->height ^ \ + ( (d)->flags << 4 ) ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_ImageCache */ + /* */ + /* <Description> */ + /* A handle to an glyph image cache object. They are designed to */ + /* hold many distinct glyph images while not exceeding a certain */ + /* memory threshold. */ + /* */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_New */ + /* */ + /* <Description> */ + /* Create a new glyph image cache. */ + /* */ + /* <Input> */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_Lookup */ + /* */ + /* <Description> */ + /* Retrieve a given glyph image from a glyph image cache. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* type :: A pointer to a glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* scaler :: A pointer to a scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + /* Calls to @FT_Set_Char_Size and friends have no effect on cached */ + /* glyphs; you should always use the FreeType cache API instead. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBit */ + /* */ + /* <Description> */ + /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ + /* structure for details. */ + /* */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_SBitRec */ + /* */ + /* <Description> */ + /* A very compact structure used to describe a small glyph bitmap. */ + /* */ + /* <Fields> */ + /* width :: The bitmap width in pixels. */ + /* */ + /* height :: The bitmap height in pixels. */ + /* */ + /* left :: The horizontal distance from the pen position to the */ + /* left bitmap border (a.k.a. `left side bearing', or */ + /* `lsb'). */ + /* */ + /* top :: The vertical distance from the pen position (on the */ + /* baseline) to the upper bitmap border (a.k.a. `top */ + /* side bearing'). The distance is positive for upwards */ + /* y~coordinates. */ + /* */ + /* format :: The format of the glyph bitmap (monochrome or gray). */ + /* */ + /* max_grays :: Maximum gray level value (in the range 1 to~255). */ + /* */ + /* pitch :: The number of bytes per bitmap line. May be positive */ + /* or negative. */ + /* */ + /* xadvance :: The horizontal advance width in pixels. */ + /* */ + /* yadvance :: The vertical advance height in pixels. */ + /* */ + /* buffer :: A pointer to the bitmap pixels. */ + /* */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBitCache */ + /* */ + /* <Description> */ + /* A handle to a small bitmap cache. These are special cache objects */ + /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ + /* much more efficient way than the traditional glyph image cache */ + /* implemented by @FTC_ImageCache. */ + /* */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_New */ + /* */ + /* <Description> */ + /* Create a new cache to store small glyph bitmaps. */ + /* */ + /* <Input> */ + /* manager :: A handle to the source cache manager. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new sbit cache. NULL in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_Lookup */ + /* */ + /* <Description> */ + /* Look up a given small glyph bitmap in a given sbit cache and */ + /* `lock' it to prevent its flushing from the cache until needed. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* type :: A pointer to the glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to~0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* scaler :: A pointer to the scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to~0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /* */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*@***********************************************************************/ + /* */ + /* <Struct> */ + /* FTC_FontRec */ + /* */ + /* <Description> */ + /* A simple structure used to describe a given `font' to the cache */ + /* manager. Note that a `font' is the combination of a given face */ + /* with a given character size. */ + /* */ + /* <Fields> */ + /* face_id :: The ID of the face to use. */ + /* */ + /* pix_width :: The character width in integer pixels. */ + /* */ + /* pix_height :: The character height in integer pixels. */ + /* */ + typedef struct FTC_FontRec_ + { + FTC_FaceID face_id; + FT_UShort pix_width; + FT_UShort pix_height; + + } FTC_FontRec; + + + /* */ + + +#define FTC_FONT_COMPARE( f1, f2 ) \ + ( (f1)->face_id == (f2)->face_id && \ + (f1)->pix_width == (f2)->pix_width && \ + (f1)->pix_height == (f2)->pix_height ) + +#define FTC_FONT_HASH( f ) \ + (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \ + ((f)->pix_width << 8) ^ \ + ((f)->pix_height) ) + + typedef FTC_FontRec* FTC_Font; + + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* */ + +FT_END_HEADER + +#endif /* __FTCACHE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftchapters.h b/alienblaster/project/jni/freetype/include/freetype/ftchapters.h new file mode 100644 index 000000000..7775a6bb0 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftchapters.h @@ -0,0 +1,103 @@ +/***************************************************************************/ +/* */ +/* This file defines the structure of the FreeType reference. */ +/* It is used by the python script which generates the HTML files. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* general_remarks */ +/* */ +/* <Title> */ +/* General Remarks */ +/* */ +/* <Sections> */ +/* user_allocation */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* core_api */ +/* */ +/* <Title> */ +/* Core API */ +/* */ +/* <Sections> */ +/* version */ +/* basic_types */ +/* base_interface */ +/* glyph_variants */ +/* glyph_management */ +/* mac_specific */ +/* sizes_management */ +/* header_file_macros */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* format_specific */ +/* */ +/* <Title> */ +/* Format-Specific API */ +/* */ +/* <Sections> */ +/* multiple_masters */ +/* truetype_tables */ +/* type1_tables */ +/* sfnt_names */ +/* bdf_fonts */ +/* cid_fonts */ +/* pfr_fonts */ +/* winfnt_fonts */ +/* font_formats */ +/* gasp_table */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* cache_subsystem */ +/* */ +/* <Title> */ +/* Cache Sub-System */ +/* */ +/* <Sections> */ +/* cache_subsystem */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* support_api */ +/* */ +/* <Title> */ +/* Support API */ +/* */ +/* <Sections> */ +/* computations */ +/* list_processing */ +/* outline_processing */ +/* quick_advance */ +/* bitmap_handling */ +/* raster */ +/* glyph_stroker */ +/* system_interface */ +/* module_management */ +/* gzip */ +/* lzw */ +/* lcd_filtering */ +/* */ +/***************************************************************************/ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftcid.h b/alienblaster/project/jni/freetype/include/freetype/ftcid.h new file mode 100644 index 000000000..203a30caf --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftcid.h @@ -0,0 +1,166 @@ +/***************************************************************************/ +/* */ +/* ftcid.h */ +/* */ +/* FreeType API for accessing CID font information (specification). */ +/* */ +/* Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCID_H__ +#define __FTCID_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cid_fonts */ + /* */ + /* <Title> */ + /* CID Fonts */ + /* */ + /* <Abstract> */ + /* CID-keyed font specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of CID-keyed font specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_CID_Registry_Ordering_Supplement + * + * @description: + * Retrieve the Registry/Ordering/Supplement triple (also known as the + * "R/O/S") from a CID-keyed font. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * registry :: + * The registry, as a C~string, owned by the face. + * + * ordering :: + * The ordering, as a C~string, owned by the face. + * + * supplement :: + * The supplement. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces, returning an error + * otherwise. + * + * @since: + * 2.3.6 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement); + + + /********************************************************************** + * + * @function: + * FT_Get_CID_Is_Internally_CID_Keyed + * + * @description: + * Retrieve the type of the input face, CID keyed or not. In + * constrast to the @FT_IS_CID_KEYED macro this function returns + * successfully also for CID-keyed fonts in an SNFT wrapper. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * is_cid :: + * The type of the face as an @FT_Bool. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, + * returning an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ); + + + /********************************************************************** + * + * @function: + * FT_Get_CID_From_Glyph_Index + * + * @description: + * Retrieve the CID of the input glyph index. + * + * @input: + * face :: + * A handle to the input face. + * + * glyph_index :: + * The input glyph index. + * + * @output: + * cid :: + * The CID as an @FT_UInt. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with CID faces and OpenType fonts, + * returning an error otherwise. + * + * @since: + * 2.3.9 + */ + FT_EXPORT( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + /* */ + +FT_END_HEADER + +#endif /* __FTCID_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/fterrdef.h b/alienblaster/project/jni/freetype/include/freetype/fterrdef.h new file mode 100644 index 000000000..d7ad256bd --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/fterrdef.h @@ -0,0 +1,239 @@ +/***************************************************************************/ +/* */ +/* fterrdef.h */ +/* */ +/* FreeType error codes (specification). */ +/* */ +/* Copyright 2002, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST OF ERROR CODES/MESSAGES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + + /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */ + /* including this file. */ + + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, \ + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \ + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, \ + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, \ + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, \ + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, \ + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, \ + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, \ + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, \ + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, \ + "array allocation size too large" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \ + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, \ + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \ + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \ + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, \ + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, \ + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, \ + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \ + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, \ + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \ + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \ + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \ + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \ + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \ + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \ + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \ + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \ + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, \ + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, \ + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, \ + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, \ + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \ + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \ + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \ + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \ + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \ + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \ + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, \ + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \ + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, \ + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, \ + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, \ + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, \ + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, \ + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, \ + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, \ + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, \ + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, \ + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, \ + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, \ + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, \ + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, \ + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \ + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, \ + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \ + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, \ + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \ + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \ + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, \ + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \ + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, \ + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, \ + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, \ + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \ + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, \ + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \ + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \ + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, \ + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \ + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \ + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \ + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \ + "invalid PostScript (post) table" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, \ + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, \ + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, \ + "ignore" ) + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \ + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, \ + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB3, \ + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB4, \ + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB5, \ + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB6, \ + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB7, \ + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB8, \ + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xB9, \ + "Font glyphs corrupted or missing fields" ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/fterrors.h b/alienblaster/project/jni/freetype/include/freetype/fterrors.h new file mode 100644 index 000000000..6600dadd0 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/fterrors.h @@ -0,0 +1,206 @@ +/***************************************************************************/ +/* */ +/* fterrors.h */ +/* */ +/* FreeType error code handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This special header file is used to define the handling of FT2 */ + /* enumeration constants. It can also be used to generate error message */ + /* strings with a small macro trick explained below. */ + /* */ + /* I - Error Formats */ + /* ----------------- */ + /* */ + /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ + /* defined in ftoption.h in order to make the higher byte indicate */ + /* the module where the error has happened (this is not compatible */ + /* with standard builds of FreeType 2). You can then use the macro */ + /* FT_ERROR_BASE macro to extract the generic error code from an */ + /* FT_Error value. */ + /* */ + /* */ + /* II - Error Message strings */ + /* -------------------------- */ + /* */ + /* The error definitions below are made through special macros that */ + /* allow client applications to build a table of error message strings */ + /* if they need it. The strings are not included in a normal build of */ + /* FreeType 2 to save space (most client applications do not use */ + /* them). */ + /* */ + /* To do so, you have to define the following macros before including */ + /* this file: */ + /* */ + /* FT_ERROR_START_LIST :: */ + /* This macro is called before anything else to define the start of */ + /* the error list. It is followed by several FT_ERROR_DEF calls */ + /* (see below). */ + /* */ + /* FT_ERROR_DEF( e, v, s ) :: */ + /* This macro is called to define one single error. */ + /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */ + /* `v' is the error numerical value. */ + /* `s' is the corresponding error string. */ + /* */ + /* FT_ERROR_END_LIST :: */ + /* This macro ends the list. */ + /* */ + /* Additionally, you have to undefine __FTERRORS_H__ before #including */ + /* this file. */ + /* */ + /* Here is a simple example: */ + /* */ + /* { */ + /* #undef __FTERRORS_H__ */ + /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ + /* #define FT_ERROR_START_LIST { */ + /* #define FT_ERROR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int err_code; */ + /* const char* err_msg; */ + /* } ft_errors[] = */ + /* */ + /* #include FT_ERRORS_H */ + /* } */ + /* */ + /*************************************************************************/ + + +#ifndef __FTERRORS_H__ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include FT_MODULE_ERRORS_H + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#undef FT_ERR_XCAT +#undef FT_ERR_CAT + +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_'. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for <module>_Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include FT_ERROR_DEFINITIONS_H + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_CONCAT +#undef FT_ERR_BASE + + /* FT_KEEP_ERR_PREFIX is needed for ftvalid.h */ +#ifndef FT_KEEP_ERR_PREFIX +#undef FT_ERR_PREFIX +#endif + +#endif /* __FTERRORS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftgasp.h b/alienblaster/project/jni/freetype/include/freetype/ftgasp.h new file mode 100644 index 000000000..91a769e52 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftgasp.h @@ -0,0 +1,120 @@ +/***************************************************************************/ +/* */ +/* ftgasp.h */ +/* */ +/* Access of TrueType's `gasp' table (specification). */ +/* */ +/* Copyright 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef _FT_GASP_H_ +#define _FT_GASP_H_ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + + /*************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType `gasp' table entries. + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in its `gasp' table, if any. This is + * mainly useful when implementing native TrueType hinting with the + * bytecode interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************* + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This *really* means TrueType bytecode interpretation. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * Smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * `ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x10 + + + /************************************************************************* + * + * @func: + * FT_Get_Gasp + * + * @description: + * Read the `gasp' table from a TrueType or OpenType font file and + * return the entry corresponding to a given character pixel size. + * + * @input: + * face :: The source face handle. + * ppem :: The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no + * `gasp' table in the face. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + +/* */ + +#endif /* _FT_GASP_H_ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftglyph.h b/alienblaster/project/jni/freetype/include/freetype/ftglyph.h new file mode 100644 index 000000000..0b8f0c044 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftglyph.h @@ -0,0 +1,613 @@ +/***************************************************************************/ +/* */ +/* ftglyph.h */ +/* */ +/* FreeType convenience functions to handle glyphs (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTGLYPH_H__ +#define __FTGLYPH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_management */ + /* */ + /* <Title> */ + /* Glyph Management */ + /* */ + /* <Abstract> */ + /* Generic interface to manage individual glyph data. */ + /* */ + /* <Description> */ + /* This section contains definitions used to manage glyph data */ + /* through generic FT_Glyph objects. Each of them can contain a */ + /* bitmap, a vector outline, or even images in other formats. */ + /* */ + /*************************************************************************/ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Glyph */ + /* */ + /* <Description> */ + /* Handle to an object used to model generic glyph images. It is a */ + /* pointer to the @FT_GlyphRec structure and can contain a glyph */ + /* bitmap or pointer. */ + /* */ + /* <Note> */ + /* Glyph objects are not owned by the library. You must thus release */ + /* them manually (through @FT_Done_Glyph) _before_ calling */ + /* @FT_Done_FreeType. */ + /* */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphRec */ + /* */ + /* <Description> */ + /* The root glyph structure contains a given glyph image plus its */ + /* advance width in 16.16 fixed float format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library object. */ + /* */ + /* clazz :: A pointer to the glyph's class. Private. */ + /* */ + /* format :: The format of the glyph's image. */ + /* */ + /* advance :: A 16.16 vector that gives the glyph's advance width. */ + /* */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_BitmapGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model a bitmap glyph image. This is */ + /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ + /* */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BitmapGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for bitmap glyph images. This really is a */ + /* `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* left :: The left-side bearing, i.e., the horizontal distance */ + /* from the current pen position to the left border of the */ + /* glyph bitmap. */ + /* */ + /* top :: The top-side bearing, i.e., the vertical distance from */ + /* the current pen position to the top border of the glyph */ + /* bitmap. This distance is positive for upwards~y! */ + /* */ + /* bitmap :: A descriptor for the bitmap. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */ + /* the bitmap's contents easily. */ + /* */ + /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */ + /* and is thus created and destroyed with it. */ + /* */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_OutlineGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model an outline glyph image. This */ + /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ + /* */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_OutlineGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for outline (vectorial) glyph images. This */ + /* really is a `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* outline :: A descriptor for the outline. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */ + /* the outline's content easily. */ + /* */ + /* As the outline is extracted from a glyph slot, its coordinates are */ + /* expressed normally in 26.6 pixels, unless the flag */ + /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */ + /* */ + /* The outline's tables are always owned by the object and are */ + /* destroyed with it. */ + /* */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph */ + /* */ + /* <Description> */ + /* A function used to extract a glyph image from a slot. Note that */ + /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* slot :: A handle to the source glyph slot. */ + /* */ + /* <Output> */ + /* aglyph :: A handle to the glyph object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Copy */ + /* */ + /* <Description> */ + /* A function used to copy a glyph image. Note that the created */ + /* @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* source :: A handle to the source glyph object. */ + /* */ + /* <Output> */ + /* target :: A handle to the target glyph object. 0~in case of */ + /* error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Transform */ + /* */ + /* <Description> */ + /* Transform a glyph image if its format is scalable. */ + /* */ + /* <InOut> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to a 2x2 matrix to apply. */ + /* */ + /* delta :: A pointer to a 2d vector to apply. Coordinates are */ + /* expressed in 1/64th of a pixel. */ + /* */ + /* <Return> */ + /* FreeType error code (if not 0, the glyph format is not scalable). */ + /* */ + /* <Note> */ + /* The 2x2 transformation matrix is also applied to the glyph's */ + /* advance vector. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_BBox_Mode */ + /* */ + /* <Description> */ + /* The mode how the values of @FT_Glyph_Get_CBox are returned. */ + /* */ + /* <Values> */ + /* FT_GLYPH_BBOX_UNSCALED :: */ + /* Return unscaled font units. */ + /* */ + /* FT_GLYPH_BBOX_SUBPIXELS :: */ + /* Return unfitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_GRIDFIT :: */ + /* Return grid-fitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_TRUNCATE :: */ + /* Return coordinates in integer pixels. */ + /* */ + /* FT_GLYPH_BBOX_PIXELS :: */ + /* Return grid-fitted pixel coordinates. */ + /* */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_bbox_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Glyph_BBox_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */ + /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */ + /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */ + /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */ + /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */ + /* */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Get_CBox */ + /* */ + /* <Description> */ + /* Return a glyph's `control box'. The control box encloses all the */ + /* outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the source glyph object. */ + /* */ + /* mode :: The mode which indicates how to interpret the returned */ + /* bounding box values. */ + /* */ + /* <Output> */ + /* acbox :: The glyph coordinate bounding box. Coordinates are */ + /* expressed in 1/64th of pixels if it is grid-fitted. */ + /* */ + /* <Note> */ + /* Coordinates are relative to the glyph origin, using the y~upwards */ + /* convention. */ + /* */ + /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */ + /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */ + /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */ + /* is another name for this constant. */ + /* */ + /* Note that the maximum coordinates are exclusive, which means that */ + /* one can compute the width and height of the glyph image (be it in */ + /* integer or 26.6 pixels) as: */ + /* */ + /* { */ + /* width = bbox.xMax - bbox.xMin; */ + /* height = bbox.yMax - bbox.yMin; */ + /* } */ + /* */ + /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ + /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */ + /* which corresponds to: */ + /* */ + /* { */ + /* bbox.xMin = FLOOR(bbox.xMin); */ + /* bbox.yMin = FLOOR(bbox.yMin); */ + /* bbox.xMax = CEILING(bbox.xMax); */ + /* bbox.yMax = CEILING(bbox.yMax); */ + /* } */ + /* */ + /* To get the bbox in pixel coordinates, set `bbox_mode' to */ + /* @FT_GLYPH_BBOX_TRUNCATE. */ + /* */ + /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ + /* to @FT_GLYPH_BBOX_PIXELS. */ + /* */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_To_Bitmap */ + /* */ + /* <Description> */ + /* Convert a given glyph object to a bitmap glyph object. */ + /* */ + /* <InOut> */ + /* the_glyph :: A pointer to a handle to the target glyph. */ + /* */ + /* <Input> */ + /* render_mode :: An enumeration that describes how the data is */ + /* rendered. */ + /* */ + /* origin :: A pointer to a vector used to translate the glyph */ + /* image before rendering. Can be~0 (if no */ + /* translation). The origin is expressed in */ + /* 26.6 pixels. */ + /* */ + /* destroy :: A boolean that indicates that the original glyph */ + /* image should be destroyed by this function. It is */ + /* never destroyed in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function does nothing if the glyph format isn't scalable. */ + /* */ + /* The glyph image is translated with the `origin' vector before */ + /* rendering. */ + /* */ + /* The first parameter is a pointer to an @FT_Glyph handle, that will */ + /* be _replaced_ by this function (with newly allocated data). */ + /* Typically, you would use (omitting error handling): */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyph; */ + /* FT_BitmapGlyph glyph_bitmap; */ + /* */ + /* */ + /* // load glyph */ + /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ + /* */ + /* // extract glyph image */ + /* error = FT_Get_Glyph( face->glyph, &glyph ); */ + /* */ + /* // convert to a bitmap (default render mode + destroying old) */ + /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ + /* { */ + /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */ + /* 0, 1 ); */ + /* if ( error ) // `glyph' unchanged */ + /* ... */ + /* } */ + /* */ + /* // access bitmap content by typecasting */ + /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ + /* */ + /* // do funny stuff with it, like blitting/drawing */ + /* ... */ + /* */ + /* // discard glyph image (bitmap or not) */ + /* FT_Done_Glyph( glyph ); */ + /* } */ + /* */ + /* */ + /* Here another example, again without error handling: */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyphs[MAX_GLYPHS] */ + /* */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */ + /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* { */ + /* FT_Glyph bitmap = glyphs[idx]; */ + /* */ + /* */ + /* ... */ + /* */ + /* // after this call, `bitmap' no longer points into */ + /* // the `glyphs' array (and the old value isn't destroyed) */ + /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */ + /* */ + /* ... */ + /* */ + /* FT_Done_Glyph( bitmap ); */ + /* } */ + /* */ + /* ... */ + /* */ + /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ + /* FT_Done_Glyph( glyphs[idx] ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Glyph */ + /* */ + /* <Description> */ + /* Destroy a given glyph. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Multiply */ + /* */ + /* <Description> */ + /* Perform the matrix operation `b = a*b'. */ + /* */ + /* <Input> */ + /* a :: A pointer to matrix `a'. */ + /* */ + /* <InOut> */ + /* b :: A pointer to matrix `b'. */ + /* */ + /* <Note> */ + /* The result is undefined if either `a' or `b' is zero. */ + /* */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Invert */ + /* */ + /* <Description> */ + /* Invert a 2x2 matrix. Return an error if it can't be inverted. */ + /* */ + /* <InOut> */ + /* matrix :: A pointer to the target matrix. Remains untouched in */ + /* case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLYPH_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftgxval.h b/alienblaster/project/jni/freetype/include/freetype/ftgxval.h new file mode 100644 index 000000000..497015c10 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftgxval.h @@ -0,0 +1,358 @@ +/***************************************************************************/ +/* */ +/* ftgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* Masatake YAMATO, Redhat K.K, */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGXVAL_H__ +#define __FTGXVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gx_validation */ + /* */ + /* <Title> */ + /* TrueTypeGX/AAT Validation */ + /* */ + /* <Abstract> */ + /* An API to validate TrueTypeGX/AAT tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */ + /* trak, prop, lcar). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Warning: Use FT_VALIDATE_XXX to validate a table. */ + /* Following definitions are for gxvalid developers. */ + /* */ + /* */ + /*************************************************************************/ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************* + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length' argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate `feat' table. + * + * FT_VALIDATE_mort :: + * Validate `mort' table. + * + * FT_VALIDATE_morx :: + * Validate `morx' table. + * + * FT_VALIDATE_bsln :: + * Validate `bsln' table. + * + * FT_VALIDATE_just :: + * Validate `just' table. + * + * FT_VALIDATE_kern :: + * Validate `kern' table. + * + * FT_VALIDATE_opbd :: + * Validate `opbd' table. + * + * FT_VALIDATE_trak :: + * Validate `trak' table. + * + * FT_VALIDATE_prop :: + * Validate `prop' table. + * + * FT_VALIDATE_lcar :: + * Validate `lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. + * The array itself must be allocated by a client. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by + * @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate + * to indicate the classic kern dialect or dialects. If the selected + * type doesn't fit, @FT_ClassicKern_Validate regards the table as + * invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the `kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the `kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the `kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16-bit format) kern table to assure that the offsets + * and indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32-bit format and the classic 16-bit format, while + * FT_ClassicKern_Validate only supports the classic 16-bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGXVAL_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftgzip.h b/alienblaster/project/jni/freetype/include/freetype/ftgzip.h new file mode 100644 index 000000000..acbc4f032 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftgzip.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* ftgzip.h */ +/* */ +/* Gzip-compressed stream support. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGZIP_H__ +#define __FTGZIP_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gzip */ + /* */ + /* <Title> */ + /* GZIP Streams */ + /* */ + /* <Abstract> */ + /* Using gzip-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Gzip-specific functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************ + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is + * mainly used to support the compressed `*.pcf.gz' fonts that come + * with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from + * it and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGZIP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftimage.h b/alienblaster/project/jni/freetype/include/freetype/ftimage.h new file mode 100644 index 000000000..0272e92d2 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftimage.h @@ -0,0 +1,1301 @@ +/***************************************************************************/ +/* */ +/* ftimage.h */ +/* */ +/* FreeType glyph image formats and default raster interface */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Note: A `raster' is simply a scan-line converter, used to render */ + /* FT_Outlines into FT_Bitmaps. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTIMAGE_H__ +#define __FTIMAGE_H__ + + + /* _STANDALONE_ is from ftgrays.c */ +#ifndef _STANDALONE_ +#include <ft2build.h> +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pos */ + /* */ + /* <Description> */ + /* The type FT_Pos is used to store vectorial coordinates. Depending */ + /* on the context, these can represent distances in integer font */ + /* units, or 16.16, or 26.6 fixed float pixel coordinates. */ + /* */ + typedef signed long FT_Pos; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Vector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector; coordinates are of */ + /* the FT_Pos type. */ + /* */ + /* <Fields> */ + /* x :: The horizontal coordinate. */ + /* y :: The vertical coordinate. */ + /* */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BBox */ + /* */ + /* <Description> */ + /* A structure used to hold an outline's bounding box, i.e., the */ + /* coordinates of its extrema in the horizontal and vertical */ + /* directions. */ + /* */ + /* <Fields> */ + /* xMin :: The horizontal minimum (left-most). */ + /* */ + /* yMin :: The vertical minimum (bottom-most). */ + /* */ + /* xMax :: The horizontal maximum (right-most). */ + /* */ + /* yMax :: The vertical maximum (top-most). */ + /* */ + /* <Note> */ + /* The bounding box is specified with the coordinates of the lower */ + /* left and the upper right corner. In PostScript, those values are */ + /* often called (llx,lly) and (urx,ury), respectively. */ + /* */ + /* If `yMin' is negative, this value gives the glyph's descender. */ + /* Otherwise, the glyph doesn't descend below the baseline. */ + /* Similarly, if `ymax' is positive, this value gives the glyph's */ + /* ascender. */ + /* */ + /* `xMin' gives the horizontal distance from the glyph's origin to */ + /* the left edge of the glyph's bounding box. If `xMin' is negative, */ + /* the glyph extends to the left of the origin. */ + /* */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Pixel_Mode */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of pixels in a */ + /* given bitmap. Note that additional formats may be added in the */ + /* future. */ + /* */ + /* <Values> */ + /* FT_PIXEL_MODE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* FT_PIXEL_MODE_MONO :: */ + /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */ + /* are stored in most-significant order (MSB), which means that */ + /* the left-most pixel in a byte has value 128. */ + /* */ + /* FT_PIXEL_MODE_GRAY :: */ + /* An 8-bit bitmap, generally used to represent anti-aliased glyph */ + /* images. Each pixel is stored in one byte. Note that the number */ + /* of `gray' levels is stored in the `num_grays' field of the */ + /* @FT_Bitmap structure (it generally is 256). */ + /* */ + /* FT_PIXEL_MODE_GRAY2 :: */ + /* A 2-bit per pixel bitmap, used to represent embedded */ + /* anti-aliased bitmaps in font files according to the OpenType */ + /* specification. We haven't found a single font using this */ + /* format, however. */ + /* */ + /* FT_PIXEL_MODE_GRAY4 :: */ + /* A 4-bit per pixel bitmap, representing embedded anti-aliased */ + /* bitmaps in font files according to the OpenType specification. */ + /* We haven't found a single font using this format, however. */ + /* */ + /* FT_PIXEL_MODE_LCD :: */ + /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ + /* used for display on LCD displays; the bitmap is three times */ + /* wider than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD. */ + /* */ + /* FT_PIXEL_MODE_LCD_V :: */ + /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */ + /* used for display on rotated LCD displays; the bitmap is three */ + /* times taller than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD_V. */ + /* */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_pixel_mode_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Pixel_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */ + /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */ + /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */ + /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */ + /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */ + /* */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + /* */ + +#if 0 + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Palette_Mode */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */ + /* */ + /* An enumeration type to describe the format of a bitmap palette, */ + /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */ + /* */ + /* <Values> */ + /* ft_palette_mode_rgb :: The palette is an array of 3-byte RGB */ + /* records. */ + /* */ + /* ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA */ + /* records. */ + /* */ + /* <Note> */ + /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */ + /* FreeType, these types are not handled by the library itself. */ + /* */ + typedef enum FT_Palette_Mode_ + { + ft_palette_mode_rgb = 0, + ft_palette_mode_rgba, + + ft_palette_mode_max /* do not remove */ + + } FT_Palette_Mode; + + /* */ + +#endif + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap */ + /* */ + /* <Description> */ + /* A structure used to describe a bitmap or pixmap to the raster. */ + /* Note that we now manage pixmaps of various depths through the */ + /* `pixel_mode' field. */ + /* */ + /* <Fields> */ + /* rows :: The number of bitmap rows. */ + /* */ + /* width :: The number of pixels in bitmap row. */ + /* */ + /* pitch :: The pitch's absolute value is the number of bytes */ + /* taken by one bitmap row, including padding. */ + /* However, the pitch is positive when the bitmap has */ + /* a `down' flow, and negative when it has an `up' */ + /* flow. In all cases, the pitch is an offset to add */ + /* to a bitmap pointer in order to go down one row. */ + /* */ + /* For the B/W rasterizer, `pitch' is always an even */ + /* number. */ + /* */ + /* buffer :: A typeless pointer to the bitmap buffer. This */ + /* value should be aligned on 32-bit boundaries in */ + /* most cases. */ + /* */ + /* num_grays :: This field is only used with */ + /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */ + /* levels used in the bitmap. */ + /* */ + /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */ + /* See @FT_Pixel_Mode for possible values. */ + /* */ + /* palette_mode :: This field is intended for paletted pixel modes; */ + /* it indicates how the palette is stored. Not */ + /* used currently. */ + /* */ + /* palette :: A typeless pointer to the bitmap palette; this */ + /* field is intended for paletted pixel modes. Not */ + /* used currently. */ + /* */ + /* <Note> */ + /* For now, the only pixel modes supported by FreeType are mono and */ + /* grays. However, drivers might be added in the future to support */ + /* more `colorful' options. */ + /* */ + typedef struct FT_Bitmap_ + { + int rows; + int width; + int pitch; + unsigned char* buffer; + short num_grays; + char pixel_mode; + char palette_mode; + void* palette; + + } FT_Bitmap; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline */ + /* */ + /* <Description> */ + /* This structure is used to describe an outline to the scan-line */ + /* converter. */ + /* */ + /* <Fields> */ + /* n_contours :: The number of contours in the outline. */ + /* */ + /* n_points :: The number of points in the outline. */ + /* */ + /* points :: A pointer to an array of `n_points' @FT_Vector */ + /* elements, giving the outline's point coordinates. */ + /* */ + /* tags :: A pointer to an array of `n_points' chars, giving */ + /* each outline point's type. */ + /* */ + /* If bit~0 is unset, the point is `off' the curve, */ + /* i.e., a Bézier control point, while it is `on' if */ + /* set. */ + /* */ + /* Bit~1 is meaningful for `off' points only. If set, */ + /* it indicates a third-order Bézier arc control point; */ + /* and a second-order control point if unset. */ + /* */ + /* If bit~2 is set, bits 5-7 contain the drop-out mode */ + /* (as defined in the OpenType specification; the value */ + /* is the same as the argument to the SCANMODE */ + /* instruction). */ + /* */ + /* Bits 3 and~4 are reserved for internal purposes. */ + /* */ + /* contours :: An array of `n_contours' shorts, giving the end */ + /* point of each contour within the outline. For */ + /* example, the first contour is defined by the points */ + /* `0' to `contours[0]', the second one is defined by */ + /* the points `contours[0]+1' to `contours[1]', etc. */ + /* */ + /* flags :: A set of bit flags used to characterize the outline */ + /* and give hints to the scan-converter and hinter on */ + /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */ + /* */ + /* <Note> */ + /* The B/W rasterizer only checks bit~2 in the `tags' array for the */ + /* first point of each contour. The drop-out mode as given with */ + /* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and */ + /* @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden. */ + /* */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + /* Following limits must be consistent with */ + /* FT_Outline.{n_contours,n_points} */ +#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX +#define FT_OUTLINE_POINTS_MAX SHRT_MAX + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OUTLINE_FLAGS */ + /* */ + /* <Description> */ + /* A list of bit-field constants use for the flags in an outline's */ + /* `flags' field. */ + /* */ + /* <Values> */ + /* FT_OUTLINE_NONE :: */ + /* Value~0 is reserved. */ + /* */ + /* FT_OUTLINE_OWNER :: */ + /* If set, this flag indicates that the outline's field arrays */ + /* (i.e., `points', `flags', and `contours') are `owned' by the */ + /* outline object, and should thus be freed when it is destroyed. */ + /* */ + /* FT_OUTLINE_EVEN_ODD_FILL :: */ + /* By default, outlines are filled using the non-zero winding rule. */ + /* If set to 1, the outline will be filled using the even-odd fill */ + /* rule (only works with the smooth rasterizer). */ + /* */ + /* FT_OUTLINE_REVERSE_FILL :: */ + /* By default, outside contours of an outline are oriented in */ + /* clock-wise direction, as defined in the TrueType specification. */ + /* This flag is set if the outline uses the opposite direction */ + /* (typically for Type~1 fonts). This flag is ignored by the scan */ + /* converter. */ + /* */ + /* FT_OUTLINE_IGNORE_DROPOUTS :: */ + /* By default, the scan converter will try to detect drop-outs in */ + /* an outline and correct the glyph bitmap to ensure consistent */ + /* shape continuity. If set, this flag hints the scan-line */ + /* converter to ignore such cases. See below for more information. */ + /* */ + /* FT_OUTLINE_SMART_DROPOUTS :: */ + /* Select smart dropout control. If unset, use simple dropout */ + /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See */ + /* below for more information. */ + /* */ + /* FT_OUTLINE_INCLUDE_STUBS :: */ + /* If set, turn pixels on for `stubs', otherwise exclude them. */ + /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for */ + /* more information. */ + /* */ + /* FT_OUTLINE_HIGH_PRECISION :: */ + /* This flag indicates that the scan-line converter should try to */ + /* convert this outline to bitmaps with the highest possible */ + /* quality. It is typically set for small character sizes. Note */ + /* that this is only a hint that might be completely ignored by a */ + /* given scan-converter. */ + /* */ + /* FT_OUTLINE_SINGLE_PASS :: */ + /* This flag is set to force a given scan-converter to only use a */ + /* single pass over the outline to render a bitmap glyph image. */ + /* Normally, it is set for very large character sizes. It is only */ + /* a hint that might be completely ignored by a given */ + /* scan-converter. */ + /* */ + /* <Note> */ + /* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */ + /* and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth */ + /* rasterizer. */ + /* */ + /* There exists a second mechanism to pass the drop-out mode to the */ + /* B/W rasterizer; see the `tags' field in @FT_Outline. */ + /* */ + /* Please refer to the description of the `SCANTYPE' instruction in */ + /* the OpenType specification (in file `ttinst1.doc') how simple */ + /* drop-outs, smart drop-outs, and stubs are defined. */ + /* */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 +#define FT_OUTLINE_SMART_DROPOUTS 0x10 +#define FT_OUTLINE_INCLUDE_STUBS 0x20 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /************************************************************************* + * + * @enum: + * ft_outline_flags + * + * @description: + * These constants are deprecated. Please use the corresponding + * @FT_OUTLINE_FLAGS values. + * + * @values: + * ft_outline_none :: See @FT_OUTLINE_NONE. + * ft_outline_owner :: See @FT_OUTLINE_OWNER. + * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL. + * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL. + * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS. + * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION. + * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS. + */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 3 ) + +#define FT_CURVE_TAG_ON 1 +#define FT_CURVE_TAG_CONIC 0 +#define FT_CURVE_TAG_CUBIC 2 + +#define FT_CURVE_TAG_HAS_SCANMODE 4 + +#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_MoveToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `move */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `move to' is emitted to start a new contour in an outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `move to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_LineToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `line */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `line to' is emitted to indicate a segment in the outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `line to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_ConicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `conic */ + /* to' function during outline walking or decomposition. */ + /* */ + /* A `conic to' is emitted to indicate a second-order Bézier arc in */ + /* the outline. */ + /* */ + /* <Input> */ + /* control :: An intermediate control point between the last position */ + /* and the new target in `to'. */ + /* */ + /* to :: A pointer to the target end point of the conic arc. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_CubicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `cubic */ + /* to' function during outline walking or decomposition. */ + /* */ + /* A `cubic to' is emitted to indicate a third-order Bézier arc. */ + /* */ + /* <Input> */ + /* control1 :: A pointer to the first Bézier control point. */ + /* */ + /* control2 :: A pointer to the second Bézier control point. */ + /* */ + /* to :: A pointer to the target end point. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline_Funcs */ + /* */ + /* <Description> */ + /* A structure to hold various function pointers used during outline */ + /* decomposition in order to emit segments, conic, and cubic Béziers. */ + /* */ + /* <Fields> */ + /* move_to :: The `move to' emitter. */ + /* */ + /* line_to :: The segment emitter. */ + /* */ + /* conic_to :: The second-order Bézier arc emitter. */ + /* */ + /* cubic_to :: The third-order Bézier arc emitter. */ + /* */ + /* shift :: The shift that is applied to coordinates before they */ + /* are sent to the emitter. */ + /* */ + /* delta :: The delta that is applied to coordinates before they */ + /* are sent to the emitter, but after the shift. */ + /* */ + /* <Note> */ + /* The point coordinates sent to the emitters are the transformed */ + /* version of the original coordinates (this is important for high */ + /* accuracy during scan-conversion). The transformation is simple: */ + /* */ + /* { */ + /* x' = (x << shift) - delta */ + /* y' = (x << shift) - delta */ + /* } */ + /* */ + /* Set the values of `shift' and `delta' to~0 to get the original */ + /* point coordinates. */ + /* */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_IMAGE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags to an unsigned long type. */ + /* */ + /* <Note> */ + /* Since many 16-bit compilers don't like 32-bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_Format */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of a given glyph */ + /* image. Note that this version of FreeType only supports two image */ + /* formats, even though future font drivers will be able to register */ + /* their own format. */ + /* */ + /* <Values> */ + /* FT_GLYPH_FORMAT_NONE :: */ + /* The value~0 is reserved. */ + /* */ + /* FT_GLYPH_FORMAT_COMPOSITE :: */ + /* The glyph image is a composite of several other images. This */ + /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */ + /* report compound glyphs (like accented characters). */ + /* */ + /* FT_GLYPH_FORMAT_BITMAP :: */ + /* The glyph image is a bitmap, and can be described as an */ + /* @FT_Bitmap. You generally need to access the `bitmap' field of */ + /* the @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_OUTLINE :: */ + /* The glyph image is a vectorial outline made of line segments */ + /* and Bézier arcs; it can be described as an @FT_Outline; you */ + /* generally want to access the `outline' field of the */ + /* @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_PLOTTER :: */ + /* The glyph image is a vectorial path with no inside and outside */ + /* contours. Some Type~1 fonts, like those in the Hershey family, */ + /* contain glyphs in this format. These are described as */ + /* @FT_Outline, but FreeType isn't currently capable of rendering */ + /* them correctly. */ + /* */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_format_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Glyph_Format values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */ + /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */ + /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */ + /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */ + /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */ + /* */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* A raster is a scan converter, in charge of rendering an outline into */ + /* a a bitmap. This section contains the public API for rasters. */ + /* */ + /* Note that in FreeType 2, all rasters are now encapsulated within */ + /* specific modules called `renderers'. See `freetype/ftrender.h' for */ + /* more details on renderers. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* raster */ + /* */ + /* <Title> */ + /* Scanline Converter */ + /* */ + /* <Abstract> */ + /* How vectorial outlines are converted into bitmaps and pixmaps. */ + /* */ + /* <Description> */ + /* This section contains technical definitions. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Raster */ + /* */ + /* <Description> */ + /* A handle (pointer) to a raster object. Each object can be used */ + /* independently to convert an outline into a bitmap or pixmap. */ + /* */ + typedef struct FT_RasterRec_* FT_Raster; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Span */ + /* */ + /* <Description> */ + /* A structure used to model a single span of gray (or black) pixels */ + /* when rendering a monochrome or anti-aliased bitmap. */ + /* */ + /* <Fields> */ + /* x :: The span's horizontal start position. */ + /* */ + /* len :: The span's length in pixels. */ + /* */ + /* coverage :: The span color/coverage, ranging from 0 (background) */ + /* to 255 (foreground). Only used for anti-aliased */ + /* rendering. */ + /* */ + /* <Note> */ + /* This structure is used by the span drawing callback type named */ + /* @FT_SpanFunc which takes the y~coordinate of the span as a */ + /* a parameter. */ + /* */ + /* The coverage value is always between 0 and 255. If you want less */ + /* gray values, the callback function has to reduce them. */ + /* */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_SpanFunc */ + /* */ + /* <Description> */ + /* A function used as a call-back by the anti-aliased renderer in */ + /* order to let client applications draw themselves the gray pixel */ + /* spans on each scan line. */ + /* */ + /* <Input> */ + /* y :: The scanline's y~coordinate. */ + /* */ + /* count :: The number of spans to draw on this scanline. */ + /* */ + /* spans :: A table of `count' spans to draw on the scanline. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Note> */ + /* This callback allows client applications to directly render the */ + /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ + /* */ + /* This can be used to write anti-aliased outlines directly to a */ + /* given background bitmap, and even perform translucency. */ + /* */ + /* Note that the `count' field cannot be greater than a fixed value */ + /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */ + /* `ftoption.h'. By default, this value is set to~32, which means */ + /* that if there are more than 32~spans on a given scanline, the */ + /* callback is called several times with the same `y' parameter in */ + /* order to draw all callbacks. */ + /* */ + /* Otherwise, the callback is only called once per scan-line, and */ + /* only for those scanlines that do have `gray' pixels on them. */ + /* */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitTest_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to test whether a given target pixel is already set to the drawing */ + /* `color'. These tests are crucial to implement drop-out control */ + /* per-se the TrueType spec. */ + /* */ + /* <Input> */ + /* y :: The pixel's y~coordinate. */ + /* */ + /* x :: The pixel's x~coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1~if the pixel is `set', 0~otherwise. */ + /* */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitSet_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to set an individual target pixel. This is crucial to implement */ + /* drop-out control according to the TrueType specification. */ + /* */ + /* <Input> */ + /* y :: The pixel's y~coordinate. */ + /* */ + /* x :: The pixel's x~coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1~if the pixel is `set', 0~otherwise. */ + /* */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_RASTER_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flag constants as used in the `flags' field of a */ + /* @FT_Raster_Params structure. */ + /* */ + /* <Values> */ + /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */ + /* */ + /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ + /* anti-aliased glyph image should be */ + /* generated. Otherwise, it will be */ + /* monochrome (1-bit). */ + /* */ + /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ + /* rendering. In this mode, client */ + /* applications must provide their own span */ + /* callback. This lets them directly */ + /* draw or compose over an existing bitmap. */ + /* If this bit is not set, the target */ + /* pixmap's buffer _must_ be zeroed before */ + /* rendering. */ + /* */ + /* Note that for now, direct rendering is */ + /* only possible with anti-aliased glyphs. */ + /* */ + /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ + /* rendering mode. If set, the output will */ + /* be clipped to a box specified in the */ + /* `clip_box' field of the */ + /* @FT_Raster_Params structure. */ + /* */ + /* Note that by default, the glyph bitmap */ + /* is clipped to the target pixmap, except */ + /* in direct rendering mode where all spans */ + /* are generated if no clipping box is set. */ + /* */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 + + /* deprecated */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Params */ + /* */ + /* <Description> */ + /* A structure to hold the arguments used by a raster's render */ + /* function. */ + /* */ + /* <Fields> */ + /* target :: The target bitmap. */ + /* */ + /* source :: A pointer to the source glyph image (e.g., an */ + /* @FT_Outline). */ + /* */ + /* flags :: The rendering flags. */ + /* */ + /* gray_spans :: The gray span drawing callback. */ + /* */ + /* black_spans :: The black span drawing callback. UNIMPLEMENTED! */ + /* */ + /* bit_test :: The bit test callback. UNIMPLEMENTED! */ + /* */ + /* bit_set :: The bit set callback. UNIMPLEMENTED! */ + /* */ + /* user :: User-supplied data that is passed to each drawing */ + /* callback. */ + /* */ + /* clip_box :: An optional clipping box. It is only used in */ + /* direct rendering mode. Note that coordinates here */ + /* should be expressed in _integer_ pixels (and not in */ + /* 26.6 fixed-point units). */ + /* */ + /* <Note> */ + /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */ + /* bit flag is set in the `flags' field, otherwise a monochrome */ + /* bitmap is generated. */ + /* */ + /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ + /* raster will call the `gray_spans' callback to draw gray pixel */ + /* spans, in the case of an aa glyph bitmap, it will call */ + /* `black_spans', and `bit_test' and `bit_set' in the case of a */ + /* monochrome bitmap. This allows direct composition over a */ + /* pre-existing bitmap through user-provided callbacks to perform the */ + /* span drawing/composition. */ + /* */ + /* Note that the `bit_test' and `bit_set' callbacks are required when */ + /* rendering a monochrome bitmap, as they are crucial to implement */ + /* correct drop-out control as defined in the TrueType specification. */ + /* */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; /* doesn't work! */ + FT_Raster_BitTest_Func bit_test; /* doesn't work! */ + FT_Raster_BitSet_Func bit_set; /* doesn't work! */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_NewFunc */ + /* */ + /* <Description> */ + /* A function used to create a new raster object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory allocator. */ + /* */ + /* <Output> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `memory' parameter is a typeless pointer in order to avoid */ + /* un-wanted dependencies on the rest of the FreeType code. In */ + /* practice, it is an @FT_Memory object, i.e., a handle to the */ + /* standard FreeType memory allocator. However, this field can be */ + /* completely ignored by a given raster implementation. */ + /* */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_DoneFunc */ + /* */ + /* <Description> */ + /* A function used to destroy a given raster object. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_ResetFunc */ + /* */ + /* <Description> */ + /* FreeType provides an area of memory called the `render pool', */ + /* available to all registered rasters. This pool can be freely used */ + /* during a given scan-conversion but is shared by all rasters. Its */ + /* content is thus transient. */ + /* */ + /* This function is called each time the render pool changes, or just */ + /* after a new raster object is created. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* pool_base :: The address in memory of the render pool. */ + /* */ + /* pool_size :: The size in bytes of the render pool. */ + /* */ + /* <Note> */ + /* Rasters can ignore the render pool and rely on dynamic memory */ + /* allocation if they want to (a handle to the memory allocator is */ + /* passed to the raster constructor). However, this is not */ + /* recommended for efficiency purposes. */ + /* */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_SetModeFunc */ + /* */ + /* <Description> */ + /* This function is a generic facility to change modes or attributes */ + /* in a given raster. This can be used for debugging purposes, or */ + /* simply to allow implementation-specific `features' in a given */ + /* raster module. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* mode :: A 4-byte tag used to name the mode or property. */ + /* */ + /* args :: A pointer to the new mode/property to use. */ + /* */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_RenderFunc */ + /* */ + /* <Description> */ + /* Invoke a given raster to scan-convert a given glyph image into a */ + /* target bitmap. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* store the rendering parameters. */ + /* */ + /* <Return> */ + /* Error code. 0~means success. */ + /* */ + /* <Note> */ + /* The exact format of the source image depends on the raster's glyph */ + /* format defined in its @FT_Raster_Funcs structure. It can be an */ + /* @FT_Outline or anything else in order to support a large array of */ + /* glyph formats. */ + /* */ + /* Note also that the render function can fail and return a */ + /* `FT_Err_Unimplemented_Feature' error code if the raster used does */ + /* not support direct composition. */ + /* */ + /* XXX: For now, the standard raster doesn't support direct */ + /* composition but this should change for the final release (see */ + /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */ + /* for examples of distinct implementations which support direct */ + /* composition). */ + /* */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Funcs */ + /* */ + /* <Description> */ + /* A structure used to describe a given raster class to the library. */ + /* */ + /* <Fields> */ + /* glyph_format :: The supported glyph format for this raster. */ + /* */ + /* raster_new :: The raster constructor. */ + /* */ + /* raster_reset :: Used to reset the render pool within the raster. */ + /* */ + /* raster_render :: A function to render a glyph into a given bitmap. */ + /* */ + /* raster_done :: The raster destructor. */ + /* */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTIMAGE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftincrem.h b/alienblaster/project/jni/freetype/include/freetype/ftincrem.h new file mode 100644 index 000000000..aaf689ff1 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftincrem.h @@ -0,0 +1,353 @@ +/***************************************************************************/ +/* */ +/* ftincrem.h */ +/* */ +/* FreeType incremental loading (specification). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTINCREM_H__ +#define __FTINCREM_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * `incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application, + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a PostScript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /*************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * `incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., PostScript interpreters), + * where the glyph data isn't in the font file, or must be overridden by + * different values. + * + * @note: + * It is up to client applications to create and implement @FT_Incremental + * objects, as long as they provide implementations for the methods + * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc + * and @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + * + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_MetricsRec + * + * @description: + * A small structure used to contain the basic glyph metrics returned + * by the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Horizontal component of glyph advance, in font units. + * + * advance_v :: + * Vertical component of glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical' argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + * + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + FT_Long advance_v; /* since 2.3.12 */ + + } FT_Incremental_MetricsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A handle to an @FT_Incremental_MetricsRec structure. + * + */ + typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the `glyf' table. For PostScript formats, it must correspond to the + * *unencrypted* charstring bytes, without any `lenIV' header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release + * the data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + * + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This is necessary because, in certain + * formats like TrueType, the metrics are stored in a different place from + * the glyph images proper. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. + * The original glyph metrics, if any, in font units. If metrics are + * not available all the values must be set to zero. + * + * @output: + * ametrics :: + * The replacement glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data + * incrementally. Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does + * not provide overriding glyph metrics. + * + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * { + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * } + * + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * A constant used as the tag of @FT_Parameter structures to indicate + * an incremental loading object to be used by FreeType. + * + */ +#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + /* */ + +FT_END_HEADER + +#endif /* __FTINCREM_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftlcdfil.h b/alienblaster/project/jni/freetype/include/freetype/ftlcdfil.h new file mode 100644 index 000000000..c6201b38e --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftlcdfil.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.h */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs */ +/* (specification). */ +/* */ +/* Copyright 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_LCD_FILTER_H__ +#define __FT_LCD_FILTER_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * lcd_filtering + * + * @title: + * LCD Filtering + * + * @abstract: + * Reduce color fringes of LCD-optimized bitmaps. + * + * @description: + * The @FT_Library_SetLcdFilter API can be used to specify a low-pass + * filter which is then applied to LCD-optimized bitmaps generated + * through @FT_Render_Glyph. This is useful to reduce color fringes + * which would occur with unfiltered rendering. + * + * Note that no filter is active by default, and that this function is + * *not* implemented in default builds of the library. You need to + * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file + * in order to activate it. + */ + + + /**************************************************************************** + * + * @func: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * The default filter reduces color fringes considerably, at the cost + * of a slight blurriness in the output. + * + * FT_LCD_FILTER_LIGHT :: + * The light filter is a variant that produces less blurriness at the + * cost of slightly more color fringes than the default one. It might + * be better, depending on taste, your monitor, or your personal vision. + * + * FT_LCD_FILTER_LEGACY :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * In other words, it only works well if the TrueType bytecode + * interpreter is enabled *and* high-quality hinted fonts are used. + * + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. + * + * @since: + * 2.3.0 + */ + typedef enum FT_LcdFilter_ + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @func: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to apply color filtering to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work + * well on most LCD screens. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This feature is always disabled by default. Clients must make an + * explicit call to this function with a `filter' value other than + * @FT_LCD_FILTER_NONE in order to enable it. + * + * Due to *PATENTS* covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature' if the + * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * The filter affects glyph bitmaps rendered through @FT_Render_Glyph, + * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char. + * + * It does _not_ affect the output of @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * If this feature is activated, the dimensions of LCD glyph bitmaps are + * either larger or taller than the dimensions of the corresponding + * outline with regards to the pixel grid. For example, for + * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and + * up to 3~pixels to the right. + * + * The bitmap offset values are adjusted correctly, so clients shouldn't + * need to modify their layout and glyph positioning code when enabling + * the filter. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + /* */ + + +FT_END_HEADER + +#endif /* __FT_LCD_FILTER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftlist.h b/alienblaster/project/jni/freetype/include/freetype/ftlist.h new file mode 100644 index 000000000..93b05fc0d --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftlist.h @@ -0,0 +1,273 @@ +/***************************************************************************/ +/* */ +/* ftlist.h */ +/* */ +/* Generic list support for FreeType (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file implements functions relative to list processing. Its */ + /* data structures are defined in `freetype.h'. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTLIST_H__ +#define __FTLIST_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /* <Title> */ + /* List Processing */ + /* */ + /* <Abstract> */ + /* Simple management of lists. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to list */ + /* processing using doubly-linked nodes. */ + /* */ + /* <Order> */ + /* FT_List */ + /* FT_ListNode */ + /* FT_ListRec */ + /* FT_ListNodeRec */ + /* */ + /* FT_List_Add */ + /* FT_List_Insert */ + /* FT_List_Find */ + /* FT_List_Remove */ + /* FT_List_Up */ + /* FT_List_Iterate */ + /* FT_List_Iterator */ + /* FT_List_Finalize */ + /* FT_List_Destructor */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Find */ + /* */ + /* <Description> */ + /* Find the list node for a given listed object. */ + /* */ + /* <Input> */ + /* list :: A pointer to the parent list. */ + /* data :: The address of the listed object. */ + /* */ + /* <Return> */ + /* List node. NULL if it wasn't found. */ + /* */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Add */ + /* */ + /* <Description> */ + /* Append an element to the end of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to append. */ + /* */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Insert */ + /* */ + /* <Description> */ + /* Insert an element at the head of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to parent list. */ + /* node :: The node to insert. */ + /* */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Remove */ + /* */ + /* <Description> */ + /* Remove a node from a list. This function doesn't check whether */ + /* the node is in the list! */ + /* */ + /* <Input> */ + /* node :: The node to remove. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Up */ + /* */ + /* <Description> */ + /* Move a node to the head/top of a list. Used to maintain LRU */ + /* lists. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to move. */ + /* */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Iterator */ + /* */ + /* <Description> */ + /* An FT_List iterator function which is called during a list parse */ + /* by @FT_List_Iterate. */ + /* */ + /* <Input> */ + /* node :: The current iteration list node. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. */ + /* Can be used to point to the iteration's state. */ + /* */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Iterate */ + /* */ + /* <Description> */ + /* Parse a list and calls a given iterator function on each element. */ + /* Note that parsing is stopped as soon as one of the iterator calls */ + /* returns a non-zero value. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* iterator :: An iterator function, called on each node of the list. */ + /* user :: A user-supplied field which is passed as the second */ + /* argument to the iterator. */ + /* */ + /* <Return> */ + /* The result (a FreeType error code) of the last iterator call. */ + /* */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Destructor */ + /* */ + /* <Description> */ + /* An @FT_List iterator function which is called during a list */ + /* finalization by @FT_List_Finalize to destroy all elements in a */ + /* given list. */ + /* */ + /* <Input> */ + /* system :: The current system object. */ + /* */ + /* data :: The current object to destroy. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. It can */ + /* be used to point to the iteration's state. */ + /* */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Finalize */ + /* */ + /* <Description> */ + /* Destroy all elements in the list as well as the list itself. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* */ + /* destroy :: A list destructor that will be applied to each element */ + /* of the list. */ + /* */ + /* memory :: The current memory object which handles deallocation. */ + /* */ + /* user :: A user-supplied field which is passed as the last */ + /* argument to the destructor. */ + /* */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTLIST_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftlzw.h b/alienblaster/project/jni/freetype/include/freetype/ftlzw.h new file mode 100644 index 000000000..00d40169a --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftlzw.h @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* ftlzw.h */ +/* */ +/* LZW-compressed stream support. */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTLZW_H__ +#define __FTLZW_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* lzw */ + /* */ + /* <Title> */ + /* LZW Streams */ + /* */ + /* <Abstract> */ + /* Using LZW-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of LZW-specific functions. */ + /* */ + /*************************************************************************/ + + /************************************************************************ + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is + * mainly used to support the compressed `*.pcf.Z' fonts that come + * with XFree86. + * + * @input: + * stream :: The target embedding stream. + * + * source :: The source stream. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream + * + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it + * and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTLZW_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftmac.h b/alienblaster/project/jni/freetype/include/freetype/ftmac.h new file mode 100644 index 000000000..ab5bab517 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftmac.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftmac.h */ +/* */ +/* Additional Mac-specific API. */ +/* */ +/* Copyright 1996-2001, 2004, 2006, 2007 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* NOTE: Include this file after <freetype/freetype.h> and after any */ +/* Mac-specific headers (because this header uses Mac types such as */ +/* Handle, FSSpec, FSRef, etc.) */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMAC_H__ +#define __FTMAC_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + +/* gcc-3.4.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined(__GNUC__) && \ + ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) +#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated)) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* mac_specific */ + /* */ + /* <Title> */ + /* Mac Specific Interface */ + /* */ + /* <Abstract> */ + /* Only available on the Macintosh. */ + /* */ + /* <Description> */ + /* The following definitions are only available if FreeType is */ + /* compiled on a Macintosh. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FOND */ + /* */ + /* <Description> */ + /* Create a new face object from a FOND resource. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* fond :: A FOND resource. */ + /* */ + /* face_index :: Only supported for the -1 `sanity check' special */ + /* case. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Notes> */ + /* This function can be used to create @FT_Face objects from fonts */ + /* that are installed in the system as follows. */ + /* */ + /* { */ + /* fond = GetResource( 'FOND', fontName ); */ + /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font (e.g., Times New Roman */ + /* Bold). */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFilePath_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return a pathname of the disk file and face index for given font */ + /* name which is handled by ATS framework. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* path :: Buffer to store pathname of the file. For passing */ + /* to @FT_New_Face. The client must allocate this */ + /* buffer before calling this function. */ + /* */ + /* maxPathSize :: Lengths of the buffer `path' that client allocated. */ + /* */ + /* face_index :: Index of the face. For passing to @FT_New_Face. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSSpec to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSSpec to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index~0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */ + /* it accepts an FSSpec instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSRef */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSRef to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSRef to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index~0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */ + /* it accepts an FSRef instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* __FTMAC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftmm.h b/alienblaster/project/jni/freetype/include/freetype/ftmm.h new file mode 100644 index 000000000..3aefb9e4f --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftmm.h @@ -0,0 +1,378 @@ +/***************************************************************************/ +/* */ +/* ftmm.h */ +/* */ +/* FreeType Multiple Master font interface (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMM_H__ +#define __FTMM_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* multiple_masters */ + /* */ + /* <Title> */ + /* Multiple Masters */ + /* */ + /* <Abstract> */ + /* How to manage Multiple Masters fonts. */ + /* */ + /* <Description> */ + /* The following types and functions are used to manage Multiple */ + /* Master fonts, i.e., the selection of specific design instances by */ + /* setting design axis coordinates. */ + /* */ + /* George Williams has extended this interface to make it work with */ + /* both Type~1 Multiple Masters fonts and GX distortable (var) */ + /* fonts. Some of these routines only work with MM fonts, others */ + /* will work with both types. They are similar enough that a */ + /* consistent interface makes sense. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters fonts. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Multi_Master */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* font. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* num_axis :: Number of axes. Cannot exceed~4. */ + /* */ + /* num_designs :: Number of designs; should be normally 2^num_axis */ + /* even though the Type~1 specification strangely */ + /* allows for intermediate designs to be present. This */ + /* number cannot exceed~16. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters and GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* Not always meaningful for GX. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* def :: The axis's default design coordinate. */ + /* FreeType computes meaningful default values for MM; it */ + /* is then an integer value, not in 16.16 format. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + /* tag :: The axis's tag (the GX equivalent to `name'). */ + /* FreeType provides default values for MM if possible. */ + /* */ + /* strid :: The entry in `name' table (another GX version of */ + /* `name'). */ + /* Not meaningful for MM. */ + /* */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Named_Style */ + /* */ + /* <Description> */ + /* A simple structure used to model a named style in a GX var font. */ + /* */ + /* This structure can't be used for MM fonts. */ + /* */ + /* <Fields> */ + /* coords :: The design coordinates for this style. */ + /* This is an array with one entry for each axis. */ + /* */ + /* strid :: The entry in `name' table identifying this style. */ + /* */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + + } FT_Var_Named_Style; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Var */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* or GX var distortable font. */ + /* */ + /* Some fields are specific to one format and not to the other. */ + /* */ + /* <Fields> */ + /* num_axis :: The number of axes. The maximum value is~4 for */ + /* MM; no limit in GX. */ + /* */ + /* num_designs :: The number of designs; should be normally */ + /* 2^num_axis for MM fonts. Not meaningful for GX */ + /* (where every glyph could have a different */ + /* number of designs). */ + /* */ + /* num_namedstyles :: The number of named styles; only meaningful for */ + /* GX which allows certain design coordinates to */ + /* have a string ID (in the `name' table) */ + /* associated with them. The font can tell the */ + /* user that, for example, Weight=1.5 is `Bold'. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* GX fonts contain slightly more data than MM. */ + /* */ + /* namedstyles :: A table of named styles. */ + /* Only meaningful with GX. */ + /* */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Multi_Master */ + /* */ + /* <Description> */ + /* Retrieve the Multiple Master descriptor of a given font. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_MM_Var */ + /* */ + /* <Description> */ + /* Retrieve the Multiple Master/GX var descriptor of a given font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters/GX var descriptor. */ + /* Allocates a data structure, which the user must free */ + /* (a single call to FT_FREE will do it). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters fonts, choose an interpolated font design */ + /* through design coordinates. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Master or GX Var fonts, choose an interpolated font */ + /* design through design coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Blend_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters and GX var fonts, choose an interpolated font */ + /* design through normalized blend coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: The design coordinates array (each element must be */ + /* between 0 and 1.0). */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Blend_Coordinates */ + /* */ + /* <Description> */ + /* This is another name of @FT_Set_MM_Blend_Coordinates. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMM_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftmodapi.h b/alienblaster/project/jni/freetype/include/freetype/ftmodapi.h new file mode 100644 index 000000000..3c9b876df --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftmodapi.h @@ -0,0 +1,445 @@ +/***************************************************************************/ +/* */ +/* ftmodapi.h */ +/* */ +/* FreeType modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMODAPI_H__ +#define __FTMODAPI_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /* <Title> */ + /* Module Management */ + /* */ + /* <Abstract> */ + /* How to add, upgrade, and remove modules from FreeType. */ + /* */ + /* <Description> */ + /* The definitions below are used to manage modules within FreeType. */ + /* Modules can be added, upgraded, and removed at runtime. */ + /* */ + /*************************************************************************/ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER + + + typedef FT_Pointer FT_Module_Interface; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Constructor */ + /* */ + /* <Description> */ + /* A function used to initialize (not create) a new module object. */ + /* */ + /* <Input> */ + /* module :: The module to initialize. */ + /* */ + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Destructor */ + /* */ + /* <Description> */ + /* A function used to finalize (not destroy) a given module object. */ + /* */ + /* <Input> */ + /* module :: The module to finalize. */ + /* */ + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Requester */ + /* */ + /* <Description> */ + /* A function used to query a given module for a specific interface. */ + /* */ + /* <Input> */ + /* module :: The module to finalize. */ + /* */ + /* name :: The name of the interface in the module. */ + /* */ + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Module_Class */ + /* */ + /* <Description> */ + /* The module class descriptor. */ + /* */ + /* <Fields> */ + /* module_flags :: Bit flags describing the module. */ + /* */ + /* module_size :: The size of one module object/instance in */ + /* bytes. */ + /* */ + /* module_name :: The name of the module. */ + /* */ + /* module_version :: The version, as a 16.16 fixed number */ + /* (major.minor). */ + /* */ + /* module_requires :: The version of FreeType this module requires, */ + /* as a 16.16 fixed number (major.minor). Starts */ + /* at version 2.0, i.e., 0x20000. */ + /* */ + /* module_init :: The initializing function. */ + /* */ + /* module_done :: The finalizing function. */ + /* */ + /* get_interface :: The interface requesting function. */ + /* */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Module */ + /* */ + /* <Description> */ + /* Add a new module to a given library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* clazz :: A pointer to class descriptor for the module. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module */ + /* */ + /* <Description> */ + /* Find a module by its name. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module handle. 0~if none was found. */ + /* */ + /* <Note> */ + /* FreeType's internal modules aren't documented very well, and you */ + /* should look up the source code for details. */ + /* */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Remove_Module */ + /* */ + /* <Description> */ + /* Remove a given module from a library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to a library object. */ + /* */ + /* <Input> */ + /* module :: A handle to a module object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The module object is destroyed by the function in case of success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Library */ + /* */ + /* <Description> */ + /* This function is used to create a new FreeType library instance */ + /* from a given memory object. It is thus possible to use libraries */ + /* with distinct memory allocators within the same program. */ + /* */ + /* Normally, you would call this function (followed by a call to */ + /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */ + /* instead of @FT_Init_FreeType to initialize the FreeType library. */ + /* */ + /* <Input> */ + /* memory :: A handle to the original memory object. */ + /* */ + /* <Output> */ + /* alibrary :: A pointer to handle of a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Library */ + /* */ + /* <Description> */ + /* Discard a given library object. This closes all drivers and */ + /* discards all resource objects. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + +/* */ + + typedef void + (*FT_DebugHook_Func)( void* arg ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Debug_Hook */ + /* */ + /* <Description> */ + /* Set a debug hook function for debugging the interpreter of a font */ + /* format. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* hook_index :: The index of the debug hook. You should use the */ + /* values defined in `ftobjs.h', e.g., */ + /* `FT_DEBUG_HOOK_TRUETYPE'. */ + /* */ + /* debug_hook :: The function used to debug the interpreter. */ + /* */ + /* <Note> */ + /* Currently, four debug hook slots are available, but only two (for */ + /* the TrueType and the Type~1 interpreter) are defined. */ + /* */ + /* Since the internal headers of FreeType are no longer installed, */ + /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */ + /* This is a bug and will be fixed in a forthcoming release. */ + /* */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Default_Modules */ + /* */ + /* <Description> */ + /* Add the set of default drivers to a given library object. */ + /* This is only useful when you create a library object with */ + /* @FT_New_Library (usually to plug a custom memory manager). */ + /* */ + /* <InOut> */ + /* library :: A handle to a new library object. */ + /* */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode + * engine is implemented in a given FT_Library instance. It is used + * by the @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * The library implements a bytecode interpreter that doesn't + * support the patented operations of the TrueType virtual machine. + * + * Its main use is to load certain Asian fonts which position and + * scale glyph components with bytecode instructions. It produces + * bad output for most other fonts. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers + * the full instruction set of the TrueType virtual machine. + * See the file `docs/PATENTS' for legal aspects. + * + * @since: + * 2.2 + * + */ + typedef enum FT_TrueTypeEngineType_ + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @func: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return an @FT_TrueTypeEngineType value to indicate which level of + * the TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMODAPI_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftmoderr.h b/alienblaster/project/jni/freetype/include/freetype/ftmoderr.h new file mode 100644 index 000000000..b0115dd0d --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftmoderr.h @@ -0,0 +1,155 @@ +/***************************************************************************/ +/* */ +/* ftmoderr.h */ +/* */ +/* FreeType module error offsets (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the FreeType module error offsets. */ + /* */ + /* The lower byte gives the error code, the higher byte gives the */ + /* module. The base module has error offset 0. For example, the error */ + /* `FT_Err_Invalid_File_Format' has value 0x003, the error */ + /* `TT_Err_Invalid_File_Format' has value 0x1103, the error */ + /* `T1_Err_Invalid_File_Format' has value 0x1203, etc. */ + /* */ + /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h */ + /* to make the higher byte always zero (disabling the module error */ + /* mechanism). */ + /* */ + /* It can also be used to create a module error message table easily */ + /* with something like */ + /* */ + /* { */ + /* #undef __FTMODERR_H__ */ + /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */ + /* #define FT_MODERR_START_LIST { */ + /* #define FT_MODERR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int mod_err_offset; */ + /* const char* mod_err_msg */ + /* } ft_mod_errors[] = */ + /* */ + /* #include FT_MODULE_ERRORS_H */ + /* } */ + /* */ + /* To use such a table, all errors must be ANDed with 0xFF00 to remove */ + /* the error code. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTMODERR_H__ +#define __FTMODERR_H__ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Cache, 0x300, "cache module" ) + FT_MODERRDEF( CFF, 0x400, "CFF module" ) + FT_MODERRDEF( CID, 0x500, "CID module" ) + FT_MODERRDEF( Gzip, 0x600, "Gzip module" ) + FT_MODERRDEF( LZW, 0x700, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x800, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0x900, "PCF module" ) + FT_MODERRDEF( PFR, 0xA00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xB00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xC00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xD00, "PS names module" ) + FT_MODERRDEF( Raster, 0xE00, "raster module" ) + FT_MODERRDEF( SFNT, 0xF00, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1000, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1100, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1200, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1300, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1400, "Windows FON/FNT module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* __FTMODERR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftotval.h b/alienblaster/project/jni/freetype/include/freetype/ftotval.h new file mode 100644 index 000000000..027f2e886 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftotval.h @@ -0,0 +1,203 @@ +/***************************************************************************/ +/* */ +/* ftotval.h */ +/* */ +/* FreeType API for validating OpenType tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* */ +/* Warning: This module might be moved to a different library in the */ +/* future to avoid a tight dependency between FreeType and the */ +/* OpenType specification. */ +/* */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOTVAL_H__ +#define __FTOTVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* ot_validation */ + /* */ + /* <Title> */ + /* OpenType Validation */ + /* */ + /* <Abstract> */ + /* An API to validate OpenType tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_MATH :: + * Validate MATH table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 +#define FT_VALIDATE_MATH 0x2000 + +#define FT_VALIDATE_OT FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF | \ + FT_VALIDATE_MATH + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A NULL value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOTVAL_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftoutln.h b/alienblaster/project/jni/freetype/include/freetype/ftoutln.h new file mode 100644 index 000000000..2829a05ca --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftoutln.h @@ -0,0 +1,537 @@ +/***************************************************************************/ +/* */ +/* ftoutln.h */ +/* */ +/* Support for the FT_Outline type used to store glyph shapes of */ +/* most scalable font formats (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOUTLN_H__ +#define __FTOUTLN_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /* <Title> */ + /* Outline Processing */ + /* */ + /* <Abstract> */ + /* Functions to create, transform, and render vectorial glyph images. */ + /* */ + /* <Description> */ + /* This section contains routines used to create and destroy scalable */ + /* glyph images known as `outlines'. These can also be measured, */ + /* transformed, and converted into bitmaps and pixmaps. */ + /* */ + /* <Order> */ + /* FT_Outline */ + /* FT_OUTLINE_FLAGS */ + /* FT_Outline_New */ + /* FT_Outline_Done */ + /* FT_Outline_Copy */ + /* FT_Outline_Translate */ + /* FT_Outline_Transform */ + /* FT_Outline_Embolden */ + /* FT_Outline_Reverse */ + /* FT_Outline_Check */ + /* */ + /* FT_Outline_Get_CBox */ + /* FT_Outline_Get_BBox */ + /* */ + /* FT_Outline_Get_Bitmap */ + /* FT_Outline_Render */ + /* */ + /* FT_Outline_Decompose */ + /* FT_Outline_Funcs */ + /* FT_Outline_MoveTo_Func */ + /* FT_Outline_LineTo_Func */ + /* FT_Outline_ConicTo_Func */ + /* FT_Outline_CubicTo_Func */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Decompose */ + /* */ + /* <Description> */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function also emits `move to' */ + /* operations to indicate the start of new contours in the outline. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* <InOut> */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_New */ + /* */ + /* <Description> */ + /* Create a new outline of a given size. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object from where the */ + /* outline is allocated. Note however that the new */ + /* outline will *not* necessarily be *freed*, when */ + /* destroying the library, by @FT_Done_FreeType. */ + /* */ + /* numPoints :: The maximal number of points within the outline. */ + /* */ + /* numContours :: The maximal number of contours within the outline. */ + /* */ + /* <Output> */ + /* anoutline :: A handle to the new outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' parameter is simply */ + /* to use the library's memory allocator. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Done */ + /* */ + /* <Description> */ + /* Destroy an outline created with @FT_Outline_New. */ + /* */ + /* <Input> */ + /* library :: A handle of the library object used to allocate the */ + /* outline. */ + /* */ + /* outline :: A pointer to the outline object to be discarded. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If the outline's `owner' field is not set, only the outline */ + /* descriptor will be released. */ + /* */ + /* The reason why this function takes an `library' parameter is */ + /* simply to use ft_mem_free(). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Check */ + /* */ + /* <Description> */ + /* Check the contents of an outline descriptor. */ + /* */ + /* <Input> */ + /* outline :: A handle to a source outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_CBox */ + /* */ + /* <Description> */ + /* Return an outline's `control box'. The control box encloses all */ + /* the outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <Output> */ + /* acbox :: The outline's control box. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Translate */ + /* */ + /* <Description> */ + /* Apply a simple translation to the points of an outline. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* xOffset :: The horizontal offset. */ + /* */ + /* yOffset :: The vertical offset. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Copy */ + /* */ + /* <Description> */ + /* Copy an outline into another one. Both objects must have the */ + /* same sizes (number of points & number of contours) when this */ + /* function is called. */ + /* */ + /* <Input> */ + /* source :: A handle to the source outline. */ + /* */ + /* <Output> */ + /* target :: A handle to the target outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Transform */ + /* */ + /* <Description> */ + /* Apply a simple 2x2 matrix to all of an outline's points. Useful */ + /* for applying rotations, slanting, flipping, etc. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation matrix. */ + /* */ + /* <Note> */ + /* You can use @FT_Outline_Translate if you need to translate the */ + /* outline's points. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Embolden */ + /* */ + /* <Description> */ + /* Embolden an outline. The new outline will be at most 4~times */ + /* `strength' pixels wider and higher. You may think of the left and */ + /* bottom borders as unchanged. */ + /* */ + /* Negative `strength' values to reduce the outline thickness are */ + /* possible also. */ + /* */ + /* <InOut> */ + /* outline :: A handle to the target outline. */ + /* */ + /* <Input> */ + /* strength :: How strong the glyph is emboldened. Expressed in */ + /* 26.6 pixel format. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The used algorithm to increase or decrease the thickness of the */ + /* glyph doesn't change the number of points; this means that certain */ + /* situations like acute angles or intersections are sometimes */ + /* handled incorrectly. */ + /* */ + /* If you need `better' metrics values you should call */ + /* @FT_Outline_Get_CBox ot @FT_Outline_Get_BBox. */ + /* */ + /* Example call: */ + /* */ + /* { */ + /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */ + /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */ + /* FT_Outline_Embolden( &face->slot->outline, strength ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Reverse */ + /* */ + /* <Description> */ + /* Reverse the drawing direction of an outline. This is used to */ + /* ensure consistent fill conventions for mirrored glyphs. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Note> */ + /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */ + /* the outline's `flags' field. */ + /* */ + /* It shouldn't be used by a normal client application, unless it */ + /* knows what it is doing. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_Bitmap */ + /* */ + /* <Description> */ + /* Render an outline within a bitmap. The outline's image is simply */ + /* OR-ed to the target bitmap. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the target bitmap descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* This function does NOT CREATE the bitmap, it only renders an */ + /* outline image within the one you pass to it! Consequently, the */ + /* various fields in `abitmap' should be set accordingly. */ + /* */ + /* It will use the raster corresponding to the default glyph format. */ + /* */ + /* The value of the `num_grays' field in `abitmap' is ignored. If */ + /* you select the gray-level rasterizer, and you want less than 256 */ + /* gray levels, you have to use @FT_Outline_Render directly. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Render */ + /* */ + /* <Description> */ + /* Render an outline within a bitmap using the current scan-convert. */ + /* This function uses an @FT_Raster_Params structure as an argument, */ + /* allowing advanced features like direct composition, translucency, */ + /* etc. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* describe the rendering operation. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You should know what you are doing and how @FT_Raster_Params works */ + /* to use this function. */ + /* */ + /* The field `params.source' will be set to `outline' before the scan */ + /* converter is called, which means that the value you give to it is */ + /* actually ignored. */ + /* */ + /* The gray-level rasterizer always uses 256 gray levels. If you */ + /* want less gray levels, you have to provide your own span callback. */ + /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */ + /* @FT_Raster_Params structure for more details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and PostScript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must + * be filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the PostScript specification, counter-clockwise contours + * must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in PostScript, everything that is to the left of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum FT_Orientation_ + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its + * fill orientation (see @FT_Orientation). This is done by computing + * the direction of each global horizontal and/or vertical extrema + * within the outline. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOUTLN_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftpfr.h b/alienblaster/project/jni/freetype/include/freetype/ftpfr.h new file mode 100644 index 000000000..0b7b7d427 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftpfr.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftpfr.h */ +/* */ +/* FreeType API for accessing PFR-specific data (specification only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTPFR_H__ +#define __FTPFR_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* pfr_fonts */ + /* */ + /* <Title> */ + /* PFR Fonts */ + /* */ + /* <Abstract> */ + /* PFR/TrueDoc specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of PFR-specific functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed + * in metrics units to device sub-pixels. This is equivalent to + * `face->size->x_scale', but for metrics only. Optional (parameter + * can be NULL). + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale' but for the vertical direction. + * optional (parameter can be NULL). + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: A handle to the input face. + * + * left :: Index of the left glyph. + * + * right :: Index of the right glyph. + * + * @output: + * avector :: A kerning vector. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function always return distances in original PFR metrics + * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED + * mode, which always returns distances converted to outline units. + * + * You can use the value of the `x_scale' and `y_scale' parameters + * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: A handle to the input face. + * + * gindex :: The glyph index. + * + * @output: + * aadvance :: The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics + * to convert the advance to device sub-pixels (i.e., 1/64th of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTPFR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftrender.h b/alienblaster/project/jni/freetype/include/freetype/ftrender.h new file mode 100644 index 000000000..41c31eac4 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftrender.h @@ -0,0 +1,234 @@ +/***************************************************************************/ +/* */ +/* ftrender.h */ +/* */ +/* FreeType renderer modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRENDER_H__ +#define __FTRENDER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /*************************************************************************/ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_UInt mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Renderer_Class */ + /* */ + /* <Description> */ + /* The renderer module class descriptor. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Module_Class fields. */ + /* */ + /* glyph_format :: The glyph image format this renderer handles. */ + /* */ + /* render_glyph :: A method used to render the image that is in a */ + /* given glyph slot into a bitmap. */ + /* */ + /* transform_glyph :: A method used to transform the image that is in */ + /* a given glyph slot. */ + /* */ + /* get_glyph_cbox :: A method used to access the glyph's cbox. */ + /* */ + /* set_mode :: A method used to pass additional parameters. */ + /* */ + /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ + /* This is a pointer to its raster's class. */ + /* */ + /* raster :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */ + /* This is a pointer to the corresponding raster */ + /* object, if any. */ + /* */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Renderer */ + /* */ + /* <Description> */ + /* Retrieve the current renderer for a given glyph format. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* format :: The glyph format. */ + /* */ + /* <Return> */ + /* A renderer handle. 0~if none found. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */ + /* renderer by its name, use @FT_Get_Module. */ + /* */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Renderer */ + /* */ + /* <Description> */ + /* Set the current renderer to use, and set additional mode. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* renderer :: A handle to the renderer object. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* parameters :: Additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* In case of success, the renderer will be used to convert glyph */ + /* images in the renderer's known format into bitmaps. */ + /* */ + /* This doesn't change the current renderer for other formats. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTRENDER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftsizes.h b/alienblaster/project/jni/freetype/include/freetype/ftsizes.h new file mode 100644 index 000000000..3e548cc39 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftsizes.h @@ -0,0 +1,159 @@ +/***************************************************************************/ +/* */ +/* ftsizes.h */ +/* */ +/* FreeType size objects management (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Typical application would normally not need to use these functions. */ + /* However, they have been placed in a public API for the rare cases */ + /* where they are needed. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSIZES_H__ +#define __FTSIZES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sizes_management */ + /* */ + /* <Title> */ + /* Size Management */ + /* */ + /* <Abstract> */ + /* Managing multiple sizes per face. */ + /* */ + /* <Description> */ + /* When creating a new face object (e.g., with @FT_New_Face), an */ + /* @FT_Size object is automatically created and used to store all */ + /* pixel-size dependent information, available in the `face->size' */ + /* field. */ + /* */ + /* It is however possible to create more sizes for a given face, */ + /* mostly in order to manage several character pixel sizes of the */ + /* same font family and style. See @FT_New_Size and @FT_Done_Size. */ + /* */ + /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */ + /* modify the contents of the current `active' size; you thus need */ + /* to use @FT_Activate_Size to change it. */ + /* */ + /* 99% of applications won't need the functions provided here, */ + /* especially if they use the caching sub-system, so be cautious */ + /* when using these. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Size */ + /* */ + /* <Description> */ + /* Create a new size object from a given face object. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* asize :: A handle to a new size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* You need to call @FT_Activate_Size in order to select the new size */ + /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */ + /* @FT_Load_Glyph, @FT_Load_Char, etc. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Size */ + /* */ + /* <Description> */ + /* Discard a given size object. Note that @FT_Done_Face */ + /* automatically discards all size objects allocated with */ + /* @FT_New_Size. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Activate_Size */ + /* */ + /* <Description> */ + /* Even though it is possible to create several size objects for a */ + /* given face (see @FT_New_Size for details), functions like */ + /* @FT_Load_Glyph or @FT_Load_Char only use the one which has been */ + /* activated last to determine the `current character pixel size'. */ + /* */ + /* This function can be used to `activate' a previously created size */ + /* object. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* If `face' is the size's parent face object, this function changes */ + /* the value of `face->size' to the input size handle. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTSIZES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftsnames.h b/alienblaster/project/jni/freetype/include/freetype/ftsnames.h new file mode 100644 index 000000000..485e4e162 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftsnames.h @@ -0,0 +1,200 @@ +/***************************************************************************/ +/* */ +/* ftsnames.h */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (specification). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_SFNT_NAMES_H__ +#define __FT_SFNT_NAMES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sfnt_names */ + /* */ + /* <Title> */ + /* SFNT Names */ + /* */ + /* <Abstract> */ + /* Access the names embedded in TrueType and OpenType files. */ + /* */ + /* <Description> */ + /* The TrueType and OpenType specifications allow the inclusion of */ + /* a special `names table' in font files. This table contains */ + /* textual (and internationalized) information regarding the font, */ + /* like family name, copyright, version, etc. */ + /* */ + /* The definitions below are used to access them if available. */ + /* */ + /* Note that this has nothing to do with glyph names! */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SfntName */ + /* */ + /* <Description> */ + /* A structure used to model an SFNT `name' table entry. */ + /* */ + /* <Fields> */ + /* platform_id :: The platform ID for `string'. */ + /* */ + /* encoding_id :: The encoding ID for `string'. */ + /* */ + /* language_id :: The language ID for `string'. */ + /* */ + /* name_id :: An identifier for `string'. */ + /* */ + /* string :: The `name' string. Note that its format differs */ + /* depending on the (platform,encoding) pair. It can */ + /* be a Pascal String, a UTF-16 one, etc. */ + /* */ + /* Generally speaking, the string is not */ + /* zero-terminated. Please refer to the TrueType */ + /* specification for details. */ + /* */ + /* string_len :: The length of `string' in bytes. */ + /* */ + /* <Note> */ + /* Possible values for `platform_id', `encoding_id', `language_id', */ + /* and `name_id' are given in the file `ttnameid.h'. For details */ + /* please refer to the TrueType or OpenType specification. */ + /* */ + /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ + /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */ + /* */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name_Count */ + /* */ + /* <Description> */ + /* Retrieve the number of name strings in the SFNT `name' table. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Return> */ + /* The number of strings in the `name' table. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name */ + /* */ + /* <Description> */ + /* Retrieve a string of the SFNT `name' table for a given index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* idx :: The index of the `name' string. */ + /* */ + /* <Output> */ + /* aname :: The indexed @FT_SfntName structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0~means success. */ + /* */ + /* <Note> */ + /* The `string' array returned in the `aname' structure is not */ + /* null-terminated. The application should deallocate it if it is no */ + /* longer in use. */ + /* */ + /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */ + /* `name' table entries, then do a loop until you get the right */ + /* platform, encoding, and name ID. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY + * + * @description: + * A constant used as the tag of @FT_Parameter structures to make + * FT_Open_Face() ignore preferred family subfamily names in `name' + * table since OpenType version 1.4. For backwards compatibility with + * legacy systems which has 4-face-per-family restriction. + * + */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' ) + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY + * + * @description: + * A constant used as the tag of @FT_Parameter structures to make + * FT_Open_Face() ignore preferred subfamily names in `name' table since + * OpenType version 1.4. For backwards compatibility with legacy + * systems which has 4-face-per-family restriction. + * + */ +#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' ) + + /* */ + + +FT_END_HEADER + +#endif /* __FT_SFNT_NAMES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftstroke.h b/alienblaster/project/jni/freetype/include/freetype/ftstroke.h new file mode 100644 index 000000000..3afb87df8 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftstroke.h @@ -0,0 +1,716 @@ +/***************************************************************************/ +/* */ +/* ftstroke.h */ +/* */ +/* FreeType path stroker (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_STROKE_H__ +#define __FT_STROKE_H__ + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************ + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial + * glyph. It also allows you to retrieve the `outside' and/or the + * `inside' borders of the stroke. + * + * This can be useful to generate `bordered' glyph, i.e., glyphs + * displayed with a coloured (and anti-aliased) border around their + * shape. + */ + + + /************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handler to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered + * in a stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used + * to join two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins; i.e., the two joining lines + * are extended until they intersect. + * + * FT_STROKER_LINEJOIN_MITER :: + * Same as beveled rendering, except that an additional line + * break is added if the angle between the two joining lines + * is too closed (this is useful to avoid unpleasant spikes + * in beveled rendering). + */ + typedef enum FT_Stroker_LineJoin_ + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL, + FT_STROKER_LINEJOIN_MITER + + } FT_Stroker_LineJoin; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are + * rendered in a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last + * point itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the + * last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the + * last point. + */ + typedef enum FT_Stroker_LineCap_ + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border + * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the `inside' and `outside' + * borders. However, there is no direct mapping between these and the + * `left' and `right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum FT_StrokerBorder_ + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `inside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `outside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. NULL in case of error. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the FT_STROKER_LINEJOIN_MITER style, + * expressed as 16.16 fixed point value. + * + * @note: + * The radius is expressed in the same units as the outline + * coordinates. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. + * You should call this function before beginning a new + * series of calls to @FT_Stroker_BeginSubPath or + * @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with + * the stroker. The resulting outline(s) can be retrieved + * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If~1, the outline is treated as an open path instead + * of a closed one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If `opened' is~0 (the default), the outline is treated as a closed + * path, and the stroker generates two distinct `border' outlines. + * + * If `opened' is~1, the outline is processed as an open path, and the + * stroker generates a single `stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If~1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function is useful when you need to stroke a path that is + * not stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. + * If the subpath was not `opened', this function `draws' a + * single line segment to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * `Draw' a single line segment in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * `Draw' a single quadratic Bézier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bézier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * `Draw' a single cubic Bézier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bézier control point. + * + * control2 :: + * A pointer to second Bézier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export one of the `border' or `stroke' + * outlines generated by the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right'. + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to + * retrieve the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the corresponding border to your own @FT_Outline + * structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to + * get sure that there is enough room in your @FT_Outline object to + * receive all new data. + * + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right' + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to + * retrieve all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export all points/borders from the stroked + * outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0~means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export all borders to your own @FT_Outline structure. + * + * Note that this function appends the border points and + * contours to your outline, but does not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be NULL. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but + * only return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If~1, return the inside border, otherwise + * the outside border. + * + * destroy :: + * A Boolean. If~1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* __FT_STROKE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftsynth.h b/alienblaster/project/jni/freetype/include/freetype/ftsynth.h new file mode 100644 index 000000000..a068b7928 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftsynth.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* ftsynth.h */ +/* */ +/* FreeType synthesizing code for emboldening and slanting */ +/* (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE! THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Main reason for not lifting the functions in this module to a */ + /* `standard' API is that the used parameters for emboldening and */ + /* slanting are not configurable. Consider the functions as a */ + /* code resource which should be copied into the application and */ + /* adapted to the particular needs. */ + + +#ifndef __FTSYNTH_H__ +#define __FTSYNTH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Embolden a glyph by a `reasonable' value (which is highly a matter of */ + /* taste). This function is actually a convenience function, providing */ + /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */ + /* */ + /* For emboldened outlines the metrics are estimates only; if you need */ + /* precise values you should call @FT_Outline_Get_CBox. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + /* Slant an outline glyph to the right by about 12 degrees. */ + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + +FT_END_HEADER + +#endif /* __FTSYNTH_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftsystem.h b/alienblaster/project/jni/freetype/include/freetype/ftsystem.h new file mode 100644 index 000000000..a95b2c76b --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftsystem.h @@ -0,0 +1,346 @@ +/***************************************************************************/ +/* */ +/* ftsystem.h */ +/* */ +/* FreeType low-level system interface definition (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSYSTEM_H__ +#define __FTSYSTEM_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* system_interface */ + /* */ + /* <Title> */ + /* System Interface */ + /* */ + /* <Abstract> */ + /* How FreeType manages memory and i/o. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to memory */ + /* management and i/o access. You need to understand this */ + /* information if you want to use a custom memory manager or you own */ + /* i/o streams. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* M E M O R Y M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************* + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size' bytes from `memory'. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0~in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************* + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************* + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0~in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************* + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType~2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /*************************************************************************/ + /* */ + /* I / O M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************* + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*' in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************* + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset of read in stream (always from start). + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * The number of bytes effectively read by the stream. + * + * @note: + * This function might be called to perform a seek or skip operation + * with a `count' of~0. + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************* + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************* + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to NULL for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*' + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream;s close function. + * + * memory :: + * The memory manager to use to preload frames. This is set + * internally by FreeType and shouldn't be touched by stream + * implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTSYSTEM_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/fttrigon.h b/alienblaster/project/jni/freetype/include/freetype/fttrigon.h new file mode 100644 index 000000000..6b77d2ee5 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/***************************************************************************/ +/* */ +/* fttrigon.h */ +/* */ +/* FreeType trigonometric functions (specification). */ +/* */ +/* Copyright 2001, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTRIGON_H__ +#define __FTTRIGON_H__ + +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed float value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************* + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in + * the 2d plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************* + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `value2-value1'. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x' will be `sin(angle)', and the value of + * `vec.y' will be `cos(angle)'. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTTRIGON_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/fttypes.h b/alienblaster/project/jni/freetype/include/freetype/fttypes.h new file mode 100644 index 000000000..a57ffa69b --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/fttypes.h @@ -0,0 +1,588 @@ +/***************************************************************************/ +/* */ +/* fttypes.h */ +/* */ +/* FreeType simple types definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTYPES_H__ +#define __FTTYPES_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_SYSTEM_H +#include FT_IMAGE_H + +#include <stddef.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /* <Title> */ + /* Basic Data Types */ + /* */ + /* <Abstract> */ + /* The basic data types defined by the library. */ + /* */ + /* <Description> */ + /* This section contains the basic data types defined by FreeType~2, */ + /* ranging from simple scalar types to bitmap descriptors. More */ + /* font-specific structures are defined in a different section. */ + /* */ + /* <Order> */ + /* FT_Byte */ + /* FT_Bytes */ + /* FT_Char */ + /* FT_Int */ + /* FT_UInt */ + /* FT_Int16 */ + /* FT_UInt16 */ + /* FT_Int32 */ + /* FT_UInt32 */ + /* FT_Short */ + /* FT_UShort */ + /* FT_Long */ + /* FT_ULong */ + /* FT_Bool */ + /* FT_Offset */ + /* FT_PtrDist */ + /* FT_String */ + /* FT_Tag */ + /* FT_Error */ + /* FT_Fixed */ + /* FT_Pointer */ + /* FT_Pos */ + /* FT_Vector */ + /* FT_BBox */ + /* FT_Matrix */ + /* FT_FWord */ + /* FT_UFWord */ + /* FT_F2Dot14 */ + /* FT_UnitVector */ + /* FT_F26Dot6 */ + /* */ + /* */ + /* FT_Generic */ + /* FT_Generic_Finalizer */ + /* */ + /* FT_Bitmap */ + /* FT_Pixel_Mode */ + /* FT_Palette_Mode */ + /* FT_Glyph_Format */ + /* FT_IMAGE_TAG */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bool */ + /* */ + /* <Description> */ + /* A typedef of unsigned char, used for simple booleans. As usual, */ + /* values 1 and~0 represent true and false, respectively. */ + /* */ + typedef unsigned char FT_Bool; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_FWord */ + /* */ + /* <Description> */ + /* A signed 16-bit integer used to store a distance in original font */ + /* units. */ + /* */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UFWord */ + /* */ + /* <Description> */ + /* An unsigned 16-bit integer used to store a distance in original */ + /* font units. */ + /* */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Char */ + /* */ + /* <Description> */ + /* A simple typedef for the _signed_ char type. */ + /* */ + typedef signed char FT_Char; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Byte */ + /* */ + /* <Description> */ + /* A simple typedef for the _unsigned_ char type. */ + /* */ + typedef unsigned char FT_Byte; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bytes */ + /* */ + /* <Description> */ + /* A typedef for constant memory areas. */ + /* */ + typedef const FT_Byte* FT_Bytes; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Tag */ + /* */ + /* <Description> */ + /* A typedef for 32-bit tags (as used in the SFNT format). */ + /* */ + typedef FT_UInt32 FT_Tag; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_String */ + /* */ + /* <Description> */ + /* A simple typedef for the char type, usually used for strings. */ + /* */ + typedef char FT_String; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Short */ + /* */ + /* <Description> */ + /* A typedef for signed short. */ + /* */ + typedef signed short FT_Short; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UShort */ + /* */ + /* <Description> */ + /* A typedef for unsigned short. */ + /* */ + typedef unsigned short FT_UShort; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Int */ + /* */ + /* <Description> */ + /* A typedef for the int type. */ + /* */ + typedef signed int FT_Int; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UInt */ + /* */ + /* <Description> */ + /* A typedef for the unsigned int type. */ + /* */ + typedef unsigned int FT_UInt; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Long */ + /* */ + /* <Description> */ + /* A typedef for signed long. */ + /* */ + typedef signed long FT_Long; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ULong */ + /* */ + /* <Description> */ + /* A typedef for unsigned long. */ + /* */ + typedef unsigned long FT_ULong; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F2Dot14 */ + /* */ + /* <Description> */ + /* A signed 2.14 fixed float type used for unit vectors. */ + /* */ + typedef signed short FT_F2Dot14; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F26Dot6 */ + /* */ + /* <Description> */ + /* A signed 26.6 fixed float type used for vectorial pixel */ + /* coordinates. */ + /* */ + typedef signed long FT_F26Dot6; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Fixed */ + /* */ + /* <Description> */ + /* This type is used to store 16.16 fixed float values, like scaling */ + /* values or matrix coefficients. */ + /* */ + typedef signed long FT_Fixed; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Error */ + /* */ + /* <Description> */ + /* The FreeType error code type. A value of~0 is always interpreted */ + /* as a successful operation. */ + /* */ + typedef int FT_Error; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pointer */ + /* */ + /* <Description> */ + /* A simple typedef for a typeless pointer. */ + /* */ + typedef void* FT_Pointer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Offset */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */ + /* _unsigned_ integer type used to express a file size or position, */ + /* or a memory block size. */ + /* */ + typedef size_t FT_Offset; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_PtrDist */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */ + /* largest _signed_ integer type used to express the distance */ + /* between two pointers. */ + /* */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_UnitVector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector unit vector. Uses */ + /* FT_F2Dot14 types. */ + /* */ + /* <Fields> */ + /* x :: Horizontal coordinate. */ + /* */ + /* y :: Vertical coordinate. */ + /* */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Matrix */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2x2 matrix. Coefficients are */ + /* in 16.16 fixed float format. The computation performed is: */ + /* */ + /* { */ + /* x' = x*xx + y*xy */ + /* y' = x*yx + y*yy */ + /* } */ + /* */ + /* <Fields> */ + /* xx :: Matrix coefficient. */ + /* */ + /* xy :: Matrix coefficient. */ + /* */ + /* yx :: Matrix coefficient. */ + /* */ + /* yy :: Matrix coefficient. */ + /* */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Data */ + /* */ + /* <Description> */ + /* Read-only binary data represented as a pointer and a length. */ + /* */ + /* <Fields> */ + /* pointer :: The data. */ + /* */ + /* length :: The length of the data in bytes. */ + /* */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_Int length; + + } FT_Data; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Generic_Finalizer */ + /* */ + /* <Description> */ + /* Describe a function used to destroy the `client' data of any */ + /* FreeType object. See the description of the @FT_Generic type for */ + /* details of usage. */ + /* */ + /* <Input> */ + /* The address of the FreeType object which is under finalization. */ + /* Its client data is accessed through its `generic' field. */ + /* */ + typedef void (*FT_Generic_Finalizer)(void* object); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Generic */ + /* */ + /* <Description> */ + /* Client applications often need to associate their own data to a */ + /* variety of FreeType core objects. For example, a text layout API */ + /* might want to associate a glyph cache to a given size object. */ + /* */ + /* Most FreeType object contains a `generic' field, of type */ + /* FT_Generic, which usage is left to client applications and font */ + /* servers. */ + /* */ + /* It can be used to store a pointer to client-specific data, as well */ + /* as the address of a `finalizer' function, which will be called by */ + /* FreeType when the object is destroyed (for example, the previous */ + /* client example would put the address of the glyph cache destructor */ + /* in the `finalizer' field). */ + /* */ + /* <Fields> */ + /* data :: A typeless pointer to any client-specified data. This */ + /* field is completely ignored by the FreeType library. */ + /* */ + /* finalizer :: A pointer to a `generic finalizer' function, which */ + /* will be called when the object is destroyed. If this */ + /* field is set to NULL, no code will be called. */ + /* */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_MAKE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags which are used to label */ + /* TrueType tables into an unsigned long to be used within FreeType. */ + /* */ + /* <Note> */ + /* The produced values *must* be 32-bit integers. Don't redefine */ + /* this macro. */ + /* */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + (FT_Tag) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ListNode */ + /* */ + /* <Description> */ + /* Many elements and objects in FreeType are listed through an */ + /* @FT_List record (see @FT_ListRec). As its name suggests, an */ + /* FT_ListNode is a handle to a single list element. */ + /* */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_List */ + /* */ + /* <Description> */ + /* A handle to a list record (see @FT_ListRec). */ + /* */ + typedef struct FT_ListRec_* FT_List; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListNodeRec */ + /* */ + /* <Description> */ + /* A structure used to hold a single list element. */ + /* */ + /* <Fields> */ + /* prev :: The previous element in the list. NULL if first. */ + /* */ + /* next :: The next element in the list. NULL if last. */ + /* */ + /* data :: A typeless pointer to the listed object. */ + /* */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListRec */ + /* */ + /* <Description> */ + /* A structure used to hold a simple doubly-linked list. These are */ + /* used in many parts of FreeType. */ + /* */ + /* <Fields> */ + /* head :: The head (first element) of doubly-linked list. */ + /* */ + /* tail :: The tail (last element) of doubly-linked list. */ + /* */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + + /* */ + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) + + /* return base error code (without module-specific prefix) */ +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) + + /* return module error code */ +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_BOOL( x ) ( (FT_Bool)( x ) ) + +FT_END_HEADER + +#endif /* __FTTYPES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftwinfnt.h b/alienblaster/project/jni/freetype/include/freetype/ftwinfnt.h new file mode 100644 index 000000000..ea3335353 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftwinfnt.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.h */ +/* */ +/* FreeType API for accessing Windows fnt-specific data. */ +/* */ +/* Copyright 2003, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTWINFNT_H__ +#define __FTWINFNT_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* winfnt_fonts */ + /* */ + /* <Title> */ + /* Window FNT Files */ + /* */ + /* <Abstract> */ + /* Windows FNT specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Windows FNT specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset' byte in + * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX + * encodings (except for cp1361) can be found at ftp://ftp.unicode.org + * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is + * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a + * `don't care' value. Valid font files don't contain this value. + * When querying for information about the character set of the font + * that is currently selected into a specified device context, this + * return value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Pöttgen <michael@poettgen.de>: + * + * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM + * is used for the charset of vector fonts, like `modern.fon', + * `roman.fon', and `script.fon' on Windows. + * + * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value + * specifies a character set that is operating-system dependent. + * + * The `IFIMETRICS' documentation from the `Windows Driver + * Development Kit' says: This font supports an OEM-specific + * character set. The OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the + * second default codepage that most international versions of + * Windows have. It is one of the OEM codepages from + * + * http://www.microsoft.com/globaldev/reference/cphome.mspx, + * + * and is used for the `DOS boxes', to support legacy applications. + * A German Windows version for example usually uses ANSI codepage + * 1252 and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS~C 5601-1987 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big~5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_HeaderRec */ + /* */ + /* <Description> */ + /* Windows FNT Header info. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_Header */ + /* */ + /* <Description> */ + /* A handle to an @FT_WinFNT_HeaderRec structure. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header; + + + /********************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: A handle to the input face. + * + * @output: + * aheader :: The WinFNT header. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + /* */ + +FT_END_HEADER + +#endif /* __FTWINFNT_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ftxf86.h b/alienblaster/project/jni/freetype/include/freetype/ftxf86.h new file mode 100644 index 000000000..8c68afdcc --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ftxf86.h @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* ftxf86.h */ +/* */ +/* Support functions for X11. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTXF86_H__ +#define __FTXF86_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* font_formats */ + /* */ + /* <Title> */ + /* Font Formats */ + /* */ + /* <Abstract> */ + /* Getting the font format. */ + /* */ + /* <Description> */ + /* The single function in this section can be used to get the font */ + /* format. Note that this information is not needed normally; */ + /* however, there are special cases (like in PDF devices) where it is */ + /* important to differentiate, in spite of FreeType's uniform API. */ + /* */ + /* This function is in the X11/xf86 namespace for historical reasons */ + /* and in no way depends on that windowing system. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_X11_Font_Format */ + /* */ + /* <Description> */ + /* Return a string describing the format of a given face, using values */ + /* which can be used as an X11 FONT_PROPERTY. Possible values are */ + /* `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */ + /* `PFR', and `Windows~FNT'. */ + /* */ + /* <Input> */ + /* face :: */ + /* Input face handle. */ + /* */ + /* <Return> */ + /* Font format string. NULL in case of error. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + /* */ + +FT_END_HEADER + +#endif /* __FTXF86_H__ */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/autohint.h b/alienblaster/project/jni/freetype/include/freetype/internal/autohint.h new file mode 100644 index 000000000..7e3a08a05 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/autohint.h @@ -0,0 +1,231 @@ +/***************************************************************************/ +/* */ +/* autohint.h */ +/* */ +/* High-level `autohint' module-specific interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The auto-hinter is used to load and automatically hint glyphs if a */ + /* format-specific hinter isn't available. */ + /* */ + /*************************************************************************/ + + +#ifndef __AUTOHINT_H__ +#define __AUTOHINT_H__ + + + /*************************************************************************/ + /* */ + /* A small technical note regarding automatic hinting in order to */ + /* clarify this module interface. */ + /* */ + /* An automatic hinter might compute two kinds of data for a given face: */ + /* */ + /* - global hints: Usually some metrics that describe global properties */ + /* of the face. It is computed by scanning more or less */ + /* aggressively the glyphs in the face, and thus can be */ + /* very slow to compute (even if the size of global */ + /* hints is really small). */ + /* */ + /* - glyph hints: These describe some important features of the glyph */ + /* outline, as well as how to align them. They are */ + /* generally much faster to compute than global hints. */ + /* */ + /* The current FreeType auto-hinter does a pretty good job while */ + /* performing fast computations for both global and glyph hints. */ + /* However, we might be interested in introducing more complex and */ + /* powerful algorithms in the future, like the one described in the John */ + /* D. Hobby paper, which unfortunately requires a lot more horsepower. */ + /* */ + /* Because a sufficiently sophisticated font management system would */ + /* typically implement an LRU cache of opened face objects to reduce */ + /* memory usage, it is a good idea to be able to avoid recomputing */ + /* global hints every time the same face is re-opened. */ + /* */ + /* We thus provide the ability to cache global hints outside of the face */ + /* object, in order to speed up font re-opening time. Of course, this */ + /* feature is purely optional, so most client programs won't even notice */ + /* it. */ + /* */ + /* I initially thought that it would be a good idea to cache the glyph */ + /* hints too. However, my general idea now is that if you really need */ + /* to cache these too, you are simply in need of a new font format, */ + /* where all this information could be stored within the font file and */ + /* decoded on the fly. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct FT_AutoHinterRec_ *FT_AutoHinter; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalGetFunc */ + /* */ + /* <Description> */ + /* Retrieves the global hints computed for a given face object the */ + /* resulting data is dissociated from the face and will survive a */ + /* call to FT_Done_Face(). It must be discarded through the API */ + /* FT_AutoHinter_GlobalDoneFunc(). */ + /* */ + /* <Input> */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* global_hints :: A typeless pointer to the global hints. */ + /* */ + /* global_len :: The size in bytes of the global hints. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, + FT_Face face, + void** global_hints, + long* global_len ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalDoneFunc */ + /* */ + /* <Description> */ + /* Discards the global hints retrieved through */ + /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */ + /* are freed from memory. */ + /* */ + /* <Input> */ + /* hinter :: A handle to the auto-hinter module. */ + /* */ + /* global :: A pointer to retrieved global hints to discard. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, + void* global ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalResetFunc */ + /* */ + /* <Description> */ + /* This function is used to recompute the global metrics in a given */ + /* font. This is useful when global font data changes (e.g. Multiple */ + /* Masters fonts where blend coordinates change). */ + /* */ + /* <Input> */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the face. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, + FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlyphLoadFunc */ + /* */ + /* <Description> */ + /* This function is used to load, scale, and automatically hint a */ + /* glyph from a given face. */ + /* */ + /* <Input> */ + /* face :: A handle to the face. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* load_flags :: The load flags. */ + /* */ + /* <Note> */ + /* This function is capable of loading composite glyphs by hinting */ + /* each sub-glyph independently (which improves quality). */ + /* */ + /* It will call the font driver with FT_Load_Glyph(), with */ + /* FT_LOAD_NO_SCALE set. */ + /* */ + typedef FT_Error + (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_AutoHinter_ServiceRec */ + /* */ + /* <Description> */ + /* The auto-hinter module's interface. */ + /* */ + typedef struct FT_AutoHinter_ServiceRec_ + { + FT_AutoHinter_GlobalResetFunc reset_face; + FT_AutoHinter_GlobalGetFunc get_global_hints; + FT_AutoHinter_GlobalDoneFunc done_global_hints; + FT_AutoHinter_GlyphLoadFunc load_glyph; + + } FT_AutoHinter_ServiceRec, *FT_AutoHinter_Service; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \ + done_global_hints_, load_glyph_) \ + FT_CALLBACK_TABLE_DEF \ + const FT_AutoHinter_ServiceRec class_ = \ + { \ + reset_face_, get_global_hints_, done_global_hints_, load_glyph_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \ + done_global_hints_, load_glyph_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_AutoHinter_ServiceRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->reset_face = reset_face_; \ + clazz->get_global_hints = get_global_hints_; \ + clazz->done_global_hints = done_global_hints_; \ + clazz->load_glyph = load_glyph_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + +FT_END_HEADER + +#endif /* __AUTOHINT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftcalc.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftcalc.h new file mode 100644 index 000000000..f8b432477 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftcalc.h @@ -0,0 +1,179 @@ +/***************************************************************************/ +/* */ +/* ftcalc.h */ +/* */ +/* Arithmetic computations (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCALC_H__ +#define __FTCALC_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FixedSqrt */ + /* */ + /* <Description> */ + /* Computes the square root of a 16.16 fixed point value. */ + /* */ + /* <Input> */ + /* x :: The value to compute the root for. */ + /* */ + /* <Return> */ + /* The result of `sqrt(x)'. */ + /* */ + /* <Note> */ + /* This function is not very fast. */ + /* */ + FT_BASE( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Sqrt32 */ + /* */ + /* <Description> */ + /* Computes the square root of an Int32 integer (which will be */ + /* handled as an unsigned long value). */ + /* */ + /* <Input> */ + /* x :: The value to compute the root for. */ + /* */ + /* <Return> */ + /* The result of `sqrt(x)'. */ + /* */ + FT_EXPORT( FT_Int32 ) + FT_Sqrt32( FT_Int32 x ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv_No_Round */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* (without rounding) with maximal accuracy (it uses a 64-bit */ + /* intermediate integer whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_BASE( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* + * A variant of FT_Matrix_Multiply which scales its result afterwards. + * The idea is that both `a' and `b' are scaled by factors of 10 so that + * the values are as precise as possible to get a correct result during + * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of + * `a' and `b', respectively, then the scaling factor of the result is + * `sa*sb'. + */ + FT_BASE( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ); + + + /* + * A variant of FT_Vector_Transform. See comments for + * FT_Matrix_Multiply_Scaled. + */ + + FT_BASE( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ); + + + /* + * Return -1, 0, or +1, depending on the orientation of a given corner. + * We use the Cartesian coordinate system, with positive vertical values + * going upwards. The function returns +1 if the corner turns to the + * left, -1 to the right, and 0 for undecidable cases. + */ + FT_BASE( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + /* + * Return TRUE if a corner is flat or nearly flat. This is equivalent to + * saying that the angle difference between the `in' and `out' vectors is + * very small. + */ + FT_BASE( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + +#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) +#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) +#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) +#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) +#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) +#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 ) + +#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ + : ( -( ( 32 - (x) ) & -64 ) ) ) + + +FT_END_HEADER + +#endif /* __FTCALC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftdebug.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftdebug.h new file mode 100644 index 000000000..7baae3531 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftdebug.h @@ -0,0 +1,250 @@ +/***************************************************************************/ +/* */ +/* ftdebug.h */ +/* */ +/* Debugging and logging component (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/* */ +/* IMPORTANT: A description of FreeType's debugging support can be */ +/* found in `docs/DEBUG.TXT'. Read it if you need to use or */ +/* understand this code. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDEBUG_H__ +#define __FTDEBUG_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ + /* is already defined; this simplifies the following #ifdefs */ + /* */ +#ifdef FT_DEBUG_LEVEL_TRACE +#undef FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_ERROR +#endif + + + /*************************************************************************/ + /* */ + /* Define the trace enums as well as the trace levels array when they */ + /* are needed. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE_DEF( x ) trace_ ## x , + + /* defining the enumeration */ + typedef enum FT_Trace_ + { +#include FT_INTERNAL_TRACE_H + trace_count + + } FT_Trace; + + + /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ + extern int ft_trace_levels[trace_count]; + +#undef FT_TRACE_DEF + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Define the FT_TRACE macro */ + /* */ + /* IMPORTANT! */ + /* */ + /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ + /* value before using any TRACE macro. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE( level, varformat ) \ + do \ + { \ + if ( ft_trace_levels[FT_COMPONENT] >= level ) \ + FT_Message varformat; \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Count */ + /* */ + /* <Description> */ + /* Return the number of available trace components. */ + /* */ + /* <Return> */ + /* The number of trace components. 0 if FreeType 2 is not built with */ + /* FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* This function may be useful if you want to access elements of */ + /* the internal `ft_trace_levels' array by an index. */ + /* */ + FT_BASE( FT_Int ) + FT_Trace_Get_Count( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Name */ + /* */ + /* <Description> */ + /* Return the name of a trace component. */ + /* */ + /* <Input> */ + /* The index of the trace component. */ + /* */ + /* <Return> */ + /* The name of the trace component. This is a statically allocated */ + /* C string, so do not free it after use. NULL if FreeType 2 is not */ + /* built with FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* Use @FT_Trace_Get_Count to get the number of available trace */ + /* components. */ + /* */ + /* This function may be useful if you want to control FreeType 2's */ + /* debug level in your application. */ + /* */ + FT_BASE( const char * ) + FT_Trace_Get_Name( FT_Int idx ); + + + /*************************************************************************/ + /* */ + /* You need two opening and closing parentheses! */ + /* */ + /* Example: FT_TRACE0(( "Value is %i", foo )) */ + /* */ + /* Output of the FT_TRACEX macros is sent to stderr. */ + /* */ + /*************************************************************************/ + +#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) +#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) +#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) +#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) +#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) +#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) +#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) +#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) + + + /*************************************************************************/ + /* */ + /* Define the FT_ERROR macro. */ + /* */ + /* Output of this macro is sent to stderr. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ERROR( varformat ) FT_Message varformat + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define the FT_ASSERT macro. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ASSERT( condition ) \ + do \ + { \ + if ( !( condition ) ) \ + FT_Panic( "assertion failed on line %d of file %s\n", \ + __LINE__, __FILE__ ); \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ASSERT( condition ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define `FT_Message' and `FT_Panic' when needed. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#include "stdio.h" /* for vfprintf() */ + + /* print a message */ + FT_BASE( void ) + FT_Message( const char* fmt, + ... ); + + /* print a message and exit */ + FT_BASE( void ) + FT_Panic( const char* fmt, + ... ); + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + FT_BASE( void ) + ft_debug_init( void ); + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* We disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings. */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + +FT_END_HEADER + +#endif /* __FTDEBUG_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftdriver.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftdriver.h new file mode 100644 index 000000000..1d06997bd --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftdriver.h @@ -0,0 +1,422 @@ +/***************************************************************************/ +/* */ +/* ftdriver.h */ +/* */ +/* FreeType font driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDRIVER_H__ +#define __FTDRIVER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + typedef FT_Error + (*FT_Face_InitFunc)( FT_Stream stream, + FT_Face face, + FT_Int typeface_index, + FT_Int num_params, + FT_Parameter* parameters ); + + typedef void + (*FT_Face_DoneFunc)( FT_Face face ); + + + typedef FT_Error + (*FT_Size_InitFunc)( FT_Size size ); + + typedef void + (*FT_Size_DoneFunc)( FT_Size size ); + + + typedef FT_Error + (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); + + typedef void + (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); + + + typedef FT_Error + (*FT_Size_RequestFunc)( FT_Size size, + FT_Size_Request req ); + + typedef FT_Error + (*FT_Size_SelectFunc)( FT_Size size, + FT_ULong size_index ); + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + typedef FT_Error + (*FT_Size_ResetPointsFunc)( FT_Size size, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + typedef FT_Error + (*FT_Size_ResetPixelsFunc)( FT_Size size, + FT_UInt pixel_width, + FT_UInt pixel_height ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + typedef FT_Error + (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + typedef FT_UInt + (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, + FT_Long charcode ); + + typedef FT_Long + (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, + FT_Long charcode ); + + + typedef FT_Error + (*FT_Face_GetKerningFunc)( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ); + + + typedef FT_Error + (*FT_Face_AttachFunc)( FT_Face face, + FT_Stream stream ); + + + typedef FT_Error + (*FT_Face_GetAdvancesFunc)( FT_Face face, + FT_UInt first, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Driver_ClassRec */ + /* */ + /* <Description> */ + /* The font driver class. This structure mostly contains pointers to */ + /* driver methods. */ + /* */ + /* <Fields> */ + /* root :: The parent module. */ + /* */ + /* face_object_size :: The size of a face object in bytes. */ + /* */ + /* size_object_size :: The size of a size object in bytes. */ + /* */ + /* slot_object_size :: The size of a glyph object in bytes. */ + /* */ + /* init_face :: The format-specific face constructor. */ + /* */ + /* done_face :: The format-specific face destructor. */ + /* */ + /* init_size :: The format-specific size constructor. */ + /* */ + /* done_size :: The format-specific size destructor. */ + /* */ + /* init_slot :: The format-specific slot constructor. */ + /* */ + /* done_slot :: The format-specific slot destructor. */ + /* */ + /* */ + /* load_glyph :: A function handle to load a glyph to a slot. */ + /* This field is mandatory! */ + /* */ + /* get_kerning :: A function handle to return the unscaled */ + /* kerning for a given pair of glyphs. Can be */ + /* set to 0 if the format doesn't support */ + /* kerning. */ + /* */ + /* attach_file :: This function handle is used to read */ + /* additional data for a face from another */ + /* file/stream. For example, this can be used to */ + /* add data from AFM or PFM files on a Type 1 */ + /* face, or a CIDMap on a CID-keyed face. */ + /* */ + /* get_advances :: A function handle used to return advance */ + /* widths of `count' glyphs (in font units), */ + /* starting at `first'. The `vertical' flag must */ + /* be set to get vertical advance heights. The */ + /* `advances' buffer is caller-allocated. */ + /* Currently not implemented. The idea of this */ + /* function is to be able to perform */ + /* device-independent text layout without loading */ + /* a single glyph image. */ + /* */ + /* request_size :: A handle to a function used to request the new */ + /* character size. Can be set to 0 if the */ + /* scaling done in the base layer suffices. */ + /* */ + /* select_size :: A handle to a function used to select a new */ + /* fixed size. It is used only if */ + /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */ + /* to 0 if the scaling done in the base layer */ + /* suffices. */ + /* <Note> */ + /* Most function pointers, with the exception of `load_glyph', can be */ + /* set to 0 to indicate a default behaviour. */ + /* */ + typedef struct FT_Driver_ClassRec_ + { + FT_Module_Class root; + + FT_Long face_object_size; + FT_Long size_object_size; + FT_Long slot_object_size; + + FT_Face_InitFunc init_face; + FT_Face_DoneFunc done_face; + + FT_Size_InitFunc init_size; + FT_Size_DoneFunc done_size; + + FT_Slot_InitFunc init_slot; + FT_Slot_DoneFunc done_slot; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_Size_ResetPointsFunc set_char_sizes; + FT_Size_ResetPixelsFunc set_pixel_sizes; + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_Slot_LoadFunc load_glyph; + + FT_Face_GetKerningFunc get_kerning; + FT_Face_AttachFunc attach_file; + FT_Face_GetAdvancesFunc get_advances; + + /* since version 2.2 */ + FT_Size_RequestFunc request_size; + FT_Size_SelectFunc select_size; + + } FT_Driver_ClassRec, *FT_Driver_Class; + + + /* + * The following functions are used as stubs for `set_char_sizes' and + * `set_pixel_sizes'; the code uses `request_size' and `select_size' + * functions instead. + * + * Implementation is in `src/base/ftobjs.c'. + */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE( FT_Error ) + ft_stub_set_char_sizes( FT_Size size, + FT_F26Dot6 width, + FT_F26Dot6 height, + FT_UInt horz_res, + FT_UInt vert_res ); + + FT_BASE( FT_Error ) + ft_stub_set_pixel_sizes( FT_Size size, + FT_UInt width, + FT_UInt height ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DECLARE_DRIVER */ + /* */ + /* <Description> */ + /* Used to create a forward declaration of a */ + /* FT_Driver_ClassRec stract instance. */ + /* */ + /* <Macro> */ + /* FT_DEFINE_DRIVER */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Driver_ClassRec struct. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ + /* to called with a pointer where the allocated stracture is returned.*/ + /* And when it is no longer needed a Destroy function needs */ + /* to be called to release that allocation. */ + /* fcinit.c (ft_create_default_module_classes) already contains */ + /* a mechanism to call these functions for the default modules */ + /* described in ftmodule.h */ + /* */ + /* Notice that the created Create and Destroy functions call */ + /* pic_init and pic_free function to allow you to manually allocate */ + /* and initialize any additional global data, like module specific */ + /* interface, and put them in the global pic container defined in */ + /* ftpic.h. if you don't need them just implement the functions as */ + /* empty to resolve the link error. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) \ + a_, b_, +#else + #define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) +#endif + +#define FT_DECLARE_DRIVER(class_) \ + FT_CALLBACK_TABLE \ + const FT_Driver_ClassRec class_; + +#define FT_DEFINE_DRIVER(class_, \ + flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_, \ + face_object_size_, size_object_size_, \ + slot_object_size_, init_face_, done_face_, \ + init_size_, done_size_, init_slot_, done_slot_, \ + old_set_char_sizes_, old_set_pixel_sizes_, \ + load_glyph_, get_kerning_, attach_file_, \ + get_advances_, request_size_, select_size_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Driver_ClassRec class_ = \ + { \ + FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,interface_, \ + init_,done_,get_interface_) \ + \ + face_object_size_, \ + size_object_size_, \ + slot_object_size_, \ + \ + init_face_, \ + done_face_, \ + \ + init_size_, \ + done_size_, \ + \ + init_slot_, \ + done_slot_, \ + \ + FT_DEFINE_DRIVERS_OLD_INTERNALS(old_set_char_sizes_, old_set_pixel_sizes_) \ + \ + load_glyph_, \ + \ + get_kerning_, \ + attach_file_, \ + get_advances_, \ + \ + request_size_, \ + select_size_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) \ + clazz->set_char_sizes = a_; \ + clazz->set_pixel_sizes = b_; +#else + #define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) +#endif + +#define FT_DECLARE_DRIVER(class_) FT_DECLARE_MODULE(class_) + +#define FT_DEFINE_DRIVER(class_, \ + flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_, \ + face_object_size_, size_object_size_, \ + slot_object_size_, init_face_, done_face_, \ + init_size_, done_size_, init_slot_, done_slot_, \ + old_set_char_sizes_, old_set_pixel_sizes_, \ + load_glyph_, get_kerning_, attach_file_, \ + get_advances_, request_size_, select_size_ ) \ + void class_##_pic_free( FT_Library library ); \ + FT_Error class_##_pic_init( FT_Library library ); \ + \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \ + class_##_pic_free( library ); \ + if ( dclazz ) \ + FT_FREE( dclazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Driver_Class clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ + return error; \ + \ + error = class_##_pic_init( library ); \ + if(error) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,interface_, \ + init_,done_,get_interface_) \ + \ + clazz->face_object_size = face_object_size_; \ + clazz->size_object_size = size_object_size_; \ + clazz->slot_object_size = slot_object_size_; \ + \ + clazz->init_face = init_face_; \ + clazz->done_face = done_face_; \ + \ + clazz->init_size = init_size_; \ + clazz->done_size = done_size_; \ + \ + clazz->init_slot = init_slot_; \ + clazz->done_slot = done_slot_; \ + \ + FT_DEFINE_DRIVERS_OLD_INTERNALS(old_set_char_sizes_, old_set_pixel_sizes_) \ + \ + clazz->load_glyph = load_glyph_; \ + \ + clazz->get_kerning = get_kerning_; \ + clazz->attach_file = attach_file_; \ + clazz->get_advances = get_advances_; \ + \ + clazz->request_size = request_size_; \ + clazz->select_size = select_size_; \ + \ + *output_class = (FT_Module_Class*)clazz; \ + return FT_Err_Ok; \ + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + +FT_END_HEADER + +#endif /* __FTDRIVER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftgloadr.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftgloadr.h new file mode 100644 index 000000000..ce4dc6c9c --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftgloadr.h @@ -0,0 +1,168 @@ +/***************************************************************************/ +/* */ +/* ftgloadr.h */ +/* */ +/* The FreeType glyph loader (specification). */ +/* */ +/* Copyright 2002, 2003, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGLOADR_H__ +#define __FTGLOADR_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphLoader */ + /* */ + /* <Description> */ + /* The glyph loader is an internal object used to load several glyphs */ + /* together (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The glyph loader implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ; + + +#if 0 /* moved to freetype.h in version 2.2 */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 +#endif + + + typedef struct FT_SubGlyphRec_ + { + FT_Int index; + FT_UShort flags; + FT_Int arg1; + FT_Int arg2; + FT_Matrix transform; + + } FT_SubGlyphRec; + + + typedef struct FT_GlyphLoadRec_ + { + FT_Outline outline; /* outline */ + FT_Vector* extra_points; /* extra points table */ + FT_Vector* extra_points2; /* second extra points table */ + FT_UInt num_subglyphs; /* number of subglyphs */ + FT_SubGlyph subglyphs; /* subglyphs */ + + } FT_GlyphLoadRec, *FT_GlyphLoad; + + + typedef struct FT_GlyphLoaderRec_ + { + FT_Memory memory; + FT_UInt max_points; + FT_UInt max_contours; + FT_UInt max_subglyphs; + FT_Bool use_extra; + + FT_GlyphLoadRec base; + FT_GlyphLoadRec current; + + void* other; /* for possible future extension? */ + + } FT_GlyphLoaderRec; + + + /* create new empty glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ); + + /* add an extra points table to a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); + + /* destroy a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ); + + /* reset a glyph loader (frees everything int it) */ + FT_BASE( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ); + + /* rewind a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); + + /* check that there is enough space to add `n_points' and `n_contours' */ + /* to the glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ); + + +#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ + ( (_count) == 0 || ((_loader)->base.outline.n_points + \ + (_loader)->current.outline.n_points + \ + (unsigned long)(_count)) <= (_loader)->max_points ) + +#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ + ( (_count) == 0 || ((_loader)->base.outline.n_contours + \ + (_loader)->current.outline.n_contours + \ + (unsigned long)(_count)) <= (_loader)->max_contours ) + +#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours ) \ + ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ + FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ + ? 0 \ + : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) ) + + + /* check that there is enough space to add `n_subs' sub-glyphs to */ + /* a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ); + + /* prepare a glyph loader, i.e. empty the current glyph */ + FT_BASE( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); + + /* add the current glyph to the base glyph */ + FT_BASE( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ); + + /* copy points from one glyph loader to another */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLOADR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftmemory.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftmemory.h new file mode 100644 index 000000000..2010ca90d --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftmemory.h @@ -0,0 +1,368 @@ +/***************************************************************************/ +/* */ +/* ftmemory.h */ +/* */ +/* The FreeType memory management macros (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMEMORY_H__ +#define __FTMEMORY_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_SET_ERROR */ + /* */ + /* <Description> */ + /* This macro is used to set an implicit `error' variable to a given */ + /* expression's value (usually a function call), and convert it to a */ + /* boolean which is set whenever the value is != 0. */ + /* */ +#undef FT_SET_ERROR +#define FT_SET_ERROR( expression ) \ + ( ( error = (expression) ) != 0 ) + + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M E M O R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * C++ refuses to handle statements like p = (void*)anything; where `p' + * is a typed pointer. Since we don't have a `typeof' operator in + * standard C++, we have to use ugly casts. + */ + +#ifdef __cplusplus +#define FT_ASSIGNP( p, val ) *((void**)&(p)) = (val) +#else +#define FT_ASSIGNP( p, val ) (p) = (val) +#endif + + + +#ifdef FT_DEBUG_MEMORY + + FT_BASE( const char* ) _ft_debug_file; + FT_BASE( long ) _ft_debug_lineno; + +#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + (exp) ) + +#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + FT_ASSIGNP( p, exp ) ) + +#else /* !FT_DEBUG_MEMORY */ + +#define FT_DEBUG_INNER( exp ) (exp) +#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) + +#endif /* !FT_DEBUG_MEMORY */ + + + /* + * The allocation functions return a pointer, and the error code + * is written to through the `p_error' parameter. See below for + * for documentation. + */ + + FT_BASE( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( void ) + ft_mem_free( FT_Memory memory, + const void* P ); + + +#define FT_MEM_ALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) ) + +#define FT_MEM_FREE( ptr ) \ + FT_BEGIN_STMNT \ + ft_mem_free( memory, (ptr) ); \ + (ptr) = NULL; \ + FT_END_STMNT + +#define FT_MEM_NEW( ptr ) \ + FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, 1, \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, (size), &error ) ) + +#define FT_MEM_QNEW( ptr ) \ + FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, 1, \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (item_size), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (itmsz), \ + (oldcnt), (newcnt), \ + (ptr), &error ) ) + +#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (item_size), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (itmsz), \ + (oldcnt), (newcnt), \ + (ptr), &error ) ) + + +#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) + + +#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) + +#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) + +#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) + + +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) + +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) + + +#define FT_ARRAY_ZERO( dest, count ) \ + FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_COPY( dest, source, count ) \ + FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_MOVE( dest, source, count ) \ + FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) ) + + + /* + * Return the maximum number of addressable elements in an array. + * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid + * any problems. + */ +#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) + +#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) + + + /*************************************************************************/ + /* */ + /* The following functions macros expect that their pointer argument is */ + /* _typed_ in order to automatically compute array element sizes. */ + /* */ + +#define FT_MEM_NEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QNEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + + +#define FT_ALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) + +#define FT_REALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) + +#define FT_ALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) + +#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_QALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) + +#define FT_QREALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) + +#define FT_QALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) + +#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) + +#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) + +#define FT_NEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + +#define FT_QNEW( ptr ) \ + FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) + +#define FT_QNEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE( FT_Error ) + FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ); + + FT_BASE( FT_Error ) + FT_QAlloc( FT_Memory memory, + FT_Long size, + void* *p ); + + FT_BASE( FT_Error ) + FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *P ); + + FT_BASE( FT_Error ) + FT_QRealloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *p ); + + FT_BASE( void ) + FT_Free( FT_Memory memory, + void* *P ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + FT_BASE( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ); + +#define FT_MEM_STRDUP( dst, str ) \ + (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error ) + +#define FT_STRDUP( dst, str ) \ + FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) + +#define FT_MEM_DUP( dst, address, size ) \ + (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) + +#define FT_DUP( dst, address, size ) \ + FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) + + + /* Return >= 1 if a truncation occurs. */ + /* Return 0 if the source string fits the buffer. */ + /* This is *not* the same as strlcpy(). */ + FT_BASE( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ); + +#define FT_STRCPYN( dst, src, size ) \ + ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) + + /* */ + + +FT_END_HEADER + +#endif /* __FTMEMORY_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftobjs.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftobjs.h new file mode 100644 index 000000000..574cf5829 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftobjs.h @@ -0,0 +1,1401 @@ +/***************************************************************************/ +/* */ +/* ftobjs.h */ +/* */ +/* The FreeType private base classes (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of all internal FreeType classes. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTOBJS_H__ +#define __FTOBJS_H__ + +#include <ft2build.h> +#include FT_RENDER_H +#include FT_SIZES_H +#include FT_LCD_FILTER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_AUTOHINT_H +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_PIC_H + +#ifdef FT_CONFIG_OPTION_INCREMENTAL +#include FT_INCREMENTAL_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Some generic definitions. */ + /* */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + + + /*************************************************************************/ + /* */ + /* The min and max functions missing in C. As usual, be careful not to */ + /* write things like FT_MIN( a++, b++ ) to avoid side effects. */ + /* */ +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) + +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + + +#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) +#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) +#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) + +#define FT_PIX_FLOOR( x ) ( (x) & ~63 ) +#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) +#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) + + + /* + * Return the highest power of 2 that is <= value; this correspond to + * the highest bit in a given 32-bit value. + */ + FT_BASE( FT_UInt32 ) + ft_highpow2( FT_UInt32 value ); + + + /* + * character classification functions -- since these are used to parse + * font files, we must not use those in <ctypes.h> which are + * locale-dependent + */ +#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) + +#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ + ( (unsigned)(x) - 'a' ) < 6U || \ + ( (unsigned)(x) - 'A' ) < 6U ) + + /* the next two macros assume ASCII representation */ +#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) +#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) + +#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) +#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R M A P S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to internal charmap object */ + typedef struct FT_CMapRec_* FT_CMap; + + /* handle to charmap class structure */ + typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; + + /* internal charmap object structure */ + typedef struct FT_CMapRec_ + { + FT_CharMapRec charmap; + FT_CMap_Class clazz; + + } FT_CMapRec; + + /* typecase any pointer to a charmap handle */ +#define FT_CMAP( x ) ((FT_CMap)( x )) + + /* obvious macros */ +#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id +#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id +#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding +#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face + + + /* class method definitions */ + typedef FT_Error + (*FT_CMap_InitFunc)( FT_CMap cmap, + FT_Pointer init_data ); + + typedef void + (*FT_CMap_DoneFunc)( FT_CMap cmap ); + + typedef FT_UInt + (*FT_CMap_CharIndexFunc)( FT_CMap cmap, + FT_UInt32 char_code ); + + typedef FT_UInt + (*FT_CMap_CharNextFunc)( FT_CMap cmap, + FT_UInt32 *achar_code ); + + typedef FT_UInt + (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap, + FT_CMap unicode_cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_Bool + (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap, + FT_UInt32 char_code, + FT_UInt32 variant_selector ); + + typedef FT_UInt32 * + (*FT_CMap_VariantListFunc)( FT_CMap cmap, + FT_Memory mem ); + + typedef FT_UInt32 * + (*FT_CMap_CharVariantListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 char_code ); + + typedef FT_UInt32 * + (*FT_CMap_VariantCharListFunc)( FT_CMap cmap, + FT_Memory mem, + FT_UInt32 variant_selector ); + + + typedef struct FT_CMap_ClassRec_ + { + FT_ULong size; + FT_CMap_InitFunc init; + FT_CMap_DoneFunc done; + FT_CMap_CharIndexFunc char_index; + FT_CMap_CharNextFunc char_next; + + /* Subsequent entries are special ones for format 14 -- the variant */ + /* selector subtable which behaves like no other */ + + FT_CMap_CharVarIndexFunc char_var_index; + FT_CMap_CharVarIsDefaultFunc char_var_default; + FT_CMap_VariantListFunc variant_list; + FT_CMap_CharVariantListFunc charvariant_list; + FT_CMap_VariantCharListFunc variantchar_list; + + } FT_CMap_ClassRec; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DECLARE_CMAP_CLASS(class_) \ + FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; + +#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_, variantchar_list_) \ + FT_CALLBACK_TABLE_DEF \ + const FT_CMap_ClassRec class_ = \ + { \ + size_, init_, done_, char_index_, char_next_, char_var_index_, \ + char_var_default_, variant_list_, charvariant_list_, variantchar_list_ \ + }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_CMAP_CLASS(class_) \ + void FT_Init_Class_##class_( FT_Library library, FT_CMap_ClassRec* clazz); + +#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_, variantchar_list_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_CMap_ClassRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->size = size_; \ + clazz->init = init_; \ + clazz->done = done_; \ + clazz->char_index = char_index_; \ + clazz->char_next = char_next_; \ + clazz->char_var_index = char_var_index_; \ + clazz->char_var_default = char_var_default_; \ + clazz->variant_list = variant_list_; \ + clazz->charvariant_list = charvariant_list_; \ + clazz->variantchar_list = variantchar_list_; \ + } +#endif /* FT_CONFIG_OPTION_PIC */ + + /* create a new charmap and add it to charmap->face */ + FT_BASE( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ); + + /* destroy a charmap and remove it from face's list */ + FT_BASE( void ) + FT_CMap_Done( FT_CMap cmap ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Face_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_Face */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* <Fields> */ + /* max_points :: */ + /* The maximal number of points used to store the vectorial outline */ + /* of any glyph in this face. If this value cannot be known in */ + /* advance, or if the face isn't scalable, this should be set to 0. */ + /* Only relevant for scalable formats. */ + /* */ + /* max_contours :: */ + /* The maximal number of contours used to store the vectorial */ + /* outline of any glyph in this face. If this value cannot be */ + /* known in advance, or if the face isn't scalable, this should be */ + /* set to 0. Only relevant for scalable formats. */ + /* */ + /* transform_matrix :: */ + /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ + /* outlines after they are loaded from the font. Only used by the */ + /* convenience functions. */ + /* */ + /* transform_delta :: */ + /* A translation vector used to transform glyph outlines after they */ + /* are loaded from the font. Only used by the convenience */ + /* functions. */ + /* */ + /* transform_flags :: */ + /* Some flags used to classify the transform. Only used by the */ + /* convenience functions. */ + /* */ + /* services :: */ + /* A cache for frequently used services. It should be only */ + /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ + /* */ + /* incremental_interface :: */ + /* If non-null, the interface through which glyph data and metrics */ + /* are loaded incrementally for faces that do not provide all of */ + /* this data when first opened. This field exists only if */ + /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ + /* */ + /* ignore_unpatented_hinter :: */ + /* This boolean flag instructs the glyph loader to ignore the */ + /* native font hinter, if one is found. This is exclusively used */ + /* in the case when the unpatented hinter is compiled within the */ + /* library. */ + /* */ + typedef struct FT_Face_InternalRec_ + { +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_UShort reserved1; + FT_Short reserved2; +#endif + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; + + FT_ServiceCacheRec services; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec* incremental_interface; +#endif + + FT_Bool ignore_unpatented_hinter; + + } FT_Face_InternalRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Slot_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_GlyphSlot */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* <Fields> */ + /* loader :: The glyph loader object used to load outlines */ + /* into the glyph slot. */ + /* */ + /* flags :: Possible values are zero or */ + /* FT_GLYPH_OWN_BITMAP. The latter indicates */ + /* that the FT_GlyphSlot structure owns the */ + /* bitmap buffer. */ + /* */ + /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */ + /* must be transformed through a specific */ + /* font transformation. This is _not_ the same */ + /* as the face transform set through */ + /* FT_Set_Transform(). */ + /* */ + /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */ + /* transformation, if necessary. */ + /* */ + /* glyph_delta :: The 2d translation vector corresponding to */ + /* the glyph transformation, if necessary. */ + /* */ + /* glyph_hints :: Format-specific glyph hints management. */ + /* */ + +#define FT_GLYPH_OWN_BITMAP 0x1 + + typedef struct FT_Slot_InternalRec_ + { + FT_GlyphLoader loader; + FT_UInt flags; + FT_Bool glyph_transformed; + FT_Matrix glyph_matrix; + FT_Vector glyph_delta; + void* glyph_hints; + + } FT_GlyphSlot_InternalRec; + + +#if 0 + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_Size */ + /* object. Currently, it's empty. */ + /* */ + /*************************************************************************/ + + typedef struct FT_Size_InternalRec_ + { + /* empty */ + + } FT_Size_InternalRec; + +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ModuleRec */ + /* */ + /* <Description> */ + /* A module object instance. */ + /* */ + /* <Fields> */ + /* clazz :: A pointer to the module's class. */ + /* */ + /* library :: A handle to the parent library object. */ + /* */ + /* memory :: A handle to the memory manager. */ + /* */ + /* generic :: A generic structure for user-level extensibility (?). */ + /* */ + typedef struct FT_ModuleRec_ + { + FT_Module_Class* clazz; + FT_Library library; + FT_Memory memory; + FT_Generic generic; + + } FT_ModuleRec; + + + /* typecast an object to a FT_Module */ +#define FT_MODULE( x ) ((FT_Module)( x )) +#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz +#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library +#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory + + +#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_FONT_DRIVER ) + +#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_RENDERER ) + +#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_HINTER ) + +#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_STYLER ) + +#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_SCALABLE ) + +#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_NO_OUTLINES ) + +#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_HAS_HINTER ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module_Interface */ + /* */ + /* <Description> */ + /* Finds a module and returns its specific interface as a typeless */ + /* pointer. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module-specific interface if available, 0 otherwise. */ + /* */ + /* <Note> */ + /* You should better be familiar with FreeType internals to know */ + /* which module to look for, and what its interface is :-) */ + /* */ + FT_BASE( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ); + + FT_BASE( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ); + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* a few macros used to perform easy typecasts with minimal brain damage */ + +#define FT_FACE( x ) ((FT_Face)(x)) +#define FT_SIZE( x ) ((FT_Size)(x)) +#define FT_SLOT( x ) ((FT_GlyphSlot)(x)) + +#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver +#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library +#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory +#define FT_FACE_STREAM( x ) FT_FACE( x )->stream + +#define FT_SIZE_FACE( x ) FT_SIZE( x )->face +#define FT_SLOT_FACE( x ) FT_SLOT( x )->face + +#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph +#define FT_FACE_SIZE( x ) FT_FACE( x )->size + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_GlyphSlot */ + /* */ + /* <Description> */ + /* It is sometimes useful to have more than one glyph slot for a */ + /* given face object. This function is used to create additional */ + /* slots. All of them are automatically discarded when the face is */ + /* destroyed. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* aslot :: A handle to a new glyph slot object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_BASE( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_GlyphSlot */ + /* */ + /* <Description> */ + /* Destroys a given glyph slot. Remember however that all slots are */ + /* automatically destroyed with its parent. Using this function is */ + /* not always mandatory. */ + /* */ + /* <Input> */ + /* slot :: A handle to a target glyph slot. */ + /* */ + FT_BASE( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ); + + /* */ + +#define FT_REQUEST_WIDTH( req ) \ + ( (req)->horiResolution \ + ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \ + : (req)->width ) + +#define FT_REQUEST_HEIGHT( req ) \ + ( (req)->vertResolution \ + ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \ + : (req)->height ) + + + /* Set the metrics according to a bitmap strike. */ + FT_BASE( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ); + + + /* Set the metrics according to a size request. */ + FT_BASE( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ); + + + /* Match a size request against `available_sizes'. */ + FT_BASE( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ); + + + /* Use the horizontal metrics to synthesize the vertical metrics. */ + /* If `advance' is zero, it is also synthesized. */ + FT_BASE( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ); + + + /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ + /* was allocated with ft_glyphslot_alloc_bitmap). */ + FT_BASE( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); + + + /* Allocate a new bitmap buffer in a glyph slot. */ + FT_BASE( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ); + + + /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ + /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ + FT_BASE( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FT_RENDERER( x ) ((FT_Renderer)( x )) +#define FT_GLYPH( x ) ((FT_Glyph)( x )) +#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x )) +#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x )) + + + typedef struct FT_RendererRec_ + { + FT_ModuleRec root; + FT_Renderer_Class* clazz; + FT_Glyph_Format glyph_format; + FT_Glyph_Class glyph_class; + + FT_Raster raster; + FT_Raster_Render_Func raster_render; + FT_Renderer_RenderFunc render; + + } FT_RendererRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F O N T D R I V E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* typecast a module into a driver easily */ +#define FT_DRIVER( x ) ((FT_Driver)(x)) + + /* typecast a module as a driver, and get its driver class */ +#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_DriverRec */ + /* */ + /* <Description> */ + /* The root font driver class. A font driver is responsible for */ + /* managing and loading font files of a given format. */ + /* */ + /* <Fields> */ + /* root :: Contains the fields of the root module class. */ + /* */ + /* clazz :: A pointer to the font driver's class. Note that */ + /* this is NOT root.clazz. `class' wasn't used */ + /* as it is a reserved word in C++. */ + /* */ + /* faces_list :: The list of faces currently opened by this */ + /* driver. */ + /* */ + /* extensions :: A typeless pointer to the driver's extensions */ + /* registry, if they are supported through the */ + /* configuration macro FT_CONFIG_OPTION_EXTENSIONS. */ + /* */ + /* glyph_loader :: The glyph loader for all faces managed by this */ + /* driver. This object isn't defined for unscalable */ + /* formats. */ + /* */ + typedef struct FT_DriverRec_ + { + FT_ModuleRec root; + FT_Driver_Class clazz; + + FT_ListRec faces_list; + void* extensions; + + FT_GlyphLoader glyph_loader; + + } FT_DriverRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R I E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* This hook is used by the TrueType debugger. It must be set to an */ + /* alternate truetype bytecode interpreter function. */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /* Set this debug hook to a non-null pointer to force unpatented hinting */ + /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */ + /* during debugging. */ +#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1 + + + typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, + FT_Render_Mode render_mode, + FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_LibraryRec */ + /* */ + /* <Description> */ + /* The FreeType library class. This is the root of all FreeType */ + /* data. Use FT_New_Library() to create a library object, and */ + /* FT_Done_Library() to discard it and all child objects. */ + /* */ + /* <Fields> */ + /* memory :: The library's memory object. Manages memory */ + /* allocation. */ + /* */ + /* generic :: Client data variable. Used to extend the */ + /* Library class by higher levels and clients. */ + /* */ + /* version_major :: The major version number of the library. */ + /* */ + /* version_minor :: The minor version number of the library. */ + /* */ + /* version_patch :: The current patch level of the library. */ + /* */ + /* num_modules :: The number of modules currently registered */ + /* within this library. This is set to 0 for new */ + /* libraries. New modules are added through the */ + /* FT_Add_Module() API function. */ + /* */ + /* modules :: A table used to store handles to the currently */ + /* registered modules. Note that each font driver */ + /* contains a list of its opened faces. */ + /* */ + /* renderers :: The list of renderers currently registered */ + /* within the library. */ + /* */ + /* cur_renderer :: The current outline renderer. This is a */ + /* shortcut used to avoid parsing the list on */ + /* each call to FT_Outline_Render(). It is a */ + /* handle to the current renderer for the */ + /* FT_GLYPH_FORMAT_OUTLINE format. */ + /* */ + /* auto_hinter :: XXX */ + /* */ + /* raster_pool :: The raster object's render pool. This can */ + /* ideally be changed dynamically at run-time. */ + /* */ + /* raster_pool_size :: The size of the render pool in bytes. */ + /* */ + /* debug_hooks :: XXX */ + /* */ + /* pic_container :: Contains global structs and tables, instead */ + /* of defining them globallly. */ + /* */ + + typedef struct FT_LibraryRec_ + { + FT_Memory memory; /* library's memory manager */ + + FT_Generic generic; + + FT_Int version_major; + FT_Int version_minor; + FT_Int version_patch; + + FT_UInt num_modules; + FT_Module modules[FT_MAX_MODULES]; /* module objects */ + + FT_ListRec renderers; /* list of renderers */ + FT_Renderer cur_renderer; /* current outline renderer */ + FT_Module auto_hinter; + + FT_Byte* raster_pool; /* scan-line conversion */ + /* render pool */ + FT_ULong raster_pool_size; /* size of render pool in bytes */ + + FT_DebugHook_Func debug_hooks[4]; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFilter lcd_filter; + FT_Int lcd_extra; /* number of extra pixels */ + FT_Byte lcd_weights[7]; /* filter weights, if any */ + FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ +#endif + +#ifdef FT_CONFIG_OPTION_PIC + FT_PIC_Container pic_container; +#endif + + } FT_LibraryRec; + + + FT_BASE( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ); + + FT_BASE( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + typedef const char* + (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); + + typedef FT_Error + (*FT_Face_GetGlyphNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory */ + /* */ + /* <Description> */ + /* Creates a new memory object. */ + /* */ + /* <Return> */ + /* A pointer to the new memory object. 0 in case of error. */ + /* */ + FT_BASE( FT_Memory ) + FT_New_Memory( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Memory */ + /* */ + /* <Description> */ + /* Discards memory manager. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory manager. */ + /* */ + FT_BASE( void ) + FT_Done_Memory( FT_Memory memory ); + +#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* Define default raster's interface. The default raster is located in */ + /* `src/base/ftraster.c'. */ + /* */ + /* Client applications can register new rasters through the */ + /* FT_Set_Raster() API. */ + +#ifndef FT_NO_DEFAULT_RASTER + FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; +#endif + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** PIC-Support Macros for ftimage.h ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DEFINE_OUTLINE_FUNCS */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Outline_Funcs struct. */ + /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ + /* called with a pre-allocated stracture to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_, \ + cubic_to_, shift_, delta_) \ + static const FT_Outline_Funcs class_ = \ + { \ + move_to_, line_to_, conic_to_, cubic_to_, shift_, delta_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_, \ + cubic_to_, shift_, delta_) \ + static FT_Error \ + Init_Class_##class_( FT_Outline_Funcs* clazz ) \ + { \ + clazz->move_to = move_to_; \ + clazz->line_to = line_to_; \ + clazz->conic_to = conic_to_; \ + clazz->cubic_to = cubic_to_; \ + clazz->shift = shift_; \ + clazz->delta = delta_; \ + return FT_Err_Ok; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DEFINE_RASTER_FUNCS */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Raster_Funcs struct. */ + /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ + /* called with a pre-allocated stracture to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_, \ + raster_reset_, raster_set_mode_, \ + raster_render_, raster_done_) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, raster_new_, raster_reset_, \ + raster_set_mode_, raster_render_, raster_done_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_, \ + raster_reset_, raster_set_mode_, raster_render_, raster_done_) \ + void \ + FT_Init_Class_##class_( FT_Raster_Funcs* clazz ) \ + { \ + clazz->glyph_format = glyph_format_; \ + clazz->raster_new = raster_new_; \ + clazz->raster_reset = raster_reset_; \ + clazz->raster_set_mode = raster_set_mode_; \ + clazz->raster_render = raster_render_; \ + clazz->raster_done = raster_done_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** PIC-Support Macros for ftrender.h ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DEFINE_GLYPH */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Glyph_Class struct. */ + /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */ + /* called with a pre-allocated stracture to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_, \ + transform_, bbox_, prepare_) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Glyph_Class class_ = \ + { \ + size_, format_, init_, done_, copy_, transform_, bbox_, prepare_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_, \ + transform_, bbox_, prepare_) \ + void \ + FT_Init_Class_##class_( FT_Glyph_Class* clazz ) \ + { \ + clazz->glyph_size = size_; \ + clazz->glyph_format = format_; \ + clazz->glyph_init = init_; \ + clazz->glyph_done = done_; \ + clazz->glyph_copy = copy_; \ + clazz->glyph_transform = transform_; \ + clazz->glyph_bbox = bbox_; \ + clazz->glyph_prepare = prepare_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DECLARE_RENDERER */ + /* */ + /* <Description> */ + /* Used to create a forward declaration of a */ + /* FT_Renderer_Class stract instance. */ + /* */ + /* <Macro> */ + /* FT_DEFINE_RENDERER */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Renderer_Class struct. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ + /* to called with a pointer where the allocated stracture is returned.*/ + /* And when it is no longer needed a Destroy function needs */ + /* to be called to release that allocation. */ + /* fcinit.c (ft_create_default_module_classes) already contains */ + /* a mechanism to call these functions for the default modules */ + /* described in ftmodule.h */ + /* */ + /* Notice that the created Create and Destroy functions call */ + /* pic_init and pic_free function to allow you to manually allocate */ + /* and initialize any additional global data, like module specific */ + /* interface, and put them in the global pic container defined in */ + /* ftpic.h. if you don't need them just implement the functions as */ + /* empty to resolve the link error. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DECLARE_RENDERER(class_) \ + FT_EXPORT_VAR( const FT_Renderer_Class ) class_; + +#define FT_DEFINE_RENDERER(class_, \ + flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_, \ + glyph_format_, render_glyph_, transform_glyph_, \ + get_glyph_cbox_, set_mode_, raster_class_ ) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Renderer_Class class_ = \ + { \ + FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_, \ + interface_,init_,done_,get_interface_) \ + glyph_format_, \ + \ + render_glyph_, \ + transform_glyph_, \ + get_glyph_cbox_, \ + set_mode_, \ + \ + raster_class_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_RENDERER(class_) FT_DECLARE_MODULE(class_) + +#define FT_DEFINE_RENDERER(class_, \ + flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_, \ + glyph_format_, render_glyph_, transform_glyph_, \ + get_glyph_cbox_, set_mode_, raster_class_ ) \ + void class_##_pic_free( FT_Library library ); \ + FT_Error class_##_pic_init( FT_Library library ); \ + \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \ + FT_Memory memory = library->memory; \ + class_##_pic_free( library ); \ + if ( rclazz ) \ + FT_FREE( rclazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Renderer_Class* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ + return error; \ + \ + error = class_##_pic_init( library ); \ + if(error) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_, \ + interface_,init_,done_,get_interface_) \ + \ + clazz->glyph_format = glyph_format_; \ + \ + clazz->render_glyph = render_glyph_; \ + clazz->transform_glyph = transform_glyph_; \ + clazz->get_glyph_cbox = get_glyph_cbox_; \ + clazz->set_mode = set_mode_; \ + \ + clazz->raster_class = raster_class_; \ + \ + *output_class = (FT_Module_Class*)clazz; \ + return FT_Err_Ok; \ + } + + + +#endif /* FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** PIC-Support Macros for ftmodapi.h ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef FT_CONFIG_OPTION_PIC + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Creator */ + /* */ + /* <Description> */ + /* A function used to create (allocate) a new module class object. */ + /* The object's members are initialized, but the module itself is */ + /* not. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory manager. */ + /* output_class :: Initialized with the newly allocated class. */ + /* */ + typedef FT_Error + (*FT_Module_Creator)( FT_Memory memory, + FT_Module_Class** output_class ); + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Module_Destroyer */ + /* */ + /* <Description> */ + /* A function used to destroy (deallocate) a module class object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory manager. */ + /* clazz :: Module class to destroy. */ + /* */ + typedef void + (*FT_Module_Destroyer)( FT_Memory memory, + FT_Module_Class* clazz ); + +#endif + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DECLARE_MODULE */ + /* */ + /* <Description> */ + /* Used to create a forward declaration of a */ + /* FT_Module_Class stract instance. */ + /* */ + /* <Macro> */ + /* FT_DEFINE_MODULE */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Module_Class struct. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ + /* to called with a pointer where the allocated stracture is returned.*/ + /* And when it is no longer needed a Destroy function needs */ + /* to be called to release that allocation. */ + /* fcinit.c (ft_create_default_module_classes) already contains */ + /* a mechanism to call these functions for the default modules */ + /* described in ftmodule.h */ + /* */ + /* Notice that the created Create and Destroy functions call */ + /* pic_init and pic_free function to allow you to manually allocate */ + /* and initialize any additional global data, like module specific */ + /* interface, and put them in the global pic container defined in */ + /* ftpic.h. if you don't need them just implement the functions as */ + /* empty to resolve the link error. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ + /* <Macro> */ + /* FT_DEFINE_ROOT_MODULE */ + /* */ + /* <Description> */ + /* Used to initialize an instance of FT_Module_Class struct inside */ + /* another stract that contains it or in a function that initializes */ + /* that containing stract */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DECLARE_MODULE(class_) \ + FT_CALLBACK_TABLE \ + const FT_Module_Class class_; \ + +#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_) \ + { \ + flags_, \ + size_, \ + \ + name_, \ + version_, \ + requires_, \ + \ + interface_, \ + \ + init_, \ + done_, \ + get_interface_, \ + }, + +#define FT_DEFINE_MODULE(class_, flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_) \ + FT_CALLBACK_TABLE_DEF \ + const FT_Module_Class class_ = \ + { \ + flags_, \ + size_, \ + \ + name_, \ + version_, \ + requires_, \ + \ + interface_, \ + \ + init_, \ + done_, \ + get_interface_, \ + }; + + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_MODULE(class_) \ + FT_Error FT_Create_Class_##class_( FT_Library library, \ + FT_Module_Class** output_class ); \ + void FT_Destroy_Class_##class_( FT_Library library, \ + FT_Module_Class* clazz ); + +#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_) \ + clazz->root.module_flags = flags_; \ + clazz->root.module_size = size_; \ + clazz->root.module_name = name_; \ + clazz->root.module_version = version_; \ + clazz->root.module_requires = requires_; \ + \ + clazz->root.module_interface = interface_; \ + \ + clazz->root.module_init = init_; \ + clazz->root.module_done = done_; \ + clazz->root.get_interface = get_interface_; + +#define FT_DEFINE_MODULE(class_, flags_, size_, name_, version_, requires_, \ + interface_, init_, done_, get_interface_) \ + void class_##_pic_free( FT_Library library ); \ + FT_Error class_##_pic_init( FT_Library library ); \ + \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + class_##_pic_free( library ); \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Memory memory = library->memory; \ + FT_Module_Class* clazz; \ + FT_Error error; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz) ) ) \ + return error; \ + error = class_##_pic_init( library ); \ + if(error) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + clazz->module_flags = flags_; \ + clazz->module_size = size_; \ + clazz->module_name = name_; \ + clazz->module_version = version_; \ + clazz->module_requires = requires_; \ + \ + clazz->module_interface = interface_; \ + \ + clazz->module_init = init_; \ + clazz->module_done = done_; \ + clazz->get_interface = get_interface_; \ + \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +FT_END_HEADER + +#endif /* __FTOBJS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftpic.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftpic.h new file mode 100644 index 000000000..1b31957d7 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftpic.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* ftpic.h */ +/* */ +/* The FreeType position independent code services (declaration). */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Modules that ordinarily have const global data that need address */ + /* can instead define pointers here. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTPIC_H__ +#define __FTPIC_H__ + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC + + typedef struct FT_PIC_Container_ + { + /* pic containers for base */ + void* base; + /* pic containers for modules */ + void* autofit; + void* cff; + void* pshinter; + void* psnames; + void* raster; + void* sfnt; + void* smooth; + void* truetype; + } FT_PIC_Container; + + /* Initialize the various function tables, structs, etc. stored in the container. */ + FT_BASE( FT_Error ) + ft_pic_container_init( FT_Library library ); + + + /* Destroy the contents of the container. */ + FT_BASE( void ) + ft_pic_container_destroy( FT_Library library ); + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __FTPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftrfork.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftrfork.h new file mode 100644 index 000000000..aa573c870 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftrfork.h @@ -0,0 +1,196 @@ +/***************************************************************************/ +/* */ +/* ftrfork.h */ +/* */ +/* Embedded resource forks accessor (specification). */ +/* */ +/* Copyright 2004, 2006, 2007 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#ifndef __FTRFORK_H__ +#define __FTRFORK_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Number of guessing rules supported in `FT_Raccess_Guess'. */ + /* Don't forget to increment the number if you add a new guessing rule. */ +#define FT_RACCESS_N_RULES 9 + + + /* A structure to describe a reference in a resource by its resource ID */ + /* and internal offset. The `POST' resource expects to be concatenated */ + /* by the order of resource IDs instead of its appearance in the file. */ + + typedef struct FT_RFork_Ref_ + { + FT_UShort res_id; + FT_ULong offset; + + } FT_RFork_Ref; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Guess */ + /* */ + /* <Description> */ + /* Guess a file name and offset where the actual resource fork is */ + /* stored. The macro FT_RACCESS_N_RULES holds the number of */ + /* guessing rules; the guessed result for the Nth rule is */ + /* represented as a triplet: a new file name (new_names[N]), a file */ + /* offset (offsets[N]), and an error code (errors[N]). */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* base_name :: */ + /* The (base) file name of the resource fork used for some */ + /* guessing rules. */ + /* */ + /* <Output> */ + /* new_names :: */ + /* An array of guessed file names in which the resource forks may */ + /* exist. If `new_names[N]' is NULL, the guessed file name is */ + /* equal to `base_name'. */ + /* */ + /* offsets :: */ + /* An array of guessed file offsets. `offsets[N]' holds the file */ + /* offset of the possible start of the resource fork in file */ + /* `new_names[N]'. */ + /* */ + /* errors :: */ + /* An array of FreeType error codes. `errors[N]' is the error */ + /* code of Nth guessing rule function. If `errors[N]' is not */ + /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */ + /* */ + FT_BASE( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char** new_names, + FT_Long* offsets, + FT_Error* errors ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_HeaderInfo */ + /* */ + /* <Description> */ + /* Get the information from the header of resource fork. The */ + /* information includes the file offset where the resource map */ + /* starts, and the file offset where the resource data starts. */ + /* `FT_Raccess_Get_DataOffsets' requires these two data. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* rfork_offset :: */ + /* The file offset where the resource fork starts. */ + /* */ + /* <Output> */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_DataOffsets */ + /* */ + /* <Description> */ + /* Get the data offsets for a tag in a resource fork. Offsets are */ + /* stored in an array because, in some cases, resources in a resource */ + /* fork have the same tag. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* tag :: */ + /* The resource tag. */ + /* */ + /* <Output> */ + /* offsets :: */ + /* The stream offsets for the resource data specified by `tag'. */ + /* This array is allocated by the function, so you have to call */ + /* @ft_mem_free after use. */ + /* */ + /* count :: */ + /* The length of offsets array. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + /* <Note> */ + /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */ + /* value for `map_offset' and `rdata_pos'. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ); + + +FT_END_HEADER + +#endif /* __FTRFORK_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftserv.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftserv.h new file mode 100644 index 000000000..569b9f7e0 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftserv.h @@ -0,0 +1,620 @@ +/***************************************************************************/ +/* */ +/* ftserv.h */ +/* */ +/* The FreeType services (specification only). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Each module can export one or more `services'. Each service is */ + /* identified by a constant string and modeled by a pointer; the latter */ + /* generally corresponds to a structure containing function pointers. */ + /* */ + /* Note that a service's data cannot be a mere function pointer because */ + /* in C it is possible that function pointers might be implemented */ + /* differently than data pointers (e.g. 48 bits instead of 32). */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSERV_H__ +#define __FTSERV_H__ + + +FT_BEGIN_HEADER + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* we disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + /* + * @macro: + * FT_FACE_FIND_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * @macro: + * FT_FACE_FIND_GLOBAL_SERVICE + * + * @description: + * This macro is used to look up a service from all modules. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E D E S C R I P T O R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The following structure is used to _describe_ a given service + * to the library. This is useful to build simple static service lists. + */ + typedef struct FT_ServiceDescRec_ + { + const char* serv_id; /* service name */ + const void* serv_data; /* service pointer/data */ + + } FT_ServiceDescRec; + + typedef const FT_ServiceDescRec* FT_ServiceDesc; + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_DEFINE_SERVICEDESCREC1 .. FT_DEFINE_SERVICEDESCREC6 */ + /* */ + /* <Description> */ + /* Used to initialize an array of FT_ServiceDescRec structs. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ + /* to called with a pointer where the allocated array is returned. */ + /* And when it is no longer needed a Destroy function needs */ + /* to be called to release that allocation. */ + /* */ + /* These functions should be manyally called from the pic_init and */ + /* pic_free functions of your module (see FT_DEFINE_MODULE) */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the array will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {serv_id_3, serv_data_3}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {serv_id_3, serv_data_3}, \ + {serv_id_4, serv_data_4}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, serv_id_5, serv_data_5) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {serv_id_3, serv_data_3}, \ + {serv_id_4, serv_data_4}, \ + {serv_id_5, serv_data_5}, \ + {NULL, NULL} \ + }; +#define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6) \ + static const FT_ServiceDescRec class_[] = \ + { \ + {serv_id_1, serv_data_1}, \ + {serv_id_2, serv_data_2}, \ + {serv_id_3, serv_data_3}, \ + {serv_id_4, serv_data_4}, \ + {serv_id_5, serv_data_5}, \ + {serv_id_6, serv_data_6}, \ + {NULL, NULL} \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*2 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = NULL; \ + clazz[1].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*3 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = NULL; \ + clazz[2].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*4 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = NULL; \ + clazz[3].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*5 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = NULL; \ + clazz[4].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, serv_id_4, \ + serv_data_4, serv_id_5, serv_data_5) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*6 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = NULL; \ + clazz[5].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6) \ + void \ + FT_Destroy_Class_##class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_##class_( FT_Library library, \ + FT_ServiceDescRec** output_class) \ + { \ + FT_ServiceDescRec* clazz; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + if ( FT_ALLOC( clazz, sizeof(*clazz)*7 ) ) \ + return error; \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = serv_id_6; \ + clazz[5].serv_data = serv_data_6; \ + clazz[6].serv_id = NULL; \ + clazz[6].serv_data = NULL; \ + *output_class = clazz; \ + return FT_Err_Ok; \ + } +#endif /* FT_CONFIG_OPTION_PIC */ + + /* + * Parse a list of FT_ServiceDescRec descriptors and look for + * a specific service by ID. Note that the last element in the + * array must be { NULL, NULL }, and that the function should + * return NULL if the service isn't available. + * + * This function can be used by modules to implement their + * `get_service' method. + */ + FT_BASE( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E S C A C H E *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * This structure is used to store a cache for several frequently used + * services. It is the type of `face->internal->services'. You + * should only use FT_FACE_LOOKUP_SERVICE to access it. + * + * All fields should have the type FT_Pointer to relax compilation + * dependencies. We assume the developer isn't completely stupid. + * + * Each field must be named `service_XXXX' where `XXX' corresponds to + * the correct FT_SERVICE_ID_XXXX macro. See the definition of + * FT_FACE_LOOKUP_SERVICE below how this is implemented. + * + */ + typedef struct FT_ServiceCacheRec_ + { + FT_Pointer service_POSTSCRIPT_FONT_NAME; + FT_Pointer service_MULTI_MASTERS; + FT_Pointer service_GLYPH_DICT; + FT_Pointer service_PFR_METRICS; + FT_Pointer service_WINFNT; + + } FT_ServiceCacheRec, *FT_ServiceCache; + + + /* + * A magic number used within the services cache. + */ +#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */ + + + /* + * @macro: + * FT_FACE_LOOKUP_SERVICE + * + * @description: + * This macro is used to lookup a service from a face's driver module + * using its cache. + * + * @input: + * face:: + * The source face handle containing the cache. + * + * field :: + * The field name in the cache. + * + * id :: + * The service ID. + * + * @output: + * ptr :: + * A variable receiving the service data. NULL if not available. + */ +#ifdef __cplusplus + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + *Pptr = svc; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + ptr = svc; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * A macro used to define new service structure types. + */ + +#define FT_DEFINE_SERVICE( name ) \ + typedef struct FT_Service_ ## name ## Rec_ \ + FT_Service_ ## name ## Rec ; \ + typedef struct FT_Service_ ## name ## Rec_ \ + const * FT_Service_ ## name ; \ + struct FT_Service_ ## name ## Rec_ + + /* */ + + /* + * The header files containing the services. + */ + +#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> +#define FT_SERVICE_CID_H <freetype/internal/services/svcid.h> +#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> +#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h> +#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h> +#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> +#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h> +#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> +#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> +#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> +#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> +#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> +#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h> +#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> +#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> +#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h> +#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h> + + /* */ + +FT_END_HEADER + +#endif /* __FTSERV_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftstream.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftstream.h new file mode 100644 index 000000000..a91eb72d9 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftstream.h @@ -0,0 +1,539 @@ +/***************************************************************************/ +/* */ +/* ftstream.h */ +/* */ +/* Stream handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSTREAM_H__ +#define __FTSTREAM_H__ + + +#include <ft2build.h> +#include FT_SYSTEM_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* format of an 8-bit frame_op value: */ + /* */ + /* bit 76543210 */ + /* xxxxxxes */ + /* */ + /* s is set to 1 if the value is signed. */ + /* e is set to 1 if the value is little-endian. */ + /* xxx is a command. */ + +#define FT_FRAME_OP_SHIFT 2 +#define FT_FRAME_OP_SIGNED 1 +#define FT_FRAME_OP_LITTLE 2 +#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) + +#define FT_MAKE_FRAME_OP( command, little, sign ) \ + ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) + +#define FT_FRAME_OP_END 0 +#define FT_FRAME_OP_START 1 /* start a new frame */ +#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ +#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ +#define FT_FRAME_OP_LONG 4 /* read 4-byte value */ +#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ +#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ + + + typedef enum FT_Frame_Op_ + { + ft_frame_end = 0, + ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), + + ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), + ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), + + ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), + ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), + ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), + ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), + + ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), + ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), + ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), + ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), + + ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), + ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), + ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), + ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), + + ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), + ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) + + } FT_Frame_Op; + + + typedef struct FT_Frame_Field_ + { + FT_Byte value; + FT_Byte size; + FT_UShort offset; + + } FT_Frame_Field; + + + /* Construct an FT_Frame_Field out of a structure type and a field name. */ + /* The structure type must be set in the FT_STRUCTURE macro before */ + /* calling the FT_FRAME_START() macro. */ + /* */ +#define FT_FIELD_SIZE( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) + +#define FT_FIELD_SIZE_DELTA( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) + +#define FT_FIELD_OFFSET( f ) \ + (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) + +#define FT_FRAME_FIELD( frame_op, field ) \ + { \ + frame_op, \ + FT_FIELD_SIZE( field ), \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } + +#define FT_FRAME_START( size ) { ft_frame_start, 0, size } +#define FT_FRAME_END { ft_frame_end, 0, 0 } + +#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) +#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) +#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) +#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) +#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) +#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) +#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) +#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) + +#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) +#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) +#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) +#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) +#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) +#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) + +#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } +#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } +#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } + +#define FT_FRAME_BYTES( field, count ) \ + { \ + ft_frame_bytes, \ + count, \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } + + + /*************************************************************************/ + /* */ + /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */ + /* type `char*' or equivalent (1-byte elements). */ + /* */ + +#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) +#define FT_INT8_( p, i ) ( ((const FT_Char*)(p))[(i)] ) + +#define FT_INT16( x ) ( (FT_Int16)(x) ) +#define FT_UINT16( x ) ( (FT_UInt16)(x) ) +#define FT_INT32( x ) ( (FT_Int32)(x) ) +#define FT_UINT32( x ) ( (FT_UInt32)(x) ) + +#define FT_BYTE_I16( p, i, s ) ( FT_INT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_I32( p, i, s ) ( FT_INT32( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) + +#define FT_INT8_I16( p, i, s ) ( FT_INT16( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_U16( p, i, s ) ( FT_UINT16( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_I32( p, i, s ) ( FT_INT32( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_U32( p, i, s ) ( FT_UINT32( FT_INT8_( p, i ) ) << (s) ) + + +#define FT_PEEK_SHORT( p ) FT_INT16( FT_INT8_I16( p, 0, 8) | \ + FT_BYTE_I16( p, 1, 0) ) + +#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ + FT_BYTE_U16( p, 1, 0 ) ) + +#define FT_PEEK_LONG( p ) FT_INT32( FT_INT8_I32( p, 0, 24 ) | \ + FT_BYTE_I32( p, 1, 16 ) | \ + FT_BYTE_I32( p, 2, 8 ) | \ + FT_BYTE_I32( p, 3, 0 ) ) + +#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) | \ + FT_BYTE_U32( p, 3, 0 ) ) + +#define FT_PEEK_OFF3( p ) FT_INT32( FT_INT8_I32( p, 0, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 2, 0 ) ) + +#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 2, 0 ) ) + +#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_INT8_I16( p, 1, 8 ) | \ + FT_BYTE_I16( p, 0, 0 ) ) + +#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ + FT_BYTE_U16( p, 0, 0 ) ) + +#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_INT8_I32( p, 3, 24 ) | \ + FT_BYTE_I32( p, 2, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 0, 0 ) ) + +#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ + FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_INT8_I32( p, 2, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 0, 0 ) ) + +#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + + +#define FT_NEXT_CHAR( buffer ) \ + ( (signed char)*buffer++ ) + +#define FT_NEXT_BYTE( buffer ) \ + ( (unsigned char)*buffer++ ) + +#define FT_NEXT_SHORT( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) ) + +#define FT_NEXT_LONG( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) ) + + +#define FT_NEXT_SHORT_LE( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT_LE( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3_LE( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3_LE( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_LONG_LE( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG_LE( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) ) + + + /*************************************************************************/ + /* */ + /* Each GET_xxxx() macro uses an implicit `stream' variable. */ + /* */ +#if 0 +#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor ) + +#define FT_GET_CHAR() FT_GET_MACRO( CHAR ) +#define FT_GET_BYTE() FT_GET_MACRO( BYTE ) +#define FT_GET_SHORT() FT_GET_MACRO( SHORT ) +#define FT_GET_USHORT() FT_GET_MACRO( USHORT ) +#define FT_GET_OFF3() FT_GET_MACRO( OFF3 ) +#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 ) +#define FT_GET_LONG() FT_GET_MACRO( LONG ) +#define FT_GET_ULONG() FT_GET_MACRO( ULONG ) +#define FT_GET_TAG4() FT_GET_MACRO( ULONG ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE ) +#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE ) + +#else +#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) + +#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char ) +#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte ) +#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_Short ) +#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_UShort ) +#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_Long ) +#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_ULong ) +#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetLong, FT_Long ) +#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) +#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_Short ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_UShort ) +#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_Long ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_ULong ) +#endif + +#define FT_READ_MACRO( func, type, var ) \ + ( var = (type)func( stream, &error ), \ + error != FT_Err_Ok ) + +#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var ) +#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var ) +#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_Short, var ) +#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_UShort, var ) +#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_Long, var ) +#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_ULong, var ) +#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_Long, var ) +#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_ULong, var ) + +#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_Short, var ) +#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_UShort, var ) +#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_Long, var ) +#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_ULong, var ) + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /* initialize a stream for reading a regular system stream */ + FT_BASE( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ); + +#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* create a new (input) stream from an FT_Open_Args structure */ + FT_BASE( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ); + + /* free a stream */ + FT_BASE( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ); + + /* initialize a stream for reading in-memory data */ + FT_BASE( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ); + + /* close a stream (does not destroy the stream structure) */ + FT_BASE( void ) + FT_Stream_Close( FT_Stream stream ); + + + /* seek within a stream. position is relative to start of stream */ + FT_BASE( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ); + + /* skip bytes in a stream */ + FT_BASE( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ); + + /* return current stream position */ + FT_BASE( FT_Long ) + FT_Stream_Pos( FT_Stream stream ); + + /* read bytes from a stream into a user-allocated buffer, returns an */ + /* error if not all bytes could be read. */ + FT_BASE( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* read bytes from a stream at a given position */ + FT_BASE( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ); + + /* try to read bytes at the end of a stream; return number of bytes */ + /* really available */ + FT_BASE( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ + /* error if the frame could not be read/accessed. The caller can use */ + /* the FT_Stream_Get_XXX functions to retrieve frame data without */ + /* error checks. */ + /* */ + /* You must _always_ call FT_Stream_ExitFrame() once you have entered */ + /* a stream frame! */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ); + + /* exit a stream frame */ + FT_BASE( void ) + FT_Stream_ExitFrame( FT_Stream stream ); + + /* Extract a stream frame. If the stream is disk-based, a heap block */ + /* is allocated and the frame bytes are read into it. If the stream */ + /* is memory-based, this function simply set a pointer to the data. */ + /* */ + /* Useful to optimize access to memory-based streams transparently. */ + /* */ + /* All extracted frames must be `freed' with a call to the function */ + /* FT_Stream_ReleaseFrame(). */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ); + + /* release an extract frame (see FT_Stream_ExtractFrame) */ + FT_BASE( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ); + + /* read a byte from an entered frame */ + FT_BASE( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ); + + /* read a 16-bit big-endian integer from an entered frame */ + FT_BASE( FT_Short ) + FT_Stream_GetShort( FT_Stream stream ); + + /* read a 24-bit big-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetOffset( FT_Stream stream ); + + /* read a 32-bit big-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetLong( FT_Stream stream ); + + /* read a 16-bit little-endian integer from an entered frame */ + FT_BASE( FT_Short ) + FT_Stream_GetShortLE( FT_Stream stream ); + + /* read a 32-bit little-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetLongLE( FT_Stream stream ); + + + /* read a byte from a stream */ + FT_BASE( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit big-endian integer from a stream */ + FT_BASE( FT_Short ) + FT_Stream_ReadShort( FT_Stream stream, + FT_Error* error ); + + /* read a 24-bit big-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadOffset( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit big-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadLong( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit little-endian integer from a stream */ + FT_BASE( FT_Short ) + FT_Stream_ReadShortLE( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit little-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadLongLE( FT_Stream stream, + FT_Error* error ); + + /* Read a structure from a stream. The structure must be described */ + /* by an array of FT_Frame_Field records. */ + FT_BASE( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ); + + +#define FT_STREAM_POS() \ + FT_Stream_Pos( stream ) + +#define FT_STREAM_SEEK( position ) \ + FT_SET_ERROR( FT_Stream_Seek( stream, position ) ) + +#define FT_STREAM_SKIP( distance ) \ + FT_SET_ERROR( FT_Stream_Skip( stream, distance ) ) + +#define FT_STREAM_READ( buffer, count ) \ + FT_SET_ERROR( FT_Stream_Read( stream, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FT_STREAM_READ_AT( position, buffer, count ) \ + FT_SET_ERROR( FT_Stream_ReadAt( stream, \ + position, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FT_STREAM_READ_FIELDS( fields, object ) \ + FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) + + +#define FT_FRAME_ENTER( size ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, size ) ) ) + +#define FT_FRAME_EXIT() \ + FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) ) + +#define FT_FRAME_EXTRACT( size, bytes ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, size, \ + (FT_Byte**)&(bytes) ) ) ) + +#define FT_FRAME_RELEASE( bytes ) \ + FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \ + (FT_Byte**)&(bytes) ) ) + + +FT_END_HEADER + +#endif /* __FTSTREAM_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/fttrace.h b/alienblaster/project/jni/freetype/include/freetype/internal/fttrace.h new file mode 100644 index 000000000..e9b383a58 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/fttrace.h @@ -0,0 +1,139 @@ +/***************************************************************************/ +/* */ +/* fttrace.h */ +/* */ +/* Tracing handling (specification only). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* definitions of trace levels for FreeType 2 */ + + /* the first level must always be `trace_any' */ +FT_TRACE_DEF( any ) + + /* base components */ +FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ +FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ +FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ +FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ +FT_TRACE_DEF( list ) /* list management (ftlist.c) */ +FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ +FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ +FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ +FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ +FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */ + +FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ +FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ +FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ +FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ +FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */ + + /* Cache sub-system */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ + + /* SFNT driver components */ +FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */ +FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ +FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ +FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ +FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */ +FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ +FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ +FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */ + + /* TrueType driver components */ +FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ +FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ +FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ +FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ +FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ +FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */ + + /* Type 1 driver components */ +FT_TRACE_DEF( t1afm ) +FT_TRACE_DEF( t1driver ) +FT_TRACE_DEF( t1gload ) +FT_TRACE_DEF( t1hint ) +FT_TRACE_DEF( t1load ) +FT_TRACE_DEF( t1objs ) +FT_TRACE_DEF( t1parse ) + + /* PostScript helper module `psaux' */ +FT_TRACE_DEF( t1decode ) +FT_TRACE_DEF( psobjs ) + + /* PostScript hinting module `pshinter' */ +FT_TRACE_DEF( pshrec ) +FT_TRACE_DEF( pshalgo1 ) +FT_TRACE_DEF( pshalgo2 ) + + /* Type 2 driver components */ +FT_TRACE_DEF( cffdriver ) +FT_TRACE_DEF( cffgload ) +FT_TRACE_DEF( cffload ) +FT_TRACE_DEF( cffobjs ) +FT_TRACE_DEF( cffparse ) + + /* Type 42 driver component */ +FT_TRACE_DEF( t42 ) + + /* CID driver components */ +FT_TRACE_DEF( cidafm ) +FT_TRACE_DEF( ciddriver ) +FT_TRACE_DEF( cidgload ) +FT_TRACE_DEF( cidload ) +FT_TRACE_DEF( cidobjs ) +FT_TRACE_DEF( cidparse ) + + /* Windows font component */ +FT_TRACE_DEF( winfnt ) + + /* PCF font components */ +FT_TRACE_DEF( pcfdriver ) +FT_TRACE_DEF( pcfread ) + + /* BDF font components */ +FT_TRACE_DEF( bdfdriver ) +FT_TRACE_DEF( bdflib ) + + /* PFR font component */ +FT_TRACE_DEF( pfr ) + + /* OpenType validation components */ +FT_TRACE_DEF( otvmodule ) +FT_TRACE_DEF( otvcommon ) +FT_TRACE_DEF( otvbase ) +FT_TRACE_DEF( otvgdef ) +FT_TRACE_DEF( otvgpos ) +FT_TRACE_DEF( otvgsub ) +FT_TRACE_DEF( otvjstf ) +FT_TRACE_DEF( otvmath ) + + /* TrueTypeGX/AAT validation components */ +FT_TRACE_DEF( gxvmodule ) +FT_TRACE_DEF( gxvcommon ) +FT_TRACE_DEF( gxvfeat ) +FT_TRACE_DEF( gxvmort ) +FT_TRACE_DEF( gxvmorx ) +FT_TRACE_DEF( gxvbsln ) +FT_TRACE_DEF( gxvjust ) +FT_TRACE_DEF( gxvkern ) +FT_TRACE_DEF( gxvopbd ) +FT_TRACE_DEF( gxvtrak ) +FT_TRACE_DEF( gxvprop ) +FT_TRACE_DEF( gxvlcar ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/ftvalid.h b/alienblaster/project/jni/freetype/include/freetype/internal/ftvalid.h new file mode 100644 index 000000000..00cd85e7b --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/ftvalid.h @@ -0,0 +1,150 @@ +/***************************************************************************/ +/* */ +/* ftvalid.h */ +/* */ +/* FreeType validation support (specification). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTVALID_H__ +#define __FTVALID_H__ + +#include <ft2build.h> +#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** V A L I D A T I O N ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to a validation object */ + typedef struct FT_ValidatorRec_ volatile* FT_Validator; + + + /*************************************************************************/ + /* */ + /* There are three distinct validation levels defined here: */ + /* */ + /* FT_VALIDATE_DEFAULT :: */ + /* A table that passes this validation level can be used reliably by */ + /* FreeType. It generally means that all offsets have been checked to */ + /* prevent out-of-bound reads, that array counts are correct, etc. */ + /* */ + /* FT_VALIDATE_TIGHT :: */ + /* A table that passes this validation level can be used reliably and */ + /* doesn't contain invalid data. For example, a charmap table that */ + /* returns invalid glyph indices will not pass, even though it can */ + /* be used with FreeType in default mode (the library will simply */ + /* return an error later when trying to load the glyph). */ + /* */ + /* It also checks that fields which must be a multiple of 2, 4, or 8, */ + /* don't have incorrect values, etc. */ + /* */ + /* FT_VALIDATE_PARANOID :: */ + /* Only for font debugging. Checks that a table follows the */ + /* specification by 100%. Very few fonts will be able to pass this */ + /* level anyway but it can be useful for certain tools like font */ + /* editors/converters. */ + /* */ + typedef enum FT_ValidationLevel_ + { + FT_VALIDATE_DEFAULT = 0, + FT_VALIDATE_TIGHT, + FT_VALIDATE_PARANOID + + } FT_ValidationLevel; + + + /* validator structure */ + typedef struct FT_ValidatorRec_ + { + const FT_Byte* base; /* address of table in memory */ + const FT_Byte* limit; /* `base' + sizeof(table) in memory */ + FT_ValidationLevel level; /* validation level */ + FT_Error error; /* error returned. 0 means success */ + + ft_jmp_buf jump_buffer; /* used for exception handling */ + + } FT_ValidatorRec; + + +#define FT_VALIDATOR( x ) ((FT_Validator)( x )) + + + FT_BASE( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ); + + /* Do not use this. It's broken and will cause your validator to crash */ + /* if you run it on an invalid font. */ + FT_BASE( FT_Int ) + ft_validator_run( FT_Validator valid ); + + /* Sets the error field in a validator, then calls `longjmp' to return */ + /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ + /* error checks within the validation routines. */ + /* */ + FT_BASE( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ); + + + /* Calls ft_validate_error. Assumes that the `valid' local variable */ + /* holds a pointer to the current validator object. */ + /* */ + /* Use preprocessor prescan to pass FT_ERR_PREFIX. */ + /* */ +#define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error ) +#define FT_INVALID_( _prefix, _error ) \ + ft_validator_error( valid, _prefix ## _error ) + + /* called when a broken table is detected */ +#define FT_INVALID_TOO_SHORT \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + /* called when an invalid offset is detected */ +#define FT_INVALID_OFFSET \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Offset ) + + /* called when an invalid format/value is detected */ +#define FT_INVALID_FORMAT \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + /* called when an invalid glyph index is detected */ +#define FT_INVALID_GLYPH_ID \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index ) + + /* called when an invalid field value is detected */ +#define FT_INVALID_DATA \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + +FT_END_HEADER + +#endif /* __FTVALID_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/internal.h b/alienblaster/project/jni/freetype/include/freetype/internal/internal.h new file mode 100644 index 000000000..f500a651c --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/internal.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* internal.h */ +/* */ +/* Internal header files (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is automatically included by `ft2build.h'. */ + /* Do not include it manually! */ + /* */ + /*************************************************************************/ + + +#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> +#define FT_INTERNAL_PIC_H <freetype/internal/ftpic.h> +#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> +#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> +#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> +#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> +#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> +#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> +#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> +#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> +#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h> +#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h> +#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h> + +#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> +#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> + +#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> +#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> +#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> + +#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h> + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/pcftypes.h b/alienblaster/project/jni/freetype/include/freetype/internal/pcftypes.h new file mode 100644 index 000000000..382796ffb --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/pcftypes.h @@ -0,0 +1,56 @@ +/* pcftypes.h + + FreeType font driver for pcf fonts + + Copyright (C) 2000, 2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFTYPES_H__ +#define __PCFTYPES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct PCF_Public_FaceRec_ + { + FT_FaceRec root; + FT_StreamRec gzip_stream; + FT_Stream gzip_source; + + char* charset_encoding; + char* charset_registry; + + } PCF_Public_FaceRec, *PCF_Public_Face; + + +FT_END_HEADER + +#endif /* __PCFTYPES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/psaux.h b/alienblaster/project/jni/freetype/include/freetype/internal/psaux.h new file mode 100644 index 000000000..a96e0dfa8 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/psaux.h @@ -0,0 +1,873 @@ +/***************************************************************************/ +/* */ +/* psaux.h */ +/* */ +/* Auxiliary functions and data structures related to PostScript fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSAUX_H__ +#define __PSAUX_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_TableRec_* PS_Table; + typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_Table_FuncsRec */ + /* */ + /* <Description> */ + /* A set of function pointers to manage PS_Table objects. */ + /* */ + /* <Fields> */ + /* table_init :: Used to initialize a table. */ + /* */ + /* table_done :: Finalizes resp. destroy a given table. */ + /* */ + /* table_add :: Adds a new object to a table. */ + /* */ + /* table_release :: Releases table data, then finalizes it. */ + /* */ + typedef struct PS_Table_FuncsRec_ + { + FT_Error + (*init)( PS_Table table, + FT_Int count, + FT_Memory memory ); + + void + (*done)( PS_Table table ); + + FT_Error + (*add)( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ); + + void + (*release)( PS_Table table ); + + } PS_Table_FuncsRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_TableRec */ + /* */ + /* <Description> */ + /* A PS_Table is a simple object used to store an array of objects in */ + /* a single memory block. */ + /* */ + /* <Fields> */ + /* block :: The address in memory of the growheap's block. This */ + /* can change between two object adds, due to */ + /* reallocation. */ + /* */ + /* cursor :: The current top of the grow heap within its block. */ + /* */ + /* capacity :: The current size of the heap block. Increments by */ + /* 1kByte chunks. */ + /* */ + /* max_elems :: The maximum number of elements in table. */ + /* */ + /* num_elems :: The current number of elements in table. */ + /* */ + /* elements :: A table of element addresses within the block. */ + /* */ + /* lengths :: A table of element sizes within the block. */ + /* */ + /* memory :: The object used for memory operations */ + /* (alloc/realloc). */ + /* */ + /* funcs :: A table of method pointers for this object. */ + /* */ + typedef struct PS_TableRec_ + { + FT_Byte* block; /* current memory block */ + FT_Offset cursor; /* current cursor in memory block */ + FT_Offset capacity; /* current size of memory block */ + FT_Long init; + + FT_Int max_elems; + FT_Int num_elems; + FT_Byte** elements; /* addresses of table elements */ + FT_PtrDist* lengths; /* lengths of table elements */ + + FT_Memory memory; + PS_Table_FuncsRec funcs; + + } PS_TableRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 FIELDS & TOKENS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PS_ParserRec_* PS_Parser; + + typedef struct T1_TokenRec_* T1_Token; + + typedef struct T1_FieldRec_* T1_Field; + + + /* simple enumeration type used to identify token types */ + typedef enum T1_TokenType_ + { + T1_TOKEN_TYPE_NONE = 0, + T1_TOKEN_TYPE_ANY, + T1_TOKEN_TYPE_STRING, + T1_TOKEN_TYPE_ARRAY, + T1_TOKEN_TYPE_KEY, /* aka `name' */ + + /* do not remove */ + T1_TOKEN_TYPE_MAX + + } T1_TokenType; + + + /* a simple structure used to identify tokens */ + typedef struct T1_TokenRec_ + { + FT_Byte* start; /* first character of token in input stream */ + FT_Byte* limit; /* first character after the token */ + T1_TokenType type; /* type of token */ + + } T1_TokenRec; + + + /* enumeration type used to identify object fields */ + typedef enum T1_FieldType_ + { + T1_FIELD_TYPE_NONE = 0, + T1_FIELD_TYPE_BOOL, + T1_FIELD_TYPE_INTEGER, + T1_FIELD_TYPE_FIXED, + T1_FIELD_TYPE_FIXED_1000, + T1_FIELD_TYPE_STRING, + T1_FIELD_TYPE_KEY, + T1_FIELD_TYPE_BBOX, + T1_FIELD_TYPE_INTEGER_ARRAY, + T1_FIELD_TYPE_FIXED_ARRAY, + T1_FIELD_TYPE_CALLBACK, + + /* do not remove */ + T1_FIELD_TYPE_MAX + + } T1_FieldType; + + + typedef enum T1_FieldLocation_ + { + T1_FIELD_LOCATION_CID_INFO, + T1_FIELD_LOCATION_FONT_DICT, + T1_FIELD_LOCATION_FONT_EXTRA, + T1_FIELD_LOCATION_FONT_INFO, + T1_FIELD_LOCATION_PRIVATE, + T1_FIELD_LOCATION_BBOX, + T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, + T1_FIELD_LOCATION_BLEND, + + /* do not remove */ + T1_FIELD_LOCATION_MAX + + } T1_FieldLocation; + + + typedef void + (*T1_Field_ParseFunc)( FT_Face face, + FT_Pointer parser ); + + + /* structure type used to model object fields */ + typedef struct T1_FieldRec_ + { + const char* ident; /* field identifier */ + T1_FieldLocation location; + T1_FieldType type; /* type of field */ + T1_Field_ParseFunc reader; + FT_UInt offset; /* offset of field in object */ + FT_Byte size; /* size of field in bytes */ + FT_UInt array_max; /* maximal number of elements for */ + /* array */ + FT_UInt count_offset; /* offset of element count for */ + /* arrays; must not be zero if in */ + /* use -- in other words, a */ + /* `num_FOO' element must not */ + /* start the used structure if we */ + /* parse a `FOO' array */ + FT_UInt dict; /* where we expect it */ + } T1_FieldRec; + +#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ +#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) + + + +#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE( _fname ), \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ + { \ + _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ + (T1_Field_ParseFunc)_reader, \ + 0, 0, \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, \ + FT_FIELD_OFFSET( num_ ## _fname ), \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, 0, \ + _dict \ + }, + + +#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) + +#define T1_FIELD_NUM( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) + +#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) + +#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ + _dict ) + +#define T1_FIELD_STRING( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) + +#define T1_FIELD_KEY( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) + +#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) + + +#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ + T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; + + typedef struct PS_Parser_FuncsRec_ + { + void + (*init)( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + void + (*done)( PS_Parser parser ); + + void + (*skip_spaces)( PS_Parser parser ); + void + (*skip_PS_token)( PS_Parser parser ); + + FT_Long + (*to_int)( PS_Parser parser ); + FT_Fixed + (*to_fixed)( PS_Parser parser, + FT_Int power_ten ); + + FT_Error + (*to_bytes)( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + FT_Int + (*to_coord_array)( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + FT_Int + (*to_fixed_array)( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + void + (*to_token)( PS_Parser parser, + T1_Token token ); + void + (*to_token_array)( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_Error + (*load_field)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_Error + (*load_field_table)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + } PS_Parser_FuncsRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_ParserRec */ + /* */ + /* <Description> */ + /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ + /* */ + /* <Fields> */ + /* cursor :: The current position in the text. */ + /* */ + /* base :: Start of the processed text. */ + /* */ + /* limit :: End of the processed text. */ + /* */ + /* error :: The last error returned. */ + /* */ + /* memory :: The object used for memory operations (alloc/realloc). */ + /* */ + /* funcs :: A table of functions for the parser. */ + /* */ + typedef struct PS_ParserRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + FT_Error error; + FT_Memory memory; + + PS_Parser_FuncsRec funcs; + + } PS_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_BuilderRec_* T1_Builder; + + + typedef FT_Error + (*T1_Builder_Check_Points_Func)( T1_Builder builder, + FT_Int count ); + + typedef void + (*T1_Builder_Add_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + typedef FT_Error + (*T1_Builder_Add_Point1_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef FT_Error + (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); + + typedef FT_Error + (*T1_Builder_Start_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef void + (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); + + + typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; + + typedef struct T1_Builder_FuncsRec_ + { + void + (*init)( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Bool hinting ); + + void + (*done)( T1_Builder builder ); + + T1_Builder_Check_Points_Func check_points; + T1_Builder_Add_Point_Func add_point; + T1_Builder_Add_Point1_Func add_point1; + T1_Builder_Add_Contour_Func add_contour; + T1_Builder_Start_Point_Func start_point; + T1_Builder_Close_Contour_Func close_contour; + + } T1_Builder_FuncsRec; + + + /* an enumeration type to handle charstring parsing states */ + typedef enum T1_ParseState_ + { + T1_Parse_Start, + T1_Parse_Have_Width, + T1_Parse_Have_Moveto, + T1_Parse_Have_Path + + } T1_ParseState; + + + /*************************************************************************/ + /* */ + /* <Structure> */ + /* T1_BuilderRec */ + /* */ + /* <Description> */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* <Fields> */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* loader :: XXX */ + /* */ + /* base :: The base glyph outline. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* max_points :: maximum points in builder outline */ + /* */ + /* max_contours :: Maximal number of contours in builder outline. */ + /* */ + /* pos_x :: The horizontal translation (if composite glyph). */ + /* */ + /* pos_y :: The vertical translation (if composite glyph). */ + /* */ + /* left_bearing :: The left side bearing point. */ + /* */ + /* advance :: The horizontal advance vector. */ + /* */ + /* bbox :: Unused. */ + /* */ + /* parse_state :: An enumeration which controls the charstring */ + /* parsing state. */ + /* */ + /* load_points :: If this flag is not set, no points are loaded. */ + /* */ + /* no_recurse :: Set but not used. */ + /* */ + /* metrics_only :: A boolean indicating that we only want to compute */ + /* the metrics of a given glyph, not load all of its */ + /* points. */ + /* */ + /* funcs :: An array of function pointers for the builder. */ + /* */ + typedef struct T1_BuilderRec_ + { + FT_Memory memory; + FT_Face face; + FT_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + T1_ParseState parse_state; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + T1_Builder_FuncsRec funcs; + + } T1_BuilderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 0 + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 8 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 32 + +#endif /* 0 */ + + + typedef struct T1_Decoder_ZoneRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + } T1_Decoder_ZoneRec, *T1_Decoder_Zone; + + + typedef struct T1_DecoderRec_* T1_Decoder; + typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; + + + typedef FT_Error + (*T1_Decoder_Callback)( T1_Decoder decoder, + FT_UInt glyph_index ); + + + typedef struct T1_Decoder_FuncsRec_ + { + FT_Error + (*init)( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback callback ); + + void + (*done)( T1_Decoder decoder ); + + FT_Error + (*parse_charstrings)( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); + + } T1_Decoder_FuncsRec; + + + typedef struct T1_DecoderRec_ + { + T1_BuilderRec builder; + + FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; + FT_Long* top; + + T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; + T1_Decoder_Zone zone; + + FT_Service_PsCMaps psnames; /* for seac */ + FT_UInt num_glyphs; + FT_Byte** glyph_names; + + FT_Int lenIV; /* internal for sub routine calls */ + FT_UInt num_subrs; + FT_Byte** subrs; + FT_PtrDist* subrs_len; /* array of subrs length (optional) */ + + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + PS_Blend blend; /* for multiple master support */ + + FT_Render_Mode hint_mode; + + T1_Decoder_Callback parse_callback; + T1_Decoder_FuncsRec funcs; + + FT_Long* buildchar; + FT_UInt len_buildchar; + + FT_Bool seac; + + } T1_DecoderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** AFM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_ParserRec_* AFM_Parser; + + typedef struct AFM_Parser_FuncsRec_ + { + FT_Error + (*init)( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + void + (*done)( AFM_Parser parser ); + + FT_Error + (*parse)( AFM_Parser parser ); + + } AFM_Parser_FuncsRec; + + + typedef struct AFM_StreamRec_* AFM_Stream; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* AFM_ParserRec */ + /* */ + /* <Description> */ + /* An AFM_Parser is a parser for the AFM files. */ + /* */ + /* <Fields> */ + /* memory :: The object used for memory operations (alloc and */ + /* realloc). */ + /* */ + /* stream :: This is an opaque object. */ + /* */ + /* FontInfo :: The result will be stored here. */ + /* */ + /* get_index :: A user provided function to get a glyph index by its */ + /* name. */ + /* */ + typedef struct AFM_ParserRec_ + { + FT_Memory memory; + AFM_Stream stream; + + AFM_FontInfo FontInfo; + + FT_Int + (*get_index)( const char* name, + FT_Offset len, + void* user_data ); + + void* user_data; + + } AFM_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CHARMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; + + typedef struct T1_CMap_ClassesRec_ + { + FT_CMap_Class standard; + FT_CMap_Class expert; + FT_CMap_Class custom; + FT_CMap_Class unicode; + + } T1_CMap_ClassesRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PSAux Module Interface *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSAux_ServiceRec_ + { + /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ + const PS_Table_FuncsRec* ps_table_funcs; + const PS_Parser_FuncsRec* ps_parser_funcs; + const T1_Builder_FuncsRec* t1_builder_funcs; + const T1_Decoder_FuncsRec* t1_decoder_funcs; + + void + (*t1_decrypt)( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + T1_CMap_Classes t1_cmap_classes; + + /* fields after this comment line were added after version 2.1.10 */ + const AFM_Parser_FuncsRec* afm_parser_funcs; + + } PSAux_ServiceRec, *PSAux_Service; + + /* backwards-compatible type definition */ + typedef PSAux_ServiceRec PSAux_Interface; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Some convenience functions *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define IS_PS_NEWLINE( ch ) \ + ( (ch) == '\r' || \ + (ch) == '\n' ) + +#define IS_PS_SPACE( ch ) \ + ( (ch) == ' ' || \ + IS_PS_NEWLINE( ch ) || \ + (ch) == '\t' || \ + (ch) == '\f' || \ + (ch) == '\0' ) + +#define IS_PS_SPECIAL( ch ) \ + ( (ch) == '/' || \ + (ch) == '(' || (ch) == ')' || \ + (ch) == '<' || (ch) == '>' || \ + (ch) == '[' || (ch) == ']' || \ + (ch) == '{' || (ch) == '}' || \ + (ch) == '%' ) + +#define IS_PS_DELIM( ch ) \ + ( IS_PS_SPACE( ch ) || \ + IS_PS_SPECIAL( ch ) ) + +#define IS_PS_DIGIT( ch ) \ + ( (ch) >= '0' && (ch) <= '9' ) + +#define IS_PS_XDIGIT( ch ) \ + ( IS_PS_DIGIT( ch ) || \ + ( (ch) >= 'A' && (ch) <= 'F' ) || \ + ( (ch) >= 'a' && (ch) <= 'f' ) ) + +#define IS_PS_BASE85( ch ) \ + ( (ch) >= '!' && (ch) <= 'u' ) + +#define IS_PS_TOKEN( cur, limit, token ) \ + ( (char)(cur)[0] == (token)[0] && \ + ( (cur) + sizeof ( (token) ) == (limit) || \ + ( (cur) + sizeof( (token) ) < (limit) && \ + IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ + ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) + + +FT_END_HEADER + +#endif /* __PSAUX_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/pshints.h b/alienblaster/project/jni/freetype/include/freetype/internal/pshints.h new file mode 100644 index 000000000..0c357651b --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/pshints.h @@ -0,0 +1,712 @@ +/***************************************************************************/ +/* */ +/* pshints.h */ +/* */ +/* Interface to Postscript-specific (Type 1 and Type 2) hints */ +/* recorders (specification only). These are used to support native */ +/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */ +/* */ +/* Copyright 2001, 2002, 2003, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHINTS_H__ +#define __PSHINTS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INTERNAL REPRESENTATION OF GLOBALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSH_GlobalsRec_* PSH_Globals; + + typedef FT_Error + (*PSH_Globals_NewFunc)( FT_Memory memory, + T1_Private* private_dict, + PSH_Globals* aglobals ); + + typedef FT_Error + (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + typedef void + (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); + + + typedef struct PSH_Globals_FuncsRec_ + { + PSH_Globals_NewFunc create; + PSH_Globals_SetScaleFunc set_scale; + PSH_Globals_DestroyFunc destroy; + + } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 1 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * T1_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 1 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T1_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the `open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method (`stem', `stem3', or `reset'). Note that these functions do + * not return an error code. + * + * - Close the recording session by calling the `close' method. It + * returns an error code if the hints were invalid or something + * strange happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * PostScript hinter. + * + */ + typedef struct T1_HintsRec_* T1_Hints; + + + /************************************************************************* + * + * @type: + * T1_Hints_Funcs + * + * @description: + * A pointer to the @T1_Hints_FuncsRec structure that defines the API of + * a given @T1_Hints object. + * + */ + typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; + + + /************************************************************************* + * + * @functype: + * T1_Hints_OpenFunc + * + * @description: + * A method of the @T1_Hints class used to prepare it for a new Type 1 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * @note: + * You should always call the @T1_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T1_Hints_OpenFunc)( T1_Hints hints ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_SetStemFunc + * + * @description: + * A method of the @T1_Hints class used to record a new horizontal or + * vertical stem. This corresponds to the Type 1 `hstem' and `vstem' + * operators. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * coords :: + * Array of 2 coordinates in 16.16 format, used as (position,length) + * stem descriptor. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * `coords[0]' is the absolute stem position (lowest coordinate); + * `coords[1]' is the length. + * + * The length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a `ghost' stem, according to the Type 1 + * specification. + * + * If the length is -21 (corresponding to a bottom ghost stem), then + * the real stem position is `coords[0]+coords[1]'. + * + */ + typedef void + (*T1_Hints_SetStemFunc)( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_SetStem3Func + * + * @description: + * A method of the @T1_Hints class used to record three + * counter-controlled horizontal or vertical stems at once. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems, 1 for vertical ones. + * + * coords :: + * An array of 6 values in 16.16 format, holding 3 (position,length) + * pairs for the counter-controlled stems. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * The lengths cannot be negative (ghost stems are never + * counter-controlled). + * + */ + typedef void + (*T1_Hints_SetStem3Func)( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_ResetFunc + * + * @description: + * A method of the @T1_Hints class used to reset the stems hints in a + * recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph in which the + * previously defined hints apply. + * + */ + typedef void + (*T1_Hints_ResetFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_CloseFunc + * + * @description: + * A method of the @T1_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T1_Hints_CloseFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_ApplyFunc + * + * @description: + * A method of the @T1_Hints class used to apply hints to the + * corresponding glyph outline. Must be called once all hints have been + * recorded. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the `globals' object which + * must correspond to the same font as the glyph. + * + */ + typedef FT_Error + (*T1_Hints_ApplyFunc)( T1_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************* + * + * @struct: + * T1_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T1_Hints objects. + * + * @fields: + * hints :: + * A handle to the T1 Hints recorder. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stem :: + * The function to set a simple stem. + * + * stem3 :: + * The function to set counter-controlled stems. + * + * reset :: + * The function to reset stem hints. + * + * apply :: + * The function to apply the hints to the corresponding glyph outline. + * + */ + typedef struct T1_Hints_FuncsRec_ + { + T1_Hints hints; + T1_Hints_OpenFunc open; + T1_Hints_CloseFunc close; + T1_Hints_SetStemFunc stem; + T1_Hints_SetStem3Func stem3; + T1_Hints_ResetFunc reset; + T1_Hints_ApplyFunc apply; + + } T1_Hints_FuncsRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 2 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * T2_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 2 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T2_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the `open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method (`stems', `hintmask', `counters'). Note that these + * functions do not return an error code. + * + * - Close the recording session by calling the `close' method. It + * returns an error code if the hints were invalid or something + * strange happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * Postscript hinter. + * + */ + typedef struct T2_HintsRec_* T2_Hints; + + + /************************************************************************* + * + * @type: + * T2_Hints_Funcs + * + * @description: + * A pointer to the @T2_Hints_FuncsRec structure that defines the API of + * a given @T2_Hints object. + * + */ + typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; + + + /************************************************************************* + * + * @functype: + * T2_Hints_OpenFunc + * + * @description: + * A method of the @T2_Hints class used to prepare it for a new Type 2 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * @note: + * You should always call the @T2_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T2_Hints_OpenFunc)( T2_Hints hints ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_StemsFunc + * + * @description: + * A method of the @T2_Hints class used to set the table of stems in + * either the vertical or horizontal dimension. Equivalent to the + * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * count :: + * The number of stems. + * + * coords :: + * An array of `count' (position,length) pairs in 16.16 format. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * There are `2*count' elements in the `coords' array. Each even + * element is an absolute position in font units, each odd element is a + * length in font units. + * + * A length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a `ghost' stem, according to the Type 1 + * specification. + * + */ + typedef void + (*T2_Hints_StemsFunc)( T2_Hints hints, + FT_UInt dimension, + FT_UInt count, + FT_Fixed* coordinates ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_MaskFunc + * + * @description: + * A method of the @T2_Hints class used to set a given hintmask (this + * corresponds to the `hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The glyph index of the last point to which the previously defined + * or activated hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point' should be 0. + * + * `bit_count' is the number of meaningful bits in the `bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The `bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_MaskFunc)( T2_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_CounterFunc + * + * @description: + * A method of the @T2_Hints class used to set a given counter mask + * (this corresponds to the `hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * A glyph index of the last point to which the previously defined or + * active hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point' should be 0. + * + * `bit_count' is the number of meaningful bits in the `bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The `bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_CounterFunc)( T2_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_CloseFunc + * + * @description: + * A method of the @T2_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T2_Hints_CloseFunc)( T2_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_ApplyFunc + * + * @description: + * A method of the @T2_Hints class used to apply hints to the + * corresponding glyph outline. Must be called after the `close' + * method. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the `globals' object which + * must correspond to the same font than the glyph. + * + */ + typedef FT_Error + (*T2_Hints_ApplyFunc)( T2_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************* + * + * @struct: + * T2_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T2_Hints objects. + * + * @fields: + * hints :: + * A handle to the T2 hints recorder object. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stems :: + * The function to set the dimension's stems table. + * + * hintmask :: + * The function to set hint masks. + * + * counter :: + * The function to set counter masks. + * + * apply :: + * The function to apply the hints on the corresponding glyph outline. + * + */ + typedef struct T2_Hints_FuncsRec_ + { + T2_Hints hints; + T2_Hints_OpenFunc open; + T2_Hints_CloseFunc close; + T2_Hints_StemsFunc stems; + T2_Hints_MaskFunc hintmask; + T2_Hints_CounterFunc counter; + T2_Hints_ApplyFunc apply; + + } T2_Hints_FuncsRec; + + + /* */ + + + typedef struct PSHinter_Interface_ + { + PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); + T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); + T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); + + } PSHinter_Interface; + + typedef PSHinter_Interface* PSHinter_Service; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_, \ + get_t1_funcs_, get_t2_funcs_) \ + static const PSHinter_Interface class_ = \ + { \ + get_globals_funcs_, get_t1_funcs_, get_t2_funcs_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_, \ + get_t1_funcs_, get_t2_funcs_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + PSHinter_Interface* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_globals_funcs = get_globals_funcs_; \ + clazz->get_t1_funcs = get_t1_funcs_; \ + clazz->get_t2_funcs = get_t2_funcs_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + +FT_END_HEADER + +#endif /* __PSHINTS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svbdf.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svbdf.h new file mode 100644 index 000000000..926423914 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svbdf.h @@ -0,0 +1,77 @@ +/***************************************************************************/ +/* */ +/* svbdf.h */ +/* */ +/* The FreeType BDF services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVBDF_H__ +#define __SVBDF_H__ + +#include FT_BDF_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_BDF "bdf" + + typedef FT_Error + (*FT_BDF_GetCharsetIdFunc)( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + typedef FT_Error + (*FT_BDF_GetPropertyFunc)( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + + FT_DEFINE_SERVICE( BDF ) + { + FT_BDF_GetCharsetIdFunc get_charset_id; + FT_BDF_GetPropertyFunc get_property; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_BDFRec(class_, get_charset_id_, get_property_) \ + static const FT_Service_BDFRec class_ = \ + { \ + get_charset_id_, get_property_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_BDFRec(class_, get_charset_id_, get_property_) \ + void \ + FT_Init_Class_##class_( FT_Service_BDFRec* clazz ) \ + { \ + clazz->get_charset_id = get_charset_id_; \ + clazz->get_property = get_property_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVBDF_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svcid.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svcid.h new file mode 100644 index 000000000..9b874b5e7 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svcid.h @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* svcid.h */ +/* */ +/* The FreeType CID font services (specification). */ +/* */ +/* Copyright 2007, 2009 by Derek Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVCID_H__ +#define __SVCID_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_CID "CID" + + typedef FT_Error + (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ); + typedef FT_Error + (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face, + FT_Bool *is_cid ); + typedef FT_Error + (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ); + + FT_DEFINE_SERVICE( CID ) + { + FT_CID_GetRegistryOrderingSupplementFunc get_ros; + FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid; + FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_CIDREC(class_, get_ros_, \ + get_is_cid_, get_cid_from_glyph_index_ ) \ + static const FT_Service_CIDRec class_ = \ + { \ + get_ros_, get_is_cid_, get_cid_from_glyph_index_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_CIDREC(class_, get_ros_, \ + get_is_cid_, get_cid_from_glyph_index_ ) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_CIDRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_ros = get_ros_; \ + clazz->get_is_cid = get_is_cid_; \ + clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVCID_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svgldict.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svgldict.h new file mode 100644 index 000000000..d66a41d5a --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svgldict.h @@ -0,0 +1,82 @@ +/***************************************************************************/ +/* */ +/* svgldict.h */ +/* */ +/* The FreeType glyph dictionary services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGLDICT_H__ +#define __SVGLDICT_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to retrieve glyph names, as well as to find the + * index of a given glyph name in a font. + * + */ + +#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" + + + typedef FT_Error + (*FT_GlyphDict_GetNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_GlyphDict_NameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + + FT_DEFINE_SERVICE( GlyphDict ) + { + FT_GlyphDict_GetNameFunc get_name; + FT_GlyphDict_NameIndexFunc name_index; /* optional */ + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_GLYPHDICTREC(class_, get_name_, name_index_) \ + static const FT_Service_GlyphDictRec class_ = \ + { \ + get_name_, name_index_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_GLYPHDICTREC(class_, get_name_, name_index_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_GlyphDictRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_name = get_name_; \ + clazz->name_index = name_index_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGLDICT_H__ */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svgxval.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svgxval.h new file mode 100644 index 000000000..2cdab5065 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svgxval.h @@ -0,0 +1,72 @@ +/***************************************************************************/ +/* */ +/* svgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005 by */ +/* Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGXVAL_H__ +#define __SVGXVAL_H__ + +#include FT_GX_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate" +#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate" + + typedef FT_Error + (*gxv_validate_func)( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + typedef FT_Error + (*ckern_validate_func)( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes *ckern_table ); + + + FT_DEFINE_SERVICE( GXvalidate ) + { + gxv_validate_func validate; + }; + + FT_DEFINE_SERVICE( CKERNvalidate ) + { + ckern_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGXVAL_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svkern.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svkern.h new file mode 100644 index 000000000..1488adf49 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svkern.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* svkern.h */ +/* */ +/* The FreeType Kerning service (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVKERN_H__ +#define __SVKERN_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + +#define FT_SERVICE_ID_KERNING "kerning" + + + typedef FT_Error + (*FT_Kerning_TrackGetFunc)( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + FT_DEFINE_SERVICE( Kerning ) + { + FT_Kerning_TrackGetFunc get_track; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVKERN_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svmm.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svmm.h new file mode 100644 index 000000000..66e1da22f --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svmm.h @@ -0,0 +1,104 @@ +/***************************************************************************/ +/* */ +/* svmm.h */ +/* */ +/* The FreeType Multiple Masters and GX var services (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVMM_H__ +#define __SVMM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to manage multiple-masters data in a given face. + * + * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). + * + */ + +#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" + + + typedef FT_Error + (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error + (*FT_Get_MM_Var_Func)( FT_Face face, + FT_MM_Var* *master ); + + typedef FT_Error + (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Set_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + FT_DEFINE_SERVICE( MultiMasters ) + { + FT_Get_MM_Func get_mm; + FT_Set_MM_Design_Func set_mm_design; + FT_Set_MM_Blend_Func set_mm_blend; + FT_Get_MM_Var_Func get_mm_var; + FT_Set_Var_Design_Func set_var_design; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_MULTIMASTERSREC(class_, get_mm_, set_mm_design_, \ + set_mm_blend_, get_mm_var_, set_var_design_) \ + static const FT_Service_MultiMastersRec class_ = \ + { \ + get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_MULTIMASTERSREC(class_, get_mm_, set_mm_design_, \ + set_mm_blend_, get_mm_var_, set_var_design_) \ + void \ + FT_Init_Class_##class_( FT_Service_MultiMastersRec* clazz ) \ + { \ + clazz->get_mm = get_mm_; \ + clazz->set_mm_design = set_mm_design_; \ + clazz->set_mm_blend = set_mm_blend_; \ + clazz->get_mm_var = get_mm_var_; \ + clazz->set_var_design = set_var_design_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + +#endif /* __SVMM_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svotval.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svotval.h new file mode 100644 index 000000000..970bbd575 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svotval.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svotval.h */ +/* */ +/* The FreeType OpenType validation service (specification). */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVOTVAL_H__ +#define __SVOTVAL_H__ + +#include FT_OPENTYPE_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate" + + + typedef FT_Error + (*otv_validate_func)( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *base, + FT_Bytes *gdef, + FT_Bytes *gpos, + FT_Bytes *gsub, + FT_Bytes *jstf ); + + + FT_DEFINE_SERVICE( OTvalidate ) + { + otv_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVOTVAL_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svpfr.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svpfr.h new file mode 100644 index 000000000..462786f9c --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svpfr.h @@ -0,0 +1,66 @@ +/***************************************************************************/ +/* */ +/* svpfr.h */ +/* */ +/* Internal PFR service functions (specification). */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPFR_H__ +#define __SVPFR_H__ + +#include FT_PFR_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" + + + typedef FT_Error + (*FT_PFR_GetMetricsFunc)( FT_Face face, + FT_UInt *aoutline, + FT_UInt *ametrics, + FT_Fixed *ax_scale, + FT_Fixed *ay_scale ); + + typedef FT_Error + (*FT_PFR_GetKerningFunc)( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + typedef FT_Error + (*FT_PFR_GetAdvanceFunc)( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + + FT_DEFINE_SERVICE( PfrMetrics ) + { + FT_PFR_GetMetricsFunc get_metrics; + FT_PFR_GetKerningFunc get_kerning; + FT_PFR_GetAdvanceFunc get_advance; + + }; + + /* */ + +FT_END_HEADER + +#endif /* __SVPFR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svpostnm.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svpostnm.h new file mode 100644 index 000000000..106c54f85 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svpostnm.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* svpostnm.h */ +/* */ +/* The FreeType PostScript name services (specification). */ +/* */ +/* Copyright 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPOSTNM_H__ +#define __SVPOSTNM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + /* + * A trivial service used to retrieve the PostScript name of a given + * font when available. The `get_name' field should never be NULL. + * + * The corresponding function can return NULL to indicate that the + * PostScript name is not available. + * + * The name is owned by the face and will be destroyed with it. + */ + +#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" + + + typedef const char* + (*FT_PsName_GetFunc)( FT_Face face ); + + + FT_DEFINE_SERVICE( PsFontName ) + { + FT_PsName_GetFunc get_ps_font_name; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_PSFONTNAMEREC(class_, get_ps_font_name_) \ + static const FT_Service_PsFontNameRec class_ = \ + { \ + get_ps_font_name_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSFONTNAMEREC(class_, get_ps_font_name_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_PsFontNameRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_ps_font_name = get_ps_font_name_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPOSTNM_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svpscmap.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svpscmap.h new file mode 100644 index 000000000..961030cc3 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svpscmap.h @@ -0,0 +1,164 @@ +/***************************************************************************/ +/* */ +/* svpscmap.h */ +/* */ +/* The FreeType PostScript charmap service (specification). */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSCMAP_H__ +#define __SVPSCMAP_H__ + +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" + + + /* + * Adobe glyph name to unicode value. + */ + typedef FT_UInt32 + (*PS_Unicode_ValueFunc)( const char* glyph_name ); + + /* + * Macintosh name id to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Macintosh_NameFunc)( FT_UInt name_index ); + + /* + * Adobe standard string ID to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index ); + + + /* + * Simple unicode -> glyph index charmap built from font glyph names + * table. + */ + typedef struct PS_UniMap_ + { + FT_UInt32 unicode; /* bit 31 set: is glyph variant */ + FT_UInt glyph_index; + + } PS_UniMap; + + + typedef struct PS_UnicodesRec_* PS_Unicodes; + + typedef struct PS_UnicodesRec_ + { + FT_CMapRec cmap; + FT_UInt num_maps; + PS_UniMap* maps; + + } PS_UnicodesRec; + + + /* + * A function which returns a glyph name for a given index. Returns + * NULL if invalid index. + */ + typedef const char* + (*PS_GetGlyphNameFunc)( FT_Pointer data, + FT_UInt string_index ); + + /* + * A function used to release the glyph name returned by + * PS_GetGlyphNameFunc, when needed + */ + typedef void + (*PS_FreeGlyphNameFunc)( FT_Pointer data, + const char* name ); + + typedef FT_Error + (*PS_Unicodes_InitFunc)( FT_Memory memory, + PS_Unicodes unicodes, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ); + + typedef FT_UInt + (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, + FT_UInt32 unicode ); + + typedef FT_UInt32 + (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, + FT_UInt32 *unicode ); + + + FT_DEFINE_SERVICE( PsCMaps ) + { + PS_Unicode_ValueFunc unicode_value; + + PS_Unicodes_InitFunc unicodes_init; + PS_Unicodes_CharIndexFunc unicodes_char_index; + PS_Unicodes_CharNextFunc unicodes_char_next; + + PS_Macintosh_NameFunc macintosh_name; + PS_Adobe_Std_StringsFunc adobe_std_strings; + const unsigned short* adobe_std_encoding; + const unsigned short* adobe_expert_encoding; + }; + + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_PSCMAPSREC(class_, unicode_value_, unicodes_init_, \ + unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ + adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_) \ + static const FT_Service_PsCMapsRec class_ = \ + { \ + unicode_value_, unicodes_init_, \ + unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ + adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSCMAPSREC(class_, unicode_value_, unicodes_init_, \ + unicodes_char_index_, unicodes_char_next_, macintosh_name_, \ + adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_PsCMapsRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->unicode_value = unicode_value_; \ + clazz->unicodes_init = unicodes_init_; \ + clazz->unicodes_char_index = unicodes_char_index_; \ + clazz->unicodes_char_next = unicodes_char_next_; \ + clazz->macintosh_name = macintosh_name_; \ + clazz->adobe_std_strings = adobe_std_strings_; \ + clazz->adobe_std_encoding = adobe_std_encoding_; \ + clazz->adobe_expert_encoding = adobe_expert_encoding_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSCMAP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svpsinfo.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svpsinfo.h new file mode 100644 index 000000000..91ba91e5d --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svpsinfo.h @@ -0,0 +1,92 @@ +/***************************************************************************/ +/* */ +/* svpsinfo.h */ +/* */ +/* The FreeType PostScript info service (specification). */ +/* */ +/* Copyright 2003, 2004, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSINFO_H__ +#define __SVPSINFO_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" + + + typedef FT_Error + (*PS_GetFontInfoFunc)( FT_Face face, + PS_FontInfoRec* afont_info ); + + typedef FT_Error + (*PS_GetFontExtraFunc)( FT_Face face, + PS_FontExtraRec* afont_extra ); + + typedef FT_Int + (*PS_HasGlyphNamesFunc)( FT_Face face ); + + typedef FT_Error + (*PS_GetFontPrivateFunc)( FT_Face face, + PS_PrivateRec* afont_private ); + + + FT_DEFINE_SERVICE( PsInfo ) + { + PS_GetFontInfoFunc ps_get_font_info; + PS_GetFontExtraFunc ps_get_font_extra; + PS_HasGlyphNamesFunc ps_has_glyph_names; + PS_GetFontPrivateFunc ps_get_font_private; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_PSINFOREC(class_, get_font_info_, \ + ps_get_font_extra_, has_glyph_names_, get_font_private_) \ + static const FT_Service_PsInfoRec class_ = \ + { \ + get_font_info_, ps_get_font_extra_, has_glyph_names_, \ + get_font_private_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSINFOREC(class_, get_font_info_, \ + ps_get_font_extra_, has_glyph_names_, get_font_private_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_PsInfoRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->ps_get_font_info = get_font_info_; \ + clazz->ps_get_font_extra = ps_get_font_extra_; \ + clazz->ps_has_glyph_names = has_glyph_names_; \ + clazz->ps_get_font_private = get_font_private_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSINFO_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svsfnt.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svsfnt.h new file mode 100644 index 000000000..30bb1620f --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svsfnt.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* svsfnt.h */ +/* */ +/* The FreeType SFNT table loading service (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVSFNT_H__ +#define __SVSFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" + + + /* + * Used to implement FT_Load_Sfnt_Table(). + */ + typedef FT_Error + (*FT_SFNT_TableLoadFunc)( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + /* + * Used to implement FT_Get_Sfnt_Table(). + */ + typedef void* + (*FT_SFNT_TableGetFunc)( FT_Face face, + FT_Sfnt_Tag tag ); + + + /* + * Used to implement FT_Sfnt_Table_Info(). + */ + typedef FT_Error + (*FT_SFNT_TableInfoFunc)( FT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *offset, + FT_ULong *length ); + + + FT_DEFINE_SERVICE( SFNT_Table ) + { + FT_SFNT_TableLoadFunc load_table; + FT_SFNT_TableGetFunc get_table; + FT_SFNT_TableInfoFunc table_info; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_SFNT_TABLEREC(class_, load_, get_, info_) \ + static const FT_Service_SFNT_TableRec class_ = \ + { \ + load_, get_, info_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_SFNT_TABLEREC(class_, load_, get_, info_) \ + void \ + FT_Init_Class_##class_( FT_Service_SFNT_TableRec* clazz ) \ + { \ + clazz->load_table = load_; \ + clazz->get_table = get_; \ + clazz->table_info = info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + + +#endif /* __SVSFNT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svttcmap.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svttcmap.h new file mode 100644 index 000000000..8af00351d --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svttcmap.h @@ -0,0 +1,106 @@ +/***************************************************************************/ +/* */ +/* svttcmap.h */ +/* */ +/* The FreeType TrueType/sfnt cmap extra information service. */ +/* */ +/* Copyright 2003 by */ +/* Masatake YAMATO, Redhat K.K. */ +/* */ +/* Copyright 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/* Development of this service is support of + Information-technology Promotion Agency, Japan. */ + +#ifndef __SVTTCMAP_H__ +#define __SVTTCMAP_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_CMapInfo */ + /* */ + /* <Description> */ + /* A structure used to store TrueType/sfnt specific cmap information */ + /* which is not covered by the generic @FT_CharMap structure. This */ + /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */ + /* */ + /* <Fields> */ + /* language :: */ + /* The language ID used in Mac fonts. Definitions of values are in */ + /* freetype/ttnameid.h. */ + /* */ + /* format :: */ + /* The cmap format. OpenType 1.5 defines the formats 0 (byte */ + /* encoding table), 2~(high-byte mapping through table), 4~(segment */ + /* mapping to delta values), 6~(trimmed table mapping), 8~(mixed */ + /* 16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented */ + /* coverage), and 14 (Unicode Variation Sequences). */ + /* */ + typedef struct TT_CMapInfo_ + { + FT_ULong language; + FT_Long format; + + } TT_CMapInfo; + + + typedef FT_Error + (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + + FT_DEFINE_SERVICE( TTCMaps ) + { + TT_CMap_Info_GetFunc get_cmap_info; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_TTCMAPSREC(class_, get_cmap_info_) \ + static const FT_Service_TTCMapsRec class_ = \ + { \ + get_cmap_info_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_TTCMAPSREC(class_, get_cmap_info_) \ + void \ + FT_Init_Class_##class_( FT_Library library, \ + FT_Service_TTCMapsRec* clazz) \ + { \ + FT_UNUSED(library); \ + clazz->get_cmap_info = get_cmap_info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTCMAP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svtteng.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svtteng.h new file mode 100644 index 000000000..58e02a6f9 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svtteng.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* svtteng.h */ +/* */ +/* The FreeType TrueType engine query service (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVTTENG_H__ +#define __SVTTENG_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine" + + /* + * Used to implement FT_Get_TrueType_Engine_Type + */ + + FT_DEFINE_SERVICE( TrueTypeEngine ) + { + FT_TrueTypeEngineType engine_type; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVTTENG_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svttglyf.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svttglyf.h new file mode 100644 index 000000000..ab2dc9a9f --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svttglyf.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* svttglyf.h */ +/* */ +/* The FreeType TrueType glyph service. */ +/* */ +/* Copyright 2007 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __SVTTGLYF_H__ +#define __SVTTGLYF_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_GLYF "tt-glyf" + + + typedef FT_ULong + (*TT_Glyf_GetLocationFunc)( FT_Face face, + FT_UInt gindex, + FT_ULong *psize ); + + FT_DEFINE_SERVICE( TTGlyf ) + { + TT_Glyf_GetLocationFunc get_location; + }; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_SERVICE_TTGLYFREC(class_, get_location_ ) \ + static const FT_Service_TTGlyfRec class_ = \ + { \ + get_location_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_TTGLYFREC(class_, get_location_ ) \ + void \ + FT_Init_Class_##class_( FT_Service_TTGlyfRec* clazz ) \ + { \ + clazz->get_location = get_location_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTGLYF_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svwinfnt.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svwinfnt.h new file mode 100644 index 000000000..57f7765d9 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svwinfnt.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* svwinfnt.h */ +/* */ +/* The FreeType Windows FNT/FONT service (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVWINFNT_H__ +#define __SVWINFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_WINFONTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_WINFNT "winfonts" + + typedef FT_Error + (*FT_WinFnt_GetHeaderFunc)( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + FT_DEFINE_SERVICE( WinFnt ) + { + FT_WinFnt_GetHeaderFunc get_header; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVWINFNT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/services/svxf86nm.h b/alienblaster/project/jni/freetype/include/freetype/internal/services/svxf86nm.h new file mode 100644 index 000000000..ca5d884a8 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/services/svxf86nm.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svxf86nm.h */ +/* */ +/* The FreeType XFree86 services (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVXF86NM_H__ +#define __SVXF86NM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A trivial service used to return the name of a face's font driver, + * according to the XFree86 nomenclature. Note that the service data + * is a simple constant string pointer. + */ + +#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name" + +#define FT_XF86_FORMAT_TRUETYPE "TrueType" +#define FT_XF86_FORMAT_TYPE_1 "Type 1" +#define FT_XF86_FORMAT_BDF "BDF" +#define FT_XF86_FORMAT_PCF "PCF" +#define FT_XF86_FORMAT_TYPE_42 "Type 42" +#define FT_XF86_FORMAT_CID "CID Type 1" +#define FT_XF86_FORMAT_CFF "CFF" +#define FT_XF86_FORMAT_PFR "PFR" +#define FT_XF86_FORMAT_WINFNT "Windows FNT" + + /* */ + + +FT_END_HEADER + + +#endif /* __SVXF86NM_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/sfnt.h b/alienblaster/project/jni/freetype/include/freetype/internal/sfnt.h new file mode 100644 index 000000000..6326debd0 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/sfnt.h @@ -0,0 +1,897 @@ +/***************************************************************************/ +/* */ +/* sfnt.h */ +/* */ +/* High-level `sfnt' driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFNT_H__ +#define __SFNT_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Init_Face_Func */ + /* */ + /* <Description> */ + /* First part of the SFNT face object initialization. This finds */ + /* the face in a SFNT file or collection, and load its format tag in */ + /* face->format_tag. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Optional additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType */ + /* collection'. */ + /* */ + /* Once the format tag has been validated by the font driver, it */ + /* should then call the TT_Load_Face_Func() callback to read the rest */ + /* of the SFNT tables in the object. */ + /* */ + typedef FT_Error + (*TT_Init_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Face_Func */ + /* */ + /* <Description> */ + /* Second part of the SFNT face object initialization. This loads */ + /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */ + /* face object. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Optional additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function must be called after TT_Init_Face_Func(). */ + /* */ + typedef FT_Error + (*TT_Load_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Done_Face_Func */ + /* */ + /* <Description> */ + /* A callback used to delete the common SFNT data from a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Note> */ + /* This function does NOT destroy the face object. */ + /* */ + typedef void + (*TT_Done_Face_Func)( TT_Face face ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SFNT_HeaderRec_Func */ + /* */ + /* <Description> */ + /* Loads the header of a SFNT font file. Supports collections. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* <Output> */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType */ + /* collection'. */ + /* */ + /* This function checks that the header is valid by looking at the */ + /* values of `search_range', `entry_selector', and `range_shift'. */ + /* */ + typedef FT_Error + (*TT_Load_SFNT_HeaderRec_Func)( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header sfnt ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Directory_Func */ + /* */ + /* <Description> */ + /* Loads the table directory into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be on the first byte after the 4-byte font */ + /* format tag. This is the case just after a call to */ + /* TT_Load_Format_Tag(). */ + /* */ + typedef FT_Error + (*TT_Load_Directory_Func)( TT_Face face, + FT_Stream stream, + SFNT_Header sfnt ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Any_Func */ + /* */ + /* <Description> */ + /* Load any font table into client memory. */ + /* */ + /* <Input> */ + /* face :: The face object to look for. */ + /* */ + /* tag :: The tag of table to load. Use the value 0 if you want */ + /* to access the whole font file, else set this parameter */ + /* to a valid TrueType table tag that you can forge with */ + /* the MAKE_TT_TAG macro. */ + /* */ + /* offset :: The starting offset in the table (or the file if */ + /* tag == 0). */ + /* */ + /* length :: The address of the decision variable: */ + /* */ + /* If length == NULL: */ + /* Loads the whole table. Returns an error if */ + /* `offset' == 0! */ + /* */ + /* If *length == 0: */ + /* Exits immediately; returning the length of the given */ + /* table or of the font file, depending on the value of */ + /* `tag'. */ + /* */ + /* If *length != 0: */ + /* Loads the next `length' bytes of table or font, */ + /* starting at offset `offset' (in table or font too). */ + /* */ + /* <Output> */ + /* buffer :: The address of target buffer. */ + /* */ + /* <Return> */ + /* TrueType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Load_Any_Func)( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte *buffer, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Find_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Check whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* <Output> */ + /* arange :: The SBit range containing the glyph index. */ + /* */ + /* astrike :: The SBit strike containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns */ + /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ + /* glyph. */ + /* */ + typedef FT_Error + (*TT_Find_SBit_Image_Func)( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Metrics_Func */ + /* */ + /* <Description> */ + /* Get the big metrics for a given embedded bitmap. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* <Output> */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be positioned at the glyph's offset within */ + /* the `EBDT' table before the call. */ + /* */ + /* If the image format uses variable metrics, the stream cursor is */ + /* positioned just after the metrics header in the `EBDT' table on */ + /* function exit. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Load a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* <Input> */ + /* face :: */ + /* The target face object. */ + /* */ + /* strike_index :: */ + /* The strike index. */ + /* */ + /* glyph_index :: */ + /* The current glyph index. */ + /* */ + /* load_flags :: */ + /* The current load flags. */ + /* */ + /* stream :: */ + /* The input stream. */ + /* */ + /* <Output> */ + /* amap :: */ + /* The target pixmap. */ + /* */ + /* ametrics :: */ + /* A big sbit metrics structure for the glyph image. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* <Note> */ + /* The `map.buffer' field is always freed before the glyph is loaded. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Image_Func)( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *amap, + TT_SBit_MetricsRec *ametrics ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Set_SBit_Strike_OldFunc */ + /* */ + /* <Description> */ + /* Select an sbit strike for a given size request. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* req :: The size request. */ + /* */ + /* <Output> */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* sbit strike exists for the selected ppem values. */ + /* */ + typedef FT_Error + (*TT_Set_SBit_Strike_OldFunc)( TT_Face face, + FT_UInt x_ppem, + FT_UInt y_ppem, + FT_ULong* astrike_index ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Load_Func */ + /* */ + /* <Description> */ + /* Loads a given TrueType character map into memory. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* stream :: A handle to the current stream object. */ + /* */ + /* <InOut> */ + /* cmap :: A pointer to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function assumes that the stream is already in use (i.e., */ + /* opened). In case of error, all partially allocated tables are */ + /* released. */ + /* */ + typedef FT_Error + (*TT_CharMap_Load_Func)( TT_Face face, + void* cmap, + FT_Stream input ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Free_Func */ + /* */ + /* <Description> */ + /* Destroys a character mapping table. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* cmap :: A handle to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_CharMap_Free_Func)( TT_Face face, + void* cmap ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Set_SBit_Strike_Func */ + /* */ + /* <Description> */ + /* Select an sbit strike for a given size request. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* req :: The size request. */ + /* */ + /* <Output> */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* sbit strike exists for the selected ppem values. */ + /* */ + typedef FT_Error + (*TT_Set_SBit_Strike_Func)( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Strike_Metrics_Func */ + /* */ + /* <Description> */ + /* Load the metrics of a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* strike_index :: The strike index. */ + /* */ + /* <Output> */ + /* metrics :: the metrics of the strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* such sbit strike exists. */ + /* */ + typedef FT_Error + (*TT_Load_Strike_Metrics_Func)( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Get_PS_Name_Func */ + /* */ + /* <Description> */ + /* Get the PostScript glyph name of a glyph. */ + /* */ + /* <Input> */ + /* idx :: The glyph index. */ + /* */ + /* PSname :: The address of a string pointer. Will be NULL in case */ + /* of error, otherwise it is a pointer to the glyph name. */ + /* */ + /* You must not modify the returned string! */ + /* */ + /* <Output> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Get_PS_Name_Func)( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Metrics_Func */ + /* */ + /* <Description> */ + /* Load a metrics table, which is a table with a horizontal and a */ + /* vertical version. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load the vertical one. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Load_Metrics_Func)( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Get_Metrics_Func */ + /* */ + /* <Description> */ + /* Load the horizontal or vertical header in a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load vertical metrics. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Get_Metrics_Func)( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Table_Func */ + /* */ + /* <Description> */ + /* Load a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function uses `face->goto_table' to seek the stream to the */ + /* start of the table, except while loading the font directory. */ + /* */ + typedef FT_Error + (*TT_Load_Table_Func)( TT_Face face, + FT_Stream stream ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Free_Table_Func */ + /* */ + /* <Description> */ + /* Free a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + typedef void + (*TT_Free_Table_Func)( TT_Face face ); + + + /* + * @functype: + * TT_Face_GetKerningFunc + * + * @description: + * Return the horizontal kerning value between two glyphs. + * + * @input: + * face :: A handle to the source face object. + * left_glyph :: The left glyph index. + * right_glyph :: The right glyph index. + * + * @return: + * The kerning value in font units. + */ + typedef FT_Int + (*TT_Face_GetKerningFunc)( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* SFNT_Interface */ + /* */ + /* <Description> */ + /* This structure holds pointers to the functions used to load and */ + /* free the basic tables that are required in a `sfnt' font file. */ + /* */ + /* <Fields> */ + /* Check the various xxx_Func() descriptions for details. */ + /* */ + typedef struct SFNT_Interface_ + { + TT_Loader_GotoTableFunc goto_table; + + TT_Init_Face_Func init_face; + TT_Load_Face_Func load_face; + TT_Done_Face_Func done_face; + FT_Module_Requester get_interface; + + TT_Load_Any_Func load_any; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Load_SFNT_HeaderRec_Func load_sfnt_header; + TT_Load_Directory_Func load_directory; +#endif + + /* these functions are called by `load_face' but they can also */ + /* be called from external modules, if there is a need to do so */ + TT_Load_Table_Func load_head; + TT_Load_Metrics_Func load_hhea; + TT_Load_Table_Func load_cmap; + TT_Load_Table_Func load_maxp; + TT_Load_Table_Func load_os2; + TT_Load_Table_Func load_post; + + TT_Load_Table_Func load_name; + TT_Free_Table_Func free_name; + + /* optional tables */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Load_Table_Func load_hdmx_stub; + TT_Free_Table_Func free_hdmx_stub; +#endif + + /* this field was called `load_kerning' up to version 2.1.10 */ + TT_Load_Table_Func load_kern; + + TT_Load_Table_Func load_gasp; + TT_Load_Table_Func load_pclt; + + /* see `ttload.h'; this field was called `load_bitmap_header' up to */ + /* version 2.1.10 */ + TT_Load_Table_Func load_bhed; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* see `ttsbit.h' */ + TT_Set_SBit_Strike_OldFunc set_sbit_strike_stub; + TT_Load_Table_Func load_sbits_stub; + + /* + * The following two fields appeared in version 2.1.8, and were placed + * between `load_sbits' and `load_sbit_image'. We support them as a + * special exception since they are used by Xfont library within the + * X.Org xserver, and because the probability that other rogue clients + * use the other version 2.1.7 fields below is _extremely_ low. + * + * Note that this forces us to disable an interesting memory-saving + * optimization though... + */ + + TT_Find_SBit_Image_Func find_sbit_image; + TT_Load_SBit_Metrics_Func load_sbit_metrics; + +#endif + + TT_Load_SBit_Image_Func load_sbit_image; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Free_Table_Func free_sbits_stub; +#endif + + /* see `ttpost.h' */ + TT_Get_PS_Name_Func get_psname; + TT_Free_Table_Func free_psnames; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_CharMap_Load_Func load_charmap_stub; + TT_CharMap_Free_Func free_charmap_stub; +#endif + + /* starting here, the structure differs from version 2.1.7 */ + + /* this field was introduced in version 2.1.8, named `get_psname' */ + TT_Face_GetKerningFunc get_kerning; + + /* new elements introduced after version 2.1.10 */ + + /* load the font directory, i.e., the offset table and */ + /* the table directory */ + TT_Load_Table_Func load_font_dir; + TT_Load_Metrics_Func load_hmtx; + + TT_Load_Table_Func load_eblc; + TT_Free_Table_Func free_eblc; + + TT_Set_SBit_Strike_Func set_sbit_strike; + TT_Load_Strike_Metrics_Func load_strike_metrics; + + TT_Get_Metrics_Func get_metrics; + + } SFNT_Interface; + + + /* transitional */ + typedef SFNT_Interface* SFNT_Service; + +#ifndef FT_CONFIG_OPTION_PIC + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_DEFINE_DRIVERS_OLD_INTERNAL(a) \ + a, +#else + #define FT_DEFINE_DRIVERS_OLD_INTERNAL(a) +#endif +#define FT_INTERNAL(a) \ + a, + +#define FT_DEFINE_SFNT_INTERFACE(class_, \ + goto_table_, init_face_, load_face_, done_face_, get_interface_, \ + load_any_, load_sfnt_header_, load_directory_, load_head_, \ + load_hhea_, load_cmap_, load_maxp_, load_os2_, load_post_, \ + load_name_, free_name_, load_hdmx_stub_, free_hdmx_stub_, \ + load_kern_, load_gasp_, load_pclt_, load_bhed_, \ + set_sbit_strike_stub_, load_sbits_stub_, find_sbit_image_, \ + load_sbit_metrics_, load_sbit_image_, free_sbits_stub_, \ + get_psname_, free_psnames_, load_charmap_stub_, free_charmap_stub_, \ + get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_, \ + set_sbit_strike_, load_strike_metrics_, get_metrics_ ) \ + static const SFNT_Interface class_ = \ + { \ + FT_INTERNAL(goto_table_) \ + FT_INTERNAL(init_face_) \ + FT_INTERNAL(load_face_) \ + FT_INTERNAL(done_face_) \ + FT_INTERNAL(get_interface_) \ + FT_INTERNAL(load_any_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sfnt_header_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_directory_) \ + FT_INTERNAL(load_head_) \ + FT_INTERNAL(load_hhea_) \ + FT_INTERNAL(load_cmap_) \ + FT_INTERNAL(load_maxp_) \ + FT_INTERNAL(load_os2_) \ + FT_INTERNAL(load_post_) \ + FT_INTERNAL(load_name_) \ + FT_INTERNAL(free_name_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_hdmx_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_hdmx_stub_) \ + FT_INTERNAL(load_kern_) \ + FT_INTERNAL(load_gasp_) \ + FT_INTERNAL(load_pclt_) \ + FT_INTERNAL(load_bhed_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(set_sbit_strike_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbits_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(find_sbit_image_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbit_metrics_) \ + FT_INTERNAL(load_sbit_image_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_sbits_stub_) \ + FT_INTERNAL(get_psname_) \ + FT_INTERNAL(free_psnames_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_charmap_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_charmap_stub_) \ + FT_INTERNAL(get_kerning_) \ + FT_INTERNAL(load_font_dir_) \ + FT_INTERNAL(load_hmtx_) \ + FT_INTERNAL(load_eblc_) \ + FT_INTERNAL(free_eblc_) \ + FT_INTERNAL(set_sbit_strike_) \ + FT_INTERNAL(load_strike_metrics_) \ + FT_INTERNAL(get_metrics_) \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS +#define FT_DEFINE_DRIVERS_OLD_INTERNAL(a, a_) \ + clazz->a = a_; +#else + #define FT_DEFINE_DRIVERS_OLD_INTERNAL(a, a_) +#endif +#define FT_INTERNAL(a, a_) \ + clazz->a = a_; + +#define FT_DEFINE_SFNT_INTERFACE(class_, \ + goto_table_, init_face_, load_face_, done_face_, get_interface_, \ + load_any_, load_sfnt_header_, load_directory_, load_head_, \ + load_hhea_, load_cmap_, load_maxp_, load_os2_, load_post_, \ + load_name_, free_name_, load_hdmx_stub_, free_hdmx_stub_, \ + load_kern_, load_gasp_, load_pclt_, load_bhed_, \ + set_sbit_strike_stub_, load_sbits_stub_, find_sbit_image_, \ + load_sbit_metrics_, load_sbit_image_, free_sbits_stub_, \ + get_psname_, free_psnames_, load_charmap_stub_, free_charmap_stub_, \ + get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_, \ + set_sbit_strike_, load_strike_metrics_, get_metrics_ ) \ + void \ + FT_Init_Class_##class_( FT_Library library, SFNT_Interface* clazz ) \ + { \ + FT_UNUSED(library); \ + FT_INTERNAL(goto_table,goto_table_) \ + FT_INTERNAL(init_face,init_face_) \ + FT_INTERNAL(load_face,load_face_) \ + FT_INTERNAL(done_face,done_face_) \ + FT_INTERNAL(get_interface,get_interface_) \ + FT_INTERNAL(load_any,load_any_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sfnt_header,load_sfnt_header_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_directory,load_directory_) \ + FT_INTERNAL(load_head,load_head_) \ + FT_INTERNAL(load_hhea,load_hhea_) \ + FT_INTERNAL(load_cmap,load_cmap_) \ + FT_INTERNAL(load_maxp,load_maxp_) \ + FT_INTERNAL(load_os2,load_os2_) \ + FT_INTERNAL(load_post,load_post_) \ + FT_INTERNAL(load_name,load_name_) \ + FT_INTERNAL(free_name,free_name_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_hdmx_stub,load_hdmx_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_hdmx_stub,free_hdmx_stub_) \ + FT_INTERNAL(load_kern,load_kern_) \ + FT_INTERNAL(load_gasp,load_gasp_) \ + FT_INTERNAL(load_pclt,load_pclt_) \ + FT_INTERNAL(load_bhed,load_bhed_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(set_sbit_strike_stub,set_sbit_strike_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbits_stub,load_sbits_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(find_sbit_image,find_sbit_image_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbit_metrics,load_sbit_metrics_) \ + FT_INTERNAL(load_sbit_image,load_sbit_image_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_sbits_stub,free_sbits_stub_) \ + FT_INTERNAL(get_psname,get_psname_) \ + FT_INTERNAL(free_psnames,free_psnames_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(load_charmap_stub,load_charmap_stub_) \ + FT_DEFINE_DRIVERS_OLD_INTERNAL(free_charmap_stub,free_charmap_stub_) \ + FT_INTERNAL(get_kerning,get_kerning_) \ + FT_INTERNAL(load_font_dir,load_font_dir_) \ + FT_INTERNAL(load_hmtx,load_hmtx_) \ + FT_INTERNAL(load_eblc,load_eblc_) \ + FT_INTERNAL(free_eblc,free_eblc_) \ + FT_INTERNAL(set_sbit_strike,set_sbit_strike_) \ + FT_INTERNAL(load_strike_metrics,load_strike_metrics_) \ + FT_INTERNAL(get_metrics,get_metrics_) \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + +FT_END_HEADER + +#endif /* __SFNT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/t1types.h b/alienblaster/project/jni/freetype/include/freetype/internal/t1types.h new file mode 100644 index 000000000..5f730637b --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/t1types.h @@ -0,0 +1,270 @@ +/***************************************************************************/ +/* */ +/* t1types.h */ +/* */ +/* Basic Type1/Type2 type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TYPES_H__ +#define __T1TYPES_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_EncodingRec */ + /* */ + /* <Description> */ + /* A structure modeling a custom encoding. */ + /* */ + /* <Fields> */ + /* num_chars :: The number of character codes in the encoding. */ + /* Usually 256. */ + /* */ + /* code_first :: The lowest valid character code in the encoding. */ + /* */ + /* code_last :: The highest valid character code in the encoding */ + /* + 1. When equal to code_first there are no valid */ + /* character codes. */ + /* */ + /* char_index :: An array of corresponding glyph indices. */ + /* */ + /* char_name :: An array of corresponding glyph names. */ + /* */ + typedef struct T1_EncodingRecRec_ + { + FT_Int num_chars; + FT_Int code_first; + FT_Int code_last; + + FT_UShort* char_index; + FT_String** char_name; + + } T1_EncodingRec, *T1_Encoding; + + + typedef enum T1_EncodingType_ + { + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY, + T1_ENCODING_TYPE_STANDARD, + T1_ENCODING_TYPE_ISOLATIN1, + T1_ENCODING_TYPE_EXPERT + + } T1_EncodingType; + + + /* used to hold extra data of PS_FontInfoRec that + * cannot be stored in the publicly defined structure. + * + * Note these can't be blended with multiple-masters. + */ + typedef struct PS_FontExtraRec_ + { + FT_UShort fs_type; + + } PS_FontExtraRec; + + + typedef struct T1_FontRec_ + { + PS_FontInfoRec font_info; /* font info dictionary */ + PS_FontExtraRec font_extra; /* font info extra fields */ + PS_PrivateRec private_dict; /* private dictionary */ + FT_String* font_name; /* top-level dictionary */ + + T1_EncodingType encoding_type; + T1_EncodingRec encoding; + + FT_Byte* subrs_block; + FT_Byte* charstrings_block; + FT_Byte* glyph_names_block; + + FT_Int num_subrs; + FT_Byte** subrs; + FT_PtrDist* subrs_len; + + FT_Int num_glyphs; + FT_String** glyph_names; /* array of glyph names */ + FT_Byte** charstrings; /* array of glyph charstrings */ + FT_PtrDist* charstrings_len; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_BBox font_bbox; + FT_Long font_id; + + FT_Fixed stroke_width; + + } T1_FontRec, *T1_Font; + + + typedef struct CID_SubrsRec_ + { + FT_UInt num_subrs; + FT_Byte** code; + + } CID_SubrsRec, *CID_Subrs; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** AFM FONT INFORMATION STRUCTURES ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_TrackKernRec_ + { + FT_Int degree; + FT_Fixed min_ptsize; + FT_Fixed min_kern; + FT_Fixed max_ptsize; + FT_Fixed max_kern; + + } AFM_TrackKernRec, *AFM_TrackKern; + + typedef struct AFM_KernPairRec_ + { + FT_Int index1; + FT_Int index2; + FT_Int x; + FT_Int y; + + } AFM_KernPairRec, *AFM_KernPair; + + typedef struct AFM_FontInfoRec_ + { + FT_Bool IsCIDFont; + FT_BBox FontBBox; + FT_Fixed Ascender; + FT_Fixed Descender; + AFM_TrackKern TrackKerns; /* free if non-NULL */ + FT_Int NumTrackKern; + AFM_KernPair KernPairs; /* free if non-NULL */ + FT_Int NumKernPair; + + } AFM_FontInfoRec, *AFM_FontInfo; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_FaceRec_* T1_Face; + typedef struct CID_FaceRec_* CID_Face; + + + typedef struct T1_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; + const void* afm_data; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + PS_Unicodes unicode_map; +#endif + + /* support for Multiple Masters fonts */ + PS_Blend blend; + + /* undocumented, optional: indices of subroutines that express */ + /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ + /* respectively, as Type 2 charstrings; -1 if keywords not present */ + FT_Int ndv_idx; + FT_Int cdv_idx; + + /* undocumented, optional: has the same meaning as len_buildchar */ + /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ + FT_UInt len_buildchar; + FT_Long* buildchar; + + /* since version 2.1 - interface to PostScript hinter */ + const void* pshinter; + + } T1_FaceRec; + + + typedef struct CID_FaceRec_ + { + FT_FaceRec root; + void* psnames; + void* psaux; + CID_FaceInfoRec cid; + PS_FontExtraRec font_extra; +#if 0 + void* afm_data; +#endif + CID_Subrs subrs; + + /* since version 2.1 - interface to PostScript hinter */ + void* pshinter; + + /* since version 2.1.8, but was originally positioned after `afm_data' */ + FT_Byte* binary_data; /* used if hex data has been converted */ + FT_Stream cid_stream; + + } CID_FaceRec; + + +FT_END_HEADER + +#endif /* __T1TYPES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/internal/tttypes.h b/alienblaster/project/jni/freetype/include/freetype/internal/tttypes.h new file mode 100644 index 000000000..acbb863b0 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/internal/tttypes.h @@ -0,0 +1,1543 @@ +/***************************************************************************/ +/* */ +/* tttypes.h */ +/* */ +/* Basic SFNT/TrueType type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTYPES_H__ +#define __TTTYPES_H__ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_OBJECTS_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TTC_HeaderRec */ + /* */ + /* <Description> */ + /* TrueType collection header. This table contains the offsets of */ + /* the font headers of each distinct TrueType face in the file. */ + /* */ + /* <Fields> */ + /* tag :: Must be `ttc ' to indicate a TrueType collection. */ + /* */ + /* version :: The version number. */ + /* */ + /* count :: The number of faces in the collection. The */ + /* specification says this should be an unsigned long, but */ + /* we use a signed long since we need the value -1 for */ + /* specific purposes. */ + /* */ + /* offsets :: The offsets of the font headers, one per face. */ + /* */ + typedef struct TTC_HeaderRec_ + { + FT_ULong tag; + FT_Fixed version; + FT_Long count; + FT_ULong* offsets; + + } TTC_HeaderRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* SFNT_HeaderRec */ + /* */ + /* <Description> */ + /* SFNT file format header. */ + /* */ + /* <Fields> */ + /* format_tag :: The font format tag. */ + /* */ + /* num_tables :: The number of tables in file. */ + /* */ + /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */ + /* */ + /* entry_selector :: Must be log2 of `search_range / 16'. */ + /* */ + /* range_shift :: Must be `num_tables * 16 - search_range'. */ + /* */ + typedef struct SFNT_HeaderRec_ + { + FT_ULong format_tag; + FT_UShort num_tables; + FT_UShort search_range; + FT_UShort entry_selector; + FT_UShort range_shift; + + FT_ULong offset; /* not in file */ + + } SFNT_HeaderRec, *SFNT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_TableRec */ + /* */ + /* <Description> */ + /* This structure describes a given table of a TrueType font. */ + /* */ + /* <Fields> */ + /* Tag :: A four-bytes tag describing the table. */ + /* */ + /* CheckSum :: The table checksum. This value can be ignored. */ + /* */ + /* Offset :: The offset of the table from the start of the TrueType */ + /* font in its resource. */ + /* */ + /* Length :: The table length (in bytes). */ + /* */ + typedef struct TT_TableRec_ + { + FT_ULong Tag; /* table type */ + FT_ULong CheckSum; /* table checksum */ + FT_ULong Offset; /* table file offset */ + FT_ULong Length; /* table length */ + + } TT_TableRec, *TT_Table; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_LongMetricsRec */ + /* */ + /* <Description> */ + /* A structure modeling the long metrics of the `hmtx' and `vmtx' */ + /* TrueType tables. The values are expressed in font units. */ + /* */ + /* <Fields> */ + /* advance :: The advance width or height for the glyph. */ + /* */ + /* bearing :: The left-side or top-side bearing for the glyph. */ + /* */ + typedef struct TT_LongMetricsRec_ + { + FT_UShort advance; + FT_Short bearing; + + } TT_LongMetricsRec, *TT_LongMetrics; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_ShortMetrics */ + /* */ + /* <Description> */ + /* A simple type to model the short metrics of the `hmtx' and `vmtx' */ + /* tables. */ + /* */ + typedef FT_Short TT_ShortMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_NameEntryRec */ + /* */ + /* <Description> */ + /* A structure modeling TrueType name records. Name records are used */ + /* to store important strings like family name, style name, */ + /* copyright, etc. in _localized_ versions (i.e., language, encoding, */ + /* etc). */ + /* */ + /* <Fields> */ + /* platformID :: The ID of the name's encoding platform. */ + /* */ + /* encodingID :: The platform-specific ID for the name's encoding. */ + /* */ + /* languageID :: The platform-specific ID for the name's language. */ + /* */ + /* nameID :: The ID specifying what kind of name this is. */ + /* */ + /* stringLength :: The length of the string in bytes. */ + /* */ + /* stringOffset :: The offset to the string in the `name' table. */ + /* */ + /* string :: A pointer to the string's bytes. Note that these */ + /* are usually UTF-16 encoded characters. */ + /* */ + typedef struct TT_NameEntryRec_ + { + FT_UShort platformID; + FT_UShort encodingID; + FT_UShort languageID; + FT_UShort nameID; + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_NameEntryRec, *TT_NameEntry; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_NameTableRec */ + /* */ + /* <Description> */ + /* A structure modeling the TrueType name table. */ + /* */ + /* <Fields> */ + /* format :: The format of the name table. */ + /* */ + /* numNameRecords :: The number of names in table. */ + /* */ + /* storageOffset :: The offset of the name table in the `name' */ + /* TrueType table. */ + /* */ + /* names :: An array of name records. */ + /* */ + /* stream :: the file's input stream. */ + /* */ + typedef struct TT_NameTableRec_ + { + FT_UShort format; + FT_UInt numNameRecords; + FT_UInt storageOffset; + TT_NameEntryRec* names; + FT_Stream stream; + + } TT_NameTableRec, *TT_NameTable; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GaspRangeRec */ + /* */ + /* <Description> */ + /* A tiny structure used to model a gasp range according to the */ + /* TrueType specification. */ + /* */ + /* <Fields> */ + /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */ + /* */ + /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */ + /* modes to be used. */ + /* */ + typedef struct TT_GaspRangeRec_ + { + FT_UShort maxPPEM; + FT_UShort gaspFlag; + + } TT_GaspRangeRec, *TT_GaspRange; + + +#define TT_GASP_GRIDFIT 0x01 +#define TT_GASP_DOGRAY 0x02 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GaspRec */ + /* */ + /* <Description> */ + /* A structure modeling the TrueType `gasp' table used to specify */ + /* grid-fitting and anti-aliasing behaviour. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numRanges :: The number of gasp ranges in table. */ + /* */ + /* gaspRanges :: An array of gasp ranges. */ + /* */ + typedef struct TT_Gasp_ + { + FT_UShort version; + FT_UShort numRanges; + TT_GaspRange gaspRanges; + + } TT_GaspRec; + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HdmxEntryRec */ + /* */ + /* <Description> */ + /* A small structure used to model the pre-computed widths of a given */ + /* size. They are found in the `hdmx' table. */ + /* */ + /* <Fields> */ + /* ppem :: The pixels per EM value at which these metrics apply. */ + /* */ + /* max_width :: The maximum advance width for this metric. */ + /* */ + /* widths :: An array of widths. Note: These are 8-bit bytes. */ + /* */ + typedef struct TT_HdmxEntryRec_ + { + FT_Byte ppem; + FT_Byte max_width; + FT_Byte* widths; + + } TT_HdmxEntryRec, *TT_HdmxEntry; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HdmxRec */ + /* */ + /* <Description> */ + /* A structure used to model the `hdmx' table, which contains */ + /* pre-computed widths for a set of given sizes/dimensions. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* num_records :: The number of hdmx records. */ + /* */ + /* records :: An array of hdmx records. */ + /* */ + typedef struct TT_HdmxRec_ + { + FT_UShort version; + FT_Short num_records; + TT_HdmxEntry records; + + } TT_HdmxRec, *TT_Hdmx; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Kern0_PairRec */ + /* */ + /* <Description> */ + /* A structure used to model a kerning pair for the kerning table */ + /* format 0. The engine now loads this table if it finds one in the */ + /* font file. */ + /* */ + /* <Fields> */ + /* left :: The index of the left glyph in pair. */ + /* */ + /* right :: The index of the right glyph in pair. */ + /* */ + /* value :: The kerning distance. A positive value spaces the */ + /* glyphs, a negative one makes them closer. */ + /* */ + typedef struct TT_Kern0_PairRec_ + { + FT_UShort left; /* index of left glyph in pair */ + FT_UShort right; /* index of right glyph in pair */ + FT_FWord value; /* kerning value */ + + } TT_Kern0_PairRec, *TT_Kern0_Pair; + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BITMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_MetricsRec */ + /* */ + /* <Description> */ + /* A structure used to hold the big metrics of a given glyph bitmap */ + /* in a TrueType or OpenType font. These are usually found in the */ + /* `EBDT' (Microsoft) or `bloc' (Apple) table. */ + /* */ + /* <Fields> */ + /* height :: The glyph height in pixels. */ + /* */ + /* width :: The glyph width in pixels. */ + /* */ + /* horiBearingX :: The horizontal left bearing. */ + /* */ + /* horiBearingY :: The horizontal top bearing. */ + /* */ + /* horiAdvance :: The horizontal advance. */ + /* */ + /* vertBearingX :: The vertical left bearing. */ + /* */ + /* vertBearingY :: The vertical top bearing. */ + /* */ + /* vertAdvance :: The vertical advance. */ + /* */ + typedef struct TT_SBit_MetricsRec_ + { + FT_Byte height; + FT_Byte width; + + FT_Char horiBearingX; + FT_Char horiBearingY; + FT_Byte horiAdvance; + + FT_Char vertBearingX; + FT_Char vertBearingY; + FT_Byte vertAdvance; + + } TT_SBit_MetricsRec, *TT_SBit_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_SmallMetricsRec */ + /* */ + /* <Description> */ + /* A structure used to hold the small metrics of a given glyph bitmap */ + /* in a TrueType or OpenType font. These are usually found in the */ + /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */ + /* */ + /* <Fields> */ + /* height :: The glyph height in pixels. */ + /* */ + /* width :: The glyph width in pixels. */ + /* */ + /* bearingX :: The left-side bearing. */ + /* */ + /* bearingY :: The top-side bearing. */ + /* */ + /* advance :: The advance width or height. */ + /* */ + typedef struct TT_SBit_Small_Metrics_ + { + FT_Byte height; + FT_Byte width; + + FT_Char bearingX; + FT_Char bearingY; + FT_Byte advance; + + } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_LineMetricsRec */ + /* */ + /* <Description> */ + /* A structure used to describe the text line metrics of a given */ + /* bitmap strike, for either a horizontal or vertical layout. */ + /* */ + /* <Fields> */ + /* ascender :: The ascender in pixels. */ + /* */ + /* descender :: The descender in pixels. */ + /* */ + /* max_width :: The maximum glyph width in pixels. */ + /* */ + /* caret_slope_enumerator :: Rise of the caret slope, typically set */ + /* to 1 for non-italic fonts. */ + /* */ + /* caret_slope_denominator :: Rise of the caret slope, typically set */ + /* to 0 for non-italic fonts. */ + /* */ + /* caret_offset :: Offset in pixels to move the caret for */ + /* proper positioning. */ + /* */ + /* min_origin_SB :: Minimum of horiBearingX (resp. */ + /* vertBearingY). */ + /* min_advance_SB :: Minimum of */ + /* */ + /* horizontal advance - */ + /* ( horiBearingX + width ) */ + /* */ + /* resp. */ + /* */ + /* vertical advance - */ + /* ( vertBearingY + height ) */ + /* */ + /* max_before_BL :: Maximum of horiBearingY (resp. */ + /* vertBearingY). */ + /* */ + /* min_after_BL :: Minimum of */ + /* */ + /* horiBearingY - height */ + /* */ + /* resp. */ + /* */ + /* vertBearingX - width */ + /* */ + /* pads :: Unused (to make the size of the record */ + /* a multiple of 32 bits. */ + /* */ + typedef struct TT_SBit_LineMetricsRec_ + { + FT_Char ascender; + FT_Char descender; + FT_Byte max_width; + FT_Char caret_slope_numerator; + FT_Char caret_slope_denominator; + FT_Char caret_offset; + FT_Char min_origin_SB; + FT_Char min_advance_SB; + FT_Char max_before_BL; + FT_Char min_after_BL; + FT_Char pads[2]; + + } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_RangeRec */ + /* */ + /* <Description> */ + /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* <Fields> */ + /* first_glyph :: The first glyph index in the range. */ + /* */ + /* last_glyph :: The last glyph index in the range. */ + /* */ + /* index_format :: The format of index table. Valid values are 1 */ + /* to 5. */ + /* */ + /* image_format :: The format of `EBDT' image data. */ + /* */ + /* image_offset :: The offset to image data in `EBDT'. */ + /* */ + /* image_size :: For index formats 2 and 5. This is the size in */ + /* bytes of each glyph bitmap. */ + /* */ + /* big_metrics :: For index formats 2 and 5. This is the big */ + /* metrics for each glyph bitmap. */ + /* */ + /* num_glyphs :: For index formats 4 and 5. This is the number of */ + /* glyphs in the code array. */ + /* */ + /* glyph_offsets :: For index formats 1 and 3. */ + /* */ + /* glyph_codes :: For index formats 4 and 5. */ + /* */ + /* table_offset :: The offset of the index table in the `EBLC' */ + /* table. Only used during strike loading. */ + /* */ + typedef struct TT_SBit_RangeRec_ + { + FT_UShort first_glyph; + FT_UShort last_glyph; + + FT_UShort index_format; + FT_UShort image_format; + FT_ULong image_offset; + + FT_ULong image_size; + TT_SBit_MetricsRec metrics; + FT_ULong num_glyphs; + + FT_ULong* glyph_offsets; + FT_UShort* glyph_codes; + + FT_ULong table_offset; + + } TT_SBit_RangeRec, *TT_SBit_Range; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_StrikeRec */ + /* */ + /* <Description> */ + /* A structure used describe a given bitmap strike in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* <Fields> */ + /* num_index_ranges :: The number of index ranges. */ + /* */ + /* index_ranges :: An array of glyph index ranges. */ + /* */ + /* color_ref :: Unused. `color_ref' is put in for future */ + /* enhancements, but these fields are already */ + /* in use by other platforms (e.g. Newton). */ + /* For details, please see */ + /* */ + /* http://fonts.apple.com/ */ + /* TTRefMan/RM06/Chap6bloc.html */ + /* */ + /* hori :: The line metrics for horizontal layouts. */ + /* */ + /* vert :: The line metrics for vertical layouts. */ + /* */ + /* start_glyph :: The lowest glyph index for this strike. */ + /* */ + /* end_glyph :: The highest glyph index for this strike. */ + /* */ + /* x_ppem :: The number of horizontal pixels per EM. */ + /* */ + /* y_ppem :: The number of vertical pixels per EM. */ + /* */ + /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */ + /* and 8. */ + /* */ + /* flags :: Is this a vertical or horizontal strike? For */ + /* details, please see */ + /* */ + /* http://fonts.apple.com/ */ + /* TTRefMan/RM06/Chap6bloc.html */ + /* */ + typedef struct TT_SBit_StrikeRec_ + { + FT_Int num_ranges; + TT_SBit_Range sbit_ranges; + FT_ULong ranges_offset; + + FT_ULong color_ref; + + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_UShort start_glyph; + FT_UShort end_glyph; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte bit_depth; + FT_Char flags; + + } TT_SBit_StrikeRec, *TT_SBit_Strike; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_ComponentRec */ + /* */ + /* <Description> */ + /* A simple structure to describe a compound sbit element. */ + /* */ + /* <Fields> */ + /* glyph_code :: The element's glyph index. */ + /* */ + /* x_offset :: The element's left bearing. */ + /* */ + /* y_offset :: The element's top bearing. */ + /* */ + typedef struct TT_SBit_ComponentRec_ + { + FT_UShort glyph_code; + FT_Char x_offset; + FT_Char y_offset; + + } TT_SBit_ComponentRec, *TT_SBit_Component; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_ScaleRec */ + /* */ + /* <Description> */ + /* A structure used describe a given bitmap scaling table, as defined */ + /* in the `EBSC' table. */ + /* */ + /* <Fields> */ + /* hori :: The horizontal line metrics. */ + /* */ + /* vert :: The vertical line metrics. */ + /* */ + /* x_ppem :: The number of horizontal pixels per EM. */ + /* */ + /* y_ppem :: The number of vertical pixels per EM. */ + /* */ + /* x_ppem_substitute :: Substitution x_ppem value. */ + /* */ + /* y_ppem_substitute :: Substitution y_ppem value. */ + /* */ + typedef struct TT_SBit_ScaleRec_ + { + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte x_ppem_substitute; + FT_Byte y_ppem_substitute; + + } TT_SBit_ScaleRec, *TT_SBit_Scale; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_20Rec */ + /* */ + /* <Description> */ + /* Postscript names sub-table, format 2.0. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* <Fields> */ + /* num_glyphs :: The number of named glyphs in the table. */ + /* */ + /* num_names :: The number of PS names stored in the table. */ + /* */ + /* glyph_indices :: The indices of the glyphs in the names arrays. */ + /* */ + /* glyph_names :: The PS names not in Mac Encoding. */ + /* */ + typedef struct TT_Post_20Rec_ + { + FT_UShort num_glyphs; + FT_UShort num_names; + FT_UShort* glyph_indices; + FT_Char** glyph_names; + + } TT_Post_20Rec, *TT_Post_20; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_25Rec */ + /* */ + /* <Description> */ + /* Postscript names sub-table, format 2.5. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* <Fields> */ + /* num_glyphs :: The number of glyphs in the table. */ + /* */ + /* offsets :: An array of signed offsets in a normal Mac */ + /* Postscript name encoding. */ + /* */ + typedef struct TT_Post_25_ + { + FT_UShort num_glyphs; + FT_Char* offsets; + + } TT_Post_25Rec, *TT_Post_25; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_NamesRec */ + /* */ + /* <Description> */ + /* Postscript names table, either format 2.0 or 2.5. */ + /* */ + /* <Fields> */ + /* loaded :: A flag to indicate whether the PS names are loaded. */ + /* */ + /* format_20 :: The sub-table used for format 2.0. */ + /* */ + /* format_25 :: The sub-table used for format 2.5. */ + /* */ + typedef struct TT_Post_NamesRec_ + { + FT_Bool loaded; + + union + { + TT_Post_20Rec format_20; + TT_Post_25Rec format_25; + + } names; + + } TT_Post_NamesRec, *TT_Post_Names; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** GX VARIATION TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + typedef struct GX_BlendRec_ *GX_Blend; +#endif + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * These types are used to support a `BDF ' table that isn't part of the + * official TrueType specification. It is mainly used in SFNT-based + * bitmap fonts that were generated from a set of BDF fonts. + * + * The format of the table is as follows. + * + * USHORT version `BDF ' table version number, should be 0x0001. + * USHORT strikeCount Number of strikes (bitmap sizes) in this table. + * ULONG stringTable Offset (from start of BDF table) to string + * table. + * + * This is followed by an array of `strikeCount' descriptors, having the + * following format. + * + * USHORT ppem Vertical pixels per EM for this strike. + * USHORT numItems Number of items for this strike (properties and + * atoms). Maximum is 255. + * + * This array in turn is followed by `strikeCount' value sets. Each + * `value set' is an array of `numItems' items with the following format. + * + * ULONG item_name Offset in string table to item name. + * USHORT item_type The item type. Possible values are + * 0 => string (e.g., COMMENT) + * 1 => atom (e.g., FONT or even SIZE) + * 2 => int32 + * 3 => uint32 + * 0x10 => A flag to indicate a properties. This + * is ORed with the above values. + * ULONG item_value For strings => Offset into string table without + * the corresponding double quotes. + * For atoms => Offset into string table. + * For integers => Direct value. + * + * All strings in the string table consist of bytes and are + * zero-terminated. + * + */ + +#ifdef TT_CONFIG_OPTION_BDF + + typedef struct TT_BDFRec_ + { + FT_Byte* table; + FT_Byte* table_end; + FT_Byte* strings; + FT_ULong strings_size; + FT_UInt num_strikes; + FT_Bool loaded; + + } TT_BDFRec, *TT_BDF; + +#endif /* TT_CONFIG_OPTION_BDF */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This structure/class is defined here because it is common to the */ + /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ + /* */ + /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */ + /* shared between font drivers, and are thus defined in `ttobjs.h'. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_Face */ + /* */ + /* <Description> */ + /* A handle to a TrueType face/font object. A TT_Face encapsulates */ + /* the resolution and scaling independent parts of a TrueType font */ + /* resource. */ + /* */ + /* <Note> */ + /* The TT_Face structure is also used as a `parent class' for the */ + /* OpenType-CFF class (T2_Face). */ + /* */ + typedef struct TT_FaceRec_* TT_Face; + + + /* a function type used for the truetype bytecode interpreter hooks */ + typedef FT_Error + (*TT_Interpreter)( void* exec_context ); + + /* forward declaration */ + typedef struct TT_LoaderRec_* TT_Loader; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_GotoTableFunc */ + /* */ + /* <Description> */ + /* Seeks a stream to the start of a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* tag :: A 4-byte tag used to name the table. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* length :: The length of the table in bytes. Set to 0 if not */ + /* needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + typedef FT_Error + (*TT_Loader_GotoTableFunc)( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_StartGlyphFunc */ + /* */ + /* <Description> */ + /* Seeks a stream to the start of a given glyph element, and opens a */ + /* frame for it. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* glyph index :: The index of the glyph to access. */ + /* */ + /* offset :: The offset of the glyph according to the */ + /* `locations' table. */ + /* */ + /* byte_count :: The size of the frame in bytes. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function is normally equivalent to FT_STREAM_SEEK(offset) */ + /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */ + /* but alternative formats (e.g. compressed ones) might use something */ + /* different. */ + /* */ + typedef FT_Error + (*TT_Loader_StartGlyphFunc)( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_ReadGlyphFunc */ + /* */ + /* <Description> */ + /* Reads one glyph element (its header, a simple glyph, or a */ + /* composite) from the loader's current stream frame. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_EndGlyphFunc */ + /* */ + /* <Description> */ + /* Closes the current loader stream frame for the glyph. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + typedef void + (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); + + + /*************************************************************************/ + /* */ + /* TrueType Face Type */ + /* */ + /* <Struct> */ + /* TT_Face */ + /* */ + /* <Description> */ + /* The TrueType face class. These objects model the resolution and */ + /* point-size independent data found in a TrueType font file. */ + /* */ + /* <Fields> */ + /* root :: The base FT_Face structure, managed by the */ + /* base layer. */ + /* */ + /* ttc_header :: The TrueType collection header, used when */ + /* the file is a `ttc' rather than a `ttf'. */ + /* For ordinary font files, the field */ + /* `ttc_header.count' is set to 0. */ + /* */ + /* format_tag :: The font format tag. */ + /* */ + /* num_tables :: The number of TrueType tables in this font */ + /* file. */ + /* */ + /* dir_tables :: The directory of TrueType tables for this */ + /* font file. */ + /* */ + /* header :: The font's font header (`head' table). */ + /* Read on font opening. */ + /* */ + /* horizontal :: The font's horizontal header (`hhea' */ + /* table). This field also contains the */ + /* associated horizontal metrics table */ + /* (`hmtx'). */ + /* */ + /* max_profile :: The font's maximum profile table. Read on */ + /* font opening. Note that some maximum */ + /* values cannot be taken directly from this */ + /* table. We thus define additional fields */ + /* below to hold the computed maxima. */ + /* */ + /* vertical_info :: A boolean which is set when the font file */ + /* contains vertical metrics. If not, the */ + /* value of the `vertical' field is */ + /* undefined. */ + /* */ + /* vertical :: The font's vertical header (`vhea' table). */ + /* This field also contains the associated */ + /* vertical metrics table (`vmtx'), if found. */ + /* IMPORTANT: The contents of this field is */ + /* undefined if the `verticalInfo' field is */ + /* unset. */ + /* */ + /* num_names :: The number of name records within this */ + /* TrueType font. */ + /* */ + /* name_table :: The table of name records (`name'). */ + /* */ + /* os2 :: The font's OS/2 table (`OS/2'). */ + /* */ + /* postscript :: The font's PostScript table (`post' */ + /* table). The PostScript glyph names are */ + /* not loaded by the driver on face opening. */ + /* See the `ttpost' module for more details. */ + /* */ + /* cmap_table :: Address of the face's `cmap' SFNT table */ + /* in memory (it's an extracted frame). */ + /* */ + /* cmap_size :: The size in bytes of the `cmap_table' */ + /* described above. */ + /* */ + /* goto_table :: A function called by each TrueType table */ + /* loader to position a stream's cursor to */ + /* the start of a given table according to */ + /* its tag. It defaults to TT_Goto_Face but */ + /* can be different for strange formats (e.g. */ + /* Type 42). */ + /* */ + /* access_glyph_frame :: A function used to access the frame of a */ + /* given glyph within the face's font file. */ + /* */ + /* forget_glyph_frame :: A function used to forget the frame of a */ + /* given glyph when all data has been loaded. */ + /* */ + /* read_glyph_header :: A function used to read a glyph header. */ + /* It must be called between an `access' and */ + /* `forget'. */ + /* */ + /* read_simple_glyph :: A function used to read a simple glyph. */ + /* It must be called after the header was */ + /* read, and before the `forget'. */ + /* */ + /* read_composite_glyph :: A function used to read a composite glyph. */ + /* It must be called after the header was */ + /* read, and before the `forget'. */ + /* */ + /* sfnt :: A pointer to the SFNT service. */ + /* */ + /* psnames :: A pointer to the PostScript names service. */ + /* */ + /* hdmx :: The face's horizontal device metrics */ + /* (`hdmx' table). This table is optional in */ + /* TrueType/OpenType fonts. */ + /* */ + /* gasp :: The grid-fitting and scaling properties */ + /* table (`gasp'). This table is optional in */ + /* TrueType/OpenType fonts. */ + /* */ + /* pclt :: The `pclt' SFNT table. */ + /* */ + /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */ + /* sizes, embedded in this font. */ + /* */ + /* sbit_strikes :: An array of sbit strikes embedded in this */ + /* font. This table is optional in a */ + /* TrueType/OpenType font. */ + /* */ + /* num_sbit_scales :: The number of sbit scales for this font. */ + /* */ + /* sbit_scales :: Array of sbit scales embedded in this */ + /* font. This table is optional in a */ + /* TrueType/OpenType font. */ + /* */ + /* postscript_names :: A table used to store the Postscript names */ + /* of the glyphs for this font. See the */ + /* file `ttconfig.h' for comments on the */ + /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */ + /* */ + /* num_locations :: The number of glyph locations in this */ + /* TrueType file. This should be */ + /* identical to the number of glyphs. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* glyph_locations :: An array of longs. These are offsets to */ + /* glyph data within the `glyf' table. */ + /* Ignored for Type 2 font faces. */ + /* */ + /* glyf_len :: The length of the `glyf' table. Needed */ + /* for malformed `loca' tables. */ + /* */ + /* font_program_size :: Size in bytecodes of the face's font */ + /* program. 0 if none defined. Ignored for */ + /* Type 2 fonts. */ + /* */ + /* font_program :: The face's font program (bytecode stream) */ + /* executed at load time, also used during */ + /* glyph rendering. Comes from the `fpgm' */ + /* table. Ignored for Type 2 font fonts. */ + /* */ + /* cvt_program_size :: The size in bytecodes of the face's cvt */ + /* program. Ignored for Type 2 fonts. */ + /* */ + /* cvt_program :: The face's cvt program (bytecode stream) */ + /* executed each time an instance/size is */ + /* changed/reset. Comes from the `prep' */ + /* table. Ignored for Type 2 fonts. */ + /* */ + /* cvt_size :: Size of the control value table (in */ + /* entries). Ignored for Type 2 fonts. */ + /* */ + /* cvt :: The face's original control value table. */ + /* Coordinates are expressed in unscaled font */ + /* units. Comes from the `cvt ' table. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* num_kern_pairs :: The number of kerning pairs present in the */ + /* font file. The engine only loads the */ + /* first horizontal format 0 kern table it */ + /* finds in the font file. Ignored for */ + /* Type 2 fonts. */ + /* */ + /* kern_table_index :: The index of the kerning table in the font */ + /* kerning directory. Ignored for Type 2 */ + /* fonts. */ + /* */ + /* interpreter :: A pointer to the TrueType bytecode */ + /* interpreters field is also used to hook */ + /* the debugger in `ttdebug'. */ + /* */ + /* unpatented_hinting :: If true, use only unpatented methods in */ + /* the bytecode interpreter. */ + /* */ + /* doblend :: A boolean which is set if the font should */ + /* be blended (this is for GX var). */ + /* */ + /* blend :: Contains the data needed to control GX */ + /* variation tables (rather like Multiple */ + /* Master data). */ + /* */ + /* extra :: Reserved for third-party font drivers. */ + /* */ + /* postscript_name :: The PS name of the font. Used by the */ + /* postscript name service. */ + /* */ + typedef struct TT_FaceRec_ + { + FT_FaceRec root; + + TTC_HeaderRec ttc_header; + + FT_ULong format_tag; + FT_UShort num_tables; + TT_Table dir_tables; + + TT_Header header; /* TrueType header table */ + TT_HoriHeader horizontal; /* TrueType horizontal header */ + + TT_MaxProfile max_profile; +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_ULong max_components; /* stubbed to 0 */ +#endif + + FT_Bool vertical_info; + TT_VertHeader vertical; /* TT Vertical header, if present */ + + FT_UShort num_names; /* number of name records */ + TT_NameTableRec name_table; /* name table */ + + TT_OS2 os2; /* TrueType OS/2 table */ + TT_Postscript postscript; /* TrueType Postscript table */ + + FT_Byte* cmap_table; /* extracted `cmap' table */ + FT_ULong cmap_size; + + TT_Loader_GotoTableFunc goto_table; + + TT_Loader_StartGlyphFunc access_glyph_frame; + TT_Loader_EndGlyphFunc forget_glyph_frame; + TT_Loader_ReadGlyphFunc read_glyph_header; + TT_Loader_ReadGlyphFunc read_simple_glyph; + TT_Loader_ReadGlyphFunc read_composite_glyph; + + /* a typeless pointer to the SFNT_Interface table used to load */ + /* the basic TrueType tables in the face object */ + void* sfnt; + + /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ + /* handle glyph names <-> unicode & Mac values */ + void* psnames; + + + /***********************************************************************/ + /* */ + /* Optional TrueType/OpenType tables */ + /* */ + /***********************************************************************/ + + /* horizontal device metrics */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_HdmxRec hdmx; +#endif + + /* grid-fitting and scaling table */ + TT_GaspRec gasp; /* the `gasp' table */ + + /* PCL 5 table */ + TT_PCLT pclt; + + /* embedded bitmaps support */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_ULong num_sbit_strikes; + TT_SBit_Strike sbit_strikes; +#endif + + FT_ULong num_sbit_scales; + TT_SBit_Scale sbit_scales; + + /* postscript names table */ + TT_Post_NamesRec postscript_names; + + + /***********************************************************************/ + /* */ + /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ + /* */ + /***********************************************************************/ + + /* the glyph locations */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_UShort num_locations_stub; + FT_Long* glyph_locations_stub; +#endif + + /* the font program, if any */ + FT_ULong font_program_size; + FT_Byte* font_program; + + /* the cvt program, if any */ + FT_ULong cvt_program_size; + FT_Byte* cvt_program; + + /* the original, unscaled, control value table */ + FT_ULong cvt_size; + FT_Short* cvt; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + /* the format 0 kerning table, if any */ + FT_Int num_kern_pairs; + FT_Int kern_table_index; + TT_Kern0_Pair kern_pairs; +#endif + + /* A pointer to the bytecode interpreter to use. This is also */ + /* used to hook the debugger for the `ttdebug' utility. */ + TT_Interpreter interpreter; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Use unpatented hinting only. */ + FT_Bool unpatented_hinting; +#endif + + /***********************************************************************/ + /* */ + /* Other tables or fields. This is used by derivative formats like */ + /* OpenType. */ + /* */ + /***********************************************************************/ + + FT_Generic extra; + + const char* postscript_name; + + /* since version 2.1.8, but was originally placed after */ + /* `glyph_locations_stub' */ + FT_ULong glyf_len; + + /* since version 2.1.8, but was originally placed before `extra' */ +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Bool doblend; + GX_Blend blend; +#endif + + /* since version 2.2 */ + + FT_Byte* horz_metrics; + FT_ULong horz_metrics_size; + + FT_Byte* vert_metrics; + FT_ULong vert_metrics_size; + + FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */ + FT_Byte* glyph_locations; + + FT_Byte* hdmx_table; + FT_ULong hdmx_table_size; + FT_UInt hdmx_record_count; + FT_ULong hdmx_record_size; + FT_Byte* hdmx_record_sizes; + + FT_Byte* sbit_table; + FT_ULong sbit_table_size; + FT_UInt sbit_num_strikes; + + FT_Byte* kern_table; + FT_ULong kern_table_size; + FT_UInt num_kern_tables; + FT_UInt32 kern_avail_bits; + FT_UInt32 kern_order_bits; + +#ifdef TT_CONFIG_OPTION_BDF + TT_BDFRec bdf; +#endif /* TT_CONFIG_OPTION_BDF */ + + /* since 2.3.0 */ + FT_ULong horz_metrics_offset; + FT_ULong vert_metrics_offset; + + } TT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GlyphZoneRec */ + /* */ + /* <Description> */ + /* A glyph zone is used to load, scale and hint glyph outline */ + /* coordinates. */ + /* */ + /* <Fields> */ + /* memory :: A handle to the memory manager. */ + /* */ + /* max_points :: The maximal size in points of the zone. */ + /* */ + /* max_contours :: Max size in links contours of the zone. */ + /* */ + /* n_points :: The current number of points in the zone. */ + /* */ + /* n_contours :: The current number of contours in the zone. */ + /* */ + /* org :: The original glyph coordinates (font */ + /* units/scaled). */ + /* */ + /* cur :: The current glyph coordinates (scaled/hinted). */ + /* */ + /* tags :: The point control tags. */ + /* */ + /* contours :: The contours end points. */ + /* */ + /* first_point :: Offset of the current subglyph's first point. */ + /* */ + typedef struct TT_GlyphZoneRec_ + { + FT_Memory memory; + FT_UShort max_points; + FT_UShort max_contours; + FT_UShort n_points; /* number of points in zone */ + FT_Short n_contours; /* number of contours */ + + FT_Vector* org; /* original point coordinates */ + FT_Vector* cur; /* current point coordinates */ + FT_Vector* orus; /* original (unscaled) point coordinates */ + + FT_Byte* tags; /* current touch flags */ + FT_UShort* contours; /* contour end points */ + + FT_UShort first_point; /* offset of first (#0) point */ + + } TT_GlyphZoneRec, *TT_GlyphZone; + + + /* handle to execution context */ + typedef struct TT_ExecContextRec_* TT_ExecContext; + + /* glyph loader structure */ + typedef struct TT_LoaderRec_ + { + FT_Face face; + FT_Size size; + FT_GlyphSlot glyph; + FT_GlyphLoader gloader; + + FT_ULong load_flags; + FT_UInt glyph_index; + + FT_Stream stream; + FT_Int byte_len; + + FT_Short n_contours; + FT_BBox bbox; + FT_Int left_bearing; + FT_Int advance; + FT_Int linear; + FT_Bool linear_def; + FT_Bool preserve_pps; + FT_Vector pp1; + FT_Vector pp2; + + FT_ULong glyf_offset; + + /* the zone where we load our glyphs */ + TT_GlyphZoneRec base; + TT_GlyphZoneRec zone; + + TT_ExecContext exec; + FT_Byte* instructions; + FT_ULong ins_pos; + + /* for possible extensibility in other formats */ + void* other; + + /* since version 2.1.8 */ + FT_Int top_bearing; + FT_Int vadvance; + FT_Vector pp3; + FT_Vector pp4; + + /* since version 2.2.1 */ + FT_Byte* cursor; + FT_Byte* limit; + + } TT_LoaderRec; + + +FT_END_HEADER + +#endif /* __TTTYPES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/t1tables.h b/alienblaster/project/jni/freetype/include/freetype/t1tables.h new file mode 100644 index 000000000..5e2a3934c --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/t1tables.h @@ -0,0 +1,504 @@ +/***************************************************************************/ +/* */ +/* t1tables.h */ +/* */ +/* Basic Type 1/Type 2 tables definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TABLES_H__ +#define __T1TABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* type1_tables */ + /* */ + /* <Title> */ + /* Type 1 Tables */ + /* */ + /* <Abstract> */ + /* Type~1 (PostScript) specific font tables. */ + /* */ + /* <Description> */ + /* This section contains the definition of Type 1-specific tables, */ + /* including structures related to other PostScript font formats. */ + /* */ + /*************************************************************************/ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfoRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */ + /* Note that for Multiple Master fonts, each instance has its own */ + /* FontInfo dictionary. */ + /* */ + typedef struct PS_FontInfoRec_ + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfo */ + /* */ + /* <Description> */ + /* A handle to a @PS_FontInfoRec structure. */ + /* */ + typedef struct PS_FontInfoRec_* PS_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_FontInfo */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_FontInfoRec T1_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_PrivateRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type~1 or Type~2 private dictionary. */ + /* Note that for Multiple Master fonts, each instance has its own */ + /* Private dictionary. */ + /* */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_Private */ + /* */ + /* <Description> */ + /* A handle to a @PS_PrivateRec structure. */ + /* */ + typedef struct PS_PrivateRec_* PS_Private; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_Private */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_PrivateRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_PrivateRec T1_Private; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* T1_Blend_Flags */ + /* */ + /* <Description> */ + /* A set of flags used to indicate which fields are present in a */ + /* given blend dictionary (font info or private). Used to support */ + /* Multiple Masters fonts. */ + /* */ + typedef enum T1_Blend_Flags_ + { + /*# required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /*# required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + /*# never remove */ + T1_BLEND_MAX + + } T1_Blend_Flags; + + /* */ + + + /*# backwards compatible definitions */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backwards-compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backwards-compatible definition */ + typedef PS_BlendRec T1_Blend; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceDictRec */ + /* */ + /* <Description> */ + /* A structure used to represent data in a CID top-level dictionary. */ + /* */ + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_Int sd_bytes; + + } CID_FaceDictRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceDict */ + /* */ + /* <Description> */ + /* A handle to a @CID_FaceDictRec structure. */ + /* */ + typedef struct CID_FaceDictRec_* CID_FaceDict; + + /* */ + + + /* backwards-compatible definition */ + typedef CID_FaceDictRec CID_FontDict; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfoRec */ + /* */ + /* <Description> */ + /* A structure used to represent CID Face information. */ + /* */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_Int fd_bytes; + FT_Int gd_bytes; + FT_ULong cid_count; + + FT_Int num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfo */ + /* */ + /* <Description> */ + /* A handle to a @CID_FaceInfoRec structure. */ + /* */ + typedef struct CID_FaceInfoRec_* CID_FaceInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_Info */ + /* */ + /* <Description> */ + /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef CID_FaceInfoRec CID_Info; + + + /************************************************************************ + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable PostScript glyph + * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro, + * except that certain fonts (mostly TrueType) contain incorrect + * glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + * + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_info :: + * Output font info structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the font info structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function will + * return the `FT_Err_Invalid_Argument' error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfo afont_info ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * PostScript font. + * + * @input: + * face :: + * PostScript face handle. + * + * @output: + * afont_private :: + * Output private dictionary structure pointer. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * The string pointers within the @PS_PrivateRec structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not PostScript-based, this function returns + * the `FT_Err_Invalid_Argument' error code. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_Private afont_private ); + + /* */ + + +FT_END_HEADER + +#endif /* __T1TABLES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ttnameid.h b/alienblaster/project/jni/freetype/include/freetype/ttnameid.h new file mode 100644 index 000000000..cbeac78db --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ttnameid.h @@ -0,0 +1,1247 @@ +/***************************************************************************/ +/* */ +/* ttnameid.h */ +/* */ +/* TrueType name ID definitions (specification only). */ +/* */ +/* Copyright 1996-2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTNAMEID_H__ +#define __TTNAMEID_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + + + /*************************************************************************/ + /* */ + /* Possible values for the `platform' identifier code in the name */ + /* records of the TTF `name' table. */ + /* */ + /*************************************************************************/ + + + /*********************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id' identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name entry. + * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that + * most TrueType fonts contain an Apple roman charmap to be usable on + * MacOS systems (even if they contain a Microsoft charmap as well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify Unicode charmaps. It is however + * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding + * `encoding_id' values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values. + * Note that most fonts contain a Unicode charmap using + * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /*********************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + * + * TT_APPLE_ID_VARIANT_SELECTOR :: + * From Adobe, not Apple. Not a normal cmap. Specifies variations + * on a real cmap. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ +#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */ + + + /*********************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + * + * @values: + * TT_MAC_ID_ROMAN :: + * TT_MAC_ID_JAPANESE :: + * TT_MAC_ID_TRADITIONAL_CHINESE :: + * TT_MAC_ID_KOREAN :: + * TT_MAC_ID_ARABIC :: + * TT_MAC_ID_HEBREW :: + * TT_MAC_ID_GREEK :: + * TT_MAC_ID_RUSSIAN :: + * TT_MAC_ID_RSYMBOL :: + * TT_MAC_ID_DEVANAGARI :: + * TT_MAC_ID_GURMUKHI :: + * TT_MAC_ID_GUJARATI :: + * TT_MAC_ID_ORIYA :: + * TT_MAC_ID_BENGALI :: + * TT_MAC_ID_TAMIL :: + * TT_MAC_ID_TELUGU :: + * TT_MAC_ID_KANNADA :: + * TT_MAC_ID_MALAYALAM :: + * TT_MAC_ID_SINHALESE :: + * TT_MAC_ID_BURMESE :: + * TT_MAC_ID_KHMER :: + * TT_MAC_ID_THAI :: + * TT_MAC_ID_LAOTIAN :: + * TT_MAC_ID_GEORGIAN :: + * TT_MAC_ID_ARMENIAN :: + * TT_MAC_ID_MALDIVIAN :: + * TT_MAC_ID_SIMPLIFIED_CHINESE :: + * TT_MAC_ID_TIBETAN :: + * TT_MAC_ID_MONGOLIAN :: + * TT_MAC_ID_GEEZ :: + * TT_MAC_ID_SLAVIC :: + * TT_MAC_ID_VIETNAMESE :: + * TT_MAC_ID_SINDHI :: + * TT_MAC_ID_UNINTERP :: + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /*********************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ISO charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /*********************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Corresponds to Microsoft symbol encoding. See + * @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See + * @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_GB2312 :: + * Corresponds to Simplified Chinese as used in Mainland China. See + * @FT_ENCODING_GB2312. + * + * TT_MS_ID_BIG_5 :: + * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. + * See @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to + * the OpenType specification version 1.4 (mid-2001.) + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_GB2312 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + + /*********************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + * TT_ADOBE_ID_LATIN_1 :: + * Adobe Latin~1 encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MACINTOSH. */ + /* */ + /* The canonical source for the Apple assigned Language ID's is at */ + /* */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6name.html */ + /* */ +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + +#if 0 /* these seem to be errors that have been dropped */ + +#define TT_MAC_LANGID_SCOTTISH_GAELIC 140 +#define TT_MAC_LANGID_IRISH_GAELIC 141 + +#endif + + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MICROSOFT. */ + /* */ + /* The canonical source for the MS assigned LCID's (seems to) be at */ + /* */ + /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ + /* */ + /* It used to be at various places, among them */ + /* */ + /* http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt */ + /* http://www.microsoft.com/globaldev/reference/loclanghome.asp */ + /* http://support.microsoft.com/support/kb/articles/Q224/8/04.ASP */ + /* http://msdn.microsoft.com/library/en-us/passport25/ */ + /* NET_Passport_VBScript_Documentation/Single_Sign_In/ */ + /* Advanced_Single_Sign_In/Localization_and_LCIDs.asp */ + /* */ + /* Hopefully, it seems now that the Globaldev site prevails... */ + /* (updated by Antoine, 2004-02-17) */ + +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 + +#if 1 /* this looks like the correct value */ +#define TT_MS_LANGID_CHINESE_MACAU 0x1404 +#else /* but beware, Microsoft may change its mind... + the most recent Word reference has the following: */ +#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG +#endif + +#if 0 /* used only with .NET `cultures'; commented out */ +#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04 +#endif + +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 + + /* don't ask what this one means... It is commented out currently. */ +#if 0 +#define TT_MS_LANGID_GREEK_GREECE2 0x2008 +#endif + +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a +#define TT_MS_LANGID_SPANISH_MEXICO 0x080a +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a +#define TT_MS_LANGID_SPANISH_PANAMA 0x180a +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a +#define TT_MS_LANGID_SPANISH_PERU 0x280a +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a +#define TT_MS_LANGID_SPANISH_CHILE 0x340a +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a + /* The following ID blatantly violate MS specs by using a */ + /* sublanguage > 0x1F. */ +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU +#define TT_MS_LANGID_FINNISH_FINLAND 0x040b +#define TT_MS_LANGID_FRENCH_FRANCE 0x040c +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c +#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c +#define TT_MS_LANGID_FRENCH_MONACO 0x180c +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c +#define TT_MS_LANGID_FRENCH_REUNION 0x200c +#define TT_MS_LANGID_FRENCH_CONGO 0x240c + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c +#define TT_MS_LANGID_FRENCH_MALI 0x340c +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c +#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c + /* and another violation of the spec (see 0xE40aU) */ +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a + +#if 0 /* this used to be this value, but it looks like we were wrong */ +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a +#else /* current sources say */ +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a + /* and XPsp2 Platform SDK added (2004-07-26) */ + /* Names are shortened to be significant within 40 chars. */ +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a +#endif + +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d +#define TT_MS_LANGID_THAI_THAILAND 0x041e +#define TT_MS_LANGID_TURKISH_TURKEY 0x041f +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c +#define TT_MS_LANGID_BASQUE_SPAIN 0x042d +#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043a + /* Added by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b + /* ... and we also keep our old identifier... */ +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b + +#if 0 /* this seems to be a previous inversion */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#else +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#endif + +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e +#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN + +#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ORIYA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044a +#define TT_MS_LANGID_KANNADA_INDIA 0x044b +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d +#define TT_MS_LANGID_MARATHI_INDIA 0x044e +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 +#define TT_MS_LANGID_TIBETAN_CHINA 0x0451 + /* Don't use the next constant! It has */ + /* (1) the wrong spelling (Dzonghka) */ + /* (2) Microsoft doesn't officially define it -- */ + /* at least it is not in the List of Local */ + /* ID Values. */ + /* (3) Dzongkha is not the same language as */ + /* Tibetan, so merging it is wrong anyway. */ + /* */ + /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */ +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 + +#if 0 + /* the following used to be defined */ +#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 + /* ... but it was changed; */ +#else + /* So we will continue to #define it, but with the correct value */ +#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN +#endif + +#define TT_MS_LANGID_WELSH_WALES 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 + /* Missing a LCID for Sindhi in Devanagari script */ +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a +#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f + /* Missing a LCID for Tifinagh script */ +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 + /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */ + /* script is yet unclear... might be Arabic, Nagari or Sharada */ +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 + /* ... and aliased (by MS) for compatibility reasons. */ +#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b +#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c + /* Also spelled by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SEPEDI_SOUTH_AFRICA + /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */ +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 + /* also spelled in the `Passport SDK' list as: */ +#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 + /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ + /* not written (but OTOH the peculiar writing system is worth */ + /* studying). */ +#define TT_MS_LANGID_YI_CHINA 0x0478 +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 + /* language codes from 0x047a to 0x047f are (still) unknown. */ +#define TT_MS_LANGID_UIGHUR_CHINA 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 + +#if 0 /* not deemed useful for fonts */ +#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff +#endif + + + /*************************************************************************/ + /* */ + /* Possible values of the `name' identifier field in the name records of */ + /* the TTF `name' table. These values are platform independent. */ + /* */ +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_PREFERRED_FAMILY 16 +#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + /* This is new in OpenType 1.5 */ +#define TT_NAME_ID_WWS_FAMILY 21 +#define TT_NAME_ID_WWS_SUBFAMILY 22 + + + /*************************************************************************/ + /* */ + /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ + /* */ + /* Updated 08-Nov-2008. */ + /* */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ + /* Phonetic Extensions */ + /* Phonetic Extensions Supplement */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* U+1D00-U+1D7F */ + /* U+1D80-U+1DBF */ + /* Bit 5 Spacing Modifier Letters */ + /* Modifier Tone Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* U+A700-U+A71F */ + /* Bit 6 Combining Diacritical Marks */ + /* Combining Diacritical Marks Supplement */ +#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ + /* U+1DC0-U+1DFF */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 Coptic */ +#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */ + /* Bit 9 Cyrillic */ + /* Cyrillic Supplement */ + /* Cyrillic Extended-A */ + /* Cyrillic Extended-B */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* U+2DE0-U+2DFF */ + /* U+A640-U+A69F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 Vai */ +#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */ + /* Bit 13 Arabic */ + /* Arabic Supplement */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* U+0750-U+077F */ + /* Bit 14 NKo */ +#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ + /* Georgian Supplement */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* U+2D00-U+2D2F */ + /* Bit 27 Balinese */ +#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ + /* Latin Extended-C */ + /* Latin Extended-D */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* U+2C60-U+2C7F */ + /* U+A720-U+A7FF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + /* Bit 31 General Punctuation */ + /* Supplemental Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* U+2E00-U+2E7F */ + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows */ + /* Supplemental Arrows-A */ + /* Supplemental Arrows-B */ + /* Miscellaneous Symbols and Arrows */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* U+2B00-U+2BFF */ + /* Bit 38 Mathematical Operators */ + /* Supplemental Mathematical Operators */ + /* Miscellaneous Mathematical Symbols-A */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Phags-Pa */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */ +#define TT_UCR_PHAGSPA + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + /* Bit 56 Hangul Syllables */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + /* Bit 57 High Surrogates */ + /* High Private Use Surrogates */ + /* Low Surrogates */ + /* */ + /* According to OpenType specs v.1.3+, */ + /* setting bit 57 implies that there is */ + /* at least one codepoint beyond the */ + /* Basic Multilingual Plane that is */ + /* supported by this font. So it really */ + /* means >= U+10000 */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ +#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES + /* Bit 58 Phoenician */ +#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/ + /* Bit 59 CJK Unified Ideographs */ + /* CJK Radicals Supplement */ + /* Kangxi Radicals */ + /* Ideographic Description Characters */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension B */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + /* Bit 61 CJK Strokes */ + /* CJK Compatibility Ideographs */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */ + /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 Vertical forms */ + /* CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */ + /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ + /* Ethiopic Supplement */ + /* Ethiopic Extended */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* U+1380-U+139F */ + /* U+2D80-U+2DDF */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ + /* Khmer Symbols */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* U+19E0-U+19FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog */ + /* Hanunoo */ + /* Buhid */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols */ + /* Musical Symbols */ + /* Ancient Greek Musical Notation */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /*U+1D200-U+1D24F*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ + /* Variation Selectors Supplement */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /*U+E0100-U+E01EF*/ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + /* Bit 93 Limbu */ +#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */ + /* Bit 94 Tai Le */ +#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */ + /* Bit 95 New Tai Lue */ +#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */ + /* Bit 96 Buginese */ +#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */ + /* Bit 97 Glagolitic */ +#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */ + /* Bit 98 Tifinagh */ +#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */ + /* Bit 99 Yijing Hexagram Symbols */ +#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */ + /* Bit 100 Syloti Nagri */ +#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */ + /* Bit 101 Linear B Syllabary */ + /* Linear B Ideograms */ + /* Aegean Numbers */ +#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/ + /*U+10080-U+100FF*/ + /*U+10100-U+1013F*/ + /* Bit 102 Ancient Greek Numbers */ +#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/ + /* Bit 103 Ugaritic */ +#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/ + /* Bit 104 Old Persian */ +#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/ + /* Bit 105 Shavian */ +#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/ + /* Bit 106 Osmanya */ +#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/ + /* Bit 107 Cypriot Syllabary */ +#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/ + /* Bit 108 Kharoshthi */ +#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/ + /* Bit 109 Tai Xuan Jing Symbols */ +#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/ + /* Bit 110 Cuneiform */ + /* Cuneiform Numbers and Punctuation */ +#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/ + /*U+12400-U+1247F*/ + /* Bit 111 Counting Rod Numerals */ +#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/ + /* Bit 112 Sundanese */ +#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */ + /* Bit 113 Lepcha */ +#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */ + /* Bit 114 Ol Chiki */ +#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */ + /* Bit 115 Saurashtra */ +#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */ + /* Bit 116 Kayah Li */ +#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */ + /* Bit 117 Rejang */ +#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */ + /* Bit 118 Cham */ +#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */ + /* Bit 119 Ancient Symbols */ +#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/ + /* Bit 120 Phaistos Disc */ +#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/ + /* Bit 121 Carian */ + /* Lycian */ + /* Lydian */ +#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/ + /*U+10280-U+1029F*/ + /*U+10920-U+1093F*/ + /* Bit 122 Domino Tiles */ + /* Mahjong Tiles */ +#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/ + /*U+1F000-U+1F02F*/ + /* Bit 123-127 Reserved for process-internal usage */ + + + /*************************************************************************/ + /* */ + /* Some compilers have a very limited length of identifiers. */ + /* */ +#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) +#define HAVE_LIMIT_ON_IDENTS +#endif + + +#ifndef HAVE_LIMIT_ON_IDENTS + + + /*************************************************************************/ + /* */ + /* Here some alias #defines in order to be clearer. */ + /* */ + /* These are not always #defined to stay within the 31~character limit */ + /* which some compilers have. */ + /* */ + /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ + /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ + /* If you get a warning with such a compiler, use the -i40 switch. */ + /* */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ + TT_UCR_ARABIC_PRESENTATIONS_A +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ + TT_UCR_ARABIC_PRESENTATIONS_B + +#define TT_UCR_COMBINING_DIACRITICAL_MARKS \ + TT_UCR_COMBINING_DIACRITICS +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + TT_UCR_COMBINING_DIACRITICS_SYMB + + +#endif /* !HAVE_LIMIT_ON_IDENTS */ + + +FT_END_HEADER + +#endif /* __TTNAMEID_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/tttables.h b/alienblaster/project/jni/freetype/include/freetype/tttables.h new file mode 100644 index 000000000..c12b17268 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/tttables.h @@ -0,0 +1,756 @@ +/***************************************************************************/ +/* */ +/* tttables.h */ +/* */ +/* Basic SFNT/TrueType tables definitions and interface */ +/* (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTABLES_H__ +#define __TTTABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + /* <Title> */ + /* TrueType Tables */ + /* */ + /* <Abstract> */ + /* TrueType specific table types and functions. */ + /* */ + /* <Description> */ + /* This section contains the definition of TrueType-specific tables */ + /* as well as some routines used to access and process them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Header */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType font header table. All */ + /* fields follow the TrueType specification. */ + /* */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_Long Created [2]; + FT_Long Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HoriHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType horizontal header, the `hhea' */ + /* table, as well as the corresponding horizontal metrics table, */ + /* i.e., the `hmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of all */ + /* glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoAscender' field */ + /* of the OS/2 table instead if you want */ + /* the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the distance */ + /* from the baseline to the bottom-most of */ + /* all glyph points found in the font. It */ + /* is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Width_Max :: This field is the maximum of all advance */ + /* widths found in the font. It can be */ + /* used to compute the maximum width of an */ + /* arbitrary string of text. */ + /* */ + /* min_Left_Side_Bearing :: The minimum left side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Right_Side_Bearing :: The minimum right side bearing of all */ + /* glyphs within the font. */ + /* */ + /* xMax_Extent :: The maximum horizontal extent (i.e., the */ + /* `width' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* Reserved :: 8~reserved bytes. */ + /* */ + /* metric_Data_Format :: Always~0. */ + /* */ + /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */ + /* table -- this value can be smaller than */ + /* the total number of glyphs in the font. */ + /* */ + /* long_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* `HMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_VertHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType vertical header, the `vhea' */ + /* table, as well as the corresponding vertical metrics table, i.e., */ + /* the `vmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of */ + /* all glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoAscender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the */ + /* distance from the baseline to the */ + /* bottom-most of all glyph points found */ + /* in the font. It is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Height_Max :: This field is the maximum of all */ + /* advance heights found in the font. It */ + /* can be used to compute the maximum */ + /* height of an arbitrary string of text. */ + /* */ + /* min_Top_Side_Bearing :: The minimum top side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */ + /* glyphs within the font. */ + /* */ + /* yMax_Extent :: The maximum vertical extent (i.e., the */ + /* `height' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* caret_Offset :: The cursor's offset for slanted fonts. */ + /* This value is `reserved' in vmtx */ + /* version 1.0. */ + /* */ + /* Reserved :: 8~reserved bytes. */ + /* */ + /* metric_Data_Format :: Always~0. */ + /* */ + /* number_Of_HMetrics :: Number of VMetrics entries in the */ + /* `vmtx' table -- this value can be */ + /* smaller than the total number of glyphs */ + /* in the font. */ + /* */ + /* long_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ + FT_Short yMax_Extent; /* xmax or ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they're used to connect the metrics header to the relevant */ + /* `HMTX' or `VMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_OS2 */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType OS/2 table. This is the long */ + /* table version. All fields comply to the TrueType specification. */ + /* */ + /* Note that we now support old Mac fonts which do not include an */ + /* OS/2 table. In this case, the `version' field is always set to */ + /* 0xFFFF. */ + /* */ + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_Short fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 tables: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 tables: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + } TT_OS2; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Postscript */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PostScript table. All fields */ + /* comply to the TrueType specification. This structure does not */ + /* reference the PostScript glyph names, which can be nevertheless */ + /* accessed with the `ttpost' module. */ + /* */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the file, but we don't */ + /* load them by default. See the ttpost.c file. */ + + } TT_Postscript; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_PCLT */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PCLT table. All fields */ + /* comply to the TrueType specification. */ + /* */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_MaxProfile */ + /* */ + /* <Description> */ + /* The maximum profile is a table containing many max values which */ + /* can be used to pre-allocate arrays. This ensures that no memory */ + /* allocation occurs during a glyph load. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numGlyphs :: The number of glyphs in this TrueType */ + /* font. */ + /* */ + /* maxPoints :: The maximum number of points in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositePoints'. */ + /* */ + /* maxContours :: The maximum number of contours in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositeContours'. */ + /* */ + /* maxCompositePoints :: The maximum number of points in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxPoints'. */ + /* */ + /* maxCompositeContours :: The maximum number of contours in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxContours'. */ + /* */ + /* maxZones :: The maximum number of zones used for */ + /* glyph hinting. */ + /* */ + /* maxTwilightPoints :: The maximum number of points in the */ + /* twilight zone used for glyph hinting. */ + /* */ + /* maxStorage :: The maximum number of elements in the */ + /* storage area used for glyph hinting. */ + /* */ + /* maxFunctionDefs :: The maximum number of function */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxInstructionDefs :: The maximum number of instruction */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxStackElements :: The maximum number of stack elements used */ + /* during bytecode interpretation. */ + /* */ + /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */ + /* used for glyph hinting. */ + /* */ + /* maxComponentElements :: The maximum number of simple (i.e., non- */ + /* composite) glyphs in a composite glyph. */ + /* */ + /* maxComponentDepth :: The maximum nesting depth of composite */ + /* glyphs. */ + /* */ + /* <Note> */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Sfnt_Tag */ + /* */ + /* <Description> */ + /* An enumeration used to specify the index of an SFNT table. */ + /* Used in the @FT_Get_Sfnt_Table API function. */ + /* */ + typedef enum FT_Sfnt_Tag_ + { + ft_sfnt_head = 0, + ft_sfnt_maxp = 1, + ft_sfnt_os2 = 2, + ft_sfnt_hhea = 3, + ft_sfnt_vhea = 4, + ft_sfnt_post = 5, + ft_sfnt_pclt = 6, + + sfnt_max /* internal end mark */ + + } FT_Sfnt_Tag; + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Table */ + /* */ + /* <Description> */ + /* Return a pointer to a given SFNT table within a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source. */ + /* */ + /* tag :: The index of the SFNT table. */ + /* */ + /* <Return> */ + /* A type-less pointer to the table. This will be~0 in case of */ + /* error, or if the corresponding table was not found *OR* loaded */ + /* from the file. */ + /* */ + /* <Note> */ + /* The table is owned by the face object and disappears with it. */ + /* */ + /* This function is only useful to access SFNT tables that are loaded */ + /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */ + /* a list. */ + /* */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Load any font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use the value~0 if you want + * to access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag == 0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length' parameter is NULL, then try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length' is~0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length' set to~0, as in the following example: + * + * { + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * } + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Return information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @output: + * tag :: + * The name tag of the SFNT table. + * + * length :: + * The length of the SFNT table. + * + * @return: + * FreeType error code. 0~means success. + * + * @note: + * SFNT tables with length zero are treated as missing. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Language_ID */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap language ID. Definitions of */ + /* language ID values are in `freetype/ttnameid.h'. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The language ID of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, just return~0 as the default value. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Format */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap format. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The format of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, return -1. */ + /* */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* __TTTABLES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/tttags.h b/alienblaster/project/jni/freetype/include/freetype/tttags.h new file mode 100644 index 000000000..307ce4b63 --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/tttags.h @@ -0,0 +1,107 @@ +/***************************************************************************/ +/* */ +/* tttags.h */ +/* */ +/* Tags for TrueType and OpenType tables (specification only). */ +/* */ +/* Copyright 1996-2001, 2004, 2005, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTAGS_H__ +#define __TTAGS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' ) +#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' ) +#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) + + +FT_END_HEADER + +#endif /* __TTAGS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/freetype/ttunpat.h b/alienblaster/project/jni/freetype/include/freetype/ttunpat.h new file mode 100644 index 000000000..a0162759b --- /dev/null +++ b/alienblaster/project/jni/freetype/include/freetype/ttunpat.h @@ -0,0 +1,59 @@ +/***************************************************************************/ +/* */ +/* ttunpat.h */ +/* */ +/* Definitions for the unpatented TrueType hinting system */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* Written by Graham Asher <graham.asher@btinternet.com> */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTUNPAT_H__ +#define __TTUNPAT_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * A constant used as the tag of an @FT_Parameter structure to indicate + * that unpatented methods only should be used by the TrueType bytecode + * interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + /* */ + +FT_END_HEADER + + +#endif /* __TTUNPAT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/include/ft2build.h b/alienblaster/project/jni/freetype/include/ft2build.h new file mode 100644 index 000000000..923d887df --- /dev/null +++ b/alienblaster/project/jni/freetype/include/ft2build.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* FreeType 2 build and setup macros. */ +/* (Generic version) */ +/* */ +/* Copyright 1996-2001, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file corresponds to the default `ft2build.h' file for */ + /* FreeType 2. It uses the `freetype' include root. */ + /* */ + /* Note that specific platforms might use a different configuration. */ + /* See builds/unix/ft2unix.h for an example. */ + /* */ + /*************************************************************************/ + + +#ifndef __FT2_BUILD_GENERIC_H__ +#define __FT2_BUILD_GENERIC_H__ + +#include <freetype/config/ftheader.h> + +#endif /* __FT2_BUILD_GENERIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/modules.cfg b/alienblaster/project/jni/freetype/modules.cfg new file mode 100644 index 000000000..4047d7f09 --- /dev/null +++ b/alienblaster/project/jni/freetype/modules.cfg @@ -0,0 +1,250 @@ +# modules.cfg +# +# Copyright 2005, 2006, 2007, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +# +# +# In case you compile the FreeType library with GNU make or makepp, this +# file controls which components are built into the library. Otherwise, +# please read this file for information on the various modules and its +# dependencies, then follow the instructions in the file `docs/INSTALL.ANY'. +# +# To deactivate a module, simply comment out the corresponding line. To +# activate a module, remove the comment character. +# +# Note that many modules and components are further controlled with macros +# in the file `include/freetype/config/ftoption.h'. + + +#### +#### font modules -- at least one is required +#### +#### The order given here (from top to down) is the order used for testing +#### font formats in the compiled library. +#### + +# TrueType font driver. +# +# This driver needs the `sfnt' module. +FONT_MODULES += truetype + +# PostScript Type 1 font driver. +# +# This driver needs the `psaux', `pshinter', and `psnames' modules. +FONT_MODULES += type1 + +# CFF/OpenType font driver. +# +# This driver needs the `sfnt', `pshinter', and `psnames' modules. +FONT_MODULES += cff + +# Type 1 CID-keyed font driver. +# +# This driver needs the `psaux', `pshinter', and `psnames' modules. +FONT_MODULES += cid + +# PFR/TrueDoc font driver. See optional extension ftpfr.c below also. +FONT_MODULES += pfr + +# PostScript Type 42 font driver. +# +# This driver needs the `truetype' module. +FONT_MODULES += type42 + +# Windows FONT/FNT font driver. See optional extension ftwinfnt.c below +# also. +FONT_MODULES += winfonts + +# PCF font driver. +FONT_MODULES += pcf + +# BDF font driver. See optional extension ftbdf.c below also. +FONT_MODULES += bdf + +# SFNT files support. If used without `truetype' or `cff', it supports +# bitmap-only fonts within an SFNT wrapper. +# +# This driver needs the `psnames' module. +FONT_MODULES += sfnt + + +#### +#### hinting modules +#### + +# FreeType's auto hinter. +HINTING_MODULES += autofit + +# PostScript hinter. +HINTING_MODULES += pshinter + +# The TrueType hinting engine doesn't have a module of its own but is +# controlled in file include/freetype/config/ftoption.h +# (TT_CONFIG_OPTION_BYTECODE_INTERPRETER and friends). + + +#### +#### raster modules -- at least one is required for vector font formats +#### + +# Monochrome rasterizer. +RASTER_MODULES += raster + +# Anti-aliasing rasterizer. +RASTER_MODULES += smooth + + +#### +#### auxiliary modules +#### + +# FreeType's cache sub-system (quite stable but still in beta -- this means +# that its public API is subject to change if necessary). See +# include/freetype/ftcache.h. Needs ftglyph.c. +AUX_MODULES += cache + +# TrueType GX/AAT table validation. Needs ftgxval.c below. +# AUX_MODULES += gxvalid + +# Support for streams compressed with gzip (files with suffix .gz). +# +# See include/freetype/ftgzip.h for the API. +AUX_MODULES += gzip + +# Support for streams compressed with LZW (files with suffix .Z). +# +# See include/freetype/ftlzw.h for the API. +AUX_MODULES += lzw + +# OpenType table validation. Needs ftotval.c below. +# +# AUX_MODULES += otvalid + +# Auxiliary PostScript driver component to share common code. +# +# This module depends on `psnames'. +AUX_MODULES += psaux + +# Support for PostScript glyph names. +# +# This module can be controlled in ftconfig.h +# (FT_CONFIG_OPTION_POSTSCRIPT_NAMES). +AUX_MODULES += psnames + + +#### +#### base module extensions +#### + +# Exact bounding box calculation. +# +# See include/freetype/ftbbox.h for the API. +BASE_EXTENSIONS += ftbbox.c + +# Access BDF-specific strings. Needs BDF font driver. +# +# See include/freetype/ftbdf.h for the API. +BASE_EXTENSIONS += ftbdf.c + +# Utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp bitmaps into +# 8bpp format, and for emboldening of bitmap glyphs. +# +# See include/freetype/ftbitmap.h for the API. +BASE_EXTENSIONS += ftbitmap.c + +# Access CID font information. +# +# See include/freetype/ftcid.h for the API. +BASE_EXTENSIONS += ftcid.c + +# Access FSType information. Needs fttype1.c. +# +# See include/freetype/freetype.h for the API. +BASE_EXTENSIONS += ftfstype.c + +# Support for GASP table queries. +# +# See include/freetype/ftgasp.h for the API. +BASE_EXTENSIONS += ftgasp.c + +# Convenience functions to handle glyphs. Needs ftbitmap.c. +# +# See include/freetype/ftglyph.h for the API. +BASE_EXTENSIONS += ftglyph.c + +# Interface for gxvalid module. +# +# See include/freetype/ftgxval.h for the API. +BASE_EXTENSIONS += ftgxval.c + +# Support for LCD color filtering of subpixel bitmaps. +# +# See include/freetype/ftlcdfil.h for the API. +BASE_EXTENSIONS += ftlcdfil.c + +# Multiple Master font interface. +# +# See include/freetype/ftmm.h for the API. +BASE_EXTENSIONS += ftmm.c + +# Interface for otvalid module. +# +# See include/freetype/ftotval.h for the API. +BASE_EXTENSIONS += ftotval.c + +# Support for FT_Face_CheckTrueTypePatents. +# +# See include/freetype/freetype.h for the API. +BASE_EXTENSIONS += ftpatent.c + +# Interface for accessing PFR-specific data. Needs PFR font driver. +# +# See include/freetype/ftpfr.h for the API. +BASE_EXTENSIONS += ftpfr.c + +# Path stroker. Needs ftglyph.c. +# +# See include/freetype/ftstroke.h for the API. +BASE_EXTENSIONS += ftstroke.c + +# Support for synthetic embolding and slanting of fonts. Needs ftbitmap.c. +# +# See include/freetype/ftsynth.h for the API. +BASE_EXTENSIONS += ftsynth.c + +# Interface to access data specific to PostScript Type 1 and Type 2 (CFF) +# fonts. +# +# See include/freetype/t1tables.h for the API. +BASE_EXTENSIONS += fttype1.c + +# Interface for accessing data specific to Windows FNT files. Needs winfnt +# driver. +# +# See include/freetype/ftwinfnt.h for the API. +BASE_EXTENSIONS += ftwinfnt.c + +# Support functions for X11. +# +# See include/freetype/ftxf86.h for the API. +BASE_EXTENSIONS += ftxf86.c + +#### +#### The components `ftsystem.c' (for memory allocation and stream I/O +#### management) and `ftdebug.c' (for emitting debug messages to the user) +#### are controlled with the following variables. +#### +#### ftsystem.c: $(FTSYS_SRC) +#### ftdebug.c: $(FTDEBUG_SRC) +#### +#### Please refer to docs/CUSTOMIZE for details. +#### + + +# EOF diff --git a/alienblaster/project/jni/freetype/objs/.gitignore b/alienblaster/project/jni/freetype/objs/.gitignore new file mode 100644 index 000000000..ad264ce15 --- /dev/null +++ b/alienblaster/project/jni/freetype/objs/.gitignore @@ -0,0 +1,9 @@ +apinames +freetype.def +freetype.lib +ftexport.sym +ftmodule.h +ftoption.h +libfreetype.la +.libs +*.lo diff --git a/alienblaster/project/jni/freetype/objs/README b/alienblaster/project/jni/freetype/objs/README new file mode 100644 index 000000000..befb63e04 --- /dev/null +++ b/alienblaster/project/jni/freetype/objs/README @@ -0,0 +1,2 @@ +This directory contains all the object files created when building the +library. diff --git a/alienblaster/project/jni/freetype/src/Jamfile b/alienblaster/project/jni/freetype/src/Jamfile new file mode 100644 index 000000000..76ee0f46e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/Jamfile @@ -0,0 +1,25 @@ +# FreeType 2 src Jamfile +# +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) ; + +# The file <freetype/internal/internal.h> is used to define macros that are +# later used in #include statements. It needs to be parsed in order to +# record these definitions. +# +HDRMACRO [ FT2_SubDir $(FT2_INCLUDE_DIR) internal internal.h ] ; + +for xx in $(FT2_COMPONENTS) +{ + SubInclude FT2_TOP $(FT2_SRC_DIR) $(xx) ; +} + +# end of src Jamfile diff --git a/alienblaster/project/jni/freetype/src/autofit/Jamfile b/alienblaster/project/jni/freetype/src/autofit/Jamfile new file mode 100644 index 000000000..2714765b5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/Jamfile @@ -0,0 +1,39 @@ +# FreeType 2 src/autofit Jamfile +# +# Copyright 2003, 2004, 2005, 2006, 2007, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP src autofit ; + +{ + local _sources ; + + # define FT2_AUTOFIT2 to enable experimental latin hinter replacement + if $(FT2_AUTOFIT2) + { + DEFINES += FT_OPTION_AUTOFIT2 ; + } + if $(FT2_MULTI) + { + _sources = afangles afglobal afhints aflatin afcjk afindic afloader afmodule afdummy afwarp afpic ; + + if $(FT2_AUTOFIT2) + { + _sources += aflatin2 ; + } + } + else + { + _sources = autofit ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/autofit Jamfile diff --git a/alienblaster/project/jni/freetype/src/autofit/afangles.c b/alienblaster/project/jni/freetype/src/autofit/afangles.c new file mode 100644 index 000000000..e2360d157 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afangles.c @@ -0,0 +1,292 @@ +/***************************************************************************/ +/* */ +/* afangles.c */ +/* */ +/* Routines used to compute vector angles with limited accuracy */ +/* and very high speed. It also contains sorting routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" + + +#if 0 + + FT_LOCAL_DEF( FT_Int ) + af_corner_is_flat( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos ax = x_in; + FT_Pos ay = y_in; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = x_out; + if ( ax < 0 ) + ax = -ax; + ay = y_out; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = x_out + x_in; + if ( ax < 0 ) + ax = -ax; + ay = y_out + y_in; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + + FT_LOCAL_DEF( FT_Int ) + af_corner_orientation( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos delta; + + + delta = x_in * y_out - y_in * x_out; + + if ( delta == 0 ) + return 0; + else + return 1 - 2 * ( delta < 0 ); + } + +#endif + + + /* + * We are not using `af_angle_atan' anymore, but we keep the source + * code below just in case... + */ + + +#if 0 + + + /* + * The trick here is to realize that we don't need a very accurate angle + * approximation. We are going to use the result of `af_angle_atan' to + * only compare the sign of angle differences, or check whether its + * magnitude is very small. + * + * The approximation + * + * dy * PI / (|dx|+|dy|) + * + * should be enough, and much faster to compute. + */ + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + FT_Fixed ax = dx; + FT_Fixed ay = dy; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + + ax += ay; + + if ( ax == 0 ) + angle = 0; + else + { + angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay ); + if ( dx < 0 ) + { + if ( angle >= 0 ) + angle = AF_ANGLE_PI - angle; + else + angle = -AF_ANGLE_PI - angle; + } + } + + return angle; + } + + +#elif 0 + + + /* the following table has been automatically generated with */ + /* the `mather.py' Python script */ + +#define AF_ATAN_BITS 8 + + static const FT_Byte af_arctan[1L << AF_ATAN_BITS] = + { + 0, 0, 1, 1, 1, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 5, + 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, + 10, 10, 11, 11, 11, 12, 12, 12, + 13, 13, 13, 14, 14, 14, 14, 15, + 15, 15, 16, 16, 16, 17, 17, 17, + 18, 18, 18, 18, 19, 19, 19, 20, + 20, 20, 21, 21, 21, 21, 22, 22, + 22, 23, 23, 23, 24, 24, 24, 24, + 25, 25, 25, 26, 26, 26, 26, 27, + 27, 27, 28, 28, 28, 28, 29, 29, + 29, 30, 30, 30, 30, 31, 31, 31, + 31, 32, 32, 32, 33, 33, 33, 33, + 34, 34, 34, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 37, 37, 37, 38, + 38, 38, 38, 39, 39, 39, 39, 40, + 40, 40, 40, 41, 41, 41, 41, 42, + 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, + 46, 46, 46, 46, 46, 47, 47, 47, + 47, 48, 48, 48, 48, 48, 49, 49, + 49, 49, 50, 50, 50, 50, 50, 51, + 51, 51, 51, 51, 52, 52, 52, 52, + 52, 53, 53, 53, 53, 53, 54, 54, + 54, 54, 54, 55, 55, 55, 55, 55, + 56, 56, 56, 56, 56, 57, 57, 57, + 57, 57, 57, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 60, 60, + 60, 60, 60, 61, 61, 61, 61, 61, + 61, 62, 62, 62, 62, 62, 62, 63, + 63, 63, 63, 63, 63, 64, 64, 64 + }; + + + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + + + /* check trivial cases */ + if ( dy == 0 ) + { + angle = 0; + if ( dx < 0 ) + angle = AF_ANGLE_PI; + return angle; + } + else if ( dx == 0 ) + { + angle = AF_ANGLE_PI2; + if ( dy < 0 ) + angle = -AF_ANGLE_PI2; + return angle; + } + + angle = 0; + if ( dx < 0 ) + { + dx = -dx; + dy = -dy; + angle = AF_ANGLE_PI; + } + + if ( dy < 0 ) + { + FT_Pos tmp; + + + tmp = dx; + dx = -dy; + dy = tmp; + angle -= AF_ANGLE_PI2; + } + + if ( dx == 0 && dy == 0 ) + return 0; + + if ( dx == dy ) + angle += AF_ANGLE_PI4; + else if ( dx > dy ) + angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )]; + else + angle += AF_ANGLE_PI2 - + af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )]; + + if ( angle > AF_ANGLE_PI ) + angle -= AF_ANGLE_2PI; + + return angle; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ) + { + FT_UInt i, j; + FT_Pos swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j] > table[j - 1] ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + FT_LOCAL_DEF( void ) + af_sort_widths( FT_UInt count, + AF_Width table ) + { + FT_UInt i, j; + AF_WidthRec swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j].org > table[j - 1].org ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afangles.h b/alienblaster/project/jni/freetype/src/autofit/afangles.h new file mode 100644 index 000000000..f33f9e108 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afangles.h @@ -0,0 +1,7 @@ +/* + * afangles.h + * + * This is a dummy file, used to please the build system. It is never + * included by the auto-fitter sources. + * + */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afcjk.c b/alienblaster/project/jni/freetype/src/autofit/afcjk.c new file mode 100644 index 000000000..bab0c42ba --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afcjk.c @@ -0,0 +1,1512 @@ +/***************************************************************************/ +/* */ +/* afcjk.c */ +/* */ +/* Auto-fitter hinting routines for CJK script (body). */ +/* */ +/* Copyright 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /* + * The algorithm is based on akito's autohint patch, available here: + * + * http://www.kde.gr.jp/~akito/patch/freetype2/ + * + */ + +#include "aftypes.h" +#include "aflatin.h" + + +#ifdef AF_CONFIG_OPTION_CJK + +#include "afcjk.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + /* TODO are there blues? */ + + if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + face->charmap = NULL; + else + { + /* latin's version would suffice */ + af_latin_metrics_init_widths( metrics, face, 0x7530 ); + af_latin_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + + return AF_Err_Ok; + } + + + static void + af_cjk_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + AF_LatinAxis axis; + + + axis = &metrics->axis[dim]; + + if ( dim == AF_DIMENSION_HORZ ) + { + axis->scale = scaler->x_scale; + axis->delta = scaler->x_delta; + } + else + { + axis->scale = scaler->y_scale; + axis->delta = scaler->y_delta; + } + } + + + FT_LOCAL_DEF( void ) + af_cjk_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler = *scaler; + + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + af_cjk_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + FT_Error error; + AF_Segment seg; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( error ) + return error; + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Point pt = seg->first; + AF_Point last = seg->last; + AF_Flags f0 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + AF_Flags f1; + + + seg->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL); + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + seg->flags |= AF_EDGE_ROUND; + } + } + + return AF_Err_Ok; + } + + + static void + af_cjk_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Direction major_dir = axis->major_dir; + AF_Segment seg1, seg2; + FT_Pos len_threshold; + FT_Pos dist_threshold; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + + dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + dist_threshold = FT_DivFix( 64 * 3, dist_threshold ); + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are for metrics hinting only */ + if ( seg1->first == seg1->last ) + continue; + + if ( seg1->dir != major_dir ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) + { + FT_Pos dist = seg2->pos - seg1->pos; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + if ( dist * 8 < seg1->score * 9 && + ( dist * 8 < seg1->score * 7 || seg1->len < len ) ) + { + seg1->score = dist; + seg1->len = len; + seg1->link = seg2; + } + + if ( dist * 8 < seg2->score * 9 && + ( dist * 8 < seg2->score * 7 || seg2->len < len ) ) + { + seg2->score = dist; + seg2->len = len; + seg2->link = seg1; + } + } + } + } + } + + /* + * now compute the `serif' segments + * + * In Hanzi, some strokes are wider on one or both of the ends. + * We either identify the stems on the ends as serifs or remove + * the linkage, depending on the length of the stems. + * + */ + + { + AF_Segment link1, link2; + + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + link1 = seg1->link; + if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos ) + continue; + + if ( seg1->score >= dist_threshold ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + { + if ( seg2->pos > seg1->pos || seg1 == seg2 ) + continue; + + link2 = seg2->link; + if ( !link2 || link2->link != seg2 || link2->pos < link1->pos ) + continue; + + if ( seg1->pos == seg2->pos && link1->pos == link2->pos ) + continue; + + if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score ) + continue; + + /* seg2 < seg1 < link1 < link2 */ + + if ( seg1->len >= seg2->len * 3 ) + { + AF_Segment seg; + + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Segment link = seg->link; + + + if ( link == seg2 ) + { + seg->link = 0; + seg->serif = link1; + } + else if ( link == link2 ) + { + seg->link = 0; + seg->serif = seg1; + } + } + } + else + { + seg1->link = link1->link = 0; + + break; + } + } + } + } + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + seg2->num_linked++; + if ( seg2->link != seg1 ) + { + seg1->link = 0; + + if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 ) + seg1->serif = seg2->link; + else + seg2->num_linked--; + } + } + } + } + + + static FT_Error + af_cjk_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + FT_Fixed scale; + FT_Pos edge_distance_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + /*********************************************************************/ + /* */ + /* We begin by generating a sorted table of edges for the current */ + /* direction. To do so, we simply scan each segment and try to find */ + /* an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which is then processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = FT_DivFix( 64 / 4, scale ); + else + edge_distance_threshold = laxis->edge_distance_threshold; + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Pos best = 0xFFFFU; + FT_Int ee; + + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + if ( edge->dir != seg->dir ) + continue; + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && dist < best ) + { + AF_Segment link = seg->link; + + + /* check whether all linked segments of the candidate edge */ + /* can make a single edge. */ + if ( link ) + { + AF_Segment seg1 = edge->first; + AF_Segment link1; + FT_Pos dist2 = 0; + + + do + { + link1 = seg1->link; + if ( link1 ) + { + dist2 = AF_SEGMENT_DIST( link, link1 ); + if ( dist2 >= edge_distance_threshold ) + break; + } + + } while ( ( seg1 = seg1->edge_next ) != edge->first ); + + if ( dist2 >= edge_distance_threshold ) + continue; + } + + best = dist; + found = edge; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + edge->dir = seg->dir; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + /*********************************************************************/ + /* */ + /* Good, we now compute each edge's properties according to segments */ + /* found on its position. Basically, these are as follows. */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + /* */ + /* Note that removing this loop and setting the `edge' field of each */ + /* segment directly in the code above slows down execution speed for */ + /* some reasons on platforms like the Sun. */ + + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge ); + + if ( seg->link || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = AF_SEGMENT_DIST( seg, seg2 ); + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + + /* get rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + Exit: + return error; + } + + + static FT_Error + af_cjk_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_cjk_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_cjk_hints_link_segments( hints, dim ); + + error = af_cjk_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale when needed, since they may have + * been modified af_cjk_scale_dim above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#ifdef AF_USE_WARPER + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_cjk_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_cjk_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + FT_UNUSED( base_flags ); + FT_UNUSED( stem_flags ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + if ( axis->width_count > 0 ) + { + if ( FT_ABS( dist - axis->widths[0].cur ) < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 54 ) + dist += ( 54 - dist ) / 2 ; + else if ( dist < 3 * 64 ) + { + FT_Pos delta; + + + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + else if ( delta < 22 ) + dist += 10; + else if ( delta < 42 ) + dist += delta; + else if ( delta < 54 ) + dist += 54; + else + dist += delta; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + + dist = af_cjk_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + dist = ( dist + 22 ) & ~63; + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_cjk_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_cjk_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + } + + + static void + af_cjk_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + ( serif->opos - base->opos ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define AF_LIGHT_MODE_MAX_HORZ_GAP 9 +#define AF_LIGHT_MODE_MAX_VERT_GAP 15 +#define AF_LIGHT_MODE_MAX_DELTA_ABS 14 + + + static FT_Pos + af_hint_normal_stem( AF_GlyphHints hints, + AF_Edge edge, + AF_Edge edge2, + FT_Pos anchor, + AF_Dimension dim ) + { + FT_Pos org_len, cur_len, org_center; + FT_Pos cur_pos1, cur_pos2; + FT_Pos d_off1, u_off1, d_off2, u_off2, delta; + FT_Pos offset; + FT_Pos threshold = 64; + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( ( edge->flags & AF_EDGE_ROUND ) && + ( edge2->flags & AF_EDGE_ROUND ) ) + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP; + } + else + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3; + } + } + + org_len = edge2->opos - edge->opos; + cur_len = af_cjk_compute_stem_width( hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + org_center = ( edge->opos + edge2->opos ) / 2 + anchor; + cur_pos1 = org_center - cur_len / 2; + cur_pos2 = cur_pos1 + cur_len; + d_off1 = cur_pos1 - FT_PIX_FLOOR( cur_pos1 ); + d_off2 = cur_pos2 - FT_PIX_FLOOR( cur_pos2 ); + u_off1 = 64 - d_off1; + u_off2 = 64 - d_off2; + delta = 0; + + + if ( d_off1 == 0 || d_off2 == 0 ) + goto Exit; + + if ( cur_len <= threshold ) + { + if ( d_off2 < cur_len ) + { + if ( u_off1 <= d_off2 ) + delta = u_off1; + else + delta = -d_off2; + } + + goto Exit; + } + + if ( threshold < 64 ) + { + if ( d_off1 >= threshold || u_off1 >= threshold || + d_off2 >= threshold || u_off2 >= threshold ) + goto Exit; + } + + offset = cur_len % 64; + + if ( offset < 32 ) + { + if ( u_off1 <= offset || d_off2 <= offset ) + goto Exit; + } + else + offset = 64 - threshold; + + d_off1 = threshold - u_off1; + u_off1 = u_off1 - offset; + u_off2 = threshold - d_off2; + d_off2 = d_off2 - offset; + + if ( d_off1 <= u_off1 ) + u_off1 = -d_off1; + + if ( d_off2 <= u_off2 ) + u_off2 = -d_off2; + + if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) ) + delta = u_off1; + else + delta = u_off2; + + Exit: + +#if 1 + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = AF_LIGHT_MODE_MAX_DELTA_ABS; + else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = -AF_LIGHT_MODE_MAX_DELTA_ABS; + } +#endif + + cur_pos1 += delta; + + if ( edge->opos < edge2->opos ) + { + edge->pos = cur_pos1; + edge2->pos = cur_pos1 + cur_len; + } + else + { + edge->pos = cur_pos1 + cur_len; + edge2->pos = cur_pos1; + } + + return delta; + } + + + static void + af_cjk_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_PtrDist n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Pos delta = 0; + FT_Int skipped = 0; + + + /* now we align all stem edges. */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + skipped++; + continue; + } + + /* now align the stem */ + + if ( edge2 < edge ) + { + af_cjk_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( dim != AF_DIMENSION_VERT && !anchor ) + { + +#if 0 + if ( fixedpitch ) + { + AF_Edge left = edge; + AF_Edge right = edge_limit - 1; + AF_EdgeRec left1, left2, right1, right2; + FT_Pos target, center1, center2; + FT_Pos delta1, delta2, d1, d2; + + + while ( right > left && !right->link ) + right--; + + left1 = *left; + left2 = *left->link; + right1 = *right->link; + right2 = *right; + + delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2; + target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16; + + delta1 = delta; + delta1 += af_hint_normal_stem( hints, left, left->link, + delta1, 0 ); + + if ( left->link != right ) + af_hint_normal_stem( hints, right->link, right, delta1, 0 ); + + center1 = left->pos + ( right->pos - left->pos ) / 2; + + if ( center1 >= target ) + delta2 = delta - 32; + else + delta2 = delta + 32; + + delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 ); + + if ( delta1 != delta2 ) + { + if ( left->link != right ) + af_hint_normal_stem( hints, &right1, &right2, delta2, 0 ); + + center2 = left1.pos + ( right2.pos - left1.pos ) / 2; + + d1 = center1 - target; + d2 = center2 - target; + + if ( FT_ABS( d2 ) < FT_ABS( d1 ) ) + { + left->pos = left1.pos; + left->link->pos = left2.pos; + + if ( left->link != right ) + { + right->link->pos = right1.pos; + right->pos = right2.pos; + } + + delta1 = delta2; + } + } + + delta = delta1; + right->link->flags |= AF_EDGE_DONE; + right->flags |= AF_EDGE_DONE; + } + else + +#endif /* 0 */ + + delta = af_hint_normal_stem( hints, edge, edge2, 0, + AF_DIMENSION_HORZ ); + } + else + af_hint_normal_stem( hints, edge, edge2, delta, dim ); + +#if 0 + printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n", + edge - edges, edge2 - edges, + ( edge->pos - edge->opos ) / 64.0, + ( edge2->pos - edge2->opos ) / 64.0 ); +#endif + + anchor = edge; + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( edge1->link == edge1 + 1 && + edge2->link == edge2 + 1 && + edge3->link == edge3 + 1 && span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( !skipped ) + return; + + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + if ( edge->flags & AF_EDGE_DONE ) + continue; + + if ( edge->serif ) + { + af_cjk_align_serif_edge( hints, edge->serif, edge ); + edge->flags |= AF_EDGE_DONE; + skipped--; + } + } + + if ( !skipped ) + return; + + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge before, after; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + before = after = edge; + + while ( --before >= edges ) + if ( before->flags & AF_EDGE_DONE ) + break; + + while ( ++after < edge_limit ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges || after < edge_limit ) + { + if ( before < edges ) + af_cjk_align_serif_edge( hints, after, edge ); + else if ( after >= edge_limit ) + af_cjk_align_serif_edge( hints, before, edge ); + else + { + if ( after->fpos == before->fpos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->fpos - before->fpos, + after->pos - before->pos, + after->fpos - before->fpos ); + } + } + } + } + + + static void + af_cjk_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + FT_Bool snapping; + + + snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ && + AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) || + ( dim == AF_DIMENSION_VERT && + AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ); + + for ( edge = edges; edge < edge_limit; edge++ ) + { + /* move the points of each segment */ + /* in each edge to the edge's position */ + AF_Segment seg = edge->first; + + + if ( snapping ) + { + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + else + { + FT_Pos delta = edge->pos - edge->opos; + + + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x += delta; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y += delta; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + FT_UNUSED( metrics ); + + + error = af_glyph_hints_reload( hints, outline, 0 ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + +#ifdef AF_USE_WARPER + if ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif /* AF_USE_WARPER */ + + af_cjk_hint_edges( hints, (AF_Dimension)dim ); + af_cjk_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + +#if 0 + af_glyph_hints_dump_points( hints ); + af_glyph_hints_dump_segments( hints ); + af_glyph_hints_dump_edges( hints ); +#endif + + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_cjk_uniranges[] = + { +#if 0 + AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ), /* why this? */ +#endif + AF_UNIRANGE_REC( 0x2E80UL, 0x2EFFUL ), /* CJK Radicals Supplement */ + AF_UNIRANGE_REC( 0x2F00UL, 0x2FDFUL ), /* Kangxi Radicals */ + AF_UNIRANGE_REC( 0x3000UL, 0x303FUL ), /* CJK Symbols and Punctuation */ + AF_UNIRANGE_REC( 0x3040UL, 0x309FUL ), /* Hiragana */ + AF_UNIRANGE_REC( 0x30A0UL, 0x30FFUL ), /* Katakana */ + AF_UNIRANGE_REC( 0x3100UL, 0x312FUL ), /* Bopomofo */ + AF_UNIRANGE_REC( 0x3130UL, 0x318FUL ), /* Hangul Compatibility Jamo */ + AF_UNIRANGE_REC( 0x31A0UL, 0x31BFUL ), /* Bopomofo Extended */ + AF_UNIRANGE_REC( 0x31C0UL, 0x31EFUL ), /* CJK Strokes */ + AF_UNIRANGE_REC( 0x31F0UL, 0x31FFUL ), /* Katakana Phonetic Extensions */ + AF_UNIRANGE_REC( 0x3200UL, 0x32FFUL ), /* Enclosed CJK Letters and Months */ + AF_UNIRANGE_REC( 0x3300UL, 0x33FFUL ), /* CJK Compatibility */ + AF_UNIRANGE_REC( 0x3400UL, 0x4DBFUL ), /* CJK Unified Ideographs Extension A */ + AF_UNIRANGE_REC( 0x4DC0UL, 0x4DFFUL ), /* Yijing Hexagram Symbols */ + AF_UNIRANGE_REC( 0x4E00UL, 0x9FFFUL ), /* CJK Unified Ideographs */ + AF_UNIRANGE_REC( 0xF900UL, 0xFAFFUL ), /* CJK Compatibility Ideographs */ + AF_UNIRANGE_REC( 0xFE30UL, 0xFE4FUL ), /* CJK Compatibility Forms */ + AF_UNIRANGE_REC( 0xFF00UL, 0xFFEFUL ), /* Halfwidth and Fullwidth Forms */ + AF_UNIRANGE_REC( 0x20000UL, 0x2A6DFUL ), /* CJK Unified Ideographs Extension B */ + AF_UNIRANGE_REC( 0x2F800UL, 0x2FA1FUL ), /* CJK Compatibility Ideographs Supplement */ + AF_UNIRANGE_REC( 0UL, 0UL ) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_cjk_script_class, + AF_SCRIPT_CJK, + af_cjk_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_cjk_metrics_init, + (AF_Script_ScaleMetricsFunc)af_cjk_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_cjk_hints_init, + (AF_Script_ApplyHintsFunc) af_cjk_hints_apply + ) + +#else /* !AF_CONFIG_OPTION_CJK */ + + static const AF_Script_UniRangeRec af_cjk_uniranges[] = + { + AF_UNIRANGE_REC( 0UL, 0UL ) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_cjk_script_class, + AF_SCRIPT_CJK, + af_cjk_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) NULL, + (AF_Script_ApplyHintsFunc) NULL + ) + +#endif /* !AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afcjk.h b/alienblaster/project/jni/freetype/src/autofit/afcjk.h new file mode 100644 index 000000000..0b20d4ae3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afcjk.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* afcjk.h */ +/* */ +/* Auto-fitter hinting routines for CJK script (specification). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFCJK_H__ +#define __AFCJK_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the CJK-specific script class */ + + AF_DECLARE_SCRIPT_CLASS(af_cjk_script_class) + + + FT_LOCAL( FT_Error ) + af_cjk_metrics_init( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_cjk_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ); + +/* */ + +FT_END_HEADER + +#endif /* __AFCJK_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afdummy.c b/alienblaster/project/jni/freetype/src/autofit/afdummy.c new file mode 100644 index 000000000..42b2fcb21 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afdummy.c @@ -0,0 +1,60 @@ +/***************************************************************************/ +/* */ +/* afdummy.c */ +/* */ +/* Auto-fitter dummy routines to be used if no hinting should be */ +/* performed (body). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afdummy.h" +#include "afhints.h" + + + static FT_Error + af_dummy_hints_init( AF_GlyphHints hints, + AF_ScriptMetrics metrics ) + { + af_glyph_hints_rescale( hints, + metrics ); + return 0; + } + + + static FT_Error + af_dummy_hints_apply( AF_GlyphHints hints, + FT_Outline* outline ) + { + FT_UNUSED( hints ); + FT_UNUSED( outline ); + + return 0; + } + + + AF_DEFINE_SCRIPT_CLASS(af_dummy_script_class, + AF_SCRIPT_NONE, + NULL, + + sizeof( AF_ScriptMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_dummy_hints_init, + (AF_Script_ApplyHintsFunc) af_dummy_hints_apply + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afdummy.h b/alienblaster/project/jni/freetype/src/autofit/afdummy.h new file mode 100644 index 000000000..b69ef437f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afdummy.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* afdummy.h */ +/* */ +/* Auto-fitter dummy routines to be used if no hinting should be */ +/* performed (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFDUMMY_H__ +#define __AFDUMMY_H__ + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + /* A dummy script metrics class used when no hinting should + * be performed. This is the default for non-latin glyphs! + */ + + AF_DECLARE_SCRIPT_CLASS(af_dummy_script_class) + +/* */ + +FT_END_HEADER + + +#endif /* __AFDUMMY_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/aferrors.h b/alienblaster/project/jni/freetype/src/autofit/aferrors.h new file mode 100644 index 000000000..c2ed5fe2a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/aferrors.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* aferrors.h */ +/* */ +/* Autofitter error codes (specification only). */ +/* */ +/* Copyright 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Autofitter error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __AFERRORS_H__ +#define __AFERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX AF_Err_ +#define FT_ERR_BASE FT_Mod_Err_Autofit + +#include FT_ERRORS_H + +#endif /* __AFERRORS_H__ */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afglobal.c b/alienblaster/project/jni/freetype/src/autofit/afglobal.c new file mode 100644 index 000000000..ac293619d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afglobal.c @@ -0,0 +1,320 @@ +/***************************************************************************/ +/* */ +/* afglobal.c */ +/* */ +/* Auto-fitter routines to compute global hinting values (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afglobal.h" +#include "afdummy.h" +#include "aflatin.h" +#include "afcjk.h" +#include "afindic.h" +#include "afpic.h" + +#include "aferrors.h" + +#ifdef FT_OPTION_AUTOFIT2 +#include "aflatin2.h" +#endif + +#ifndef FT_CONFIG_OPTION_PIC + +/* when updating this table, don't forget to update + AF_SCRIPT_CLASSES_COUNT and autofit_module_class_pic_init */ + + /* populate this list when you add new scripts */ + static AF_ScriptClass const af_script_classes[] = + { + &af_dummy_script_class, +#ifdef FT_OPTION_AUTOFIT2 + &af_latin2_script_class, +#endif + &af_latin_script_class, + &af_cjk_script_class, + &af_indic_script_class, + NULL /* do not remove */ + }; + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* index of default script in `af_script_classes' */ +#define AF_SCRIPT_LIST_DEFAULT 2 + /* a bit mask indicating an uncovered glyph */ +#define AF_SCRIPT_LIST_NONE 0x7F + /* if this flag is set, we have an ASCII digit */ +#define AF_DIGIT 0x80 + + + /* + * Note that glyph_scripts[] is used to map each glyph into + * an index into the `af_script_classes' array. + * + */ + typedef struct AF_FaceGlobalsRec_ + { + FT_Face face; + FT_Long glyph_count; /* same as face->num_glyphs */ + FT_Byte* glyph_scripts; + + AF_ScriptMetrics metrics[AF_SCRIPT_MAX]; + + } AF_FaceGlobalsRec; + + + /* Compute the script index of each glyph within a given face. */ + + static FT_Error + af_face_globals_compute_script_coverage( AF_FaceGlobals globals ) + { + FT_Error error = AF_Err_Ok; + FT_Face face = globals->face; + FT_CharMap old_charmap = face->charmap; + FT_Byte* gscripts = globals->glyph_scripts; + FT_UInt ss, i; + + + /* the value 255 means `uncovered glyph' */ + FT_MEM_SET( globals->glyph_scripts, + AF_SCRIPT_LIST_NONE, + globals->glyph_count ); + + error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); + if ( error ) + { + /* + * Ignore this error; we simply use the default script. + * XXX: Shouldn't we rather disable hinting? + */ + error = AF_Err_Ok; + goto Exit; + } + + /* scan each script in a Unicode charmap */ + for ( ss = 0; AF_SCRIPT_CLASSES_GET[ss]; ss++ ) + { + AF_ScriptClass clazz = AF_SCRIPT_CLASSES_GET[ss]; + AF_Script_UniRange range; + + + if ( clazz->script_uni_ranges == NULL ) + continue; + + /* + * Scan all unicode points in the range and set the corresponding + * glyph script index. + */ + for ( range = clazz->script_uni_ranges; range->first != 0; range++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < (FT_ULong)globals->glyph_count && + gscripts[gindex] == AF_SCRIPT_LIST_NONE ) + { + gscripts[gindex] = (FT_Byte)ss; + } + + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < (FT_ULong)globals->glyph_count && + gscripts[gindex] == AF_SCRIPT_LIST_NONE ) + { + gscripts[gindex] = (FT_Byte)ss; + } + } + } + } + + /* mark ASCII digits */ + for ( i = 0x30; i <= 0x39; i++ ) + { + FT_UInt gindex = FT_Get_Char_Index( face, i ); + + + if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count ) + gscripts[gindex] |= AF_DIGIT; + } + + Exit: + /* + * By default, all uncovered glyphs are set to the latin script. + * XXX: Shouldn't we disable hinting or do something similar? + */ + { + FT_Long nn; + + + for ( nn = 0; nn < globals->glyph_count; nn++ ) + { + if ( gscripts[nn] == AF_SCRIPT_LIST_NONE ) + gscripts[nn] = AF_SCRIPT_LIST_DEFAULT; + } + } + + FT_Set_Charmap( face, old_charmap ); + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ) + { + FT_Error error; + FT_Memory memory; + AF_FaceGlobals globals; + + + memory = face->memory; + + if ( !FT_ALLOC( globals, sizeof ( *globals ) + + face->num_glyphs * sizeof ( FT_Byte ) ) ) + { + globals->face = face; + globals->glyph_count = face->num_glyphs; + globals->glyph_scripts = (FT_Byte*)( globals + 1 ); + + error = af_face_globals_compute_script_coverage( globals ); + if ( error ) + { + af_face_globals_free( globals ); + globals = NULL; + } + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + af_face_globals_free( AF_FaceGlobals globals ) + { + if ( globals ) + { + FT_Memory memory = globals->face->memory; + FT_UInt nn; + + + for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ ) + { + if ( globals->metrics[nn] ) + { + AF_ScriptClass clazz = AF_SCRIPT_CLASSES_GET[nn]; + + + FT_ASSERT( globals->metrics[nn]->clazz == clazz ); + + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( globals->metrics[nn] ); + + FT_FREE( globals->metrics[nn] ); + } + } + + globals->glyph_count = 0; + globals->glyph_scripts = NULL; /* no need to free this one! */ + globals->face = NULL; + + FT_FREE( globals ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_ScriptMetrics *ametrics ) + { + AF_ScriptMetrics metrics = NULL; + FT_UInt gidx; + AF_ScriptClass clazz; + FT_UInt script = options & 15; + const FT_Offset script_max = sizeof ( AF_SCRIPT_CLASSES_GET ) / + sizeof ( AF_SCRIPT_CLASSES_GET[0] ); + FT_Error error = AF_Err_Ok; + + + if ( gindex >= (FT_ULong)globals->glyph_count ) + { + error = AF_Err_Invalid_Argument; + goto Exit; + } + + gidx = script; + if ( gidx == 0 || gidx + 1 >= script_max ) + gidx = globals->glyph_scripts[gindex] & AF_SCRIPT_LIST_NONE; + + clazz = AF_SCRIPT_CLASSES_GET[gidx]; + if ( script == 0 ) + script = clazz->script; + + metrics = globals->metrics[clazz->script]; + if ( metrics == NULL ) + { + /* create the global metrics object when needed */ + FT_Memory memory = globals->face->memory; + + + if ( FT_ALLOC( metrics, clazz->script_metrics_size ) ) + goto Exit; + + metrics->clazz = clazz; + + if ( clazz->script_metrics_init ) + { + error = clazz->script_metrics_init( metrics, globals->face ); + if ( error ) + { + if ( clazz->script_metrics_done ) + clazz->script_metrics_done( metrics ); + + FT_FREE( metrics ); + goto Exit; + } + } + + globals->metrics[clazz->script] = metrics; + } + + Exit: + *ametrics = metrics; + + return error; + } + + + FT_LOCAL_DEF( FT_Bool ) + af_face_globals_is_digit( AF_FaceGlobals globals, + FT_UInt gindex ) + { + if ( gindex < (FT_ULong)globals->glyph_count ) + return (FT_Bool)( globals->glyph_scripts[gindex] & AF_DIGIT ); + + return (FT_Bool)0; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afglobal.h b/alienblaster/project/jni/freetype/src/autofit/afglobal.h new file mode 100644 index 000000000..2a68e1960 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afglobal.h @@ -0,0 +1,71 @@ +/***************************************************************************/ +/* */ +/* afglobal.h */ +/* */ +/* Auto-fitter routines to compute global hinting values */ +/* (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AF_GLOBAL_H__ +#define __AF_GLOBAL_H__ + + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + + /************************************************************************/ + /************************************************************************/ + /***** *****/ + /***** F A C E G L O B A L S *****/ + /***** *****/ + /************************************************************************/ + /************************************************************************/ + + + /* + * model the global hints data for a given face, decomposed into + * script-specific items + */ + typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; + + + FT_LOCAL( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals ); + + FT_LOCAL( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_ScriptMetrics *ametrics ); + + FT_LOCAL( void ) + af_face_globals_free( AF_FaceGlobals globals ); + + FT_LOCAL_DEF( FT_Bool ) + af_face_globals_is_digit( AF_FaceGlobals globals, + FT_UInt gindex ); + + /* */ + + +FT_END_HEADER + +#endif /* __AF_GLOBALS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afhints.c b/alienblaster/project/jni/freetype/src/autofit/afhints.c new file mode 100644 index 000000000..fe38fba99 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afhints.c @@ -0,0 +1,1265 @@ +/***************************************************************************/ +/* */ +/* afhints.c */ +/* */ +/* Auto-fitter hinting routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afhints.h" +#include "aferrors.h" +#include FT_INTERNAL_CALC_H + + + FT_LOCAL_DEF( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ) + { + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + + + if ( axis->num_segments >= axis->max_segments ) + { + FT_Int old_max = axis->max_segments; + FT_Int new_max = old_max; + FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *segment ) ); + + + if ( old_max >= big_max ) + { + error = AF_Err_Out_Of_Memory; + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) ) + goto Exit; + + axis->max_segments = new_max; + } + + segment = axis->segments + axis->num_segments++; + + Exit: + *asegment = segment; + return error; + } + + + FT_LOCAL( FT_Error ) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Memory memory, + AF_Edge *aedge ) + { + FT_Error error = AF_Err_Ok; + AF_Edge edge = NULL; + AF_Edge edges; + + + if ( axis->num_edges >= axis->max_edges ) + { + FT_Int old_max = axis->max_edges; + FT_Int new_max = old_max; + FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *edge ) ); + + + if ( old_max >= big_max ) + { + error = AF_Err_Out_Of_Memory; + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) ) + goto Exit; + + axis->max_edges = new_max; + } + + edges = axis->edges; + edge = edges + axis->num_edges; + + while ( edge > edges ) + { + if ( edge[-1].fpos < fpos ) + break; + + /* we want the edge with same position and minor direction */ + /* to appear before those in the major one in the list */ + if ( edge[-1].fpos == fpos && dir == axis->major_dir ) + break; + + edge[0] = edge[-1]; + edge--; + } + + axis->num_edges++; + + FT_ZERO( edge ); + edge->fpos = (FT_Short)fpos; + edge->dir = (FT_Char)dir; + + Exit: + *aedge = edge; + return error; + } + + +#ifdef AF_DEBUG + +#include FT_CONFIG_STANDARD_LIBRARY_H + + static const char* + af_dir_str( AF_Direction dir ) + { + const char* result; + + + switch ( dir ) + { + case AF_DIR_UP: + result = "up"; + break; + case AF_DIR_DOWN: + result = "down"; + break; + case AF_DIR_LEFT: + result = "left"; + break; + case AF_DIR_RIGHT: + result = "right"; + break; + default: + result = "none"; + } + + return result; + } + + +#define AF_INDEX_NUM( ptr, base ) ( (ptr) ? ( (ptr) - (base) ) : -1 ) + + + void + af_glyph_hints_dump_points( AF_GlyphHints hints ) + { + AF_Point points = hints->points; + AF_Point limit = points + hints->num_points; + AF_Point point; + + + printf( "Table of points:\n" ); + printf( " [ index | xorg | yorg | xscale | yscale " + "| xfit | yfit | flags ]\n" ); + + for ( point = points; point < limit; point++ ) + { + printf( " [ %5d | %5d | %5d | %-5.2f | %-5.2f " + "| %-5.2f | %-5.2f | %c%c%c%c%c%c ]\n", + point - points, + point->fx, + point->fy, + point->ox/64.0, + point->oy/64.0, + point->x/64.0, + point->y/64.0, + ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ', + ( point->flags & AF_FLAG_INFLECTION ) ? 'i' : ' ', + ( point->flags & AF_FLAG_EXTREMA_X ) ? '<' : ' ', + ( point->flags & AF_FLAG_EXTREMA_Y ) ? 'v' : ' ', + ( point->flags & AF_FLAG_ROUND_X ) ? '(' : ' ', + ( point->flags & AF_FLAG_ROUND_Y ) ? 'u' : ' '); + } + printf( "\n" ); + } + + + static const char* + af_edge_flags_to_string( AF_Edge_Flags flags ) + { + static char temp[32]; + int pos = 0; + + + if ( flags & AF_EDGE_ROUND ) + { + ft_memcpy( temp + pos, "round", 5 ); + pos += 5; + } + if ( flags & AF_EDGE_SERIF ) + { + if ( pos > 0 ) + temp[pos++] = ' '; + ft_memcpy( temp + pos, "serif", 5 ); + pos += 5; + } + if ( pos == 0 ) + return "normal"; + + temp[pos] = 0; + + return temp; + } + + + /* A function to dump the array of linked segments. */ + void + af_glyph_hints_dump_segments( AF_GlyphHints hints ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment seg; + + + printf ( "Table of %s segments:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link | serif |" + " height | extra | flags ]\n" ); + + for ( seg = segments; seg < limit; seg++ ) + { + printf ( " [ %5d | %5.2g | %5s | %4d | %5d | %5d | %5d | %s ]\n", + seg - segments, + dimension == AF_DIMENSION_HORZ ? (int)seg->first->ox / 64.0 + : (int)seg->first->oy / 64.0, + af_dir_str( (AF_Direction)seg->dir ), + AF_INDEX_NUM( seg->link, segments ), + AF_INDEX_NUM( seg->serif, segments ), + seg->height, + seg->height - ( seg->max_coord - seg->min_coord ), + af_edge_flags_to_string( seg->flags ) ); + } + printf( "\n" ); + } + } + + + void + af_glyph_hints_dump_edges( AF_GlyphHints hints ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Edge edges = axis->edges; + AF_Edge limit = edges + axis->num_edges; + AF_Edge edge; + + + /* + * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges + * since they have constant a X coordinate. + */ + printf ( "Table of %s edges:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ); + printf ( " [ index | pos | dir | link |" + " serif | blue | opos | pos | flags ]\n" ); + + for ( edge = edges; edge < limit; edge++ ) + { + printf ( " [ %5d | %5.2g | %5s | %4d |" + " %5d | %c | %5.2f | %5.2f | %s ]\n", + edge - edges, + (int)edge->opos / 64.0, + af_dir_str( (AF_Direction)edge->dir ), + AF_INDEX_NUM( edge->link, edges ), + AF_INDEX_NUM( edge->serif, edges ), + edge->blue_edge ? 'y' : 'n', + edge->opos / 64.0, + edge->pos / 64.0, + af_edge_flags_to_string( edge->flags ) ); + } + printf( "\n" ); + } + } + +#else /* !AF_DEBUG */ + + /* these empty stubs are only used to link the `ftgrid' test program */ + /* when debugging is disabled */ + + void + af_glyph_hints_dump_points( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + + + void + af_glyph_hints_dump_segments( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + + + void + af_glyph_hints_dump_edges( AF_GlyphHints hints ) + { + FT_UNUSED( hints ); + } + +#endif /* !AF_DEBUG */ + + + /* compute the direction value of a given vector */ + FT_LOCAL_DEF( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ll, ss; /* long and short arm lengths */ + AF_Direction dir; /* candidate direction */ + + + if ( dy >= dx ) + { + if ( dy >= -dx ) + { + dir = AF_DIR_UP; + ll = dy; + ss = dx; + } + else + { + dir = AF_DIR_LEFT; + ll = -dx; + ss = dy; + } + } + else /* dy < dx */ + { + if ( dy >= -dx ) + { + dir = AF_DIR_RIGHT; + ll = dx; + ss = dy; + } + else + { + dir = AF_DIR_DOWN; + ll = dy; + ss = dx; + } + } + + ss *= 14; + if ( FT_ABS( ll ) <= FT_ABS( ss ) ) + dir = AF_DIR_NONE; + + return dir; + } + + + /* compute all inflex points in a given glyph */ + + static void + af_glyph_hints_compute_inflections( AF_GlyphHints hints ) + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point first = point; + AF_Point start = point; + AF_Point end = point; + AF_Point before; + AF_Point after; + FT_Pos in_x, in_y, out_x, out_y; + AF_Angle orient_prev, orient_cur; + FT_Int finished = 0; + + + /* compute first segment in contour */ + first = point; + + start = end = first; + do + { + end = end->next; + if ( end == first ) + goto Skip; + + in_x = end->fx - start->fx; + in_y = end->fy - start->fy; + + } while ( in_x == 0 && in_y == 0 ); + + /* extend the segment start whenever possible */ + before = start; + do + { + do + { + start = before; + before = before->prev; + if ( before == first ) + goto Skip; + + out_x = start->fx - before->fx; + out_y = start->fy - before->fy; + + } while ( out_x == 0 && out_y == 0 ); + + orient_prev = ft_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_prev == 0 ); + + first = start; + + in_x = out_x; + in_y = out_y; + + /* now process all segments in the contour */ + do + { + /* first, extend current segment's end whenever possible */ + after = end; + do + { + do + { + end = after; + after = after->next; + if ( after == first ) + finished = 1; + + out_x = after->fx - end->fx; + out_y = after->fy - end->fy; + + } while ( out_x == 0 && out_y == 0 ); + + orient_cur = ft_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_cur == 0 ); + + if ( ( orient_prev + orient_cur ) == 0 ) + { + /* we have an inflection point here */ + do + { + start->flags |= AF_FLAG_INFLECTION; + start = start->next; + + } while ( start != end ); + + start->flags |= AF_FLAG_INFLECTION; + } + + start = end; + end = after; + + orient_prev = orient_cur; + in_x = out_x; + in_y = out_y; + + } while ( !finished ); + + Skip: + ; + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ) + { + FT_ZERO( hints ); + hints->memory = memory; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_done( AF_GlyphHints hints ) + { + if ( hints && hints->memory ) + { + FT_Memory memory = hints->memory; + int dim; + + + /* + * note that we don't need to free the segment and edge + * buffers, since they are really within the hints->points array + */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_AxisHints axis = &hints->axis[dim]; + + + axis->num_segments = 0; + axis->max_segments = 0; + FT_FREE( axis->segments ); + + axis->num_edges = 0; + axis->max_edges = 0; + FT_FREE( axis->edges ); + } + + FT_FREE( hints->contours ); + hints->max_contours = 0; + hints->num_contours = 0; + + FT_FREE( hints->points ); + hints->num_points = 0; + hints->max_points = 0; + + hints->memory = NULL; + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_ScriptMetrics metrics ) + { + hints->metrics = metrics; + hints->scaler_flags = metrics->scaler.flags; + } + + + FT_LOCAL_DEF( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline, + FT_Bool get_inflections ) + { + FT_Error error = AF_Err_Ok; + AF_Point points; + FT_UInt old_max, new_max; + FT_Fixed x_scale = hints->x_scale; + FT_Fixed y_scale = hints->y_scale; + FT_Pos x_delta = hints->x_delta; + FT_Pos y_delta = hints->y_delta; + FT_Memory memory = hints->memory; + + + hints->num_points = 0; + hints->num_contours = 0; + + hints->axis[0].num_segments = 0; + hints->axis[0].num_edges = 0; + hints->axis[1].num_segments = 0; + hints->axis[1].num_edges = 0; + + /* first of all, reallocate the contours array when necessary */ + new_max = (FT_UInt)outline->n_contours; + old_max = hints->max_contours; + if ( new_max > old_max ) + { + new_max = ( new_max + 3 ) & ~3; + + if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) + goto Exit; + + hints->max_contours = new_max; + } + + /* + * then reallocate the points arrays if necessary -- + * note that we reserve two additional point positions, used to + * hint metrics appropriately + */ + new_max = (FT_UInt)( outline->n_points + 2 ); + old_max = hints->max_points; + if ( new_max > old_max ) + { + new_max = ( new_max + 2 + 7 ) & ~7; + + if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) ) + goto Exit; + + hints->max_points = new_max; + } + + hints->num_points = outline->n_points; + hints->num_contours = outline->n_contours; + + /* We can't rely on the value of `FT_Outline.flags' to know the fill */ + /* direction used for a glyph, given that some fonts are broken (e.g., */ + /* the Arphic ones). We thus recompute it each time we need to. */ + /* */ + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT; + + if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) + { + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT; + } + + hints->x_scale = x_scale; + hints->y_scale = y_scale; + hints->x_delta = x_delta; + hints->y_delta = y_delta; + + hints->xmin_delta = 0; + hints->xmax_delta = 0; + + points = hints->points; + if ( hints->num_points == 0 ) + goto Exit; + + { + AF_Point point; + AF_Point point_limit = points + hints->num_points; + + + /* compute coordinates & Bezier flags, next and prev */ + { + FT_Vector* vec = outline->points; + char* tag = outline->tags; + AF_Point first = points; + AF_Point end = points + outline->contours[0]; + AF_Point prev = end; + FT_Int contour_index = 0; + + + FT_UNUSED( first ); + for ( point = points; point < point_limit; point++, vec++, tag++ ) + { + point->fx = (FT_Short)vec->x; + point->fy = (FT_Short)vec->y; + point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; + point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; + + switch ( FT_CURVE_TAG( *tag ) ) + { + case FT_CURVE_TAG_CONIC: + point->flags = AF_FLAG_CONIC; + break; + case FT_CURVE_TAG_CUBIC: + point->flags = AF_FLAG_CUBIC; + break; + default: + point->flags = 0; + } + + point->prev = prev; + prev->next = point; + prev = point; + + if ( point == end ) + { + if ( ++contour_index < outline->n_contours ) + { + first = point + 1; + end = points + outline->contours[contour_index]; + prev = end; + } + } + } + } + + /* set-up the contours array */ + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + short* end = outline->contours; + short idx = 0; + + + for ( ; contour < contour_limit; contour++, end++ ) + { + contour[0] = points + idx; + idx = (short)( end[0] + 1 ); + } + } + + /* compute directions of in & out vectors */ + { + AF_Point first = points; + AF_Point prev = NULL; + FT_Pos in_x = 0; + FT_Pos in_y = 0; + AF_Direction in_dir = AF_DIR_NONE; + + + for ( point = points; point < point_limit; point++ ) + { + AF_Point next; + FT_Pos out_x, out_y; + + + if ( point == first ) + { + prev = first->prev; + in_x = first->fx - prev->fx; + in_y = first->fy - prev->fy; + in_dir = af_direction_compute( in_x, in_y ); + first = prev + 1; + } + + point->in_dir = (FT_Char)in_dir; + + next = point->next; + out_x = next->fx - point->fx; + out_y = next->fy - point->fy; + + in_dir = af_direction_compute( out_x, out_y ); + point->out_dir = (FT_Char)in_dir; + + if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) ) + { + Is_Weak_Point: + point->flags |= AF_FLAG_WEAK_INTERPOLATION; + } + else if ( point->out_dir == point->in_dir ) + { + if ( point->out_dir != AF_DIR_NONE ) + goto Is_Weak_Point; + + if ( ft_corner_is_flat( in_x, in_y, out_x, out_y ) ) + goto Is_Weak_Point; + } + else if ( point->in_dir == -point->out_dir ) + goto Is_Weak_Point; + + in_x = out_x; + in_y = out_y; + prev = point; + } + } + } + + /* compute inflection points -- */ + /* disabled due to no longer perceived benefits */ + if ( 0 && get_inflections ) + af_glyph_hints_compute_inflections( hints ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + FT_Vector* vec = outline->points; + char* tag = outline->tags; + + + for ( ; point < limit; point++, vec++, tag++ ) + { + vec->x = point->x; + vec->y = point->y; + + if ( point->flags & AF_FLAG_CONIC ) + tag[0] = FT_CURVE_TAG_CONIC; + else if ( point->flags & AF_FLAG_CUBIC ) + tag[0] = FT_CURVE_TAG_CUBIC; + else + tag[0] = FT_CURVE_TAG_ON; + } + } + + + /**************************************************************** + * + * EDGE POINT GRID-FITTING + * + ****************************************************************/ + + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( edge == NULL ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + + if ( point == last ) + break; + + point = point->next; + + } + } + } + else + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( edge == NULL ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + + if ( point == last ) + break; + + point = point->next; + } + } + } + } + + + /**************************************************************** + * + * STRONG POINT INTERPOLATION + * + ****************************************************************/ + + + /* hint the strong points -- this is equivalent to the TrueType `IP' */ + /* hinting instruction */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Flags touch_flag; + + + if ( dim == AF_DIMENSION_HORZ ) + touch_flag = AF_FLAG_TOUCH_X; + else + touch_flag = AF_FLAG_TOUCH_Y; + + if ( edges < edge_limit ) + { + AF_Point point; + AF_Edge edge; + + + for ( point = points; point < point_limit; point++ ) + { + FT_Pos u, ou, fu; /* point position */ + FT_Pos delta; + + + if ( point->flags & touch_flag ) + continue; + + /* if this point is candidate to weak interpolation, we */ + /* interpolate it after all strong points have been processed */ + + if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) && + !( point->flags & AF_FLAG_INFLECTION ) ) + continue; + + if ( dim == AF_DIMENSION_VERT ) + { + u = point->fy; + ou = point->oy; + } + else + { + u = point->fx; + ou = point->ox; + } + + fu = u; + + /* is the point before the first edge? */ + edge = edges; + delta = edge->fpos - u; + if ( delta >= 0 ) + { + u = edge->pos - ( edge->opos - ou ); + goto Store_Point; + } + + /* is the point after the last edge? */ + edge = edge_limit - 1; + delta = u - edge->fpos; + if ( delta >= 0 ) + { + u = edge->pos + ( ou - edge->opos ); + goto Store_Point; + } + + { + FT_PtrDist min, max, mid; + FT_Pos fpos; + + + /* find enclosing edges */ + min = 0; + max = edge_limit - edges; + +#if 1 + /* for small edge counts, a linear search is better */ + if ( max <= 8 ) + { + FT_PtrDist nn; + + for ( nn = 0; nn < max; nn++ ) + if ( edges[nn].fpos >= u ) + break; + + if ( edges[nn].fpos == u ) + { + u = edges[nn].pos; + goto Store_Point; + } + min = nn; + } + else +#endif + while ( min < max ) + { + mid = ( max + min ) >> 1; + edge = edges + mid; + fpos = edge->fpos; + + if ( u < fpos ) + max = mid; + else if ( u > fpos ) + min = mid + 1; + else + { + /* we are on the edge */ + u = edge->pos; + goto Store_Point; + } + } + + { + AF_Edge before = edges + min - 1; + AF_Edge after = edges + min + 0; + + + /* assert( before && after && before != after ) */ + if ( before->scale == 0 ) + before->scale = FT_DivFix( after->pos - before->pos, + after->fpos - before->fpos ); + + u = before->pos + FT_MulFix( fu - before->fpos, + before->scale ); + } + } + + Store_Point: + /* save the point position */ + if ( dim == AF_DIMENSION_HORZ ) + point->x = u; + else + point->y = u; + + point->flags |= touch_flag; + } + } + } + + + /**************************************************************** + * + * WEAK POINT INTERPOLATION + * + ****************************************************************/ + + + static void + af_iup_shift( AF_Point p1, + AF_Point p2, + AF_Point ref ) + { + AF_Point p; + FT_Pos delta = ref->u - ref->v; + + if ( delta == 0 ) + return; + + for ( p = p1; p < ref; p++ ) + p->u = p->v + delta; + + for ( p = ref + 1; p <= p2; p++ ) + p->u = p->v + delta; + } + + + static void + af_iup_interp( AF_Point p1, + AF_Point p2, + AF_Point ref1, + AF_Point ref2 ) + { + AF_Point p; + FT_Pos u; + FT_Pos v1 = ref1->v; + FT_Pos v2 = ref2->v; + FT_Pos d1 = ref1->u - v1; + FT_Pos d2 = ref2->u - v2; + + + if ( p1 > p2 ) + return; + + if ( v1 == v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else + u += d2; + + p->u = u; + } + return; + } + + if ( v1 < v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else if ( u >= v2 ) + u += d2; + else + u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); + + p->u = u; + } + } + else + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v2 ) + u += d2; + else if ( u >= v1 ) + u += d1; + else + u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 ); + + p->u = u; + } + } + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Flags touch_flag; + AF_Point point; + AF_Point end_point; + AF_Point first_point; + + + /* PASS 1: Move segment points to edge positions */ + + if ( dim == AF_DIMENSION_HORZ ) + { + touch_flag = AF_FLAG_TOUCH_X; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->x; + point->v = point->ox; + } + } + else + { + touch_flag = AF_FLAG_TOUCH_Y; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->y; + point->v = point->oy; + } + } + + point = points; + + for ( ; contour < contour_limit; contour++ ) + { + AF_Point first_touched, last_touched; + + + point = *contour; + end_point = point->prev; + first_point = point; + + /* find first touched point */ + for (;;) + { + if ( point > end_point ) /* no touched point in contour */ + goto NextContour; + + if ( point->flags & touch_flag ) + break; + + point++; + } + + first_touched = point; + last_touched = point; + + for (;;) + { + FT_ASSERT( point <= end_point && + ( point->flags & touch_flag ) != 0 ); + + /* skip any touched neighbhours */ + while ( point < end_point && ( point[1].flags & touch_flag ) != 0 ) + point++; + + last_touched = point; + + /* find the next touched point, if any */ + point ++; + for (;;) + { + if ( point > end_point ) + goto EndContour; + + if ( ( point->flags & touch_flag ) != 0 ) + break; + + point++; + } + + /* interpolate between last_touched and point */ + af_iup_interp( last_touched + 1, point - 1, + last_touched, point ); + } + + EndContour: + /* special case: only one point was touched */ + if ( last_touched == first_touched ) + { + af_iup_shift( first_point, end_point, first_touched ); + } + else /* interpolate the last part */ + { + if ( last_touched < end_point ) + af_iup_interp( last_touched + 1, end_point, + last_touched, first_touched ); + + if ( first_touched > points ) + af_iup_interp( first_point, first_touched - 1, + last_touched, first_touched ); + } + + NextContour: + ; + } + + /* now save the interpolated values back to x/y */ + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < point_limit; point++ ) + point->x = point->u; + } + else + { + for ( point = points; point < point_limit; point++ ) + point->y = point->u; + } + } + + +#ifdef AF_USE_WARPER + + FT_LOCAL_DEF( void ) + af_glyph_hints_scale_dim( AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed scale, + FT_Pos delta ) + { + AF_Point points = hints->points; + AF_Point points_limit = points + hints->num_points; + AF_Point point; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < points_limit; point++ ) + point->x = FT_MulFix( point->fx, scale ) + delta; + } + else + { + for ( point = points; point < points_limit; point++ ) + point->y = FT_MulFix( point->fy, scale ) + delta; + } + } + +#endif /* AF_USE_WARPER */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afhints.h b/alienblaster/project/jni/freetype/src/autofit/afhints.h new file mode 100644 index 000000000..675826835 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afhints.h @@ -0,0 +1,333 @@ +/***************************************************************************/ +/* */ +/* afhints.h */ +/* */ +/* Auto-fitter hinting routines (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFHINTS_H__ +#define __AFHINTS_H__ + +#include "aftypes.h" + +#define xxAF_SORT_SEGMENTS + +FT_BEGIN_HEADER + + /* + * The definition of outline glyph hints. These are shared by all + * script analysis routines (until now). + */ + + typedef enum AF_Dimension_ + { + AF_DIMENSION_HORZ = 0, /* x coordinates, */ + /* i.e., vertical segments & edges */ + AF_DIMENSION_VERT = 1, /* y coordinates, */ + /* i.e., horizontal segments & edges */ + + AF_DIMENSION_MAX /* do not remove */ + + } AF_Dimension; + + + /* hint directions -- the values are computed so that two vectors are */ + /* in opposite directions iff `dir1 + dir2 == 0' */ + typedef enum AF_Direction_ + { + AF_DIR_NONE = 4, + AF_DIR_RIGHT = 1, + AF_DIR_LEFT = -1, + AF_DIR_UP = 2, + AF_DIR_DOWN = -2 + + } AF_Direction; + + + /* point hint flags */ + typedef enum AF_Flags_ + { + AF_FLAG_NONE = 0, + + /* point type flags */ + AF_FLAG_CONIC = 1 << 0, + AF_FLAG_CUBIC = 1 << 1, + AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC, + + /* point extremum flags */ + AF_FLAG_EXTREMA_X = 1 << 2, + AF_FLAG_EXTREMA_Y = 1 << 3, + + /* point roundness flags */ + AF_FLAG_ROUND_X = 1 << 4, + AF_FLAG_ROUND_Y = 1 << 5, + + /* point touch flags */ + AF_FLAG_TOUCH_X = 1 << 6, + AF_FLAG_TOUCH_Y = 1 << 7, + + /* candidates for weak interpolation have this flag set */ + AF_FLAG_WEAK_INTERPOLATION = 1 << 8, + + /* all inflection points in the outline have this flag set */ + AF_FLAG_INFLECTION = 1 << 9 + + } AF_Flags; + + + /* edge hint flags */ + typedef enum AF_Edge_Flags_ + { + AF_EDGE_NORMAL = 0, + AF_EDGE_ROUND = 1 << 0, + AF_EDGE_SERIF = 1 << 1, + AF_EDGE_DONE = 1 << 2 + + } AF_Edge_Flags; + + + typedef struct AF_PointRec_* AF_Point; + typedef struct AF_SegmentRec_* AF_Segment; + typedef struct AF_EdgeRec_* AF_Edge; + + + typedef struct AF_PointRec_ + { + FT_UShort flags; /* point flags used by hinter */ + FT_Char in_dir; /* direction of inwards vector */ + FT_Char out_dir; /* direction of outwards vector */ + + FT_Pos ox, oy; /* original, scaled position */ + FT_Short fx, fy; /* original, unscaled position (font units) */ + FT_Pos x, y; /* current position */ + FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ + + AF_Point next; /* next point in contour */ + AF_Point prev; /* previous point in contour */ + + } AF_PointRec; + + + typedef struct AF_SegmentRec_ + { + FT_Byte flags; /* edge/segment flags for this segment */ + FT_Char dir; /* segment direction */ + FT_Short pos; /* position of segment */ + FT_Short min_coord; /* minimum coordinate of segment */ + FT_Short max_coord; /* maximum coordinate of segment */ + FT_Short height; /* the hinted segment height */ + + AF_Edge edge; /* the segment's parent edge */ + AF_Segment edge_next; /* link to next segment in parent edge */ + + AF_Segment link; /* (stem) link segment */ + AF_Segment serif; /* primary segment for serifs */ + FT_Pos num_linked; /* number of linked segments */ + FT_Pos score; /* used during stem matching */ + FT_Pos len; /* used during stem matching */ + + AF_Point first; /* first point in edge segment */ + AF_Point last; /* last point in edge segment */ + AF_Point* contour; /* ptr to first point of segment's contour */ + + } AF_SegmentRec; + + + typedef struct AF_EdgeRec_ + { + FT_Short fpos; /* original, unscaled position (font units) */ + FT_Pos opos; /* original, scaled position */ + FT_Pos pos; /* current position */ + + FT_Byte flags; /* edge flags */ + FT_Char dir; /* edge direction */ + FT_Fixed scale; /* used to speed up interpolation between edges */ + AF_Width blue_edge; /* non-NULL if this is a blue edge */ + + AF_Edge link; + AF_Edge serif; + FT_Short num_linked; + + FT_Int score; + + AF_Segment first; + AF_Segment last; + + } AF_EdgeRec; + + + typedef struct AF_AxisHintsRec_ + { + FT_Int num_segments; + FT_Int max_segments; + AF_Segment segments; +#ifdef AF_SORT_SEGMENTS + FT_Int mid_segments; +#endif + + FT_Int num_edges; + FT_Int max_edges; + AF_Edge edges; + + AF_Direction major_dir; + + } AF_AxisHintsRec, *AF_AxisHints; + + + typedef struct AF_GlyphHintsRec_ + { + FT_Memory memory; + + FT_Fixed x_scale; + FT_Pos x_delta; + + FT_Fixed y_scale; + FT_Pos y_delta; + + FT_Pos edge_distance_threshold; + + FT_Int max_points; + FT_Int num_points; + AF_Point points; + + FT_Int max_contours; + FT_Int num_contours; + AF_Point* contours; + + AF_AxisHintsRec axis[AF_DIMENSION_MAX]; + + FT_UInt32 scaler_flags; /* copy of scaler flags */ + FT_UInt32 other_flags; /* free for script-specific */ + /* implementations */ + AF_ScriptMetrics metrics; + + FT_Pos xmin_delta; /* used for warping */ + FT_Pos xmax_delta; + + } AF_GlyphHintsRec; + + +#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) ) +#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) ) + + +#ifdef AF_DEBUG + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + ( !_af_debug_disable_horz_hints && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + ( !_af_debug_disable_vert_hints && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) + +#define AF_HINTS_DO_ADVANCE( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) + +#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints ) + +#else /* !AF_DEBUG */ + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) + +#define AF_HINTS_DO_ADVANCE( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) + +#define AF_HINTS_DO_BLUES( h ) 1 + +#endif /* !AF_DEBUG */ + + + FT_LOCAL( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ); + + + FT_LOCAL( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ); + + FT_LOCAL( FT_Error) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Memory memory, + AF_Edge *edge ); + + FT_LOCAL( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ); + + + + /* + * recompute all AF_Point in a AF_GlyphHints from the definitions + * in a source outline + */ + FT_LOCAL( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_ScriptMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline, + FT_Bool get_inflections ); + + FT_LOCAL( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ); + +#ifdef AF_USE_WARPER + FT_LOCAL( void ) + af_glyph_hints_scale_dim( AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed scale, + FT_Pos delta ); +#endif + + FT_LOCAL( void ) + af_glyph_hints_done( AF_GlyphHints hints ); + +/* */ + +#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord ) + +#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \ + ? (seg1)->pos - (seg2)->pos \ + : (seg2)->pos - (seg1)->pos ) + + +FT_END_HEADER + +#endif /* __AFHINTS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afindic.c b/alienblaster/project/jni/freetype/src/autofit/afindic.c new file mode 100644 index 000000000..1d9e9eafb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afindic.c @@ -0,0 +1,130 @@ +/***************************************************************************/ +/* */ +/* afindic.c */ +/* */ +/* Auto-fitter hinting routines for Indic scripts (body). */ +/* */ +/* Copyright 2007 by */ +/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" +#include "aflatin.h" + + +#ifdef AF_CONFIG_OPTION_INDIC + +#include "afindic.h" +#include "aferrors.h" +#include "afcjk.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + static FT_Error + af_indic_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + /* use CJK routines */ + return af_cjk_metrics_init( metrics, face ); + } + + + static void + af_indic_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + /* use CJK routines */ + af_cjk_metrics_scale( metrics, scaler ); + } + + + static FT_Error + af_indic_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + /* use CJK routines */ + return af_cjk_hints_init( hints, metrics ); + } + + + static FT_Error + af_indic_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics) + { + /* use CJK routines */ + return af_cjk_hints_apply( hints, outline, metrics ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** I N D I C S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static const AF_Script_UniRangeRec af_indic_uniranges[] = + { +#if 0 + AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ), /* why this? */ +#endif + AF_UNIRANGE_REC( 0x0900UL, 0x0DFFUL), /* Indic Range */ + AF_UNIRANGE_REC( 0UL, 0UL) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_indic_script_class, + AF_SCRIPT_INDIC, + af_indic_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_indic_metrics_init, + (AF_Script_ScaleMetricsFunc)af_indic_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_indic_hints_init, + (AF_Script_ApplyHintsFunc) af_indic_hints_apply + ) + +#else /* !AF_CONFIG_OPTION_INDIC */ + + static const AF_Script_UniRangeRec af_indic_uniranges[] = + { + { 0, 0 } + }; + + + AF_DEFINE_SCRIPT_CLASS(af_indic_script_class, + AF_SCRIPT_INDIC, + af_indic_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) NULL, + (AF_Script_ScaleMetricsFunc)NULL, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) NULL, + (AF_Script_ApplyHintsFunc) NULL + ) + +#endif /* !AF_CONFIG_OPTION_INDIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afindic.h b/alienblaster/project/jni/freetype/src/autofit/afindic.h new file mode 100644 index 000000000..662a98220 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afindic.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* afindic.h */ +/* */ +/* Auto-fitter hinting routines for Indic scripts (specification). */ +/* */ +/* Copyright 2007 by */ +/* Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFINDIC_H__ +#define __AFINDIC_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the Indic-specific script class */ + + AF_DECLARE_SCRIPT_CLASS(af_indic_script_class) + + +/* */ + +FT_END_HEADER + +#endif /* __AFINDIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/aflatin.c b/alienblaster/project/jni/freetype/src/autofit/aflatin.c new file mode 100644 index 000000000..e6882d5e7 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/aflatin.c @@ -0,0 +1,2227 @@ +/***************************************************************************/ +/* */ +/* aflatin.c */ +/* */ +/* Auto-fitter hinting routines for latin script (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_ADVANCES_H + +#include "aflatin.h" +#include "aferrors.h" + + +#ifdef AF_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_UInt glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + + glyph_index = FT_Get_Char_Index( face, charcode ); + if ( glyph_index == 0 ) + goto Exit; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + scaler->x_scale = scaler->y_scale = 0x10000L; + scaler->x_delta = scaler->y_delta = 0; + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline, 0 ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + af_latin_hints_link_segments( hints, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[ num_widths++ ].org = dist; + } + } + + af_sort_widths( num_widths, axis->widths ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) + ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + } + } + + af_glyph_hints_done( hints ); + } + + + +#define AF_LATIN_MAX_TEST_CHARACTERS 12 + + + static const char af_latin_blue_chars[AF_LATIN_MAX_BLUES] + [AF_LATIN_MAX_TEST_CHARACTERS + 1] = + { + "THEZOCQS", + "HEZLOCUS", + "fijkdbh", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + static void + af_latin_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Int num_flats; + FT_Int num_rounds; + FT_Int bb; + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_GlyphSlot glyph = face->glyph; + + + /* we compute the blues simply by loading each character from the */ + /* 'af_latin_blue_chars[blues]' string, then compute its top-most or */ + /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ + + AF_LOG(( "blue zones computation\n" )); + AF_LOG(( "------------------------------------------------\n" )); + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + const char* p = af_latin_blue_chars[bb]; + const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + AF_LOG(( "blue %3d: ", bb )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit && *p; p++ ) + { + FT_UInt glyph_index; + FT_Pos best_y; /* same as points.y */ + FT_Int best_point, best_first, best_last; + FT_Vector* points; + FT_Bool round = 0; + + + AF_LOG(( "'%c'", *p )); + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); + if ( glyph_index == 0 ) + continue; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || glyph->outline.n_points <= 0 ) + continue; + + /* now compute min or max point indices and coordinates */ + points = glyph->outline.points; + best_point = -1; + best_y = 0; /* make compiler happy */ + best_first = 0; /* ditto */ + best_last = 0; /* ditto */ + + { + FT_Int nn; + FT_Int first = 0; + FT_Int last = -1; + + + for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) + { + FT_Int old_best_point = best_point; + FT_Int pp; + + + last = glyph->outline.contours[nn]; + + /* Avoid single-point contours since they are never rasterized. */ + /* In some fonts, they correspond to mark attachment points */ + /* which are way outside of the glyph's real outline. */ + if ( last <= first ) + continue; + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y > best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y < best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + + if ( best_point != old_best_point ) + { + best_first = first; + best_last = last; + } + } + AF_LOG(( "%5d", best_y )); + } + + /* now check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then inspect its previous and next points */ + if ( best_point >= 0 ) + { + FT_Int prev, next; + FT_Pos dist; + + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + prev = best_point; + next = prev; + + do + { + if ( prev > best_first ) + prev--; + else + prev = best_last; + + dist = points[prev].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( prev != best_point ); + + do + { + if ( next < best_last ) + next++; + else + next = best_first; + + dist = points[next].y - best_y; + if ( dist < -5 || dist > 5 ) + break; + + } while ( next != best_point ); + + /* now, set the `round' flag depending on the segment's kind */ + round = FT_BOOL( + FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON || + FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON ); + + AF_LOG(( "%c ", round ? 'r' : 'f' )); + } + + if ( round ) + rounds[num_rounds++] = best_y; + else + flats[num_flats++] = best_y; + } + + AF_LOG(( "\n" )); + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + AF_LOG(( "empty\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = & axis->blues[axis->blue_count]; + blue_ref = & blue->ref.org; + blue_shoot = & blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats[num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) + *blue_shoot = *blue_ref = ( shoot + ref ) / 2; + } + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + blue->flags |= AF_LATIN_BLUE_TOP; + + /* + * The following flag is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( bb == AF_LATIN_BLUE_SMALL_TOP ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + AF_LOG(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot )); + } + + return; + } + + + FT_LOCAL_DEF( void ) + af_latin_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_UInt i; + FT_Bool started = 0, same_width = 1; + FT_Fixed advance, old_advance = 0; + + + /* check whether all ASCII digits have the same advance width; */ + /* digit `0' is 0x30 in all supported charmaps */ + for ( i = 0x30; i <= 0x39; i++ ) + { + FT_UInt glyph_index; + + + glyph_index = FT_Get_Char_Index( face, i ); + if ( glyph_index == 0 ) + continue; + + if ( FT_Get_Advance( face, glyph_index, + FT_LOAD_NO_SCALE | + FT_LOAD_NO_HINTING | + FT_LOAD_IGNORE_TRANSFORM, + &advance ) ) + continue; + + if ( started ) + { + if ( advance != old_advance ) + { + same_width = 0; + break; + } + } + else + { + old_advance = advance; + started = 1; + } + } + + metrics->root.digits_have_same_width = same_width; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + FT_CharMap oldmap = face->charmap; + FT_UInt ee; + + static const FT_Encoding latin_encodings[] = + { + FT_ENCODING_UNICODE, + FT_ENCODING_APPLE_ROMAN, + FT_ENCODING_ADOBE_STANDARD, + FT_ENCODING_ADOBE_LATIN_1, + FT_ENCODING_NONE /* end of list */ + }; + + + metrics->units_per_em = face->units_per_EM; + + /* do we have a latin charmap in there? */ + for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) + { + error = FT_Select_Charmap( face, latin_encodings[ee] ); + if ( !error ) + break; + } + + if ( !error ) + { + /* For now, compute the standard width and height from the `o'. */ + af_latin_metrics_init_widths( metrics, face, 'o' ); + af_latin_metrics_init_blues( metrics, face ); + af_latin_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return AF_Err_Ok; + } + + + static void + af_latin_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct X and Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + { + AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < Axis->blue_count; nn++ ) + { + if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &Axis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); + FT_Pos fitted = ( scaled + 40 ) & ~63; + + + if ( scaled != fitted ) + { +#if 0 + if ( dim == AF_DIMENSION_HORZ ) + { + if ( fitted < scaled ) + scale -= scale / 50; /* scale *= 0.98 */ + } + else +#endif + if ( dim == AF_DIMENSION_VERT ) + { + scale = FT_MulDiv( scale, fitted, scaled ); + } + } + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + /* scale the standard widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + } + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 0.75 pixels */ + axis->extra_light = + (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); + + if ( dim == AF_DIMENSION_VERT ) + { + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { + FT_Pos delta1, delta2; + + + delta1 = blue->shoot.org - blue->ref.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + else + delta2 = FT_PIX_ROUND( delta2 ); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit + delta2; + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = AF_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point last = point->prev; + int on_edge = 0; + FT_Pos min_pos = 32000; /* minimum segment pos != min_coord */ + FT_Pos max_pos = -32000; /* maximum segment pos != max_coord */ + FT_Bool passed; + + + if ( point == last ) /* skip singletons -- just in case */ + continue; + + if ( FT_ABS( last->out_dir ) == major_dir && + FT_ABS( point->out_dir ) == major_dir ) + { + /* we are already on an edge, try to locate its start */ + last = point; + + for (;;) + { + point = point->prev; + if ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + break; + } + if ( point == last ) + break; + } + } + + last = point; + passed = 0; + + for (;;) + { + FT_Pos u, v; + + + if ( on_edge ) + { + u = point->u; + if ( u < min_pos ) + min_pos = u; + if ( u > max_pos ) + max_pos = u; + + if ( point->out_dir != segment_dir || point == last ) + { + /* we are just leaving an edge; record a new segment! */ + segment->last = point; + segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + + /* a segment is round if either its first or last point */ + /* is a control point */ + if ( ( segment->first->flags | point->flags ) & + AF_FLAG_CONTROL ) + segment->flags |= AF_EDGE_ROUND; + + /* compute segment size */ + min_pos = max_pos = point->v; + + v = segment->first->v; + if ( v < min_pos ) + min_pos = v; + if ( v > max_pos ) + max_pos = v; + + segment->min_coord = (FT_Short)min_pos; + segment->max_coord = (FT_Short)max_pos; + segment->height = (FT_Short)( segment->max_coord - + segment->min_coord ); + + on_edge = 0; + segment = NULL; + /* fallthrough */ + } + } + + /* now exit if we are at the start/end point */ + if ( point == last ) + { + if ( passed ) + break; + passed = 1; + } + + if ( !on_edge && FT_ABS( point->out_dir ) == major_dir ) + { + /* this is the start of a new segment! */ + segment_dir = (AF_Direction)point->out_dir; + + /* clear all segment fields */ + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + segment[0] = seg0; + segment->dir = (FT_Char)segment_dir; + min_pos = max_pos = point->u; + segment->first = point; + segment->last = point; + segment->contour = contour; + on_edge = 1; + } + + point = point->next; + } + + } /* contours */ + + + /* now slightly increase the height of segments when this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = segments + axis->num_segments; + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first == last ) + continue; + + if ( first_v < last_v ) + { + AF_Point p; + + + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + AF_Point p; + + + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + FT_Pos len_threshold, len_score; + AF_Segment seg1, seg2; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + /* the fake segments are introduced to hint the metrics -- */ + /* we must never link them to anything */ + if ( seg1->dir != axis->major_dir || seg1->first == seg1->last ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Pos dist = pos2 - pos1; + + + if ( dist < 0 ) + dist = -dist; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + score = dist + len_score / len; + + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = AF_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + AF_Direction up_dir; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; + + /* + * We ignore all segments that are less than 1 pixels in length, + * to avoid many problems with serif fonts. We compute the + * corresponding threshold in font units. + */ + if ( dim == AF_DIMENSION_HORZ ) + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + else + segment_length_threshold = 0; + + /*********************************************************************/ + /* */ + /* We will begin by generating a sorted table of edges for the */ + /* current direction. To do so, we simply scan each segment and try */ + /* to find an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which will be processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = 0; + FT_Int ee; + + + if ( seg->height < segment_length_threshold ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif && + 2 * seg->height < 3 * segment_length_threshold ) + continue; + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->fpos = seg->pos; + edge->dir = seg->dir; + edge->opos = edge->pos = FT_MulFix( seg->pos, scale ); + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /*********************************************************************/ + /* */ + /* Good, we will now compute each edge's properties according to */ + /* segments found on its position. Basically, these are: */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now, compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord-seg->min_coord; + else + downs += seg->max_coord-seg->min_coord; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && + seg->serif->edge && + seg->serif->edge != edge ); + + if ( ( seg->link && seg->link->edge != NULL ) || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + +#if 0 + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = (FT_Char)up_dir; + + else if ( ups < downs ) + edge->dir = (FT_Char)-up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ +#endif + + /* gets rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = 0; + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin_hints_link_segments( hints, dim ); + + error = af_latin_hints_compute_edges( hints, dim ); + } + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[ AF_DIMENSION_VERT ]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[ AF_DIMENSION_VERT ]; + FT_Fixed scale = latin->scale; + + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_Int bb; + AF_Width best_blue = NULL; + FT_Pos best_dist; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist > 64 / 2 ) + best_dist = 64 / 2; + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); + is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_blue ^ is_major_dir ) + { + FT_Pos dist; + + + /* first of all, compare it to the reference position */ + dist = edge->fpos - blue->ref.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->ref; + } + + /* now, compare it to the overshoot position if the edge is */ + /* rounded, and if the edge is over the reference position of a */ + /* top zone, or under the reference position of a bottom zone */ + if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + blue = latin->blues + bb; + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->shoot; + } + } + } + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + static FT_Error + af_latin_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified `af_latin_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* #ifdef AF_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + { + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; + } +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels only if we don't use the `light' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' hinting mode we disable horizontal hinting completely. + * We also do it if the face is italic. + */ + if ( mode == FT_RENDER_MODE_LIGHT || + (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_latin_snap_width( AF_Width widths, + FT_Int count, + FT_Pos width ) + { + int n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_latin_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + AF_Edge_Flags base_flags, + AF_Edge_Flags stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + + if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) + goto Done_Width; + + else if ( ( base_flags & AF_EDGE_ROUND ) ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; + + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + if ( axis->width_count > 0 ) + { + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + dist = ( dist + 32 ) & ~63; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + FT_Pos org_dist = dist; + + + dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Pos delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if (delta >= 16) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_latin_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_latin_compute_stem_width( + hints, dim, dist, + (AF_Edge_Flags)base_edge->flags, + (AF_Edge_Flags)stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + AF_LOG(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " + "dist was %.2f, now %.2f\n", + stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, + stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); + } + + + static void + af_latin_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + (serif->opos - base->opos); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + af_latin_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_PtrDist n_edges; + AF_Edge edge; + AF_Edge anchor = 0; + FT_Int has_serifs = 0; + + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + AF_LOG(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " + "was (%.2f)\n", + edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, + edge1->pos / 64.0 )); + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + AF_LOG(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + + af_latin_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( !anchor ) + { + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + if ( cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + AF_LOG(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f) " + "snapped to (%.2f) (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + anchor = edge; + + edge->flags |= AF_EDGE_DONE; + + af_latin_align_linked_edge( hints, dim, edge, edge2 ); + } + else + { + FT_Pos org_pos, org_len, org_center, cur_len; + FT_Pos cur_pos1, cur_pos2, delta1, delta2; + + + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + if ( edge2->flags & AF_EDGE_DONE ) + edge->pos = edge2->pos - cur_len; + + else if ( cur_len < 96 ) + { + FT_Pos u_off, d_off; + + + cur_pos1 = FT_PIX_ROUND( org_center ); + + if (cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + delta1 = org_center - ( cur_pos1 - u_off ); + if ( delta1 < 0 ) + delta1 = -delta1; + + delta2 = org_center - ( cur_pos1 + d_off ); + if ( delta2 < 0 ) + delta2 = -delta2; + + if ( delta1 < delta2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = cur_pos1 + cur_len / 2; + + AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + } + else + { + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( + hints, dim, org_len, + (AF_Edge_Flags)edge->flags, + (AF_Edge_Flags)edge2->flags ); + + cur_pos1 = FT_PIX_ROUND( org_pos ); + delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; + if ( delta1 < 0 ) + delta1 = -delta1; + + cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; + delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center; + if ( delta2 < 0 ) + delta2 = -delta2; + + edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; + edge2->pos = edge->pos + cur_len; + + AF_LOG(( "STEM: %d (opos=%.2f) to %d (opos=%.2f) " + "snapped to (%.2f) and (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + } + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + { + AF_LOG(( "BOUND: %d (pos=%.2f) to (%.2f)\n", + edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); + edge->pos = edge[-1].pos; + } + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin_align_serif_edge( hints, edge->serif, edge ); + AF_LOG(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f) " + "aligned to (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->serif - edges, edge->serif->opos / 64.0, + edge->pos / 64.0 )); + } + else if ( !anchor ) + { + AF_LOG(( "SERIF_ANCHOR: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + } + else + { + AF_Edge before, after; + + + for ( before = edge - 1; before >= edges; before-- ) + if ( before->flags & AF_EDGE_DONE ) + break; + + for ( after = edge + 1; after < edge_limit; after++ ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges && before < edge && + after < edge_limit && after > edge ) + { + if ( after->opos == before->opos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->opos - before->opos, + after->pos - before->pos, + after->opos - before->opos ); + AF_LOG(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f) " + "from %d (opos=%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->pos / 64.0, before - edges, + before->opos / 64.0 )); + } + else + { + edge->pos = anchor->pos + + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); + AF_LOG(( "SERIF_LINK2: edge %d (opos=%.2f) snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + } + } + + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + edge->pos > edge[1].pos ) + edge->pos = edge[1].pos; + } + } + } + + + static FT_Error + af_latin_hints_apply( AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + + error = af_glyph_hints_reload( hints, outline, 1 ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ +#ifdef AF_USE_WARPER + if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT || + AF_HINTS_DO_HORIZONTAL( hints ) ) +#else + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) +#endif + { + error = af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_latin_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_latin_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { +#ifdef AF_USE_WARPER + if ( ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif + + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* XXX: this should probably fine tuned to differentiate better between */ + /* scripts... */ + + static const AF_Script_UniRangeRec af_latin_uniranges[] = + { + AF_UNIRANGE_REC( 0x0020UL, 0x007FUL ), /* Basic Latin (no control chars) */ + AF_UNIRANGE_REC( 0x00A0UL, 0x00FFUL ), /* Latin-1 Supplement (no control chars) */ + AF_UNIRANGE_REC( 0x0100UL, 0x017FUL ), /* Latin Extended-A */ + AF_UNIRANGE_REC( 0x0180UL, 0x024FUL ), /* Latin Extended-B */ + AF_UNIRANGE_REC( 0x0250UL, 0x02AFUL ), /* IPA Extensions */ + AF_UNIRANGE_REC( 0x02B0UL, 0x02FFUL ), /* Spacing Modifier Letters */ + AF_UNIRANGE_REC( 0x0300UL, 0x036FUL ), /* Combining Diacritical Marks */ + AF_UNIRANGE_REC( 0x0370UL, 0x03FFUL ), /* Greek and Coptic */ + AF_UNIRANGE_REC( 0x0400UL, 0x04FFUL ), /* Cyrillic */ + AF_UNIRANGE_REC( 0x0500UL, 0x052FUL ), /* Cyrillic Supplement */ + AF_UNIRANGE_REC( 0x1D00UL, 0x1D7FUL ), /* Phonetic Extensions */ + AF_UNIRANGE_REC( 0x1D80UL, 0x1DBFUL ), /* Phonetic Extensions Supplement */ + AF_UNIRANGE_REC( 0x1DC0UL, 0x1DFFUL ), /* Combining Diacritical Marks Supplement */ + AF_UNIRANGE_REC( 0x1E00UL, 0x1EFFUL ), /* Latin Extended Additional */ + AF_UNIRANGE_REC( 0x1F00UL, 0x1FFFUL ), /* Greek Extended */ + AF_UNIRANGE_REC( 0x2000UL, 0x206FUL ), /* General Punctuation */ + AF_UNIRANGE_REC( 0x2070UL, 0x209FUL ), /* Superscripts and Subscripts */ + AF_UNIRANGE_REC( 0x20A0UL, 0x20CFUL ), /* Currency Symbols */ + AF_UNIRANGE_REC( 0x2150UL, 0x218FUL ), /* Number Forms */ + AF_UNIRANGE_REC( 0x2460UL, 0x24FFUL ), /* Enclosed Alphanumerics */ + AF_UNIRANGE_REC( 0x2C60UL, 0x2C7FUL ), /* Latin Extended-C */ + AF_UNIRANGE_REC( 0x2DE0UL, 0x2DFFUL ), /* Cyrillic Extended-A */ + AF_UNIRANGE_REC( 0xA640UL, 0xA69FUL ), /* Cyrillic Extended-B */ + AF_UNIRANGE_REC( 0xA720UL, 0xA7FFUL ), /* Latin Extended-D */ + AF_UNIRANGE_REC( 0xFB00UL, 0xFB06UL ), /* Alphab. Present. Forms (Latin Ligs) */ + AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ), /* Mathematical Alphanumeric Symbols */ + AF_UNIRANGE_REC( 0UL, 0UL ) + }; + + + AF_DEFINE_SCRIPT_CLASS(af_latin_script_class, + AF_SCRIPT_LATIN, + af_latin_uniranges, + + sizeof( AF_LatinMetricsRec ), + + (AF_Script_InitMetricsFunc) af_latin_metrics_init, + (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale, + (AF_Script_DoneMetricsFunc) NULL, + + (AF_Script_InitHintsFunc) af_latin_hints_init, + (AF_Script_ApplyHintsFunc) af_latin_hints_apply + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/aflatin.h b/alienblaster/project/jni/freetype/src/autofit/aflatin.h new file mode 100644 index 000000000..660b10c83 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/aflatin.h @@ -0,0 +1,212 @@ +/***************************************************************************/ +/* */ +/* aflatin.h */ +/* */ +/* Auto-fitter hinting routines for latin script (specification). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFLATIN_H__ +#define __AFLATIN_H__ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the latin-specific script class */ + + AF_DECLARE_SCRIPT_CLASS(af_latin_script_class) + + +/* constants are given with units_per_em == 2048 in mind */ +#define AF_LATIN_CONSTANT( metrics, c ) \ + ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * The following declarations could be embedded in the file `aflatin.c'; + * they have been made semi-public to allow alternate script hinters to + * re-use some of them. + */ + + + /* Latin (global) metrics management */ + + enum + { + AF_LATIN_BLUE_CAPITAL_TOP, + AF_LATIN_BLUE_CAPITAL_BOTTOM, + AF_LATIN_BLUE_SMALL_F_TOP, + AF_LATIN_BLUE_SMALL_TOP, + AF_LATIN_BLUE_SMALL_BOTTOM, + AF_LATIN_BLUE_SMALL_MINOR, + + AF_LATIN_BLUE_MAX + }; + + +#define AF_LATIN_IS_TOP_BLUE( b ) ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \ + (b) == AF_LATIN_BLUE_SMALL_F_TOP || \ + (b) == AF_LATIN_BLUE_SMALL_TOP ) + +#define AF_LATIN_MAX_WIDTHS 16 +#define AF_LATIN_MAX_BLUES AF_LATIN_BLUE_MAX + + + enum + { + AF_LATIN_BLUE_ACTIVE = 1 << 0, + AF_LATIN_BLUE_TOP = 1 << 1, + AF_LATIN_BLUE_ADJUSTMENT = 1 << 2, /* used for scale adjustment */ + /* optimization */ + AF_LATIN_BLUE_FLAG_MAX + }; + + + typedef struct AF_LatinBlueRec_ + { + AF_WidthRec ref; + AF_WidthRec shoot; + FT_UInt flags; + + } AF_LatinBlueRec, *AF_LatinBlue; + + + typedef struct AF_LatinAxisRec_ + { + FT_Fixed scale; + FT_Pos delta; + + FT_UInt width_count; + AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; + FT_Pos edge_distance_threshold; + FT_Pos standard_width; + FT_Bool extra_light; + + /* ignored for horizontal metrics */ + FT_Bool control_overshoot; + FT_UInt blue_count; + AF_LatinBlueRec blues[AF_LATIN_BLUE_MAX]; + + FT_Fixed org_scale; + FT_Pos org_delta; + + } AF_LatinAxisRec, *AF_LatinAxis; + + + typedef struct AF_LatinMetricsRec_ + { + AF_ScriptMetricsRec root; + FT_UInt units_per_em; + AF_LatinAxisRec axis[AF_DIMENSION_MAX]; + + } AF_LatinMetricsRec, *AF_LatinMetrics; + + + FT_LOCAL( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face, + FT_ULong charcode ); + + FT_LOCAL( void ) + af_latin_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + enum + { + AF_LATIN_HINTS_HORZ_SNAP = 1 << 0, /* enable stem width snapping */ + AF_LATIN_HINTS_VERT_SNAP = 1 << 1, /* enable stem height snapping */ + AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height */ + /* adjustment */ + AF_LATIN_HINTS_MONO = 1 << 3 /* indicate monochrome */ + /* rendering */ + }; + + +#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) + +#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) + +#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) + +#define AF_LATIN_HINTS_DO_MONO( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) + + + /* + * This shouldn't normally be exported. However, other scripts might + * like to use this function as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* + * This shouldn't normally be exported. However, other scripts might + * want to use this function as-is. + */ + FT_LOCAL( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /* + * This shouldn't normally be exported. However, other scripts might + * want to use this function as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ); + +/* */ + +FT_END_HEADER + +#endif /* __AFLATIN_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afloader.c b/alienblaster/project/jni/freetype/src/autofit/afloader.c new file mode 100644 index 000000000..6dd9f2a31 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afloader.c @@ -0,0 +1,539 @@ +/***************************************************************************/ +/* */ +/* afloader.c */ +/* */ +/* Auto-fitter glyph loading routines (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afloader.h" +#include "afhints.h" +#include "afglobal.h" +#include "aferrors.h" + + + FT_LOCAL_DEF( FT_Error ) + af_loader_init( AF_Loader loader, + FT_Memory memory ) + { + FT_ZERO( loader ); + + af_glyph_hints_init( &loader->hints, memory ); +#ifdef AF_DEBUG + _af_debug_hints = &loader->hints; +#endif + return FT_GlyphLoader_New( memory, &loader->gloader ); + } + + + FT_LOCAL_DEF( FT_Error ) + af_loader_reset( AF_Loader loader, + FT_Face face ) + { + FT_Error error = AF_Err_Ok; + + + loader->face = face; + loader->globals = (AF_FaceGlobals)face->autohint.data; + + FT_GlyphLoader_Rewind( loader->gloader ); + + if ( loader->globals == NULL ) + { + error = af_face_globals_new( face, &loader->globals ); + if ( !error ) + { + face->autohint.data = + (FT_Pointer)loader->globals; + face->autohint.finalizer = + (FT_Generic_Finalizer)af_face_globals_free; + } + } + + return error; + } + + + FT_LOCAL_DEF( void ) + af_loader_done( AF_Loader loader ) + { + af_glyph_hints_done( &loader->hints ); + + loader->face = NULL; + loader->globals = NULL; + +#ifdef AF_DEBUG + _af_debug_hints = NULL; +#endif + FT_GlyphLoader_Done( loader->gloader ); + loader->gloader = NULL; + } + + + static FT_Error + af_loader_load_g( AF_Loader loader, + AF_Scaler scaler, + FT_UInt glyph_index, + FT_Int32 load_flags, + FT_UInt depth ) + { + FT_Error error; + FT_Face face = loader->face; + FT_GlyphLoader gloader = loader->gloader; + AF_ScriptMetrics metrics = loader->metrics; + AF_GlyphHints hints = &loader->hints; + FT_GlyphSlot slot = face->glyph; + FT_Slot_Internal internal = slot->internal; + + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + goto Exit; + + loader->transformed = internal->glyph_transformed; + if ( loader->transformed ) + { + FT_Matrix inverse; + + + loader->trans_matrix = internal->glyph_matrix; + loader->trans_delta = internal->glyph_delta; + + inverse = loader->trans_matrix; + FT_Matrix_Invert( &inverse ); + FT_Vector_Transform( &loader->trans_delta, &inverse ); + } + + /* set linear metrics */ + slot->linearHoriAdvance = slot->metrics.horiAdvance; + slot->linearVertAdvance = slot->metrics.vertAdvance; + + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_OUTLINE: + /* translate the loaded glyph when an internal transform is needed */ + if ( loader->transformed ) + FT_Outline_Translate( &slot->outline, + loader->trans_delta.x, + loader->trans_delta.y ); + + /* copy the outline points in the loader's current */ + /* extra points which is used to keep original glyph coordinates */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, + slot->outline.n_points + 4, + slot->outline.n_contours ); + if ( error ) + goto Exit; + + FT_ARRAY_COPY( gloader->current.outline.points, + slot->outline.points, + slot->outline.n_points ); + + FT_ARRAY_COPY( gloader->current.outline.contours, + slot->outline.contours, + slot->outline.n_contours ); + + FT_ARRAY_COPY( gloader->current.outline.tags, + slot->outline.tags, + slot->outline.n_points ); + + gloader->current.outline.n_points = slot->outline.n_points; + gloader->current.outline.n_contours = slot->outline.n_contours; + + /* compute original horizontal phantom points (and ignore */ + /* vertical ones) */ + loader->pp1.x = hints->x_delta; + loader->pp1.y = hints->y_delta; + loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, + hints->x_scale ) + hints->x_delta; + loader->pp2.y = hints->y_delta; + + /* be sure to check for spacing glyphs */ + if ( slot->outline.n_points == 0 ) + goto Hint_Metrics; + + /* now load the slot image into the auto-outline and run the */ + /* automatic hinting process */ + if ( metrics->clazz->script_hints_apply ) + metrics->clazz->script_hints_apply( hints, + &gloader->current.outline, + metrics ); + + /* we now need to hint the metrics according to the change in */ + /* width/positioning that occurred during the hinting process */ + if ( scaler->render_mode != FT_RENDER_MODE_LIGHT ) + { + FT_Pos old_rsb, old_lsb, new_lsb; + FT_Pos pp1x_uh, pp2x_uh; + AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; + AF_Edge edge1 = axis->edges; /* leftmost edge */ + AF_Edge edge2 = edge1 + + axis->num_edges - 1; /* rightmost edge */ + + + if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) + { + old_rsb = loader->pp2.x - edge2->opos; + old_lsb = edge1->opos; + new_lsb = edge1->pos; + + /* remember unhinted values to later account */ + /* for rounding errors */ + + pp1x_uh = new_lsb - old_lsb; + pp2x_uh = edge2->pos + old_rsb; + + /* prefer too much space over too little space */ + /* for very small sizes */ + + if ( old_lsb < 24 ) + pp1x_uh -= 8; + + if ( old_rsb < 24 ) + pp2x_uh += 8; + + loader->pp1.x = FT_PIX_ROUND( pp1x_uh ); + loader->pp2.x = FT_PIX_ROUND( pp2x_uh ); + + if ( loader->pp1.x >= new_lsb && old_lsb > 0 ) + loader->pp1.x -= 64; + + if ( loader->pp2.x <= edge2->pos && old_rsb > 0 ) + loader->pp2.x += 64; + + slot->lsb_delta = loader->pp1.x - pp1x_uh; + slot->rsb_delta = loader->pp2.x - pp2x_uh; + } + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + + loader->pp1.x = FT_PIX_ROUND( pp1x ); + loader->pp2.x = FT_PIX_ROUND( pp2x ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + } + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + + loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta ); + loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + + /* good, we simply add the glyph to our loader's base */ + FT_GlyphLoader_Add( gloader ); + break; + + case FT_GLYPH_FORMAT_COMPOSITE: + { + FT_UInt nn, num_subglyphs = slot->num_subglyphs; + FT_UInt num_base_subgs, start_point; + FT_SubGlyph subglyph; + + + start_point = gloader->base.outline.n_points; + + /* first of all, copy the subglyph descriptors in the glyph loader */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs ); + if ( error ) + goto Exit; + + FT_ARRAY_COPY( gloader->current.subglyphs, + slot->subglyphs, + num_subglyphs ); + + gloader->current.num_subglyphs = num_subglyphs; + num_base_subgs = gloader->base.num_subglyphs; + + /* now, read each subglyph independently */ + for ( nn = 0; nn < num_subglyphs; nn++ ) + { + FT_Vector pp1, pp2; + FT_Pos x, y; + FT_UInt num_points, num_new_points, num_base_points; + + + /* gloader.current.subglyphs can change during glyph loading due */ + /* to re-allocation -- we must recompute the current subglyph on */ + /* each iteration */ + subglyph = gloader->base.subglyphs + num_base_subgs + nn; + + pp1 = loader->pp1; + pp2 = loader->pp2; + + num_base_points = gloader->base.outline.n_points; + + error = af_loader_load_g( loader, scaler, subglyph->index, + load_flags, depth + 1 ); + if ( error ) + goto Exit; + + /* recompute subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + nn; + + if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS ) + { + pp1 = loader->pp1; + pp2 = loader->pp2; + } + else + { + loader->pp1 = pp1; + loader->pp2 = pp2; + } + + num_points = gloader->base.outline.n_points; + num_new_points = num_points - num_base_points; + + /* now perform the transform required for this subglyph */ + + if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE | + FT_SUBGLYPH_FLAG_XY_SCALE | + FT_SUBGLYPH_FLAG_2X2 ) ) + { + FT_Vector* cur = gloader->base.outline.points + + num_base_points; + FT_Vector* limit = cur + num_new_points; + + + for ( ; cur < limit; cur++ ) + FT_Vector_Transform( cur, &subglyph->transform ); + } + + /* apply offset */ + + if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) ) + { + FT_Int k = subglyph->arg1; + FT_UInt l = subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + if ( start_point + k >= num_base_points || + l >= (FT_UInt)num_new_points ) + { + error = AF_Err_Invalid_Composite; + goto Exit; + } + + l += num_base_points; + + /* for now, only use the current point coordinates; */ + /* we may consider another approach in the near future */ + p1 = gloader->base.outline.points + start_point + k; + p2 = gloader->base.outline.points + start_point + l; + + x = p1->x - p2->x; + y = p1->y - p2->y; + } + else + { + x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta; + y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta; + + x = FT_PIX_ROUND( x ); + y = FT_PIX_ROUND( y ); + } + + { + FT_Outline dummy = gloader->base.outline; + + + dummy.points += num_base_points; + dummy.n_points = (short)num_new_points; + + FT_Outline_Translate( &dummy, x, y ); + } + } + } + break; + + default: + /* we don't support other formats (yet?) */ + error = AF_Err_Unimplemented_Feature; + } + + Hint_Metrics: + if ( depth == 0 ) + { + FT_BBox bbox; + FT_Vector vvector; + + + vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; + vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; + vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale ); + vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale ); + + /* transform the hinted outline if needed */ + if ( loader->transformed ) + { + FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); + FT_Vector_Transform( &vvector, &loader->trans_matrix ); + } +#if 1 + /* we must translate our final outline by -pp1.x and compute */ + /* the new metrics */ + if ( loader->pp1.x ) + FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); +#endif + FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); + + bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); + bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); + bbox.xMax = FT_PIX_CEIL( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + + slot->metrics.width = bbox.xMax - bbox.xMin; + slot->metrics.height = bbox.yMax - bbox.yMin; + slot->metrics.horiBearingX = bbox.xMin; + slot->metrics.horiBearingY = bbox.yMax; + + slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); + slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); + + /* for mono-width fonts (like Andale, Courier, etc.) we need */ + /* to keep the original rounded advance width; ditto for */ + /* digits if all have the same advance width */ +#if 0 + if ( !FT_IS_FIXED_WIDTH( slot->face ) ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + else + slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, + x_scale ); +#else + if ( FT_IS_FIXED_WIDTH( slot->face ) || + ( af_face_globals_is_digit( loader->globals, glyph_index ) && + metrics->digits_have_same_width ) ) + { + slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance, + metrics->scaler.x_scale ); + + /* Set delta values to 0. Otherwise code that uses them is */ + /* going to ruin the fixed advance width. */ + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + else + { + /* non-spacing glyphs must stay as-is */ + if ( slot->metrics.horiAdvance ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + } +#endif + + slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, + metrics->scaler.y_scale ); + + slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); + slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); + + /* now copy outline into glyph slot */ + FT_GlyphLoader_Rewind( internal->loader ); + error = FT_GlyphLoader_CopyPoints( internal->loader, gloader ); + if ( error ) + goto Exit; + + slot->outline = internal->loader->base.outline; + slot->format = FT_GLYPH_FORMAT_OUTLINE; + } + +#ifdef DEBUG_HINTER + af_debug_hinter = hinter; +#endif + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + FT_Face face, + FT_UInt gindex, + FT_UInt32 load_flags ) + { + FT_Error error; + FT_Size size = face->size; + AF_ScalerRec scaler; + + + if ( !size ) + return AF_Err_Invalid_Argument; + + FT_ZERO( &scaler ); + + scaler.face = face; + scaler.x_scale = size->metrics.x_scale; + scaler.x_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ + scaler.y_scale = size->metrics.y_scale; + scaler.y_delta = 0; /* XXX: TODO: add support for sub-pixel hinting */ + + scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); + scaler.flags = 0; /* XXX: fix this */ + + error = af_loader_reset( loader, face ); + if ( !error ) + { + AF_ScriptMetrics metrics; + FT_UInt options = 0; + + +#ifdef FT_OPTION_AUTOFIT2 + /* XXX: undocumented hook to activate the latin2 hinter */ + if ( load_flags & ( 1UL << 20 ) ) + options = 2; +#endif + + error = af_face_globals_get_metrics( loader->globals, gindex, + options, &metrics ); + if ( !error ) + { + loader->metrics = metrics; + + if ( metrics->clazz->script_metrics_scale ) + metrics->clazz->script_metrics_scale( metrics, &scaler ); + else + metrics->scaler = scaler; + + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM; + load_flags &= ~FT_LOAD_RENDER; + + if ( metrics->clazz->script_hints_init ) + { + error = metrics->clazz->script_hints_init( &loader->hints, + metrics ); + if ( error ) + goto Exit; + } + + error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 ); + } + } + Exit: + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afloader.h b/alienblaster/project/jni/freetype/src/autofit/afloader.h new file mode 100644 index 000000000..fa67c10ff --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afloader.h @@ -0,0 +1,73 @@ +/***************************************************************************/ +/* */ +/* afloader.h */ +/* */ +/* Auto-fitter glyph loading routines (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AF_LOADER_H__ +#define __AF_LOADER_H__ + +#include "afhints.h" +#include "afglobal.h" + + +FT_BEGIN_HEADER + + typedef struct AF_LoaderRec_ + { + FT_Face face; /* current face */ + AF_FaceGlobals globals; /* current face globals */ + FT_GlyphLoader gloader; /* glyph loader */ + AF_GlyphHintsRec hints; + AF_ScriptMetrics metrics; + FT_Bool transformed; + FT_Matrix trans_matrix; + FT_Vector trans_delta; + FT_Vector pp1; + FT_Vector pp2; + /* we don't handle vertical phantom points */ + + } AF_LoaderRec, *AF_Loader; + + + FT_LOCAL( FT_Error ) + af_loader_init( AF_Loader loader, + FT_Memory memory ); + + + FT_LOCAL( FT_Error ) + af_loader_reset( AF_Loader loader, + FT_Face face ); + + + FT_LOCAL( void ) + af_loader_done( AF_Loader loader ); + + + FT_LOCAL( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + FT_Face face, + FT_UInt gindex, + FT_UInt32 load_flags ); + +/* */ + + +FT_END_HEADER + +#endif /* __AF_LOADER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afmodule.c b/alienblaster/project/jni/freetype/src/autofit/afmodule.c new file mode 100644 index 000000000..ec2d707c9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afmodule.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* afmodule.c */ +/* */ +/* Auto-fitter module implementation (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afmodule.h" +#include "afloader.h" +#include "afpic.h" + +#ifdef AF_DEBUG + int _af_debug; + int _af_debug_disable_horz_hints; + int _af_debug_disable_vert_hints; + int _af_debug_disable_blue_hints; + void* _af_debug_hints; +#endif + +#include FT_INTERNAL_OBJECTS_H + + + typedef struct FT_AutofitterRec_ + { + FT_ModuleRec root; + AF_LoaderRec loader[1]; + + } FT_AutofitterRec, *FT_Autofitter; + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_init( FT_Autofitter module ) + { + return af_loader_init( module->loader, module->root.library->memory ); + } + + + FT_CALLBACK_DEF( void ) + af_autofitter_done( FT_Autofitter module ) + { + af_loader_done( module->loader ); + } + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_load_glyph( FT_Autofitter module, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_UNUSED( size ); + + return af_loader_load_glyph( module->loader, slot->face, + glyph_index, load_flags ); + } + + + FT_DEFINE_AUTOHINTER_SERVICE(af_autofitter_service, + NULL, + NULL, + NULL, + (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph + ) + + FT_DEFINE_MODULE(autofit_module_class, + + FT_MODULE_HINTER, + sizeof ( FT_AutofitterRec ), + + "autofitter", + 0x10000L, /* version 1.0 of the autofitter */ + 0x20000L, /* requires FreeType 2.0 or above */ + + (const void*)&AF_AF_AUTOFITTER_SERVICE_GET, + + (FT_Module_Constructor)af_autofitter_init, + (FT_Module_Destructor) af_autofitter_done, + (FT_Module_Requester) NULL + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afmodule.h b/alienblaster/project/jni/freetype/src/autofit/afmodule.h new file mode 100644 index 000000000..d9792399b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afmodule.h @@ -0,0 +1,37 @@ +/***************************************************************************/ +/* */ +/* afmodule.h */ +/* */ +/* Auto-fitter module implementation (specification). */ +/* */ +/* Copyright 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFMODULE_H__ +#define __AFMODULE_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_MODULE_H + + +FT_BEGIN_HEADER + +FT_DECLARE_MODULE(autofit_module_class) + + +FT_END_HEADER + +#endif /* __AFMODULE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afpic.c b/alienblaster/project/jni/freetype/src/autofit/afpic.c new file mode 100644 index 000000000..76822c301 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afpic.c @@ -0,0 +1,92 @@ +/***************************************************************************/ +/* */ +/* afpic.c */ +/* */ +/* The FreeType position independent code services for autofit module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "afpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from afmodule.c */ + void FT_Init_Class_af_autofitter_service( FT_Library, FT_AutoHinter_ServiceRec*); + + /* forward declaration of PIC init functions from script classes */ +#include "aflatin.h" +#include "aflatin2.h" +#include "afcjk.h" +#include "afdummy.h" +#include "afindic.h" + + void + autofit_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->autofit ) + { + FT_FREE( pic_container->autofit ); + pic_container->autofit = NULL; + } + } + + FT_Error + autofit_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_UInt ss; + FT_Error error = FT_Err_Ok; + AFModulePIC* container; + FT_Memory memory = library->memory; + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->autofit = container; + + /* initialize pointer table - this is how the module usually expects this data */ + for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ ) + { + container->af_script_classes[ss] = &container->af_script_classes_rec[ss]; + } + container->af_script_classes[AF_SCRIPT_CLASSES_COUNT-1] = NULL; + + /* add call to initialization function when you add new scripts */ + ss = 0; + FT_Init_Class_af_dummy_script_class(&container->af_script_classes_rec[ss++]); +#ifdef FT_OPTION_AUTOFIT2 + FT_Init_Class_af_latin2_script_class(&container->af_script_classes_rec[ss++]); +#endif + FT_Init_Class_af_latin_script_class(&container->af_script_classes_rec[ss++]); + FT_Init_Class_af_cjk_script_class(&container->af_script_classes_rec[ss++]); + FT_Init_Class_af_indic_script_class(&container->af_script_classes_rec[ss++]); + + FT_Init_Class_af_autofitter_service(library, &container->af_autofitter_service); + +/*Exit:*/ + if(error) + autofit_module_class_pic_free(library); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afpic.h b/alienblaster/project/jni/freetype/src/autofit/afpic.h new file mode 100644 index 000000000..80e62d39a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afpic.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* afpic.h */ +/* */ +/* The FreeType position independent code services for autofit module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFPIC_H__ +#define __AFPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC + +#define AF_SCRIPT_CLASSES_GET af_script_classes +#define AF_AF_AUTOFITTER_SERVICE_GET af_autofitter_service + +#else /* FT_CONFIG_OPTION_PIC */ + +#include "aftypes.h" + +/* increase these when you add new scripts, and update autofit_module_class_pic_init */ +#ifdef FT_OPTION_AUTOFIT2 + #define AF_SCRIPT_CLASSES_COUNT 6 +#else + #define AF_SCRIPT_CLASSES_COUNT 5 +#endif +#define AF_SCRIPT_CLASSES_REC_COUNT (AF_SCRIPT_CLASSES_COUNT-1) + + typedef struct AFModulePIC_ + { + AF_ScriptClass af_script_classes[AF_SCRIPT_CLASSES_COUNT]; + AF_ScriptClassRec af_script_classes_rec[AF_SCRIPT_CLASSES_REC_COUNT]; + FT_AutoHinter_ServiceRec af_autofitter_service; + } AFModulePIC; + +#define GET_PIC(lib) ((AFModulePIC*)((lib)->pic_container.autofit)) +#define AF_SCRIPT_CLASSES_GET (GET_PIC(FT_FACE_LIBRARY(globals->face))->af_script_classes) +#define AF_AF_AUTOFITTER_SERVICE_GET (GET_PIC(library)->af_autofitter_service) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __AFPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/aftypes.h b/alienblaster/project/jni/freetype/src/autofit/aftypes.h new file mode 100644 index 000000000..5574f0c30 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/aftypes.h @@ -0,0 +1,403 @@ +/***************************************************************************/ +/* */ +/* aftypes.h */ +/* */ +/* Auto-fitter types (specification only). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /************************************************************************* + * + * The auto-fitter is a complete rewrite of the old auto-hinter. + * Its main feature is the ability to differentiate between different + * scripts in order to apply language-specific rules. + * + * The code has also been compartmentized into several entities that + * should make algorithmic experimentation easier than with the old + * code. + * + * Finally, we get rid of the Catharon license, since this code is + * released under the FreeType one. + * + *************************************************************************/ + + +#ifndef __AFTYPES_H__ +#define __AFTYPES_H__ + +#include <ft2build.h> + +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** D E B U G G I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define xxAF_USE_WARPER /* only define to use warp hinting */ +#define xxAF_DEBUG + +#ifdef AF_DEBUG + +#include FT_CONFIG_STANDARD_LIBRARY_H + +#define AF_LOG( x ) do { if ( _af_debug ) printf x; } while ( 0 ) + +extern int _af_debug; +extern int _af_debug_disable_horz_hints; +extern int _af_debug_disable_vert_hints; +extern int _af_debug_disable_blue_hints; +extern void* _af_debug_hints; + +#else /* !AF_DEBUG */ + +#define AF_LOG( x ) do { } while ( 0 ) /* nothing */ + +#endif /* !AF_DEBUG */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** U T I L I T Y S T U F F *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AF_WidthRec_ + { + FT_Pos org; /* original position/width in font units */ + FT_Pos cur; /* current/scaled position/width in device sub-pixels */ + FT_Pos fit; /* current/fitted position/width in device sub-pixels */ + + } AF_WidthRec, *AF_Width; + + + FT_LOCAL( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ); + + FT_LOCAL( void ) + af_sort_widths( FT_UInt count, + AF_Width widths ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** A N G L E T Y P E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The auto-fitter doesn't need a very high angular accuracy; + * this allows us to speed up some computations considerably with a + * light Cordic algorithm (see afangles.c). + */ + + typedef FT_Int AF_Angle; + + +#define AF_ANGLE_PI 256 +#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) +#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) +#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) + + +#if 0 + /* + * compute the angle of a given 2-D vector + */ + FT_LOCAL( AF_Angle ) + af_angle_atan( FT_Pos dx, + FT_Pos dy ); + + + /* + * compute `angle2 - angle1'; the result is always within + * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] + */ + FT_LOCAL( AF_Angle ) + af_angle_diff( AF_Angle angle1, + AF_Angle angle2 ); +#endif /* 0 */ + + +#define AF_ANGLE_DIFF( result, angle1, angle2 ) \ + FT_BEGIN_STMNT \ + AF_Angle _delta = (angle2) - (angle1); \ + \ + \ + _delta %= AF_ANGLE_2PI; \ + if ( _delta < 0 ) \ + _delta += AF_ANGLE_2PI; \ + \ + if ( _delta > AF_ANGLE_PI ) \ + _delta -= AF_ANGLE_2PI; \ + \ + result = _delta; \ + FT_END_STMNT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** O U T L I N E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* opaque handle to glyph-specific hints -- see `afhints.h' for more + * details + */ + typedef struct AF_GlyphHintsRec_* AF_GlyphHints; + + /* This structure is used to model an input glyph outline to + * the auto-hinter. The latter will set the `hints' field + * depending on the glyph's script. + */ + typedef struct AF_OutlineRec_ + { + FT_Face face; + FT_Outline outline; + FT_UInt outline_resolution; + + FT_Int advance; + FT_UInt metrics_resolution; + + AF_GlyphHints hints; + + } AF_OutlineRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C A L E R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * A scaler models the target pixel device that will receive the + * auto-hinted glyph image. + */ + + typedef enum AF_ScalerFlags_ + { + AF_SCALER_FLAG_NO_HORIZONTAL = 1, /* disable horizontal hinting */ + AF_SCALER_FLAG_NO_VERTICAL = 2, /* disable vertical hinting */ + AF_SCALER_FLAG_NO_ADVANCE = 4 /* disable advance hinting */ + + } AF_ScalerFlags; + + + typedef struct AF_ScalerRec_ + { + FT_Face face; /* source font face */ + FT_Fixed x_scale; /* from font units to 1/64th device pixels */ + FT_Fixed y_scale; /* from font units to 1/64th device pixels */ + FT_Pos x_delta; /* in 1/64th device pixels */ + FT_Pos y_delta; /* in 1/64th device pixels */ + FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ + FT_UInt32 flags; /* additional control flags, see above */ + + } AF_ScalerRec, *AF_Scaler; + + +#define AF_SCALER_EQUAL_SCALES( a, b ) \ + ( (a)->x_scale == (b)->x_scale && \ + (a)->y_scale == (b)->y_scale && \ + (a)->x_delta == (b)->x_delta && \ + (a)->y_delta == (b)->y_delta ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C R I P T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The list of know scripts. Each different script corresponds to the + * following information: + * + * - A set of Unicode ranges to test whether the face supports the + * script. + * + * - A specific global analyzer that will compute global metrics + * specific to the script. + * + * - A specific glyph analyzer that will compute segments and + * edges for each glyph covered by the script. + * + * - A specific grid-fitting algorithm that will distort the + * scaled glyph outline according to the results of the glyph + * analyzer. + * + * Note that a given analyzer and/or grid-fitting algorithm can be + * used by more than one script. + */ + + typedef enum AF_Script_ + { + AF_SCRIPT_NONE = 0, + AF_SCRIPT_LATIN = 1, + AF_SCRIPT_CJK = 2, + AF_SCRIPT_INDIC = 3, +#ifdef FT_OPTION_AUTOFIT2 + AF_SCRIPT_LATIN2, +#endif + + /* add new scripts here. Don't forget to update the list in */ + /* `afglobal.c'. */ + + AF_SCRIPT_MAX /* do not remove */ + + } AF_Script; + + + typedef struct AF_ScriptClassRec_ const* AF_ScriptClass; + + typedef struct AF_ScriptMetricsRec_ + { + AF_ScriptClass clazz; + AF_ScalerRec scaler; + FT_Bool digits_have_same_width; + + } AF_ScriptMetricsRec, *AF_ScriptMetrics; + + + /* This function parses an FT_Face to compute global metrics for + * a specific script. + */ + typedef FT_Error + (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics metrics, + FT_Face face ); + + typedef void + (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics metrics, + AF_Scaler scaler ); + + typedef void + (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics metrics ); + + + typedef FT_Error + (*AF_Script_InitHintsFunc)( AF_GlyphHints hints, + AF_ScriptMetrics metrics ); + + typedef void + (*AF_Script_ApplyHintsFunc)( AF_GlyphHints hints, + FT_Outline* outline, + AF_ScriptMetrics metrics ); + + + typedef struct AF_Script_UniRangeRec_ + { + FT_UInt32 first; + FT_UInt32 last; + + } AF_Script_UniRangeRec; + +#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) } + + typedef const AF_Script_UniRangeRec *AF_Script_UniRange; + + + typedef struct AF_ScriptClassRec_ + { + AF_Script script; + AF_Script_UniRange script_uni_ranges; /* last must be { 0, 0 } */ + + FT_Offset script_metrics_size; + AF_Script_InitMetricsFunc script_metrics_init; + AF_Script_ScaleMetricsFunc script_metrics_scale; + AF_Script_DoneMetricsFunc script_metrics_done; + + AF_Script_InitHintsFunc script_hints_init; + AF_Script_ApplyHintsFunc script_hints_apply; + + } AF_ScriptClassRec; + +/* Declare and define vtables for classes */ +#ifndef FT_CONFIG_OPTION_PIC + +#define AF_DECLARE_SCRIPT_CLASS(script_class) \ + FT_CALLBACK_TABLE const AF_ScriptClassRec \ + script_class; + +#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \ + m_init, m_scale, m_done, h_init, h_apply) \ + FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec \ + script_class = \ + { \ + script_, \ + ranges, \ + \ + m_size, \ + \ + m_init, \ + m_scale, \ + m_done, \ + \ + h_init, \ + h_apply \ + }; + +#else + +#define AF_DECLARE_SCRIPT_CLASS(script_class) \ + FT_LOCAL(void) \ + FT_Init_Class_##script_class(AF_ScriptClassRec* ac); + +#define AF_DEFINE_SCRIPT_CLASS(script_class, script_, ranges, m_size, \ + m_init, m_scale, m_done, h_init, h_apply) \ + FT_LOCAL_DEF(void) \ + FT_Init_Class_##script_class(AF_ScriptClassRec* ac) \ + { \ + ac->script = script_; \ + ac->script_uni_ranges = ranges; \ + \ + ac->script_metrics_size = m_size; \ + \ + ac->script_metrics_init = m_init; \ + ac->script_metrics_scale = m_scale; \ + ac->script_metrics_done = m_done; \ + \ + ac->script_hints_init = h_init; \ + ac->script_hints_apply = h_apply; \ + } +#endif + + +/* */ + +FT_END_HEADER + +#endif /* __AFTYPES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afwarp.c b/alienblaster/project/jni/freetype/src/autofit/afwarp.c new file mode 100644 index 000000000..f5bb9b18a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afwarp.c @@ -0,0 +1,338 @@ +/***************************************************************************/ +/* */ +/* afwarp.c */ +/* */ +/* Auto-fitter warping algorithm (body). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "afwarp.h" + +#ifdef AF_USE_WARPER + +#if 1 + static const AF_WarpScore + af_warper_weights[64] = + { + 35, 32, 30, 25, 20, 15, 12, 10, 5, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, + + -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 5, 10, 12, 15, 20, 25, 30, 32, + }; +#else + static const AF_WarpScore + af_warper_weights[64] = + { + 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, + + -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, + }; +#endif + + + static void + af_warper_compute_line_best( AF_Warper warper, + FT_Fixed scale, + FT_Pos delta, + FT_Pos xx1, + FT_Pos xx2, + AF_WarpScore base_distort, + AF_Segment segments, + FT_UInt num_segments ) + { + FT_Int idx_min, idx_max, idx0; + FT_UInt nn; + AF_WarpScore scores[65]; + + + for ( nn = 0; nn < 65; nn++ ) + scores[nn] = 0; + + idx0 = xx1 - warper->t1; + + /* compute minimum and maximum indices */ + { + FT_Pos xx1min = warper->x1min; + FT_Pos xx1max = warper->x1max; + FT_Pos w = xx2 - xx1; + + + if ( xx1min + w < warper->x2min ) + xx1min = warper->x2min - w; + + xx1max = warper->x1max; + if ( xx1max + w > warper->x2max ) + xx1max = warper->x2max - w; + + idx_min = xx1min - warper->t1; + idx_max = xx1max - warper->t1; + + if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 ) + { + AF_LOG(( "invalid indices:\n" + " min=%d max=%d, xx1=%ld xx2=%ld,\n" + " x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n", + idx_min, idx_max, xx1, xx2, + warper->x1min, warper->x1max, + warper->x2min, warper->x2max )); + return; + } + } + + for ( nn = 0; nn < num_segments; nn++ ) + { + FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; + FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; + FT_Pos y = y0 + ( idx_min - idx0 ); + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++, y++ ) + scores[idx] += af_warper_weights[y & 63] * len; + } + + /* find best score */ + { + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++ ) + { + AF_WarpScore score = scores[idx]; + AF_WarpScore distort = base_distort + ( idx - idx0 ); + + + if ( score > warper->best_score || + ( score == warper->best_score && + distort < warper->best_distort ) ) + { + warper->best_score = score; + warper->best_distort = distort; + warper->best_scale = scale; + warper->best_delta = delta + ( idx - idx0 ); + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Pos *a_delta ) + { + AF_AxisHints axis; + AF_Point points; + + FT_Fixed org_scale; + FT_Pos org_delta; + + FT_UInt nn, num_points, num_segments; + FT_Int X1, X2; + FT_Int w; + + AF_WarpScore base_distort; + AF_Segment segments; + + + /* get original scaling transformation */ + if ( dim == AF_DIMENSION_VERT ) + { + org_scale = hints->y_scale; + org_delta = hints->y_delta; + } + else + { + org_scale = hints->x_scale; + org_delta = hints->x_delta; + } + + warper->best_scale = org_scale; + warper->best_delta = org_delta; + warper->best_score = INT_MIN; + warper->best_distort = 0; + + axis = &hints->axis[dim]; + segments = axis->segments; + num_segments = axis->num_segments; + points = hints->points; + num_points = hints->num_points; + + *a_scale = org_scale; + *a_delta = org_delta; + + /* get X1 and X2, minimum and maximum in original coordinates */ + if ( num_segments < 1 ) + return; + +#if 1 + X1 = X2 = points[0].fx; + for ( nn = 1; nn < num_points; nn++ ) + { + FT_Int X = points[nn].fx; + + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } +#else + X1 = X2 = segments[0].pos; + for ( nn = 1; nn < num_segments; nn++ ) + { + FT_Int X = segments[nn].pos; + + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } +#endif + + if ( X1 >= X2 ) + return; + + warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; + warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; + + warper->t1 = AF_WARPER_FLOOR( warper->x1 ); + warper->t2 = AF_WARPER_CEIL( warper->x2 ); + + warper->x1min = warper->x1 & ~31; + warper->x1max = warper->x1min + 32; + warper->x2min = warper->x2 & ~31; + warper->x2max = warper->x2min + 32; + + if ( warper->x1max > warper->x2 ) + warper->x1max = warper->x2; + + if ( warper->x2min < warper->x1 ) + warper->x2min = warper->x1; + + warper->w0 = warper->x2 - warper->x1; + + if ( warper->w0 <= 64 ) + { + warper->x1max = warper->x1; + warper->x2min = warper->x2; + } + + warper->wmin = warper->x2min - warper->x1max; + warper->wmax = warper->x2max - warper->x1min; + +#if 1 + { + int margin = 16; + + + if ( warper->w0 <= 128 ) + { + margin = 8; + if ( warper->w0 <= 96 ) + margin = 4; + } + + if ( warper->wmin < warper->w0 - margin ) + warper->wmin = warper->w0 - margin; + + if ( warper->wmax > warper->w0 + margin ) + warper->wmax = warper->w0 + margin; + } + + if ( warper->wmin < warper->w0 * 3 / 4 ) + warper->wmin = warper->w0 * 3 / 4; + + if ( warper->wmax > warper->w0 * 5 / 4 ) + warper->wmax = warper->w0 * 5 / 4; +#else + /* no scaling, just translation */ + warper->wmin = warper->wmax = warper->w0; +#endif + + for ( w = warper->wmin; w <= warper->wmax; w++ ) + { + FT_Fixed new_scale; + FT_Pos new_delta; + FT_Pos xx1, xx2; + + + xx1 = warper->x1; + xx2 = warper->x2; + if ( w >= warper->w0 ) + { + xx1 -= w - warper->w0; + if ( xx1 < warper->x1min ) + { + xx2 += warper->x1min - xx1; + xx1 = warper->x1min; + } + } + else + { + xx1 -= w - warper->w0; + if ( xx1 > warper->x1max ) + { + xx2 -= xx1 - warper->x1max; + xx1 = warper->x1max; + } + } + + if ( xx1 < warper->x1 ) + base_distort = warper->x1 - xx1; + else + base_distort = xx1 - warper->x1; + + if ( xx2 < warper->x2 ) + base_distort += warper->x2 - xx2; + else + base_distort += xx2 - warper->x2; + + base_distort *= 10; + + new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 ); + new_delta = xx1 - FT_MulFix( X1, new_scale ); + + af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, + base_distort, + segments, num_segments ); + } + + { + FT_Fixed best_scale = warper->best_scale; + FT_Pos best_delta = warper->best_delta; + + + hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale ) + + best_delta; + hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale ) + + best_delta; + + *a_scale = best_scale; + *a_delta = best_delta; + } + } + +#else /* !AF_USE_WARPER */ + +char af_warper_dummy = 0; /* make compiler happy */ + +#endif /* !AF_USE_WARPER */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/afwarp.h b/alienblaster/project/jni/freetype/src/autofit/afwarp.h new file mode 100644 index 000000000..7343fdd5e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/afwarp.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* afwarp.h */ +/* */ +/* Auto-fitter warping algorithm (specification). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFWARP_H__ +#define __AFWARP_H__ + +#include "afhints.h" + +FT_BEGIN_HEADER + +#define AF_WARPER_SCALE + +#define AF_WARPER_FLOOR( x ) ( (x) & ~63 ) +#define AF_WARPER_CEIL( x ) AF_WARPER_FLOOR( (x) + 63 ) + + + typedef FT_Int32 AF_WarpScore; + + typedef struct AF_WarperRec_ + { + FT_Pos x1, x2; + FT_Pos t1, t2; + FT_Pos x1min, x1max; + FT_Pos x2min, x2max; + FT_Pos w0, wmin, wmax; + + FT_Fixed best_scale; + FT_Pos best_delta; + AF_WarpScore best_score; + AF_WarpScore best_distort; + + } AF_WarperRec, *AF_Warper; + + + FT_LOCAL( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Fixed *a_delta ); + + +FT_END_HEADER + + +#endif /* __AFWARP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/autofit/module.mk b/alienblaster/project/jni/freetype/src/autofit/module.mk new file mode 100644 index 000000000..6ec60912a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 auto-fitter module definition +# + + +# Copyright 2003, 2004, 2005, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += AUTOFIT_MODULE + +define AUTOFIT_MODULE +$(OPEN_DRIVER) FT_Module_Class, autofit_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)autofit $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/autofit/rules.mk b/alienblaster/project/jni/freetype/src/autofit/rules.mk new file mode 100644 index 000000000..017489d9e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/autofit/rules.mk @@ -0,0 +1,78 @@ +# +# FreeType 2 auto-fitter module configuration rules +# + + +# Copyright 2003, 2004, 2005, 2006, 2007 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# AUTOF driver directory +# +AUTOF_DIR := $(SRC_DIR)/autofit + + +# compilation flags for the driver +# +AUTOF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(AUTOF_DIR)) + + +# AUTOF driver sources (i.e., C files) +# +AUTOF_DRV_SRC := $(AUTOF_DIR)/afangles.c \ + $(AUTOF_DIR)/afcjk.c \ + $(AUTOF_DIR)/afdummy.c \ + $(AUTOF_DIR)/afglobal.c \ + $(AUTOF_DIR)/afhints.c \ + $(AUTOF_DIR)/afindic.c \ + $(AUTOF_DIR)/aflatin.c \ + $(AUTOF_DIR)/afloader.c \ + $(AUTOF_DIR)/afmodule.c \ + $(AUTOF_DIR)/afwarp.c + +# AUTOF driver headers +# +AUTOF_DRV_H := $(AUTOF_DRV_SRC:%c=%h) \ + $(AUTOF_DIR)/aftypes.h \ + $(AUTOF_DIR)/aferrors.h + + +# AUTOF driver object(s) +# +# AUTOF_DRV_OBJ_M is used during `multi' builds. +# AUTOF_DRV_OBJ_S is used during `single' builds. +# +AUTOF_DRV_OBJ_M := $(AUTOF_DRV_SRC:$(AUTOF_DIR)/%.c=$(OBJ_DIR)/%.$O) +AUTOF_DRV_OBJ_S := $(OBJ_DIR)/autofit.$O + +# AUTOF driver source file for single build +# +AUTOF_DRV_SRC_S := $(AUTOF_DIR)/autofit.c + + +# AUTOF driver - single object +# +$(AUTOF_DRV_OBJ_S): $(AUTOF_DRV_SRC_S) $(AUTOF_DRV_SRC) \ + $(FREETYPE_H) $(AUTOF_DRV_H) + $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(AUTOF_DRV_SRC_S)) + + +# AUTOF driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(AUTOF_DIR)/%.c $(FREETYPE_H) $(AUTOF_DRV_H) + $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(AUTOF_DRV_OBJ_S) +DRV_OBJS_M += $(AUTOF_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/base/Jamfile b/alienblaster/project/jni/freetype/src/base/Jamfile new file mode 100644 index 000000000..832e8b842 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/Jamfile @@ -0,0 +1,60 @@ +# FreeType 2 src/base Jamfile +# +# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) base ; + + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftadvanc ftcalc ftdbgmem ftgloadr + ftobjs ftoutln ftrfork ftsnames + ftstream fttrigon ftutil + basepic ftpic + ; + } + else + { + _sources = ftbase ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# Add the optional/replaceable files. +# +{ + local _sources = bbox bdf bitmap debug gasp + glyph gxval init lcdfil mm + otval pfr stroke synth system + type1 winfnt xf86 patent + ; + + Library $(FT2_LIB) : ft$(_sources).c ; +} + +# Add Macintosh-specific file to the library when necessary. +# +if $(MAC) +{ + Library $(FT2_LIB) : ftmac.c ; +} +else if $(OS) = MACOSX +{ + if $(FT2_MULTI) + { + Library $(FT2_LIB) : ftmac.c ; + } +} + +# end of src/base Jamfile diff --git a/alienblaster/project/jni/freetype/src/base/basepic.c b/alienblaster/project/jni/freetype/src/base/basepic.c new file mode 100644 index 000000000..c0bccb695 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/basepic.c @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* basepic.c */ +/* */ +/* The FreeType position independent code services for base. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "basepic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftglyph.c */ + void FT_Init_Class_ft_outline_glyph_class(FT_Glyph_Class*); + void FT_Init_Class_ft_bitmap_glyph_class(FT_Glyph_Class*); + + /* forward declaration of PIC init functions from ftinit.c */ + FT_Error ft_create_default_module_classes(FT_Library); + void ft_destroy_default_module_classes(FT_Library); + + void + ft_base_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->base ) + { + /* Destroy default module classes (in case FT_Add_Default_Modules was used) */ + ft_destroy_default_module_classes( library ); + + FT_FREE( pic_container->base ); + pic_container->base = NULL; + } + } + + + FT_Error + ft_base_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + BasePIC* container; + FT_Memory memory = library->memory; + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->base = container; + + /* initialize default modules list and pointers */ + error = ft_create_default_module_classes( library ); + if ( error ) + goto Exit; + + /* initialize pointer table - this is how the module usually expects this data */ + FT_Init_Class_ft_outline_glyph_class(&container->ft_outline_glyph_class); + FT_Init_Class_ft_bitmap_glyph_class(&container->ft_bitmap_glyph_class); + +Exit: + if(error) + ft_base_pic_free(library); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/basepic.h b/alienblaster/project/jni/freetype/src/base/basepic.h new file mode 100644 index 000000000..bb1774576 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/basepic.h @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* basepic.h */ +/* */ +/* The FreeType position independent code services for base. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __BASEPIC_H__ +#define __BASEPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class +#define FT_BITMAP_GLYPH_CLASS_GET &ft_bitmap_glyph_class +#define FT_DEFAULT_MODULES_GET ft_default_modules + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_GLYPH_H + + typedef struct BasePIC_ + { + FT_Module_Class** default_module_classes; + FT_Glyph_Class ft_outline_glyph_class; + FT_Glyph_Class ft_bitmap_glyph_class; + } BasePIC; + +#define GET_PIC(lib) ((BasePIC*)((lib)->pic_container.base)) +#define FT_OUTLINE_GLYPH_CLASS_GET (&GET_PIC(library)->ft_outline_glyph_class) +#define FT_BITMAP_GLYPH_CLASS_GET (&GET_PIC(library)->ft_bitmap_glyph_class) +#define FT_DEFAULT_MODULES_GET (GET_PIC(library)->default_module_classes) + + void + ft_base_pic_free( FT_Library library ); + + FT_Error + ft_base_pic_init( FT_Library library ); + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ + +FT_END_HEADER + +#endif /* __BASEPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftadvanc.c b/alienblaster/project/jni/freetype/src/base/ftadvanc.c new file mode 100644 index 000000000..8ab7fcb92 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftadvanc.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* ftadvanc.c */ +/* */ +/* Quick computation of advance widths (body). */ +/* */ +/* Copyright 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_ADVANCES_H +#include FT_INTERNAL_OBJECTS_H + + + static FT_Error + _ft_face_scale_advances( FT_Face face, + FT_Fixed* advances, + FT_UInt count, + FT_Int32 flags ) + { + FT_Fixed scale; + FT_UInt nn; + + + if ( flags & FT_LOAD_NO_SCALE ) + return FT_Err_Ok; + + if ( face->size == NULL ) + return FT_Err_Invalid_Size_Handle; + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + scale = face->size->metrics.y_scale; + else + scale = face->size->metrics.x_scale; + + /* this must be the same scaling as to get linear{Hori,Vert}Advance */ + /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ + + for ( nn = 0; nn < count; nn++ ) + advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); + + return FT_Err_Ok; + } + + + /* at the moment, we can perform fast advance retrieval only in */ + /* the following cases: */ + /* */ + /* - unscaled load */ + /* - unhinted load */ + /* - light-hinted load */ + +#define LOAD_ADVANCE_FAST_CHECK( flags ) \ + ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ + FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 flags, + FT_Fixed *padvance ) + { + FT_Face_GetAdvancesFunc func; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( gindex >= (FT_UInt)face->num_glyphs ) + return FT_Err_Invalid_Glyph_Index; + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) + { + FT_Error error; + + + error = func( face, gindex, 1, flags, padvance ); + if ( !error ) + return _ft_face_scale_advances( face, padvance, 1, flags ); + + if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) + return error; + } + + return FT_Get_Advances( face, gindex, 1, flags, padvance ); + } + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *padvances ) + { + FT_Face_GetAdvancesFunc func; + FT_UInt num, end, nn; + FT_Error error = FT_Err_Ok; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + num = (FT_UInt)face->num_glyphs; + end = start + count; + if ( start >= num || end < start || end > num ) + return FT_Err_Invalid_Glyph_Index; + + if ( count == 0 ) + return FT_Err_Ok; + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) ) + { + error = func( face, start, count, flags, padvances ); + if ( !error ) + goto Exit; + + if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) ) + return error; + } + + error = FT_Err_Ok; + + if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) + return FT_Err_Unimplemented_Feature; + + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + for ( nn = 0; nn < count; nn++ ) + { + error = FT_Load_Glyph( face, start + nn, flags ); + if ( error ) + break; + + padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? face->glyph->advance.y + : face->glyph->advance.x; + } + + if ( error ) + return error; + + Exit: + return _ft_face_scale_advances( face, padvances, count, flags ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftapi.c b/alienblaster/project/jni/freetype/src/base/ftapi.c new file mode 100644 index 000000000..8914d1f4e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftapi.c @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* ftapi.c */ +/* */ +/* The FreeType compatibility functions (body). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LIST_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TABLES_H +#include FT_OUTLINE_H + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C O M P A T I B I L I T Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* backwards compatibility API */ + + FT_BASE_DEF( void ) + FT_New_Memory_Stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream stream ) + { + FT_UNUSED( library ); + + FT_Stream_OpenMemory( stream, base, size ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Seek_Stream( FT_Stream stream, + FT_ULong pos ) + { + return FT_Stream_Seek( stream, pos ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Skip_Stream( FT_Stream stream, + FT_Long distance ) + { + return FT_Stream_Skip( stream, distance ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Read_Stream( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_Read( stream, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Read_Stream_At( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Extract_Frame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + return FT_Stream_ExtractFrame( stream, count, pbytes ); + } + + + FT_BASE_DEF( void ) + FT_Release_Frame( FT_Stream stream, + FT_Byte** pbytes ) + { + FT_Stream_ReleaseFrame( stream, pbytes ); + } + + FT_BASE_DEF( FT_Error ) + FT_Access_Frame( FT_Stream stream, + FT_ULong count ) + { + return FT_Stream_EnterFrame( stream, count ); + } + + + FT_BASE_DEF( void ) + FT_Forget_Frame( FT_Stream stream ) + { + FT_Stream_ExitFrame( stream ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftbase.h b/alienblaster/project/jni/freetype/src/base/ftbase.h new file mode 100644 index 000000000..1dc49f3bd --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftbase.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* ftbase.h */ +/* */ +/* The FreeType private functions used in base module (specification). */ +/* */ +/* Copyright 2008, 2010 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBASE_H__ +#define __FTBASE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */ + /* font, and try to load a face specified by the face_index. */ + FT_LOCAL( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ); + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* From ftmac.c. */ + FT_LOCAL( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ); + + +FT_END_HEADER + +#endif /* __FTBASE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftbbox.c b/alienblaster/project/jni/freetype/src/base/ftbbox.c new file mode 100644 index 000000000..4b8e9112f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftbbox.c @@ -0,0 +1,662 @@ +/***************************************************************************/ +/* */ +/* ftbbox.c */ +/* */ +/* FreeType bbox computation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_BBOX_H +#include FT_IMAGE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_OBJECTS_H + + + typedef struct TBBox_Rec_ + { + FT_Vector last; + FT_BBox bbox; + + } TBBox_Rec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Move_To */ + /* */ + /* <Description> */ + /* This function is used as a `move_to' and `line_to' emitter during */ + /* FT_Outline_Decompose(). It simply records the destination point */ + /* in `user->last'; no further computations are necessary since we */ + /* use the cbox as the starting bbox which must be refined. */ + /* */ + /* <Input> */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: A pointer to the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + static int + BBox_Move_To( FT_Vector* to, + TBBox_Rec* user ) + { + user->last = *to; + + return 0; + } + + +#define CHECK_X( p, bbox ) \ + ( p->x < bbox.xMin || p->x > bbox.xMax ) + +#define CHECK_Y( p, bbox ) \ + ( p->y < bbox.yMin || p->y > bbox.yMax ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Conic_Check */ + /* */ + /* <Description> */ + /* Finds the extrema of a 1-dimensional conic Bezier curve and update */ + /* a bounding range. This version uses direct computation, as it */ + /* doesn't need square roots. */ + /* */ + /* <Input> */ + /* y1 :: The start coordinate. */ + /* */ + /* y2 :: The coordinate of the control point. */ + /* */ + /* y3 :: The end coordinate. */ + /* */ + /* <InOut> */ + /* min :: The address of the current minimum. */ + /* */ + /* max :: The address of the current maximum. */ + /* */ + static void + BBox_Conic_Check( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos* min, + FT_Pos* max ) + { + if ( y1 <= y3 && y2 == y1 ) /* flat arc */ + goto Suite; + + if ( y1 < y3 ) + { + if ( y2 >= y1 && y2 <= y3 ) /* ascending arc */ + goto Suite; + } + else + { + if ( y2 >= y3 && y2 <= y1 ) /* descending arc */ + { + y2 = y1; + y1 = y3; + y3 = y2; + goto Suite; + } + } + + y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 ); + + Suite: + if ( y1 < *min ) *min = y1; + if ( y3 > *max ) *max = y3; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Conic_To */ + /* */ + /* <Description> */ + /* This function is used as a `conic_to' emitter during */ + /* FT_Outline_Decompose(). It checks a conic Bezier curve with the */ + /* current bounding box, and computes its extrema if necessary to */ + /* update it. */ + /* */ + /* <Input> */ + /* control :: A pointer to a control point. */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: The address of the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + /* <Note> */ + /* In the case of a non-monotonous arc, we compute directly the */ + /* extremum coordinates, as it is sufficiently fast. */ + /* */ + static int + BBox_Conic_To( FT_Vector* control, + FT_Vector* to, + TBBox_Rec* user ) + { + /* we don't need to check `to' since it is always an `on' point, thus */ + /* within the bbox */ + + if ( CHECK_X( control, user->bbox ) ) + BBox_Conic_Check( user->last.x, + control->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control, user->bbox ) ) + BBox_Conic_Check( user->last.y, + control->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Cubic_Check */ + /* */ + /* <Description> */ + /* Finds the extrema of a 1-dimensional cubic Bezier curve and */ + /* updates a bounding range. This version uses splitting because we */ + /* don't want to use square roots and extra accuracy. */ + /* */ + /* <Input> */ + /* p1 :: The start coordinate. */ + /* */ + /* p2 :: The coordinate of the first control point. */ + /* */ + /* p3 :: The coordinate of the second control point. */ + /* */ + /* p4 :: The end coordinate. */ + /* */ + /* <InOut> */ + /* min :: The address of the current minimum. */ + /* */ + /* max :: The address of the current maximum. */ + /* */ + +#if 0 + + static void + BBox_Cubic_Check( FT_Pos p1, + FT_Pos p2, + FT_Pos p3, + FT_Pos p4, + FT_Pos* min, + FT_Pos* max ) + { + FT_Pos stack[32*3 + 1], *arc; + + + arc = stack; + + arc[0] = p1; + arc[1] = p2; + arc[2] = p3; + arc[3] = p4; + + do + { + FT_Pos y1 = arc[0]; + FT_Pos y2 = arc[1]; + FT_Pos y3 = arc[2]; + FT_Pos y4 = arc[3]; + + + if ( y1 == y4 ) + { + if ( y1 == y2 && y1 == y3 ) /* flat */ + goto Test; + } + else if ( y1 < y4 ) + { + if ( y2 >= y1 && y2 <= y4 && y3 >= y1 && y3 <= y4 ) /* ascending */ + goto Test; + } + else + { + if ( y2 >= y4 && y2 <= y1 && y3 >= y4 && y3 <= y1 ) /* descending */ + { + y2 = y1; + y1 = y4; + y4 = y2; + goto Test; + } + } + + /* unknown direction -- split the arc in two */ + arc[6] = y4; + arc[1] = y1 = ( y1 + y2 ) / 2; + arc[5] = y4 = ( y4 + y3 ) / 2; + y2 = ( y2 + y3 ) / 2; + arc[2] = y1 = ( y1 + y2 ) / 2; + arc[4] = y4 = ( y4 + y2 ) / 2; + arc[3] = ( y1 + y4 ) / 2; + + arc += 3; + goto Suite; + + Test: + if ( y1 < *min ) *min = y1; + if ( y4 > *max ) *max = y4; + arc -= 3; + + Suite: + ; + } while ( arc >= stack ); + } + +#else + + static void + test_cubic_extrema( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos y4, + FT_Fixed u, + FT_Pos* min, + FT_Pos* max ) + { + /* FT_Pos a = y4 - 3*y3 + 3*y2 - y1; */ + FT_Pos b = y3 - 2*y2 + y1; + FT_Pos c = y2 - y1; + FT_Pos d = y1; + FT_Pos y; + FT_Fixed uu; + + FT_UNUSED ( y4 ); + + + /* The polynomial is */ + /* */ + /* P(x) = a*x^3 + 3b*x^2 + 3c*x + d , */ + /* */ + /* dP/dx = 3a*x^2 + 6b*x + 3c . */ + /* */ + /* However, we also have */ + /* */ + /* dP/dx(u) = 0 , */ + /* */ + /* which implies by subtraction that */ + /* */ + /* P(u) = b*u^2 + 2c*u + d . */ + + if ( u > 0 && u < 0x10000L ) + { + uu = FT_MulFix( u, u ); + y = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu ); + + if ( y < *min ) *min = y; + if ( y > *max ) *max = y; + } + } + + + static void + BBox_Cubic_Check( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos y4, + FT_Pos* min, + FT_Pos* max ) + { + /* always compare first and last points */ + if ( y1 < *min ) *min = y1; + else if ( y1 > *max ) *max = y1; + + if ( y4 < *min ) *min = y4; + else if ( y4 > *max ) *max = y4; + + /* now, try to see if there are split points here */ + if ( y1 <= y4 ) + { + /* flat or ascending arc test */ + if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 ) + return; + } + else /* y1 > y4 */ + { + /* descending arc test */ + if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 ) + return; + } + + /* There are some split points. Find them. */ + { + FT_Pos a = y4 - 3*y3 + 3*y2 - y1; + FT_Pos b = y3 - 2*y2 + y1; + FT_Pos c = y2 - y1; + FT_Pos d; + FT_Fixed t; + + + /* We need to solve `ax^2+2bx+c' here, without floating points! */ + /* The trick is to normalize to a different representation in order */ + /* to use our 16.16 fixed point routines. */ + /* */ + /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */ + /* These values must fit into a single 16.16 value. */ + /* */ + /* We normalize a, b, and c to `8.16' fixed float values to ensure */ + /* that its product is held in a `16.16' value. */ + + { + FT_ULong t1, t2; + int shift = 0; + + + /* The following computation is based on the fact that for */ + /* any value `y', if `n' is the position of the most */ + /* significant bit of `abs(y)' (starting from 0 for the */ + /* least significant bit), then `y' is in the range */ + /* */ + /* -2^n..2^n-1 */ + /* */ + /* We want to shift `a', `b', and `c' concurrently in order */ + /* to ensure that they all fit in 8.16 values, which maps */ + /* to the integer range `-2^23..2^23-1'. */ + /* */ + /* Necessarily, we need to shift `a', `b', and `c' so that */ + /* the most significant bit of its absolute values is at */ + /* _most_ at position 23. */ + /* */ + /* We begin by computing `t1' as the bitwise `OR' of the */ + /* absolute values of `a', `b', `c'. */ + + t1 = (FT_ULong)( ( a >= 0 ) ? a : -a ); + t2 = (FT_ULong)( ( b >= 0 ) ? b : -b ); + t1 |= t2; + t2 = (FT_ULong)( ( c >= 0 ) ? c : -c ); + t1 |= t2; + + /* Now we can be sure that the most significant bit of `t1' */ + /* is the most significant bit of either `a', `b', or `c', */ + /* depending on the greatest integer range of the particular */ + /* variable. */ + /* */ + /* Next, we compute the `shift', by shifting `t1' as many */ + /* times as necessary to move its MSB to position 23. This */ + /* corresponds to a value of `t1' that is in the range */ + /* 0x40_0000..0x7F_FFFF. */ + /* */ + /* Finally, we shift `a', `b', and `c' by the same amount. */ + /* This ensures that all values are now in the range */ + /* -2^23..2^23, i.e., they are now expressed as 8.16 */ + /* fixed-float numbers. This also means that we are using */ + /* 24 bits of precision to compute the zeros, independently */ + /* of the range of the original polynomial coefficients. */ + /* */ + /* This algorithm should ensure reasonably accurate values */ + /* for the zeros. Note that they are only expressed with */ + /* 16 bits when computing the extrema (the zeros need to */ + /* be in 0..1 exclusive to be considered part of the arc). */ + + if ( t1 == 0 ) /* all coefficients are 0! */ + return; + + if ( t1 > 0x7FFFFFUL ) + { + do + { + shift++; + t1 >>= 1; + + } while ( t1 > 0x7FFFFFUL ); + + /* this loses some bits of precision, but we use 24 of them */ + /* for the computation anyway */ + a >>= shift; + b >>= shift; + c >>= shift; + } + else if ( t1 < 0x400000UL ) + { + do + { + shift++; + t1 <<= 1; + + } while ( t1 < 0x400000UL ); + + a <<= shift; + b <<= shift; + c <<= shift; + } + } + + /* handle a == 0 */ + if ( a == 0 ) + { + if ( b != 0 ) + { + t = - FT_DivFix( c, b ) / 2; + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + } + else + { + /* solve the equation now */ + d = FT_MulFix( b, b ) - FT_MulFix( a, c ); + if ( d < 0 ) + return; + + if ( d == 0 ) + { + /* there is a single split point at -b/a */ + t = - FT_DivFix( b, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + else + { + /* there are two solutions; we need to filter them */ + d = FT_SqrtFixed( (FT_Int32)d ); + t = - FT_DivFix( b - d, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + + t = - FT_DivFix( b + d, a ); + test_cubic_extrema( y1, y2, y3, y4, t, min, max ); + } + } + } + } + +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* BBox_Cubic_To */ + /* */ + /* <Description> */ + /* This function is used as a `cubic_to' emitter during */ + /* FT_Outline_Decompose(). It checks a cubic Bezier curve with the */ + /* current bounding box, and computes its extrema if necessary to */ + /* update it. */ + /* */ + /* <Input> */ + /* control1 :: A pointer to the first control point. */ + /* */ + /* control2 :: A pointer to the second control point. */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* <InOut> */ + /* user :: The address of the current walk context. */ + /* */ + /* <Return> */ + /* Always 0. Needed for the interface only. */ + /* */ + /* <Note> */ + /* In the case of a non-monotonous arc, we don't compute directly */ + /* extremum coordinates, we subdivide instead. */ + /* */ + static int + BBox_Cubic_To( FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to, + TBBox_Rec* user ) + { + /* we don't need to check `to' since it is always an `on' point, thus */ + /* within the bbox */ + + if ( CHECK_X( control1, user->bbox ) || + CHECK_X( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.x, + control1->x, + control2->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control1, user->bbox ) || + CHECK_Y( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.y, + control1->y, + control2->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + +FT_DEFINE_OUTLINE_FUNCS(bbox_interface, + (FT_Outline_MoveTo_Func) BBox_Move_To, + (FT_Outline_LineTo_Func) BBox_Move_To, + (FT_Outline_ConicTo_Func)BBox_Conic_To, + (FT_Outline_CubicTo_Func)BBox_Cubic_To, + 0, 0 + ) + + /* documentation is in ftbbox.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ) + { + FT_BBox cbox; + FT_BBox bbox; + FT_Vector* vec; + FT_UShort n; + + + if ( !abbox ) + return FT_Err_Invalid_Argument; + + if ( !outline ) + return FT_Err_Invalid_Outline; + + /* if outline is empty, return (0,0,0,0) */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + { + abbox->xMin = abbox->xMax = 0; + abbox->yMin = abbox->yMax = 0; + return 0; + } + + /* We compute the control box as well as the bounding box of */ + /* all `on' points in the outline. Then, if the two boxes */ + /* coincide, we exit immediately. */ + + vec = outline->points; + bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x; + bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y; + vec++; + + for ( n = 1; n < outline->n_points; n++ ) + { + FT_Pos x = vec->x; + FT_Pos y = vec->y; + + + /* update control box */ + if ( x < cbox.xMin ) cbox.xMin = x; + if ( x > cbox.xMax ) cbox.xMax = x; + + if ( y < cbox.yMin ) cbox.yMin = y; + if ( y > cbox.yMax ) cbox.yMax = y; + + if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON ) + { + /* update bbox for `on' points only */ + if ( x < bbox.xMin ) bbox.xMin = x; + if ( x > bbox.xMax ) bbox.xMax = x; + + if ( y < bbox.yMin ) bbox.yMin = y; + if ( y > bbox.yMax ) bbox.yMax = y; + } + + vec++; + } + + /* test two boxes for equality */ + if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax || + cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax ) + { + /* the two boxes are different, now walk over the outline to */ + /* get the Bezier arc extrema. */ + + FT_Error error; + TBBox_Rec user; + +#ifdef FT_CONFIG_OPTION_PIC + FT_Outline_Funcs bbox_interface; + Init_Class_bbox_interface(&bbox_interface); +#endif + + user.bbox = bbox; + + error = FT_Outline_Decompose( outline, &bbox_interface, &user ); + if ( error ) + return error; + + *abbox = user.bbox; + } + else + *abbox = bbox; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftbdf.c b/alienblaster/project/jni/freetype/src/base/ftbdf.c new file mode 100644 index 000000000..d29adf09d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftbdf.c @@ -0,0 +1,88 @@ +/***************************************************************************/ +/* */ +/* ftbdf.c */ +/* */ +/* FreeType API for accessing BDF-specific strings (body). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_BDF_H + + + /* documentation is in ftbdf.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + FT_Error error; + const char* encoding = NULL; + const char* registry = NULL; + + + error = FT_Err_Invalid_Argument; + + if ( face ) + { + FT_Service_BDF service; + + + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_charset_id ) + error = service->get_charset_id( face, &encoding, ®istry ); + } + + if ( acharset_encoding ) + *acharset_encoding = encoding; + + if ( acharset_registry ) + *acharset_registry = registry; + + return error; + } + + + /* documentation is in ftbdf.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + FT_Error error; + + + error = FT_Err_Invalid_Argument; + + aproperty->type = BDF_PROPERTY_TYPE_NONE; + + if ( face ) + { + FT_Service_BDF service; + + + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_property ) + error = service->get_property( face, prop_name, aproperty ); + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftbitmap.c b/alienblaster/project/jni/freetype/src/base/ftbitmap.c new file mode 100644 index 000000000..46fcce613 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftbitmap.c @@ -0,0 +1,663 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.c */ +/* */ +/* FreeType utility functions for bitmaps (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_BITMAP_H +#include FT_IMAGE_H +#include FT_INTERNAL_OBJECTS_H + + + static + const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ) + { + *abitmap = null_bitmap; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target) + { + FT_Memory memory = library->memory; + FT_Error error = FT_Err_Ok; + FT_Int pitch = source->pitch; + FT_ULong size; + + + if ( source == target ) + return FT_Err_Ok; + + if ( source->buffer == NULL ) + { + *target = *source; + + return FT_Err_Ok; + } + + if ( pitch < 0 ) + pitch = -pitch; + size = (FT_ULong)( pitch * source->rows ); + + if ( target->buffer ) + { + FT_Int target_pitch = target->pitch; + FT_ULong target_size; + + + if ( target_pitch < 0 ) + target_pitch = -target_pitch; + target_size = (FT_ULong)( target_pitch * target->rows ); + + if ( target_size != size ) + (void)FT_QREALLOC( target->buffer, target_size, size ); + } + else + (void)FT_QALLOC( target->buffer, size ); + + if ( !error ) + { + unsigned char *p; + + + p = target->buffer; + *target = *source; + target->buffer = p; + + FT_MEM_COPY( target->buffer, source->buffer, size ); + } + + return error; + } + + + static FT_Error + ft_bitmap_assure_buffer( FT_Memory memory, + FT_Bitmap* bitmap, + FT_UInt xpixels, + FT_UInt ypixels ) + { + FT_Error error; + int pitch; + int new_pitch; + FT_UInt bpp; + FT_Int i, width, height; + unsigned char* buffer; + + + width = bitmap->width; + height = bitmap->rows; + pitch = bitmap->pitch; + if ( pitch < 0 ) + pitch = -pitch; + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + bpp = 1; + new_pitch = ( width + xpixels + 7 ) >> 3; + break; + case FT_PIXEL_MODE_GRAY2: + bpp = 2; + new_pitch = ( width + xpixels + 3 ) >> 2; + break; + case FT_PIXEL_MODE_GRAY4: + bpp = 4; + new_pitch = ( width + xpixels + 1 ) >> 1; + break; + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + bpp = 8; + new_pitch = ( width + xpixels ); + break; + default: + return FT_Err_Invalid_Glyph_Format; + } + + /* if no need to allocate memory */ + if ( ypixels == 0 && new_pitch <= pitch ) + { + /* zero the padding */ + FT_Int bit_width = pitch * 8; + FT_Int bit_last = ( width + xpixels ) * bpp; + + + if ( bit_last < bit_width ) + { + FT_Byte* line = bitmap->buffer + ( bit_last >> 3 ); + FT_Byte* end = bitmap->buffer + pitch; + FT_Int shift = bit_last & 7; + FT_UInt mask = 0xFF00U >> shift; + FT_Int count = height; + + + for ( ; count > 0; count--, line += pitch, end += pitch ) + { + FT_Byte* write = line; + + + if ( shift > 0 ) + { + write[0] = (FT_Byte)( write[0] & mask ); + write++; + } + if ( write < end ) + FT_MEM_ZERO( write, end-write ); + } + } + + return FT_Err_Ok; + } + + if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) ) + return error; + + if ( bitmap->pitch > 0 ) + { + FT_Int len = ( width * bpp + 7 ) >> 3; + + + for ( i = 0; i < bitmap->rows; i++ ) + FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ), + bitmap->buffer + pitch * i, len ); + } + else + { + FT_Int len = ( width * bpp + 7 ) >> 3; + + + for ( i = 0; i < bitmap->rows; i++ ) + FT_MEM_COPY( buffer + new_pitch * i, + bitmap->buffer + pitch * i, len ); + } + + FT_FREE( bitmap->buffer ); + bitmap->buffer = buffer; + + if ( bitmap->pitch < 0 ) + new_pitch = -new_pitch; + + /* set pitch only, width and height are left untouched */ + bitmap->pitch = new_pitch; + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ) + { + FT_Error error; + unsigned char* p; + FT_Int i, x, y, pitch; + FT_Int xstr, ystr; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !bitmap || !bitmap->buffer ) + return FT_Err_Invalid_Argument; + + if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) || + ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) ) + return FT_Err_Invalid_Argument; + + xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6; + ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6; + + if ( xstr == 0 && ystr == 0 ) + return FT_Err_Ok; + else if ( xstr < 0 || ystr < 0 ) + return FT_Err_Invalid_Argument; + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + { + FT_Bitmap tmp; + FT_Int align; + + + if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 ) + align = ( bitmap->width + xstr + 3 ) / 4; + else + align = ( bitmap->width + xstr + 1 ) / 2; + + FT_Bitmap_New( &tmp ); + + error = FT_Bitmap_Convert( library, bitmap, &tmp, align ); + if ( error ) + return error; + + FT_Bitmap_Done( library, bitmap ); + *bitmap = tmp; + } + break; + + case FT_PIXEL_MODE_MONO: + if ( xstr > 8 ) + xstr = 8; + break; + + case FT_PIXEL_MODE_LCD: + xstr *= 3; + break; + + case FT_PIXEL_MODE_LCD_V: + ystr *= 3; + break; + } + + error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr ); + if ( error ) + return error; + + pitch = bitmap->pitch; + if ( pitch > 0 ) + p = bitmap->buffer + pitch * ystr; + else + { + pitch = -pitch; + p = bitmap->buffer + pitch * ( bitmap->rows - 1 ); + } + + /* for each row */ + for ( y = 0; y < bitmap->rows ; y++ ) + { + /* + * Horizontally: + * + * From the last pixel on, make each pixel or'ed with the + * `xstr' pixels before it. + */ + for ( x = pitch - 1; x >= 0; x-- ) + { + unsigned char tmp; + + + tmp = p[x]; + for ( i = 1; i <= xstr; i++ ) + { + if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO ) + { + p[x] |= tmp >> i; + + /* the maximum value of 8 for `xstr' comes from here */ + if ( x > 0 ) + p[x] |= p[x - 1] << ( 8 - i ); + +#if 0 + if ( p[x] == 0xff ) + break; +#endif + } + else + { + if ( x - i >= 0 ) + { + if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) + { + p[x] = (unsigned char)(bitmap->num_grays - 1); + break; + } + else + { + p[x] = (unsigned char)(p[x] + p[x-i]); + if ( p[x] == bitmap->num_grays - 1 ) + break; + } + } + else + break; + } + } + } + + /* + * Vertically: + * + * Make the above `ystr' rows or'ed with it. + */ + for ( x = 1; x <= ystr; x++ ) + { + unsigned char* q; + + + q = p - bitmap->pitch * x; + for ( i = 0; i < pitch; i++ ) + q[i] |= p[i]; + } + + p += bitmap->pitch; + } + + bitmap->width += xstr; + bitmap->rows += ystr; + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + memory = library->memory; + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + { + FT_Int pad; + FT_Long old_size; + + + old_size = target->rows * target->pitch; + if ( old_size < 0 ) + old_size = -old_size; + + target->pixel_mode = FT_PIXEL_MODE_GRAY; + target->rows = source->rows; + target->width = source->width; + + pad = 0; + if ( alignment > 0 ) + { + pad = source->width % alignment; + if ( pad != 0 ) + pad = alignment - pad; + } + + target->pitch = source->width + pad; + + if ( target->rows * target->pitch > old_size && + FT_QREALLOC( target->buffer, + old_size, target->rows * target->pitch ) ) + return error; + } + break; + + default: + error = FT_Err_Invalid_Argument; + } + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 2; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 3; j > 0; j-- ) + { + FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ + + + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); + tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); + tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); + tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); + tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); + tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); + tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); + tt[7] = (FT_Byte)( val & 0x01 ); + + tt += 8; + ss += 1; + } + + /* get remaining pixels (if any) */ + j = source->width & 7; + if ( j > 0 ) + { + FT_Int val = *ss; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); + val <<= 1; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + { + FT_Int width = source->width; + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int s_pitch = source->pitch; + FT_Int t_pitch = target->pitch; + FT_Int i; + + + target->num_grays = 256; + + for ( i = source->rows; i > 0; i-- ) + { + FT_ARRAY_COPY( t, s, width ); + + s += s_pitch; + t += t_pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY2: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 4; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 2; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 ); + tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 ); + tt[3] = (FT_Byte)( ( val & 0x03 ) ); + + ss += 1; + tt += 4; + } + + j = source->width & 3; + if ( j > 0 ) + { + FT_Int val = ss[0]; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + val <<= 2; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY4: + { + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + FT_Int i; + + + target->num_grays = 16; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_Int j; + + + /* get the full bytes */ + for ( j = source->width >> 1; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 ); + tt[1] = (FT_Byte)( ( val & 0x0F ) ); + + ss += 1; + tt += 2; + } + + if ( source->width & 1 ) + tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); + + s += source->pitch; + t += target->pitch; + } + } + break; + + + default: + ; + } + + return error; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ) + { + if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP && + !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Bitmap bitmap; + FT_Error error; + + + FT_Bitmap_New( &bitmap ); + error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap ); + if ( error ) + return error; + + slot->bitmap = bitmap; + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ) + { + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !bitmap ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + FT_FREE( bitmap->buffer ); + *bitmap = null_bitmap; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftcalc.c b/alienblaster/project/jni/freetype/src/base/ftcalc.c new file mode 100644 index 000000000..3892fabfe --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftcalc.c @@ -0,0 +1,957 @@ +/***************************************************************************/ +/* */ +/* ftcalc.c */ +/* */ +/* Arithmetic computations (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Support for 1-complement arithmetic has been totally dropped in this */ + /* release. You can still write your own code if you need it. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Implementing basic computation routines. */ + /* */ + /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */ + /* and FT_FloorFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_GLYPH_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + +#ifdef FT_MULFIX_INLINED +#undef FT_MulFix +#endif + +/* we need to define a 64-bits data type here */ + +#ifdef FT_LONG64 + + typedef FT_INT64 FT_Int64; + +#else + + typedef struct FT_Int64_ + { + FT_UInt32 lo; + FT_UInt32 hi; + + } FT_Int64; + +#endif /* FT_LONG64 */ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_calc + + + /* The following three functions are available regardless of whether */ + /* FT_LONG64 is defined. */ + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_RoundFix( FT_Fixed a ) + { + return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL + : -((-a + 0x8000L ) & ~0xFFFFL ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_CeilFix( FT_Fixed a ) + { + return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL + : -((-a + 0xFFFFL ) & ~0xFFFFL ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_FloorFix( FT_Fixed a ) + { + return ( a >= 0 ) ? a & ~0xFFFFL + : -((-a) & ~0xFFFFL ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( FT_Int32 ) + FT_Sqrt32( FT_Int32 x ) + { + FT_UInt32 val, root, newroot, mask; + + + root = 0; + mask = (FT_UInt32)0x40000000UL; + val = (FT_UInt32)x; + + do + { + newroot = root + mask; + if ( newroot <= val ) + { + val -= newroot; + root = newroot + mask; + } + + root >>= 1; + mask >>= 2; + + } while ( mask != 0 ); + + return root; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +#ifdef FT_LONG64 + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( a, b ); + +#else + + FT_Int s = 1; + FT_Long c; + + + if ( a < 0 ) + { + a = -a; + s = -1; + } + + if ( b < 0 ) + { + b = -b; + s = -s; + } + + c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 ); + + return ( s > 0 ) ? c : -c; + +#endif /* FT_MULFIX_ASSEMBLER */ + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ) + { + FT_Int32 s; + FT_UInt32 q; + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + + if ( b == 0 ) + /* check for division by 0 */ + q = 0x7FFFFFFFL; + else + /* compute result directly */ + q = (FT_UInt32)( ( ( (FT_Int64)a << 16 ) + ( b >> 1 ) ) / b ); + + return ( s < 0 ? -(FT_Long)q : (FT_Long)q ); + } + + +#else /* !FT_LONG64 */ + + + static void + ft_multo64( FT_UInt32 x, + FT_UInt32 y, + FT_Int64 *z ) + { + FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; + + + lo1 = x & 0x0000FFFFU; hi1 = x >> 16; + lo2 = y & 0x0000FFFFU; hi2 = y >> 16; + + lo = lo1 * lo2; + i1 = lo1 * hi2; + i2 = lo2 * hi1; + hi = hi1 * hi2; + + /* Check carry overflow of i1 + i2 */ + i1 += i2; + hi += (FT_UInt32)( i1 < i2 ) << 16; + + hi += i1 >> 16; + i1 = i1 << 16; + + /* Check carry overflow of i1 + lo */ + lo += i1; + hi += ( lo < i1 ); + + z->lo = lo; + z->hi = hi; + } + + + static FT_UInt32 + ft_div64by32( FT_UInt32 hi, + FT_UInt32 lo, + FT_UInt32 y ) + { + FT_UInt32 r, q; + FT_Int i; + + + q = 0; + r = hi; + + if ( r >= y ) + return (FT_UInt32)0x7FFFFFFFL; + + i = 32; + do + { + r <<= 1; + q <<= 1; + r |= lo >> 31; + + if ( r >= (FT_UInt32)y ) + { + r -= y; + q |= 1; + } + lo <<= 1; + } while ( --i ); + + return q; + } + + + static void + FT_Add64( FT_Int64* x, + FT_Int64* y, + FT_Int64 *z ) + { + register FT_UInt32 lo, hi; + + + lo = x->lo + y->lo; + hi = x->hi + y->hi + ( lo < x->lo ); + + z->lo = lo; + z->hi = hi; + } + + + /* documentation is in freetype.h */ + + /* The FT_MulDiv function has been optimized thanks to ideas from */ + /* Graham Asher. The trick is to optimize computation when everything */ + /* fits within 32-bits (a rather common case). */ + /* */ + /* we compute 'a*b+c/2', then divide it by 'c'. (positive values) */ + /* */ + /* 46340 is FLOOR(SQRT(2^31-1)). */ + /* */ + /* if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 ) */ + /* */ + /* 0x7FFFFFFF - 0x7FFEA810 = 0x157F0 */ + /* */ + /* if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF ) */ + /* */ + /* and 2*0x157F0 = 176096 */ + /* */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + long s; + + + /* XXX: this function does not allow 64-bit arguments */ + if ( a == 0 || b == c ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + s ^= c; c = FT_ABS( c ); + + if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 ) + a = ( a * b + ( c >> 1 ) ) / c; + + else if ( c > 0 ) + { + FT_Int64 temp, temp2; + + + ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); + + temp2.hi = 0; + temp2.lo = (FT_UInt32)(c >> 1); + FT_Add64( &temp, &temp2, &temp ); + a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); + } + else + a = 0x7FFFFFFFL; + + return ( s < 0 ? -a : a ); + } + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + long s; + + + if ( a == 0 || b == c ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + s ^= c; c = FT_ABS( c ); + + if ( a <= 46340L && b <= 46340L && c > 0 ) + a = a * b / c; + + else if ( c > 0 ) + { + FT_Int64 temp; + + + ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp ); + a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c ); + } + else + a = 0x7FFFFFFFL; + + return ( s < 0 ? -a : a ); + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( a, b ); + +#elif 0 + + /* + * This code is nonportable. See comment below. + * + * However, on a platform where right-shift of a signed quantity fills + * the leftmost bits by copying the sign bit, it might be faster. + */ + + FT_Long sa, sb; + FT_ULong ua, ub; + + + if ( a == 0 || b == 0x10000L ) + return a; + + /* + * This is a clever way of converting a signed number `a' into its + * absolute value (stored back into `a') and its sign. The sign is + * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' + * was negative. (Similarly for `b' and `sb'). + * + * Unfortunately, it doesn't work (at least not portably). + * + * It makes the assumption that right-shift on a negative signed value + * fills the leftmost bits by copying the sign bit. This is wrong. + * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, + * the result of right-shift of a negative signed value is + * implementation-defined. At least one implementation fills the + * leftmost bits with 0s (i.e., it is exactly the same as an unsigned + * right shift). This means that when `a' is negative, `sa' ends up + * with the value 1 rather than -1. After that, everything else goes + * wrong. + */ + sa = ( a >> ( sizeof ( a ) * 8 - 1 ) ); + a = ( a ^ sa ) - sa; + sb = ( b >> ( sizeof ( b ) * 8 - 1 ) ); + b = ( b ^ sb ) - sb; + + ua = (FT_ULong)a; + ub = (FT_ULong)b; + + if ( ua <= 2048 && ub <= 1048576L ) + ua = ( ua * ub + 0x8000U ) >> 16; + else + { + FT_ULong al = ua & 0xFFFFU; + + + ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + + ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 ); + } + + sa ^= sb, + ua = (FT_ULong)(( ua ^ sa ) - sa); + + return (FT_Long)ua; + +#else /* 0 */ + + FT_Long s; + FT_ULong ua, ub; + + + if ( a == 0 || b == 0x10000L ) + return a; + + s = a; a = FT_ABS( a ); + s ^= b; b = FT_ABS( b ); + + ua = (FT_ULong)a; + ub = (FT_ULong)b; + + if ( ua <= 2048 && ub <= 1048576L ) + ua = ( ua * ub + 0x8000UL ) >> 16; + else + { + FT_ULong al = ua & 0xFFFFUL; + + + ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) + + ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 ); + } + + return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua ); + +#endif /* 0 */ + + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ) + { + FT_Int32 s; + FT_UInt32 q; + + + /* XXX: this function does not allow 64-bit arguments */ + s = (FT_Int32)a; a = FT_ABS( a ); + s ^= (FT_Int32)b; b = FT_ABS( b ); + + if ( b == 0 ) + { + /* check for division by 0 */ + q = (FT_UInt32)0x7FFFFFFFL; + } + else if ( ( a >> 16 ) == 0 ) + { + /* compute result directly */ + q = (FT_UInt32)( (a << 16) + (b >> 1) ) / (FT_UInt32)b; + } + else + { + /* we need more bits; we have to do it by hand */ + FT_Int64 temp, temp2; + + temp.hi = (FT_Int32) (a >> 16); + temp.lo = (FT_UInt32)(a << 16); + temp2.hi = 0; + temp2.lo = (FT_UInt32)( b >> 1 ); + FT_Add64( &temp, &temp2, &temp ); + q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b ); + } + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + +#if 0 + + /* documentation is in ftcalc.h */ + + FT_EXPORT_DEF( void ) + FT_MulTo64( FT_Int32 x, + FT_Int32 y, + FT_Int64 *z ) + { + FT_Int32 s; + + + s = x; x = FT_ABS( x ); + s ^= y; y = FT_ABS( y ); + + ft_multo64( x, y, z ); + + if ( s < 0 ) + { + z->lo = (FT_UInt32)-(FT_Int32)z->lo; + z->hi = ~z->hi + !( z->lo ); + } + } + + + /* apparently, the second version of this code is not compiled correctly */ + /* on Mac machines with the MPW C compiler.. tsk, tsk, tsk... */ + +#if 1 + + FT_EXPORT_DEF( FT_Int32 ) + FT_Div64by32( FT_Int64* x, + FT_Int32 y ) + { + FT_Int32 s; + FT_UInt32 q, r, i, lo; + + + s = x->hi; + if ( s < 0 ) + { + x->lo = (FT_UInt32)-(FT_Int32)x->lo; + x->hi = ~x->hi + !x->lo; + } + s ^= y; y = FT_ABS( y ); + + /* Shortcut */ + if ( x->hi == 0 ) + { + if ( y > 0 ) + q = x->lo / y; + else + q = 0x7FFFFFFFL; + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + r = x->hi; + lo = x->lo; + + if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */ + return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL ); + /* Return Max/Min Int32 if division overflow. */ + /* This includes division by zero! */ + q = 0; + for ( i = 0; i < 32; i++ ) + { + r <<= 1; + q <<= 1; + r |= lo >> 31; + + if ( r >= (FT_UInt32)y ) + { + r -= y; + q |= 1; + } + lo <<= 1; + } + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + +#else /* 0 */ + + FT_EXPORT_DEF( FT_Int32 ) + FT_Div64by32( FT_Int64* x, + FT_Int32 y ) + { + FT_Int32 s; + FT_UInt32 q; + + + s = x->hi; + if ( s < 0 ) + { + x->lo = (FT_UInt32)-(FT_Int32)x->lo; + x->hi = ~x->hi + !x->lo; + } + s ^= y; y = FT_ABS( y ); + + /* Shortcut */ + if ( x->hi == 0 ) + { + if ( y > 0 ) + q = ( x->lo + ( y >> 1 ) ) / y; + else + q = 0x7FFFFFFFL; + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + + q = ft_div64by32( x->hi, x->lo, y ); + + return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q ); + } + +#endif /* 0 */ + +#endif /* 0 */ + + +#endif /* FT_LONG64 */ + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix *b ) + { + FT_Fixed xx, xy, yx, yy; + + + if ( !a || !b ) + return; + + xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx ); + xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy ); + yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx ); + yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy ); + + b->xx = xx; b->xy = xy; + b->yx = yx; b->yy = yy; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ) + { + FT_Pos delta, xx, yy; + + + if ( !matrix ) + return FT_Err_Invalid_Argument; + + /* compute discriminant */ + delta = FT_MulFix( matrix->xx, matrix->yy ) - + FT_MulFix( matrix->xy, matrix->yx ); + + if ( !delta ) + return FT_Err_Invalid_Argument; /* matrix can't be inverted */ + + matrix->xy = - FT_DivFix( matrix->xy, delta ); + matrix->yx = - FT_DivFix( matrix->yx, delta ); + + xx = matrix->xx; + yy = matrix->yy; + + matrix->xx = FT_DivFix( yy, delta ); + matrix->yy = FT_DivFix( xx, delta ); + + return FT_Err_Ok; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ) + { + FT_Fixed xx, xy, yx, yy; + + FT_Long val = 0x10000L * scaling; + + + if ( !a || !b ) + return; + + xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val ); + xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val ); + yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val ); + yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val ); + + b->xx = xx; b->xy = xy; + b->yx = yx; b->yy = yy; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ) + { + FT_Pos xz, yz; + + FT_Long val = 0x10000L * scaling; + + + if ( !vector || !matrix ) + return; + + xz = FT_MulDiv( vector->x, matrix->xx, val ) + + FT_MulDiv( vector->y, matrix->xy, val ); + + yz = FT_MulDiv( vector->x, matrix->yx, val ) + + FT_MulDiv( vector->y, matrix->yy, val ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ) + { + FT_UInt32 root, rem_hi, rem_lo, test_div; + FT_Int count; + + + root = 0; + + if ( x > 0 ) + { + rem_hi = 0; + rem_lo = x; + count = 24; + do + { + rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); + rem_lo <<= 2; + root <<= 1; + test_div = ( root << 1 ) + 1; + + if ( rem_hi >= test_div ) + { + rem_hi -= test_div; + root += 1; + } + } while ( --count ); + } + + return (FT_Int32)root; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Long result; /* avoid overflow on 16-bit system */ + + + /* deal with the trivial cases quickly */ + if ( in_y == 0 ) + { + if ( in_x >= 0 ) + result = out_y; + else + result = -out_y; + } + else if ( in_x == 0 ) + { + if ( in_y >= 0 ) + result = -out_x; + else + result = out_x; + } + else if ( out_y == 0 ) + { + if ( out_x >= 0 ) + result = in_y; + else + result = -in_y; + } + else if ( out_x == 0 ) + { + if ( out_y >= 0 ) + result = -in_x; + else + result = in_x; + } + else /* general case */ + { +#ifdef FT_LONG64 + + FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x; + + + if ( delta == 0 ) + result = 0; + else + result = 1 - 2 * ( delta < 0 ); + +#else + + FT_Int64 z1, z2; + + + /* XXX: this function does not allow 64-bit arguments */ + ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 ); + ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 ); + + if ( z1.hi > z2.hi ) + result = +1; + else if ( z1.hi < z2.hi ) + result = -1; + else if ( z1.lo > z2.lo ) + result = +1; + else if ( z1.lo < z2.lo ) + result = -1; + else + result = 0; + +#endif + } + + /* XXX: only the sign of return value, +1/0/-1 must be used */ + return (FT_Int)result; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Pos ax = in_x; + FT_Pos ay = in_y; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = out_x; + if ( ax < 0 ) + ax = -ax; + ay = out_y; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = out_x + in_x; + if ( ax < 0 ) + ax = -ax; + ay = out_y + in_y; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftcid.c b/alienblaster/project/jni/freetype/src/base/ftcid.c new file mode 100644 index 000000000..733aae147 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftcid.c @@ -0,0 +1,117 @@ +/***************************************************************************/ +/* */ +/* ftcid.c */ +/* */ +/* FreeType API for accessing CID font information. */ +/* */ +/* Copyright 2007, 2009 by Derek Clegg, Michael Toftdal. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CID_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_CID_H + + + /* documentation is in ftcid.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement) + { + FT_Error error; + const char* r = NULL; + const char* o = NULL; + FT_Int s = 0; + + + error = FT_Err_Invalid_Argument; + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_ros ) + error = service->get_ros( face, &r, &o, &s ); + } + + if ( registry ) + *registry = r; + + if ( ordering ) + *ordering = o; + + if ( supplement ) + *supplement = s; + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Bool ic = 0; + + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_is_cid ) + error = service->get_is_cid( face, &ic); + } + + if ( is_cid ) + *is_cid = ic; + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_UInt c = 0; + + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_cid_from_glyph_index ) + error = service->get_cid_from_glyph_index( face, glyph_index, &c); + } + + if ( cid ) + *cid = c; + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftdbgmem.c b/alienblaster/project/jni/freetype/src/base/ftdbgmem.c new file mode 100644 index 000000000..160269d19 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftdbgmem.c @@ -0,0 +1,997 @@ +/***************************************************************************/ +/* */ +/* ftdbgmem.c */ +/* */ +/* Memory debugger (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_MEMORY_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +#ifdef FT_DEBUG_MEMORY + +#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released + * to the heap. This is useful to detect double-frees + * or weird heap corruption, but it uses large amounts of + * memory, however. + */ + +#include FT_CONFIG_STANDARD_LIBRARY_H + + FT_BASE_DEF( const char* ) _ft_debug_file = 0; + FT_BASE_DEF( long ) _ft_debug_lineno = 0; + + extern void + FT_DumpMemory( FT_Memory memory ); + + + typedef struct FT_MemSourceRec_* FT_MemSource; + typedef struct FT_MemNodeRec_* FT_MemNode; + typedef struct FT_MemTableRec_* FT_MemTable; + + +#define FT_MEM_VAL( addr ) ((FT_ULong)(FT_Pointer)( addr )) + + /* + * This structure holds statistics for a single allocation/release + * site. This is useful to know where memory operations happen the + * most. + */ + typedef struct FT_MemSourceRec_ + { + const char* file_name; + long line_no; + + FT_Long cur_blocks; /* current number of allocated blocks */ + FT_Long max_blocks; /* max. number of allocated blocks */ + FT_Long all_blocks; /* total number of blocks allocated */ + + FT_Long cur_size; /* current cumulative allocated size */ + FT_Long max_size; /* maximum cumulative allocated size */ + FT_Long all_size; /* total cumulative allocated size */ + + FT_Long cur_max; /* current maximum allocated size */ + + FT_UInt32 hash; + FT_MemSource link; + + } FT_MemSourceRec; + + + /* + * We don't need a resizable array for the memory sources, because + * their number is pretty limited within FreeType. + */ +#define FT_MEM_SOURCE_BUCKETS 128 + + /* + * This structure holds information related to a single allocated + * memory block. If KEEPALIVE is defined, blocks that are freed by + * FreeType are never released to the system. Instead, their `size' + * field is set to -size. This is mainly useful to detect double frees, + * at the price of large memory footprint during execution. + */ + typedef struct FT_MemNodeRec_ + { + FT_Byte* address; + FT_Long size; /* < 0 if the block was freed */ + + FT_MemSource source; + +#ifdef KEEPALIVE + const char* free_file_name; + FT_Long free_line_no; +#endif + + FT_MemNode link; + + } FT_MemNodeRec; + + + /* + * The global structure, containing compound statistics and all hash + * tables. + */ + typedef struct FT_MemTableRec_ + { + FT_ULong size; + FT_ULong nodes; + FT_MemNode* buckets; + + FT_ULong alloc_total; + FT_ULong alloc_current; + FT_ULong alloc_max; + FT_ULong alloc_count; + + FT_Bool bound_total; + FT_ULong alloc_total_max; + + FT_Bool bound_count; + FT_ULong alloc_count_max; + + FT_MemSource sources[FT_MEM_SOURCE_BUCKETS]; + + FT_Bool keep_alive; + + FT_Memory memory; + FT_Pointer memory_user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemTableRec; + + +#define FT_MEM_SIZE_MIN 7 +#define FT_MEM_SIZE_MAX 13845163 + +#define FT_FILENAME( x ) ((x) ? (x) : "unknown file") + + + /* + * Prime numbers are ugly to handle. It would be better to implement + * L-Hashing, which is 10% faster and doesn't require divisions. + */ + static const FT_UInt ft_mem_primes[] = + { + 7, + 11, + 19, + 37, + 73, + 109, + 163, + 251, + 367, + 557, + 823, + 1237, + 1861, + 2777, + 4177, + 6247, + 9371, + 14057, + 21089, + 31627, + 47431, + 71143, + 106721, + 160073, + 240101, + 360163, + 540217, + 810343, + 1215497, + 1823231, + 2734867, + 4102283, + 6153409, + 9230113, + 13845163, + }; + + + static FT_ULong + ft_mem_closest_prime( FT_ULong num ) + { + FT_UInt i; + + + for ( i = 0; + i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ ) + if ( ft_mem_primes[i] > num ) + return ft_mem_primes[i]; + + return FT_MEM_SIZE_MAX; + } + + + extern void + ft_mem_debug_panic( const char* fmt, + ... ) + { + va_list ap; + + + printf( "FreeType.Debug: " ); + + va_start( ap, fmt ); + vprintf( fmt, ap ); + va_end( ap ); + + printf( "\n" ); + exit( EXIT_FAILURE ); + } + + + static FT_Pointer + ft_mem_table_alloc( FT_MemTable table, + FT_Long size ) + { + FT_Memory memory = table->memory; + FT_Pointer block; + + + memory->user = table->memory_user; + block = table->alloc( memory, size ); + memory->user = table; + + return block; + } + + + static void + ft_mem_table_free( FT_MemTable table, + FT_Pointer block ) + { + FT_Memory memory = table->memory; + + + memory->user = table->memory_user; + table->free( memory, block ); + memory->user = table; + } + + + static void + ft_mem_table_resize( FT_MemTable table ) + { + FT_ULong new_size; + + + new_size = ft_mem_closest_prime( table->nodes ); + if ( new_size != table->size ) + { + FT_MemNode* new_buckets; + FT_ULong i; + + + new_buckets = (FT_MemNode *) + ft_mem_table_alloc( table, + new_size * sizeof ( FT_MemNode ) ); + if ( new_buckets == NULL ) + return; + + FT_ARRAY_ZERO( new_buckets, new_size ); + + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode node, next, *pnode; + FT_ULong hash; + + + node = table->buckets[i]; + while ( node ) + { + next = node->link; + hash = FT_MEM_VAL( node->address ) % new_size; + pnode = new_buckets + hash; + + node->link = pnode[0]; + pnode[0] = node; + + node = next; + } + } + + if ( table->buckets ) + ft_mem_table_free( table, table->buckets ); + + table->buckets = new_buckets; + table->size = new_size; + } + } + + + static FT_MemTable + ft_mem_table_new( FT_Memory memory ) + { + FT_MemTable table; + + + table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); + if ( table == NULL ) + goto Exit; + + FT_ZERO( table ); + + table->size = FT_MEM_SIZE_MIN; + table->nodes = 0; + + table->memory = memory; + + table->memory_user = memory->user; + + table->alloc = memory->alloc; + table->realloc = memory->realloc; + table->free = memory->free; + + table->buckets = (FT_MemNode *) + memory->alloc( memory, + table->size * sizeof ( FT_MemNode ) ); + if ( table->buckets ) + FT_ARRAY_ZERO( table->buckets, table->size ); + else + { + memory->free( memory, table ); + table = NULL; + } + + Exit: + return table; + } + + + static void + ft_mem_table_destroy( FT_MemTable table ) + { + FT_ULong i; + + + FT_DumpMemory( table->memory ); + + if ( table ) + { + FT_Long leak_count = 0; + FT_ULong leaks = 0; + + + /* remove all blocks from the table, revealing leaked ones */ + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode *pnode = table->buckets + i, next, node = *pnode; + + + while ( node ) + { + next = node->link; + node->link = 0; + + if ( node->size > 0 ) + { + printf( + "leaked memory block at address %p, size %8ld in (%s:%ld)\n", + node->address, node->size, + FT_FILENAME( node->source->file_name ), + node->source->line_no ); + + leak_count++; + leaks += node->size; + + ft_mem_table_free( table, node->address ); + } + + node->address = NULL; + node->size = 0; + + ft_mem_table_free( table, node ); + node = next; + } + table->buckets[i] = 0; + } + + ft_mem_table_free( table, table->buckets ); + table->buckets = NULL; + + table->size = 0; + table->nodes = 0; + + /* remove all sources */ + for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) + { + FT_MemSource source, next; + + + for ( source = table->sources[i]; source != NULL; source = next ) + { + next = source->link; + ft_mem_table_free( table, source ); + } + + table->sources[i] = NULL; + } + + printf( + "FreeType: total memory allocations = %ld\n", table->alloc_total ); + printf( + "FreeType: maximum memory footprint = %ld\n", table->alloc_max ); + + ft_mem_table_free( table, table ); + + if ( leak_count > 0 ) + ft_mem_debug_panic( + "FreeType: %ld bytes of memory leaked in %ld blocks\n", + leaks, leak_count ); + + printf( "FreeType: no memory leaks detected\n" ); + } + } + + + static FT_MemNode* + ft_mem_table_get_nodep( FT_MemTable table, + FT_Byte* address ) + { + FT_ULong hash; + FT_MemNode *pnode, node; + + + hash = FT_MEM_VAL( address ); + pnode = table->buckets + ( hash % table->size ); + + for (;;) + { + node = pnode[0]; + if ( !node ) + break; + + if ( node->address == address ) + break; + + pnode = &node->link; + } + return pnode; + } + + + static FT_MemSource + ft_mem_table_get_source( FT_MemTable table ) + { + FT_UInt32 hash; + FT_MemSource node, *pnode; + + + /* cast to FT_PtrDist first since void* can be larger */ + /* than FT_UInt32 and GCC 4.1.1 emits a warning */ + hash = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file + + (FT_UInt32)( 5 * _ft_debug_lineno ); + pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS]; + + for ( ;; ) + { + node = *pnode; + if ( node == NULL ) + break; + + if ( node->file_name == _ft_debug_file && + node->line_no == _ft_debug_lineno ) + goto Exit; + + pnode = &node->link; + } + + node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( node == NULL ) + ft_mem_debug_panic( + "not enough memory to perform memory debugging\n" ); + + node->file_name = _ft_debug_file; + node->line_no = _ft_debug_lineno; + + node->cur_blocks = 0; + node->max_blocks = 0; + node->all_blocks = 0; + + node->cur_size = 0; + node->max_size = 0; + node->all_size = 0; + + node->cur_max = 0; + + node->link = NULL; + node->hash = hash; + *pnode = node; + + Exit: + return node; + } + + + static void + ft_mem_table_set( FT_MemTable table, + FT_Byte* address, + FT_ULong size, + FT_Long delta ) + { + FT_MemNode *pnode, node; + + + if ( table ) + { + FT_MemSource source; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + if ( node->size < 0 ) + { + /* This block was already freed. Our memory is now completely */ + /* corrupted! */ + /* This can only happen in keep-alive mode. */ + ft_mem_debug_panic( + "memory heap corrupted (allocating freed block)" ); + } + else + { + /* This block was already allocated. This means that our memory */ + /* is also corrupted! */ + ft_mem_debug_panic( + "memory heap corrupted (re-allocating allocated block at" + " %p, of size %ld)\n" + "org=%s:%d new=%s:%d\n", + node->address, node->size, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); + } + } + + /* we need to create a new node in this table */ + node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( node == NULL ) + ft_mem_debug_panic( "not enough memory to run memory tests" ); + + node->address = address; + node->size = size; + node->source = source = ft_mem_table_get_source( table ); + + if ( delta == 0 ) + { + /* this is an allocation */ + source->all_blocks++; + source->cur_blocks++; + if ( source->cur_blocks > source->max_blocks ) + source->max_blocks = source->cur_blocks; + } + + if ( size > (FT_ULong)source->cur_max ) + source->cur_max = size; + + if ( delta != 0 ) + { + /* we are growing or shrinking a reallocated block */ + source->cur_size += delta; + table->alloc_current += delta; + } + else + { + /* we are allocating a new block */ + source->cur_size += size; + table->alloc_current += size; + } + + source->all_size += size; + + if ( source->cur_size > source->max_size ) + source->max_size = source->cur_size; + + node->free_file_name = NULL; + node->free_line_no = 0; + + node->link = pnode[0]; + + pnode[0] = node; + table->nodes++; + + table->alloc_total += size; + + if ( table->alloc_current > table->alloc_max ) + table->alloc_max = table->alloc_current; + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + + + static void + ft_mem_table_remove( FT_MemTable table, + FT_Byte* address, + FT_Long delta ) + { + if ( table ) + { + FT_MemNode *pnode, node; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + FT_MemSource source; + + + if ( node->size < 0 ) + ft_mem_debug_panic( + "freeing memory block at %p more than once at (%s:%ld)\n" + "block allocated at (%s:%ld) and released at (%s:%ld)", + address, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( node->free_file_name ), node->free_line_no ); + + /* scramble the node's content for additional safety */ + FT_MEM_SET( address, 0xF3, node->size ); + + if ( delta == 0 ) + { + source = node->source; + + source->cur_blocks--; + source->cur_size -= node->size; + + table->alloc_current -= node->size; + } + + if ( table->keep_alive ) + { + /* we simply invert the node's size to indicate that the node */ + /* was freed. */ + node->size = -node->size; + node->free_file_name = _ft_debug_file; + node->free_line_no = _ft_debug_lineno; + } + else + { + table->nodes--; + + *pnode = node->link; + + node->size = 0; + node->source = NULL; + + ft_mem_table_free( table, node ); + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + else + ft_mem_debug_panic( + "trying to free unknown block at %p in (%s:%ld)\n", + address, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); + } + } + + + extern FT_Pointer + ft_mem_debug_alloc( FT_Memory memory, + FT_Long size ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_Byte* block; + + + if ( size <= 0 ) + ft_mem_debug_panic( "negative block size allocation (%ld)", size ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( table->bound_total && + table->alloc_total_max - table->alloc_current > (FT_ULong)size ) + return NULL; + + block = (FT_Byte *)ft_mem_table_alloc( table, size ); + if ( block ) + { + ft_mem_table_set( table, block, (FT_ULong)size, 0 ); + + table->alloc_count++; + } + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + + return (FT_Pointer)block; + } + + + extern void + ft_mem_debug_free( FT_Memory memory, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( block == NULL ) + ft_mem_debug_panic( "trying to free NULL in (%s:%ld)", + FT_FILENAME( _ft_debug_file ), + _ft_debug_lineno ); + + ft_mem_table_remove( table, (FT_Byte*)block, 0 ); + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + table->alloc_count--; + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + } + + + extern FT_Pointer + ft_mem_debug_realloc( FT_Memory memory, + FT_Long cur_size, + FT_Long new_size, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_MemNode node, *pnode; + FT_Pointer new_block; + FT_Long delta; + + const char* file_name = FT_FILENAME( _ft_debug_file ); + FT_Long line_no = _ft_debug_lineno; + + + /* unlikely, but possible */ + if ( new_size == cur_size ) + return block; + + /* the following is valid according to ANSI C */ +#if 0 + if ( block == NULL || cur_size == 0 ) + ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)", + file_name, line_no ); +#endif + + /* while the following is allowed in ANSI C also, we abort since */ + /* such case should be handled by FreeType. */ + if ( new_size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)", + block, cur_size, file_name, line_no ); + + /* check `cur_size' value */ + pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block ); + node = *pnode; + if ( !node ) + ft_mem_debug_panic( + "trying to reallocate unknown block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate freed block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size != cur_size ) + ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is " + "%ld instead of %ld in (%s:%ld)", + block, cur_size, node->size, file_name, line_no ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + delta = (FT_Long)( new_size - cur_size ); + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( delta > 0 && + table->bound_total && + table->alloc_current + (FT_ULong)delta > table->alloc_total_max ) + return NULL; + + new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size ); + if ( new_block == NULL ) + return NULL; + + ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta ); + + ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size ); + + ft_mem_table_remove( table, (FT_Byte*)block, delta ); + + _ft_debug_file = "<unknown>"; + _ft_debug_lineno = 0; + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + return new_block; + } + + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ) + { + FT_MemTable table; + FT_Int result = 0; + + + if ( getenv( "FT2_DEBUG_MEMORY" ) ) + { + table = ft_mem_table_new( memory ); + if ( table ) + { + const char* p; + + + memory->user = table; + memory->alloc = ft_mem_debug_alloc; + memory->realloc = ft_mem_debug_realloc; + memory->free = ft_mem_debug_free; + + p = getenv( "FT2_ALLOC_TOTAL_MAX" ); + if ( p != NULL ) + { + FT_Long total_max = ft_atol( p ); + + + if ( total_max > 0 ) + { + table->bound_total = 1; + table->alloc_total_max = (FT_ULong)total_max; + } + } + + p = getenv( "FT2_ALLOC_COUNT_MAX" ); + if ( p != NULL ) + { + FT_Long total_count = ft_atol( p ); + + + if ( total_count > 0 ) + { + table->bound_count = 1; + table->alloc_count_max = (FT_ULong)total_count; + } + } + + p = getenv( "FT2_KEEP_ALIVE" ); + if ( p != NULL ) + { + FT_Long keep_alive = ft_atol( p ); + + + if ( keep_alive > 0 ) + table->keep_alive = 1; + } + + result = 1; + } + } + return result; + } + + + extern void + ft_mem_debug_done( FT_Memory memory ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( table ) + { + memory->free = table->free; + memory->realloc = table->realloc; + memory->alloc = table->alloc; + + ft_mem_table_destroy( table ); + memory->user = NULL; + } + } + + + + static int + ft_mem_source_compare( const void* p1, + const void* p2 ) + { + FT_MemSource s1 = *(FT_MemSource*)p1; + FT_MemSource s2 = *(FT_MemSource*)p2; + + + if ( s2->max_size > s1->max_size ) + return 1; + else if ( s2->max_size < s1->max_size ) + return -1; + else + return 0; + } + + + extern void + FT_DumpMemory( FT_Memory memory ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( table ) + { + FT_MemSource* bucket = table->sources; + FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS; + FT_MemSource* sources; + FT_UInt nn, count; + const char* fmt; + + + count = 0; + for ( ; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + count++; + } + + sources = (FT_MemSource*)ft_mem_table_alloc( + table, sizeof ( *sources ) * count ); + + count = 0; + for ( bucket = table->sources; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + sources[count++] = source; + } + + ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare ); + + printf( "FreeType Memory Dump: " + "current=%ld max=%ld total=%ld count=%ld\n", + table->alloc_current, table->alloc_max, + table->alloc_total, table->alloc_count ); + printf( " block block sizes sizes sizes source\n" ); + printf( " count high sum highsum max location\n" ); + printf( "-------------------------------------------------\n" ); + + fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n"; + + for ( nn = 0; nn < count; nn++ ) + { + FT_MemSource source = sources[nn]; + + + printf( fmt, + source->cur_blocks, source->max_blocks, + source->cur_size, source->max_size, source->cur_max, + FT_FILENAME( source->file_name ), + source->line_no ); + } + printf( "------------------------------------------------\n" ); + + ft_mem_table_free( table, sources ); + } + } + +#else /* !FT_DEBUG_MEMORY */ + + /* ANSI C doesn't like empty source files */ + typedef int _debug_mem_dummy; + +#endif /* !FT_DEBUG_MEMORY */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftdebug.c b/alienblaster/project/jni/freetype/src/base/ftdebug.c new file mode 100644 index 000000000..2adbeabeb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftdebug.c @@ -0,0 +1,246 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H + + +#ifdef FT_DEBUG_LEVEL_ERROR + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the `FT2_DEBUG' environment variable. It must be a list of */ + /* toggles, separated by spaces, `;', or `,'. Example: */ + /* */ + /* export FT2_DEBUG="any:3 memory:7 stream:5" */ + /* */ + /* This requests that all levels be set to 3, except the trace level for */ + /* the memory and stream components which are set to 7 and 5, */ + /* respectively. */ + /* */ + /* See the file <include/freetype/internal/fttrace.h> for details of the */ + /* available toggle names. */ + /* */ + /* The level must be between 0 and 7; 0 means quiet (except for serious */ + /* runtime errors), and 7 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + const char* ft2_debug = getenv( "FT2_DEBUG" ); + + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p++ - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftfstype.c b/alienblaster/project/jni/freetype/src/base/ftfstype.c new file mode 100644 index 000000000..d0ef7b7c1 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftfstype.c @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* ftfstype.c */ +/* */ +/* FreeType utility file to access FSType data (body). */ +/* */ +/* Copyright 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_INFO_H + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ) + { + TT_OS2* os2; + + + /* first, try to get the fs_type directly from the font */ + if ( face ) + { + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_extra ) + { + PS_FontExtraRec extra; + + + if ( !service->ps_get_font_extra( face, &extra ) && + extra.fs_type != 0 ) + return extra.fs_type; + } + } + + /* look at FSType before fsType for Type42 */ + + if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL && + os2->version != 0xFFFFU ) + return os2->fsType; + + return 0; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftgasp.c b/alienblaster/project/jni/freetype/src/base/ftgasp.c new file mode 100644 index 000000000..8485d2925 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftgasp.c @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ftgasp.c */ +/* */ +/* Access of TrueType's `gasp' table (body). */ +/* */ +/* Copyright 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_GASP_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ) + { + FT_Int result = FT_GASP_NO_TABLE; + + + if ( face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->gasp.numRanges > 0 ) + { + TT_GaspRange range = ttface->gasp.gaspRanges; + TT_GaspRange range_end = range + ttface->gasp.numRanges; + + + while ( ppem > range->maxPPEM ) + { + range++; + if ( range >= range_end ) + goto Exit; + } + + result = range->gaspFlag; + + /* ensure that we don't have spurious bits */ + if ( ttface->gasp.version == 0 ) + result &= 3; + } + } + Exit: + return result; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftgloadr.c b/alienblaster/project/jni/freetype/src/base/ftgloadr.c new file mode 100644 index 000000000..ac0010ddd --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftgloadr.c @@ -0,0 +1,401 @@ +/***************************************************************************/ +/* */ +/* ftgloadr.c */ +/* */ +/* The FreeType glyph loader (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H + +#undef FT_COMPONENT +#define FT_COMPONENT trace_gloader + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** G L Y P H L O A D E R *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* The glyph loader is a simple object which is used to load a set of */ + /* glyphs easily. It is critical for the correct loading of composites. */ + /* */ + /* Ideally, one can see it as a stack of abstract `glyph' objects. */ + /* */ + /* loader.base Is really the bottom of the stack. It describes a */ + /* single glyph image made of the juxtaposition of */ + /* several glyphs (those `in the stack'). */ + /* */ + /* loader.current Describes the top of the stack, on which a new */ + /* glyph can be loaded. */ + /* */ + /* Rewind Clears the stack. */ + /* Prepare Set up `loader.current' for addition of a new glyph */ + /* image. */ + /* Add Add the `current' glyph image to the `base' one, */ + /* and prepare for another one. */ + /* */ + /* The glyph loader is now a base object. Each driver used to */ + /* re-implement it in one way or the other, which wasted code and */ + /* energy. */ + /* */ + /*************************************************************************/ + + + /* create a new glyph loader */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ) + { + FT_GlyphLoader loader; + FT_Error error; + + + if ( !FT_NEW( loader ) ) + { + loader->memory = memory; + *aloader = loader; + } + return error; + } + + + /* rewind the glyph loader - reset counters to 0 */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + base->outline.n_points = 0; + base->outline.n_contours = 0; + base->num_subglyphs = 0; + + *current = *base; + } + + + /* reset the glyph loader, frees all allocated tables */ + /* and starts from zero */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ) + { + FT_Memory memory = loader->memory; + + + FT_FREE( loader->base.outline.points ); + FT_FREE( loader->base.outline.tags ); + FT_FREE( loader->base.outline.contours ); + FT_FREE( loader->base.extra_points ); + FT_FREE( loader->base.subglyphs ); + + loader->base.extra_points2 = NULL; + + loader->max_points = 0; + loader->max_contours = 0; + loader->max_subglyphs = 0; + + FT_GlyphLoader_Rewind( loader ); + } + + + /* delete a glyph loader */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ) + { + if ( loader ) + { + FT_Memory memory = loader->memory; + + + FT_GlyphLoader_Reset( loader ); + FT_FREE( loader ); + } + } + + + /* re-adjust the `current' outline fields */ + static void + FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader ) + { + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + + + current->points = base->points + base->n_points; + current->tags = base->tags + base->n_points; + current->contours = base->contours + base->n_contours; + + /* handle extra points table - if any */ + if ( loader->use_extra ) + { + loader->current.extra_points = loader->base.extra_points + + base->n_points; + + loader->current.extra_points2 = loader->base.extra_points2 + + base->n_points; + } + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) + { + FT_Error error; + FT_Memory memory = loader->memory; + + + if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) + { + loader->use_extra = 1; + loader->base.extra_points2 = loader->base.extra_points + + loader->max_points; + + FT_GlyphLoader_Adjust_Points( loader ); + } + return error; + } + + + /* re-adjust the `current' subglyphs field */ + static void + FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + current->subglyphs = base->subglyphs + base->num_subglyphs; + } + + + /* Ensure that we can add `n_points' and `n_contours' to our glyph. */ + /* This function reallocates its outline tables if necessary. Note that */ + /* it DOESN'T change the number of points within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + FT_Bool adjust = 0; + + FT_UInt new_max, old_max; + + + /* check points & tags */ + new_max = base->n_points + current->n_points + n_points; + old_max = loader->max_points; + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + + if ( new_max > FT_OUTLINE_POINTS_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || + FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) + goto Exit; + + if ( loader->use_extra ) + { + if ( FT_RENEW_ARRAY( loader->base.extra_points, + old_max * 2, new_max * 2 ) ) + goto Exit; + + FT_ARRAY_MOVE( loader->base.extra_points + new_max, + loader->base.extra_points + old_max, + old_max ); + + loader->base.extra_points2 = loader->base.extra_points + new_max; + } + + adjust = 1; + loader->max_points = new_max; + } + + /* check contours */ + old_max = loader->max_contours; + new_max = base->n_contours + current->n_contours + + n_contours; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 4 ); + + if ( new_max > FT_OUTLINE_CONTOURS_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) + goto Exit; + + adjust = 1; + loader->max_contours = new_max; + } + + if ( adjust ) + FT_GlyphLoader_Adjust_Points( loader ); + + Exit: + return error; + } + + + /* Ensure that we can add `n_subglyphs' to our glyph. this function */ + /* reallocates its subglyphs table if necessary. Note that it DOES */ + /* NOT change the number of subglyphs within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_UInt new_max, old_max; + + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + new_max = base->num_subglyphs + current->num_subglyphs + n_subs; + old_max = loader->max_subglyphs; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 2 ); + if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) + goto Exit; + + loader->max_subglyphs = new_max; + + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + Exit: + return error; + } + + + /* prepare loader for the addition of a new glyph on top of the base one */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) + { + FT_GlyphLoad current = &loader->current; + + + current->outline.n_points = 0; + current->outline.n_contours = 0; + current->num_subglyphs = 0; + + FT_GlyphLoader_Adjust_Points ( loader ); + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + + /* add current glyph to the base image - and prepare for another */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ) + { + FT_GlyphLoad base; + FT_GlyphLoad current; + + FT_UInt n_curr_contours; + FT_UInt n_base_points; + FT_UInt n; + + + if ( !loader ) + return; + + base = &loader->base; + current = &loader->current; + + n_curr_contours = current->outline.n_contours; + n_base_points = base->outline.n_points; + + base->outline.n_points = + (short)( base->outline.n_points + current->outline.n_points ); + base->outline.n_contours = + (short)( base->outline.n_contours + current->outline.n_contours ); + + base->num_subglyphs += current->num_subglyphs; + + /* adjust contours count in newest outline */ + for ( n = 0; n < n_curr_contours; n++ ) + current->outline.contours[n] = + (short)( current->outline.contours[n] + n_base_points ); + + /* prepare for another new glyph image */ + FT_GlyphLoader_Prepare( loader ); + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ) + { + FT_Error error; + FT_UInt num_points = source->base.outline.n_points; + FT_UInt num_contours = source->base.outline.n_contours; + + + error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); + if ( !error ) + { + FT_Outline* out = &target->base.outline; + FT_Outline* in = &source->base.outline; + + + FT_ARRAY_COPY( out->points, in->points, + num_points ); + FT_ARRAY_COPY( out->tags, in->tags, + num_points ); + FT_ARRAY_COPY( out->contours, in->contours, + num_contours ); + + /* do we need to copy the extra points? */ + if ( target->use_extra && source->use_extra ) + { + FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, + num_points ); + FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2, + num_points ); + } + + out->n_points = (short)num_points; + out->n_contours = (short)num_contours; + + FT_GlyphLoader_Adjust_Points( target ); + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftglyph.c b/alienblaster/project/jni/freetype/src/base/ftglyph.c new file mode 100644 index 000000000..3505d6dde --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftglyph.c @@ -0,0 +1,627 @@ +/***************************************************************************/ +/* */ +/* ftglyph.c */ +/* */ +/* FreeType convenience functions to handle glyphs (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_GLYPH_H +#include FT_OUTLINE_H +#include FT_BITMAP_H +#include FT_INTERNAL_OBJECTS_H + +#include "basepic.h" + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_glyph + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_BitmapGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, + FT_GlyphSlot slot ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + glyph->left = slot->bitmap_left; + glyph->top = slot->bitmap_top; + + /* do lazy copying whenever possible */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + glyph->bitmap = slot->bitmap; + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + FT_Bitmap_New( &glyph->bitmap ); + error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_copy( FT_Glyph bitmap_source, + FT_Glyph bitmap_target ) + { + FT_Library library = bitmap_source->library; + FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; + FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; + + + target->left = source->left; + target->top = source->top; + + return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Library library = FT_GLYPH( glyph )->library; + + + FT_Bitmap_Done( library, &glyph->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, + FT_BBox* cbox ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + + + cbox->xMin = glyph->left << 6; + cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 ); + cbox->yMax = glyph->top << 6; + cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 ); + } + + + FT_DEFINE_GLYPH(ft_bitmap_glyph_class, + sizeof ( FT_BitmapGlyphRec ), + FT_GLYPH_FORMAT_BITMAP, + + ft_bitmap_glyph_init, + ft_bitmap_glyph_done, + ft_bitmap_glyph_copy, + 0, /* FT_Glyph_TransformFunc */ + ft_bitmap_glyph_bbox, + 0 /* FT_Glyph_PrepareFunc */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_OutlineGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_init( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + FT_Outline* source = &slot->outline; + FT_Outline* target = &glyph->outline; + + + /* check format in glyph slot */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + /* allocate new outline */ + error = FT_Outline_New( library, source->n_points, source->n_contours, + &glyph->outline ); + if ( error ) + goto Exit; + + FT_Outline_Copy( source, target ); + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_done( FT_Glyph outline_glyph ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_copy( FT_Glyph outline_source, + FT_Glyph outline_target ) + { + FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; + FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; + FT_Error error; + FT_Library library = FT_GLYPH( source )->library; + + + error = FT_Outline_New( library, source->outline.n_points, + source->outline.n_contours, &target->outline ); + if ( !error ) + FT_Outline_Copy( &source->outline, &target->outline ); + + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_transform( FT_Glyph outline_glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + if ( matrix ) + FT_Outline_Transform( &glyph->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_bbox( FT_Glyph outline_glyph, + FT_BBox* bbox ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Get_CBox( &glyph->outline, bbox ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_prepare( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + slot->format = FT_GLYPH_FORMAT_OUTLINE; + slot->outline = glyph->outline; + slot->outline.flags &= ~FT_OUTLINE_OWNER; + + return FT_Err_Ok; + } + + + FT_DEFINE_GLYPH( ft_outline_glyph_class, + sizeof ( FT_OutlineGlyphRec ), + FT_GLYPH_FORMAT_OUTLINE, + + ft_outline_glyph_init, + ft_outline_glyph_done, + ft_outline_glyph_copy, + ft_outline_glyph_transform, + ft_outline_glyph_bbox, + ft_outline_glyph_prepare + ) + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_Glyph class and API ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + ft_new_glyph( FT_Library library, + const FT_Glyph_Class* clazz, + FT_Glyph* aglyph ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Glyph glyph; + + + *aglyph = 0; + + if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) + { + glyph->library = library; + glyph->clazz = clazz; + glyph->format = clazz->glyph_format; + + *aglyph = glyph; + } + + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ) + { + FT_Glyph copy; + FT_Error error; + const FT_Glyph_Class* clazz; + + + /* check arguments */ + if ( !target ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + *target = 0; + + if ( !source || !source->clazz ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + clazz = source->clazz; + error = ft_new_glyph( source->library, clazz, © ); + if ( error ) + goto Exit; + + copy->advance = source->advance; + copy->format = source->format; + + if ( clazz->glyph_copy ) + error = clazz->glyph_copy( source, copy ); + + if ( error ) + FT_Done_Glyph( copy ); + else + *target = copy; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ) + { + FT_Library library; + FT_Error error; + FT_Glyph glyph; + + const FT_Glyph_Class* clazz = 0; + + + if ( !slot ) + return FT_Err_Invalid_Slot_Handle; + + library = slot->library; + + if ( !aglyph ) + return FT_Err_Invalid_Argument; + + /* if it is a bitmap, that's easy :-) */ + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + clazz = FT_BITMAP_GLYPH_CLASS_GET; + + /* if it is an outline */ + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + clazz = FT_OUTLINE_GLYPH_CLASS_GET; + + else + { + /* try to find a renderer that supports the glyph image format */ + FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); + + + if ( render ) + clazz = &render->glyph_class; + } + + if ( !clazz ) + { + error = FT_Err_Invalid_Glyph_Format; + goto Exit; + } + + /* create FT_Glyph object */ + error = ft_new_glyph( library, clazz, &glyph ); + if ( error ) + goto Exit; + + /* copy advance while converting it to 16.16 format */ + glyph->advance.x = slot->advance.x << 10; + glyph->advance.y = slot->advance.y << 10; + + /* now import the image from the glyph slot */ + error = clazz->glyph_init( glyph, slot ); + + /* if an error occurred, destroy the glyph */ + if ( error ) + FT_Done_Glyph( glyph ); + else + *aglyph = glyph; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ) + { + const FT_Glyph_Class* clazz; + FT_Error error = FT_Err_Ok; + + + if ( !glyph || !glyph->clazz ) + error = FT_Err_Invalid_Argument; + else + { + clazz = glyph->clazz; + if ( clazz->glyph_transform ) + { + /* transform glyph image */ + clazz->glyph_transform( glyph, matrix, delta ); + + /* transform advance vector */ + if ( matrix ) + FT_Vector_Transform( &glyph->advance, matrix ); + } + else + error = FT_Err_Invalid_Glyph_Format; + } + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ) + { + const FT_Glyph_Class* clazz; + + + if ( !acbox ) + return; + + acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; + + if ( !glyph || !glyph->clazz ) + return; + else + { + clazz = glyph->clazz; + if ( !clazz->glyph_bbox ) + return; + else + { + /* retrieve bbox in 26.6 coordinates */ + clazz->glyph_bbox( glyph, acbox ); + + /* perform grid fitting if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); + acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); + acbox->xMax = FT_PIX_CEIL( acbox->xMax ); + acbox->yMax = FT_PIX_CEIL( acbox->yMax ); + } + + /* convert to integer pixels if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin >>= 6; + acbox->yMin >>= 6; + acbox->xMax >>= 6; + acbox->yMax >>= 6; + } + } + } + return; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ) + { + FT_GlyphSlotRec dummy; + FT_GlyphSlot_InternalRec dummy_internal; + FT_Error error = FT_Err_Ok; + FT_Glyph glyph; + FT_BitmapGlyph bitmap = NULL; + + const FT_Glyph_Class* clazz; + +#ifdef FT_CONFIG_OPTION_PIC + FT_Library library = FT_GLYPH( glyph )->library; +#endif + + + /* check argument */ + if ( !the_glyph ) + goto Bad; + + /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ + /* then calling FT_Render_Glyph_Internal() */ + + glyph = *the_glyph; + if ( !glyph ) + goto Bad; + + clazz = glyph->clazz; + + /* when called with a bitmap glyph, do nothing and return successfully */ + if ( clazz == FT_BITMAP_GLYPH_CLASS_GET ) + goto Exit; + + if ( !clazz || !clazz->glyph_prepare ) + goto Bad; + + FT_MEM_ZERO( &dummy, sizeof ( dummy ) ); + FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) ); + dummy.internal = &dummy_internal; + dummy.library = glyph->library; + dummy.format = clazz->glyph_format; + + /* create result bitmap glyph */ + error = ft_new_glyph( glyph->library, FT_BITMAP_GLYPH_CLASS_GET, + (FT_Glyph*)(void*)&bitmap ); + if ( error ) + goto Exit; + +#if 1 + /* if `origin' is set, translate the glyph image */ + if ( origin ) + FT_Glyph_Transform( glyph, 0, origin ); +#else + FT_UNUSED( origin ); +#endif + + /* prepare dummy slot for rendering */ + error = clazz->glyph_prepare( glyph, &dummy ); + if ( !error ) + error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); + +#if 1 + if ( !destroy && origin ) + { + FT_Vector v; + + + v.x = -origin->x; + v.y = -origin->y; + FT_Glyph_Transform( glyph, 0, &v ); + } +#endif + + if ( error ) + goto Exit; + + /* in case of success, copy the bitmap to the glyph bitmap */ + error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); + if ( error ) + goto Exit; + + /* copy advance */ + bitmap->root.advance = glyph->advance; + + if ( destroy ) + FT_Done_Glyph( glyph ); + + *the_glyph = FT_GLYPH( bitmap ); + + Exit: + if ( error && bitmap ) + FT_Done_Glyph( FT_GLYPH( bitmap ) ); + + return error; + + Bad: + error = FT_Err_Invalid_Argument; + goto Exit; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Done_Glyph( FT_Glyph glyph ) + { + if ( glyph ) + { + FT_Memory memory = glyph->library->memory; + const FT_Glyph_Class* clazz = glyph->clazz; + + + if ( clazz->glyph_done ) + clazz->glyph_done( glyph ); + + FT_FREE( glyph ); + } + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftgxval.c b/alienblaster/project/jni/freetype/src/base/ftgxval.c new file mode 100644 index 000000000..32662bed8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftgxval.c @@ -0,0 +1,129 @@ +/***************************************************************************/ +/* */ +/* ftgxval.c */ +/* */ +/* FreeType API for validating TrueTyepGX/AAT tables (body). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* Masatake YAMATO, Redhat K.K, */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_GX_VALIDATE_H + + + /* documentation is in ftgxval.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ) + { + FT_Service_GXvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_Err_Invalid_Face_Handle; + goto Exit; + } + + if ( tables == NULL ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + tables, + table_length ); + else + error = FT_Err_Unimplemented_Feature; + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( table ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ) + { + FT_Service_CKERNvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_Err_Invalid_Face_Handle; + goto Exit; + } + + if ( ckern_table == NULL ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + ckern_table ); + else + error = FT_Err_Unimplemented_Feature; + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( table ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftinit.c b/alienblaster/project/jni/freetype/src/base/ftinit.c new file mode 100644 index 000000000..f94f25a83 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftinit.c @@ -0,0 +1,252 @@ +/***************************************************************************/ +/* */ +/* ftinit.c */ +/* */ +/* FreeType initialization layer (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* The purpose of this file is to implement the following two */ + /* functions: */ + /* */ + /* FT_Add_Default_Modules(): */ + /* This function is used to add the set of default modules to a */ + /* fresh new library object. The set is taken from the header file */ + /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */ + /* Build System' for more information. */ + /* */ + /* FT_Init_FreeType(): */ + /* This function creates a system object for the current platform, */ + /* builds a library out of it, then calls FT_Default_Drivers(). */ + /* */ + /* Note that even if FT_Init_FreeType() uses the implementation of the */ + /* system object defined at build time, client applications are still */ + /* able to provide their own `ftsystem.c'. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_MODULE_H +#include "basepic.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_init + +#ifndef FT_CONFIG_OPTION_PIC + +#undef FT_USE_MODULE +#ifdef __cplusplus +#define FT_USE_MODULE( type, x ) extern "C" const type x; +#else +#define FT_USE_MODULE( type, x ) extern const type x; +#endif + + +#include FT_CONFIG_MODULES_H + + +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x), + + static + const FT_Module_Class* const ft_default_modules[] = + { +#include FT_CONFIG_MODULES_H + 0 + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#ifdef __cplusplus +#define FT_EXTERNC extern "C" +#else +#define FT_EXTERNC extern +#endif + + /* declare the module's class creation/destruction functions */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + FT_EXTERNC FT_Error FT_Create_Class_##x( FT_Library library, FT_Module_Class** output_class ); \ + FT_EXTERNC void FT_Destroy_Class_##x( FT_Library library, FT_Module_Class* clazz ); + +#include FT_CONFIG_MODULES_H + + + /* count all module classes */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) MODULE_CLASS_##x, + + enum { +#include FT_CONFIG_MODULES_H + FT_NUM_MODULE_CLASSES + }; + + /* destroy all module classes */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + if ( classes[i] ) { FT_Destroy_Class_##x(library, classes[i]); } \ + i++; \ + + FT_BASE_DEF( void ) + ft_destroy_default_module_classes( FT_Library library ) + { + FT_Module_Class** classes; + FT_Memory memory; + FT_UInt i; + BasePIC* pic_container = (BasePIC*)library->pic_container.base; + + if ( !pic_container->default_module_classes ) + return; + + memory = library->memory; + classes = pic_container->default_module_classes; + i = 0; + +#include FT_CONFIG_MODULES_H + + FT_FREE( classes ); + pic_container->default_module_classes = 0; + } + + /* initialize all module classes and the pointer table */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + error = FT_Create_Class_##x(library, &clazz); \ + if (error) goto Exit; \ + classes[i++] = clazz; + + FT_BASE_DEF( FT_Error ) + ft_create_default_module_classes( FT_Library library ) + { + FT_Error error; + FT_Memory memory; + FT_Module_Class** classes; + FT_Module_Class* clazz; + FT_UInt i; + BasePIC* pic_container = (BasePIC*)library->pic_container.base; + + memory = library->memory; + pic_container->default_module_classes = 0; + + if ( FT_ALLOC(classes, sizeof(FT_Module_Class*) * (FT_NUM_MODULE_CLASSES + 1) ) ) + return error; + /* initialize all pointers to 0, especially the last one */ + for (i = 0; i < FT_NUM_MODULE_CLASSES; i++) + classes[i] = 0; + classes[FT_NUM_MODULE_CLASSES] = 0; + + i = 0; + +#include FT_CONFIG_MODULES_H + +Exit: + if (error) ft_destroy_default_module_classes( library ); + else pic_container->default_module_classes = classes; + + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Add_Default_Modules( FT_Library library ) + { + FT_Error error; + const FT_Module_Class* const* cur; + + + /* test for valid `library' delayed to FT_Add_Module() */ + + cur = FT_DEFAULT_MODULES_GET; + while ( *cur ) + { + error = FT_Add_Module( library, *cur ); + /* notify errors, but don't stop */ + if ( error ) + FT_TRACE0(( "FT_Add_Default_Module:" + " Cannot install `%s', error = 0x%x\n", + (*cur)->module_name, error )); + cur++; + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ) + { + FT_Error error; + FT_Memory memory; + + + /* First of all, allocate a new system object -- this function is part */ + /* of the system-specific component, i.e. `ftsystem.c'. */ + + memory = FT_New_Memory(); + if ( !memory ) + { + FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" )); + return FT_Err_Unimplemented_Feature; + } + + /* build a library out of it, then fill it with the set of */ + /* default drivers. */ + + error = FT_New_Library( memory, alibrary ); + if ( error ) + FT_Done_Memory( memory ); + else + FT_Add_Default_Modules( *alibrary ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_FreeType( FT_Library library ) + { + if ( library ) + { + FT_Memory memory = library->memory; + + + /* Discard the library object */ + FT_Done_Library( library ); + + /* discard memory manager */ + FT_Done_Memory( memory ); + } + + return FT_Err_Ok; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftlcdfil.c b/alienblaster/project/jni/freetype/src/base/ftlcdfil.c new file mode 100644 index 000000000..80640111c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftlcdfil.c @@ -0,0 +1,351 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.c */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs (body). */ +/* */ +/* Copyright 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LCD_FILTER_H +#include FT_IMAGE_H +#include FT_INTERNAL_OBJECTS_H + + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + +/* define USE_LEGACY to implement the legacy filter */ +#define USE_LEGACY + + /* FIR filter used by the default and light filters */ + static void + _ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_Library library ) + { + FT_Byte* weights = library->lcd_weights; + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + + + /* horizontal in-place FIR filter */ + if ( mode == FT_RENDER_MODE_LCD && width >= 4 ) + { + FT_Byte* line = bitmap->buffer; + + + for ( ; height > 0; height--, line += bitmap->pitch ) + { + FT_UInt fir[5]; + FT_UInt val1, xx; + + + val1 = line[0]; + fir[0] = weights[2] * val1; + fir[1] = weights[3] * val1; + fir[2] = weights[4] * val1; + fir[3] = 0; + fir[4] = 0; + + val1 = line[1]; + fir[0] += weights[1] * val1; + fir[1] += weights[2] * val1; + fir[2] += weights[3] * val1; + fir[3] += weights[4] * val1; + + for ( xx = 2; xx < width; xx++ ) + { + FT_UInt val, pix; + + + val = line[xx]; + pix = fir[0] + weights[0] * val; + fir[0] = fir[1] + weights[1] * val; + fir[1] = fir[2] + weights[2] * val; + fir[2] = fir[3] + weights[3] * val; + fir[3] = weights[4] * val; + + pix >>= 8; + pix |= -( pix >> 8 ); + line[xx - 2] = (FT_Byte)pix; + } + + { + FT_UInt pix; + + + pix = fir[0] >> 8; + pix |= -( pix >> 8 ); + line[xx - 2] = (FT_Byte)pix; + + pix = fir[1] >> 8; + pix |= -( pix >> 8 ); + line[xx - 1] = (FT_Byte)pix; + } + } + } + + /* vertical in-place FIR filter */ + else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 ) + { + FT_Byte* column = bitmap->buffer; + FT_Int pitch = bitmap->pitch; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column; + FT_UInt fir[5]; + FT_UInt val1, yy; + + + val1 = col[0]; + fir[0] = weights[2] * val1; + fir[1] = weights[3] * val1; + fir[2] = weights[4] * val1; + fir[3] = 0; + fir[4] = 0; + col += pitch; + + val1 = col[0]; + fir[0] += weights[1] * val1; + fir[1] += weights[2] * val1; + fir[2] += weights[3] * val1; + fir[3] += weights[4] * val1; + col += pitch; + + for ( yy = 2; yy < height; yy++ ) + { + FT_UInt val, pix; + + + val = col[0]; + pix = fir[0] + weights[0] * val; + fir[0] = fir[1] + weights[1] * val; + fir[1] = fir[2] + weights[2] * val; + fir[2] = fir[3] + weights[3] * val; + fir[3] = weights[4] * val; + + pix >>= 8; + pix |= -( pix >> 8 ); + col[-2 * pitch] = (FT_Byte)pix; + col += pitch; + } + + { + FT_UInt pix; + + + pix = fir[0] >> 8; + pix |= -( pix >> 8 ); + col[-2 * pitch] = (FT_Byte)pix; + + pix = fir[1] >> 8; + pix |= -( pix >> 8 ); + col[-pitch] = (FT_Byte)pix; + } + } + } + } + + +#ifdef USE_LEGACY + + /* intra-pixel filter used by the legacy filter */ + static void + _ft_lcd_filter_legacy( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_Library library ) + { + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + FT_Int pitch = bitmap->pitch; + + static const int filters[3][3] = + { + { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 }, + { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 }, + { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } + }; + + FT_UNUSED( library ); + + + /* horizontal in-place intra-pixel filter */ + if ( mode == FT_RENDER_MODE_LCD && width >= 3 ) + { + FT_Byte* line = bitmap->buffer; + + + for ( ; height > 0; height--, line += pitch ) + { + FT_UInt xx; + + + for ( xx = 0; xx < width; xx += 3 ) + { + FT_UInt r = 0; + FT_UInt g = 0; + FT_UInt b = 0; + FT_UInt p; + + + p = line[xx]; + r += filters[0][0] * p; + g += filters[0][1] * p; + b += filters[0][2] * p; + + p = line[xx + 1]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = line[xx + 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + line[xx] = (FT_Byte)( r / 65536 ); + line[xx + 1] = (FT_Byte)( g / 65536 ); + line[xx + 2] = (FT_Byte)( b / 65536 ); + } + } + } + else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 ) + { + FT_Byte* column = bitmap->buffer; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column; + FT_Byte* col_end = col + height * pitch; + + + for ( ; col < col_end; col += 3 * pitch ) + { + FT_UInt r = 0; + FT_UInt g = 0; + FT_UInt b = 0; + FT_UInt p; + + + p = col[0]; + r += filters[0][0] * p; + g += filters[0][1] * p; + b += filters[0][2] * p; + + p = col[pitch]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = col[pitch * 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + col[0] = (FT_Byte)( r / 65536 ); + col[pitch] = (FT_Byte)( g / 65536 ); + col[2 * pitch] = (FT_Byte)( b / 65536 ); + } + } + } + } + +#endif /* USE_LEGACY */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + static const FT_Byte light_filter[5] = + { 0, 85, 86, 85, 0 }; + /* the values here sum up to a value larger than 256, */ + /* providing a cheap gamma correction */ + static const FT_Byte default_filter[5] = + { 0x10, 0x40, 0x70, 0x40, 0x10 }; + + + if ( library == NULL ) + return FT_Err_Invalid_Argument; + + switch ( filter ) + { + case FT_LCD_FILTER_NONE: + library->lcd_filter_func = NULL; + library->lcd_extra = 0; + break; + + case FT_LCD_FILTER_DEFAULT: +#if defined( FT_FORCE_LEGACY_LCD_FILTER ) + + library->lcd_filter_func = _ft_lcd_filter_legacy; + library->lcd_extra = 0; + +#elif defined( FT_FORCE_LIGHT_LCD_FILTER ) + + ft_memcpy( library->lcd_weights, light_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + +#else + + ft_memcpy( library->lcd_weights, default_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + +#endif + + break; + + case FT_LCD_FILTER_LIGHT: + ft_memcpy( library->lcd_weights, light_filter, 5 ); + library->lcd_filter_func = _ft_lcd_filter_fir; + library->lcd_extra = 2; + break; + +#ifdef USE_LEGACY + + case FT_LCD_FILTER_LEGACY: + library->lcd_filter_func = _ft_lcd_filter_legacy; + library->lcd_extra = 0; + break; + +#endif + + default: + return FT_Err_Invalid_Argument; + } + + library->lcd_filter = filter; + return 0; + } + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + FT_UNUSED( library ); + FT_UNUSED( filter ); + + return FT_Err_Unimplemented_Feature; + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftmm.c b/alienblaster/project/jni/freetype/src/base/ftmm.c new file mode 100644 index 000000000..030772981 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftmm.c @@ -0,0 +1,202 @@ +/***************************************************************************/ +/* */ +/* ftmm.c */ +/* */ +/* Multiple Master font support (body). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_mm + + + static FT_Error + ft_face_get_mm_service( FT_Face face, + FT_Service_MultiMasters *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + error = FT_Err_Invalid_Argument; + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + MULTI_MASTERS ); + + if ( *aservice ) + error = FT_Err_Ok; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm ) + error = service->get_mm( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->get_mm_var ) + error = service->get_mm_var( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_design ) + error = service->set_mm_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_var_design ) + error = service->set_var_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_Err_Invalid_Argument; + if ( service->set_mm_blend ) + error = service->set_mm_blend( face, num_coords, coords ); + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftobjs.c b/alienblaster/project/jni/freetype/src/base/ftobjs.c new file mode 100644 index 000000000..46bcd3bb8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftobjs.c @@ -0,0 +1,4500 @@ +/***************************************************************************/ +/* */ +/* ftobjs.c */ +/* */ +/* The FreeType private base classes (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_LIST_H +#include FT_OUTLINE_H +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_RFORK_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H /* for SFNT_Load_Table_Func */ +#include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H +#include FT_TRUETYPE_IDS_H +#include FT_OUTLINE_H + +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_TT_CMAP_H +#include FT_SERVICE_KERNING_H +#include FT_SERVICE_TRUETYPE_ENGINE_H + +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#include "ftbase.h" +#endif + +#define GRID_FIT_METRICS + + + FT_BASE_DEF( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ) + { + FT_Pointer result = NULL; + FT_ServiceDesc desc = service_descriptors; + + + if ( desc && service_id ) + { + for ( ; desc->serv_id != NULL; desc++ ) + { + if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) + { + result = (FT_Pointer)desc->serv_data; + break; + } + } + } + + return result; + } + + + FT_BASE_DEF( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ) + { + valid->base = base; + valid->limit = limit; + valid->level = level; + valid->error = FT_Err_Ok; + } + + + FT_BASE_DEF( FT_Int ) + ft_validator_run( FT_Validator valid ) + { + /* This function doesn't work! None should call it. */ + FT_UNUSED( valid ); + + return -1; + } + + + FT_BASE_DEF( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ) + { + /* since the cast below also disables the compiler's */ + /* type check, we introduce a dummy variable, which */ + /* will be optimized away */ + volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer; + + + valid->error = error; + + /* throw away volatileness; use `jump_buffer' or the */ + /* compiler may warn about an unused local variable */ + ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S T R E A M ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* create a new input stream from an FT_Open_Args structure */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream; + + + *astream = 0; + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !args ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + if ( FT_NEW( stream ) ) + goto Exit; + + stream->memory = memory; + + if ( args->flags & FT_OPEN_MEMORY ) + { + /* create a memory-based stream */ + FT_Stream_OpenMemory( stream, + (const FT_Byte*)args->memory_base, + args->memory_size ); + } + else if ( args->flags & FT_OPEN_PATHNAME ) + { + /* create a normal system stream */ + error = FT_Stream_Open( stream, args->pathname ); + stream->pathname.pointer = args->pathname; + } + else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream ) + { + /* use an existing, user-provided stream */ + + /* in this case, we do not need to allocate a new stream object */ + /* since the caller is responsible for closing it himself */ + FT_FREE( stream ); + stream = args->stream; + } + else + error = FT_Err_Invalid_Argument; + + if ( error ) + FT_FREE( stream ); + else + stream->memory = memory; /* just to be certain */ + + *astream = stream; + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ) + { + if ( stream ) + { + FT_Memory memory = stream->memory; + + + FT_Stream_Close( stream ); + + if ( !external ) + FT_FREE( stream ); + } + } + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + ft_glyphslot_init( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + FT_Error error = FT_Err_Ok; + FT_Slot_Internal internal; + + + slot->library = driver->root.library; + + if ( FT_NEW( internal ) ) + goto Exit; + + slot->internal = internal; + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + error = FT_GlyphLoader_New( memory, &internal->loader ); + + if ( !error && clazz->init_slot ) + error = clazz->init_slot( slot ); + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ) + { + if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + + + FT_FREE( slot->bitmap.buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + /* assume that the bitmap buffer was stolen or not */ + /* allocated from the heap */ + slot->bitmap.buffer = NULL; + } + } + + + FT_BASE_DEF( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ) + { + ft_glyphslot_free_bitmap( slot ); + + slot->bitmap.buffer = buffer; + + FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 ); + } + + + FT_BASE_DEF( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + FT_Error error; + + + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + FT_FREE( slot->bitmap.buffer ); + else + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + (void)FT_ALLOC( slot->bitmap.buffer, size ); + return error; + } + + + static void + ft_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* clear all public fields in the glyph slot */ + FT_ZERO( &slot->metrics ); + FT_ZERO( &slot->outline ); + + slot->bitmap.width = 0; + slot->bitmap.rows = 0; + slot->bitmap.pitch = 0; + slot->bitmap.pixel_mode = 0; + /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */ + + slot->bitmap_left = 0; + slot->bitmap_top = 0; + slot->num_subglyphs = 0; + slot->subglyphs = 0; + slot->control_data = 0; + slot->control_len = 0; + slot->other = 0; + slot->format = FT_GLYPH_FORMAT_NONE; + + slot->linearHoriAdvance = 0; + slot->linearVertAdvance = 0; + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + + + static void + ft_glyphslot_done( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + + + if ( clazz->done_slot ) + clazz->done_slot( slot ); + + /* free bitmap buffer if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* slot->internal might be NULL in out-of-memory situations */ + if ( slot->internal ) + { + /* free glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + FT_GlyphLoader_Done( slot->internal->loader ); + slot->internal->loader = 0; + } + + FT_FREE( slot->internal ); + } + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ) + { + FT_Error error; + FT_Driver driver; + FT_Driver_Class clazz; + FT_Memory memory; + FT_GlyphSlot slot; + + + if ( !face || !face->driver ) + return FT_Err_Invalid_Argument; + + driver = face->driver; + clazz = driver->clazz; + memory = driver->root.memory; + + FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" )); + if ( !FT_ALLOC( slot, clazz->slot_object_size ) ) + { + slot->face = face; + + error = ft_glyphslot_init( slot ); + if ( error ) + { + ft_glyphslot_done( slot ); + FT_FREE( slot ); + goto Exit; + } + + slot->next = face->glyph; + face->glyph = slot; + + if ( aslot ) + *aslot = slot; + } + else if ( aslot ) + *aslot = 0; + + + Exit: + FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error )); + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ) + { + if ( slot ) + { + FT_Driver driver = slot->face->driver; + FT_Memory memory = driver->root.memory; + FT_GlyphSlot prev; + FT_GlyphSlot cur; + + + /* Remove slot from its parent face's list */ + prev = NULL; + cur = slot->face->glyph; + + while ( cur ) + { + if ( cur == slot ) + { + if ( !prev ) + slot->face->glyph = cur->next; + else + prev->next = cur->next; + + ft_glyphslot_done( slot ); + FT_FREE( slot ); + break; + } + prev = cur; + cur = cur->next; + } + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Face_Internal internal; + + + if ( !face ) + return; + + internal = face->internal; + + internal->transform_flags = 0; + + if ( !matrix ) + { + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + matrix = &internal->transform_matrix; + } + else + internal->transform_matrix = *matrix; + + /* set transform_flags bit flag 0 if `matrix' isn't the identity */ + if ( ( matrix->xy | matrix->yx ) || + matrix->xx != 0x10000L || + matrix->yy != 0x10000L ) + internal->transform_flags |= 1; + + if ( !delta ) + { + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + delta = &internal->transform_delta; + } + else + internal->transform_delta = *delta; + + /* set transform_flags bit flag 1 if `delta' isn't the null vector */ + if ( delta->x | delta->y ) + internal->transform_flags |= 2; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ); + + +#ifdef GRID_FIT_METRICS + static void + ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot, + FT_Bool vertical ) + { + FT_Glyph_Metrics* metrics = &slot->metrics; + FT_Pos right, bottom; + + + if ( vertical ) + { + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); + + right = FT_PIX_CEIL( metrics->vertBearingX + metrics->width ); + bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height ); + + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + metrics->width = right - metrics->vertBearingX; + metrics->height = bottom - metrics->vertBearingY; + } + else + { + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + right = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width ); + bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height ); + + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY ); + + metrics->width = right - metrics->horiBearingX; + metrics->height = metrics->horiBearingY - bottom; + } + + metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance ); + metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance ); + } +#endif /* GRID_FIT_METRICS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + FT_Driver driver; + FT_GlyphSlot slot; + FT_Library library; + FT_Bool autohint = FALSE; + FT_Module hinter; + + + if ( !face || !face->size || !face->glyph ) + return FT_Err_Invalid_Face_Handle; + + /* The validity test for `glyph_index' is performed by the */ + /* font drivers. */ + + slot = face->glyph; + ft_glyphslot_clear( slot ); + + driver = face->driver; + library = driver->root.library; + hinter = library->auto_hinter; + + /* resolve load flags dependencies */ + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_IGNORE_TRANSFORM; + + if ( load_flags & FT_LOAD_NO_SCALE ) + { + load_flags |= FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP; + + load_flags &= ~FT_LOAD_RENDER; + } + + /* + * Determine whether we need to auto-hint or not. + * The general rules are: + * + * - Do only auto-hinting if we have a hinter module, a scalable font + * format dealing with outlines, and no transforms except simple + * slants and/or rotations by integer multiples of 90 degrees. + * + * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't + * have a native font hinter. + * + * - Otherwise, auto-hint for LIGHT hinting mode. + * + * - Exception: The font is `tricky' and requires the native hinter to + * load properly. + */ + + if ( hinter && + !( load_flags & FT_LOAD_NO_HINTING ) && + !( load_flags & FT_LOAD_NO_AUTOHINT ) && + FT_DRIVER_IS_SCALABLE( driver ) && + FT_DRIVER_USES_OUTLINES( driver ) && + !FT_IS_TRICKY( face ) && + ( ( face->internal->transform_matrix.yx == 0 && + face->internal->transform_matrix.xx != 0 ) || + ( face->internal->transform_matrix.xx == 0 && + face->internal->transform_matrix.yx != 0 ) ) ) + { + if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) || + !FT_DRIVER_HAS_HINTER( driver ) ) + autohint = TRUE; + else + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_LIGHT || + face->internal->ignore_unpatented_hinter ) + autohint = TRUE; + } + } + + if ( autohint ) + { + FT_AutoHinter_Service hinting; + + + /* try to load embedded bitmaps first if available */ + /* */ + /* XXX: This is really a temporary hack that should disappear */ + /* promptly with FreeType 2.1! */ + /* */ + if ( FT_HAS_FIXED_SIZES( face ) && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + error = driver->clazz->load_glyph( slot, face->size, + glyph_index, + load_flags | FT_LOAD_SBITS_ONLY ); + + if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP ) + goto Load_Ok; + } + + { + FT_Face_Internal internal = face->internal; + FT_Int transform_flags = internal->transform_flags; + + + /* since the auto-hinter calls FT_Load_Glyph by itself, */ + /* make sure that glyphs aren't transformed */ + internal->transform_flags = 0; + + /* load auto-hinted outline */ + hinting = (FT_AutoHinter_Service)hinter->clazz->module_interface; + + error = hinting->load_glyph( (FT_AutoHinter)hinter, + slot, face->size, + glyph_index, load_flags ); + + internal->transform_flags = transform_flags; + } + } + else + { + error = driver->clazz->load_glyph( slot, + face->size, + glyph_index, + load_flags ); + if ( error ) + goto Exit; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* check that the loaded outline is correct */ + error = FT_Outline_Check( &slot->outline ); + if ( error ) + goto Exit; + +#ifdef GRID_FIT_METRICS + if ( !( load_flags & FT_LOAD_NO_HINTING ) ) + ft_glyphslot_grid_fit_metrics( slot, + FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) ); +#endif + } + } + + Load_Ok: + /* compute the advance */ + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + slot->advance.x = 0; + slot->advance.y = slot->metrics.vertAdvance; + } + else + { + slot->advance.x = slot->metrics.horiAdvance; + slot->advance.y = 0; + } + + /* compute the linear advance in 16.16 pixels */ + if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && + ( FT_IS_SCALABLE( face ) ) ) + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + /* it's tricky! */ + slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, + metrics->x_scale, 64 ); + + slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, + metrics->y_scale, 64 ); + } + + if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) + { + FT_Face_Internal internal = face->internal; + + + /* now, transform the glyph image if needed */ + if ( internal->transform_flags ) + { + /* get renderer */ + FT_Renderer renderer = ft_lookup_glyph_renderer( slot ); + + + if ( renderer ) + error = renderer->clazz->transform_glyph( + renderer, slot, + &internal->transform_matrix, + &internal->transform_delta ); + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* apply `standard' transformation if no renderer is available */ + if ( &internal->transform_matrix ) + FT_Outline_Transform( &slot->outline, + &internal->transform_matrix ); + + if ( &internal->transform_delta ) + FT_Outline_Translate( &slot->outline, + internal->transform_delta.x, + internal->transform_delta.y ); + } + + /* transform advance */ + FT_Vector_Transform( &slot->advance, &internal->transform_matrix ); + } + } + + FT_TRACE5(( " x advance: %d\n" , slot->advance.x )); + FT_TRACE5(( " y advance: %d\n" , slot->advance.y )); + + FT_TRACE5(( " linear x advance: %d\n" , slot->linearHoriAdvance )); + FT_TRACE5(( " linear y advance: %d\n" , slot->linearVertAdvance )); + + /* do we need to render the image now? */ + if ( !error && + slot->format != FT_GLYPH_FORMAT_BITMAP && + slot->format != FT_GLYPH_FORMAT_COMPOSITE && + load_flags & FT_LOAD_RENDER ) + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_NORMAL && + (load_flags & FT_LOAD_MONOCHROME ) ) + mode = FT_RENDER_MODE_MONO; + + error = FT_Render_Glyph( slot, mode ); + } + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ) + { + FT_UInt glyph_index; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + glyph_index = (FT_UInt)char_code; + if ( face->charmap ) + glyph_index = FT_Get_Char_Index( face, char_code ); + + return FT_Load_Glyph( face, glyph_index, load_flags ); + } + + + /* destructor for sizes list */ + static void + destroy_size( FT_Memory memory, + FT_Size size, + FT_Driver driver ) + { + /* finalize client-specific data */ + if ( size->generic.finalizer ) + size->generic.finalizer( size ); + + /* finalize format-specific stuff */ + if ( driver->clazz->done_size ) + driver->clazz->done_size( size ); + + FT_FREE( size->internal ); + FT_FREE( size ); + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ); + + + static void + destroy_charmaps( FT_Face face, + FT_Memory memory ) + { + FT_Int n; + + + if ( !face ) + return; + + for ( n = 0; n < face->num_charmaps; n++ ) + { + FT_CMap cmap = FT_CMAP( face->charmaps[n] ); + + + ft_cmap_done_internal( cmap ); + + face->charmaps[n] = NULL; + } + + FT_FREE( face->charmaps ); + face->num_charmaps = 0; + } + + + /* destructor for faces list */ + static void + destroy_face( FT_Memory memory, + FT_Face face, + FT_Driver driver ) + { + FT_Driver_Class clazz = driver->clazz; + + + /* discard auto-hinting data */ + if ( face->autohint.finalizer ) + face->autohint.finalizer( face->autohint.data ); + + /* Discard glyph slots for this face. */ + /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */ + while ( face->glyph ) + FT_Done_GlyphSlot( face->glyph ); + + /* discard all sizes for this face */ + FT_List_Finalize( &face->sizes_list, + (FT_List_Destructor)destroy_size, + memory, + driver ); + face->size = 0; + + /* now discard client data */ + if ( face->generic.finalizer ) + face->generic.finalizer( face ); + + /* discard charmaps */ + destroy_charmaps( face, memory ); + + /* finalize format-specific stuff */ + if ( clazz->done_face ) + clazz->done_face( face ); + + /* close the stream for this face if needed */ + FT_Stream_Free( + face->stream, + ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->stream = 0; + + /* get rid of it */ + if ( face->internal ) + { + FT_FREE( face->internal ); + } + FT_FREE( face ); + } + + + static void + Destroy_Driver( FT_Driver driver ) + { + FT_List_Finalize( &driver->faces_list, + (FT_List_Destructor)destroy_face, + driver->root.memory, + driver ); + + /* check whether we need to drop the driver's glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + FT_GlyphLoader_Done( driver->glyph_loader ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_unicode_charmap */ + /* */ + /* <Description> */ + /* This function finds a Unicode charmap, if there is one. */ + /* And if there is more than one, it tries to favour the more */ + /* extensive one, i.e., one that supports UCS-4 against those which */ + /* are limited to the BMP (said UCS-2 encoding.) */ + /* */ + /* This function is called from open_face() (just below), and also */ + /* from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). */ + /* */ + static FT_Error + find_unicode_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return FT_Err_Invalid_CharMap_Handle; + + /* + * The original TrueType specification(s) only specified charmap + * formats that are capable of mapping 8 or 16 bit character codes to + * glyph indices. + * + * However, recent updates to the Apple and OpenType specifications + * introduced new formats that are capable of mapping 32-bit character + * codes as well. And these are already used on some fonts, mainly to + * map non-BMP Asian ideographs as defined in Unicode. + * + * For compatibility purposes, these fonts generally come with + * *several* Unicode charmaps: + * + * - One of them in the "old" 16-bit format, that cannot access + * all glyphs in the font. + * + * - Another one in the "new" 32-bit format, that can access all + * the glyphs. + * + * This function has been written to always favor a 32-bit charmap + * when found. Otherwise, a 16-bit one is returned when found. + */ + + /* Since the `interesting' table, with IDs (3,10), is normally the */ + /* last one, we loop backwards. This loses with type1 fonts with */ + /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */ + /* chars (.01% ?), and this is the same about 99.99% of the time! */ + + cur = first + face->num_charmaps; /* points after the last one */ + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + /* XXX If some new encodings to represent UCS-4 are added, */ + /* they should be added here. */ + if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && + cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || + ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + } + + /* We do not have any UCS-4 charmap. */ + /* Do the loop again and search for UCS-2 charmaps. */ + cur = first + face->num_charmaps; + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + + return FT_Err_Invalid_CharMap_Handle; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_variant_selector_charmap */ + /* */ + /* <Description> */ + /* This function finds the variant selector charmap, if there is one. */ + /* There can only be one (platform=0, specific=5, format=14). */ + /* */ + static FT_CharMap + find_variant_selector_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* end; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return NULL; + + end = first + face->num_charmaps; /* points after the last one */ + + for ( cur = first; cur < end; ++cur ) + { + if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && + FT_Get_CMap_Format( cur[0] ) == 14 ) + return cur[0]; + } + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* open_face */ + /* */ + /* <Description> */ + /* This function does some work for FT_Open_Face(). */ + /* */ + static FT_Error + open_face( FT_Driver driver, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter* params, + FT_Face *aface ) + { + FT_Memory memory; + FT_Driver_Class clazz; + FT_Face face = 0; + FT_Error error, error2; + FT_Face_Internal internal = NULL; + + + clazz = driver->clazz; + memory = driver->root.memory; + + /* allocate the face object and perform basic initialization */ + if ( FT_ALLOC( face, clazz->face_object_size ) ) + goto Fail; + + if ( FT_NEW( internal ) ) + goto Fail; + + face->internal = internal; + + face->driver = driver; + face->memory = memory; + face->stream = stream; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + int i; + + + face->internal->incremental_interface = 0; + for ( i = 0; i < num_params && !face->internal->incremental_interface; + i++ ) + if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL ) + face->internal->incremental_interface = + (FT_Incremental_Interface)params[i].data; + } +#endif + + if ( clazz->init_face ) + error = clazz->init_face( stream, + face, + (FT_Int)face_index, + num_params, + params ); + if ( error ) + goto Fail; + + /* select Unicode charmap by default */ + error2 = find_unicode_charmap( face ); + + /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */ + /* is returned. */ + + /* no error should happen, but we want to play safe */ + if ( error2 && error2 != FT_Err_Invalid_CharMap_Handle ) + { + error = error2; + goto Fail; + } + + *aface = face; + + Fail: + if ( error ) + { + destroy_charmaps( face, memory ); + if ( clazz->done_face ) + clazz->done_face( face ); + FT_FREE( internal ); + FT_FREE( face ); + *aface = 0; + } + + return error; + } + + + /* there's a Mac-specific extended implementation of FT_New_Face() */ + /* in src/base/ftmac.c */ + +#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_Err_Invalid_Argument; + + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + args.stream = NULL; + + return FT_Open_Face( library, &args, face_index, aface ); + } + +#endif /* defined( FT_MACINTOSH ) && !defined( DARWIN_NO_CARBON ) */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `face' delayed to FT_Open_Face() */ + if ( !file_base ) + return FT_Err_Invalid_Argument; + + args.flags = FT_OPEN_MEMORY; + args.memory_base = file_base; + args.memory_size = file_size; + args.stream = NULL; + + return FT_Open_Face( library, &args, face_index, aface ); + } + + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + + /* The behavior here is very similar to that in base/ftmac.c, but it */ + /* is designed to work on non-mac systems, so no mac specific calls. */ + /* */ + /* We look at the file and determine if it is a mac dfont file or a mac */ + /* resource file, or a macbinary file containing a mac resource file. */ + /* */ + /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */ + /* the point, especially since there may be multiple `FOND' resources. */ + /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */ + /* they occur in the file. */ + /* */ + /* Note that multiple `POST' resources do not mean multiple postscript */ + /* fonts; they all get jammed together to make what is essentially a */ + /* pfb file. */ + /* */ + /* We aren't interested in `NFNT' or `FONT' bitmap resources. */ + /* */ + /* As soon as we get an `sfnt' load it into memory and pass it off to */ + /* FT_Open_Face. */ + /* */ + /* If we have a (set of) `POST' resources, massage them into a (memory) */ + /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */ + /* going to try to save the kerning info. After all that lives in the */ + /* `FOND' which isn't in the file containing the `POST' resources so */ + /* we don't really have access to it. */ + + + /* Finalizer for a memory stream; gets called by FT_Done_Face(). */ + /* It frees the memory it uses. */ + /* From ftmac.c. */ + static void + memory_stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->base = 0; + stream->close = 0; + } + + + /* Create a new memory stream from a buffer and a size. */ + /* From ftmac.c. */ + static FT_Error + new_memory_stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream_CloseFunc close, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !base ) + return FT_Err_Invalid_Argument; + + *astream = 0; + memory = library->memory; + if ( FT_NEW( stream ) ) + goto Exit; + + FT_Stream_OpenMemory( stream, base, size ); + + stream->close = close; + + *astream = stream; + + Exit: + return error; + } + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* from ftmac.c */ + FT_LOCAL_DEF( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ) + { + FT_Open_Args args; + FT_Error error; + FT_Stream stream = NULL; + FT_Memory memory = library->memory; + + + error = new_memory_stream( library, + base, + size, + memory_stream_close, + &stream ); + if ( error ) + { + FT_FREE( base ); + return error; + } + + args.flags = FT_OPEN_STREAM; + args.stream = stream; + if ( driver_name ) + { + args.flags = args.flags | FT_OPEN_DRIVER; + args.driver = FT_Get_Module( library, driver_name ); + } + +#ifdef FT_MACINTOSH + /* At this point, face_index has served its purpose; */ + /* whoever calls this function has already used it to */ + /* locate the correct font data. We should not propagate */ + /* this index to FT_Open_Face() (unless it is negative). */ + + if ( face_index > 0 ) + face_index = 0; +#endif + + error = FT_Open_Face( library, &args, face_index, aface ); + + if ( error == FT_Err_Ok ) + (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + else +#ifdef FT_MACINTOSH + FT_Stream_Free( stream, 0 ); +#else + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + } +#endif + + return error; + } + + + /* Look up `TYP1' or `CID ' table from sfnt table directory. */ + /* `offset' and `length' must exclude the binary header in tables. */ + + /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */ + /* format too. Here, since we can't expect that the TrueType font */ + /* driver is loaded unconditially, we must parse the font by */ + /* ourselves. We are only interested in the name of the table and */ + /* the offset. */ + + static FT_Error + ft_lookup_PS_in_sfnt_stream( FT_Stream stream, + FT_Long face_index, + FT_ULong* offset, + FT_ULong* length, + FT_Bool* is_sfnt_cid ) + { + FT_Error error; + FT_UShort numTables; + FT_Long pstable_index; + FT_ULong tag; + int i; + + + *offset = 0; + *length = 0; + *is_sfnt_cid = FALSE; + + /* TODO: support for sfnt-wrapped PS/CID in TTC format */ + + /* version check for 'typ1' (should be ignored?) */ + if ( FT_READ_ULONG( tag ) ) + return error; + if ( tag != TTAG_typ1 ) + return FT_Err_Unknown_File_Format; + + if ( FT_READ_USHORT( numTables ) ) + return error; + if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */ + return error; + + pstable_index = -1; + *is_sfnt_cid = FALSE; + + for ( i = 0; i < numTables; i++ ) + { + if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) || + FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) ) + return error; + + if ( tag == TTAG_CID ) + { + pstable_index++; + *offset += 22; + *length -= 22; + *is_sfnt_cid = TRUE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + else if ( tag == TTAG_TYP1 ) + { + pstable_index++; + *offset += 24; + *length -= 24; + *is_sfnt_cid = FALSE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + if ( face_index >= 0 && pstable_index == face_index ) + return FT_Err_Ok; + } + return FT_Err_Table_Missing; + } + + + FT_LOCAL_DEF( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ) + { + FT_Error error; + FT_Memory memory = library->memory; + FT_ULong offset, length; + FT_Long pos; + FT_Bool is_sfnt_cid; + FT_Byte* sfnt_ps; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + pos = FT_Stream_Pos( stream ); + + error = ft_lookup_PS_in_sfnt_stream( stream, + face_index, + &offset, + &length, + &is_sfnt_cid ); + if ( error ) + goto Exit; + + if ( FT_Stream_Seek( stream, pos + offset ) ) + goto Exit; + + if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length ); + if ( error ) + goto Exit; + + error = open_face_from_buffer( library, + sfnt_ps, + length, + face_index < 0 ? face_index : 0, + is_sfnt_cid ? "cid" : "type1", + aface ); + Exit: + { + FT_Error error1; + + + if ( error == FT_Err_Unknown_File_Format ) + { + error1 = FT_Stream_Seek( stream, pos ); + if ( error1 ) + return error1; + } + + return error; + } + } + + +#if !defined( FT_MACINTOSH ) || defined( DARWIN_NO_CARBON ) + + /* The resource header says we've got resource_cnt `POST' (type1) */ + /* resources in this file. They all need to be coalesced into */ + /* one lump which gets passed on to the type1 driver. */ + /* Here can be only one PostScript font in a file so face_index */ + /* must be 0 (or -1). */ + /* */ + static FT_Error + Mac_Read_POST_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Error error = FT_Err_Cannot_Open_Resource; + FT_Memory memory = library->memory; + FT_Byte* pfb_data; + int i, type, flags; + FT_Long len; + FT_Long pfb_len, pfb_pos, pfb_lenpos; + FT_Long rlen, temp; + + + if ( face_index == -1 ) + face_index = 0; + if ( face_index != 0 ) + return error; + + /* Find the length of all the POST resources, concatenated. Assume */ + /* worst case (each resource in its own section). */ + pfb_len = 0; + for ( i = 0; i < resource_cnt; ++i ) + { + error = FT_Stream_Seek( stream, offsets[i] ); + if ( error ) + goto Exit; + if ( FT_READ_LONG( temp ) ) + goto Exit; + pfb_len += temp + 6; + } + + if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) + goto Exit; + + pfb_data[0] = 0x80; + pfb_data[1] = 1; /* Ascii section */ + pfb_data[2] = 0; /* 4-byte length, fill in later */ + pfb_data[3] = 0; + pfb_data[4] = 0; + pfb_data[5] = 0; + pfb_pos = 6; + pfb_lenpos = 2; + + len = 0; + type = 1; + for ( i = 0; i < resource_cnt; ++i ) + { + error = FT_Stream_Seek( stream, offsets[i] ); + if ( error ) + goto Exit2; + if ( FT_READ_LONG( rlen ) ) + goto Exit; + if ( FT_READ_USHORT( flags ) ) + goto Exit; + rlen -= 2; /* the flags are part of the resource */ + if ( ( flags >> 8 ) == type ) + len += rlen; + else + { + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + if ( ( flags >> 8 ) == 5 ) /* End of font mark */ + break; + + pfb_data[pfb_pos++] = 0x80; + + type = flags >> 8; + len = rlen; + + pfb_data[pfb_pos++] = (FT_Byte)type; + pfb_lenpos = pfb_pos; + pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + } + + error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); + pfb_pos += rlen; + } + + pfb_data[pfb_pos++] = 0x80; + pfb_data[pfb_pos++] = 3; + + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + return open_face_from_buffer( library, + pfb_data, + pfb_pos, + face_index, + "type1", + aface ); + + Exit2: + FT_FREE( pfb_data ); + + Exit: + return error; + } + + + /* The resource header says we've got resource_cnt `sfnt' */ + /* (TrueType/OpenType) resources in this file. Look through */ + /* them for the one indicated by face_index, load it into mem, */ + /* pass it on the the truetype driver and return it. */ + /* */ + static FT_Error + Mac_Read_sfnt_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Byte* sfnt_data; + FT_Error error; + FT_Long flag_offset; + FT_Long rlen; + int is_cff; + FT_Long face_index_in_resource = 0; + + + if ( face_index == -1 ) + face_index = 0; + if ( face_index >= resource_cnt ) + return FT_Err_Cannot_Open_Resource; + + flag_offset = offsets[face_index]; + error = FT_Stream_Seek( stream, flag_offset ); + if ( error ) + goto Exit; + + if ( FT_READ_LONG( rlen ) ) + goto Exit; + if ( rlen == -1 ) + return FT_Err_Cannot_Open_Resource; + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ); + if ( !error ) + goto Exit; + + /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */ + if ( FT_Stream_Seek( stream, flag_offset + 4 ) ) + goto Exit; + + if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) ) + return error; + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen ); + if ( error ) + goto Exit; + + is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + error = open_face_from_buffer( library, + sfnt_data, + rlen, + face_index_in_resource, + is_cff ? "cff" : "truetype", + aface ); + + Exit: + return error; + } + + + /* Check for a valid resource fork header, or a valid dfont */ + /* header. In a resource fork the first 16 bytes are repeated */ + /* at the location specified by bytes 4-7. In a dfont bytes */ + /* 4-7 point to 16 bytes of zeroes instead. */ + /* */ + static FT_Error + IsMacResource( FT_Library library, + FT_Stream stream, + FT_Long resource_offset, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Long map_offset, rdara_pos; + FT_Long *data_offsets; + FT_Long count; + + + error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, + &map_offset, &rdara_pos ); + if ( error ) + return error; + + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdara_pos, + TTAG_POST, + &data_offsets, &count ); + if ( !error ) + { + error = Mac_Read_POST_Resource( library, stream, data_offsets, count, + face_index, aface ); + FT_FREE( data_offsets ); + /* POST exists in an LWFN providing a single face */ + if ( !error ) + (*aface)->num_faces = 1; + return error; + } + + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdara_pos, + TTAG_sfnt, + &data_offsets, &count ); + if ( !error ) + { + FT_Long face_index_internal = face_index % count; + + + error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count, + face_index_internal, aface ); + FT_FREE( data_offsets ); + if ( !error ) + (*aface)->num_faces = count; + } + + return error; + } + + + /* Check for a valid macbinary header, and if we find one */ + /* check that the (flattened) resource fork in it is valid. */ + /* */ + static FT_Error + IsMacBinary( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface ) + { + unsigned char header[128]; + FT_Error error; + FT_Long dlen, offset; + + + if ( NULL == stream ) + return FT_Err_Invalid_Stream_Operation; + + error = FT_Stream_Seek( stream, 0 ); + if ( error ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte*)header, 128 ); + if ( error ) + goto Exit; + + if ( header[ 0] != 0 || + header[74] != 0 || + header[82] != 0 || + header[ 1] == 0 || + header[ 1] > 33 || + header[63] != 0 || + header[2 + header[1]] != 0 ) + return FT_Err_Unknown_File_Format; + + dlen = ( header[0x53] << 24 ) | + ( header[0x54] << 16 ) | + ( header[0x55] << 8 ) | + header[0x56]; +#if 0 + rlen = ( header[0x57] << 24 ) | + ( header[0x58] << 16 ) | + ( header[0x59] << 8 ) | + header[0x5a]; +#endif /* 0 */ + offset = 128 + ( ( dlen + 127 ) & ~127 ); + + return IsMacResource( library, stream, offset, face_index, aface ); + + Exit: + return error; + } + + + static FT_Error + load_face_in_embedded_rfork( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_Memory memory = library->memory; + FT_Error error = FT_Err_Unknown_File_Format; + int i; + + char * file_names[FT_RACCESS_N_RULES]; + FT_Long offsets[FT_RACCESS_N_RULES]; + FT_Error errors[FT_RACCESS_N_RULES]; + + FT_Open_Args args2; + FT_Stream stream2 = 0; + + + FT_Raccess_Guess( library, stream, + args->pathname, file_names, offsets, errors ); + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + if ( errors[i] ) + { + FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i )); + continue; + } + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_names[i] ? file_names[i] : args->pathname; + + FT_TRACE3(( "Try rule %d: %s (offset=%d) ...", + i, args2.pathname, offsets[i] )); + + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + { + FT_TRACE3(( "failed\n" )); + continue; + } + + error = IsMacResource( library, stream2, offsets[i], + face_index, aface ); + FT_Stream_Free( stream2, 0 ); + + FT_TRACE3(( "%s\n", error ? "failed": "successful" )); + + if ( !error ) + break; + } + + for (i = 0; i < FT_RACCESS_N_RULES; i++) + { + if ( file_names[i] ) + FT_FREE( file_names[i] ); + } + + /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */ + if ( error ) + error = FT_Err_Unknown_File_Format; + + return error; + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + + /* Check for some macintosh formats without Carbon framework. */ + /* Is this a macbinary file? If so look at the resource fork. */ + /* Is this a mac dfont file? */ + /* Is this an old style resource fork? (in data) */ + /* Else call load_face_in_embedded_rfork to try extra rules */ + /* (defined in `ftrfork.c'). */ + /* */ + static FT_Error + load_mac_face( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + FT_Error error; + FT_UNUSED( args ); + + + error = IsMacBinary( library, stream, face_index, aface ); + if ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_TRACE3(( "Try as dfont: %s ...", args->pathname )); + + error = IsMacResource( library, stream, 0, face_index, aface ); + + FT_TRACE3(( "%s\n", error ? "failed" : "successful" )); + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format || + FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) && + ( args->flags & FT_OPEN_PATHNAME ) ) + error = load_face_in_embedded_rfork( library, stream, + face_index, aface, args ); + return error; + } +#endif + +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_Stream stream = 0; + FT_Face face = 0; + FT_ListNode node = 0; + FT_Bool external_stream; + FT_Module* cur; + FT_Module* limit; + + + /* test for valid `library' delayed to */ + /* FT_Stream_New() */ + + if ( ( !aface && face_index >= 0 ) || !args ) + return FT_Err_Invalid_Argument; + + external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) && + args->stream ); + + /* create input stream */ + error = FT_Stream_New( library, args, &stream ); + if ( error ) + goto Fail3; + + memory = library->memory; + + /* If the font driver is specified in the `args' structure, use */ + /* it. Otherwise, we scan the list of registered drivers. */ + if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver ) + { + driver = FT_DRIVER( args->driver ); + + /* not all modules are drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( driver ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = 0; + + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + } + else + error = FT_Err_Invalid_Handle; + + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + else + { + /* check each font driver for an appropriate format */ + cur = library->modules; + limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + /* not all modules are font drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( cur[0] ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = 0; + + + driver = FT_DRIVER( cur[0] ); + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && + FT_ERROR_BASE( error ) == FT_Err_Table_Missing ) + { + /* TrueType but essential tables are missing */ + if ( FT_Stream_Seek( stream, 0 ) ) + break; + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + num_params, + params, + aface ); + if ( !error ) + { + FT_Stream_Free( stream, external_stream ); + return error; + } + } +#endif + + if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) + goto Fail3; + } + } + + Fail3: + /* If we are on the mac, and we get an FT_Err_Invalid_Stream_Operation */ + /* it may be because we have an empty data fork, so we need to check */ + /* the resource fork. */ + if ( FT_ERROR_BASE( error ) != FT_Err_Cannot_Open_Stream && + FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format && + FT_ERROR_BASE( error ) != FT_Err_Invalid_Stream_Operation ) + goto Fail2; + +#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) + error = load_mac_face( library, stream, face_index, aface, args ); + if ( !error ) + { + /* We don't want to go to Success here. We've already done that. */ + /* On the other hand, if we succeeded we still need to close this */ + /* stream (we opened a different stream which extracted the */ + /* interesting information out of this stream here. That stream */ + /* will still be open and the face will point to it). */ + FT_Stream_Free( stream, external_stream ); + return error; + } + + if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format ) + goto Fail2; +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + /* no driver is able to handle this format */ + error = FT_Err_Unknown_File_Format; + + Fail2: + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + + Success: + FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" )); + + /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */ + if ( external_stream ) + face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM; + + /* add the face object to its driver's list */ + if ( FT_NEW( node ) ) + goto Fail; + + node->data = face; + /* don't assume driver is the same as face->driver, so use */ + /* face->driver instead. */ + FT_List_Add( &face->driver->faces_list, node ); + + /* now allocate a glyph slot object for the face */ + FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" )); + + if ( face_index >= 0 ) + { + error = FT_New_GlyphSlot( face, NULL ); + if ( error ) + goto Fail; + + /* finally, allocate a size object for the face */ + { + FT_Size size; + + + FT_TRACE4(( "FT_Open_Face: Creating size object\n" )); + + error = FT_New_Size( face, &size ); + if ( error ) + goto Fail; + + face->size = size; + } + } + + /* some checks */ + + if ( FT_IS_SCALABLE( face ) ) + { + if ( face->height < 0 ) + face->height = (FT_Short)-face->height; + + if ( !FT_HAS_VERTICAL( face ) ) + face->max_advance_height = (FT_Short)face->height; + } + + if ( FT_HAS_FIXED_SIZES( face ) ) + { + FT_Int i; + + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( bsize->height < 0 ) + bsize->height = (FT_Short)-bsize->height; + if ( bsize->x_ppem < 0 ) + bsize->x_ppem = (FT_Short)-bsize->x_ppem; + if ( bsize->y_ppem < 0 ) + bsize->y_ppem = -bsize->y_ppem; + } + } + + /* initialize internal face data */ + { + FT_Face_Internal internal = face->internal; + + + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + } + + if ( aface ) + *aface = face; + else + FT_Done_Face( face ); + + goto Exit; + + Fail: + FT_Done_Face( face ); + + Exit: + FT_TRACE4(( "FT_Open_Face: Return %d\n", error )); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ) + { + FT_Open_Args open; + + + /* test for valid `face' delayed to FT_Attach_Stream() */ + + if ( !filepathname ) + return FT_Err_Invalid_Argument; + + open.stream = NULL; + open.flags = FT_OPEN_PATHNAME; + open.pathname = (char*)filepathname; + + return FT_Attach_Stream( face, &open ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ) + { + FT_Stream stream; + FT_Error error; + FT_Driver driver; + + FT_Driver_Class clazz; + + + /* test for valid `parameters' delayed to FT_Stream_New() */ + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + if ( !driver ) + return FT_Err_Invalid_Driver_Handle; + + error = FT_Stream_New( driver->root.library, parameters, &stream ); + if ( error ) + goto Exit; + + /* we implement FT_Attach_Stream in each driver through the */ + /* `attach_file' interface */ + + error = FT_Err_Unimplemented_Feature; + clazz = driver->clazz; + if ( clazz->attach_file ) + error = clazz->attach_file( face, stream ); + + /* close the attached stream */ + FT_Stream_Free( stream, + (FT_Bool)( parameters->stream && + ( parameters->flags & FT_OPEN_STREAM ) ) ); + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Face( FT_Face face ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_ListNode node; + + + error = FT_Err_Invalid_Face_Handle; + if ( face && face->driver ) + { + driver = face->driver; + memory = driver->root.memory; + + /* find face in driver's list */ + node = FT_List_Find( &driver->faces_list, face ); + if ( node ) + { + /* remove face object from the driver's list */ + FT_List_Remove( &driver->faces_list, node ); + FT_FREE( node ); + + /* now destroy the object proper */ + destroy_face( memory, face, driver ); + error = FT_Err_Ok; + } + } + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size *asize ) + { + FT_Error error; + FT_Memory memory; + FT_Driver driver; + FT_Driver_Class clazz; + + FT_Size size = 0; + FT_ListNode node = 0; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !asize ) + return FT_Err_Invalid_Size_Handle; + + if ( !face->driver ) + return FT_Err_Invalid_Driver_Handle; + + *asize = 0; + + driver = face->driver; + clazz = driver->clazz; + memory = face->memory; + + /* Allocate new size object and perform basic initialisation */ + if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) ) + goto Exit; + + size->face = face; + + /* for now, do not use any internal fields in size objects */ + size->internal = 0; + + if ( clazz->init_size ) + error = clazz->init_size( size ); + + /* in case of success, add to the face's list */ + if ( !error ) + { + *asize = size; + node->data = size; + FT_List_Add( &face->sizes_list, node ); + } + + Exit: + if ( error ) + { + FT_FREE( node ); + FT_FREE( size ); + } + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Size( FT_Size size ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_Face face; + FT_ListNode node; + + + if ( !size ) + return FT_Err_Invalid_Size_Handle; + + face = size->face; + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + driver = face->driver; + if ( !driver ) + return FT_Err_Invalid_Driver_Handle; + + memory = driver->root.memory; + + error = FT_Err_Ok; + node = FT_List_Find( &face->sizes_list, size ); + if ( node ) + { + FT_List_Remove( &face->sizes_list, node ); + FT_FREE( node ); + + if ( face->size == size ) + { + face->size = 0; + if ( face->sizes_list.head ) + face->size = (FT_Size)(face->sizes_list.head->data); + } + + destroy_size( memory, size, driver ); + } + else + error = FT_Err_Invalid_Size_Handle; + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ) + { + FT_Int i; + FT_Long w, h; + + + if ( !FT_HAS_FIXED_SIZES( face ) ) + return FT_Err_Invalid_Face_Handle; + + /* FT_Bitmap_Size doesn't provide enough info... */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + return FT_Err_Unimplemented_Feature; + + w = FT_REQUEST_WIDTH ( req ); + h = FT_REQUEST_HEIGHT( req ); + + if ( req->width && !req->height ) + h = w; + else if ( !req->width && req->height ) + w = h; + + w = FT_PIX_ROUND( w ); + h = FT_PIX_ROUND( h ); + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( h != FT_PIX_ROUND( bsize->y_ppem ) ) + continue; + + if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width ) + { + if ( size_index ) + *size_index = (FT_ULong)i; + + return FT_Err_Ok; + } + } + + return FT_Err_Invalid_Pixel_Size; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ) + { + FT_Pos height = metrics->height; + + + /* compensate for glyph with bbox above/below the baseline */ + if ( metrics->horiBearingY < 0 ) + { + if ( height < metrics->horiBearingY ) + height = metrics->horiBearingY; + } + else if ( metrics->horiBearingY > 0 ) + height -= metrics->horiBearingY; + + /* the factor 1.2 is a heuristical value */ + if ( !advance ) + advance = height * 12 / 10; + + metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2; + metrics->vertBearingY = ( advance - height ) / 2; + metrics->vertAdvance = advance; + } + + + static void + ft_recompute_scaled_metrics( FT_Face face, + FT_Size_Metrics* metrics ) + { + /* Compute root ascender, descender, test height, and max_advance */ + +#ifdef GRID_FIT_METRICS + metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, + metrics->y_scale ) ); + + metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, + metrics->y_scale ) ); + + metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, + metrics->y_scale ) ); + + metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, + metrics->x_scale ) ); +#else /* !GRID_FIT_METRICS */ + metrics->ascender = FT_MulFix( face->ascender, + metrics->y_scale ); + + metrics->descender = FT_MulFix( face->descender, + metrics->y_scale ); + + metrics->height = FT_MulFix( face->height, + metrics->y_scale ); + + metrics->max_advance = FT_MulFix( face->max_advance_width, + metrics->x_scale ); +#endif /* !GRID_FIT_METRICS */ + } + + + FT_BASE_DEF( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ) + { + FT_Size_Metrics* metrics; + FT_Bitmap_Size* bsize; + + + metrics = &face->size->metrics; + bsize = face->available_sizes + strike_index; + + metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 ); + + if ( FT_IS_SCALABLE( face ) ) + { + metrics->x_scale = FT_DivFix( bsize->x_ppem, + face->units_per_EM ); + metrics->y_scale = FT_DivFix( bsize->y_ppem, + face->units_per_EM ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + metrics->ascender = bsize->y_ppem; + metrics->descender = 0; + metrics->height = bsize->height << 6; + metrics->max_advance = bsize->x_ppem; + } + } + + + FT_BASE_DEF( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ) + { + FT_Size_Metrics* metrics; + + + metrics = &face->size->metrics; + + if ( FT_IS_SCALABLE( face ) ) + { + FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0; + + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + w = h = face->units_per_EM; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + w = h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_BBOX: + w = face->bbox.xMax - face->bbox.xMin; + h = face->bbox.yMax - face->bbox.yMin; + break; + + case FT_SIZE_REQUEST_TYPE_CELL: + w = face->max_advance_width; + h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_SCALES: + metrics->x_scale = (FT_Fixed)req->width; + metrics->y_scale = (FT_Fixed)req->height; + if ( !metrics->x_scale ) + metrics->x_scale = metrics->y_scale; + else if ( !metrics->y_scale ) + metrics->y_scale = metrics->x_scale; + goto Calculate_Ppem; + + case FT_SIZE_REQUEST_TYPE_MAX: + break; + } + + /* to be on the safe side */ + if ( w < 0 ) + w = -w; + + if ( h < 0 ) + h = -h; + + scaled_w = FT_REQUEST_WIDTH ( req ); + scaled_h = FT_REQUEST_HEIGHT( req ); + + /* determine scales */ + if ( req->width ) + { + metrics->x_scale = FT_DivFix( scaled_w, w ); + + if ( req->height ) + { + metrics->y_scale = FT_DivFix( scaled_h, h ); + + if ( req->type == FT_SIZE_REQUEST_TYPE_CELL ) + { + if ( metrics->y_scale > metrics->x_scale ) + metrics->y_scale = metrics->x_scale; + else + metrics->x_scale = metrics->y_scale; + } + } + else + { + metrics->y_scale = metrics->x_scale; + scaled_h = FT_MulDiv( scaled_w, h, w ); + } + } + else + { + metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h ); + scaled_w = FT_MulDiv( scaled_h, w, h ); + } + + Calculate_Ppem: + /* calculate the ppems */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + { + scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale ); + scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale ); + } + + metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + FT_ZERO( metrics ); + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ) + { + FT_Driver_Class clazz; + + + if ( !face || !FT_HAS_FIXED_SIZES( face ) ) + return FT_Err_Invalid_Face_Handle; + + if ( strike_index < 0 || strike_index >= face->num_fixed_sizes ) + return FT_Err_Invalid_Argument; + + clazz = face->driver->clazz; + + if ( clazz->select_size ) + return clazz->select_size( face->size, (FT_ULong)strike_index ); + + FT_Select_Metrics( face, (FT_ULong)strike_index ); + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ) + { + FT_Driver_Class clazz; + FT_ULong strike_index; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !req || req->width < 0 || req->height < 0 || + req->type >= FT_SIZE_REQUEST_TYPE_MAX ) + return FT_Err_Invalid_Argument; + + clazz = face->driver->clazz; + + if ( clazz->request_size ) + return clazz->request_size( face->size, req ); + + /* + * The reason that a driver doesn't have `request_size' defined is + * either that the scaling here suffices or that the supported formats + * are bitmap-only and size matching is not implemented. + * + * In the latter case, a simple size matching is done. + */ + if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) ) + { + FT_Error error; + + + error = FT_Match_Size( face, req, 0, &strike_index ); + if ( error ) + return error; + + FT_TRACE3(( "FT_Request_Size: bitmap strike %lu matched\n", + strike_index )); + + return FT_Select_Size( face, (FT_Int)strike_index ); + } + + FT_Request_Metrics( face, req ); + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ) + { + FT_Size_RequestRec req; + + + if ( !char_width ) + char_width = char_height; + else if ( !char_height ) + char_height = char_width; + + if ( !horz_resolution ) + horz_resolution = vert_resolution; + else if ( !vert_resolution ) + vert_resolution = horz_resolution; + + if ( char_width < 1 * 64 ) + char_width = 1 * 64; + if ( char_height < 1 * 64 ) + char_height = 1 * 64; + + if ( !horz_resolution ) + horz_resolution = vert_resolution = 72; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = char_width; + req.height = char_height; + req.horiResolution = horz_resolution; + req.vertResolution = vert_resolution; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ) + { + FT_Size_RequestRec req; + + + if ( pixel_width == 0 ) + pixel_width = pixel_height; + else if ( pixel_height == 0 ) + pixel_height = pixel_width; + + if ( pixel_width < 1 ) + pixel_width = 1; + if ( pixel_height < 1 ) + pixel_height = 1; + + /* use `>=' to avoid potential compiler warning on 16bit platforms */ + if ( pixel_width >= 0xFFFFU ) + pixel_width = 0xFFFFU; + if ( pixel_height >= 0xFFFFU ) + pixel_height = 0xFFFFU; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = pixel_width << 6; + req.height = pixel_height << 6; + req.horiResolution = 0; + req.vertResolution = 0; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ) + { + FT_Error error = FT_Err_Ok; + FT_Driver driver; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !akerning ) + return FT_Err_Invalid_Argument; + + driver = face->driver; + + akerning->x = 0; + akerning->y = 0; + + if ( driver->clazz->get_kerning ) + { + error = driver->clazz->get_kerning( face, + left_glyph, + right_glyph, + akerning ); + if ( !error ) + { + if ( kern_mode != FT_KERNING_UNSCALED ) + { + akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale ); + akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale ); + + if ( kern_mode != FT_KERNING_UNFITTED ) + { + /* we scale down kerning values for small ppem values */ + /* to avoid that rounding makes them too big. */ + /* `25' has been determined heuristically. */ + if ( face->size->metrics.x_ppem < 25 ) + akerning->x = FT_MulDiv( akerning->x, + face->size->metrics.x_ppem, 25 ); + if ( face->size->metrics.y_ppem < 25 ) + akerning->y = FT_MulDiv( akerning->y, + face->size->metrics.y_ppem, 25 ); + + akerning->x = FT_PIX_ROUND( akerning->x ); + akerning->y = FT_PIX_ROUND( akerning->y ); + } + } + } + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ) + { + FT_Service_Kerning service; + FT_Error error = FT_Err_Ok; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( !akerning ) + return FT_Err_Invalid_Argument; + + FT_FACE_FIND_SERVICE( face, service, KERNING ); + if ( !service ) + return FT_Err_Unimplemented_Feature; + + error = service->get_track( face, + point_size, + degree, + akerning ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + if ( encoding == FT_ENCODING_NONE ) + return FT_Err_Invalid_Argument; + + /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */ + /* charmap available, i.e., one with UCS-4 characters, if possible. */ + /* */ + /* This is done by find_unicode_charmap() above, to share code. */ + if ( encoding == FT_ENCODING_UNICODE ) + return find_unicode_charmap( face ); + + cur = face->charmaps; + if ( !cur ) + return FT_Err_Invalid_CharMap_Handle; + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0]->encoding == encoding ) + { + face->charmap = cur[0]; + return 0; + } + } + + return FT_Err_Invalid_Argument; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_Err_Invalid_Face_Handle; + + cur = face->charmaps; + if ( !cur ) + return FT_Err_Invalid_CharMap_Handle; + if ( FT_Get_CMap_Format( charmap ) == 14 ) + return FT_Err_Invalid_Argument; + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == charmap ) + { + face->charmap = cur[0]; + return 0; + } + } + return FT_Err_Invalid_Argument; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ) + { + FT_Int i; + + + for ( i = 0; i < charmap->face->num_charmaps; i++ ) + if ( charmap->face->charmaps[i] == charmap ) + break; + + FT_ASSERT( i < charmap->face->num_charmaps ); + + return i; + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ) + { + FT_CMap_Class clazz = cmap->clazz; + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY(face); + + + if ( clazz->done ) + clazz->done( cmap ); + + FT_FREE( cmap ); + } + + + FT_BASE_DEF( void ) + FT_CMap_Done( FT_CMap cmap ) + { + if ( cmap ) + { + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Error error; + FT_Int i, j; + + + for ( i = 0; i < face->num_charmaps; i++ ) + { + if ( (FT_CMap)face->charmaps[i] == cmap ) + { + FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1]; + + + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps - 1 ) ) + return; + + /* remove it from our list of charmaps */ + for ( j = i + 1; j < face->num_charmaps; j++ ) + { + if ( j == face->num_charmaps - 1 ) + face->charmaps[j - 1] = last_charmap; + else + face->charmaps[j - 1] = face->charmaps[j]; + } + + face->num_charmaps--; + + if ( (FT_CMap)face->charmap == cmap ) + face->charmap = NULL; + + ft_cmap_done_internal( cmap ); + + break; + } + } + } + } + + + FT_BASE_DEF( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ) + { + FT_Error error = FT_Err_Ok; + FT_Face face; + FT_Memory memory; + FT_CMap cmap; + + + if ( clazz == NULL || charmap == NULL || charmap->face == NULL ) + return FT_Err_Invalid_Argument; + + face = charmap->face; + memory = FT_FACE_MEMORY( face ); + + if ( !FT_ALLOC( cmap, clazz->size ) ) + { + cmap->charmap = *charmap; + cmap->clazz = clazz; + + if ( clazz->init ) + { + error = clazz->init( cmap, init_data ); + if ( error ) + goto Fail; + } + + /* add it to our list of charmaps */ + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps + 1 ) ) + goto Fail; + + face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap; + } + + Exit: + if ( acmap ) + *acmap = cmap; + + return error; + + Fail: + ft_cmap_done_internal( cmap ); + cmap = NULL; + goto Exit; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ) + { + FT_UInt result = 0; + + + if ( face && face->charmap ) + { + FT_CMap cmap = FT_CMAP( face->charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode ); + } + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + if ( face && face->charmap ) + { + gindex = FT_Get_Char_Index( face, 0 ); + if ( gindex == 0 ) + result = FT_Get_Next_Char( face, 0, &gindex ); + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong charcode, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + if ( face && face->charmap ) + { + FT_UInt32 code = (FT_UInt32)charcode; + FT_CMap cmap = FT_CMAP( face->charmap ); + + + gindex = cmap->clazz->char_next( cmap, &code ); + result = ( gindex == 0 ) ? 0 : code; + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_UInt result = 0; + + + if ( face && face->charmap && + face->charmap->encoding == FT_ENCODING_UNICODE ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + FT_CMap ucmap = FT_CMAP( face->charmap ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->char_var_index( vcmap, ucmap, + (FT_UInt32)charcode, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_Int result = -1; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->char_var_default( vcmap, + (FT_UInt32)charcode, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + result = vcmap->clazz->variant_list( vcmap, memory ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + + result = vcmap->clazz->charvariant_list( vcmap, memory, + (FT_UInt32)charcode ); + } + } + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap != NULL ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->variantchar_list( vcmap, memory, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ) + { + FT_UInt result = 0; + + + if ( face && FT_HAS_GLYPH_NAMES( face ) ) + { + FT_Service_GlyphDict service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); + + if ( service && service->name_index ) + result = service->name_index( face, glyph_name ); + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + /* clean up buffer */ + if ( buffer && buffer_max > 0 ) + ((FT_Byte*)buffer)[0] = 0; + + if ( face && + (FT_Long)glyph_index <= face->num_glyphs && + FT_HAS_GLYPH_NAMES( face ) ) + { + FT_Service_GlyphDict service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); + + if ( service && service->get_name ) + error = service->get_name( face, glyph_index, buffer, buffer_max ); + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_Postscript_Name( FT_Face face ) + { + const char* result = NULL; + + + if ( !face ) + goto Exit; + + if ( !result ) + { + FT_Service_PsFontName service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + POSTSCRIPT_FONT_NAME ); + + if ( service && service->get_ps_font_name ) + result = service->get_ps_font_name( face ); + } + + Exit: + return result; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ) + { + void* table = 0; + FT_Service_SFNT_Table service; + + + if ( face && FT_IS_SFNT( face ) ) + { + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service != NULL ) + table = service->get_table( face, tag ); + } + + return table; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Service_SFNT_Table service; + + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_Err_Invalid_Face_Handle; + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service == NULL ) + return FT_Err_Unimplemented_Feature; + + return service->load_table( face, tag, offset, buffer, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ) + { + FT_Service_SFNT_Table service; + FT_ULong offset; + + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_Err_Invalid_Face_Handle; + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service == NULL ) + return FT_Err_Unimplemented_Feature; + + return service->table_info( face, table_index, tag, &offset, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return 0; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( service == NULL ) + return 0; + if ( service->get_cmap_info( charmap, &cmap_info )) + return 0; + + return cmap_info.language; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return -1; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( service == NULL ) + return -1; + if ( service->get_cmap_info( charmap, &cmap_info )) + return -1; + + return cmap_info.format; + } + + + /* documentation is in ftsizes.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Activate_Size( FT_Size size ) + { + FT_Face face; + + + if ( size == NULL ) + return FT_Err_Invalid_Argument; + + face = size->face; + if ( face == NULL || face->driver == NULL ) + return FT_Err_Invalid_Argument; + + /* we don't need anything more complex than that; all size objects */ + /* are already listed by the face */ + face->size = size; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* lookup a renderer by glyph format in the library's list */ + FT_BASE_DEF( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ) + { + FT_ListNode cur; + FT_Renderer result = 0; + + + if ( !library ) + goto Exit; + + cur = library->renderers.head; + + if ( node ) + { + if ( *node ) + cur = (*node)->next; + *node = 0; + } + + while ( cur ) + { + FT_Renderer renderer = FT_RENDERER( cur->data ); + + + if ( renderer->glyph_format == format ) + { + if ( node ) + *node = cur; + + result = renderer; + break; + } + cur = cur->next; + } + + Exit: + return result; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ) + { + FT_Face face = slot->face; + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Renderer result = library->cur_renderer; + + + if ( !result || result->glyph_format != slot->format ) + result = FT_Lookup_Renderer( library, slot->format, 0 ); + + return result; + } + + + static void + ft_set_current_renderer( FT_Library library ) + { + FT_Renderer renderer; + + + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 ); + library->cur_renderer = renderer; + } + + + static FT_Error + ft_add_renderer( FT_Module module ) + { + FT_Library library = module->library; + FT_Memory memory = library->memory; + FT_Error error; + FT_ListNode node; + + + if ( FT_NEW( node ) ) + goto Exit; + + { + FT_Renderer render = FT_RENDERER( module ); + FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz; + + + render->clazz = clazz; + render->glyph_format = clazz->glyph_format; + + /* allocate raster object if needed */ + if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + clazz->raster_class->raster_new ) + { + error = clazz->raster_class->raster_new( memory, &render->raster ); + if ( error ) + goto Fail; + + render->raster_render = clazz->raster_class->raster_render; + render->render = clazz->render_glyph; + } + + /* add to list */ + node->data = module; + FT_List_Add( &library->renderers, node ); + + ft_set_current_renderer( library ); + } + + Fail: + if ( error ) + FT_FREE( node ); + + Exit: + return error; + } + + + static void + ft_remove_renderer( FT_Module module ) + { + FT_Library library = module->library; + FT_Memory memory = library->memory; + FT_ListNode node; + + + node = FT_List_Find( &library->renderers, module ); + if ( node ) + { + FT_Renderer render = FT_RENDERER( module ); + + + /* release raster object, if any */ + if ( render->raster ) + render->clazz->raster_class->raster_done( render->raster ); + + /* remove from list */ + FT_List_Remove( &library->renderers, node ); + FT_FREE( node ); + + ft_set_current_renderer( library ); + } + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ) + { + /* test for valid `library' delayed to FT_Lookup_Renderer() */ + + return FT_Lookup_Renderer( library, format, 0 ); + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ) + { + FT_ListNode node; + FT_Error error = FT_Err_Ok; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !renderer ) + return FT_Err_Invalid_Argument; + + node = FT_List_Find( &library->renderers, renderer ); + if ( !node ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_List_Up( &library->renderers, node ); + + if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE ) + library->cur_renderer = renderer; + + if ( num_params > 0 ) + { + FT_Renderer_SetModeFunc set_mode = renderer->clazz->set_mode; + + + for ( ; num_params > 0; num_params-- ) + { + error = set_mode( renderer, parameters->tag, parameters->data ); + if ( error ) + break; + } + } + + Exit: + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Error error = FT_Err_Ok; + FT_Renderer renderer; + + + /* if it is already a bitmap, no need to do anything */ + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_BITMAP: /* already a bitmap, don't do anything */ + break; + + default: + { + FT_ListNode node = 0; + FT_Bool update = 0; + + + /* small shortcut for the very common case */ + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + renderer = library->cur_renderer; + node = library->renderers.head; + } + else + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + + error = FT_Err_Unimplemented_Feature; + while ( renderer ) + { + error = renderer->render( renderer, slot, render_mode, NULL ); + if ( !error || + FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format. */ + + /* now, look for another renderer that supports the same */ + /* format. */ + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + update = 1; + } + + /* if we changed the current renderer for the glyph image format */ + /* we need to select it as the next current one */ + if ( !error && update && renderer ) + FT_Set_Renderer( library, renderer, 0, 0 ); + } + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Library library; + + + if ( !slot ) + return FT_Err_Invalid_Argument; + + library = FT_FACE_LIBRARY( slot->face ); + + return FT_Render_Glyph_Internal( library, slot, render_mode ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Destroy_Module */ + /* */ + /* <Description> */ + /* Destroys a given module object. For drivers, this also destroys */ + /* all child faces. */ + /* */ + /* <InOut> */ + /* module :: A handle to the target driver object. */ + /* */ + /* <Note> */ + /* The driver _must_ be LOCKED! */ + /* */ + static void + Destroy_Module( FT_Module module ) + { + FT_Memory memory = module->memory; + FT_Module_Class* clazz = module->clazz; + FT_Library library = module->library; + + + /* finalize client-data - before anything else */ + if ( module->generic.finalizer ) + module->generic.finalizer( module ); + + if ( library && library->auto_hinter == module ) + library->auto_hinter = 0; + + /* if the module is a renderer */ + if ( FT_MODULE_IS_RENDERER( module ) ) + ft_remove_renderer( module ); + + /* if the module is a font driver, add some steps */ + if ( FT_MODULE_IS_DRIVER( module ) ) + Destroy_Driver( FT_DRIVER( module ) ); + + /* finalize the module object */ + if ( clazz->module_done ) + clazz->module_done( module ); + + /* discard it */ + FT_FREE( module ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ) + { + FT_Error error; + FT_Memory memory; + FT_Module module; + FT_UInt nn; + + +#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \ + FREETYPE_MINOR ) + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !clazz ) + return FT_Err_Invalid_Argument; + + /* check freetype version */ + if ( clazz->module_requires > FREETYPE_VER_FIXED ) + return FT_Err_Invalid_Version; + + /* look for a module with the same name in the library's table */ + for ( nn = 0; nn < library->num_modules; nn++ ) + { + module = library->modules[nn]; + if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 ) + { + /* this installed module has the same name, compare their versions */ + if ( clazz->module_version <= module->clazz->module_version ) + return FT_Err_Lower_Module_Version; + + /* remove the module from our list, then exit the loop to replace */ + /* it by our new version.. */ + FT_Remove_Module( library, module ); + break; + } + } + + memory = library->memory; + error = FT_Err_Ok; + + if ( library->num_modules >= FT_MAX_MODULES ) + { + error = FT_Err_Too_Many_Drivers; + goto Exit; + } + + /* allocate module object */ + if ( FT_ALLOC( module, clazz->module_size ) ) + goto Exit; + + /* base initialization */ + module->library = library; + module->memory = memory; + module->clazz = (FT_Module_Class*)clazz; + + /* check whether the module is a renderer - this must be performed */ + /* before the normal module initialization */ + if ( FT_MODULE_IS_RENDERER( module ) ) + { + /* add to the renderers list */ + error = ft_add_renderer( module ); + if ( error ) + goto Fail; + } + + /* is the module a auto-hinter? */ + if ( FT_MODULE_IS_HINTER( module ) ) + library->auto_hinter = module; + + /* if the module is a font driver */ + if ( FT_MODULE_IS_DRIVER( module ) ) + { + /* allocate glyph loader if needed */ + FT_Driver driver = FT_DRIVER( module ); + + + driver->clazz = (FT_Driver_Class)module->clazz; + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + error = FT_GlyphLoader_New( memory, &driver->glyph_loader ); + if ( error ) + goto Fail; + } + } + + if ( clazz->module_init ) + { + error = clazz->module_init( module ); + if ( error ) + goto Fail; + } + + /* add module to the library's table */ + library->modules[library->num_modules++] = module; + + Exit: + return error; + + Fail: + if ( FT_MODULE_IS_DRIVER( module ) ) + { + FT_Driver driver = FT_DRIVER( module ); + + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + FT_GlyphLoader_Done( driver->glyph_loader ); + } + + if ( FT_MODULE_IS_RENDERER( module ) ) + { + FT_Renderer renderer = FT_RENDERER( module ); + + + if ( renderer->raster ) + renderer->clazz->raster_class->raster_done( renderer->raster ); + } + + FT_FREE( module ); + goto Exit; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ) + { + FT_Module result = 0; + FT_Module* cur; + FT_Module* limit; + + + if ( !library || !module_name ) + return result; + + cur = library->modules; + limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 ) + { + result = cur[0]; + break; + } + + return result; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ) + { + FT_Module module; + + + /* test for valid `library' delayed to FT_Get_Module() */ + + module = FT_Get_Module( library, mod_name ); + + return module ? module->clazz->module_interface : 0; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ) + { + FT_Pointer result = NULL; + + if ( module ) + { + FT_ASSERT( module->clazz && module->clazz->get_interface ); + + /* first, look for the service in the module + */ + if ( module->clazz->get_interface ) + result = module->clazz->get_interface( module, service_id ); + + if ( result == NULL ) + { + /* we didn't find it, look in all other modules then + */ + FT_Library library = module->library; + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] != module ) + { + FT_ASSERT( cur[0]->clazz ); + + if ( cur[0]->clazz->get_interface ) + { + result = cur[0]->clazz->get_interface( cur[0], service_id ); + if ( result != NULL ) + break; + } + } + } + } + } + + return result; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ) + { + /* try to find the module from the table, then remove it from there */ + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( module ) + { + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == module ) + { + /* remove it from the table */ + library->num_modules--; + limit--; + while ( cur < limit ) + { + cur[0] = cur[1]; + cur++; + } + limit[0] = 0; + + /* destroy the module */ + Destroy_Module( module ); + + return FT_Err_Ok; + } + } + } + return FT_Err_Invalid_Driver_Handle; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ) + { + FT_Library library = 0; + FT_Error error; + + + if ( !memory ) + return FT_Err_Invalid_Argument; + +#ifdef FT_DEBUG_LEVEL_ERROR + /* init debugging support */ + ft_debug_init(); +#endif + + /* first of all, allocate the library object */ + if ( FT_NEW( library ) ) + return error; + + library->memory = memory; + +#ifdef FT_CONFIG_OPTION_PIC + /* initialize position independent code containers */ + error = ft_pic_container_init( library ); + if ( error ) + goto Fail; +#endif + + /* allocate the render pool */ + library->raster_pool_size = FT_RENDER_POOL_SIZE; +#if FT_RENDER_POOL_SIZE > 0 + if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) ) + goto Fail; +#endif + + library->version_major = FREETYPE_MAJOR; + library->version_minor = FREETYPE_MINOR; + library->version_patch = FREETYPE_PATCH; + + /* That's ok now */ + *alibrary = library; + + return FT_Err_Ok; + + Fail: +#ifdef FT_CONFIG_OPTION_PIC + ft_pic_container_destroy( library ); +#endif + FT_FREE( library ); + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ) + { + FT_Int major = 0; + FT_Int minor = 0; + FT_Int patch = 0; + + + if ( library ) + { + major = library->version_major; + minor = library->version_minor; + patch = library->version_patch; + } + + if ( amajor ) + *amajor = major; + + if ( aminor ) + *aminor = minor; + + if ( apatch ) + *apatch = patch; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Library( FT_Library library ) + { + FT_Memory memory; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + memory = library->memory; + + /* Discard client-data */ + if ( library->generic.finalizer ) + library->generic.finalizer( library ); + + /* Close all faces in the library. If we don't do + * this, we can have some subtle memory leaks. + * Example: + * + * - the cff font driver uses the pshinter module in cff_size_done + * - if the pshinter module is destroyed before the cff font driver, + * opened FT_Face objects managed by the driver are not properly + * destroyed, resulting in a memory leak + */ + { + FT_UInt n; + + + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + FT_List faces; + + + if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) + continue; + + faces = &FT_DRIVER(module)->faces_list; + while ( faces->head ) + { + FT_Done_Face( FT_FACE( faces->head->data ) ); + if ( faces->head ) + FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" )); + } + } + } + + /* Close all other modules in the library */ +#if 1 + /* XXX Modules are removed in the reversed order so that */ + /* type42 module is removed before truetype module. This */ + /* avoids double free in some occasions. It is a hack. */ + while ( library->num_modules > 0 ) + FT_Remove_Module( library, + library->modules[library->num_modules - 1] ); +#else + { + FT_UInt n; + + + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + + + if ( module ) + { + Destroy_Module( module ); + library->modules[n] = 0; + } + } + } +#endif + + /* Destroy raster objects */ + FT_FREE( library->raster_pool ); + library->raster_pool_size = 0; + +#ifdef FT_CONFIG_OPTION_PIC + /* Destroy pic container contents */ + ft_pic_container_destroy( library ); +#endif + + FT_FREE( library ); + return FT_Err_Ok; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ) + { + if ( library && debug_hook && + hook_index < + ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) ) + library->debug_hooks[hook_index] = debug_hook; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ) + { + FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE; + + + if ( library ) + { + FT_Module module = FT_Get_Module( library, "truetype" ); + + + if ( module ) + { + FT_Service_TrueTypeEngine service; + + + service = (FT_Service_TrueTypeEngine) + ft_module_get_service( module, + FT_SERVICE_ID_TRUETYPE_ENGINE ); + if ( service ) + result = service->engine_type; + } + } + + return result; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE_DEF( FT_Error ) + ft_stub_set_char_sizes( FT_Size size, + FT_F26Dot6 width, + FT_F26Dot6 height, + FT_UInt horz_res, + FT_UInt vert_res ) + { + FT_Size_RequestRec req; + FT_Driver driver = size->face->driver; + + + if ( driver->clazz->request_size ) + { + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = width; + req.height = height; + + if ( horz_res == 0 ) + horz_res = vert_res; + + if ( vert_res == 0 ) + vert_res = horz_res; + + if ( horz_res == 0 ) + horz_res = vert_res = 72; + + req.horiResolution = horz_res; + req.vertResolution = vert_res; + + return driver->clazz->request_size( size, &req ); + } + + return 0; + } + + + FT_BASE_DEF( FT_Error ) + ft_stub_set_pixel_sizes( FT_Size size, + FT_UInt width, + FT_UInt height ) + { + FT_Size_RequestRec req; + FT_Driver driver = size->face->driver; + + + if ( driver->clazz->request_size ) + { + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = width << 6; + req.height = height << 6; + req.horiResolution = 0; + req.vertResolution = 0; + + return driver->clazz->request_size( size, &req ); + } + + return 0; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( glyph != NULL && + glyph->format == FT_GLYPH_FORMAT_COMPOSITE && + sub_index < glyph->num_subglyphs ) + { + FT_SubGlyph subg = glyph->subglyphs + sub_index; + + + *p_index = subg->index; + *p_flags = subg->flags; + *p_arg1 = subg->arg1; + *p_arg2 = subg->arg2; + *p_transform = subg->transform; + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftotval.c b/alienblaster/project/jni/freetype/src/base/ftotval.c new file mode 100644 index 000000000..20ed686ee --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftotval.c @@ -0,0 +1,84 @@ +/***************************************************************************/ +/* */ +/* ftotval.c */ +/* */ +/* FreeType API for validating OpenType tables (body). */ +/* */ +/* Copyright 2004, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_OPENTYPE_VALIDATE_H +#include FT_OPENTYPE_VALIDATE_H + + + /* documentation is in ftotval.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ) + { + FT_Service_OTvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_Err_Invalid_Face_Handle; + goto Exit; + } + + if ( !( BASE_table && + GDEF_table && + GPOS_table && + GSUB_table && + JSTF_table ) ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + BASE_table, + GDEF_table, + GPOS_table, + GSUB_table, + JSTF_table ); + else + error = FT_Err_Unimplemented_Feature; + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( table ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftoutln.c b/alienblaster/project/jni/freetype/src/base/ftoutln.c new file mode 100644 index 000000000..b69df84c0 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftoutln.c @@ -0,0 +1,1128 @@ +/***************************************************************************/ +/* */ +/* ftoutln.c */ +/* */ +/* FreeType outline management (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* All functions are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRIGONOMETRY_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_outline + + + static + const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 }; + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_UInt first; /* index of first point in contour */ + FT_Int tag; /* current point's state */ + + FT_Int shift; + FT_Pos delta; + + + if ( !outline || !func_interface ) + return FT_Err_Invalid_Argument; + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_Int last; /* index of last point in contour */ + + + FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return FT_Err_Ok; + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); + return error; + + Invalid_Outline: + return FT_Err_Invalid_Outline; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + FT_Error error; + + + if ( !anoutline || !memory ) + return FT_Err_Invalid_Argument; + + *anoutline = null_outline; + + if ( FT_NEW_ARRAY( anoutline->points, numPoints ) || + FT_NEW_ARRAY( anoutline->tags, numPoints ) || + FT_NEW_ARRAY( anoutline->contours, numContours ) ) + goto Fail; + + anoutline->n_points = (FT_UShort)numPoints; + anoutline->n_contours = (FT_Short)numContours; + anoutline->flags |= FT_OUTLINE_OWNER; + + return FT_Err_Ok; + + Fail: + anoutline->flags |= FT_OUTLINE_OWNER; + FT_Outline_Done_Internal( memory, anoutline ); + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + return FT_Outline_New_Internal( library->memory, numPoints, + numContours, anoutline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Check( FT_Outline* outline ) + { + if ( outline ) + { + FT_Int n_points = outline->n_points; + FT_Int n_contours = outline->n_contours; + FT_Int end0, end; + FT_Int n; + + + /* empty glyph? */ + if ( n_points == 0 && n_contours == 0 ) + return 0; + + /* check point and contour counts */ + if ( n_points <= 0 || n_contours <= 0 ) + goto Bad; + + end0 = end = -1; + for ( n = 0; n < n_contours; n++ ) + { + end = outline->contours[n]; + + /* note that we don't accept empty contours */ + if ( end <= end0 || end >= n_points ) + goto Bad; + + end0 = end; + } + + if ( end != n_points - 1 ) + goto Bad; + + /* XXX: check the tags array */ + return 0; + } + + Bad: + return FT_Err_Invalid_Argument; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ) + { + FT_Int is_owner; + + + if ( !source || !target || + source->n_points != target->n_points || + source->n_contours != target->n_contours ) + return FT_Err_Invalid_Argument; + + if ( source == target ) + return FT_Err_Ok; + + FT_ARRAY_COPY( target->points, source->points, source->n_points ); + + FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); + + FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); + + /* copy all flags, except the `FT_OUTLINE_OWNER' one */ + is_owner = target->flags & FT_OUTLINE_OWNER; + target->flags = source->flags; + + target->flags &= ~FT_OUTLINE_OWNER; + target->flags |= is_owner; + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ) + { + if ( memory && outline ) + { + if ( outline->flags & FT_OUTLINE_OWNER ) + { + FT_FREE( outline->points ); + FT_FREE( outline->tags ); + FT_FREE( outline->contours ); + } + *outline = null_outline; + + return FT_Err_Ok; + } + else + return FT_Err_Invalid_Argument; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ) + { + /* check for valid `outline' in FT_Outline_Done_Internal() */ + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + return FT_Outline_Done_Internal( library->memory, outline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ) + { + FT_Pos xMin, yMin, xMax, yMax; + + + if ( outline && acbox ) + { + if ( outline->n_points == 0 ) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + + for ( ; vec < limit; vec++ ) + { + FT_Pos x, y; + + + x = vec->x; + if ( x < xMin ) xMin = x; + if ( x > xMax ) xMax = x; + + y = vec->y; + if ( y < yMin ) yMin = y; + if ( y > yMax ) yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ) + { + FT_UShort n; + FT_Vector* vec; + + + if ( !outline ) + return; + + vec = outline->points; + + for ( n = 0; n < outline->n_points; n++ ) + { + vec->x += xOffset; + vec->y += yOffset; + vec++; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Reverse( FT_Outline* outline ) + { + FT_UShort n; + FT_Int first, last; + + + if ( !outline ) + return; + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + last = outline->contours[n]; + + /* reverse point table */ + { + FT_Vector* p = outline->points + first; + FT_Vector* q = outline->points + last; + FT_Vector swap; + + + while ( p < q ) + { + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + /* reverse tags table */ + { + char* p = outline->tags + first; + char* q = outline->tags + last; + char swap; + + + while ( p < q ) + { + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + first = last + 1; + } + + outline->flags ^= FT_OUTLINE_REVERSE_FILL; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ) + { + FT_Error error; + FT_Bool update = FALSE; + FT_Renderer renderer; + FT_ListNode node; + + + if ( !library ) + return FT_Err_Invalid_Library_Handle; + + if ( !outline || !params ) + return FT_Err_Invalid_Argument; + + renderer = library->cur_renderer; + node = library->renderers.head; + + params->source = (void*)outline; + + error = FT_Err_Cannot_Render_Glyph; + while ( renderer ) + { + error = renderer->raster_render( renderer->raster, params ); + if ( !error || FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format */ + + /* now, look for another renderer that supports the same */ + /* format */ + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, + &node ); + update = TRUE; + } + + /* if we changed the current renderer for the glyph image format */ + /* we need to select it as the next current one */ + if ( !error && update && renderer ) + FT_Set_Renderer( library, renderer, 0, 0 ); + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ) + { + FT_Raster_Params params; + + + if ( !abitmap ) + return FT_Err_Invalid_Argument; + + /* other checks are delayed to FT_Outline_Render() */ + + params.target = abitmap; + params.flags = 0; + + if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) + params.flags |= FT_RASTER_FLAG_AA; + + return FT_Outline_Render( library, outline, ¶ms ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ) + { + FT_Pos xz, yz; + + + if ( !vector || !matrix ) + return; + + xz = FT_MulFix( vector->x, matrix->xx ) + + FT_MulFix( vector->y, matrix->xy ); + + yz = FT_MulFix( vector->x, matrix->yx ) + + FT_MulFix( vector->y, matrix->yy ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ) + { + FT_Vector* vec; + FT_Vector* limit; + + + if ( !outline || !matrix ) + return; + + vec = outline->points; + limit = vec + outline->n_points; + + for ( ; vec < limit; vec++ ) + FT_Vector_Transform( vec, matrix ); + } + + +#if 0 + +#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \ + do { \ + (first) = ( c > 0 ) ? (outline)->points + \ + (outline)->contours[c - 1] + 1 \ + : (outline)->points; \ + (last) = (outline)->points + (outline)->contours[c]; \ + } while ( 0 ) + + + /* Is a point in some contour? */ + /* */ + /* We treat every point of the contour as if it */ + /* it were ON. That is, we allow false positives, */ + /* but disallow false negatives. (XXX really?) */ + static FT_Bool + ft_contour_has( FT_Outline* outline, + FT_Short c, + FT_Vector* point ) + { + FT_Vector* first; + FT_Vector* last; + FT_Vector* a; + FT_Vector* b; + FT_UInt n = 0; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( a = first; a <= last; a++ ) + { + FT_Pos x; + FT_Int intersect; + + + b = ( a == last ) ? first : a + 1; + + intersect = ( a->y - point->y ) ^ ( b->y - point->y ); + + /* a and b are on the same side */ + if ( intersect >= 0 ) + { + if ( intersect == 0 && a->y == point->y ) + { + if ( ( a->x <= point->x && b->x >= point->x ) || + ( a->x >= point->x && b->x <= point->x ) ) + return 1; + } + + continue; + } + + x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y ); + + if ( x < point->x ) + n++; + else if ( x == point->x ) + return 1; + } + + return ( n % 2 ); + } + + + static FT_Bool + ft_contour_enclosed( FT_Outline* outline, + FT_UShort c ) + { + FT_Vector* first; + FT_Vector* last; + FT_Short i; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( i = 0; i < outline->n_contours; i++ ) + { + if ( i != c && ft_contour_has( outline, i, first ) ) + { + FT_Vector* pt; + + + for ( pt = first + 1; pt <= last; pt++ ) + if ( !ft_contour_has( outline, i, pt ) ) + return 0; + + return 1; + } + } + + return 0; + } + + + /* This version differs from the public one in that each */ + /* part (contour not enclosed in another contour) of the */ + /* outline is checked for orientation. This is */ + /* necessary for some buggy CJK fonts. */ + static FT_Orientation + ft_outline_get_orientation( FT_Outline* outline ) + { + FT_Short i; + FT_Vector* first; + FT_Vector* last; + FT_Orientation orient = FT_ORIENTATION_NONE; + + + first = outline->points; + for ( i = 0; i < outline->n_contours; i++, first = last + 1 ) + { + FT_Vector* point; + FT_Vector* xmin_point; + FT_Pos xmin; + + + last = outline->points + outline->contours[i]; + + /* skip degenerate contours */ + if ( last < first + 2 ) + continue; + + if ( ft_contour_enclosed( outline, i ) ) + continue; + + xmin = first->x; + xmin_point = first; + + for ( point = first + 1; point <= last; point++ ) + { + if ( point->x < xmin ) + { + xmin = point->x; + xmin_point = point; + } + } + + /* check the orientation of the contour */ + { + FT_Vector* prev; + FT_Vector* next; + FT_Orientation o; + + + prev = ( xmin_point == first ) ? last : xmin_point - 1; + next = ( xmin_point == last ) ? first : xmin_point + 1; + + if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) > + FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) ) + o = FT_ORIENTATION_POSTSCRIPT; + else + o = FT_ORIENTATION_TRUETYPE; + + if ( orient == FT_ORIENTATION_NONE ) + orient = o; + else if ( orient != o ) + return FT_ORIENTATION_NONE; + } + } + + return orient; + } + +#endif /* 0 */ + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ) + { + FT_Vector* points; + FT_Vector v_prev, v_first, v_next, v_cur; + FT_Angle rotate, angle_in, angle_out; + FT_Int c, n, first; + FT_Int orientation; + + + if ( !outline ) + return FT_Err_Invalid_Argument; + + strength /= 2; + if ( strength == 0 ) + return FT_Err_Ok; + + orientation = FT_Outline_Get_Orientation( outline ); + if ( orientation == FT_ORIENTATION_NONE ) + { + if ( outline->n_contours ) + return FT_Err_Invalid_Argument; + else + return FT_Err_Ok; + } + + if ( orientation == FT_ORIENTATION_TRUETYPE ) + rotate = -FT_ANGLE_PI2; + else + rotate = FT_ANGLE_PI2; + + points = outline->points; + + first = 0; + for ( c = 0; c < outline->n_contours; c++ ) + { + int last = outline->contours[c]; + + + v_first = points[first]; + v_prev = points[last]; + v_cur = v_first; + + for ( n = first; n <= last; n++ ) + { + FT_Vector in, out; + FT_Angle angle_diff; + FT_Pos d; + FT_Fixed scale; + + + if ( n < last ) + v_next = points[n + 1]; + else + v_next = v_first; + + /* compute the in and out vectors */ + in.x = v_cur.x - v_prev.x; + in.y = v_cur.y - v_prev.y; + + out.x = v_next.x - v_cur.x; + out.y = v_next.y - v_cur.y; + + angle_in = FT_Atan2( in.x, in.y ); + angle_out = FT_Atan2( out.x, out.y ); + angle_diff = FT_Angle_Diff( angle_in, angle_out ); + scale = FT_Cos( angle_diff / 2 ); + + if ( scale < 0x4000L && scale > -0x4000L ) + in.x = in.y = 0; + else + { + d = FT_DivFix( strength, scale ); + + FT_Vector_From_Polar( &in, d, angle_in + angle_diff / 2 - rotate ); + } + + outline->points[n].x = v_cur.x + strength + in.x; + outline->points[n].y = v_cur.y + strength + in.y; + + v_prev = v_cur; + v_cur = v_next; + } + + first = last + 1; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ) + { + FT_Pos xmin = 32768L; + FT_Pos xmin_ymin = 32768L; + FT_Pos xmin_ymax = -32768L; + FT_Vector* xmin_first = NULL; + FT_Vector* xmin_last = NULL; + + short* contour; + + FT_Vector* first; + FT_Vector* last; + FT_Vector* prev; + FT_Vector* point; + + int i; + FT_Pos ray_y[3]; + FT_Orientation result[3]; + + + if ( !outline || outline->n_points <= 0 ) + return FT_ORIENTATION_TRUETYPE; + + /* We use the nonzero winding rule to find the orientation. */ + /* Since glyph outlines behave much more `regular' than arbitrary */ + /* cubic or quadratic curves, this test deals with the polygon */ + /* only which is spanned up by the control points. */ + + first = outline->points; + for ( contour = outline->contours; + contour < outline->contours + outline->n_contours; + contour++, first = last + 1 ) + { + FT_Pos contour_xmin = 32768L; + FT_Pos contour_xmax = -32768L; + FT_Pos contour_ymin = 32768L; + FT_Pos contour_ymax = -32768L; + + + last = outline->points + *contour; + + /* skip degenerate contours */ + if ( last < first + 2 ) + continue; + + for ( point = first; point <= last; ++point ) + { + if ( point->x < contour_xmin ) + contour_xmin = point->x; + + if ( point->x > contour_xmax ) + contour_xmax = point->x; + + if ( point->y < contour_ymin ) + contour_ymin = point->y; + + if ( point->y > contour_ymax ) + contour_ymax = point->y; + } + + if ( contour_xmin < xmin && + contour_xmin != contour_xmax && + contour_ymin != contour_ymax ) + { + xmin = contour_xmin; + xmin_ymin = contour_ymin; + xmin_ymax = contour_ymax; + xmin_first = first; + xmin_last = last; + } + } + + if ( xmin == 32768L ) + return FT_ORIENTATION_TRUETYPE; + + ray_y[0] = ( xmin_ymin * 3 + xmin_ymax ) >> 2; + ray_y[1] = ( xmin_ymin + xmin_ymax ) >> 1; + ray_y[2] = ( xmin_ymin + xmin_ymax * 3 ) >> 2; + + for ( i = 0; i < 3; i++ ) + { + FT_Pos left_x; + FT_Pos right_x; + FT_Vector* left1; + FT_Vector* left2; + FT_Vector* right1; + FT_Vector* right2; + + + RedoRay: + left_x = 32768L; + right_x = -32768L; + + left1 = left2 = right1 = right2 = NULL; + + prev = xmin_last; + for ( point = xmin_first; point <= xmin_last; prev = point, ++point ) + { + FT_Pos tmp_x; + + + if ( point->y == ray_y[i] || prev->y == ray_y[i] ) + { + ray_y[i]++; + goto RedoRay; + } + + if ( ( point->y < ray_y[i] && prev->y < ray_y[i] ) || + ( point->y > ray_y[i] && prev->y > ray_y[i] ) ) + continue; + + tmp_x = FT_MulDiv( point->x - prev->x, + ray_y[i] - prev->y, + point->y - prev->y ) + prev->x; + + if ( tmp_x < left_x ) + { + left_x = tmp_x; + left1 = prev; + left2 = point; + } + + if ( tmp_x > right_x ) + { + right_x = tmp_x; + right1 = prev; + right2 = point; + } + } + + if ( left1 && right1 ) + { + if ( left1->y < left2->y && right1->y > right2->y ) + result[i] = FT_ORIENTATION_TRUETYPE; + else if ( left1->y > left2->y && right1->y < right2->y ) + result[i] = FT_ORIENTATION_POSTSCRIPT; + else + result[i] = FT_ORIENTATION_NONE; + } + } + + if ( result[0] != FT_ORIENTATION_NONE && + ( result[0] == result[1] || result[0] == result[2] ) ) + return result[0]; + + if ( result[1] != FT_ORIENTATION_NONE && result[1] == result[2] ) + return result[1]; + + return FT_ORIENTATION_TRUETYPE; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftpatent.c b/alienblaster/project/jni/freetype/src/base/ftpatent.c new file mode 100644 index 000000000..501cab52c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftpatent.c @@ -0,0 +1,286 @@ +/***************************************************************************/ +/* */ +/* ftpatent.c */ +/* */ +/* FreeType API for checking patented TrueType bytecode instructions */ +/* (body). */ +/* */ +/* Copyright 2007, 2008, 2010 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TRUETYPE_GLYF_H + + + static FT_Bool + _tt_check_patents_in_range( FT_Stream stream, + FT_ULong size ) + { + FT_Bool result = FALSE; + FT_Error error; + FT_Bytes p, end; + + + if ( FT_FRAME_ENTER( size ) ) + return 0; + + p = stream->cursor; + end = p + size; + + while ( p < end ) + { + switch (p[0]) + { + case 0x06: /* SPvTL // */ + case 0x07: /* SPvTL + */ + case 0x08: /* SFvTL // */ + case 0x09: /* SFvTL + */ + case 0x0A: /* SPvFS */ + case 0x0B: /* SFvFS */ + result = TRUE; + goto Exit; + + case 0x40: + if ( p + 1 >= end ) + goto Exit; + + p += p[1] + 2; + break; + + case 0x41: + if ( p + 1 >= end ) + goto Exit; + + p += p[1] * 2 + 2; + break; + + case 0x71: /* DELTAP2 */ + case 0x72: /* DELTAP3 */ + case 0x73: /* DELTAC0 */ + case 0x74: /* DELTAC1 */ + case 0x75: /* DELTAC2 */ + result = TRUE; + goto Exit; + + case 0xB0: + case 0xB1: + case 0xB2: + case 0xB3: + case 0xB4: + case 0xB5: + case 0xB6: + case 0xB7: + p += ( p[0] - 0xB0 ) + 2; + break; + + case 0xB8: + case 0xB9: + case 0xBA: + case 0xBB: + case 0xBC: + case 0xBD: + case 0xBE: + case 0xBF: + p += ( p[0] - 0xB8 ) * 2 + 3; + break; + + default: + p += 1; + break; + } + } + + Exit: + FT_UNUSED( error ); + FT_FRAME_EXIT(); + return result; + } + + + static FT_Bool + _tt_check_patents_in_table( FT_Face face, + FT_ULong tag ) + { + FT_Stream stream = face->stream; + FT_Error error = FT_Err_Ok; + FT_Service_SFNT_Table service; + FT_Bool result = FALSE; + + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + + if ( service ) + { + FT_UInt i = 0; + FT_ULong tag_i = 0, offset_i = 0, length_i = 0; + + + for ( i = 0; !error && tag_i != tag ; i++ ) + error = service->table_info( face, i, + &tag_i, &offset_i, &length_i ); + + if ( error || + FT_STREAM_SEEK( offset_i ) ) + goto Exit; + + result = _tt_check_patents_in_range( stream, length_i ); + } + + Exit: + return result; + } + + + static FT_Bool + _tt_face_check_patents( FT_Face face ) + { + FT_Stream stream = face->stream; + FT_UInt gindex; + FT_Error error; + FT_Bool result; + + FT_Service_TTGlyf service; + + + result = _tt_check_patents_in_table( face, TTAG_fpgm ); + if ( result ) + goto Exit; + + result = _tt_check_patents_in_table( face, TTAG_prep ); + if ( result ) + goto Exit; + + FT_FACE_FIND_SERVICE( face, service, TT_GLYF ); + if ( service == NULL ) + goto Exit; + + for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ ) + { + FT_ULong offset, num_ins, size; + FT_Int num_contours; + + + offset = service->get_location( face, gindex, &size ); + if ( size == 0 ) + continue; + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_SHORT( num_contours ) ) + continue; + + if ( num_contours >= 0 ) /* simple glyph */ + { + if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) ) + continue; + } + else /* compound glyph */ + { + FT_Bool has_instr = 0; + + + if ( FT_STREAM_SKIP( 8 ) ) + continue; + + /* now read each component */ + for (;;) + { + FT_UInt flags, toskip; + + + if( FT_READ_USHORT( flags ) ) + break; + + toskip = 2 + 1 + 1; + + if ( ( flags & ( 1 << 0 ) ) != 0 ) /* ARGS_ARE_WORDS */ + toskip += 2; + + if ( ( flags & ( 1 << 3 ) ) != 0 ) /* WE_HAVE_A_SCALE */ + toskip += 2; + else if ( ( flags & ( 1 << 6 ) ) != 0 ) /* WE_HAVE_X_Y_SCALE */ + toskip += 4; + else if ( ( flags & ( 1 << 7 ) ) != 0 ) /* WE_HAVE_A_2x2 */ + toskip += 8; + + if ( ( flags & ( 1 << 8 ) ) != 0 ) /* WE_HAVE_INSTRUCTIONS */ + has_instr = 1; + + if ( FT_STREAM_SKIP( toskip ) ) + goto NextGlyph; + + if ( ( flags & ( 1 << 5 ) ) == 0 ) /* MORE_COMPONENTS */ + break; + } + + if ( !has_instr ) + goto NextGlyph; + } + + if ( FT_READ_USHORT( num_ins ) ) + continue; + + result = _tt_check_patents_in_range( stream, num_ins ); + if ( result ) + goto Exit; + + NextGlyph: + ; + } + + Exit: + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ) + { + FT_Bool result = FALSE; + + + if ( face && FT_IS_SFNT( face ) ) + result = _tt_face_check_patents( face ); + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ) + { + FT_Bool result = FALSE; + + +#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ + !defined( TT_CONFIG_OPTION_BYTECODE_INTEPRETER ) + if ( face && FT_IS_SFNT( face ) ) + { + result = !face->internal->ignore_unpatented_hinter; + face->internal->ignore_unpatented_hinter = !value; + } +#else + FT_UNUSED( face ); + FT_UNUSED( value ); +#endif + + return result; + } + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftpfr.c b/alienblaster/project/jni/freetype/src/base/ftpfr.c new file mode 100644 index 000000000..f9592bb1b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftpfr.c @@ -0,0 +1,143 @@ +/***************************************************************************/ +/* */ +/* ftpfr.c */ +/* */ +/* FreeType API for accessing PFR-specific data (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_PFR_H + + + /* check the format */ + static FT_Service_PfrMetrics + ft_pfr_check( FT_Face face ) + { + FT_Service_PfrMetrics service; + + + FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); + + return service; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ) + { + FT_Error error = FT_Err_Ok; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_Err_Invalid_Argument; + + service = ft_pfr_check( face ); + if ( service ) + { + error = service->get_metrics( face, + aoutline_resolution, + ametrics_resolution, + ametrics_x_scale, + ametrics_y_scale ); + } + else + { + FT_Fixed x_scale, y_scale; + + + /* this is not a PFR font */ + if ( aoutline_resolution ) + *aoutline_resolution = face->units_per_EM; + + if ( ametrics_resolution ) + *ametrics_resolution = face->units_per_EM; + + x_scale = y_scale = 0x10000L; + if ( face->size ) + { + x_scale = face->size->metrics.x_scale; + y_scale = face->size->metrics.y_scale; + } + + if ( ametrics_x_scale ) + *ametrics_x_scale = x_scale; + + if ( ametrics_y_scale ) + *ametrics_y_scale = y_scale; + + error = FT_Err_Unknown_File_Format; + } + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_Err_Invalid_Argument; + + service = ft_pfr_check( face ); + if ( service ) + error = service->get_kerning( face, left, right, avector ); + else + error = FT_Get_Kerning( face, left, right, + FT_KERNING_UNSCALED, avector ); + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + service = ft_pfr_check( face ); + if ( service ) + { + error = service->get_advance( face, gindex, aadvance ); + } + else + /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ + error = FT_Err_Invalid_Argument; + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftpic.c b/alienblaster/project/jni/freetype/src/base/ftpic.c new file mode 100644 index 000000000..d5271a972 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftpic.c @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* ftpic.c */ +/* */ +/* The FreeType position independent code services (body). */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "basepic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* documentation is in ftpic.h */ + + FT_BASE_DEF( FT_Error ) + ft_pic_container_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + + FT_MEM_SET( pic_container, 0, sizeof(*pic_container) ); + + error = ft_base_pic_init( library ); + if(error) + return error; + + return FT_Err_Ok; + } + + + /* Destroy the contents of the container. */ + FT_BASE_DEF( void ) + ft_pic_container_destroy( FT_Library library ) + { + ft_base_pic_free( library ); + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftrfork.c b/alienblaster/project/jni/freetype/src/base/ftrfork.c new file mode 100644 index 000000000..133c2de05 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftrfork.c @@ -0,0 +1,821 @@ +/***************************************************************************/ +/* */ +/* ftrfork.c */ +/* */ +/* Embedded resource forks accessor (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ +/* derived from ftobjs.c. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_RFORK_H + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Resource fork directory access ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ) + { + FT_Error error; + unsigned char head[16], head2[16]; + FT_Long map_pos, rdata_len; + int allzeros, allmatch, i; + FT_Long type_list; + + FT_UNUSED( library ); + + + error = FT_Stream_Seek( stream, rfork_offset ); + if ( error ) + return error; + + error = FT_Stream_Read( stream, (FT_Byte *)head, 16 ); + if ( error ) + return error; + + *rdata_pos = rfork_offset + ( ( head[0] << 24 ) | + ( head[1] << 16 ) | + ( head[2] << 8 ) | + head[3] ); + map_pos = rfork_offset + ( ( head[4] << 24 ) | + ( head[5] << 16 ) | + ( head[6] << 8 ) | + head[7] ); + rdata_len = ( head[ 8] << 24 ) | + ( head[ 9] << 16 ) | + ( head[10] << 8 ) | + head[11]; + + /* map_len = head[12] .. head[15] */ + + if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset ) + return FT_Err_Unknown_File_Format; + + error = FT_Stream_Seek( stream, map_pos ); + if ( error ) + return error; + + head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ + + error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); + if ( error ) + return error; + + allzeros = 1; + allmatch = 1; + for ( i = 0; i < 16; ++i ) + { + if ( head2[i] != 0 ) + allzeros = 0; + if ( head2[i] != head[i] ) + allmatch = 0; + } + if ( !allzeros && !allmatch ) + return FT_Err_Unknown_File_Format; + + /* If we have reached this point then it is probably a mac resource */ + /* file. Now, does it contain any interesting resources? */ + /* Skip handle to next resource map, the file resource number, and */ + /* attributes. */ + (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ + + 2 /* skip file resource number */ + + 2 ); /* skip attributes */ + + if ( FT_READ_USHORT( type_list ) ) + return error; + if ( type_list == -1 ) + return FT_Err_Unknown_File_Format; + + error = FT_Stream_Seek( stream, map_pos + type_list ); + if ( error ) + return error; + + *map_offset = map_pos + type_list; + return FT_Err_Ok; + } + + + static int + ft_raccess_sort_ref_by_id( FT_RFork_Ref* a, + FT_RFork_Ref* b ) + { + if ( a->res_id < b->res_id ) + return -1; + else if ( a->res_id > b->res_id ) + return 1; + else + return 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ) + { + FT_Error error; + int i, j, cnt, subcnt; + FT_Long tag_internal, rpos; + FT_Memory memory = library->memory; + FT_Long temp; + FT_Long *offsets_internal; + FT_RFork_Ref *ref; + + + error = FT_Stream_Seek( stream, map_offset ); + if ( error ) + return error; + + if ( FT_READ_USHORT( cnt ) ) + return error; + cnt++; + + for ( i = 0; i < cnt; ++i ) + { + if ( FT_READ_LONG( tag_internal ) || + FT_READ_USHORT( subcnt ) || + FT_READ_USHORT( rpos ) ) + return error; + + FT_TRACE2(( "Resource tags: %c%c%c%c\n", + (char)( 0xff & ( tag_internal >> 24 ) ), + (char)( 0xff & ( tag_internal >> 16 ) ), + (char)( 0xff & ( tag_internal >> 8 ) ), + (char)( 0xff & ( tag_internal >> 0 ) ) )); + + if ( tag_internal == tag ) + { + *count = subcnt + 1; + rpos += map_offset; + + error = FT_Stream_Seek( stream, rpos ); + if ( error ) + return error; + + if ( FT_NEW_ARRAY( ref, *count ) ) + return error; + + for ( j = 0; j < *count; ++j ) + { + if ( FT_READ_USHORT( ref[j].res_id ) ) + goto Exit; + if ( FT_STREAM_SKIP( 2 ) ) /* resource name */ + goto Exit; + if ( FT_READ_LONG( temp ) ) + goto Exit; + if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ + goto Exit; + + ref[j].offset = temp & 0xFFFFFFL; + } + + ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ), + ( int(*)(const void*, const void*) ) + ft_raccess_sort_ref_by_id ); + + if ( FT_NEW_ARRAY( offsets_internal, *count ) ) + goto Exit; + + /* XXX: duplicated reference ID, + * gap between reference IDs are acceptable? + * further investigation on Apple implementation is needed. + */ + for ( j = 0; j < *count; ++j ) + offsets_internal[j] = rdata_pos + ref[j].offset; + + *offsets = offsets_internal; + error = FT_Err_Ok; + + Exit: + FT_FREE( ref ); + return error; + } + } + + return FT_Err_Cannot_Open_Resource; + } + + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Guessing functions ****/ + /**** ****/ + /**** When you add a new guessing function, ****/ + /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef FT_Error + (*raccess_guess_func)( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + /*************************************************************************/ + /**** ****/ + /**** Helper functions ****/ + /**** ****/ + /*************************************************************************/ + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char * file_name, + FT_Long *result_offset ); + + static char * + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ); + + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + FT_Long i; + + + raccess_guess_func funcs[FT_RACCESS_N_RULES] = + { + raccess_guess_apple_double, + raccess_guess_apple_single, + raccess_guess_darwin_ufs_export, + raccess_guess_darwin_newvfs, + raccess_guess_darwin_hfsplus, + raccess_guess_vfat, + raccess_guess_linux_cap, + raccess_guess_linux_double, + raccess_guess_linux_netatalk, + }; + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + if ( NULL != stream ) + errors[i] = FT_Stream_Seek( stream, 0 ); + else + errors[i] = FT_Err_Ok; + + if ( errors[i] ) + continue ; + + errors[i] = (funcs[i])( library, stream, base_name, + &(new_names[i]), &(offsets[i]) ); + } + + return; + } + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x07; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_Err_Cannot_Open_Stream; + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x00; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_Err_Cannot_Open_Stream; + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + newpath = raccess_make_file_name( memory, base_file_name, "._" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with hfs+ drivers (or Macs). + */ + FT_Error error; + char* newpath; + FT_Memory memory; + FT_Long base_file_len = ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 6 > FT_INT_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_ALLOC( newpath, base_file_len + 6 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with Mac OS X (> 10.1). + */ + FT_Error error; + char* newpath; + FT_Memory memory; + FT_Long base_file_len = ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 18 > FT_INT_MAX ) + return FT_Err_Array_Too_Large; + + if ( FT_ALLOC( newpath, base_file_len + 18 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + "resource.frk/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, "%" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + ".AppleDouble/" ); + if ( !newpath ) + return FT_Err_Out_Of_Memory; + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ) + { + FT_Int32 magic_from_stream; + FT_Error error; + FT_Int32 version_number = 0; + FT_UShort n_of_entries; + + int i; + FT_UInt32 entry_id, entry_offset, entry_length = 0; + + const FT_UInt32 resource_fork_entry_id = 0x2; + + FT_UNUSED( library ); + FT_UNUSED( base_file_name ); + FT_UNUSED( version_number ); + FT_UNUSED( entry_length ); + + + if ( FT_READ_LONG( magic_from_stream ) ) + return error; + if ( magic_from_stream != magic ) + return FT_Err_Unknown_File_Format; + + if ( FT_READ_LONG( version_number ) ) + return error; + + /* filler */ + error = FT_Stream_Skip( stream, 16 ); + if ( error ) + return error; + + if ( FT_READ_USHORT( n_of_entries ) ) + return error; + if ( n_of_entries == 0 ) + return FT_Err_Unknown_File_Format; + + for ( i = 0; i < n_of_entries; i++ ) + { + if ( FT_READ_LONG( entry_id ) ) + return error; + if ( entry_id == resource_fork_entry_id ) + { + if ( FT_READ_LONG( entry_offset ) || + FT_READ_LONG( entry_length ) ) + continue; + *result_offset = entry_offset; + + return FT_Err_Ok; + } + else + { + error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ + if ( error ) + return error; + } + } + + return FT_Err_Unknown_File_Format; + } + + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char *file_name, + FT_Long *result_offset ) + { + FT_Open_Args args2; + FT_Stream stream2; + char * nouse = NULL; + FT_Error error; + + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_name; + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + return error; + + error = raccess_guess_apple_double( library, stream2, file_name, + &nouse, result_offset ); + + FT_Stream_Free( stream2, 0 ); + + return error; + } + + + static char* + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ) + { + char* new_name; + const char* tmp; + const char* slash; + size_t new_length; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( error ); + + + new_length = ft_strlen( original_name ) + ft_strlen( insertion ); + if ( FT_ALLOC( new_name, new_length + 1 ) ) + return NULL; + + tmp = ft_strrchr( original_name, '/' ); + if ( tmp ) + { + ft_strncpy( new_name, original_name, tmp - original_name + 1 ); + new_name[tmp - original_name + 1] = '\0'; + slash = tmp + 1; + } + else + { + slash = original_name; + new_name[0] = '\0'; + } + + ft_strcat( new_name, insertion ); + ft_strcat( new_name, slash ); + + return new_name; + } + + +#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /*************************************************************************/ + /* Dummy function; just sets errors */ + /*************************************************************************/ + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char *base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + int i; + + FT_UNUSED( library ); + FT_UNUSED( stream ); + FT_UNUSED( base_name ); + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + offsets[i] = 0; + errors[i] = FT_Err_Unimplemented_Feature; + } + } + + +#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftsnames.c b/alienblaster/project/jni/freetype/src/base/ftsnames.c new file mode 100644 index 000000000..3447888ca --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftsnames.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftsnames.c */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (body). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2001, 2002, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_SFNT_NAMES_H +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_STREAM_H + + +#ifdef TT_CONFIG_OPTION_SFNT_NAMES + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ) + { + return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; + } + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( aname && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( idx < (FT_UInt)ttface->num_names ) + { + TT_NameEntryRec* entry = ttface->name_table.names + idx; + + + /* load name on demand */ + if ( entry->stringLength > 0 && entry->string == NULL ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + aname->platform_id = entry->platformID; + aname->encoding_id = entry->encodingID; + aname->language_id = entry->languageID; + aname->name_id = entry->nameID; + aname->string = (FT_Byte*)entry->string; + aname->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + +#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftstream.c b/alienblaster/project/jni/freetype/src/base/ftstream.c new file mode 100644 index 000000000..b638599db --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftstream.c @@ -0,0 +1,852 @@ +/***************************************************************************/ +/* */ +/* ftstream.c */ +/* */ +/* I/O stream support (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_stream + + + FT_BASE_DEF( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ) + { + stream->base = (FT_Byte*) base; + stream->size = size; + stream->pos = 0; + stream->cursor = 0; + stream->read = 0; + stream->close = 0; + } + + + FT_BASE_DEF( void ) + FT_Stream_Close( FT_Stream stream ) + { + if ( stream && stream->close ) + stream->close( stream ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ) + { + FT_Error error = FT_Err_Ok; + + + if ( stream->read ) + { + if ( stream->read( stream, pos, 0, 0 ) ) + { + FT_ERROR(( "FT_Stream_Seek:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + } + } + /* note that seeking to the first position after the file is valid */ + else if ( pos > stream->size ) + { + FT_ERROR(( "FT_Stream_Seek:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + } + + if ( !error ) + stream->pos = pos; + + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ) + { + if ( distance < 0 ) + return FT_Err_Invalid_Stream_Operation; + + return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) ); + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_Pos( FT_Stream stream ) + { + return stream->pos; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, stream->pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + if ( pos >= stream->size ) + { + FT_ERROR(( "FT_Stream_ReadAt:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + return FT_Err_Invalid_Stream_Operation; + } + + if ( stream->read ) + read_bytes = stream->read( stream, pos, buffer, count ); + else + { + read_bytes = stream->size - pos; + if ( read_bytes > count ) + read_bytes = count; + + FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); + } + + stream->pos = pos + read_bytes; + + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_ReadAt:" + " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + error = FT_Err_Invalid_Stream_Operation; + } + + return error; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong read_bytes = 0; + + + if ( stream->pos >= stream->size ) + goto Exit; + + if ( stream->read ) + read_bytes = stream->read( stream, stream->pos, buffer, count ); + else + { + read_bytes = stream->size - stream->pos; + if ( read_bytes > count ) + read_bytes = count; + + FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); + } + + stream->pos += read_bytes; + + Exit: + return read_bytes; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + FT_Error error; + + + error = FT_Stream_EnterFrame( stream, count ); + if ( !error ) + { + *pbytes = (FT_Byte*)stream->cursor; + + /* equivalent to FT_Stream_ExitFrame(), with no memory block release */ + stream->cursor = 0; + stream->limit = 0; + } + + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ) + { + if ( stream && stream->read ) + { + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, *pbytes ); + *pbytes = NULL; +#else + FT_FREE( *pbytes ); +#endif + } + *pbytes = 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + /* check for nested frame access */ + FT_ASSERT( stream && stream->cursor == 0 ); + + if ( stream->read ) + { + /* allocate the frame in memory */ + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + /* assume _ft_debug_file and _ft_debug_lineno are already set */ + stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error ); + if ( error ) + goto Exit; +#else + if ( FT_QALLOC( stream->base, count ) ) + goto Exit; +#endif + /* read it */ + read_bytes = stream->read( stream, stream->pos, + stream->base, count ); + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + FT_FREE( stream->base ); + error = FT_Err_Invalid_Stream_Operation; + } + stream->cursor = stream->base; + stream->limit = stream->cursor + count; + stream->pos += read_bytes; + } + else + { + /* check current and new position */ + if ( stream->pos >= stream->size || + stream->pos + count > stream->size ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", + stream->pos, count, stream->size )); + + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + + /* set cursor */ + stream->cursor = stream->base + stream->pos; + stream->limit = stream->cursor + count; + stream->pos += count; + } + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ExitFrame( FT_Stream stream ) + { + /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */ + /* that it is possible to access a frame of length 0 in */ + /* some weird fonts (usually, when accessing an array of */ + /* 0 records, like in some strange kern tables). */ + /* */ + /* In this case, the loader code handles the 0-length table */ + /* gracefully; however, stream.cursor is really set to 0 by the */ + /* FT_Stream_EnterFrame() call, and this is not an error. */ + /* */ + FT_ASSERT( stream ); + + if ( stream->read ) + { + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, stream->base ); + stream->base = NULL; +#else + FT_FREE( stream->base ); +#endif + } + stream->cursor = 0; + stream->limit = 0; + } + + + FT_BASE_DEF( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ) + { + FT_Char result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + if ( stream->cursor < stream->limit ) + result = *stream->cursor++; + + return result; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_GetShort( FT_Stream stream ) + { + FT_Byte* p; + FT_Short result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_SHORT( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_GetShortLE( FT_Stream stream ) + { + FT_Byte* p; + FT_Short result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_SHORT_LE( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetOffset( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 2 < stream->limit ) + result = FT_NEXT_OFF3( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetLong( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_LONG( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_GetLongLE( FT_Stream stream ) + { + FT_Byte* p; + FT_Long result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_LONG_LE( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ) + { + FT_Byte result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, &result, 1L ) != 1L ) + goto Fail; + } + else + { + if ( stream->pos < stream->size ) + result = stream->base[stream->pos]; + else + goto Fail; + } + stream->pos++; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadChar:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_ReadShort( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p = 0; + FT_Short result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_SHORT( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadShort:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Short ) + FT_Stream_ReadShortLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p = 0; + FT_Short result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_SHORT_LE( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadShortLE:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadOffset( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[3]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 2 < stream->size ) + { + if ( stream->read ) + { + if (stream->read( stream, stream->pos, reads, 3L ) != 3L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_OFF3( p ); + } + else + goto Fail; + + stream->pos += 3; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadOffset:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadLong( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_LONG( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadLong:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Long ) + FT_Stream_ReadLongLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p = 0; + FT_Long result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + { + p = stream->base + stream->pos; + } + + if ( p ) + result = FT_NEXT_LONG_LE( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + *error = FT_Err_Invalid_Stream_Operation; + FT_ERROR(( "FT_Stream_ReadLongLE:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ) + { + FT_Error error; + FT_Bool frame_accessed = 0; + FT_Byte* cursor; + + if ( !fields || !stream ) + return FT_Err_Invalid_Argument; + + cursor = stream->cursor; + + error = FT_Err_Ok; + do + { + FT_ULong value; + FT_Int sign_shift; + FT_Byte* p; + + + switch ( fields->value ) + { + case ft_frame_start: /* access a new frame */ + error = FT_Stream_EnterFrame( stream, fields->offset ); + if ( error ) + goto Exit; + + frame_accessed = 1; + cursor = stream->cursor; + fields++; + continue; /* loop! */ + + case ft_frame_bytes: /* read a byte sequence */ + case ft_frame_skip: /* skip some bytes */ + { + FT_UInt len = fields->size; + + + if ( cursor + len > stream->limit ) + { + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + + if ( fields->value == ft_frame_bytes ) + { + p = (FT_Byte*)structure + fields->offset; + FT_MEM_COPY( p, cursor, len ); + } + cursor += len; + fields++; + continue; + } + + case ft_frame_byte: + case ft_frame_schar: /* read a single byte */ + value = FT_NEXT_BYTE(cursor); + sign_shift = 24; + break; + + case ft_frame_short_be: + case ft_frame_ushort_be: /* read a 2-byte big-endian short */ + value = FT_NEXT_USHORT(cursor); + sign_shift = 16; + break; + + case ft_frame_short_le: + case ft_frame_ushort_le: /* read a 2-byte little-endian short */ + value = FT_NEXT_USHORT_LE(cursor); + sign_shift = 16; + break; + + case ft_frame_long_be: + case ft_frame_ulong_be: /* read a 4-byte big-endian long */ + value = FT_NEXT_ULONG(cursor); + sign_shift = 0; + break; + + case ft_frame_long_le: + case ft_frame_ulong_le: /* read a 4-byte little-endian long */ + value = FT_NEXT_ULONG_LE(cursor); + sign_shift = 0; + break; + + case ft_frame_off3_be: + case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ + value = FT_NEXT_UOFF3(cursor); + sign_shift = 8; + break; + + case ft_frame_off3_le: + case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ + value = FT_NEXT_UOFF3_LE(cursor); + sign_shift = 8; + break; + + default: + /* otherwise, exit the loop */ + stream->cursor = cursor; + goto Exit; + } + + /* now, compute the signed value is necessary */ + if ( fields->value & FT_FRAME_OP_SIGNED ) + value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift ); + + /* finally, store the value in the object */ + + p = (FT_Byte*)structure + fields->offset; + switch ( fields->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)p = (FT_Byte)value; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)p = (FT_UShort)value; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)p = (FT_UInt32)value; + break; + + default: /* for 64-bit systems */ + *(FT_ULong*)p = (FT_ULong)value; + } + + /* go to next field */ + fields++; + } + while ( 1 ); + + Exit: + /* close the frame if it was opened by this read */ + if ( frame_accessed ) + FT_Stream_ExitFrame( stream ); + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftstroke.c b/alienblaster/project/jni/freetype/src/base/ftstroke.c new file mode 100644 index 000000000..75bcbded6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftstroke.c @@ -0,0 +1,2039 @@ +/***************************************************************************/ +/* */ +/* ftstroke.c */ +/* */ +/* FreeType path stroker (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_STROKER_H +#include FT_TRIGONOMETRY_H +#include FT_OUTLINE_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT + : FT_STROKER_BORDER_LEFT ; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT + : FT_STROKER_BORDER_RIGHT ; + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** BEZIER COMPUTATIONS *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + +#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 ) +#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 6 ) +#define FT_EPSILON 2 + +#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON ) + + + static FT_Pos + ft_pos_abs( FT_Pos x ) + { + return x >= 0 ? x : -x ; + } + + + static void + ft_conic_split( FT_Vector* base ) + { + FT_Pos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static FT_Bool + ft_conic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_out ) + { + FT_Vector d1, d2; + FT_Angle theta; + FT_Int close1, close2; + + + d1.x = base[1].x - base[2].x; + d1.y = base[1].y - base[2].y; + d2.x = base[0].x - base[1].x; + d2.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + + if ( close1 ) + { + if ( close2 ) + *angle_in = *angle_out = 0; + else + *angle_in = *angle_out = FT_Atan2( d2.x, d2.y ); + } + else if ( close2 ) + { + *angle_in = *angle_out = FT_Atan2( d1.x, d1.y ); + } + else + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d2.x, d2.y ); + } + + theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) ); + + return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD ); + } + + + static void + ft_cubic_split( FT_Vector* base ) + { + FT_Pos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + static FT_Bool + ft_cubic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_mid, + FT_Angle *angle_out ) + { + FT_Vector d1, d2, d3; + FT_Angle theta1, theta2; + FT_Int close1, close2, close3; + + + d1.x = base[2].x - base[3].x; + d1.y = base[2].y - base[3].y; + d2.x = base[1].x - base[2].x; + d2.y = base[1].y - base[2].y; + d3.x = base[0].x - base[1].x; + d3.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y ); + + if ( close1 || close3 ) + { + if ( close2 ) + { + /* basically a point */ + *angle_in = *angle_out = *angle_mid = 0; + } + else if ( close1 ) + { + *angle_in = *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + else /* close2 */ + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = *angle_out = FT_Atan2( d2.x, d2.y ); + } + } + else if ( close2 ) + { + *angle_in = *angle_mid = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + else + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + + theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) ); + theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) ); + + return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD && + theta2 < FT_SMALL_CUBIC_THRESHOLD ); + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** STROKE BORDERS *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + + typedef enum FT_StrokeTags_ + { + FT_STROKE_TAG_ON = 1, /* on-curve point */ + FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ + FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ + FT_STROKE_TAG_END = 8 /* sub-path end */ + + } FT_StrokeTags; + +#define FT_STROKE_TAG_BEGIN_END (FT_STROKE_TAG_BEGIN|FT_STROKE_TAG_END) + + typedef struct FT_StrokeBorderRec_ + { + FT_UInt num_points; + FT_UInt max_points; + FT_Vector* points; + FT_Byte* tags; + FT_Bool movable; + FT_Int start; /* index of current sub-path start point */ + FT_Memory memory; + FT_Bool valid; + + } FT_StrokeBorderRec, *FT_StrokeBorder; + + + static FT_Error + ft_stroke_border_grow( FT_StrokeBorder border, + FT_UInt new_points ) + { + FT_UInt old_max = border->max_points; + FT_UInt new_max = border->num_points + new_points; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + FT_UInt cur_max = old_max; + FT_Memory memory = border->memory; + + + while ( cur_max < new_max ) + cur_max += ( cur_max >> 1 ) + 16; + + if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) || + FT_RENEW_ARRAY( border->tags, old_max, cur_max ) ) + goto Exit; + + border->max_points = cur_max; + } + + Exit: + return error; + } + + + static void + ft_stroke_border_close( FT_StrokeBorder border, + FT_Bool reverse ) + { + FT_UInt start = border->start; + FT_UInt count = border->num_points; + + + FT_ASSERT( border->start >= 0 ); + + /* don't record empty paths! */ + if ( count <= start + 1U ) + border->num_points = start; + else + { + /* copy the last point to the start of this sub-path, since */ + /* it contains the `adjusted' starting coordinates */ + border->num_points = --count; + border->points[start] = border->points[count]; + + if ( reverse ) + { + /* reverse the points */ + { + FT_Vector* vec1 = border->points + start + 1; + FT_Vector* vec2 = border->points + count - 1; + + + for ( ; vec1 < vec2; vec1++, vec2-- ) + { + FT_Vector tmp; + + + tmp = *vec1; + *vec1 = *vec2; + *vec2 = tmp; + } + } + + /* then the tags */ + { + FT_Byte* tag1 = border->tags + start + 1; + FT_Byte* tag2 = border->tags + count - 1; + + + for ( ; tag1 < tag2; tag1++, tag2-- ) + { + FT_Byte tmp; + + + tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + } + } + } + + border->tags[start ] |= FT_STROKE_TAG_BEGIN; + border->tags[count - 1] |= FT_STROKE_TAG_END; + } + + border->start = -1; + border->movable = FALSE; + } + + + static FT_Error + ft_stroke_border_lineto( FT_StrokeBorder border, + FT_Vector* to, + FT_Bool movable ) + { + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( border->start >= 0 ); + + if ( border->movable ) + { + /* move last point */ + border->points[border->num_points - 1] = *to; + } + else + { + /* add one point */ + error = ft_stroke_border_grow( border, 1 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *to; + tag[0] = FT_STROKE_TAG_ON; + + border->num_points += 1; + } + } + border->movable = movable; + return error; + } + + + static FT_Error + ft_stroke_border_conicto( FT_StrokeBorder border, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 2 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + vec[0] = *control; + vec[1] = *to; + + tag[0] = 0; + tag[1] = FT_STROKE_TAG_ON; + + border->num_points += 2; + } + border->movable = FALSE; + return error; + } + + + static FT_Error + ft_stroke_border_cubicto( FT_StrokeBorder border, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 3 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + + tag[0] = FT_STROKE_TAG_CUBIC; + tag[1] = FT_STROKE_TAG_CUBIC; + tag[2] = FT_STROKE_TAG_ON; + + border->num_points += 3; + } + border->movable = FALSE; + return error; + } + + +#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 ) + + + static FT_Error + ft_stroke_border_arcto( FT_StrokeBorder border, + FT_Vector* center, + FT_Fixed radius, + FT_Angle angle_start, + FT_Angle angle_diff ) + { + FT_Angle total, angle, step, rotate, next, theta; + FT_Vector a, b, a2, b2; + FT_Fixed length; + FT_Error error = FT_Err_Ok; + + + /* compute start point */ + FT_Vector_From_Polar( &a, radius, angle_start ); + a.x += center->x; + a.y += center->y; + + total = angle_diff; + angle = angle_start; + rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2; + + while ( total != 0 ) + { + step = total; + if ( step > FT_ARC_CUBIC_ANGLE ) + step = FT_ARC_CUBIC_ANGLE; + + else if ( step < -FT_ARC_CUBIC_ANGLE ) + step = -FT_ARC_CUBIC_ANGLE; + + next = angle + step; + theta = step; + if ( theta < 0 ) + theta = -theta; + + theta >>= 1; + + /* compute end point */ + FT_Vector_From_Polar( &b, radius, next ); + b.x += center->x; + b.y += center->y; + + /* compute first and second control points */ + length = FT_MulDiv( radius, FT_Sin( theta ) * 4, + ( 0x10000L + FT_Cos( theta ) ) * 3 ); + + FT_Vector_From_Polar( &a2, length, angle + rotate ); + a2.x += a.x; + a2.y += a.y; + + FT_Vector_From_Polar( &b2, length, next - rotate ); + b2.x += b.x; + b2.y += b.y; + + /* add cubic arc */ + error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); + if ( error ) + break; + + /* process the rest of the arc ?? */ + a = b; + total -= step; + angle = next; + } + + return error; + } + + + static FT_Error + ft_stroke_border_moveto( FT_StrokeBorder border, + FT_Vector* to ) + { + /* close current open path if any ? */ + if ( border->start >= 0 ) + ft_stroke_border_close( border, FALSE ); + + border->start = border->num_points; + border->movable = FALSE; + + return ft_stroke_border_lineto( border, to, FALSE ); + } + + + static void + ft_stroke_border_init( FT_StrokeBorder border, + FT_Memory memory ) + { + border->memory = memory; + border->points = NULL; + border->tags = NULL; + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_reset( FT_StrokeBorder border ) + { + border->num_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_done( FT_StrokeBorder border ) + { + FT_Memory memory = border->memory; + + + FT_FREE( border->points ); + FT_FREE( border->tags ); + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static FT_Error + ft_stroke_border_get_counts( FT_StrokeBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_Error error = FT_Err_Ok; + FT_UInt num_points = 0; + FT_UInt num_contours = 0; + + FT_UInt count = border->num_points; + FT_Vector* point = border->points; + FT_Byte* tags = border->tags; + FT_Int in_contour = 0; + + + for ( ; count > 0; count--, num_points++, point++, tags++ ) + { + if ( tags[0] & FT_STROKE_TAG_BEGIN ) + { + if ( in_contour != 0 ) + goto Fail; + + in_contour = 1; + } + else if ( in_contour == 0 ) + goto Fail; + + if ( tags[0] & FT_STROKE_TAG_END ) + { + in_contour = 0; + num_contours++; + } + } + + if ( in_contour != 0 ) + goto Fail; + + border->valid = TRUE; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + + Fail: + num_points = 0; + num_contours = 0; + goto Exit; + } + + + static void + ft_stroke_border_export( FT_StrokeBorder border, + FT_Outline* outline ) + { + /* copy point locations */ + FT_ARRAY_COPY( outline->points + outline->n_points, + border->points, + border->num_points ); + + /* copy tags */ + { + FT_UInt count = border->num_points; + FT_Byte* read = border->tags; + FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points; + + + for ( ; count > 0; count--, read++, write++ ) + { + if ( *read & FT_STROKE_TAG_ON ) + *write = FT_CURVE_TAG_ON; + else if ( *read & FT_STROKE_TAG_CUBIC ) + *write = FT_CURVE_TAG_CUBIC; + else + *write = FT_CURVE_TAG_CONIC; + } + } + + /* copy contours */ + { + FT_UInt count = border->num_points; + FT_Byte* tags = border->tags; + FT_Short* write = outline->contours + outline->n_contours; + FT_Short idx = (FT_Short)outline->n_points; + + + for ( ; count > 0; count--, tags++, idx++ ) + { + if ( *tags & FT_STROKE_TAG_END ) + { + *write++ = idx; + outline->n_contours++; + } + } + } + + outline->n_points = (short)( outline->n_points + border->num_points ); + + FT_ASSERT( FT_Outline_Check( outline ) == 0 ); + } + + + /***************************************************************************/ + /***************************************************************************/ + /***** *****/ + /***** STROKER *****/ + /***** *****/ + /***************************************************************************/ + /***************************************************************************/ + +#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI ) + + typedef struct FT_StrokerRec_ + { + FT_Angle angle_in; + FT_Angle angle_out; + FT_Vector center; + FT_Bool first_point; + FT_Bool subpath_open; + FT_Angle subpath_angle; + FT_Vector subpath_start; + + FT_Stroker_LineCap line_cap; + FT_Stroker_LineJoin line_join; + FT_Fixed miter_limit; + FT_Fixed radius; + + FT_Bool valid; + FT_StrokeBorderRec borders[2]; + FT_Library library; + + } FT_StrokerRec; + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ) + { + FT_Error error; + FT_Memory memory; + FT_Stroker stroker; + + + if ( !library ) + return FT_Err_Invalid_Argument; + + memory = library->memory; + + if ( !FT_NEW( stroker ) ) + { + stroker->library = library; + + ft_stroke_border_init( &stroker->borders[0], memory ); + ft_stroke_border_init( &stroker->borders[1], memory ); + } + *astroker = stroker; + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ) + { + stroker->radius = radius; + stroker->line_cap = line_cap; + stroker->line_join = line_join; + stroker->miter_limit = miter_limit; + + FT_Stroker_Rewind( stroker ); + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Rewind( FT_Stroker stroker ) + { + if ( stroker ) + { + ft_stroke_border_reset( &stroker->borders[0] ); + ft_stroke_border_reset( &stroker->borders[1] ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Done( FT_Stroker stroker ) + { + if ( stroker ) + { + FT_Memory memory = stroker->library->memory; + + + ft_stroke_border_done( &stroker->borders[0] ); + ft_stroke_border_done( &stroker->borders[1] ); + + stroker->library = NULL; + FT_FREE( stroker ); + } + } + + + /* creates a circular arc at a corner or cap */ + static FT_Error + ft_stroker_arcto( FT_Stroker stroker, + FT_Int side ) + { + FT_Angle total, rotate; + FT_Fixed radius = stroker->radius; + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border = stroker->borders + side; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( total == FT_ANGLE_PI ) + total = -rotate * 2; + + error = ft_stroke_border_arcto( border, + &stroker->center, + radius, + stroker->angle_in + rotate, + total ); + border->movable = FALSE; + return error; + } + + + /* adds a cap at the end of an opened path */ + static FT_Error + ft_stroker_cap( FT_Stroker stroker, + FT_Angle angle, + FT_Int side ) + { + FT_Error error = FT_Err_Ok; + + + if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND ) + { + /* add a round cap */ + stroker->angle_in = angle; + stroker->angle_out = angle + FT_ANGLE_PI; + error = ft_stroker_arcto( stroker, side ); + } + else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) + { + /* add a square cap */ + FT_Vector delta, delta2; + FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); + FT_Fixed radius = stroker->radius; + FT_StrokeBorder border = stroker->borders + side; + + + FT_Vector_From_Polar( &delta2, radius, angle + rotate ); + FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += stroker->center.x + delta2.x; + delta.y += stroker->center.y + delta2.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + FT_Vector_From_Polar( &delta2, radius, angle - rotate ); + FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += delta2.x + stroker->center.x; + delta.y += delta2.y + stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT ) + { + /* add a butt ending */ + FT_Vector delta; + FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); + FT_Fixed radius = stroker->radius; + FT_StrokeBorder border = stroker->borders + side; + + + FT_Vector_From_Polar( &delta, radius, angle + rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + FT_Vector_From_Polar( &delta, radius, angle - rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + + Exit: + return error; + } + + + /* process an inside corner, i.e. compute intersection */ + static FT_Error + ft_stroker_inside( FT_Stroker stroker, + FT_Int side) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Angle phi, theta, rotate; + FT_Fixed length, thcos, sigma; + FT_Vector delta; + FT_Error error = FT_Err_Ok; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute median angle */ + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( theta == FT_ANGLE_PI ) + theta = rotate; + else + theta = theta / 2; + + phi = stroker->angle_in + theta; + + thcos = FT_Cos( theta ); + sigma = FT_MulFix( stroker->miter_limit, thcos ); + + /* TODO: find better criterion to switch off the optimization */ + if ( sigma < 0x10000L ) + { + FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + border->movable = FALSE; + } + else + { + length = FT_DivFix( stroker->radius, thcos ); + + FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + } + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + + return error; + } + + + /* process an outside corner, i.e. compute bevel/miter/round */ + static FT_Error + ft_stroker_outside( FT_Stroker stroker, + FT_Int side ) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Error error; + FT_Angle rotate; + + + if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND ) + error = ft_stroker_arcto( stroker, side ); + else + { + /* this is a mitered or beveled corner */ + FT_Fixed sigma, radius = stroker->radius; + FT_Angle theta, phi; + FT_Fixed thcos; + FT_Bool miter; + + + rotate = FT_SIDE_TO_ROTATE( side ); + miter = FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_MITER ); + + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( theta == FT_ANGLE_PI ) + { + theta = rotate; + phi = stroker->angle_in; + } + else + { + theta = theta / 2; + phi = stroker->angle_in + theta + rotate; + } + + thcos = FT_Cos( theta ); + sigma = FT_MulFix( stroker->miter_limit, thcos ); + + /* FT_Sin(x) = 0 for x <= 57 */ + if ( sigma >= 0x10000L || ft_pos_abs( theta ) <= 57 ) + miter = FALSE; + + if ( miter ) /* this is a miter (broken angle) */ + { + FT_Vector middle, delta; + FT_Fixed length; + + + /* compute middle point */ + FT_Vector_From_Polar( &middle, + FT_MulFix( radius, stroker->miter_limit ), + phi ); + middle.x += stroker->center.x; + middle.y += stroker->center.y; + + /* compute first angle point */ + length = FT_MulFix( radius, + FT_DivFix( 0x10000L - sigma, + ft_pos_abs( FT_Sin( theta ) ) ) ); + + FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* compute second angle point */ + FT_Vector_From_Polar( &delta, length, phi - rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* finally, add a movable end point */ + FT_Vector_From_Polar( &delta, radius, stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, TRUE ); + } + + else /* this is a bevel (intersection) */ + { + FT_Fixed length; + FT_Vector delta; + + + length = FT_DivFix( stroker->radius, thcos ); + + FT_Vector_From_Polar( &delta, length, phi ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* now add end point */ + FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, TRUE ); + } + } + + Exit: + return error; + } + + + static FT_Error + ft_stroker_process_corner( FT_Stroker stroker ) + { + FT_Error error = FT_Err_Ok; + FT_Angle turn; + FT_Int inside_side; + + + turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn == 0 ) + goto Exit; + + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + + /* otherwise, the inside side is 1 */ + if ( turn < 0 ) + inside_side = 1; + + /* process the inside side */ + error = ft_stroker_inside( stroker, inside_side ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, 1 - inside_side ); + + Exit: + return error; + } + + + /* add two points to the left and right borders corresponding to the */ + /* start of the subpath */ + static FT_Error + ft_stroker_subpath_start( FT_Stroker stroker, + FT_Angle start_angle ) + { + FT_Vector delta; + FT_Vector point; + FT_Error error; + FT_StrokeBorder border; + + + FT_Vector_From_Polar( &delta, stroker->radius, + start_angle + FT_ANGLE_PI2 ); + + point.x = stroker->center.x + delta.x; + point.y = stroker->center.y + delta.y; + + border = stroker->borders; + error = ft_stroke_border_moveto( border, &point ); + if ( error ) + goto Exit; + + point.x = stroker->center.x - delta.x; + point.y = stroker->center.y - delta.y; + + border++; + error = ft_stroke_border_moveto( border, &point ); + + /* save angle for last cap */ + stroker->subpath_angle = start_angle; + stroker->first_point = FALSE; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border; + FT_Vector delta; + FT_Angle angle; + FT_Int side; + + delta.x = to->x - stroker->center.x; + delta.y = to->y - stroker->center.y; + + angle = FT_Atan2( delta.x, delta.y ); + FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 ); + + /* process corner if necessary */ + if ( stroker->first_point ) + { + /* This is the first segment of a subpath. We need to */ + /* add a point to each border at their respective starting */ + /* point locations. */ + error = ft_stroker_subpath_start( stroker, angle ); + if ( error ) + goto Exit; + } + else + { + /* process the current corner */ + stroker->angle_out = angle; + error = ft_stroker_process_corner( stroker ); + if ( error ) + goto Exit; + } + + /* now add a line segment to both the `inside' and `outside' paths */ + + for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) + { + FT_Vector point; + + + point.x = to->x + delta.x; + point.y = to->y + delta.y; + + error = ft_stroke_border_lineto( border, &point, TRUE ); + if ( error ) + goto Exit; + + delta.x = -delta.x; + delta.y = -delta.y; + } + + stroker->angle_in = angle; + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[34]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 30; + FT_Angle start_angle; + FT_Bool first_arc = TRUE; + + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control; + arc[2] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_out; + + + angle_in = angle_out = 0; /* remove compiler warnings */ + + if ( arc < limit && + !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) + { + ft_conic_split( arc ); + arc += 2; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + start_angle = angle_in; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, start_angle ); + else + { + stroker->angle_out = start_angle; + error = ft_stroker_process_corner( stroker ); + } + } + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl, end; + FT_Angle theta, phi, rotate; + FT_Fixed length; + FT_Int side; + + + theta = FT_Angle_Diff( angle_in, angle_out ) / 2; + phi = angle_in + theta; + length = FT_DivFix( stroker->radius, FT_Cos( theta ) ); + + for ( side = 0; side <= 1; side++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control point */ + FT_Vector_From_Polar( &ctrl, length, phi + rotate ); + ctrl.x += arc[1].x; + ctrl.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + error = ft_stroke_border_conicto( stroker->borders + side, + &ctrl, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 2; + + if ( arc < bez_stack ) + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[37]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 32; + FT_Angle start_angle; + FT_Bool first_arc = TRUE; + + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control2; + arc[2] = *control1; + arc[3] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_mid, angle_out; + + + /* remove compiler warnings */ + angle_in = angle_out = angle_mid = 0; + + if ( arc < limit && + !ft_cubic_is_small_enough( arc, &angle_in, + &angle_mid, &angle_out ) ) + { + ft_cubic_split( arc ); + arc += 3; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + start_angle = angle_in; + + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, start_angle ); + else + { + stroker->angle_out = start_angle; + error = ft_stroker_process_corner( stroker ); + } + if ( error ) + goto Exit; + } + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl1, ctrl2, end; + FT_Angle theta1, phi1, theta2, phi2, rotate; + FT_Fixed length1, length2; + FT_Int side; + + + theta1 = ft_pos_abs( angle_mid - angle_in ) / 2; + theta2 = ft_pos_abs( angle_out - angle_mid ) / 2; + phi1 = (angle_mid + angle_in ) / 2; + phi2 = (angle_mid + angle_out ) / 2; + length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) ); + length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) ); + + for ( side = 0; side <= 1; side++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control points */ + FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); + ctrl1.x += arc[2].x; + ctrl1.y += arc[2].y; + + FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); + ctrl2.x += arc[1].x; + ctrl2.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + error = ft_stroke_border_cubicto( stroker->borders + side, + &ctrl1, &ctrl2, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 3; + if ( arc < bez_stack ) + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ) + { + /* We cannot process the first point, because there is not enough */ + /* information regarding its corner/cap. The latter will be processed */ + /* in the `FT_Stroker_EndSubPath' routine. */ + /* */ + stroker->first_point = TRUE; + stroker->center = *to; + stroker->subpath_open = open; + + /* record the subpath start point for each border */ + stroker->subpath_start = *to; + + return FT_Err_Ok; + } + + + static FT_Error + ft_stroker_add_reverse_left( FT_Stroker stroker, + FT_Bool open ) + { + FT_StrokeBorder right = stroker->borders + 0; + FT_StrokeBorder left = stroker->borders + 1; + FT_Int new_points; + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( left->start >= 0 ); + + new_points = left->num_points - left->start; + if ( new_points > 0 ) + { + error = ft_stroke_border_grow( right, (FT_UInt)new_points ); + if ( error ) + goto Exit; + + { + FT_Vector* dst_point = right->points + right->num_points; + FT_Byte* dst_tag = right->tags + right->num_points; + FT_Vector* src_point = left->points + left->num_points - 1; + FT_Byte* src_tag = left->tags + left->num_points - 1; + + while ( src_point >= left->points + left->start ) + { + *dst_point = *src_point; + *dst_tag = *src_tag; + + if ( open ) + dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END; + else + { + FT_Byte ttag = (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END ); + + + /* switch begin/end tags if necessary */ + if ( ttag == FT_STROKE_TAG_BEGIN || + ttag == FT_STROKE_TAG_END ) + dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; + + } + + src_point--; + src_tag--; + dst_point++; + dst_tag++; + } + } + + left->num_points = left->start; + right->num_points += new_points; + + right->movable = FALSE; + left->movable = FALSE; + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + /* there's a lot of magic in this function! */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ) + { + FT_Error error = FT_Err_Ok; + + + if ( stroker->subpath_open ) + { + FT_StrokeBorder right = stroker->borders; + + /* All right, this is an opened path, we need to add a cap between */ + /* right & left, add the reverse of left, then add a final cap */ + /* between left & right. */ + error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); + if ( error ) + goto Exit; + + /* add reversed points from `left' to `right' */ + error = ft_stroker_add_reverse_left( stroker, TRUE ); + if ( error ) + goto Exit; + + /* now add the final cap */ + stroker->center = stroker->subpath_start; + error = ft_stroker_cap( stroker, + stroker->subpath_angle + FT_ANGLE_PI, 0 ); + if ( error ) + goto Exit; + + /* Now end the right subpath accordingly. The left one is */ + /* rewind and doesn't need further processing. */ + ft_stroke_border_close( right, FALSE ); + } + else + { + FT_Angle turn; + FT_Int inside_side; + + /* close the path if needed */ + if ( stroker->center.x != stroker->subpath_start.x || + stroker->center.y != stroker->subpath_start.y ) + { + error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); + if ( error ) + goto Exit; + } + + /* process the corner */ + stroker->angle_out = stroker->subpath_angle; + turn = FT_Angle_Diff( stroker->angle_in, + stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn != 0 ) + { + /* when we turn to the right, the inside side is 0 */ + inside_side = 0; + + /* otherwise, the inside side is 1 */ + if ( turn < 0 ) + inside_side = 1; + + error = ft_stroker_inside( stroker, inside_side ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, 1 - inside_side ); + if ( error ) + goto Exit; + } + + /* then end our two subpaths */ + ft_stroke_border_close( stroker->borders + 0, TRUE ); + ft_stroke_border_close( stroker->borders + 1, FALSE ); + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt num_points = 0, num_contours = 0; + FT_Error error; + + + if ( !stroker || border > 1 ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + border, + &num_points, &num_contours ); + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt count1, count2, num_points = 0; + FT_UInt count3, count4, num_contours = 0; + FT_Error error; + + + error = ft_stroke_border_get_counts( stroker->borders + 0, + &count1, &count2 ); + if ( error ) + goto Exit; + + error = ft_stroke_border_get_counts( stroker->borders + 1, + &count3, &count4 ); + if ( error ) + goto Exit; + + num_points = count1 + count3; + num_contours = count2 + count4; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ) + { + if ( border == FT_STROKER_BORDER_LEFT || + border == FT_STROKER_BORDER_RIGHT ) + { + FT_StrokeBorder sborder = & stroker->borders[border]; + + + if ( sborder->valid ) + ft_stroke_border_export( sborder, outline ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ) + { + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); + } + + + /* documentation is in ftstroke.h */ + + /* + * The following is very similar to FT_Outline_Decompose, except + * that we do support opened paths, and do not scale the outline. + */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_UInt first; /* index of first point in contour */ + FT_Int tag; /* current point's state */ + + + if ( !outline || !stroker ) + return FT_Err_Invalid_Argument; + + FT_Stroker_Rewind( stroker ); + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_UInt last; /* index of last point in contour */ + + + last = outline->contours[n]; + limit = outline->points + last; + + /* skip empty points; we don't stroke these */ + if ( last <= first ) + { + first = last + 1; + continue; + } + + v_start = outline->points[first]; + v_last = outline->points[last]; + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* First point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + } + point--; + tags--; + } + + error = FT_Stroker_BeginSubPath( stroker, &v_start, opened ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = point->x; + vec.y = point->y; + + error = FT_Stroker_LineTo( stroker, &vec ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = point->x; + v_control.y = point->y; + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec = point[0]; + + if ( tag == FT_CURVE_TAG_ON ) + { + error = FT_Stroker_ConicTo( stroker, &v_control, &vec ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_start ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1 = point[-2]; + vec2 = point[-1]; + + if ( point <= limit ) + { + FT_Vector vec; + + + vec = point[0]; + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); + if ( error ) + goto Exit; + continue; + } + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); + goto Close; + } + } + } + + Close: + if ( error ) + goto Exit; + + error = FT_Stroker_EndSubPath( stroker ); + if ( error ) + goto Exit; + + first = last + 1; + } + + return FT_Err_Ok; + + Exit: + return error; + + Invalid_Outline: + return FT_Err_Invalid_Outline; + } + +/* declare an extern to access ft_outline_glyph_class global allocated + in ftglyph.c, and use the FT_OUTLINE_GLYPH_CLASS_GET macro to access + it when FT_CONFIG_OPTION_PIC is defined */ +#ifndef FT_CONFIG_OPTION_PIC + extern const FT_Glyph_Class ft_outline_glyph_class; +#endif +#include "basepic.h" + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Glyph glyph = NULL; + FT_Library library = stroker->library; + FT_UNUSED(library); + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, num_contours, outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_Export( stroker, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ) + { + FT_Error error = FT_Err_Invalid_Argument; + FT_Glyph glyph = NULL; + FT_Library library = stroker->library; + FT_UNUSED(library); + + if ( pglyph == NULL ) + goto Exit; + + glyph = *pglyph; + if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph) glyph; + FT_StrokerBorder border; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + border = FT_Outline_GetOutsideBorder( outline ); + if ( inside ) + { + if ( border == FT_STROKER_BORDER_LEFT ) + border = FT_STROKER_BORDER_RIGHT; + else + border = FT_STROKER_BORDER_LEFT; + } + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + (void)FT_Stroker_GetBorderCounts( stroker, border, + &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_ExportBorder( stroker, border, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftsynth.c b/alienblaster/project/jni/freetype/src/base/ftsynth.c new file mode 100644 index 000000000..ba3c633e2 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftsynth.c @@ -0,0 +1,160 @@ +/***************************************************************************/ +/* */ +/* ftsynth.c */ +/* */ +/* FreeType synthesizing code for emboldening and slanting (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_SYNTHESIS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include FT_BITMAP_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_synth + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ) + { + FT_Matrix transform; + FT_Outline* outline = &slot->outline; + + + /* only oblique outline glyphs */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + return; + + /* we don't touch the advance width */ + + /* For italic, simply apply a shear transform, with an angle */ + /* of about 12 degrees. */ + + transform.xx = 0x10000L; + transform.yx = 0x00000L; + + transform.xy = 0x06000L; + transform.yy = 0x10000L; + + FT_Outline_Transform( outline, &transform ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL EMBOLDENING/OUTLINING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) + { + FT_Library library = slot->library; + FT_Face face = slot->face; + FT_Error error; + FT_Pos xstr, ystr; + + + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && + slot->format != FT_GLYPH_FORMAT_BITMAP ) + return; + + /* some reasonable strength */ + xstr = FT_MulFix( face->units_per_EM, + face->size->metrics.y_scale ) / 24; + ystr = xstr; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* ignore error */ + (void)FT_Outline_Embolden( &slot->outline, xstr ); + + /* this is more than enough for most glyphs; if you need accurate */ + /* values, you have to call FT_Outline_Get_CBox */ + xstr = xstr * 2; + ystr = xstr; + } + else if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + { + /* round to full pixels */ + xstr &= ~63; + if ( xstr == 0 ) + xstr = 1 << 6; + ystr &= ~63; + + /* + * XXX: overflow check for 16-bit system, for compatibility + * with FT_GlyphSlot_Embolden() since freetype-2.1.10. + * unfortunately, this function return no informations + * about the cause of error. + */ + if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) + { + FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); + FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr )); + return; + } + error = FT_GlyphSlot_Own_Bitmap( slot ); + if ( error ) + return; + + error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr ); + if ( error ) + return; + } + + if ( slot->advance.x ) + slot->advance.x += xstr; + + if ( slot->advance.y ) + slot->advance.y += ystr; + + slot->metrics.width += xstr; + slot->metrics.height += ystr; + slot->metrics.horiBearingY += ystr; + slot->metrics.horiAdvance += xstr; + slot->metrics.vertBearingX -= xstr / 2; + slot->metrics.vertBearingY += ystr; + slot->metrics.vertAdvance += ystr; + + /* XXX: 16-bit overflow case must be excluded before here */ + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + slot->bitmap_top += (FT_Int)( ystr >> 6 ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftsystem.c b/alienblaster/project/jni/freetype/src/base/ftsystem.c new file mode 100644 index 000000000..4d06d6db5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftsystem.c @@ -0,0 +1,302 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* ANSI-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file contains the default interface used by FreeType to access */ + /* low-level, i.e. memory management, i/o access as well as thread */ + /* synchronisation. It can be replaced by user-specific routines if */ + /* necessary. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* It is not necessary to do any error checking for the */ + /* allocation-related functions. This will be done by the higher level */ + /* routines like ft_mem_alloc() or ft_mem_realloc(). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_alloc */ + /* */ + /* <Description> */ + /* The memory allocation function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* <Return> */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return ft_smalloc( size ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_realloc */ + /* */ + /* <Description> */ + /* The memory reallocation function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* <Return> */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return ft_srealloc( block, new_size ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_free */ + /* */ + /* <Description> */ + /* The memory release function. */ + /* */ + /* <Input> */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + ft_sfree( block ); + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_ansi_stream_close */ + /* */ + /* <Description> */ + /* The function to close a stream. */ + /* */ + /* <Input> */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_ansi_stream_close( FT_Stream stream ) + { + ft_fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_ansi_stream_io */ + /* */ + /* <Description> */ + /* The function to open a stream. */ + /* */ + /* <Input> */ + /* stream :: A pointer to the stream object. */ + /* */ + /* offset :: The position in the data stream to start reading. */ + /* */ + /* buffer :: The address of buffer to store the read data. */ + /* */ + /* count :: The number of bytes to read from the stream. */ + /* */ + /* <Return> */ + /* The number of bytes actually read. */ + /* */ + FT_CALLBACK_DEF( unsigned long ) + ft_ansi_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_FILE* file; + + + file = STREAM_FILE( stream ); + + if ( stream->pos != offset ) + ft_fseek( file, offset, SEEK_SET ); + + return (unsigned long)ft_fread( buffer, 1, count, file ); + } + + + /* documentation is in ftstream.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + FT_FILE* file; + + + if ( !stream ) + return FT_Err_Invalid_Stream_Handle; + + file = ft_fopen( filepathname, "rb" ); + if ( !file ) + { + FT_ERROR(( "FT_Stream_Open:" + " could not open `%s'\n", filepathname )); + + return FT_Err_Cannot_Open_Resource; + } + + ft_fseek( file, 0, SEEK_END ); + stream->size = ft_ftell( file ); + ft_fseek( file, 0, SEEK_SET ); + + stream->descriptor.pointer = file; + stream->pathname.pointer = (char*)filepathname; + stream->pos = 0; + + stream->read = ft_ansi_stream_io; + stream->close = ft_ansi_stream_close; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + } + + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = 0; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + ft_sfree( memory ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/fttrigon.c b/alienblaster/project/jni/freetype/src/base/fttrigon.c new file mode 100644 index 000000000..fdf433ab8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/fttrigon.c @@ -0,0 +1,546 @@ +/***************************************************************************/ +/* */ +/* fttrigon.c */ +/* */ +/* FreeType trigonometric functions (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_TRIGONOMETRY_H + + + /* the following is 0.2715717684432231 * 2^30 */ +#define FT_TRIG_COSCALE 0x11616E8EUL + + /* this table was generated for FT_PI = 180L << 16, i.e. degrees */ +#define FT_TRIG_MAX_ITERS 23 + + static const FT_Fixed + ft_trig_arctan_table[24] = + { + 4157273L, 2949120L, 1740967L, 919879L, 466945L, 234379L, 117304L, + 58666L, 29335L, 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, + 57L, 29L, 14L, 7L, 4L, 2L, 1L + }; + + /* the Cordic shrink factor, multiplied by 2^32 */ +#define FT_TRIG_SCALE 1166391785UL /* 0x4585BA38UL */ + + +#ifdef FT_CONFIG_HAS_INT64 + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Fixed s; + FT_Int64 v; + + + s = val; + val = ( val >= 0 ) ? val : -val; + + v = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL; + val = (FT_Fixed)( v >> 32 ); + + return ( s >= 0 ) ? val : -val; + } + +#else /* !FT_CONFIG_HAS_INT64 */ + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Fixed s; + FT_UInt32 v1, v2, k1, k2, hi, lo1, lo2, lo3; + + + s = val; + val = ( val >= 0 ) ? val : -val; + + v1 = (FT_UInt32)val >> 16; + v2 = (FT_UInt32)(val & 0xFFFFL); + + k1 = (FT_UInt32)FT_TRIG_SCALE >> 16; /* constant */ + k2 = (FT_UInt32)(FT_TRIG_SCALE & 0xFFFFL); /* constant */ + + hi = k1 * v1; + lo1 = k1 * v2 + k2 * v1; /* can't overflow */ + + lo2 = ( k2 * v2 ) >> 16; + lo3 = ( lo1 >= lo2 ) ? lo1 : lo2; + lo1 += lo2; + + hi += lo1 >> 16; + if ( lo1 < lo3 ) + hi += (FT_UInt32)0x10000UL; + + val = (FT_Fixed)hi; + + return ( s >= 0 ) ? val : -val; + } + +#endif /* !FT_CONFIG_HAS_INT64 */ + + + static FT_Int + ft_trig_prenorm( FT_Vector* vec ) + { + FT_Fixed x, y, z; + FT_Int shift; + + + x = vec->x; + y = vec->y; + + z = ( ( x >= 0 ) ? x : - x ) | ( (y >= 0) ? y : -y ); + shift = 0; + +#if 1 + /* determine msb bit index in `shift' */ + if ( z >= ( 1L << 16 ) ) + { + z >>= 16; + shift += 16; + } + if ( z >= ( 1L << 8 ) ) + { + z >>= 8; + shift += 8; + } + if ( z >= ( 1L << 4 ) ) + { + z >>= 4; + shift += 4; + } + if ( z >= ( 1L << 2 ) ) + { + z >>= 2; + shift += 2; + } + if ( z >= ( 1L << 1 ) ) + { + z >>= 1; + shift += 1; + } + + if ( shift <= 27 ) + { + shift = 27 - shift; + vec->x = x << shift; + vec->y = y << shift; + } + else + { + shift -= 27; + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + +#else /* 0 */ + + if ( z < ( 1L << 27 ) ) + { + do + { + shift++; + z <<= 1; + } while ( z < ( 1L << 27 ) ); + vec->x = x << shift; + vec->y = y << shift; + } + else if ( z > ( 1L << 28 ) ) + { + do + { + shift++; + z >>= 1; + } while ( z > ( 1L << 28 ) ); + + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + +#endif /* 0 */ + + return shift; + } + + + static void + ft_trig_pseudo_rotate( FT_Vector* vec, + FT_Angle theta ) + { + FT_Int i; + FT_Fixed x, y, xtemp; + const FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get angle between -90 and 90 degrees */ + while ( theta <= -FT_ANGLE_PI2 ) + { + x = -x; + y = -y; + theta += FT_ANGLE_PI; + } + + while ( theta > FT_ANGLE_PI2 ) + { + x = -x; + y = -y; + theta -= FT_ANGLE_PI; + } + + /* Initial pseudorotation, with left shift */ + arctanptr = ft_trig_arctan_table; + + if ( theta < 0 ) + { + xtemp = x + ( y << 1 ); + y = y - ( x << 1 ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( y << 1 ); + y = y + ( x << 1 ); + x = xtemp; + theta -= *arctanptr++; + } + + /* Subsequent pseudorotations, with right shifts */ + i = 0; + do + { + if ( theta < 0 ) + { + xtemp = x + ( y >> i ); + y = y - ( x >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( y >> i ); + y = y + ( x >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } while ( ++i < FT_TRIG_MAX_ITERS ); + + vec->x = x; + vec->y = y; + } + + + static void + ft_trig_pseudo_polarize( FT_Vector* vec ) + { + FT_Fixed theta; + FT_Fixed yi, i; + FT_Fixed x, y; + const FT_Fixed *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get the vector into the right half plane */ + theta = 0; + if ( x < 0 ) + { + x = -x; + y = -y; + theta = 2 * FT_ANGLE_PI2; + } + + if ( y > 0 ) + theta = - theta; + + arctanptr = ft_trig_arctan_table; + + if ( y < 0 ) + { + /* Rotate positive */ + yi = y + ( x << 1 ); + x = x - ( y << 1 ); + y = yi; + theta -= *arctanptr++; /* Subtract angle */ + } + else + { + /* Rotate negative */ + yi = y - ( x << 1 ); + x = x + ( y << 1 ); + y = yi; + theta += *arctanptr++; /* Add angle */ + } + + i = 0; + do + { + if ( y < 0 ) + { + /* Rotate positive */ + yi = y + ( x >> i ); + x = x - ( y >> i ); + y = yi; + theta -= *arctanptr++; + } + else + { + /* Rotate negative */ + yi = y - ( x >> i ); + x = x + ( y >> i ); + y = yi; + theta += *arctanptr++; + } + } while ( ++i < FT_TRIG_MAX_ITERS ); + + /* round theta */ + if ( theta >= 0 ) + theta = FT_PAD_ROUND( theta, 32 ); + else + theta = -FT_PAD_ROUND( -theta, 32 ); + + vec->x = x; + vec->y = theta; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Cos( FT_Angle angle ) + { + FT_Vector v; + + + v.x = FT_TRIG_COSCALE >> 2; + v.y = 0; + ft_trig_pseudo_rotate( &v, angle ); + + return v.x / ( 1 << 12 ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Sin( FT_Angle angle ) + { + return FT_Cos( FT_ANGLE_PI2 - angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Tan( FT_Angle angle ) + { + FT_Vector v; + + + v.x = FT_TRIG_COSCALE >> 2; + v.y = 0; + ft_trig_pseudo_rotate( &v, angle ); + + return FT_DivFix( v.y, v.x ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Atan2( FT_Fixed dx, + FT_Fixed dy ) + { + FT_Vector v; + + + if ( dx == 0 && dy == 0 ) + return 0; + + v.x = dx; + v.y = dy; + ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + return v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ) + { + vec->x = FT_TRIG_COSCALE >> 2; + vec->y = 0; + ft_trig_pseudo_rotate( vec, angle ); + vec->x >>= 12; + vec->y >>= 12; + } + + + /* these macros return 0 for positive numbers, + and -1 for negative ones */ +#define FT_SIGN_LONG( x ) ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) ) +#define FT_SIGN_INT( x ) ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) ) +#define FT_SIGN_INT32( x ) ( (x) >> 31 ) +#define FT_SIGN_INT16( x ) ( (x) >> 15 ) + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ) + { + FT_Int shift; + FT_Vector v; + + + v.x = vec->x; + v.y = vec->y; + + if ( angle && ( v.x != 0 || v.y != 0 ) ) + { + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_rotate( &v, angle ); + v.x = ft_trig_downscale( v.x ); + v.y = ft_trig_downscale( v.y ); + + if ( shift > 0 ) + { + FT_Int32 half = (FT_Int32)1L << ( shift - 1 ); + + + vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift; + vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift; + } + else + { + shift = -shift; + vec->x = v.x << shift; + vec->y = v.y << shift; + } + } + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ) + { + FT_Int shift; + FT_Vector v; + + + v = *vec; + + /* handle trivial cases */ + if ( v.x == 0 ) + { + return ( v.y >= 0 ) ? v.y : -v.y; + } + else if ( v.y == 0 ) + { + return ( v.x >= 0 ) ? v.x : -v.x; + } + + /* general case */ + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + if ( shift > 0 ) + return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift; + + return v.x << -shift; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ) + { + FT_Int shift; + FT_Vector v; + + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + *length = ( shift >= 0 ) ? ( v.x >> shift ) : ( v.x << -shift ); + *angle = v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ) + { + vec->x = length; + vec->y = 0; + + FT_Vector_Rotate( vec, angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ) + { + FT_Angle delta = angle2 - angle1; + + + delta %= FT_ANGLE_2PI; + if ( delta < 0 ) + delta += FT_ANGLE_2PI; + + if ( delta > FT_ANGLE_PI ) + delta -= FT_ANGLE_2PI; + + return delta; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/fttype1.c b/alienblaster/project/jni/freetype/src/base/fttype1.c new file mode 100644 index 000000000..3975584db --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/fttype1.c @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* fttype1.c */ +/* */ +/* FreeType utility file for PS names support (body). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_INFO_H + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( face ) + { + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_info ) + error = service->ps_get_font_info( face, afont_info ); + } + + return error; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ) + { + FT_Int result = 0; + FT_Service_PsInfo service = NULL; + + + if ( face ) + { + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_has_glyph_names ) + result = service->ps_has_glyph_names( face ); + } + + return result; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_PrivateRec* afont_private ) + { + FT_Error error = FT_Err_Invalid_Argument; + + + if ( face ) + { + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_private ) + error = service->ps_get_font_private( face, afont_private ); + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftutil.c b/alienblaster/project/jni/freetype/src/base/ftutil.c new file mode 100644 index 000000000..5f77be557 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftutil.c @@ -0,0 +1,501 @@ +/***************************************************************************/ +/* */ +/* ftutil.c */ +/* */ +/* FreeType utility file for memory and list management (body). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H +#include FT_LIST_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_memory + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** M E M O R Y M A N A G E M E N T *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer block = ft_mem_qalloc( memory, size, &error ); + + if ( !error && size > 0 ) + FT_MEM_ZERO( block, size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + FT_Pointer block = NULL; + + + if ( size > 0 ) + { + block = memory->alloc( memory, size ); + if ( block == NULL ) + error = FT_Err_Out_Of_Memory; + } + else if ( size < 0 ) + { + /* may help catch/prevent security issues */ + error = FT_Err_Invalid_Argument; + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + block = ft_mem_qrealloc( memory, item_size, + cur_count, new_count, block, &error ); + if ( !error && new_count > cur_count ) + FT_MEM_ZERO( (char*)block + cur_count * item_size, + ( new_count - cur_count ) * item_size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + + /* Note that we now accept `item_size == 0' as a valid parameter, in + * order to cover very weird cases where an ALLOC_MULT macro would be + * called. + */ + if ( cur_count < 0 || new_count < 0 || item_size < 0 ) + { + /* may help catch/prevent nasty security issues */ + error = FT_Err_Invalid_Argument; + } + else if ( new_count == 0 || item_size == 0 ) + { + ft_mem_free( memory, block ); + block = NULL; + } + else if ( new_count > FT_INT_MAX/item_size ) + { + error = FT_Err_Array_Too_Large; + } + else if ( cur_count == 0 ) + { + FT_ASSERT( block == NULL ); + + block = ft_mem_alloc( memory, new_count*item_size, &error ); + } + else + { + FT_Pointer block2; + FT_Long cur_size = cur_count*item_size; + FT_Long new_size = new_count*item_size; + + + block2 = memory->realloc( memory, cur_size, new_size, block ); + if ( block2 == NULL ) + error = FT_Err_Out_Of_Memory; + else + block = block2; + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( void ) + ft_mem_free( FT_Memory memory, + const void *P ) + { + if ( P ) + memory->free( memory, (void*)P ); + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer p = ft_mem_qalloc( memory, size, &error ); + + + if ( !error && address ) + ft_memcpy( p, address, size ); + + *p_error = error; + return p; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ) + { + FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1 + : 0; + + + return ft_mem_dup( memory, str, len, p_error ); + } + + + FT_BASE_DEF( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ) + { + while ( size > 1 && *src != 0 ) + { + *dst++ = *src++; + size--; + } + + *dst = 0; /* always zero-terminate */ + + return *src != 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** D O U B L Y L I N K E D L I S T S *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#undef FT_COMPONENT +#define FT_COMPONENT trace_list + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ) + { + FT_ListNode cur; + + + cur = list->head; + while ( cur ) + { + if ( cur->data == data ) + return cur; + + cur = cur->next; + } + + return (FT_ListNode)0; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Add( FT_List list, + FT_ListNode node ) + { + FT_ListNode before = list->tail; + + + node->next = 0; + node->prev = before; + + if ( before ) + before->next = node; + else + list->head = node; + + list->tail = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ) + { + FT_ListNode after = list->head; + + + node->next = after; + node->prev = 0; + + if ( !after ) + list->tail = node; + else + after->prev = node; + + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + before = node->prev; + after = node->next; + + if ( before ) + before->next = after; + else + list->head = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Up( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + before = node->prev; + after = node->next; + + /* check whether we are already on top of the list */ + if ( !before ) + return; + + before->next = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + + node->prev = 0; + node->next = list->head; + list->head->prev = node; + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ) + { + FT_ListNode cur = list->head; + FT_Error error = FT_Err_Ok; + + + while ( cur ) + { + FT_ListNode next = cur->next; + + + error = iterator( cur, user ); + if ( error ) + break; + + cur = next; + } + + return error; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ) + { + FT_ListNode cur; + + + cur = list->head; + while ( cur ) + { + FT_ListNode next = cur->next; + void* data = cur->data; + + + if ( destroy ) + destroy( memory, data, user ); + + FT_FREE( cur ); + cur = next; + } + + list->head = 0; + list->tail = 0; + } + + + FT_BASE_DEF( FT_UInt32 ) + ft_highpow2( FT_UInt32 value ) + { + FT_UInt32 value2; + + + /* + * We simply clear the lowest bit in each iteration. When + * we reach 0, we know that the previous value was our result. + */ + for ( ;; ) + { + value2 = value & (value - 1); /* clear lowest bit */ + if ( value2 == 0 ) + break; + + value = value2; + } + return value; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE_DEF( FT_Error ) + FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ) + { + FT_Error error; + + + (void)FT_ALLOC( *P, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_QAlloc( FT_Memory memory, + FT_Long size, + void* *p ) + { + FT_Error error; + + + (void)FT_QALLOC( *p, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *P ) + { + FT_Error error; + + + (void)FT_REALLOC( *P, current, size ); + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_QRealloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *p ) + { + FT_Error error; + + + (void)FT_QREALLOC( *p, current, size ); + return error; + } + + + FT_BASE_DEF( void ) + FT_Free( FT_Memory memory, + void* *P ) + { + if ( *P ) + FT_MEM_FREE( *P ); + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftwinfnt.c b/alienblaster/project/jni/freetype/src/base/ftwinfnt.c new file mode 100644 index 000000000..bc2e90e1f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftwinfnt.c @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.c */ +/* */ +/* FreeType API for accessing Windows FNT specific info (body). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_WINFONTS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_WINFNT_H + + + /* documentation is in ftwinfnt.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *header ) + { + FT_Service_WinFnt service; + FT_Error error; + + + error = FT_Err_Invalid_Argument; + + if ( face != NULL ) + { + FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); + + if ( service != NULL ) + { + error = service->get_header( face, header ); + } + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/ftxf86.c b/alienblaster/project/jni/freetype/src/base/ftxf86.c new file mode 100644 index 000000000..a4bf767df --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/ftxf86.c @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* ftxf86.c */ +/* */ +/* FreeType utility file for X11 support (body). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_XFREE86_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_XFREE86_NAME_H + + + /* documentation is in ftxf86.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_X11_Font_Format( FT_Face face ) + { + const char* result = NULL; + + + if ( face ) + FT_FACE_FIND_SERVICE( face, result, XF86_NAME ); + + return result; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/base/rules.mk b/alienblaster/project/jni/freetype/src/base/rules.mk new file mode 100644 index 000000000..10f578abc --- /dev/null +++ b/alienblaster/project/jni/freetype/src/base/rules.mk @@ -0,0 +1,96 @@ +# +# FreeType 2 base layer configuration rules +# + + +# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# It sets the following variables which are used by the master Makefile +# after the call: +# +# BASE_OBJ_S: The single-object base layer. +# BASE_OBJ_M: A list of all objects for a multiple-objects build. +# BASE_EXT_OBJ: A list of base layer extensions, i.e., components found +# in `freetype/src/base' which are not compiled within the +# base layer proper. + + +BASE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SRC_DIR)/base) + + +# Base layer sources +# +# ftsystem, ftinit, and ftdebug are handled by freetype.mk +# +# All files listed here should be included in `ftbase.c' (for a `single' +# build). +# +BASE_SRC := $(BASE_DIR)/ftadvanc.c \ + $(BASE_DIR)/ftcalc.c \ + $(BASE_DIR)/ftdbgmem.c \ + $(BASE_DIR)/ftgloadr.c \ + $(BASE_DIR)/ftobjs.c \ + $(BASE_DIR)/ftoutln.c \ + $(BASE_DIR)/ftrfork.c \ + $(BASE_DIR)/ftsnames.c \ + $(BASE_DIR)/ftstream.c \ + $(BASE_DIR)/fttrigon.c \ + $(BASE_DIR)/ftutil.c + + +ifneq ($(ftmac_c),) + BASE_SRC += $(BASE_DIR)/$(ftmac_c) +endif + +BASE_H := $(BASE_DIR)/ftbase.h + +# Base layer `extensions' sources +# +# An extension is added to the library file as a separate object. It is +# then linked to the final executable only if one of its symbols is used by +# the application. +# +BASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS)) + +# Default extensions objects +# +BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O) + + +# Base layer object(s) +# +# BASE_OBJ_M is used during `multi' builds (each base source file compiles +# to a single object file). +# +# BASE_OBJ_S is used during `single' builds (the whole base layer is +# compiled as a single object file using ftbase.c). +# +BASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O) +BASE_OBJ_S := $(OBJ_DIR)/ftbase.$O + +# Base layer root source file for single build +# +BASE_SRC_S := $(BASE_DIR)/ftbase.c + + +# Base layer - single object build +# +$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H) + $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S)) + + +# Multiple objects build + extensions +# +$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H) + $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/bdf/Jamfile b/alienblaster/project/jni/freetype/src/bdf/Jamfile new file mode 100644 index 000000000..da23ccd0a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/bdf Jamfile +# +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) bdf ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = bdfdrivr bdflib ; + } + else + { + _sources = bdf ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/bdf Jamfile diff --git a/alienblaster/project/jni/freetype/src/bdf/README b/alienblaster/project/jni/freetype/src/bdf/README new file mode 100644 index 000000000..e3f2ae386 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/README @@ -0,0 +1,148 @@ + FreeType font driver for BDF fonts + + Francesco Zappa Nardelli + <francesco.zappa.nardelli@ens.fr> + + +Introduction +************ + +BDF (Bitmap Distribution Format) is a bitmap font format defined by Adobe, +which is intended to be easily understood by both humans and computers. +This code implements a BDF driver for the FreeType library, following the +Adobe Specification V 2.2. The specification of the BDF font format is +available from Adobe's web site: + + http://partners.adobe.com/asn/developer/PDFS/TN/5005.BDF_Spec.pdf + +Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org). +They do not define vertical metrics, because the X Consortium BDF +specification has removed them. + + +Encodings +********* + +The variety of encodings that accompanies bdf fonts appears to encompass the +small set defined in freetype.h. On the other hand, two properties that +specify encoding and registry are usually defined in bdf fonts. + +I decided to make these two properties directly accessible, leaving to the +client application the work of interpreting them. For instance: + + + #include FT_INTERNAL_BDF_TYPES_H + + FT_Face face; + BDF_Public_Face bdfface; + + + FT_New_Face( library, ..., &face ); + + bdfface = (BDF_Public_Face)face; + + if ( ( bdfface->charset_registry == "ISO10646" ) && + ( bdfface->charset_encoding == "1" ) ) + [..] + + +Thus the driver always exports `ft_encoding_none' as face->charmap.encoding. +FT_Get_Char_Index's behavior is unmodified, that is, it converts the ULong +value given as argument into the corresponding glyph number. + +If the two properties are not available, Adobe Standard Encoding should be +assumed. + + +Anti-Aliased Bitmaps +******************** + +The driver supports an extension to the BDF format as used in Mark Leisher's +xmbdfed bitmap font editor. Microsoft's SBIT tool expects bitmap fonts in +that format for adding anti-aliased them to TrueType fonts. It introduces a +fourth field to the `SIZE' keyword which gives the bpp value (bits per +pixel) of the glyph data in the font. Possible values are 1 (the default), +2 (four gray levels), 4 (16 gray levels), and 8 (256 gray levels). The +driver returns either a bitmap with 1 bit per pixel or a pixmap with 8bits +per pixel (using 4, 16, and 256 gray levels, respectively). + + +Known problems +************** + +- A font is entirely loaded into memory. Obviously, this is not the Right + Thing(TM). If you have big fonts I suggest you convert them into PCF + format (using the bdftopcf utility): the PCF font drive of FreeType can + perform incremental glyph loading. + +When I have some time, I will implement on-demand glyph parsing. + +- Except for encodings properties, client applications have no visibility of + the PCF_Face object. This means that applications cannot directly access + font tables and must trust FreeType. + +- Currently, glyph names are ignored. + + I plan to give full visibility of the BDF_Face object in an upcoming + revision of the driver, thus implementing also glyph names. + +- As I have never seen a BDF font that defines vertical metrics, vertical + metrics are (parsed and) discarded. If you own a BDF font that defines + vertical metrics, please let me know (I will implement them in 5-10 + minutes). + + +License +******* + +Copyright (C) 2001-2002 by Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*** Portions of the driver (that is, bdflib.c and bdf.h): + +Copyright 2000 Computing Research Labs, New Mexico State University +Copyright 2001-2002 Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Credits +******* + +This driver is based on excellent Mark Leisher's bdf library. If you +find something good in this driver you should probably thank him, not +me. diff --git a/alienblaster/project/jni/freetype/src/bdf/bdf.h b/alienblaster/project/jni/freetype/src/bdf/bdf.h new file mode 100644 index 000000000..561b4158a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/bdf.h @@ -0,0 +1,295 @@ +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001, 2002, 2003, 2004 Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifndef __BDF_H__ +#define __BDF_H__ + + +/* + * Based on bdf.h,v 1.16 2000/03/16 20:08:51 mleisher + */ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + +/* Imported from bdfP.h */ + +#define _bdf_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] & ( 1 << ( (e) & 31 ) ) ) +#define _bdf_set_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] |= ( 1 << ( (e) & 31 ) ) ) +#define _bdf_clear_glyph_modified( map, e ) \ + ( (map)[(e) >> 5] &= ~( 1 << ( (e) & 31 ) ) ) + +/* end of bdfP.h */ + + + /*************************************************************************/ + /* */ + /* BDF font options macros and types. */ + /* */ + /*************************************************************************/ + + +#define BDF_CORRECT_METRICS 0x01 /* Correct invalid metrics when loading. */ +#define BDF_KEEP_COMMENTS 0x02 /* Preserve the font comments. */ +#define BDF_KEEP_UNENCODED 0x04 /* Keep the unencoded glyphs. */ +#define BDF_PROPORTIONAL 0x08 /* Font has proportional spacing. */ +#define BDF_MONOWIDTH 0x10 /* Font has mono width. */ +#define BDF_CHARCELL 0x20 /* Font has charcell spacing. */ + +#define BDF_ALL_SPACING ( BDF_PROPORTIONAL | \ + BDF_MONOWIDTH | \ + BDF_CHARCELL ) + +#define BDF_DEFAULT_LOAD_OPTIONS ( BDF_CORRECT_METRICS | \ + BDF_KEEP_COMMENTS | \ + BDF_KEEP_UNENCODED | \ + BDF_PROPORTIONAL ) + + + typedef struct bdf_options_t_ + { + int correct_metrics; + int keep_unencoded; + int keep_comments; + int font_spacing; + + } bdf_options_t; + + + /* Callback function type for unknown configuration options. */ + typedef int + (*bdf_options_callback_t)( bdf_options_t* opts, + char** params, + unsigned long nparams, + void* client_data ); + + + /*************************************************************************/ + /* */ + /* BDF font property macros and types. */ + /* */ + /*************************************************************************/ + + +#define BDF_ATOM 1 +#define BDF_INTEGER 2 +#define BDF_CARDINAL 3 + + + /* This structure represents a particular property of a font. */ + /* There are a set of defaults and each font has their own. */ + typedef struct bdf_property_t_ + { + char* name; /* Name of the property. */ + int format; /* Format of the property. */ + int builtin; /* A builtin property. */ + union + { + char* atom; + long l; + unsigned long ul; + + } value; /* Value of the property. */ + + } bdf_property_t; + + + /*************************************************************************/ + /* */ + /* BDF font metric and glyph types. */ + /* */ + /*************************************************************************/ + + + typedef struct bdf_bbx_t_ + { + unsigned short width; + unsigned short height; + + short x_offset; + short y_offset; + + short ascent; + short descent; + + } bdf_bbx_t; + + + typedef struct bdf_glyph_t_ + { + char* name; /* Glyph name. */ + long encoding; /* Glyph encoding. */ + unsigned short swidth; /* Scalable width. */ + unsigned short dwidth; /* Device width. */ + bdf_bbx_t bbx; /* Glyph bounding box. */ + unsigned char* bitmap; /* Glyph bitmap. */ + unsigned long bpr; /* Number of bytes used per row. */ + unsigned short bytes; /* Number of bytes used for the bitmap. */ + + } bdf_glyph_t; + + + typedef struct _hashnode_ + { + const char* key; + size_t data; + + } _hashnode, *hashnode; + + + typedef struct hashtable_ + { + int limit; + int size; + int used; + hashnode* table; + + } hashtable; + + + typedef struct bdf_glyphlist_t_ + { + unsigned short pad; /* Pad to 4-byte boundary. */ + unsigned short bpp; /* Bits per pixel. */ + long start; /* Beginning encoding value of glyphs. */ + long end; /* Ending encoding value of glyphs. */ + bdf_glyph_t* glyphs; /* Glyphs themselves. */ + unsigned long glyphs_size; /* Glyph structures allocated. */ + unsigned long glyphs_used; /* Glyph structures used. */ + bdf_bbx_t bbx; /* Overall bounding box of glyphs. */ + + } bdf_glyphlist_t; + + + typedef struct bdf_font_t_ + { + char* name; /* Name of the font. */ + bdf_bbx_t bbx; /* Font bounding box. */ + + long point_size; /* Point size of the font. */ + unsigned long resolution_x; /* Font horizontal resolution. */ + unsigned long resolution_y; /* Font vertical resolution. */ + + int spacing; /* Font spacing value. */ + + unsigned short monowidth; /* Logical width for monowidth font. */ + + long default_char; /* Encoding of the default glyph. */ + + long font_ascent; /* Font ascent. */ + long font_descent; /* Font descent. */ + + unsigned long glyphs_size; /* Glyph structures allocated. */ + unsigned long glyphs_used; /* Glyph structures used. */ + bdf_glyph_t* glyphs; /* Glyphs themselves. */ + + unsigned long unencoded_size; /* Unencoded glyph struct. allocated. */ + unsigned long unencoded_used; /* Unencoded glyph struct. used. */ + bdf_glyph_t* unencoded; /* Unencoded glyphs themselves. */ + + unsigned long props_size; /* Font properties allocated. */ + unsigned long props_used; /* Font properties used. */ + bdf_property_t* props; /* Font properties themselves. */ + + char* comments; /* Font comments. */ + unsigned long comments_len; /* Length of comment string. */ + + bdf_glyphlist_t overflow; /* Storage used for glyph insertion. */ + + void* internal; /* Internal data for the font. */ + + unsigned long nmod[2048]; /* Bitmap indicating modified glyphs. */ + unsigned long umod[2048]; /* Bitmap indicating modified */ + /* unencoded glyphs. */ + unsigned short modified; /* Boolean indicating font modified. */ + unsigned short bpp; /* Bits per pixel. */ + + FT_Memory memory; + + bdf_property_t* user_props; + unsigned long nuser_props; + hashtable proptbl; + + } bdf_font_t; + + + /*************************************************************************/ + /* */ + /* Types for load/save callbacks. */ + /* */ + /*************************************************************************/ + + + /* Error codes. */ +#define BDF_MISSING_START -1 +#define BDF_MISSING_FONTNAME -2 +#define BDF_MISSING_SIZE -3 +#define BDF_MISSING_CHARS -4 +#define BDF_MISSING_STARTCHAR -5 +#define BDF_MISSING_ENCODING -6 +#define BDF_MISSING_BBX -7 + +#define BDF_OUT_OF_MEMORY -20 + +#define BDF_INVALID_LINE -100 + + + /*************************************************************************/ + /* */ + /* BDF font API. */ + /* */ + /*************************************************************************/ + + FT_LOCAL( FT_Error ) + bdf_load_font( FT_Stream stream, + FT_Memory memory, + bdf_options_t* opts, + bdf_font_t* *font ); + + FT_LOCAL( void ) + bdf_free_font( bdf_font_t* font ); + + FT_LOCAL( bdf_property_t * ) + bdf_get_property( char* name, + bdf_font_t* font ); + + FT_LOCAL( bdf_property_t * ) + bdf_get_font_property( bdf_font_t* font, + const char* name ); + + +FT_END_HEADER + + +#endif /* __BDF_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/bdf/bdfdrivr.c b/alienblaster/project/jni/freetype/src/bdf/bdfdrivr.c new file mode 100644 index 000000000..631ec460e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/bdfdrivr.c @@ -0,0 +1,879 @@ +/* bdfdrivr.c + + FreeType font driver for bdf files + + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include <ft2build.h> + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H +#include FT_BDF_H + +#include FT_SERVICE_BDF_H +#include FT_SERVICE_XFREE86_NAME_H + +#include "bdf.h" +#include "bdfdrivr.h" + +#include "bdferror.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_bdfdriver + + + typedef struct BDF_CMapRec_ + { + FT_CMapRec cmap; + FT_ULong num_encodings; /* ftobjs.h: FT_CMap->clazz->size */ + BDF_encoding_el* encodings; + + } BDF_CMapRec, *BDF_CMap; + + + FT_CALLBACK_DEF( FT_Error ) + bdf_cmap_init( FT_CMap bdfcmap, + FT_Pointer init_data ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_Face face = (BDF_Face)FT_CMAP_FACE( cmap ); + FT_UNUSED( init_data ); + + + cmap->num_encodings = face->bdffont->glyphs_used; + cmap->encodings = face->en_table; + + return BDF_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + bdf_cmap_done( FT_CMap bdfcmap ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + + + cmap->encodings = NULL; + cmap->num_encodings = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + bdf_cmap_char_index( FT_CMap bdfcmap, + FT_UInt32 charcode ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_encoding_el* encodings = cmap->encodings; + FT_ULong min, max, mid; /* num_encodings */ + FT_UShort result = 0; /* encodings->glyph */ + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_ULong code; + + + mid = ( min + max ) >> 1; + code = encodings[mid].enc; + + if ( charcode == code ) + { + /* increase glyph index by 1 -- */ + /* we reserve slot 0 for the undefined glyph */ + result = encodings[mid].glyph + 1; + break; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + bdf_cmap_char_next( FT_CMap bdfcmap, + FT_UInt32 *acharcode ) + { + BDF_CMap cmap = (BDF_CMap)bdfcmap; + BDF_encoding_el* encodings = cmap->encodings; + FT_ULong min, max, mid; /* num_encodings */ + FT_UShort result = 0; /* encodings->glyph */ + FT_ULong charcode = *acharcode + 1; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_ULong code; /* same as BDF_encoding_el.enc */ + + + mid = ( min + max ) >> 1; + code = encodings[mid].enc; + + if ( charcode == code ) + { + /* increase glyph index by 1 -- */ + /* we reserve slot 0 for the undefined glyph */ + result = encodings[mid].glyph + 1; + goto Exit; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + } + + charcode = 0; + if ( min < cmap->num_encodings ) + { + charcode = encodings[min].enc; + result = encodings[min].glyph + 1; + } + + Exit: + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "bdf_cmap_char_next: charcode 0x%x > 32bit API" )); + *acharcode = 0; + /* XXX: result should be changed to indicate an overflow error */ + } + else + *acharcode = (FT_UInt32)charcode; + return result; + } + + + FT_CALLBACK_TABLE_DEF + const FT_CMap_ClassRec bdf_cmap_class = + { + sizeof ( BDF_CMapRec ), + bdf_cmap_init, + bdf_cmap_done, + bdf_cmap_char_index, + bdf_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + static FT_Error + bdf_interpret_style( BDF_Face bdf ) + { + FT_Error error = BDF_Err_Ok; + FT_Face face = FT_FACE( bdf ); + FT_Memory memory = face->memory; + bdf_font_t* font = bdf->bdffont; + bdf_property_t* prop; + + char* strings[4] = { NULL, NULL, NULL, NULL }; + size_t nn, len, lengths[4]; + + + face->style_flags = 0; + + prop = bdf_get_font_property( font, (char *)"SLANT" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || + *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) + { + face->style_flags |= FT_STYLE_FLAG_ITALIC; + strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ) + ? (char *)"Oblique" + : (char *)"Italic"; + } + + prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) + { + face->style_flags |= FT_STYLE_FLAG_BOLD; + strings[1] = (char *)"Bold"; + } + + prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[3] = (char *)(prop->value.atom); + + prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[0] = (char *)(prop->value.atom); + + len = 0; + + for ( len = 0, nn = 0; nn < 4; nn++ ) + { + lengths[nn] = 0; + if ( strings[nn] ) + { + lengths[nn] = ft_strlen( strings[nn] ); + len += lengths[nn] + 1; + } + } + + if ( len == 0 ) + { + strings[0] = (char *)"Regular"; + lengths[0] = ft_strlen( strings[0] ); + len = lengths[0] + 1; + } + + { + char* s; + + + if ( FT_ALLOC( face->style_name, len ) ) + return error; + + s = face->style_name; + + for ( nn = 0; nn < 4; nn++ ) + { + char* src = strings[nn]; + + + len = lengths[nn]; + + if ( src == NULL ) + continue; + + /* separate elements with a space */ + if ( s != face->style_name ) + *s++ = ' '; + + ft_memcpy( s, src, len ); + + /* need to convert spaces to dashes for */ + /* add_style_name and setwidth_name */ + if ( nn == 0 || nn == 3 ) + { + size_t mm; + + + for ( mm = 0; mm < len; mm++ ) + if ( s[mm] == ' ' ) + s[mm] = '-'; + } + + s += len; + } + *s = 0; + } + + return error; + } + + + FT_CALLBACK_DEF( void ) + BDF_Face_Done( FT_Face bdfface ) /* BDF_Face */ + { + BDF_Face face = (BDF_Face)bdfface; + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + bdf_free_font( face->bdffont ); + + FT_FREE( face->en_table ); + + FT_FREE( face->charset_encoding ); + FT_FREE( face->charset_registry ); + FT_FREE( bdfface->family_name ); + FT_FREE( bdfface->style_name ); + + FT_FREE( bdfface->available_sizes ); + + FT_FREE( face->bdffont ); + + FT_TRACE4(( "BDF_Face_Done: done face\n" )); + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Face_Init( FT_Stream stream, + FT_Face bdfface, /* BDF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error = BDF_Err_Ok; + BDF_Face face = (BDF_Face)bdfface; + FT_Memory memory = FT_FACE_MEMORY( face ); + + bdf_font_t* font = NULL; + bdf_options_t options; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( face_index ); + + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + options.correct_metrics = 1; /* FZ XXX: options semantics */ + options.keep_unencoded = 1; + options.keep_comments = 0; + options.font_spacing = BDF_PROPORTIONAL; + + error = bdf_load_font( stream, memory, &options, &font ); + if ( error == BDF_Err_Missing_Startfont_Field ) + { + FT_TRACE2(( "[not a valid BDF file]\n" )); + goto Fail; + } + else if ( error ) + goto Exit; + + /* we have a bdf font: let's construct the face object */ + face->bdffont = font; + { + bdf_property_t* prop = NULL; + + + FT_TRACE4(( "number of glyphs: %d (%d)\n", + font->glyphs_size, + font->glyphs_used )); + FT_TRACE4(( "number of unencoded glyphs: %d (%d)\n", + font->unencoded_size, + font->unencoded_used )); + + bdfface->num_faces = 1; + bdfface->face_index = 0; + bdfface->face_flags = FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_FAST_GLYPHS; + + prop = bdf_get_font_property( font, "SPACING" ); + if ( prop && prop->format == BDF_ATOM && + prop->value.atom && + ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' || + *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) ) + bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */ + /* FZ XXX: I need a font to implement this */ + + prop = bdf_get_font_property( font, "FAMILY_NAME" ); + if ( prop && prop->value.atom ) + { + if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) ) + goto Exit; + } + else + bdfface->family_name = 0; + + if ( ( error = bdf_interpret_style( face ) ) != 0 ) + goto Exit; + + /* the number of glyphs (with one slot for the undefined glyph */ + /* at position 0 and all unencoded glyphs) */ + bdfface->num_glyphs = font->glyphs_size + 1; + + bdfface->num_fixed_sizes = 1; + if ( FT_NEW_ARRAY( bdfface->available_sizes, 1 ) ) + goto Exit; + + { + FT_Bitmap_Size* bsize = bdfface->available_sizes; + FT_Short resolution_x = 0, resolution_y = 0; + + + FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); + + bsize->height = (FT_Short)( font->font_ascent + font->font_descent ); + + prop = bdf_get_font_property( font, "AVERAGE_WIDTH" ); + if ( prop ) + bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 ); + else + bsize->width = (FT_Short)( bsize->height * 2/3 ); + + prop = bdf_get_font_property( font, "POINT_SIZE" ); + if ( prop ) + /* convert from 722.7 decipoints to 72 points per inch */ + bsize->size = + (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L ); + else + bsize->size = bsize->width << 6; + + prop = bdf_get_font_property( font, "PIXEL_SIZE" ); + if ( prop ) + bsize->y_ppem = (FT_Short)prop->value.l << 6; + + prop = bdf_get_font_property( font, "RESOLUTION_X" ); + if ( prop ) + resolution_x = (FT_Short)prop->value.l; + + prop = bdf_get_font_property( font, "RESOLUTION_Y" ); + if ( prop ) + resolution_y = (FT_Short)prop->value.l; + + if ( bsize->y_ppem == 0 ) + { + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = bsize->y_ppem * resolution_y / 72; + } + if ( resolution_x && resolution_y ) + bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; + else + bsize->x_ppem = bsize->y_ppem; + } + + /* encoding table */ + { + bdf_glyph_t* cur = font->glyphs; + unsigned long n; + + + if ( FT_NEW_ARRAY( face->en_table, font->glyphs_size ) ) + goto Exit; + + face->default_glyph = 0; + for ( n = 0; n < font->glyphs_size; n++ ) + { + (face->en_table[n]).enc = cur[n].encoding; + FT_TRACE4(( "idx %d, val 0x%lX\n", n, cur[n].encoding )); + (face->en_table[n]).glyph = (FT_Short)n; + + if ( cur[n].encoding == font->default_char ) + { + if ( n < FT_UINT_MAX ) + face->default_glyph = (FT_UInt)n; + else + FT_TRACE1(( "idx %d is too large for this system\n", n )); + } + } + } + + /* charmaps */ + { + bdf_property_t *charset_registry = 0, *charset_encoding = 0; + FT_Bool unicode_charmap = 0; + + + charset_registry = + bdf_get_font_property( font, "CHARSET_REGISTRY" ); + charset_encoding = + bdf_get_font_property( font, "CHARSET_ENCODING" ); + if ( charset_registry && charset_encoding ) + { + if ( charset_registry->format == BDF_ATOM && + charset_encoding->format == BDF_ATOM && + charset_registry->value.atom && + charset_encoding->value.atom ) + { + const char* s; + + + if ( FT_STRDUP( face->charset_encoding, + charset_encoding->value.atom ) || + FT_STRDUP( face->charset_registry, + charset_registry->value.atom ) ) + goto Exit; + + /* Uh, oh, compare first letters manually to avoid dependency */ + /* on locales. */ + s = face->charset_registry; + if ( ( s[0] == 'i' || s[0] == 'I' ) && + ( s[1] == 's' || s[1] == 'S' ) && + ( s[2] == 'o' || s[2] == 'O' ) ) + { + s += 3; + if ( !ft_strcmp( s, "10646" ) || + ( !ft_strcmp( s, "8859" ) && + !ft_strcmp( face->charset_encoding, "1" ) ) ) + unicode_charmap = 1; + } + + { + FT_CharMapRec charmap; + + + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; + charmap.platform_id = 0; + charmap.encoding_id = 0; + + if ( unicode_charmap ) + { + charmap.encoding = FT_ENCODING_UNICODE; + charmap.platform_id = 3; + charmap.encoding_id = 1; + } + + error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if ( bdfface->num_charmaps ) + bdfface->charmap = bdfface->charmaps[0]; +#endif + } + + goto Exit; + } + } + + /* otherwise assume Adobe standard encoding */ + + { + FT_CharMapRec charmap; + + + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.platform_id = 7; + charmap.encoding_id = 0; + + error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); + + /* Select default charmap */ + if ( bdfface->num_charmaps ) + bdfface->charmap = bdfface->charmaps[0]; + } + } + } + + Exit: + return error; + + Fail: + BDF_Face_Done( bdfface ); + return BDF_Err_Unknown_File_Format; + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Size_Select( FT_Size size, + FT_ULong strike_index ) + { + bdf_font_t* bdffont = ( (BDF_Face)size->face )->bdffont; + + + FT_Select_Metrics( size->face, strike_index ); + + size->metrics.ascender = bdffont->font_ascent << 6; + size->metrics.descender = -bdffont->font_descent << 6; + size->metrics.max_advance = bdffont->bbx.width << 6; + + return BDF_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Size_Request( FT_Size size, + FT_Size_Request req ) + { + FT_Face face = size->face; + FT_Bitmap_Size* bsize = face->available_sizes; + bdf_font_t* bdffont = ( (BDF_Face)face )->bdffont; + FT_Error error = BDF_Err_Invalid_Pixel_Size; + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = BDF_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == ( bdffont->font_ascent + + bdffont->font_descent ) ) + error = BDF_Err_Ok; + break; + + default: + error = BDF_Err_Unimplemented_Feature; + break; + } + + if ( error ) + return error; + else + return BDF_Size_Select( size, 0 ); + } + + + + FT_CALLBACK_DEF( FT_Error ) + BDF_Glyph_Load( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + BDF_Face bdf = (BDF_Face)FT_SIZE_FACE( size ); + FT_Face face = FT_FACE( bdf ); + FT_Error error = BDF_Err_Ok; + FT_Bitmap* bitmap = &slot->bitmap; + bdf_glyph_t glyph; + int bpp = bdf->bdffont->bpp; + + FT_UNUSED( load_flags ); + + + if ( !face || glyph_index >= (FT_UInt)face->num_glyphs ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + /* index 0 is the undefined glyph */ + if ( glyph_index == 0 ) + glyph_index = bdf->default_glyph; + else + glyph_index--; + + /* slot, bitmap => freetype, glyph => bdflib */ + glyph = bdf->bdffont->glyphs[glyph_index]; + + bitmap->rows = glyph.bbx.height; + bitmap->width = glyph.bbx.width; + if ( glyph.bpr > INT_MAX ) + FT_TRACE1(( "BDF_Glyph_Load: too large pitch %d is truncated\n", + glyph.bpr )); + bitmap->pitch = (int)glyph.bpr; /* same as FT_Bitmap.pitch */ + + /* note: we don't allocate a new array to hold the bitmap; */ + /* we can simply point to it */ + ft_glyphslot_set_bitmap( slot, glyph.bitmap ); + + switch ( bpp ) + { + case 1: + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + break; + case 2: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY2; + break; + case 4: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY4; + break; + case 8: + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + break; + } + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = glyph.bbx.x_offset; + slot->bitmap_top = glyph.bbx.ascent; + + slot->metrics.horiAdvance = glyph.dwidth << 6; + slot->metrics.horiBearingX = glyph.bbx.x_offset << 6; + slot->metrics.horiBearingY = glyph.bbx.ascent << 6; + slot->metrics.width = bitmap->width << 6; + slot->metrics.height = bitmap->rows << 6; + + /* + * XXX DWIDTH1 and VVECTOR should be parsed and + * used here, provided such fonts do exist. + */ + ft_synthesize_vertical_metrics( &slot->metrics, + bdf->bdffont->bbx.height << 6 ); + + Exit: + return error; + } + + + /* + * + * BDF SERVICE + * + */ + + static FT_Error + bdf_get_bdf_property( BDF_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + bdf_property_t* prop; + + + FT_ASSERT( face && face->bdffont ); + + prop = bdf_get_font_property( face->bdffont, prop_name ); + if ( prop ) + { + switch ( prop->format ) + { + case BDF_ATOM: + aproperty->type = BDF_PROPERTY_TYPE_ATOM; + aproperty->u.atom = prop->value.atom; + break; + + case BDF_INTEGER: + if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) + { + FT_TRACE1(( "bdf_get_bdf_property: " )); + FT_TRACE1(( "too large integer 0x%x is truncated\n" )); + } + aproperty->type = BDF_PROPERTY_TYPE_INTEGER; + aproperty->u.integer = (FT_Int32)prop->value.l; + break; + + case BDF_CARDINAL: + if ( prop->value.ul > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "bdf_get_bdf_property: " )); + FT_TRACE1(( "too large cardinal 0x%x is truncated\n" )); + } + aproperty->type = BDF_PROPERTY_TYPE_CARDINAL; + aproperty->u.cardinal = (FT_UInt32)prop->value.ul; + break; + + default: + goto Fail; + } + return 0; + } + + Fail: + return BDF_Err_Invalid_Argument; + } + + + static FT_Error + bdf_get_charset_id( BDF_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + *acharset_encoding = face->charset_encoding; + *acharset_registry = face->charset_registry; + + return 0; + } + + + static const FT_Service_BDFRec bdf_service_bdf = + { + (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id, + (FT_BDF_GetPropertyFunc) bdf_get_bdf_property + }; + + + /* + * + * SERVICES LIST + * + */ + + static const FT_ServiceDescRec bdf_services[] = + { + { FT_SERVICE_ID_BDF, &bdf_service_bdf }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_BDF }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + bdf_driver_requester( FT_Module module, + const char* name ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( bdf_services, name ); + } + + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec bdf_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + sizeof ( FT_DriverRec ), + + "bdf", + 0x10000L, + 0x20000L, + + 0, + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) bdf_driver_requester + }, + + sizeof ( BDF_FaceRec ), + sizeof ( FT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + BDF_Face_Init, + BDF_Face_Done, + 0, /* FT_Size_InitFunc */ + 0, /* FT_Size_DoneFunc */ + 0, /* FT_Slot_InitFunc */ + 0, /* FT_Slot_DoneFunc */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + BDF_Glyph_Load, + + 0, /* FT_Face_GetKerningFunc */ + 0, /* FT_Face_AttachFunc */ + 0, /* FT_Face_GetAdvancesFunc */ + + BDF_Size_Request, + BDF_Size_Select + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/bdf/bdfdrivr.h b/alienblaster/project/jni/freetype/src/bdf/bdfdrivr.h new file mode 100644 index 000000000..db7093bb4 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/bdfdrivr.h @@ -0,0 +1,80 @@ +/* bdfdrivr.h + + FreeType font driver for bdf fonts + + Copyright (C) 2001, 2002, 2003, 2004 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __BDFDRIVR_H__ +#define __BDFDRIVR_H__ + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + +#include "bdf.h" + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + typedef struct BDF_encoding_el_ + { + FT_ULong enc; + FT_UShort glyph; + + } BDF_encoding_el; + + + typedef struct BDF_FaceRec_ + { + FT_FaceRec root; + + char* charset_encoding; + char* charset_registry; + + bdf_font_t* bdffont; + + BDF_encoding_el* en_table; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + FT_UInt default_glyph; + + } BDF_FaceRec, *BDF_Face; + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) bdf_driver_class; + + +FT_END_HEADER + + +#endif /* __BDFDRIVR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/bdf/bdferror.h b/alienblaster/project/jni/freetype/src/bdf/bdferror.h new file mode 100644 index 000000000..b27fa333b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/bdferror.h @@ -0,0 +1,44 @@ +/* + * Copyright 2001, 2002 Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /*************************************************************************/ + /* */ + /* This file is used to define the BDF error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __BDFERROR_H__ +#define __BDFERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX BDF_Err_ +#define FT_ERR_BASE FT_Mod_Err_BDF + +#include FT_ERRORS_H + +#endif /* __BDFERROR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/bdf/bdflib.c b/alienblaster/project/jni/freetype/src/bdf/bdflib.c new file mode 100644 index 000000000..5fa5868c7 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/bdflib.c @@ -0,0 +1,2481 @@ +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 + * Francesco Zappa Nardelli + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT + * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + /*************************************************************************/ + /* */ + /* This file is based on bdf.c,v 1.22 2000/03/16 20:08:50 */ + /* */ + /* taken from Mark Leisher's xmbdfed package */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> + +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H + +#include "bdf.h" +#include "bdferror.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_bdflib + + + /*************************************************************************/ + /* */ + /* Default BDF font options. */ + /* */ + /*************************************************************************/ + + + static const bdf_options_t _bdf_opts = + { + 1, /* Correct metrics. */ + 1, /* Preserve unencoded glyphs. */ + 0, /* Preserve comments. */ + BDF_PROPORTIONAL /* Default spacing. */ + }; + + + /*************************************************************************/ + /* */ + /* Builtin BDF font properties. */ + /* */ + /*************************************************************************/ + + /* List of most properties that might appear in a font. Doesn't include */ + /* the RAW_* and AXIS_* properties in X11R6 polymorphic fonts. */ + + static const bdf_property_t _bdf_properties[] = + { + { (char *)"ADD_STYLE_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { (char *)"CHARSET_COLLECTIONS", BDF_ATOM, 1, { 0 } }, + { (char *)"CHARSET_ENCODING", BDF_ATOM, 1, { 0 } }, + { (char *)"CHARSET_REGISTRY", BDF_ATOM, 1, { 0 } }, + { (char *)"COMMENT", BDF_ATOM, 1, { 0 } }, + { (char *)"COPYRIGHT", BDF_ATOM, 1, { 0 } }, + { (char *)"DEFAULT_CHAR", BDF_CARDINAL, 1, { 0 } }, + { (char *)"DESTINATION", BDF_CARDINAL, 1, { 0 } }, + { (char *)"DEVICE_FONT_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"END_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"FACE_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"FAMILY_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"FONT", BDF_ATOM, 1, { 0 } }, + { (char *)"FONTNAME_REGISTRY", BDF_ATOM, 1, { 0 } }, + { (char *)"FONT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"FONT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"FOUNDRY", BDF_ATOM, 1, { 0 } }, + { (char *)"FULL_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"ITALIC_ANGLE", BDF_INTEGER, 1, { 0 } }, + { (char *)"MAX_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"MIN_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"NORM_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"NOTICE", BDF_ATOM, 1, { 0 } }, + { (char *)"PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"POINT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_ASCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_CAP_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_DESCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_END_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_MAX_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_MIN_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_NORM_SPACE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_PIXEL_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_POINT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_PIXELSIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_POINTSIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_QUAD_WIDTH", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, + { (char *)"RAW_X_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { (char *)"RELATIVE_SETWIDTH", BDF_CARDINAL, 1, { 0 } }, + { (char *)"RELATIVE_WEIGHT", BDF_CARDINAL, 1, { 0 } }, + { (char *)"RESOLUTION", BDF_INTEGER, 1, { 0 } }, + { (char *)"RESOLUTION_X", BDF_CARDINAL, 1, { 0 } }, + { (char *)"RESOLUTION_Y", BDF_CARDINAL, 1, { 0 } }, + { (char *)"SETWIDTH_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"SLANT", BDF_ATOM, 1, { 0 } }, + { (char *)"SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"SPACING", BDF_ATOM, 1, { 0 } }, + { (char *)"STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } }, + { (char *)"SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } }, + { (char *)"UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } }, + { (char *)"UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } }, + { (char *)"WEIGHT", BDF_CARDINAL, 1, { 0 } }, + { (char *)"WEIGHT_NAME", BDF_ATOM, 1, { 0 } }, + { (char *)"X_HEIGHT", BDF_INTEGER, 1, { 0 } }, + { (char *)"_MULE_BASELINE_OFFSET", BDF_INTEGER, 1, { 0 } }, + { (char *)"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } }, + }; + + static const unsigned long + _num_bdf_properties = sizeof ( _bdf_properties ) / + sizeof ( _bdf_properties[0] ); + + + /*************************************************************************/ + /* */ + /* Hash table utilities for the properties. */ + /* */ + /*************************************************************************/ + + /* XXX: Replace this with FreeType's hash functions */ + + +#define INITIAL_HT_SIZE 241 + + typedef void + (*hash_free_func)( hashnode node ); + + static hashnode* + hash_bucket( const char* key, + hashtable* ht ) + { + const char* kp = key; + unsigned long res = 0; + hashnode* bp = ht->table, *ndp; + + + /* Mocklisp hash function. */ + while ( *kp ) + res = ( res << 5 ) - res + *kp++; + + ndp = bp + ( res % ht->size ); + while ( *ndp ) + { + kp = (*ndp)->key; + if ( kp[0] == key[0] && ft_strcmp( kp, key ) == 0 ) + break; + ndp--; + if ( ndp < bp ) + ndp = bp + ( ht->size - 1 ); + } + + return ndp; + } + + + static FT_Error + hash_rehash( hashtable* ht, + FT_Memory memory ) + { + hashnode* obp = ht->table, *bp, *nbp; + int i, sz = ht->size; + FT_Error error = BDF_Err_Ok; + + + ht->size <<= 1; + ht->limit = ht->size / 3; + + if ( FT_NEW_ARRAY( ht->table, ht->size ) ) + goto Exit; + + for ( i = 0, bp = obp; i < sz; i++, bp++ ) + { + if ( *bp ) + { + nbp = hash_bucket( (*bp)->key, ht ); + *nbp = *bp; + } + } + FT_FREE( obp ); + + Exit: + return error; + } + + + static FT_Error + hash_init( hashtable* ht, + FT_Memory memory ) + { + int sz = INITIAL_HT_SIZE; + FT_Error error = BDF_Err_Ok; + + + ht->size = sz; + ht->limit = sz / 3; + ht->used = 0; + + if ( FT_NEW_ARRAY( ht->table, sz ) ) + goto Exit; + + Exit: + return error; + } + + + static void + hash_free( hashtable* ht, + FT_Memory memory ) + { + if ( ht != 0 ) + { + int i, sz = ht->size; + hashnode* bp = ht->table; + + + for ( i = 0; i < sz; i++, bp++ ) + FT_FREE( *bp ); + + FT_FREE( ht->table ); + } + } + + + static FT_Error + hash_insert( char* key, + size_t data, + hashtable* ht, + FT_Memory memory ) + { + hashnode nn, *bp = hash_bucket( key, ht ); + FT_Error error = BDF_Err_Ok; + + + nn = *bp; + if ( !nn ) + { + if ( FT_NEW( nn ) ) + goto Exit; + *bp = nn; + + nn->key = key; + nn->data = data; + + if ( ht->used >= ht->limit ) + { + error = hash_rehash( ht, memory ); + if ( error ) + goto Exit; + } + ht->used++; + } + else + nn->data = data; + + Exit: + return error; + } + + + static hashnode + hash_lookup( const char* key, + hashtable* ht ) + { + hashnode *np = hash_bucket( key, ht ); + + + return *np; + } + + + /*************************************************************************/ + /* */ + /* Utility types and functions. */ + /* */ + /*************************************************************************/ + + + /* Function type for parsing lines of a BDF font. */ + + typedef FT_Error + (*_bdf_line_func_t)( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ); + + + /* List structure for splitting lines into fields. */ + + typedef struct _bdf_list_t_ + { + char** field; + unsigned long size; + unsigned long used; + FT_Memory memory; + + } _bdf_list_t; + + + /* Structure used while loading BDF fonts. */ + + typedef struct _bdf_parse_t_ + { + unsigned long flags; + unsigned long cnt; + unsigned long row; + + short minlb; + short maxlb; + short maxrb; + short maxas; + short maxds; + + short rbearing; + + char* glyph_name; + long glyph_enc; + + bdf_font_t* font; + bdf_options_t* opts; + + unsigned long have[2048]; + _bdf_list_t list; + + FT_Memory memory; + + } _bdf_parse_t; + + +#define setsbit( m, cc ) \ + ( m[(FT_Byte)(cc) >> 3] |= (FT_Byte)( 1 << ( (cc) & 7 ) ) ) +#define sbitset( m, cc ) \ + ( m[(FT_Byte)(cc) >> 3] & ( 1 << ( (cc) & 7 ) ) ) + + + static void + _bdf_list_init( _bdf_list_t* list, + FT_Memory memory ) + { + FT_ZERO( list ); + list->memory = memory; + } + + + static void + _bdf_list_done( _bdf_list_t* list ) + { + FT_Memory memory = list->memory; + + + if ( memory ) + { + FT_FREE( list->field ); + FT_ZERO( list ); + } + } + + + static FT_Error + _bdf_list_ensure( _bdf_list_t* list, + unsigned long num_items ) /* same as _bdf_list_t.used */ + { + FT_Error error = BDF_Err_Ok; + + + if ( num_items > list->size ) + { + unsigned long oldsize = list->size; /* same as _bdf_list_t.size */ + unsigned long newsize = oldsize + ( oldsize >> 1 ) + 4; + unsigned long bigsize = (unsigned long)( FT_INT_MAX / sizeof ( char* ) ); + FT_Memory memory = list->memory; + + + if ( oldsize == bigsize ) + { + error = BDF_Err_Out_Of_Memory; + goto Exit; + } + else if ( newsize < oldsize || newsize > bigsize ) + newsize = bigsize; + + if ( FT_RENEW_ARRAY( list->field, oldsize, newsize ) ) + goto Exit; + + list->size = newsize; + } + + Exit: + return error; + } + + + static void + _bdf_list_shift( _bdf_list_t* list, + unsigned long n ) + { + unsigned long i, u; + + + if ( list == 0 || list->used == 0 || n == 0 ) + return; + + if ( n >= list->used ) + { + list->used = 0; + return; + } + + for ( u = n, i = 0; u < list->used; i++, u++ ) + list->field[i] = list->field[u]; + list->used -= n; + } + + + static char * + _bdf_list_join( _bdf_list_t* list, + int c, + unsigned long *alen ) + { + unsigned long i, j; + char *fp, *dp; + + + *alen = 0; + + if ( list == 0 || list->used == 0 ) + return 0; + + dp = list->field[0]; + for ( i = j = 0; i < list->used; i++ ) + { + fp = list->field[i]; + while ( *fp ) + dp[j++] = *fp++; + + if ( i + 1 < list->used ) + dp[j++] = (char)c; + } + dp[j] = 0; + + *alen = j; + return dp; + } + + + /* An empty string for empty fields. */ + + static const char empty[1] = { 0 }; /* XXX eliminate this */ + + + static FT_Error + _bdf_list_split( _bdf_list_t* list, + char* separators, + char* line, + unsigned long linelen ) + { + int mult, final_empty; + char *sp, *ep, *end; + char seps[32]; + FT_Error error = BDF_Err_Ok; + + + /* Initialize the list. */ + list->used = 0; + + /* If the line is empty, then simply return. */ + if ( linelen == 0 || line[0] == 0 ) + goto Exit; + + /* In the original code, if the `separators' parameter is NULL or */ + /* empty, the list is split into individual bytes. We don't need */ + /* this, so an error is signaled. */ + if ( separators == 0 || *separators == 0 ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + /* Prepare the separator bitmap. */ + FT_MEM_ZERO( seps, 32 ); + + /* If the very last character of the separator string is a plus, then */ + /* set the `mult' flag to indicate that multiple separators should be */ + /* collapsed into one. */ + for ( mult = 0, sp = separators; sp && *sp; sp++ ) + { + if ( *sp == '+' && *( sp + 1 ) == 0 ) + mult = 1; + else + setsbit( seps, *sp ); + } + + /* Break the line up into fields. */ + for ( final_empty = 0, sp = ep = line, end = sp + linelen; + sp < end && *sp; ) + { + /* Collect everything that is not a separator. */ + for ( ; *ep && !sbitset( seps, *ep ); ep++ ) + ; + + /* Resize the list if necessary. */ + if ( list->used == list->size ) + { + error = _bdf_list_ensure( list, list->used + 1 ); + if ( error ) + goto Exit; + } + + /* Assign the field appropriately. */ + list->field[list->used++] = ( ep > sp ) ? sp : (char*)empty; + + sp = ep; + + if ( mult ) + { + /* If multiple separators should be collapsed, do it now by */ + /* setting all the separator characters to 0. */ + for ( ; *ep && sbitset( seps, *ep ); ep++ ) + *ep = 0; + } + else if ( *ep != 0 ) + /* Don't collapse multiple separators by making them 0, so just */ + /* make the one encountered 0. */ + *ep++ = 0; + + final_empty = ( ep > sp && *ep == 0 ); + sp = ep; + } + + /* Finally, NULL-terminate the list. */ + if ( list->used + final_empty >= list->size ) + { + error = _bdf_list_ensure( list, list->used + final_empty + 1 ); + if ( error ) + goto Exit; + } + + if ( final_empty ) + list->field[list->used++] = (char*)empty; + + list->field[list->used] = 0; + + Exit: + return error; + } + + +#define NO_SKIP 256 /* this value cannot be stored in a 'char' */ + + + static FT_Error + _bdf_readstream( FT_Stream stream, + _bdf_line_func_t callback, + void* client_data, + unsigned long *lno ) + { + _bdf_line_func_t cb; + unsigned long lineno, buf_size; + int refill, hold, to_skip; + ptrdiff_t bytes, start, end, cursor, avail; + char* buf = 0; + FT_Memory memory = stream->memory; + FT_Error error = BDF_Err_Ok; + + + if ( callback == 0 ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + /* initial size and allocation of the input buffer */ + buf_size = 1024; + + if ( FT_NEW_ARRAY( buf, buf_size ) ) + goto Exit; + + cb = callback; + lineno = 1; + buf[0] = 0; + start = 0; + end = 0; + avail = 0; + cursor = 0; + refill = 1; + to_skip = NO_SKIP; + bytes = 0; /* make compiler happy */ + + for (;;) + { + if ( refill ) + { + bytes = (ptrdiff_t)FT_Stream_TryRead( stream, (FT_Byte*)buf + cursor, + (FT_ULong)(buf_size - cursor) ); + avail = cursor + bytes; + cursor = 0; + refill = 0; + } + + end = start; + + /* should we skip an optional character like \n or \r? */ + if ( start < avail && buf[start] == to_skip ) + { + start += 1; + to_skip = NO_SKIP; + continue; + } + + /* try to find the end of the line */ + while ( end < avail && buf[end] != '\n' && buf[end] != '\r' ) + end++; + + /* if we hit the end of the buffer, try shifting its content */ + /* or even resizing it */ + if ( end >= avail ) + { + if ( bytes == 0 ) /* last line in file doesn't end in \r or \n */ + break; /* ignore it then exit */ + + if ( start == 0 ) + { + /* this line is definitely too long; try resizing the input */ + /* buffer a bit to handle it. */ + FT_ULong new_size; + + + if ( buf_size >= 65536UL ) /* limit ourselves to 64KByte */ + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + new_size = buf_size * 2; + if ( FT_RENEW_ARRAY( buf, buf_size, new_size ) ) + goto Exit; + + cursor = buf_size; + buf_size = new_size; + } + else + { + bytes = avail - start; + + FT_MEM_COPY( buf, buf + start, bytes ); + + cursor = bytes; + avail -= bytes; + start = 0; + } + refill = 1; + continue; + } + + /* Temporarily NUL-terminate the line. */ + hold = buf[end]; + buf[end] = 0; + + /* XXX: Use encoding independent value for 0x1a */ + if ( buf[start] != '#' && buf[start] != 0x1a && end > start ) + { + error = (*cb)( buf + start, end - start, lineno, + (void*)&cb, client_data ); + if ( error ) + break; + } + + lineno += 1; + buf[end] = (char)hold; + start = end + 1; + + if ( hold == '\n' ) + to_skip = '\r'; + else if ( hold == '\r' ) + to_skip = '\n'; + else + to_skip = NO_SKIP; + } + + *lno = lineno; + + Exit: + FT_FREE( buf ); + return error; + } + + + /* XXX: make this work with EBCDIC also */ + + static const unsigned char a2i[128] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + static const unsigned char odigits[32] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + static const unsigned char ddigits[32] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + static const unsigned char hdigits[32] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, + 0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + +#define isdigok( m, d ) (m[(d) >> 3] & ( 1 << ( (d) & 7 ) ) ) + + + /* Routine to convert an ASCII string into an unsigned long integer. */ + static unsigned long + _bdf_atoul( char* s, + char** end, + int base ) + { + unsigned long v; + const unsigned char* dmap; + + + if ( s == 0 || *s == 0 ) + return 0; + + /* Make sure the radix is something recognizable. Default to 10. */ + switch ( base ) + { + case 8: + dmap = odigits; + break; + case 16: + dmap = hdigits; + break; + default: + base = 10; + dmap = ddigits; + break; + } + + /* Check for the special hex prefix. */ + if ( *s == '0' && + ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) + { + base = 16; + dmap = hdigits; + s += 2; + } + + for ( v = 0; isdigok( dmap, *s ); s++ ) + v = v * base + a2i[(int)*s]; + + if ( end != 0 ) + *end = s; + + return v; + } + + + /* Routine to convert an ASCII string into an signed long integer. */ + static long + _bdf_atol( char* s, + char** end, + int base ) + { + long v, neg; + const unsigned char* dmap; + + + if ( s == 0 || *s == 0 ) + return 0; + + /* Make sure the radix is something recognizable. Default to 10. */ + switch ( base ) + { + case 8: + dmap = odigits; + break; + case 16: + dmap = hdigits; + break; + default: + base = 10; + dmap = ddigits; + break; + } + + /* Check for a minus sign. */ + neg = 0; + if ( *s == '-' ) + { + s++; + neg = 1; + } + + /* Check for the special hex prefix. */ + if ( *s == '0' && + ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) + { + base = 16; + dmap = hdigits; + s += 2; + } + + for ( v = 0; isdigok( dmap, *s ); s++ ) + v = v * base + a2i[(int)*s]; + + if ( end != 0 ) + *end = s; + + return ( !neg ) ? v : -v; + } + + + /* Routine to convert an ASCII string into an signed short integer. */ + static short + _bdf_atos( char* s, + char** end, + int base ) + { + short v, neg; + const unsigned char* dmap; + + + if ( s == 0 || *s == 0 ) + return 0; + + /* Make sure the radix is something recognizable. Default to 10. */ + switch ( base ) + { + case 8: + dmap = odigits; + break; + case 16: + dmap = hdigits; + break; + default: + base = 10; + dmap = ddigits; + break; + } + + /* Check for a minus. */ + neg = 0; + if ( *s == '-' ) + { + s++; + neg = 1; + } + + /* Check for the special hex prefix. */ + if ( *s == '0' && + ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) ) + { + base = 16; + dmap = hdigits; + s += 2; + } + + for ( v = 0; isdigok( dmap, *s ); s++ ) + v = (short)( v * base + a2i[(int)*s] ); + + if ( end != 0 ) + *end = s; + + return (short)( ( !neg ) ? v : -v ); + } + + + /* Routine to compare two glyphs by encoding so they can be sorted. */ + static int + by_encoding( const void* a, + const void* b ) + { + bdf_glyph_t *c1, *c2; + + + c1 = (bdf_glyph_t *)a; + c2 = (bdf_glyph_t *)b; + + if ( c1->encoding < c2->encoding ) + return -1; + + if ( c1->encoding > c2->encoding ) + return 1; + + return 0; + } + + + static FT_Error + bdf_create_property( char* name, + int format, + bdf_font_t* font ) + { + size_t n; + bdf_property_t* p; + FT_Memory memory = font->memory; + FT_Error error = BDF_Err_Ok; + + + /* First check to see if the property has */ + /* already been added or not. If it has, then */ + /* simply ignore it. */ + if ( hash_lookup( name, &(font->proptbl) ) ) + goto Exit; + + if ( FT_RENEW_ARRAY( font->user_props, + font->nuser_props, + font->nuser_props + 1 ) ) + goto Exit; + + p = font->user_props + font->nuser_props; + FT_ZERO( p ); + + n = ft_strlen( name ) + 1; + if ( n > FT_ULONG_MAX ) + return BDF_Err_Invalid_Argument; + + if ( FT_NEW_ARRAY( p->name, n ) ) + goto Exit; + + FT_MEM_COPY( (char *)p->name, name, n ); + + p->format = format; + p->builtin = 0; + + n = _num_bdf_properties + font->nuser_props; + + error = hash_insert( p->name, n, &(font->proptbl), memory ); + if ( error ) + goto Exit; + + font->nuser_props++; + + Exit: + return error; + } + + + FT_LOCAL_DEF( bdf_property_t * ) + bdf_get_property( char* name, + bdf_font_t* font ) + { + hashnode hn; + size_t propid; + + + if ( name == 0 || *name == 0 ) + return 0; + + if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 ) + return 0; + + propid = hn->data; + if ( propid >= _num_bdf_properties ) + return font->user_props + ( propid - _num_bdf_properties ); + + return (bdf_property_t*)_bdf_properties + propid; + } + + + /*************************************************************************/ + /* */ + /* BDF font file parsing flags and functions. */ + /* */ + /*************************************************************************/ + + + /* Parse flags. */ + +#define _BDF_START 0x0001 +#define _BDF_FONT_NAME 0x0002 +#define _BDF_SIZE 0x0004 +#define _BDF_FONT_BBX 0x0008 +#define _BDF_PROPS 0x0010 +#define _BDF_GLYPHS 0x0020 +#define _BDF_GLYPH 0x0040 +#define _BDF_ENCODING 0x0080 +#define _BDF_SWIDTH 0x0100 +#define _BDF_DWIDTH 0x0200 +#define _BDF_BBX 0x0400 +#define _BDF_BITMAP 0x0800 + +#define _BDF_SWIDTH_ADJ 0x1000 + +#define _BDF_GLYPH_BITS ( _BDF_GLYPH | \ + _BDF_ENCODING | \ + _BDF_SWIDTH | \ + _BDF_DWIDTH | \ + _BDF_BBX | \ + _BDF_BITMAP ) + +#define _BDF_GLYPH_WIDTH_CHECK 0x40000000UL +#define _BDF_GLYPH_HEIGHT_CHECK 0x80000000UL + + + /* Auto correction messages. */ +#define ACMSG1 "FONT_ASCENT property missing. " \ + "Added \"FONT_ASCENT %hd\".\n" +#define ACMSG2 "FONT_DESCENT property missing. " \ + "Added \"FONT_DESCENT %hd\".\n" +#define ACMSG3 "Font width != actual width. Old: %hd New: %hd.\n" +#define ACMSG4 "Font left bearing != actual left bearing. " \ + "Old: %hd New: %hd.\n" +#define ACMSG5 "Font ascent != actual ascent. Old: %hd New: %hd.\n" +#define ACMSG6 "Font descent != actual descent. Old: %hd New: %hd.\n" +#define ACMSG7 "Font height != actual height. Old: %hd New: %hd.\n" +#define ACMSG8 "Glyph scalable width (SWIDTH) adjustments made.\n" +#define ACMSG9 "SWIDTH field missing at line %ld. Set automatically.\n" +#define ACMSG10 "DWIDTH field missing at line %ld. Set to glyph width.\n" +#define ACMSG11 "SIZE bits per pixel field adjusted to %hd.\n" +#define ACMSG12 "Duplicate encoding %ld (%s) changed to unencoded.\n" +#define ACMSG13 "Glyph %ld extra rows removed.\n" +#define ACMSG14 "Glyph %ld extra columns removed.\n" +#define ACMSG15 "Incorrect glyph count: %ld indicated but %ld found.\n" + + /* Error messages. */ +#define ERRMSG1 "[line %ld] Missing \"%s\" line.\n" +#define ERRMSG2 "[line %ld] Font header corrupted or missing fields.\n" +#define ERRMSG3 "[line %ld] Font glyphs corrupted or missing fields.\n" +#define ERRMSG4 "[line %ld] BBX too big.\n" + + + static FT_Error + _bdf_add_comment( bdf_font_t* font, + char* comment, + unsigned long len ) + { + char* cp; + FT_Memory memory = font->memory; + FT_Error error = BDF_Err_Ok; + + + if ( FT_RENEW_ARRAY( font->comments, + font->comments_len, + font->comments_len + len + 1 ) ) + goto Exit; + + cp = font->comments + font->comments_len; + + FT_MEM_COPY( cp, comment, len ); + cp[len] = '\n'; + + font->comments_len += len + 1; + + Exit: + return error; + } + + + /* Set the spacing from the font name if it exists, or set it to the */ + /* default specified in the options. */ + static FT_Error + _bdf_set_default_spacing( bdf_font_t* font, + bdf_options_t* opts ) + { + size_t len; + char name[256]; + _bdf_list_t list; + FT_Memory memory; + FT_Error error = BDF_Err_Ok; + + + if ( font == 0 || font->name == 0 || font->name[0] == 0 ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + memory = font->memory; + + _bdf_list_init( &list, memory ); + + font->spacing = opts->font_spacing; + + len = ft_strlen( font->name ) + 1; + /* Limit ourselves to 256 characters in the font name. */ + if ( len >= 256 ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + FT_MEM_COPY( name, font->name, len ); + + error = _bdf_list_split( &list, (char *)"-", name, len ); + if ( error ) + goto Fail; + + if ( list.used == 15 ) + { + switch ( list.field[11][0] ) + { + case 'C': + case 'c': + font->spacing = BDF_CHARCELL; + break; + case 'M': + case 'm': + font->spacing = BDF_MONOWIDTH; + break; + case 'P': + case 'p': + font->spacing = BDF_PROPORTIONAL; + break; + } + } + + Fail: + _bdf_list_done( &list ); + + Exit: + return error; + } + + + /* Determine whether the property is an atom or not. If it is, then */ + /* clean it up so the double quotes are removed if they exist. */ + static int + _bdf_is_atom( char* line, + unsigned long linelen, + char** name, + char** value, + bdf_font_t* font ) + { + int hold; + char *sp, *ep; + bdf_property_t* p; + + + *name = sp = ep = line; + + while ( *ep && *ep != ' ' && *ep != '\t' ) + ep++; + + hold = -1; + if ( *ep ) + { + hold = *ep; + *ep = 0; + } + + p = bdf_get_property( sp, font ); + + /* Restore the character that was saved before any return can happen. */ + if ( hold != -1 ) + *ep = (char)hold; + + /* If the property exists and is not an atom, just return here. */ + if ( p && p->format != BDF_ATOM ) + return 0; + + /* The property is an atom. Trim all leading and trailing whitespace */ + /* and double quotes for the atom value. */ + sp = ep; + ep = line + linelen; + + /* Trim the leading whitespace if it exists. */ + *sp++ = 0; + while ( *sp && + ( *sp == ' ' || *sp == '\t' ) ) + sp++; + + /* Trim the leading double quote if it exists. */ + if ( *sp == '"' ) + sp++; + *value = sp; + + /* Trim the trailing whitespace if it exists. */ + while ( ep > sp && + ( *( ep - 1 ) == ' ' || *( ep - 1 ) == '\t' ) ) + *--ep = 0; + + /* Trim the trailing double quote if it exists. */ + if ( ep > sp && *( ep - 1 ) == '"' ) + *--ep = 0; + + return 1; + } + + + static FT_Error + _bdf_add_property( bdf_font_t* font, + char* name, + char* value ) + { + size_t propid; + hashnode hn; + bdf_property_t *prop, *fp; + FT_Memory memory = font->memory; + FT_Error error = BDF_Err_Ok; + + + /* First, check to see if the property already exists in the font. */ + if ( ( hn = hash_lookup( name, (hashtable *)font->internal ) ) != 0 ) + { + /* The property already exists in the font, so simply replace */ + /* the value of the property with the current value. */ + fp = font->props + hn->data; + + switch ( fp->format ) + { + case BDF_ATOM: + /* Delete the current atom if it exists. */ + FT_FREE( fp->value.atom ); + + if ( value && value[0] != 0 ) + { + if ( FT_STRDUP( fp->value.atom, value ) ) + goto Exit; + } + break; + + case BDF_INTEGER: + fp->value.l = _bdf_atol( value, 0, 10 ); + break; + + case BDF_CARDINAL: + fp->value.ul = _bdf_atoul( value, 0, 10 ); + break; + + default: + ; + } + + goto Exit; + } + + /* See whether this property type exists yet or not. */ + /* If not, create it. */ + hn = hash_lookup( name, &(font->proptbl) ); + if ( hn == 0 ) + { + error = bdf_create_property( name, BDF_ATOM, font ); + if ( error ) + goto Exit; + hn = hash_lookup( name, &(font->proptbl) ); + } + + /* Allocate another property if this is overflow. */ + if ( font->props_used == font->props_size ) + { + if ( font->props_size == 0 ) + { + if ( FT_NEW_ARRAY( font->props, 1 ) ) + goto Exit; + } + else + { + if ( FT_RENEW_ARRAY( font->props, + font->props_size, + font->props_size + 1 ) ) + goto Exit; + } + + fp = font->props + font->props_size; + FT_MEM_ZERO( fp, sizeof ( bdf_property_t ) ); + font->props_size++; + } + + propid = hn->data; + if ( propid >= _num_bdf_properties ) + prop = font->user_props + ( propid - _num_bdf_properties ); + else + prop = (bdf_property_t*)_bdf_properties + propid; + + fp = font->props + font->props_used; + + fp->name = prop->name; + fp->format = prop->format; + fp->builtin = prop->builtin; + + switch ( prop->format ) + { + case BDF_ATOM: + fp->value.atom = 0; + if ( value != 0 && value[0] ) + { + if ( FT_STRDUP( fp->value.atom, value ) ) + goto Exit; + } + break; + + case BDF_INTEGER: + fp->value.l = _bdf_atol( value, 0, 10 ); + break; + + case BDF_CARDINAL: + fp->value.ul = _bdf_atoul( value, 0, 10 ); + break; + } + + /* If the property happens to be a comment, then it doesn't need */ + /* to be added to the internal hash table. */ + if ( ft_memcmp( name, "COMMENT", 7 ) != 0 ) { + /* Add the property to the font property table. */ + error = hash_insert( fp->name, + font->props_used, + (hashtable *)font->internal, + memory ); + if ( error ) + goto Exit; + } + + font->props_used++; + + /* Some special cases need to be handled here. The DEFAULT_CHAR */ + /* property needs to be located if it exists in the property list, the */ + /* FONT_ASCENT and FONT_DESCENT need to be assigned if they are */ + /* present, and the SPACING property should override the default */ + /* spacing. */ + if ( ft_memcmp( name, "DEFAULT_CHAR", 12 ) == 0 ) + font->default_char = fp->value.l; + else if ( ft_memcmp( name, "FONT_ASCENT", 11 ) == 0 ) + font->font_ascent = fp->value.l; + else if ( ft_memcmp( name, "FONT_DESCENT", 12 ) == 0 ) + font->font_descent = fp->value.l; + else if ( ft_memcmp( name, "SPACING", 7 ) == 0 ) + { + if ( !fp->value.atom ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; + } + + if ( fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P' ) + font->spacing = BDF_PROPORTIONAL; + else if ( fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M' ) + font->spacing = BDF_MONOWIDTH; + else if ( fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C' ) + font->spacing = BDF_CHARCELL; + } + + Exit: + return error; + } + + + static const unsigned char nibble_mask[8] = + { + 0xFF, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE + }; + + + /* Actually parse the glyph info and bitmaps. */ + static FT_Error + _bdf_parse_glyphs( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + int c, mask_index; + char* s; + unsigned char* bp; + unsigned long i, slen, nibbles; + + _bdf_parse_t* p; + bdf_glyph_t* glyph; + bdf_font_t* font; + + FT_Memory memory; + FT_Error error = BDF_Err_Ok; + + FT_UNUSED( call_data ); + FT_UNUSED( lineno ); /* only used in debug mode */ + + + p = (_bdf_parse_t *)client_data; + + font = p->font; + memory = font->memory; + + /* Check for a comment. */ + if ( ft_memcmp( line, "COMMENT", 7 ) == 0 ) + { + linelen -= 7; + + s = line + 7; + if ( *s != 0 ) + { + s++; + linelen--; + } + error = _bdf_add_comment( p->font, s, linelen ); + goto Exit; + } + + /* The very first thing expected is the number of glyphs. */ + if ( !( p->flags & _BDF_GLYPHS ) ) + { + if ( ft_memcmp( line, "CHARS", 5 ) != 0 ) + { + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "CHARS" )); + error = BDF_Err_Missing_Chars_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1], 0, 10 ); + + /* Make sure the number of glyphs is non-zero. */ + if ( p->cnt == 0 ) + font->glyphs_size = 64; + + /* Limit ourselves to 1,114,112 glyphs in the font (this is the */ + /* number of code points available in Unicode). */ + if ( p->cnt >= 1114112UL ) + { + error = BDF_Err_Invalid_Argument; + goto Exit; + } + + if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) ) + goto Exit; + + p->flags |= _BDF_GLYPHS; + + goto Exit; + } + + /* Check for the ENDFONT field. */ + if ( ft_memcmp( line, "ENDFONT", 7 ) == 0 ) + { + /* Sort the glyphs by encoding. */ + ft_qsort( (char *)font->glyphs, + font->glyphs_used, + sizeof ( bdf_glyph_t ), + by_encoding ); + + p->flags &= ~_BDF_START; + + goto Exit; + } + + /* Check for the ENDCHAR field. */ + if ( ft_memcmp( line, "ENDCHAR", 7 ) == 0 ) + { + p->glyph_enc = 0; + p->flags &= ~_BDF_GLYPH_BITS; + + goto Exit; + } + + /* Check to see whether a glyph is being scanned but should be */ + /* ignored because it is an unencoded glyph. */ + if ( ( p->flags & _BDF_GLYPH ) && + p->glyph_enc == -1 && + p->opts->keep_unencoded == 0 ) + goto Exit; + + /* Check for the STARTCHAR field. */ + if ( ft_memcmp( line, "STARTCHAR", 9 ) == 0 ) + { + /* Set the character name in the parse info first until the */ + /* encoding can be checked for an unencoded character. */ + FT_FREE( p->glyph_name ); + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + _bdf_list_shift( &p->list, 1 ); + + s = _bdf_list_join( &p->list, ' ', &slen ); + + if ( !s ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_NEW_ARRAY( p->glyph_name, slen + 1 ) ) + goto Exit; + + FT_MEM_COPY( p->glyph_name, s, slen + 1 ); + + p->flags |= _BDF_GLYPH; + + goto Exit; + } + + /* Check for the ENCODING field. */ + if ( ft_memcmp( line, "ENCODING", 8 ) == 0 ) + { + if ( !( p->flags & _BDF_GLYPH ) ) + { + /* Missing STARTCHAR field. */ + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "STARTCHAR" )); + error = BDF_Err_Missing_Startchar_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 ); + + /* Check that the encoding is in the range [0,65536] because */ + /* otherwise p->have (a bitmap with static size) overflows. */ + if ( (size_t)p->glyph_enc >= sizeof ( p->have ) * 8 ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; + } + + /* Check to see whether this encoding has already been encountered. */ + /* If it has then change it to unencoded so it gets added if */ + /* indicated. */ + if ( p->glyph_enc >= 0 ) + { + if ( _bdf_glyph_modified( p->have, p->glyph_enc ) ) + { + /* Emit a message saying a glyph has been moved to the */ + /* unencoded area. */ + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG12, + p->glyph_enc, p->glyph_name )); + p->glyph_enc = -1; + font->modified = 1; + } + else + _bdf_set_glyph_modified( p->have, p->glyph_enc ); + } + + if ( p->glyph_enc >= 0 ) + { + /* Make sure there are enough glyphs allocated in case the */ + /* number of characters happen to be wrong. */ + if ( font->glyphs_used == font->glyphs_size ) + { + if ( FT_RENEW_ARRAY( font->glyphs, + font->glyphs_size, + font->glyphs_size + 64 ) ) + goto Exit; + + font->glyphs_size += 64; + } + + glyph = font->glyphs + font->glyphs_used++; + glyph->name = p->glyph_name; + glyph->encoding = p->glyph_enc; + + /* Reset the initial glyph info. */ + p->glyph_name = 0; + } + else + { + /* Unencoded glyph. Check to see whether it should */ + /* be added or not. */ + if ( p->opts->keep_unencoded != 0 ) + { + /* Allocate the next unencoded glyph. */ + if ( font->unencoded_used == font->unencoded_size ) + { + if ( FT_RENEW_ARRAY( font->unencoded , + font->unencoded_size, + font->unencoded_size + 4 ) ) + goto Exit; + + font->unencoded_size += 4; + } + + glyph = font->unencoded + font->unencoded_used; + glyph->name = p->glyph_name; + glyph->encoding = font->unencoded_used++; + } + else + /* Free up the glyph name if the unencoded shouldn't be */ + /* kept. */ + FT_FREE( p->glyph_name ); + + p->glyph_name = 0; + } + + /* Clear the flags that might be added when width and height are */ + /* checked for consistency. */ + p->flags &= ~( _BDF_GLYPH_WIDTH_CHECK | _BDF_GLYPH_HEIGHT_CHECK ); + + p->flags |= _BDF_ENCODING; + + goto Exit; + } + + /* Point at the glyph being constructed. */ + if ( p->glyph_enc == -1 ) + glyph = font->unencoded + ( font->unencoded_used - 1 ); + else + glyph = font->glyphs + ( font->glyphs_used - 1 ); + + /* Check to see whether a bitmap is being constructed. */ + if ( p->flags & _BDF_BITMAP ) + { + /* If there are more rows than are specified in the glyph metrics, */ + /* ignore the remaining lines. */ + if ( p->row >= (unsigned long)glyph->bbx.height ) + { + if ( !( p->flags & _BDF_GLYPH_HEIGHT_CHECK ) ) + { + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG13, glyph->encoding )); + p->flags |= _BDF_GLYPH_HEIGHT_CHECK; + font->modified = 1; + } + + goto Exit; + } + + /* Only collect the number of nibbles indicated by the glyph */ + /* metrics. If there are more columns, they are simply ignored. */ + nibbles = glyph->bpr << 1; + bp = glyph->bitmap + p->row * glyph->bpr; + + for ( i = 0; i < nibbles; i++ ) + { + c = line[i]; + *bp = (FT_Byte)( ( *bp << 4 ) + a2i[c] ); + if ( i + 1 < nibbles && ( i & 1 ) ) + *++bp = 0; + } + + /* Remove possible garbage at the right. */ + mask_index = ( glyph->bbx.width * p->font->bpp ) & 7; + if ( glyph->bbx.width ) + *bp &= nibble_mask[mask_index]; + + /* If any line has extra columns, indicate they have been removed. */ + if ( ( line[nibbles] == '0' || a2i[(int)line[nibbles]] != 0 ) && + !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) ) + { + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG14, glyph->encoding )); + p->flags |= _BDF_GLYPH_WIDTH_CHECK; + font->modified = 1; + } + + p->row++; + goto Exit; + } + + /* Expect the SWIDTH (scalable width) field next. */ + if ( ft_memcmp( line, "SWIDTH", 6 ) == 0 ) + { + if ( !( p->flags & _BDF_ENCODING ) ) + { + /* Missing ENCODING field. */ + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "ENCODING" )); + error = BDF_Err_Missing_Encoding_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + glyph->swidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 ); + p->flags |= _BDF_SWIDTH; + + goto Exit; + } + + /* Expect the DWIDTH (scalable width) field next. */ + if ( ft_memcmp( line, "DWIDTH", 6 ) == 0 ) + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + glyph->dwidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 ); + + if ( !( p->flags & _BDF_SWIDTH ) ) + { + /* Missing SWIDTH field. Emit an auto correction message and set */ + /* the scalable width from the device width. */ + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG9, lineno )); + + glyph->swidth = (unsigned short)FT_MulDiv( + glyph->dwidth, 72000L, + (FT_Long)( font->point_size * + font->resolution_x ) ); + } + + p->flags |= _BDF_DWIDTH; + goto Exit; + } + + /* Expect the BBX field next. */ + if ( ft_memcmp( line, "BBX", 3 ) == 0 ) + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + glyph->bbx.width = _bdf_atos( p->list.field[1], 0, 10 ); + glyph->bbx.height = _bdf_atos( p->list.field[2], 0, 10 ); + glyph->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 ); + glyph->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 ); + + /* Generate the ascent and descent of the character. */ + glyph->bbx.ascent = (short)( glyph->bbx.height + glyph->bbx.y_offset ); + glyph->bbx.descent = (short)( -glyph->bbx.y_offset ); + + /* Determine the overall font bounding box as the characters are */ + /* loaded so corrections can be done later if indicated. */ + p->maxas = (short)FT_MAX( glyph->bbx.ascent, p->maxas ); + p->maxds = (short)FT_MAX( glyph->bbx.descent, p->maxds ); + + p->rbearing = (short)( glyph->bbx.width + glyph->bbx.x_offset ); + + p->maxrb = (short)FT_MAX( p->rbearing, p->maxrb ); + p->minlb = (short)FT_MIN( glyph->bbx.x_offset, p->minlb ); + p->maxlb = (short)FT_MAX( glyph->bbx.x_offset, p->maxlb ); + + if ( !( p->flags & _BDF_DWIDTH ) ) + { + /* Missing DWIDTH field. Emit an auto correction message and set */ + /* the device width to the glyph width. */ + FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG10, lineno )); + glyph->dwidth = glyph->bbx.width; + } + + /* If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH */ + /* value if necessary. */ + if ( p->opts->correct_metrics != 0 ) + { + /* Determine the point size of the glyph. */ + unsigned short sw = (unsigned short)FT_MulDiv( + glyph->dwidth, 72000L, + (FT_Long)( font->point_size * + font->resolution_x ) ); + + + if ( sw != glyph->swidth ) + { + glyph->swidth = sw; + + if ( p->glyph_enc == -1 ) + _bdf_set_glyph_modified( font->umod, + font->unencoded_used - 1 ); + else + _bdf_set_glyph_modified( font->nmod, glyph->encoding ); + + p->flags |= _BDF_SWIDTH_ADJ; + font->modified = 1; + } + } + + p->flags |= _BDF_BBX; + goto Exit; + } + + /* And finally, gather up the bitmap. */ + if ( ft_memcmp( line, "BITMAP", 6 ) == 0 ) + { + unsigned long bitmap_size; + + + if ( !( p->flags & _BDF_BBX ) ) + { + /* Missing BBX field. */ + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "BBX" )); + error = BDF_Err_Missing_Bbx_Field; + goto Exit; + } + + /* Allocate enough space for the bitmap. */ + glyph->bpr = ( glyph->bbx.width * p->font->bpp + 7 ) >> 3; + + bitmap_size = glyph->bpr * glyph->bbx.height; + if ( bitmap_size > 0xFFFFU ) + { + FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG4, lineno )); + error = BDF_Err_Bbx_Too_Big; + goto Exit; + } + else + glyph->bytes = (unsigned short)bitmap_size; + + if ( FT_NEW_ARRAY( glyph->bitmap, glyph->bytes ) ) + goto Exit; + + p->row = 0; + p->flags |= _BDF_BITMAP; + + goto Exit; + } + + error = BDF_Err_Invalid_File_Format; + + Exit: + return error; + } + + + /* Load the font properties. */ + static FT_Error + _bdf_parse_properties( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + unsigned long vlen; + _bdf_line_func_t* next; + _bdf_parse_t* p; + char* name; + char* value; + char nbuf[128]; + FT_Error error = BDF_Err_Ok; + + FT_UNUSED( lineno ); + + + next = (_bdf_line_func_t *)call_data; + p = (_bdf_parse_t *) client_data; + + /* Check for the end of the properties. */ + if ( ft_memcmp( line, "ENDPROPERTIES", 13 ) == 0 ) + { + /* If the FONT_ASCENT or FONT_DESCENT properties have not been */ + /* encountered yet, then make sure they are added as properties and */ + /* make sure they are set from the font bounding box info. */ + /* */ + /* This is *always* done regardless of the options, because X11 */ + /* requires these two fields to compile fonts. */ + if ( bdf_get_font_property( p->font, "FONT_ASCENT" ) == 0 ) + { + p->font->font_ascent = p->font->bbx.ascent; + ft_sprintf( nbuf, "%hd", p->font->bbx.ascent ); + error = _bdf_add_property( p->font, (char *)"FONT_ASCENT", nbuf ); + if ( error ) + goto Exit; + + FT_TRACE2(( "_bdf_parse_properties: " ACMSG1, p->font->bbx.ascent )); + p->font->modified = 1; + } + + if ( bdf_get_font_property( p->font, "FONT_DESCENT" ) == 0 ) + { + p->font->font_descent = p->font->bbx.descent; + ft_sprintf( nbuf, "%hd", p->font->bbx.descent ); + error = _bdf_add_property( p->font, (char *)"FONT_DESCENT", nbuf ); + if ( error ) + goto Exit; + + FT_TRACE2(( "_bdf_parse_properties: " ACMSG2, p->font->bbx.descent )); + p->font->modified = 1; + } + + p->flags &= ~_BDF_PROPS; + *next = _bdf_parse_glyphs; + + goto Exit; + } + + /* Ignore the _XFREE86_GLYPH_RANGES properties. */ + if ( ft_memcmp( line, "_XFREE86_GLYPH_RANGES", 21 ) == 0 ) + goto Exit; + + /* Handle COMMENT fields and properties in a special way to preserve */ + /* the spacing. */ + if ( ft_memcmp( line, "COMMENT", 7 ) == 0 ) + { + name = value = line; + value += 7; + if ( *value ) + *value++ = 0; + error = _bdf_add_property( p->font, name, value ); + if ( error ) + goto Exit; + } + else if ( _bdf_is_atom( line, linelen, &name, &value, p->font ) ) + { + error = _bdf_add_property( p->font, name, value ); + if ( error ) + goto Exit; + } + else + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + name = p->list.field[0]; + + _bdf_list_shift( &p->list, 1 ); + value = _bdf_list_join( &p->list, ' ', &vlen ); + + error = _bdf_add_property( p->font, name, value ); + if ( error ) + goto Exit; + } + + Exit: + return error; + } + + + /* Load the font header. */ + static FT_Error + _bdf_parse_start( char* line, + unsigned long linelen, + unsigned long lineno, + void* call_data, + void* client_data ) + { + unsigned long slen; + _bdf_line_func_t* next; + _bdf_parse_t* p; + bdf_font_t* font; + char *s; + + FT_Memory memory = NULL; + FT_Error error = BDF_Err_Ok; + + FT_UNUSED( lineno ); /* only used in debug mode */ + + + next = (_bdf_line_func_t *)call_data; + p = (_bdf_parse_t *) client_data; + + if ( p->font ) + memory = p->font->memory; + + /* Check for a comment. This is done to handle those fonts that have */ + /* comments before the STARTFONT line for some reason. */ + if ( ft_memcmp( line, "COMMENT", 7 ) == 0 ) + { + if ( p->opts->keep_comments != 0 && p->font != 0 ) + { + linelen -= 7; + + s = line + 7; + if ( *s != 0 ) + { + s++; + linelen--; + } + + error = _bdf_add_comment( p->font, s, linelen ); + if ( error ) + goto Exit; + /* here font is not defined! */ + } + + goto Exit; + } + + if ( !( p->flags & _BDF_START ) ) + { + memory = p->memory; + + if ( ft_memcmp( line, "STARTFONT", 9 ) != 0 ) + { + /* No STARTFONT field is a good indication of a problem. */ + error = BDF_Err_Missing_Startfont_Field; + goto Exit; + } + + p->flags = _BDF_START; + font = p->font = 0; + + if ( FT_NEW( font ) ) + goto Exit; + p->font = font; + + font->memory = p->memory; + p->memory = 0; + + { /* setup */ + size_t i; + bdf_property_t* prop; + + + error = hash_init( &(font->proptbl), memory ); + if ( error ) + goto Exit; + for ( i = 0, prop = (bdf_property_t*)_bdf_properties; + i < _num_bdf_properties; i++, prop++ ) + { + error = hash_insert( prop->name, i, + &(font->proptbl), memory ); + if ( error ) + goto Exit; + } + } + + if ( FT_ALLOC( p->font->internal, sizeof ( hashtable ) ) ) + goto Exit; + error = hash_init( (hashtable *)p->font->internal,memory ); + if ( error ) + goto Exit; + p->font->spacing = p->opts->font_spacing; + p->font->default_char = -1; + + goto Exit; + } + + /* Check for the start of the properties. */ + if ( ft_memcmp( line, "STARTPROPERTIES", 15 ) == 0 ) + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + /* at this point, `p->font' can't be NULL */ + p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1], 0, 10 ); + + if ( FT_NEW_ARRAY( p->font->props, p->cnt ) ) + goto Exit; + + p->flags |= _BDF_PROPS; + *next = _bdf_parse_properties; + + goto Exit; + } + + /* Check for the FONTBOUNDINGBOX field. */ + if ( ft_memcmp( line, "FONTBOUNDINGBOX", 15 ) == 0 ) + { + if ( !(p->flags & _BDF_SIZE ) ) + { + /* Missing the SIZE field. */ + FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "SIZE" )); + error = BDF_Err_Missing_Size_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + p->font->bbx.width = _bdf_atos( p->list.field[1], 0, 10 ); + p->font->bbx.height = _bdf_atos( p->list.field[2], 0, 10 ); + + p->font->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 ); + p->font->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 ); + + p->font->bbx.ascent = (short)( p->font->bbx.height + + p->font->bbx.y_offset ); + + p->font->bbx.descent = (short)( -p->font->bbx.y_offset ); + + p->flags |= _BDF_FONT_BBX; + + goto Exit; + } + + /* The next thing to check for is the FONT field. */ + if ( ft_memcmp( line, "FONT", 4 ) == 0 ) + { + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + _bdf_list_shift( &p->list, 1 ); + + s = _bdf_list_join( &p->list, ' ', &slen ); + + if ( !s ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_NEW_ARRAY( p->font->name, slen + 1 ) ) + goto Exit; + FT_MEM_COPY( p->font->name, s, slen + 1 ); + + /* If the font name is an XLFD name, set the spacing to the one in */ + /* the font name. If there is no spacing fall back on the default. */ + error = _bdf_set_default_spacing( p->font, p->opts ); + if ( error ) + goto Exit; + + p->flags |= _BDF_FONT_NAME; + + goto Exit; + } + + /* Check for the SIZE field. */ + if ( ft_memcmp( line, "SIZE", 4 ) == 0 ) + { + if ( !( p->flags & _BDF_FONT_NAME ) ) + { + /* Missing the FONT field. */ + FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONT" )); + error = BDF_Err_Missing_Font_Field; + goto Exit; + } + + error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); + if ( error ) + goto Exit; + + p->font->point_size = _bdf_atoul( p->list.field[1], 0, 10 ); + p->font->resolution_x = _bdf_atoul( p->list.field[2], 0, 10 ); + p->font->resolution_y = _bdf_atoul( p->list.field[3], 0, 10 ); + + /* Check for the bits per pixel field. */ + if ( p->list.used == 5 ) + { + unsigned short bitcount, i, shift; + + + p->font->bpp = (unsigned short)_bdf_atos( p->list.field[4], 0, 10 ); + + /* Only values 1, 2, 4, 8 are allowed. */ + shift = p->font->bpp; + bitcount = 0; + for ( i = 0; shift > 0; i++ ) + { + if ( shift & 1 ) + bitcount = i; + shift >>= 1; + } + + shift = (short)( ( bitcount > 3 ) ? 8 : ( 1 << bitcount ) ); + + if ( p->font->bpp > shift || p->font->bpp != shift ) + { + /* select next higher value */ + p->font->bpp = (unsigned short)( shift << 1 ); + FT_TRACE2(( "_bdf_parse_start: " ACMSG11, p->font->bpp )); + } + } + else + p->font->bpp = 1; + + p->flags |= _BDF_SIZE; + + goto Exit; + } + + error = BDF_Err_Invalid_File_Format; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* API. */ + /* */ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + bdf_load_font( FT_Stream stream, + FT_Memory extmemory, + bdf_options_t* opts, + bdf_font_t* *font ) + { + unsigned long lineno = 0; /* make compiler happy */ + _bdf_parse_t *p; + + FT_Memory memory = extmemory; + FT_Error error = BDF_Err_Ok; + + + if ( FT_NEW( p ) ) + goto Exit; + + memory = NULL; + p->opts = (bdf_options_t*)( ( opts != 0 ) ? opts : &_bdf_opts ); + p->minlb = 32767; + p->memory = extmemory; /* only during font creation */ + + _bdf_list_init( &p->list, extmemory ); + + error = _bdf_readstream( stream, _bdf_parse_start, + (void *)p, &lineno ); + if ( error ) + goto Fail; + + if ( p->font != 0 ) + { + /* If the font is not proportional, set the font's monowidth */ + /* field to the width of the font bounding box. */ + memory = p->font->memory; + + if ( p->font->spacing != BDF_PROPORTIONAL ) + p->font->monowidth = p->font->bbx.width; + + /* If the number of glyphs loaded is not that of the original count, */ + /* indicate the difference. */ + if ( p->cnt != p->font->glyphs_used + p->font->unencoded_used ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG15, p->cnt, + p->font->glyphs_used + p->font->unencoded_used )); + p->font->modified = 1; + } + + /* Once the font has been loaded, adjust the overall font metrics if */ + /* necessary. */ + if ( p->opts->correct_metrics != 0 && + ( p->font->glyphs_used > 0 || p->font->unencoded_used > 0 ) ) + { + if ( p->maxrb - p->minlb != p->font->bbx.width ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG3, + p->font->bbx.width, p->maxrb - p->minlb )); + p->font->bbx.width = (unsigned short)( p->maxrb - p->minlb ); + p->font->modified = 1; + } + + if ( p->font->bbx.x_offset != p->minlb ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG4, + p->font->bbx.x_offset, p->minlb )); + p->font->bbx.x_offset = p->minlb; + p->font->modified = 1; + } + + if ( p->font->bbx.ascent != p->maxas ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG5, + p->font->bbx.ascent, p->maxas )); + p->font->bbx.ascent = p->maxas; + p->font->modified = 1; + } + + if ( p->font->bbx.descent != p->maxds ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG6, + p->font->bbx.descent, p->maxds )); + p->font->bbx.descent = p->maxds; + p->font->bbx.y_offset = (short)( -p->maxds ); + p->font->modified = 1; + } + + if ( p->maxas + p->maxds != p->font->bbx.height ) + { + FT_TRACE2(( "bdf_load_font: " ACMSG7, + p->font->bbx.height, p->maxas + p->maxds )); + p->font->bbx.height = (unsigned short)( p->maxas + p->maxds ); + } + + if ( p->flags & _BDF_SWIDTH_ADJ ) + FT_TRACE2(( "bdf_load_font: " ACMSG8 )); + } + } + + if ( p->flags & _BDF_START ) + { + { + /* The ENDFONT field was never reached or did not exist. */ + if ( !( p->flags & _BDF_GLYPHS ) ) + { + /* Error happened while parsing header. */ + FT_ERROR(( "bdf_load_font: " ERRMSG2, lineno )); + error = BDF_Err_Corrupted_Font_Header; + goto Exit; + } + else + { + /* Error happened when parsing glyphs. */ + FT_ERROR(( "bdf_load_font: " ERRMSG3, lineno )); + error = BDF_Err_Corrupted_Font_Glyphs; + goto Exit; + } + } + } + + if ( p->font != 0 ) + { + /* Make sure the comments are NULL terminated if they exist. */ + memory = p->font->memory; + + if ( p->font->comments_len > 0 ) { + if ( FT_RENEW_ARRAY( p->font->comments, + p->font->comments_len, + p->font->comments_len + 1 ) ) + goto Fail; + + p->font->comments[p->font->comments_len] = 0; + } + } + else if ( error == BDF_Err_Ok ) + error = BDF_Err_Invalid_File_Format; + + *font = p->font; + + Exit: + if ( p ) + { + _bdf_list_done( &p->list ); + + memory = extmemory; + + FT_FREE( p ); + } + + return error; + + Fail: + bdf_free_font( p->font ); + + memory = extmemory; + + FT_FREE( p->font ); + + goto Exit; + } + + + FT_LOCAL_DEF( void ) + bdf_free_font( bdf_font_t* font ) + { + bdf_property_t* prop; + unsigned long i; + bdf_glyph_t* glyphs; + FT_Memory memory; + + + if ( font == 0 ) + return; + + memory = font->memory; + + FT_FREE( font->name ); + + /* Free up the internal hash table of property names. */ + if ( font->internal ) + { + hash_free( (hashtable *)font->internal, memory ); + FT_FREE( font->internal ); + } + + /* Free up the comment info. */ + FT_FREE( font->comments ); + + /* Free up the properties. */ + for ( i = 0; i < font->props_size; i++ ) + { + if ( font->props[i].format == BDF_ATOM ) + FT_FREE( font->props[i].value.atom ); + } + + FT_FREE( font->props ); + + /* Free up the character info. */ + for ( i = 0, glyphs = font->glyphs; + i < font->glyphs_used; i++, glyphs++ ) + { + FT_FREE( glyphs->name ); + FT_FREE( glyphs->bitmap ); + } + + for ( i = 0, glyphs = font->unencoded; i < font->unencoded_used; + i++, glyphs++ ) + { + FT_FREE( glyphs->name ); + FT_FREE( glyphs->bitmap ); + } + + FT_FREE( font->glyphs ); + FT_FREE( font->unencoded ); + + /* Free up the overflow storage if it was used. */ + for ( i = 0, glyphs = font->overflow.glyphs; + i < font->overflow.glyphs_used; i++, glyphs++ ) + { + FT_FREE( glyphs->name ); + FT_FREE( glyphs->bitmap ); + } + + FT_FREE( font->overflow.glyphs ); + + /* bdf_cleanup */ + hash_free( &(font->proptbl), memory ); + + /* Free up the user defined properties. */ + for (prop = font->user_props, i = 0; + i < font->nuser_props; i++, prop++ ) + { + FT_FREE( prop->name ); + if ( prop->format == BDF_ATOM ) + FT_FREE( prop->value.atom ); + } + + FT_FREE( font->user_props ); + + /* FREE( font ); */ /* XXX Fixme */ + } + + + FT_LOCAL_DEF( bdf_property_t * ) + bdf_get_font_property( bdf_font_t* font, + const char* name ) + { + hashnode hn; + + + if ( font == 0 || font->props_size == 0 || name == 0 || *name == 0 ) + return 0; + + hn = hash_lookup( name, (hashtable *)font->internal ); + + return hn ? ( font->props + hn->data ) : 0; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/bdf/module.mk b/alienblaster/project/jni/freetype/src/bdf/module.mk new file mode 100644 index 000000000..fe06ae8e0 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/module.mk @@ -0,0 +1,34 @@ +# +# FreeType 2 BDF module definition +# + +# Copyright 2001, 2002, 2006 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +FTMODULE_H_COMMANDS += BDF_DRIVER + +define BDF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, bdf_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)bdf $(ECHO_DRIVER_DESC)bdf bitmap fonts$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/bdf/rules.mk b/alienblaster/project/jni/freetype/src/bdf/rules.mk new file mode 100644 index 000000000..6ff1614dd --- /dev/null +++ b/alienblaster/project/jni/freetype/src/bdf/rules.mk @@ -0,0 +1,81 @@ +# +# FreeType 2 bdf driver configuration rules +# + + +# Copyright (C) 2001, 2002, 2003, 2008 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + + + +# bdf driver directory +# +BDF_DIR := $(SRC_DIR)/bdf + + +BDF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(BDF_DIR)) + + +# bdf driver sources (i.e., C files) +# +BDF_DRV_SRC := $(BDF_DIR)/bdflib.c \ + $(BDF_DIR)/bdfdrivr.c + + +# bdf driver headers +# +BDF_DRV_H := $(BDF_DIR)/bdf.h \ + $(BDF_DIR)/bdfdrivr.h \ + $(BDF_DIR)/bdferror.h + +# bdf driver object(s) +# +# BDF_DRV_OBJ_M is used during `multi' builds +# BDF_DRV_OBJ_S is used during `single' builds +# +BDF_DRV_OBJ_M := $(BDF_DRV_SRC:$(BDF_DIR)/%.c=$(OBJ_DIR)/%.$O) +BDF_DRV_OBJ_S := $(OBJ_DIR)/bdf.$O + +# bdf driver source file for single build +# +BDF_DRV_SRC_S := $(BDF_DIR)/bdf.c + + +# bdf driver - single object +# +$(BDF_DRV_OBJ_S): $(BDF_DRV_SRC_S) $(BDF_DRV_SRC) $(FREETYPE_H) $(BDF_DRV_H) + $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BDF_DRV_SRC_S)) + + +# bdf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(BDF_DIR)/%.c $(FREETYPE_H) $(BDF_DRV_H) + $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(BDF_DRV_OBJ_S) +DRV_OBJS_M += $(BDF_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/cache/Jamfile b/alienblaster/project/jni/freetype/src/cache/Jamfile new file mode 100644 index 000000000..340cff774 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/Jamfile @@ -0,0 +1,43 @@ +# FreeType 2 src/cache Jamfile +# +# Copyright 2001, 2003, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) cache ; + +# The file <freetype/ftcache.h> contains some macro definitions that are +# later used in #include statements related to the cache sub-system. It +# needs to be parsed through a HDRMACRO rule for macro definitions. +# +HDRMACRO [ FT2_SubDir include ftcache.h ] ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftcmru + ftcmanag + ftccache + ftcglyph + ftcsbits + ftcimage + ftcbasic + ftccmap + ; + } + else + { + _sources = ftcache ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/cache Jamfile diff --git a/alienblaster/project/jni/freetype/src/cache/ftcbasic.c b/alienblaster/project/jni/freetype/src/cache/ftcbasic.c new file mode 100644 index 000000000..ebc8871cc --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcbasic.c @@ -0,0 +1,851 @@ +/***************************************************************************/ +/* */ +/* ftcbasic.c */ +/* */ +/* The FreeType basic cache interface (body). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_CACHE_H +#include "ftcglyph.h" +#include "ftcimage.h" +#include "ftcsbits.h" + +#include "ftccback.h" +#include "ftcerror.h" + +#define FT_COMPONENT trace_cache + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* + * These structures correspond to the FTC_Font and FTC_ImageDesc types + * that were defined in version 2.1.7. + */ + typedef struct FTC_OldFontRec_ + { + FTC_FaceID face_id; + FT_UShort pix_width; + FT_UShort pix_height; + + } FTC_OldFontRec, *FTC_OldFont; + + + typedef struct FTC_OldImageDescRec_ + { + FTC_OldFontRec font; + FT_UInt32 flags; + + } FTC_OldImageDescRec, *FTC_OldImageDesc; + + + /* + * Notice that FTC_OldImageDescRec and FTC_ImageTypeRec are nearly + * identical, bit-wise. The only difference is that the `width' and + * `height' fields are expressed as 16-bit integers in the old structure, + * and as normal `int' in the new one. + * + * We are going to perform a weird hack to detect which structure is + * being passed to the image and sbit caches. If the new structure's + * `width' is larger than 0x10000, we assume that we are really receiving + * an FTC_OldImageDesc. + */ + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * Basic Families + * + */ + typedef struct FTC_BasicAttrRec_ + { + FTC_ScalerRec scaler; + FT_UInt load_flags; + + } FTC_BasicAttrRec, *FTC_BasicAttrs; + +#define FTC_BASIC_ATTR_COMPARE( a, b ) \ + FT_BOOL( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \ + (a)->load_flags == (b)->load_flags ) + +#define FTC_BASIC_ATTR_HASH( a ) \ + ( FTC_SCALER_HASH( &(a)->scaler ) + 31*(a)->load_flags ) + + + typedef struct FTC_BasicQueryRec_ + { + FTC_GQueryRec gquery; + FTC_BasicAttrRec attrs; + + } FTC_BasicQueryRec, *FTC_BasicQuery; + + + typedef struct FTC_BasicFamilyRec_ + { + FTC_FamilyRec family; + FTC_BasicAttrRec attrs; + + } FTC_BasicFamilyRec, *FTC_BasicFamily; + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_basic_family_compare( FTC_MruNode ftcfamily, + FT_Pointer ftcquery ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FTC_BasicQuery query = (FTC_BasicQuery)ftcquery; + + + return FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_init( FTC_MruNode ftcfamily, + FT_Pointer ftcquery, + FT_Pointer ftccache ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FTC_BasicQuery query = (FTC_BasicQuery)ftcquery; + FTC_Cache cache = (FTC_Cache)ftccache; + + + FTC_Family_Init( FTC_FAMILY( family ), cache ); + family->attrs = query->attrs; + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + ftc_basic_family_get_count( FTC_Family ftcfamily, + FTC_Manager manager ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FT_Face face; + FT_UInt result = 0; + + + error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id, + &face ); + + if ( error || !face ) + return result; + + if ( (FT_ULong)face->num_glyphs > FT_UINT_MAX || 0 > face->num_glyphs ) + { + FT_TRACE1(( "ftc_basic_family_get_count: too large number of glyphs " )); + FT_TRACE1(( "in this face, truncated\n", face->num_glyphs )); + } + + if ( !error ) + result = (FT_UInt)face->num_glyphs; + + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_load_bitmap( FTC_Family ftcfamily, + FT_UInt gindex, + FTC_Manager manager, + FT_Face *aface ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FT_Size size; + + + error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size ); + if ( !error ) + { + FT_Face face = size->face; + + + error = FT_Load_Glyph( face, gindex, + family->attrs.load_flags | FT_LOAD_RENDER ); + if ( !error ) + *aface = face; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_basic_family_load_glyph( FTC_Family ftcfamily, + FT_UInt gindex, + FTC_Cache cache, + FT_Glyph *aglyph ) + { + FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily; + FT_Error error; + FTC_Scaler scaler = &family->attrs.scaler; + FT_Face face; + FT_Size size; + + + /* we will now load the glyph image */ + error = FTC_Manager_LookupSize( cache->manager, + scaler, + &size ); + if ( !error ) + { + face = size->face; + + error = FT_Load_Glyph( face, gindex, family->attrs.load_flags ); + if ( !error ) + { + if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP || + face->glyph->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* ok, copy it */ + FT_Glyph glyph; + + + error = FT_Get_Glyph( face->glyph, &glyph ); + if ( !error ) + { + *aglyph = glyph; + goto Exit; + } + } + else + error = FTC_Err_Invalid_Argument; + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_basic_gnode_compare_faceid( FTC_Node ftcgnode, + FT_Pointer ftcface_id, + FTC_Cache cache ) + { + FTC_GNode gnode = (FTC_GNode)ftcgnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FTC_BasicFamily family = (FTC_BasicFamily)gnode->family; + FT_Bool result; + + + result = FT_BOOL( family->attrs.scaler.face_id == face_id ); + if ( result ) + { + /* we must call this function to avoid this node from appearing + * in later lookups with the same face_id! + */ + FTC_GNode_UnselectFamily( gnode, cache ); + } + return result; + } + + + /* + * + * basic image cache + * + */ + + FT_CALLBACK_TABLE_DEF + const FTC_IFamilyClassRec ftc_basic_image_family_class = + { + { + sizeof ( FTC_BasicFamilyRec ), + ftc_basic_family_compare, + ftc_basic_family_init, + 0, /* FTC_MruNode_ResetFunc */ + 0 /* FTC_MruNode_DoneFunc */ + }, + ftc_basic_family_load_glyph + }; + + + FT_CALLBACK_TABLE_DEF + const FTC_GCacheClassRec ftc_basic_image_cache_class = + { + { + ftc_inode_new, + ftc_inode_weight, + ftc_gnode_compare, + ftc_basic_gnode_compare_faceid, + ftc_inode_free, + + sizeof ( FTC_GCacheRec ), + ftc_gcache_init, + ftc_gcache_done + }, + (FTC_MruListClass)&ftc_basic_image_family_class + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ) + { + return FTC_GCache_New( manager, &ftc_basic_image_cache_class, + (FTC_GCache*)acache ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ) + { + FTC_BasicQueryRec query; + FTC_Node node = 0; /* make compiler happy */ + FT_Error error; + FT_UInt32 hash; + + + /* some argument checks are delayed to FTC_Cache_Lookup */ + if ( !aglyph ) + { + error = FTC_Err_Invalid_Argument; + goto Exit; + } + + *aglyph = NULL; + if ( anode ) + *anode = NULL; + +#if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU ) + + /* + * This one is a major hack used to detect whether we are passed a + * regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one. + */ + if ( (FT_ULong)type->width >= 0x10000L ) + { + FTC_OldImageDesc desc = (FTC_OldImageDesc)type; + + + query.attrs.scaler.face_id = desc->font.face_id; + query.attrs.scaler.width = desc->font.pix_width; + query.attrs.scaler.height = desc->font.pix_height; + query.attrs.load_flags = desc->flags; + } + else + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + { + if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX ) + { + FT_TRACE1(( "FTC_ImageCache_Lookup: higher bits in load_flags" )); + FT_TRACE1(( "0x%x are dropped\n", (type->flags & ~((FT_ULong)FT_UINT_MAX)) )); + } + + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.load_flags = (FT_UInt)type->flags; + } + + query.attrs.scaler.pixel = 1; + query.attrs.scaler.x_res = 0; /* make compilers happy */ + query.attrs.scaler.y_res = 0; + + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; + +#if 1 /* inlining is about 50% faster! */ + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_GNode_Compare, + hash, gindex, + &query, + node, + error ); +#else + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), + hash, gindex, + FTC_GQUERY( &query ), + &node ); +#endif + if ( !error ) + { + *aglyph = FTC_INODE( node )->glyph; + + if ( anode ) + { + *anode = node; + node->ref_count++; + } + } + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ) + { + FTC_BasicQueryRec query; + FTC_Node node = 0; /* make compiler happy */ + FT_Error error; + FT_UInt32 hash; + + + /* some argument checks are delayed to FTC_Cache_Lookup */ + if ( !aglyph || !scaler ) + { + error = FTC_Err_Invalid_Argument; + goto Exit; + } + + *aglyph = NULL; + if ( anode ) + *anode = NULL; + + /* FT_Load_Glyph(), FT_Load_Char() take FT_UInt flags */ + if ( load_flags > FT_UINT_MAX ) + { + FT_TRACE1(( "FTC_ImageCache_LookupScaler: higher bits in load_flags" )); + FT_TRACE1(( "0x%x are dropped\n", (load_flags & ~((FT_ULong)FT_UINT_MAX)) )); + } + + query.attrs.scaler = scaler[0]; + query.attrs.load_flags = (FT_UInt)load_flags; + + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex; + + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_GNode_Compare, + hash, gindex, + &query, + node, + error ); + if ( !error ) + { + *aglyph = FTC_INODE( node )->glyph; + + if ( anode ) + { + *anode = node; + node->ref_count++; + } + } + + Exit: + return error; + } + + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* yet another backwards-legacy structure */ + typedef struct FTC_OldImage_Desc_ + { + FTC_FontRec font; + FT_UInt image_type; + + } FTC_OldImage_Desc; + + +#define FTC_OLD_IMAGE_FORMAT( x ) ( (x) & 7 ) + + +#define ftc_old_image_format_bitmap 0x0000 +#define ftc_old_image_format_outline 0x0001 + +#define ftc_old_image_format_mask 0x000F + +#define ftc_old_image_flag_monochrome 0x0010 +#define ftc_old_image_flag_unhinted 0x0020 +#define ftc_old_image_flag_autohinted 0x0040 +#define ftc_old_image_flag_unscaled 0x0080 +#define ftc_old_image_flag_no_sbits 0x0100 + + /* monochrome bitmap */ +#define ftc_old_image_mono ftc_old_image_format_bitmap | \ + ftc_old_image_flag_monochrome + + /* anti-aliased bitmap */ +#define ftc_old_image_grays ftc_old_image_format_bitmap + + /* scaled outline */ +#define ftc_old_image_outline ftc_old_image_format_outline + + + static void + ftc_image_type_from_old_desc( FTC_ImageType typ, + FTC_OldImage_Desc* desc ) + { + typ->face_id = desc->font.face_id; + typ->width = desc->font.pix_width; + typ->height = desc->font.pix_height; + + /* convert image type flags to load flags */ + { + FT_UInt load_flags = FT_LOAD_DEFAULT; + FT_UInt type = desc->image_type; + + + /* determine load flags, depending on the font description's */ + /* image type */ + + if ( FTC_OLD_IMAGE_FORMAT( type ) == ftc_old_image_format_bitmap ) + { + if ( type & ftc_old_image_flag_monochrome ) + load_flags |= FT_LOAD_MONOCHROME; + + /* disable embedded bitmaps loading if necessary */ + if ( type & ftc_old_image_flag_no_sbits ) + load_flags |= FT_LOAD_NO_BITMAP; + } + else + { + /* we want an outline, don't load embedded bitmaps */ + load_flags |= FT_LOAD_NO_BITMAP; + + if ( type & ftc_old_image_flag_unscaled ) + load_flags |= FT_LOAD_NO_SCALE; + } + + /* always render glyphs to bitmaps */ + load_flags |= FT_LOAD_RENDER; + + if ( type & ftc_old_image_flag_unhinted ) + load_flags |= FT_LOAD_NO_HINTING; + + if ( type & ftc_old_image_flag_autohinted ) + load_flags |= FT_LOAD_FORCE_AUTOHINT; + + typ->flags = load_flags; + } + } + + + FT_EXPORT( FT_Error ) + FTC_Image_Cache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + FT_EXPORT( FT_Error ) + FTC_Image_Cache_Lookup( FTC_ImageCache icache, + FTC_OldImage_Desc* desc, + FT_UInt gindex, + FT_Glyph *aglyph ); + + + FT_EXPORT_DEF( FT_Error ) + FTC_Image_Cache_New( FTC_Manager manager, + FTC_ImageCache *acache ) + { + return FTC_ImageCache_New( manager, (FTC_ImageCache*)acache ); + } + + + + FT_EXPORT_DEF( FT_Error ) + FTC_Image_Cache_Lookup( FTC_ImageCache icache, + FTC_OldImage_Desc* desc, + FT_UInt gindex, + FT_Glyph *aglyph ) + { + FTC_ImageTypeRec type0; + + + if ( !desc ) + return FTC_Err_Invalid_Argument; + + ftc_image_type_from_old_desc( &type0, desc ); + + return FTC_ImageCache_Lookup( (FTC_ImageCache)icache, + &type0, + gindex, + aglyph, + NULL ); + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* + * + * basic small bitmap cache + * + */ + + + FT_CALLBACK_TABLE_DEF + const FTC_SFamilyClassRec ftc_basic_sbit_family_class = + { + { + sizeof( FTC_BasicFamilyRec ), + ftc_basic_family_compare, + ftc_basic_family_init, + 0, /* FTC_MruNode_ResetFunc */ + 0 /* FTC_MruNode_DoneFunc */ + }, + ftc_basic_family_get_count, + ftc_basic_family_load_bitmap + }; + + + FT_CALLBACK_TABLE_DEF + const FTC_GCacheClassRec ftc_basic_sbit_cache_class = + { + { + ftc_snode_new, + ftc_snode_weight, + ftc_snode_compare, + ftc_basic_gnode_compare_faceid, + ftc_snode_free, + + sizeof ( FTC_GCacheRec ), + ftc_gcache_init, + ftc_gcache_done + }, + (FTC_MruListClass)&ftc_basic_sbit_family_class + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ) + { + return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class, + (FTC_GCache*)acache ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *ansbit, + FTC_Node *anode ) + { + FT_Error error; + FTC_BasicQueryRec query; + FTC_Node node = 0; /* make compiler happy */ + FT_UInt32 hash; + + + if ( anode ) + *anode = NULL; + + /* other argument checks delayed to FTC_Cache_Lookup */ + if ( !ansbit ) + return FTC_Err_Invalid_Argument; + + *ansbit = NULL; + +#if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU ) + + /* This one is a major hack used to detect whether we are passed a + * regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one. + */ + if ( (FT_ULong)type->width >= 0x10000L ) + { + FTC_OldImageDesc desc = (FTC_OldImageDesc)type; + + + query.attrs.scaler.face_id = desc->font.face_id; + query.attrs.scaler.width = desc->font.pix_width; + query.attrs.scaler.height = desc->font.pix_height; + query.attrs.load_flags = desc->flags; + } + else + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + { + if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX ) + { + FT_TRACE1(( "FTC_ImageCache_Lookup: higher bits in load_flags" )); + FT_TRACE1(( "0x%x are dropped\n", (type->flags & ~((FT_ULong)FT_UINT_MAX)) )); + } + + query.attrs.scaler.face_id = type->face_id; + query.attrs.scaler.width = type->width; + query.attrs.scaler.height = type->height; + query.attrs.load_flags = (FT_UInt)type->flags; + } + + query.attrs.scaler.pixel = 1; + query.attrs.scaler.x_res = 0; /* make compilers happy */ + query.attrs.scaler.y_res = 0; + + /* beware, the hash must be the same for all glyph ranges! */ + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + + gindex / FTC_SBIT_ITEMS_PER_NODE; + +#if 1 /* inlining is about 50% faster! */ + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_SNode_Compare, + hash, gindex, + &query, + node, + error ); +#else + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), + hash, + gindex, + FTC_GQUERY( &query ), + &node ); +#endif + if ( error ) + goto Exit; + + *ansbit = FTC_SNODE( node )->sbits + + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = node; + node->ref_count++; + } + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *ansbit, + FTC_Node *anode ) + { + FT_Error error; + FTC_BasicQueryRec query; + FTC_Node node = 0; /* make compiler happy */ + FT_UInt32 hash; + + + if ( anode ) + *anode = NULL; + + /* other argument checks delayed to FTC_Cache_Lookup */ + if ( !ansbit || !scaler ) + return FTC_Err_Invalid_Argument; + + *ansbit = NULL; + + /* FT_Load_Glyph(), FT_Load_Char() take FT_UInt flags */ + if ( load_flags > FT_UINT_MAX ) + { + FT_TRACE1(( "FTC_ImageCache_LookupScaler: higher bits in load_flags" )); + FT_TRACE1(( "0x%x are dropped\n", (load_flags & ~((FT_ULong)FT_UINT_MAX)) )); + } + + query.attrs.scaler = scaler[0]; + query.attrs.load_flags = (FT_UInt)load_flags; + + /* beware, the hash must be the same for all glyph ranges! */ + hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + + gindex / FTC_SBIT_ITEMS_PER_NODE; + + FTC_GCACHE_LOOKUP_CMP( cache, + ftc_basic_family_compare, + FTC_SNode_Compare, + hash, gindex, + &query, + node, + error ); + if ( error ) + goto Exit; + + *ansbit = FTC_SNODE( node )->sbits + + ( gindex - FTC_GNODE( node )->gindex ); + + if ( anode ) + { + *anode = node; + node->ref_count++; + } + + Exit: + return error; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_EXPORT( FT_Error ) + FTC_SBit_Cache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + FT_EXPORT( FT_Error ) + FTC_SBit_Cache_Lookup( FTC_SBitCache cache, + FTC_OldImage_Desc* desc, + FT_UInt gindex, + FTC_SBit *ansbit ); + + + FT_EXPORT_DEF( FT_Error ) + FTC_SBit_Cache_New( FTC_Manager manager, + FTC_SBitCache *acache ) + { + return FTC_SBitCache_New( manager, (FTC_SBitCache*)acache ); + } + + + FT_EXPORT_DEF( FT_Error ) + FTC_SBit_Cache_Lookup( FTC_SBitCache cache, + FTC_OldImage_Desc* desc, + FT_UInt gindex, + FTC_SBit *ansbit ) + { + FTC_ImageTypeRec type0; + + + if ( !desc ) + return FT_Err_Invalid_Argument; + + ftc_image_type_from_old_desc( &type0, desc ); + + return FTC_SBitCache_Lookup( (FTC_SBitCache)cache, + &type0, + gindex, + ansbit, + NULL ); + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftccache.c b/alienblaster/project/jni/freetype/src/cache/ftccache.c new file mode 100644 index 000000000..463addd99 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftccache.c @@ -0,0 +1,595 @@ +/***************************************************************************/ +/* */ +/* ftccache.c */ +/* */ +/* The FreeType internal cache interface (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "ftcmanag.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +#include "ftccback.h" +#include "ftcerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_cache + + +#define FTC_HASH_MAX_LOAD 2 +#define FTC_HASH_MIN_LOAD 1 +#define FTC_HASH_SUB_LOAD ( FTC_HASH_MAX_LOAD - FTC_HASH_MIN_LOAD ) + +/* this one _must_ be a power of 2! */ +#define FTC_HASH_INITIAL_SIZE 8 + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE NODE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* add a new node to the head of the manager's circular MRU list */ + static void + ftc_node_mru_link( FTC_Node node, + FTC_Manager manager ) + { + void *nl = &manager->nodes_list; + + + FTC_MruNode_Prepend( (FTC_MruNode*)nl, + (FTC_MruNode)node ); + manager->num_nodes++; + } + + + /* remove a node from the manager's MRU list */ + static void + ftc_node_mru_unlink( FTC_Node node, + FTC_Manager manager ) + { + void *nl = &manager->nodes_list; + + + FTC_MruNode_Remove( (FTC_MruNode*)nl, + (FTC_MruNode)node ); + manager->num_nodes--; + } + + +#ifndef FTC_INLINE + + /* move a node to the head of the manager's MRU list */ + static void + ftc_node_mru_up( FTC_Node node, + FTC_Manager manager ) + { + FTC_MruNode_Up( (FTC_MruNode*)&manager->nodes_list, + (FTC_MruNode)node ); + } + +#endif /* !FTC_INLINE */ + + + /* Note that this function cannot fail. If we cannot re-size the + * buckets array appropriately, we simply degrade the hash table's + * performance! + */ + static void + ftc_cache_resize( FTC_Cache cache ) + { + for (;;) + { + FTC_Node node, *pnode; + FT_UFast p = cache->p; + FT_UFast mask = cache->mask; + FT_UFast count = mask + p + 1; /* number of buckets */ + + + /* do we need to shrink the buckets array? */ + if ( cache->slack < 0 ) + { + FTC_Node new_list = NULL; + + + /* try to expand the buckets array _before_ splitting + * the bucket lists + */ + if ( p >= mask ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + /* if we can't expand the array, leave immediately */ + if ( FT_RENEW_ARRAY( cache->buckets, (mask+1)*2, (mask+1)*4 ) ) + break; + } + + /* split a single bucket */ + pnode = cache->buckets + p; + + for (;;) + { + node = *pnode; + if ( node == NULL ) + break; + + if ( node->hash & ( mask + 1 ) ) + { + *pnode = node->link; + node->link = new_list; + new_list = node; + } + else + pnode = &node->link; + } + + cache->buckets[p + mask + 1] = new_list; + + cache->slack += FTC_HASH_MAX_LOAD; + + if ( p >= mask ) + { + cache->mask = 2 * mask + 1; + cache->p = 0; + } + else + cache->p = p + 1; + } + + /* do we need to expand the buckets array? */ + else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD ) + { + FT_UFast old_index = p + mask; + FTC_Node* pold; + + + if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE ) + break; + + if ( p == 0 ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + /* if we can't shrink the array, leave immediately */ + if ( FT_RENEW_ARRAY( cache->buckets, + ( mask + 1 ) * 2, mask + 1 ) ) + break; + + cache->mask >>= 1; + p = cache->mask; + } + else + p--; + + pnode = cache->buckets + p; + while ( *pnode ) + pnode = &(*pnode)->link; + + pold = cache->buckets + old_index; + *pnode = *pold; + *pold = NULL; + + cache->slack -= FTC_HASH_MAX_LOAD; + cache->p = p; + } + else /* the hash table is balanced */ + break; + } + } + + + /* remove a node from its cache's hash table */ + static void + ftc_node_hash_unlink( FTC_Node node0, + FTC_Cache cache ) + { + FTC_Node *pnode; + FT_UInt idx; + + + idx = (FT_UInt)( node0->hash & cache->mask ); + if ( idx < cache->p ) + idx = (FT_UInt)( node0->hash & ( 2 * cache->mask + 1 ) ); + + pnode = cache->buckets + idx; + + for (;;) + { + FTC_Node node = *pnode; + + + if ( node == NULL ) + { + FT_TRACE0(( "ftc_node_hash_unlink: unknown node\n" )); + return; + } + + if ( node == node0 ) + break; + + pnode = &(*pnode)->link; + } + + *pnode = node0->link; + node0->link = NULL; + + cache->slack++; + ftc_cache_resize( cache ); + } + + + /* add a node to the `top' of its cache's hash table */ + static void + ftc_node_hash_link( FTC_Node node, + FTC_Cache cache ) + { + FTC_Node *pnode; + FT_UInt idx; + + + idx = (FT_UInt)( node->hash & cache->mask ); + if ( idx < cache->p ) + idx = (FT_UInt)( node->hash & (2 * cache->mask + 1 ) ); + + pnode = cache->buckets + idx; + + node->link = *pnode; + *pnode = node; + + cache->slack--; + ftc_cache_resize( cache ); + } + + + /* remove a node from the cache manager */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_BASE_DEF( void ) +#else + FT_LOCAL_DEF( void ) +#endif + ftc_node_destroy( FTC_Node node, + FTC_Manager manager ) + { + FTC_Cache cache; + + +#ifdef FT_DEBUG_ERROR + /* find node's cache */ + if ( node->cache_index >= manager->num_caches ) + { + FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" )); + return; + } +#endif + + cache = manager->caches[node->cache_index]; + +#ifdef FT_DEBUG_ERROR + if ( cache == NULL ) + { + FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" )); + return; + } +#endif + + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + + /* remove node from mru list */ + ftc_node_mru_unlink( node, manager ); + + /* remove node from cache's hash table */ + ftc_node_hash_unlink( node, cache ); + + /* now finalize it */ + cache->clazz.node_free( node, cache ); + +#if 0 + /* check, just in case of general corruption :-) */ + if ( manager->num_nodes == 0 ) + FT_TRACE0(( "ftc_node_destroy: invalid cache node count (%d)\n", + manager->num_nodes )); +#endif + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** ABSTRACT CACHE CLASS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_Init( FTC_Cache cache ) + { + return ftc_cache_init( cache ); + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_cache_init( FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + + + cache->p = 0; + cache->mask = FTC_HASH_INITIAL_SIZE - 1; + cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD; + + (void)FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 ); + return error; + } + + + static void + FTC_Cache_Clear( FTC_Cache cache ) + { + if ( cache ) + { + FTC_Manager manager = cache->manager; + FT_UFast i; + FT_UFast count; + + + count = cache->p + cache->mask + 1; + + for ( i = 0; i < count; i++ ) + { + FTC_Node *pnode = cache->buckets + i, next, node = *pnode; + + + while ( node ) + { + next = node->link; + node->link = NULL; + + /* remove node from mru list */ + ftc_node_mru_unlink( node, manager ); + + /* now finalize it */ + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + + cache->clazz.node_free( node, cache ); + node = next; + } + cache->buckets[i] = NULL; + } + ftc_cache_resize( cache ); + } + } + + + FT_LOCAL_DEF( void ) + ftc_cache_done( FTC_Cache cache ) + { + if ( cache->memory ) + { + FT_Memory memory = cache->memory; + + + FTC_Cache_Clear( cache ); + + FT_FREE( cache->buckets ); + cache->mask = 0; + cache->p = 0; + cache->slack = 0; + + cache->memory = NULL; + } + } + + + FT_LOCAL_DEF( void ) + FTC_Cache_Done( FTC_Cache cache ) + { + ftc_cache_done( cache ); + } + + + static void + ftc_cache_add( FTC_Cache cache, + FT_UInt32 hash, + FTC_Node node ) + { + node->hash = hash; + node->cache_index = (FT_UInt16) cache->index; + node->ref_count = 0; + + ftc_node_hash_link( node, cache ); + ftc_node_mru_link( node, cache->manager ); + + { + FTC_Manager manager = cache->manager; + + + manager->cur_weight += cache->clazz.node_weight( node, cache ); + + if ( manager->cur_weight >= manager->max_weight ) + { + node->ref_count++; + FTC_Manager_Compress( manager ); + node->ref_count--; + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_NewNode( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ) + { + FT_Error error; + FTC_Node node; + + + /* + * We use the FTC_CACHE_TRYLOOP macros to support out-of-memory + * errors (OOM) correctly, i.e., by flushing the cache progressively + * in order to make more room. + */ + + FTC_CACHE_TRYLOOP( cache ) + { + error = cache->clazz.node_new( &node, query, cache ); + } + FTC_CACHE_TRYLOOP_END(); + + if ( error ) + node = NULL; + else + { + /* don't assume that the cache has the same number of buckets, since + * our allocation request might have triggered global cache flushing + */ + ftc_cache_add( cache, hash, node ); + } + + *anode = node; + return error; + } + + +#ifndef FTC_INLINE + + FT_LOCAL_DEF( FT_Error ) + FTC_Cache_Lookup( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ) + { + FT_UFast idx; + FTC_Node* bucket; + FTC_Node* pnode; + FTC_Node node; + FT_Error error = 0; + + FTC_Node_CompareFunc compare = cache->clazz.node_compare; + + + if ( cache == NULL || anode == NULL ) + return FT_Err_Invalid_Argument; + + idx = hash & cache->mask; + if ( idx < cache->p ) + idx = hash & ( cache->mask * 2 + 1 ); + + bucket = cache->buckets + idx; + pnode = bucket; + for (;;) + { + node = *pnode; + if ( node == NULL ) + goto NewNode; + + if ( node->hash == hash && compare( node, query, cache ) ) + break; + + pnode = &node->link; + } + + if ( node != *bucket ) + { + *pnode = node->link; + node->link = *bucket; + *bucket = node; + } + + /* move to head of MRU list */ + { + FTC_Manager manager = cache->manager; + + + if ( node != manager->nodes_list ) + ftc_node_mru_up( node, manager ); + } + *anode = node; + return error; + + NewNode: + return FTC_Cache_NewNode( cache, hash, query, anode ); + } + +#endif /* !FTC_INLINE */ + + + FT_LOCAL_DEF( void ) + FTC_Cache_RemoveFaceID( FTC_Cache cache, + FTC_FaceID face_id ) + { + FT_UFast i, count; + FTC_Manager manager = cache->manager; + FTC_Node frees = NULL; + + + count = cache->p + cache->mask; + for ( i = 0; i < count; i++ ) + { + FTC_Node* bucket = cache->buckets + i; + FTC_Node* pnode = bucket; + + + for ( ;; ) + { + FTC_Node node = *pnode; + + + if ( node == NULL ) + break; + + if ( cache->clazz.node_remove_faceid( node, face_id, cache ) ) + { + *pnode = node->link; + node->link = frees; + frees = node; + } + else + pnode = &node->link; + } + } + + /* remove all nodes in the free list */ + while ( frees ) + { + FTC_Node node; + + + node = frees; + frees = node->link; + + manager->cur_weight -= cache->clazz.node_weight( node, cache ); + ftc_node_mru_unlink( node, manager ); + + cache->clazz.node_free( node, cache ); + + cache->slack++; + } + + ftc_cache_resize( cache ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftccache.h b/alienblaster/project/jni/freetype/src/cache/ftccache.h new file mode 100644 index 000000000..2082bc4f4 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftccache.h @@ -0,0 +1,316 @@ +/***************************************************************************/ +/* */ +/* ftccache.h */ +/* */ +/* FreeType internal cache interface (specification). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCCACHE_H__ +#define __FTCCACHE_H__ + + +#include "ftcmru.h" + +FT_BEGIN_HEADER + + /* handle to cache object */ + typedef struct FTC_CacheRec_* FTC_Cache; + + /* handle to cache class */ + typedef const struct FTC_CacheClassRec_* FTC_CacheClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE NODE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Each cache controls one or more cache nodes. Each node is part of */ + /* the global_lru list of the manager. Its `data' field however is used */ + /* as a reference count for now. */ + /* */ + /* A node can be anything, depending on the type of information held by */ + /* the cache. It can be an individual glyph image, a set of bitmaps */ + /* glyphs for a given size, some metrics, etc. */ + /* */ + /*************************************************************************/ + + /* structure size should be 20 bytes on 32-bits machines */ + typedef struct FTC_NodeRec_ + { + FTC_MruNodeRec mru; /* circular mru list pointer */ + FTC_Node link; /* used for hashing */ + FT_UInt32 hash; /* used for hashing too */ + FT_UShort cache_index; /* index of cache the node belongs to */ + FT_Short ref_count; /* reference count for this node */ + + } FTC_NodeRec; + + +#define FTC_NODE( x ) ( (FTC_Node)(x) ) +#define FTC_NODE_P( x ) ( (FTC_Node*)(x) ) + +#define FTC_NODE__NEXT( x ) FTC_NODE( (x)->mru.next ) +#define FTC_NODE__PREV( x ) FTC_NODE( (x)->mru.prev ) + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_BASE( void ) + ftc_node_destroy( FTC_Node node, + FTC_Manager manager ); +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* initialize a new cache node */ + typedef FT_Error + (*FTC_Node_NewFunc)( FTC_Node *pnode, + FT_Pointer query, + FTC_Cache cache ); + + typedef FT_Offset + (*FTC_Node_WeightFunc)( FTC_Node node, + FTC_Cache cache ); + + /* compare a node to a given key pair */ + typedef FT_Bool + (*FTC_Node_CompareFunc)( FTC_Node node, + FT_Pointer key, + FTC_Cache cache ); + + + typedef void + (*FTC_Node_FreeFunc)( FTC_Node node, + FTC_Cache cache ); + + typedef FT_Error + (*FTC_Cache_InitFunc)( FTC_Cache cache ); + + typedef void + (*FTC_Cache_DoneFunc)( FTC_Cache cache ); + + + typedef struct FTC_CacheClassRec_ + { + FTC_Node_NewFunc node_new; + FTC_Node_WeightFunc node_weight; + FTC_Node_CompareFunc node_compare; + FTC_Node_CompareFunc node_remove_faceid; + FTC_Node_FreeFunc node_free; + + FT_Offset cache_size; + FTC_Cache_InitFunc cache_init; + FTC_Cache_DoneFunc cache_done; + + } FTC_CacheClassRec; + + + /* each cache really implements a dynamic hash table to manage its nodes */ + typedef struct FTC_CacheRec_ + { + FT_UFast p; + FT_UFast mask; + FT_Long slack; + FTC_Node* buckets; + + FTC_CacheClassRec clazz; /* local copy, for speed */ + + FTC_Manager manager; + FT_Memory memory; + FT_UInt index; /* in manager's table */ + + FTC_CacheClass org_class; /* original class pointer */ + + } FTC_CacheRec; + + +#define FTC_CACHE( x ) ( (FTC_Cache)(x) ) +#define FTC_CACHE_P( x ) ( (FTC_Cache*)(x) ) + + + /* default cache initialize */ + FT_LOCAL( FT_Error ) + FTC_Cache_Init( FTC_Cache cache ); + + /* default cache finalizer */ + FT_LOCAL( void ) + FTC_Cache_Done( FTC_Cache cache ); + + /* Call this function to lookup the cache. If no corresponding + * node is found, a new one is automatically created. This function + * is capable of flushing the cache adequately to make room for the + * new cache object. + */ + +#ifndef FTC_INLINE + FT_LOCAL( FT_Error ) + FTC_Cache_Lookup( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ); +#endif + + FT_LOCAL( FT_Error ) + FTC_Cache_NewNode( FTC_Cache cache, + FT_UInt32 hash, + FT_Pointer query, + FTC_Node *anode ); + + /* Remove all nodes that relate to a given face_id. This is useful + * when un-installing fonts. Note that if a cache node relates to + * the face_id, but is locked (i.e., has `ref_count > 0'), the node + * will _not_ be destroyed, but its internal face_id reference will + * be modified. + * + * The final result will be that the node will never come back + * in further lookup requests, and will be flushed on demand from + * the cache normally when its reference count reaches 0. + */ + FT_LOCAL( void ) + FTC_Cache_RemoveFaceID( FTC_Cache cache, + FTC_FaceID face_id ); + + +#ifdef FTC_INLINE + +#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ + FT_BEGIN_STMNT \ + FTC_Node *_bucket, *_pnode, _node; \ + FTC_Cache _cache = FTC_CACHE(cache); \ + FT_UInt32 _hash = (FT_UInt32)(hash); \ + FTC_Node_CompareFunc _nodcomp = (FTC_Node_CompareFunc)(nodecmp); \ + FT_UFast _idx; \ + \ + \ + error = 0; \ + node = NULL; \ + _idx = _hash & _cache->mask; \ + if ( _idx < _cache->p ) \ + _idx = _hash & ( _cache->mask*2 + 1 ); \ + \ + _bucket = _pnode = _cache->buckets + _idx; \ + for (;;) \ + { \ + _node = *_pnode; \ + if ( _node == NULL ) \ + goto _NewNode; \ + \ + if ( _node->hash == _hash && _nodcomp( _node, query, _cache ) ) \ + break; \ + \ + _pnode = &_node->link; \ + } \ + \ + if ( _node != *_bucket ) \ + { \ + *_pnode = _node->link; \ + _node->link = *_bucket; \ + *_bucket = _node; \ + } \ + \ + { \ + FTC_Manager _manager = _cache->manager; \ + void* _nl = &_manager->nodes_list; \ + \ + \ + if ( _node != _manager->nodes_list ) \ + FTC_MruNode_Up( (FTC_MruNode*)_nl, \ + (FTC_MruNode)_node ); \ + } \ + goto _Ok; \ + \ + _NewNode: \ + error = FTC_Cache_NewNode( _cache, _hash, query, &_node ); \ + \ + _Ok: \ + node = _node; \ + FT_END_STMNT + +#else /* !FTC_INLINE */ + +#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \ + FT_BEGIN_STMNT \ + error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, \ + (FTC_Node*)&(node) ); \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ + + + /* + * This macro, together with FTC_CACHE_TRYLOOP_END, defines a retry + * loop to flush the cache repeatedly in case of memory overflows. + * + * It is used when creating a new cache node, or within a lookup + * that needs to allocate data (e.g., the sbit cache lookup). + * + * Example: + * + * { + * FTC_CACHE_TRYLOOP( cache ) + * error = load_data( ... ); + * FTC_CACHE_TRYLOOP_END() + * } + * + */ +#define FTC_CACHE_TRYLOOP( cache ) \ + { \ + FTC_Manager _try_manager = FTC_CACHE( cache )->manager; \ + FT_UInt _try_count = 4; \ + \ + \ + for (;;) \ + { \ + FT_UInt _try_done; + + +#define FTC_CACHE_TRYLOOP_END() \ + if ( !error || error != FT_Err_Out_Of_Memory ) \ + break; \ + \ + _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \ + if ( _try_done == 0 ) \ + break; \ + \ + if ( _try_done == _try_count ) \ + { \ + _try_count *= 2; \ + if ( _try_count < _try_done || \ + _try_count > _try_manager->num_nodes ) \ + _try_count = _try_manager->num_nodes; \ + } \ + } \ + } + + /* */ + +FT_END_HEADER + + +#endif /* __FTCCACHE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftccback.h b/alienblaster/project/jni/freetype/src/cache/ftccback.h new file mode 100644 index 000000000..4d0818db2 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftccback.h @@ -0,0 +1,90 @@ +/***************************************************************************/ +/* */ +/* ftccback.h */ +/* */ +/* Callback functions of the caching sub-system (specification only). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FTCCBACK_H__ +#define __FTCCBACK_H__ + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcmru.h" +#include "ftcimage.h" +#include "ftcmanag.h" +#include "ftcglyph.h" +#include "ftcsbits.h" + + + FT_LOCAL( void ) + ftc_inode_free( FTC_Node inode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_inode_new( FTC_Node *pinode, + FT_Pointer gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_Offset ) + ftc_inode_weight( FTC_Node inode, + FTC_Cache cache ); + + + FT_LOCAL( void ) + ftc_snode_free( FTC_Node snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_snode_new( FTC_Node *psnode, + FT_Pointer gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_Offset ) + ftc_snode_weight( FTC_Node snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Bool ) + ftc_snode_compare( FTC_Node snode, + FT_Pointer gquery, + FTC_Cache cache ); + + + FT_LOCAL( FT_Bool ) + ftc_gnode_compare( FTC_Node gnode, + FT_Pointer gquery, + FTC_Cache cache ); + + + FT_LOCAL( FT_Error ) + ftc_gcache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_gcache_done( FTC_Cache cache ); + + + FT_LOCAL( FT_Error ) + ftc_cache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_cache_done( FTC_Cache cache ); + +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + FT_LOCAL( void ) + ftc_node_destroy( FTC_Node node, + FTC_Manager manager ); +#endif + +#endif /* __FTCCBACK_H__ */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftccmap.c b/alienblaster/project/jni/freetype/src/cache/ftccmap.c new file mode 100644 index 000000000..a802b0557 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftccmap.c @@ -0,0 +1,431 @@ +/***************************************************************************/ +/* */ +/* ftccmap.c */ +/* */ +/* FreeType CharMap cache (body) */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_CACHE_H +#include "ftcmanag.h" +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_DEBUG_H + +#include "ftccback.h" +#include "ftcerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_cache + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + typedef enum FTC_OldCMapType_ + { + FTC_OLD_CMAP_BY_INDEX = 0, + FTC_OLD_CMAP_BY_ENCODING = 1, + FTC_OLD_CMAP_BY_ID = 2 + + } FTC_OldCMapType; + + + typedef struct FTC_OldCMapIdRec_ + { + FT_UInt platform; + FT_UInt encoding; + + } FTC_OldCMapIdRec, *FTC_OldCMapId; + + + typedef struct FTC_OldCMapDescRec_ + { + FTC_FaceID face_id; + FTC_OldCMapType type; + + union + { + FT_UInt index; + FT_Encoding encoding; + FTC_OldCMapIdRec id; + + } u; + + } FTC_OldCMapDescRec, *FTC_OldCMapDesc; + +#endif /* FT_CONFIG_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* Each FTC_CMapNode contains a simple array to map a range of character */ + /* codes to equivalent glyph indices. */ + /* */ + /* For now, the implementation is very basic: Each node maps a range of */ + /* 128 consecutive character codes to their corresponding glyph indices. */ + /* */ + /* We could do more complex things, but I don't think it is really very */ + /* useful. */ + /* */ + /*************************************************************************/ + + + /* number of glyph indices / character code per node */ +#define FTC_CMAP_INDICES_MAX 128 + + /* compute a query/node hash */ +#define FTC_CMAP_HASH( faceid, index, charcode ) \ + ( FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \ + ( (charcode) / FTC_CMAP_INDICES_MAX ) ) + + /* the charmap query */ + typedef struct FTC_CMapQueryRec_ + { + FTC_FaceID face_id; + FT_UInt cmap_index; + FT_UInt32 char_code; + + } FTC_CMapQueryRec, *FTC_CMapQuery; + +#define FTC_CMAP_QUERY( x ) ((FTC_CMapQuery)(x)) +#define FTC_CMAP_QUERY_HASH( x ) \ + FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->char_code ) + + /* the cmap cache node */ + typedef struct FTC_CMapNodeRec_ + { + FTC_NodeRec node; + FTC_FaceID face_id; + FT_UInt cmap_index; + FT_UInt32 first; /* first character in node */ + FT_UInt16 indices[FTC_CMAP_INDICES_MAX]; /* array of glyph indices */ + + } FTC_CMapNodeRec, *FTC_CMapNode; + +#define FTC_CMAP_NODE( x ) ( (FTC_CMapNode)( x ) ) +#define FTC_CMAP_NODE_HASH( x ) \ + FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->first ) + + /* if (indices[n] == FTC_CMAP_UNKNOWN), we assume that the corresponding */ + /* glyph indices haven't been queried through FT_Get_Glyph_Index() yet */ +#define FTC_CMAP_UNKNOWN ( (FT_UInt16)-1 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHARMAP NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( void ) + ftc_cmap_node_free( FTC_Node ftcnode, + FTC_Cache cache ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FT_Memory memory = cache->memory; + + + FT_FREE( node ); + } + + + /* initialize a new cmap node */ + FT_CALLBACK_DEF( FT_Error ) + ftc_cmap_node_new( FTC_Node *ftcanode, + FT_Pointer ftcquery, + FTC_Cache cache ) + { + FTC_CMapNode *anode = (FTC_CMapNode*)ftcanode; + FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; + FT_Error error; + FT_Memory memory = cache->memory; + FTC_CMapNode node; + FT_UInt nn; + + + if ( !FT_NEW( node ) ) + { + node->face_id = query->face_id; + node->cmap_index = query->cmap_index; + node->first = (query->char_code / FTC_CMAP_INDICES_MAX) * + FTC_CMAP_INDICES_MAX; + + for ( nn = 0; nn < FTC_CMAP_INDICES_MAX; nn++ ) + node->indices[nn] = FTC_CMAP_UNKNOWN; + } + + *anode = node; + return error; + } + + + /* compute the weight of a given cmap node */ + FT_CALLBACK_DEF( FT_Offset ) + ftc_cmap_node_weight( FTC_Node cnode, + FTC_Cache cache ) + { + FT_UNUSED( cnode ); + FT_UNUSED( cache ); + + return sizeof ( *cnode ); + } + + + /* compare a cmap node to a given query */ + FT_CALLBACK_DEF( FT_Bool ) + ftc_cmap_node_compare( FTC_Node ftcnode, + FT_Pointer ftcquery, + FTC_Cache cache ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FTC_CMapQuery query = (FTC_CMapQuery)ftcquery; + FT_UNUSED( cache ); + + + if ( node->face_id == query->face_id && + node->cmap_index == query->cmap_index ) + { + FT_UInt32 offset = (FT_UInt32)( query->char_code - node->first ); + + + return FT_BOOL( offset < FTC_CMAP_INDICES_MAX ); + } + + return 0; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_cmap_node_remove_faceid( FTC_Node ftcnode, + FT_Pointer ftcface_id, + FTC_Cache cache ) + { + FTC_CMapNode node = (FTC_CMapNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FT_UNUSED( cache ); + + return FT_BOOL( node->face_id == face_id ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH IMAGE CACHE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE_DEF + const FTC_CacheClassRec ftc_cmap_cache_class = + { + ftc_cmap_node_new, + ftc_cmap_node_weight, + ftc_cmap_node_compare, + ftc_cmap_node_remove_faceid, + ftc_cmap_node_free, + + sizeof ( FTC_CacheRec ), + ftc_cache_init, + ftc_cache_done, + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ) + { + return FTC_Manager_RegisterCache( manager, + &ftc_cmap_cache_class, + FTC_CACHE_P( acache ) ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* + * Unfortunately, it is not possible to support binary backwards + * compatibility in the cmap cache. The FTC_CMapCache_Lookup signature + * changes were too deep, and there is no clever hackish way to detect + * what kind of structure we are being passed. + * + * On the other hand it seems that no production code is using this + * function on Unix distributions. + */ + +#endif + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cmap_cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ) + { + FTC_Cache cache = FTC_CACHE( cmap_cache ); + FTC_CMapQueryRec query; + FTC_Node node; + FT_Error error; + FT_UInt gindex = 0; + FT_UInt32 hash; + FT_Int no_cmap_change = 0; + + + if ( cmap_index < 0 ) + { + /* Treat a negative cmap index as a special value, meaning that you */ + /* don't want to change the FT_Face's character map through this */ + /* call. This can be useful if the face requester callback already */ + /* sets the face's charmap to the appropriate value. */ + + no_cmap_change = 1; + cmap_index = 0; + } + + if ( !cache ) + { + FT_TRACE0(( "FTC_CMapCache_Lookup: bad arguments, returning 0\n" )); + return 0; + } + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* + * Detect a call from a rogue client that thinks it is linking + * to FreeType 2.1.7. This is possible because the third parameter + * is then a character code, and we have never seen any font with + * more than a few charmaps, so if the index is very large... + * + * It is also very unlikely that a rogue client is interested + * in Unicode values 0 to 15. + * + * NOTE: The original threshold was 4, but we found a font from the + * Adobe Acrobat Reader Pack, named `KozMinProVI-Regular.otf', + * which contains more than 5 charmaps. + */ + if ( cmap_index >= 16 && !no_cmap_change ) + { + FTC_OldCMapDesc desc = (FTC_OldCMapDesc) face_id; + + + char_code = (FT_UInt32)cmap_index; + query.face_id = desc->face_id; + + + switch ( desc->type ) + { + case FTC_OLD_CMAP_BY_INDEX: + query.cmap_index = desc->u.index; + query.char_code = (FT_UInt32)cmap_index; + break; + + case FTC_OLD_CMAP_BY_ENCODING: + { + FT_Face face; + + + error = FTC_Manager_LookupFace( cache->manager, desc->face_id, + &face ); + if ( error ) + return 0; + + FT_Select_Charmap( face, desc->u.encoding ); + + return FT_Get_Char_Index( face, char_code ); + } + + default: + return 0; + } + } + else + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + { + query.face_id = face_id; + query.cmap_index = (FT_UInt)cmap_index; + query.char_code = char_code; + } + + hash = FTC_CMAP_HASH( face_id, cmap_index, char_code ); + +#if 1 + FTC_CACHE_LOOKUP_CMP( cache, ftc_cmap_node_compare, hash, &query, + node, error ); +#else + error = FTC_Cache_Lookup( cache, hash, &query, &node ); +#endif + if ( error ) + goto Exit; + + FT_ASSERT( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first ) < + FTC_CMAP_INDICES_MAX ); + + /* something rotten can happen with rogue clients */ + if ( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first >= + FTC_CMAP_INDICES_MAX ) ) + return 0; + + gindex = FTC_CMAP_NODE( node )->indices[char_code - + FTC_CMAP_NODE( node )->first]; + if ( gindex == FTC_CMAP_UNKNOWN ) + { + FT_Face face; + + + gindex = 0; + + error = FTC_Manager_LookupFace( cache->manager, + FTC_CMAP_NODE( node )->face_id, + &face ); + if ( error ) + goto Exit; + + if ( (FT_UInt)cmap_index < (FT_UInt)face->num_charmaps ) + { + FT_CharMap old, cmap = NULL; + + + old = face->charmap; + cmap = face->charmaps[cmap_index]; + + if ( old != cmap && !no_cmap_change ) + FT_Set_Charmap( face, cmap ); + + gindex = FT_Get_Char_Index( face, char_code ); + + if ( old != cmap && !no_cmap_change ) + FT_Set_Charmap( face, old ); + } + + FTC_CMAP_NODE( node )->indices[char_code - + FTC_CMAP_NODE( node )->first] + = (FT_UShort)gindex; + } + + Exit: + return gindex; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcerror.h b/alienblaster/project/jni/freetype/src/cache/ftcerror.h new file mode 100644 index 000000000..5998d42da --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcerror.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* ftcerror.h */ +/* */ +/* Caching sub-system error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the caching sub-system error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __FTCERROR_H__ +#define __FTCERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX FTC_Err_ +#define FT_ERR_BASE FT_Mod_Err_Cache + +#include FT_ERRORS_H + +#endif /* __FTCERROR_H__ */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcglyph.c b/alienblaster/project/jni/freetype/src/cache/ftcglyph.c new file mode 100644 index 000000000..a9ab0c319 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcglyph.c @@ -0,0 +1,209 @@ +/***************************************************************************/ +/* */ +/* ftcglyph.c */ +/* */ +/* FreeType Glyph Image (FT_Glyph) cache (body). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcglyph.h" +#include FT_ERRORS_H + +#include "ftccback.h" +#include "ftcerror.h" + + + /* create a new chunk node, setting its cache index and ref count */ + FT_LOCAL_DEF( void ) + FTC_GNode_Init( FTC_GNode gnode, + FT_UInt gindex, + FTC_Family family ) + { + gnode->family = family; + gnode->gindex = gindex; + family->num_nodes++; + } + + + FT_LOCAL_DEF( void ) + FTC_GNode_UnselectFamily( FTC_GNode gnode, + FTC_Cache cache ) + { + FTC_Family family = gnode->family; + + + gnode->family = NULL; + if ( family && --family->num_nodes == 0 ) + FTC_FAMILY_FREE( family, cache ); + } + + + FT_LOCAL_DEF( void ) + FTC_GNode_Done( FTC_GNode gnode, + FTC_Cache cache ) + { + /* finalize the node */ + gnode->gindex = 0; + + FTC_GNode_UnselectFamily( gnode, cache ); + } + + + FT_LOCAL_DEF( FT_Bool ) + ftc_gnode_compare( FTC_Node ftcgnode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_GNode gnode = (FTC_GNode)ftcgnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + FT_UNUSED( cache ); + + + return FT_BOOL( gnode->family == gquery->family && + gnode->gindex == gquery->gindex ); + } + + + FT_LOCAL_DEF( FT_Bool ) + FTC_GNode_Compare( FTC_GNode gnode, + FTC_GQuery gquery ) + { + return ftc_gnode_compare( FTC_NODE( gnode ), gquery, NULL ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CHUNK SETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + FTC_Family_Init( FTC_Family family, + FTC_Cache cache ) + { + FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache ); + + + family->clazz = clazz->family_class; + family->num_nodes = 0; + family->cache = cache; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_gcache_init( FTC_Cache ftccache ) + { + FTC_GCache cache = (FTC_GCache)ftccache; + FT_Error error; + + + error = FTC_Cache_Init( FTC_CACHE( cache ) ); + if ( !error ) + { + FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class; + + FTC_MruList_Init( &cache->families, + clazz->family_class, + 0, /* no maximum here! */ + cache, + FTC_CACHE( cache )->memory ); + } + + return error; + } + + +#if 0 + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_Init( FTC_GCache cache ) + { + return ftc_gcache_init( FTC_CACHE( cache ) ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + ftc_gcache_done( FTC_Cache ftccache ) + { + FTC_GCache cache = (FTC_GCache)ftccache; + + + FTC_Cache_Done( (FTC_Cache)cache ); + FTC_MruList_Done( &cache->families ); + } + + +#if 0 + + FT_LOCAL_DEF( void ) + FTC_GCache_Done( FTC_GCache cache ) + { + ftc_gcache_done( FTC_CACHE( cache ) ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_New( FTC_Manager manager, + FTC_GCacheClass clazz, + FTC_GCache *acache ) + { + return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz, + (FTC_Cache*)acache ); + } + + +#ifndef FTC_INLINE + + FT_LOCAL_DEF( FT_Error ) + FTC_GCache_Lookup( FTC_GCache cache, + FT_UInt32 hash, + FT_UInt gindex, + FTC_GQuery query, + FTC_Node *anode ) + { + FT_Error error; + + + query->gindex = gindex; + + FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error ); + if ( !error ) + { + FTC_Family family = query->family; + + + /* prevent the family from being destroyed too early when an */ + /* out-of-memory condition occurs during glyph node initialization. */ + family->num_nodes++; + + error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode ); + + if ( --family->num_nodes == 0 ) + FTC_FAMILY_FREE( family, cache ); + } + return error; + } + +#endif /* !FTC_INLINE */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcglyph.h b/alienblaster/project/jni/freetype/src/cache/ftcglyph.h new file mode 100644 index 000000000..c18f9c3af --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcglyph.h @@ -0,0 +1,323 @@ +/***************************************************************************/ +/* */ +/* ftcglyph.h */ +/* */ +/* FreeType abstract glyph cache (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + * + * FTC_GCache is an _abstract_ cache object optimized to store glyph + * data. It works as follows: + * + * - It manages FTC_GNode objects. Each one of them can hold one or more + * glyph `items'. Item types are not specified in the FTC_GCache but + * in classes that extend it. + * + * - Glyph attributes, like face ID, character size, render mode, etc., + * can be grouped into abstract `glyph families'. This avoids storing + * the attributes within the FTC_GCache, since it is likely that many + * FTC_GNodes will belong to the same family in typical uses. + * + * - Each FTC_GNode is thus an FTC_Node with two additional fields: + * + * * gindex: A glyph index, or the first index in a glyph range. + * * family: A pointer to a glyph `family'. + * + * - Family types are not fully specific in the FTC_Family type, but + * by classes that extend it. + * + * Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache. + * They share an FTC_Family sub-class called FTC_BasicFamily which is + * used to store the following data: face ID, pixel/point sizes, load + * flags. For more details see the file `src/cache/ftcbasic.c'. + * + * Client applications can extend FTC_GNode with their own FTC_GNode + * and FTC_Family sub-classes to implement more complex caches (e.g., + * handling automatic synthesis, like obliquing & emboldening, colored + * glyphs, etc.). + * + * See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and + * `ftcsbits.h', which both extend FTC_GCache with additional + * optimizations. + * + * A typical FTC_GCache implementation must provide at least the + * following: + * + * - FTC_GNode sub-class, e.g. MyNode, with relevant methods: + * my_node_new (must call FTC_GNode_Init) + * my_node_free (must call FTC_GNode_Done) + * my_node_compare (must call FTC_GNode_Compare) + * my_node_remove_faceid (must call ftc_gnode_unselect in case + * of match) + * + * - FTC_Family sub-class, e.g. MyFamily, with relevant methods: + * my_family_compare + * my_family_init + * my_family_reset (optional) + * my_family_done + * + * - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query + * data. + * + * - Constant structures for a FTC_GNodeClass. + * + * - MyCacheNew() can be implemented easily as a call to the convenience + * function FTC_GCache_New. + * + * - MyCacheLookup with a call to FTC_GCache_Lookup. This function will + * automatically: + * + * - Search for the corresponding family in the cache, or create + * a new one if necessary. Put it in FTC_GQUERY(myquery).family + * + * - Call FTC_Cache_Lookup. + * + * If it returns NULL, you should create a new node, then call + * ftc_cache_add as usual. + */ + + + /*************************************************************************/ + /* */ + /* Important: The functions defined in this file are only used to */ + /* implement an abstract glyph cache class. You need to */ + /* provide additional logic to implement a complete cache. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTCGLYPH_H__ +#define __FTCGLYPH_H__ + + +#include <ft2build.h> +#include "ftcmanag.h" + + +FT_BEGIN_HEADER + + + /* + * We can group glyphs into `families'. Each family correspond to a + * given face ID, character size, transform, etc. + * + * Families are implemented as MRU list nodes. They are + * reference-counted. + */ + + typedef struct FTC_FamilyRec_ + { + FTC_MruNodeRec mrunode; + FT_UInt num_nodes; /* current number of nodes in this family */ + FTC_Cache cache; + FTC_MruListClass clazz; + + } FTC_FamilyRec, *FTC_Family; + +#define FTC_FAMILY(x) ( (FTC_Family)(x) ) +#define FTC_FAMILY_P(x) ( (FTC_Family*)(x) ) + + + typedef struct FTC_GNodeRec_ + { + FTC_NodeRec node; + FTC_Family family; + FT_UInt gindex; + + } FTC_GNodeRec, *FTC_GNode; + +#define FTC_GNODE( x ) ( (FTC_GNode)(x) ) +#define FTC_GNODE_P( x ) ( (FTC_GNode*)(x) ) + + + typedef struct FTC_GQueryRec_ + { + FT_UInt gindex; + FTC_Family family; + + } FTC_GQueryRec, *FTC_GQuery; + +#define FTC_GQUERY( x ) ( (FTC_GQuery)(x) ) + + + /*************************************************************************/ + /* */ + /* These functions are exported so that they can be called from */ + /* user-provided cache classes; otherwise, they are really part of the */ + /* cache sub-system internals. */ + /* */ + + /* must be called by derived FTC_Node_InitFunc routines */ + FT_LOCAL( void ) + FTC_GNode_Init( FTC_GNode node, + FT_UInt gindex, /* glyph index for node */ + FTC_Family family ); + + /* returns TRUE iff the query's glyph index correspond to the node; */ + /* this assumes that the `family' and `hash' fields of the query are */ + /* already correctly set */ + FT_LOCAL( FT_Bool ) + FTC_GNode_Compare( FTC_GNode gnode, + FTC_GQuery gquery ); + + /* call this function to clear a node's family -- this is necessary */ + /* to implement the `node_remove_faceid' cache method correctly */ + FT_LOCAL( void ) + FTC_GNode_UnselectFamily( FTC_GNode gnode, + FTC_Cache cache ); + + /* must be called by derived FTC_Node_DoneFunc routines */ + FT_LOCAL( void ) + FTC_GNode_Done( FTC_GNode node, + FTC_Cache cache ); + + + FT_LOCAL( void ) + FTC_Family_Init( FTC_Family family, + FTC_Cache cache ); + + typedef struct FTC_GCacheRec_ + { + FTC_CacheRec cache; + FTC_MruListRec families; + + } FTC_GCacheRec, *FTC_GCache; + +#define FTC_GCACHE( x ) ((FTC_GCache)(x)) + + +#if 0 + /* can be used as @FTC_Cache_InitFunc */ + FT_LOCAL( FT_Error ) + FTC_GCache_Init( FTC_GCache cache ); +#endif + + +#if 0 + /* can be used as @FTC_Cache_DoneFunc */ + FT_LOCAL( void ) + FTC_GCache_Done( FTC_GCache cache ); +#endif + + + /* the glyph cache class adds fields for the family implementation */ + typedef struct FTC_GCacheClassRec_ + { + FTC_CacheClassRec clazz; + FTC_MruListClass family_class; + + } FTC_GCacheClassRec; + + typedef const FTC_GCacheClassRec* FTC_GCacheClass; + +#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x)) + +#define FTC_CACHE__GCACHE_CLASS( x ) \ + FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class ) +#define FTC_CACHE__FAMILY_CLASS( x ) \ + ( (FTC_MruListClass)FTC_CACHE__GCACHE_CLASS( x )->family_class ) + + + /* convenience function; use it instead of FTC_Manager_Register_Cache */ + FT_LOCAL( FT_Error ) + FTC_GCache_New( FTC_Manager manager, + FTC_GCacheClass clazz, + FTC_GCache *acache ); + +#ifndef FTC_INLINE + FT_LOCAL( FT_Error ) + FTC_GCache_Lookup( FTC_GCache cache, + FT_UInt32 hash, + FT_UInt gindex, + FTC_GQuery query, + FTC_Node *anode ); +#endif + + + /* */ + + +#define FTC_FAMILY_FREE( family, cache ) \ + FTC_MruList_Remove( &FTC_GCACHE((cache))->families, \ + (FTC_MruNode)(family) ) + + +#ifdef FTC_INLINE + +#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ + gindex, query, node, error ) \ + FT_BEGIN_STMNT \ + FTC_GCache _gcache = FTC_GCACHE( cache ); \ + FTC_GQuery _gquery = (FTC_GQuery)( query ); \ + FTC_MruNode_CompareFunc _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \ + FTC_MruNode _mrunode; \ + \ + \ + _gquery->gindex = (gindex); \ + \ + FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \ + _mrunode, error ); \ + _gquery->family = FTC_FAMILY( _mrunode ); \ + if ( !error ) \ + { \ + FTC_Family _gqfamily = _gquery->family; \ + \ + \ + _gqfamily->num_nodes++; \ + \ + FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \ + \ + if ( --_gqfamily->num_nodes == 0 ) \ + FTC_FAMILY_FREE( _gqfamily, _gcache ); \ + } \ + FT_END_STMNT + /* */ + +#else /* !FTC_INLINE */ + +#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \ + gindex, query, node, error ) \ + FT_BEGIN_STMNT \ + \ + error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \ + FTC_GQUERY( query ), node ); \ + \ + FT_END_STMNT + +#endif /* !FTC_INLINE */ + + +FT_END_HEADER + + +#endif /* __FTCGLYPH_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcimage.c b/alienblaster/project/jni/freetype/src/cache/ftcimage.c new file mode 100644 index 000000000..417daf2aa --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcimage.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* ftcimage.c */ +/* */ +/* FreeType Image cache (body). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcimage.h" +#include FT_INTERNAL_MEMORY_H + +#include "ftccback.h" +#include "ftcerror.h" + + + /* finalize a given glyph image node */ + FT_LOCAL_DEF( void ) + ftc_inode_free( FTC_Node ftcinode, + FTC_Cache cache ) + { + FTC_INode inode = (FTC_INode)ftcinode; + FT_Memory memory = cache->memory; + + + if ( inode->glyph ) + { + FT_Done_Glyph( inode->glyph ); + inode->glyph = NULL; + } + + FTC_GNode_Done( FTC_GNODE( inode ), cache ); + FT_FREE( inode ); + } + + + FT_LOCAL_DEF( void ) + FTC_INode_Free( FTC_INode inode, + FTC_Cache cache ) + { + ftc_inode_free( FTC_NODE( inode ), cache ); + } + + + /* initialize a new glyph image node */ + FT_LOCAL_DEF( FT_Error ) + FTC_INode_New( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + FTC_INode inode; + + + if ( !FT_NEW( inode ) ) + { + FTC_GNode gnode = FTC_GNODE( inode ); + FTC_Family family = gquery->family; + FT_UInt gindex = gquery->gindex; + FTC_IFamilyClass clazz = FTC_CACHE__IFAMILY_CLASS( cache ); + + + /* initialize its inner fields */ + FTC_GNode_Init( gnode, gindex, family ); + + /* we will now load the glyph image */ + error = clazz->family_load_glyph( family, gindex, cache, + &inode->glyph ); + if ( error ) + { + FTC_INode_Free( inode, cache ); + inode = NULL; + } + } + + *pinode = inode; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_inode_new( FTC_Node *ftcpinode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_INode *pinode = (FTC_INode*)ftcpinode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + + + return FTC_INode_New( pinode, gquery, cache ); + } + + + FT_LOCAL_DEF( FT_Offset ) + ftc_inode_weight( FTC_Node ftcinode, + FTC_Cache ftccache ) + { + FTC_INode inode = (FTC_INode)ftcinode; + FT_Offset size = 0; + FT_Glyph glyph = inode->glyph; + + FT_UNUSED( ftccache ); + + + switch ( glyph->format ) + { + case FT_GLYPH_FORMAT_BITMAP: + { + FT_BitmapGlyph bitg; + + + bitg = (FT_BitmapGlyph)glyph; + size = bitg->bitmap.rows * ft_labs( bitg->bitmap.pitch ) + + sizeof ( *bitg ); + } + break; + + case FT_GLYPH_FORMAT_OUTLINE: + { + FT_OutlineGlyph outg; + + + outg = (FT_OutlineGlyph)glyph; + size = outg->outline.n_points * + ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) + + outg->outline.n_contours * sizeof ( FT_Short ) + + sizeof ( *outg ); + } + break; + + default: + ; + } + + size += sizeof ( *inode ); + return size; + } + + +#if 0 + + FT_LOCAL_DEF( FT_Offset ) + FTC_INode_Weight( FTC_INode inode ) + { + return ftc_inode_weight( FTC_NODE( inode ), NULL ); + } + +#endif /* 0 */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcimage.h b/alienblaster/project/jni/freetype/src/cache/ftcimage.h new file mode 100644 index 000000000..20d5d3e07 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcimage.h @@ -0,0 +1,107 @@ +/***************************************************************************/ +/* */ +/* ftcimage.h */ +/* */ +/* FreeType Generic Image cache (specification) */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* + * FTC_ICache is an _abstract_ cache used to store a single FT_Glyph + * image per cache node. + * + * FTC_ICache extends FTC_GCache. For an implementation example, + * see FTC_ImageCache in `src/cache/ftbasic.c'. + */ + + + /*************************************************************************/ + /* */ + /* Each image cache really manages FT_Glyph objects. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCIMAGE_H__ +#define __FTCIMAGE_H__ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcglyph.h" + +FT_BEGIN_HEADER + + + /* the FT_Glyph image node type - we store only 1 glyph per node */ + typedef struct FTC_INodeRec_ + { + FTC_GNodeRec gnode; + FT_Glyph glyph; + + } FTC_INodeRec, *FTC_INode; + +#define FTC_INODE( x ) ( (FTC_INode)( x ) ) +#define FTC_INODE_GINDEX( x ) FTC_GNODE(x)->gindex +#define FTC_INODE_FAMILY( x ) FTC_GNODE(x)->family + + typedef FT_Error + (*FTC_IFamily_LoadGlyphFunc)( FTC_Family family, + FT_UInt gindex, + FTC_Cache cache, + FT_Glyph *aglyph ); + + typedef struct FTC_IFamilyClassRec_ + { + FTC_MruListClassRec clazz; + FTC_IFamily_LoadGlyphFunc family_load_glyph; + + } FTC_IFamilyClassRec; + + typedef const FTC_IFamilyClassRec* FTC_IFamilyClass; + +#define FTC_IFAMILY_CLASS( x ) ((FTC_IFamilyClass)(x)) + +#define FTC_CACHE__IFAMILY_CLASS( x ) \ + FTC_IFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS(x)->family_class ) + + + /* can be used as a @FTC_Node_FreeFunc */ + FT_LOCAL( void ) + FTC_INode_Free( FTC_INode inode, + FTC_Cache cache ); + + /* Can be used as @FTC_Node_NewFunc. `gquery.index' and `gquery.family' + * must be set correctly. This function will call the `family_load_glyph' + * method to load the FT_Glyph into the cache node. + */ + FT_LOCAL( FT_Error ) + FTC_INode_New( FTC_INode *pinode, + FTC_GQuery gquery, + FTC_Cache cache ); + +#if 0 + /* can be used as @FTC_Node_WeightFunc */ + FT_LOCAL( FT_ULong ) + FTC_INode_Weight( FTC_INode inode ); +#endif + + + /* */ + +FT_END_HEADER + +#endif /* __FTCIMAGE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcmanag.c b/alienblaster/project/jni/freetype/src/cache/ftcmanag.c new file mode 100644 index 000000000..f2a298e7d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcmanag.c @@ -0,0 +1,743 @@ +/***************************************************************************/ +/* */ +/* ftcmanag.c */ +/* */ +/* FreeType Cache Manager (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcmanag.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_SIZES_H + +#include "ftccback.h" +#include "ftcerror.h" + +#ifdef FT_CONFIG_OPTION_PIC +#error "cache system does not support PIC yet" +#endif + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_cache + +#define FTC_LRU_GET_MANAGER( lru ) ( (FTC_Manager)(lru)->user_data ) + + + static FT_Error + ftc_scaler_lookup_size( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ) + { + FT_Face face; + FT_Size size = NULL; + FT_Error error; + + + error = FTC_Manager_LookupFace( manager, scaler->face_id, &face ); + if ( error ) + goto Exit; + + error = FT_New_Size( face, &size ); + if ( error ) + goto Exit; + + FT_Activate_Size( size ); + + if ( scaler->pixel ) + error = FT_Set_Pixel_Sizes( face, scaler->width, scaler->height ); + else + error = FT_Set_Char_Size( face, scaler->width, scaler->height, + scaler->x_res, scaler->y_res ); + if ( error ) + { + FT_Done_Size( size ); + size = NULL; + } + + Exit: + *asize = size; + return error; + } + + + typedef struct FTC_SizeNodeRec_ + { + FTC_MruNodeRec node; + FT_Size size; + FTC_ScalerRec scaler; + + } FTC_SizeNodeRec, *FTC_SizeNode; + +#define FTC_SIZE_NODE( x ) ( (FTC_SizeNode)( x ) ) + + + FT_CALLBACK_DEF( void ) + ftc_size_node_done( FTC_MruNode ftcnode, + FT_Pointer data ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FT_Size size = node->size; + FT_UNUSED( data ); + + + if ( size ) + FT_Done_Size( size ); + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_size_node_compare( FTC_MruNode ftcnode, + FT_Pointer ftcscaler ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Scaler scaler0 = &node->scaler; + + + if ( FTC_SCALER_COMPARE( scaler0, scaler ) ) + { + FT_Activate_Size( node->size ); + return 1; + } + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_init( FTC_MruNode ftcnode, + FT_Pointer ftcscaler, + FT_Pointer ftcmanager ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + node->scaler = scaler[0]; + + return ftc_scaler_lookup_size( manager, scaler, &node->size ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ftc_size_node_reset( FTC_MruNode ftcnode, + FT_Pointer ftcscaler, + FT_Pointer ftcmanager ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_Scaler scaler = (FTC_Scaler)ftcscaler; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + FT_Done_Size( node->size ); + + node->scaler = scaler[0]; + + return ftc_scaler_lookup_size( manager, scaler, &node->size ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_MruListClassRec ftc_size_list_class = + { + sizeof ( FTC_SizeNodeRec ), + ftc_size_node_compare, + ftc_size_node_init, + ftc_size_node_reset, + ftc_size_node_done + }; + + + /* helper function used by ftc_face_node_done */ + static FT_Bool + ftc_size_node_compare_faceid( FTC_MruNode ftcnode, + FT_Pointer ftcface_id ) + { + FTC_SizeNode node = (FTC_SizeNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + + + return FT_BOOL( node->scaler.face_id == face_id ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ) + { + FT_Error error; + FTC_MruNode mrunode; + + + if ( asize == NULL ) + return FTC_Err_Invalid_Argument; + + *asize = NULL; + + if ( !manager ) + return FTC_Err_Invalid_Cache_Handle; + +#ifdef FTC_INLINE + + FTC_MRULIST_LOOKUP_CMP( &manager->sizes, scaler, ftc_size_node_compare, + mrunode, error ); + +#else + error = FTC_MruList_Lookup( &manager->sizes, scaler, &mrunode ); +#endif + + if ( !error ) + *asize = FTC_SIZE_NODE( mrunode )->size; + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE MRU IMPLEMENTATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct FTC_FaceNodeRec_ + { + FTC_MruNodeRec node; + FTC_FaceID face_id; + FT_Face face; + + } FTC_FaceNodeRec, *FTC_FaceNode; + +#define FTC_FACE_NODE( x ) ( ( FTC_FaceNode )( x ) ) + + + FT_CALLBACK_DEF( FT_Error ) + ftc_face_node_init( FTC_MruNode ftcnode, + FT_Pointer ftcface_id, + FT_Pointer ftcmanager ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + FTC_Manager manager = (FTC_Manager)ftcmanager; + FT_Error error; + + + node->face_id = face_id; + + error = manager->request_face( face_id, + manager->library, + manager->request_data, + &node->face ); + if ( !error ) + { + /* destroy initial size object; it will be re-created later */ + if ( node->face->size ) + FT_Done_Size( node->face->size ); + } + + return error; + } + + + FT_CALLBACK_DEF( void ) + ftc_face_node_done( FTC_MruNode ftcnode, + FT_Pointer ftcmanager ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_Manager manager = (FTC_Manager)ftcmanager; + + + /* we must begin by removing all scalers for the target face */ + /* from the manager's list */ + FTC_MruList_RemoveSelection( &manager->sizes, + ftc_size_node_compare_faceid, + node->face_id ); + + /* all right, we can discard the face now */ + FT_Done_Face( node->face ); + node->face = NULL; + node->face_id = NULL; + } + + + FT_CALLBACK_DEF( FT_Bool ) + ftc_face_node_compare( FTC_MruNode ftcnode, + FT_Pointer ftcface_id ) + { + FTC_FaceNode node = (FTC_FaceNode)ftcnode; + FTC_FaceID face_id = (FTC_FaceID)ftcface_id; + + + return FT_BOOL( node->face_id == face_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FTC_MruListClassRec ftc_face_list_class = + { + sizeof ( FTC_FaceNodeRec), + + ftc_face_node_compare, + ftc_face_node_init, + 0, /* FTC_MruNode_ResetFunc */ + ftc_face_node_done + }; + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ) + { + FT_Error error; + FTC_MruNode mrunode; + + + if ( aface == NULL ) + return FTC_Err_Invalid_Argument; + + *aface = NULL; + + if ( !manager ) + return FTC_Err_Invalid_Cache_Handle; + + /* we break encapsulation for the sake of speed */ +#ifdef FTC_INLINE + + FTC_MRULIST_LOOKUP_CMP( &manager->faces, face_id, ftc_face_node_compare, + mrunode, error ); + +#else + error = FTC_MruList_Lookup( &manager->faces, face_id, &mrunode ); +#endif + + if ( !error ) + *aface = FTC_FACE_NODE( mrunode )->face; + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ) + { + FT_Error error; + FT_Memory memory; + FTC_Manager manager = 0; + + + if ( !library ) + return FTC_Err_Invalid_Library_Handle; + + memory = library->memory; + + if ( FT_NEW( manager ) ) + goto Exit; + + if ( max_faces == 0 ) + max_faces = FTC_MAX_FACES_DEFAULT; + + if ( max_sizes == 0 ) + max_sizes = FTC_MAX_SIZES_DEFAULT; + + if ( max_bytes == 0 ) + max_bytes = FTC_MAX_BYTES_DEFAULT; + + manager->library = library; + manager->memory = memory; + manager->max_weight = max_bytes; + + manager->request_face = requester; + manager->request_data = req_data; + + FTC_MruList_Init( &manager->faces, + &ftc_face_list_class, + max_faces, + manager, + memory ); + + FTC_MruList_Init( &manager->sizes, + &ftc_size_list_class, + max_sizes, + manager, + memory ); + + *amanager = manager; + + Exit: + return error; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_Done( FTC_Manager manager ) + { + FT_Memory memory; + FT_UInt idx; + + + if ( !manager || !manager->library ) + return; + + memory = manager->memory; + + /* now discard all caches */ + for (idx = manager->num_caches; idx-- > 0; ) + { + FTC_Cache cache = manager->caches[idx]; + + + if ( cache ) + { + cache->clazz.cache_done( cache ); + FT_FREE( cache ); + manager->caches[idx] = NULL; + } + } + manager->num_caches = 0; + + /* discard faces and sizes */ + FTC_MruList_Done( &manager->sizes ); + FTC_MruList_Done( &manager->faces ); + + manager->library = NULL; + manager->memory = NULL; + + FT_FREE( manager ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_Reset( FTC_Manager manager ) + { + if ( manager ) + { + FTC_MruList_Reset( &manager->sizes ); + FTC_MruList_Reset( &manager->faces ); + } + /* XXX: FIXME: flush the caches? */ + } + + +#ifdef FT_DEBUG_ERROR + + static void + FTC_Manager_Check( FTC_Manager manager ) + { + FTC_Node node, first; + + + first = manager->nodes_list; + + /* check node weights */ + if ( first ) + { + FT_ULong weight = 0; + + + node = first; + + do + { + FTC_Cache cache = manager->caches[node->cache_index]; + + + if ( (FT_UInt)node->cache_index >= manager->num_caches ) + FT_TRACE0(( "FTC_Manager_Check: invalid node (cache index = %ld\n", + node->cache_index )); + else + weight += cache->clazz.node_weight( node, cache ); + + node = FTC_NODE__NEXT( node ); + + } while ( node != first ); + + if ( weight != manager->cur_weight ) + FT_TRACE0(( "FTC_Manager_Check: invalid weight %ld instead of %ld\n", + manager->cur_weight, weight )); + } + + /* check circular list */ + if ( first ) + { + FT_UFast count = 0; + + + node = first; + do + { + count++; + node = FTC_NODE__NEXT( node ); + + } while ( node != first ); + + if ( count != manager->num_nodes ) + FT_TRACE0(( "FTC_Manager_Check:" + " invalid cache node count %d instead of %d\n", + manager->num_nodes, count )); + } + } + +#endif /* FT_DEBUG_ERROR */ + + + /* `Compress' the manager's data, i.e., get rid of old cache nodes */ + /* that are not referenced anymore in order to limit the total */ + /* memory used by the cache. */ + + /* documentation is in ftcmanag.h */ + + FT_LOCAL_DEF( void ) + FTC_Manager_Compress( FTC_Manager manager ) + { + FTC_Node node, first; + + + if ( !manager ) + return; + + first = manager->nodes_list; + +#ifdef FT_DEBUG_ERROR + FTC_Manager_Check( manager ); + + FT_TRACE0(( "compressing, weight = %ld, max = %ld, nodes = %d\n", + manager->cur_weight, manager->max_weight, + manager->num_nodes )); +#endif + + if ( manager->cur_weight < manager->max_weight || first == NULL ) + return; + + /* go to last node -- it's a circular list */ + node = FTC_NODE__PREV( first ); + do + { + FTC_Node prev; + + + prev = ( node == first ) ? NULL : FTC_NODE__PREV( node ); + + if ( node->ref_count <= 0 ) + ftc_node_destroy( node, manager ); + + node = prev; + + } while ( node && manager->cur_weight > manager->max_weight ); + } + + + /* documentation is in ftcmanag.h */ + + FT_LOCAL_DEF( FT_Error ) + FTC_Manager_RegisterCache( FTC_Manager manager, + FTC_CacheClass clazz, + FTC_Cache *acache ) + { + FT_Error error = FTC_Err_Invalid_Argument; + FTC_Cache cache = NULL; + + + if ( manager && clazz && acache ) + { + FT_Memory memory = manager->memory; + + + if ( manager->num_caches >= FTC_MAX_CACHES ) + { + error = FTC_Err_Too_Many_Caches; + FT_ERROR(( "FTC_Manager_RegisterCache:" + " too many registered caches\n" )); + goto Exit; + } + + if ( !FT_ALLOC( cache, clazz->cache_size ) ) + { + cache->manager = manager; + cache->memory = memory; + cache->clazz = clazz[0]; + cache->org_class = clazz; + + /* THIS IS VERY IMPORTANT! IT WILL WRETCH THE MANAGER */ + /* IF IT IS NOT SET CORRECTLY */ + cache->index = manager->num_caches; + + error = clazz->cache_init( cache ); + if ( error ) + { + clazz->cache_done( cache ); + FT_FREE( cache ); + goto Exit; + } + + manager->caches[manager->num_caches++] = cache; + } + } + + Exit: + if ( acache ) + *acache = cache; + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + FTC_Manager_FlushN( FTC_Manager manager, + FT_UInt count ) + { + FTC_Node first = manager->nodes_list; + FTC_Node node; + FT_UInt result; + + + /* try to remove `count' nodes from the list */ + if ( first == NULL ) /* empty list! */ + return 0; + + /* go to last node - it's a circular list */ + node = FTC_NODE__PREV(first); + for ( result = 0; result < count; ) + { + FTC_Node prev = FTC_NODE__PREV( node ); + + + /* don't touch locked nodes */ + if ( node->ref_count <= 0 ) + { + ftc_node_destroy( node, manager ); + result++; + } + + if ( node == first ) + break; + + node = prev; + } + return result; + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ) + { + FT_UInt nn; + + /* this will remove all FTC_SizeNode that correspond to + * the face_id as well + */ + FTC_MruList_RemoveSelection( &manager->faces, + (FTC_MruNode_CompareFunc)NULL, + face_id ); + + for ( nn = 0; nn < manager->num_caches; nn++ ) + FTC_Cache_RemoveFaceID( manager->caches[nn], face_id ); + } + + + /* documentation is in ftcache.h */ + + FT_EXPORT_DEF( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ) + { + if ( node && (FT_UInt)node->cache_index < manager->num_caches ) + node->ref_count--; + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_EXPORT_DEF( FT_Error ) + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ) + { + return FTC_Manager_LookupFace( manager, face_id, aface ); + } + + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ) + { + FTC_ScalerRec scaler; + FT_Error error; + FT_Size size; + FT_Face face; + + + scaler.face_id = font->face_id; + scaler.width = font->pix_width; + scaler.height = font->pix_height; + scaler.pixel = TRUE; + scaler.x_res = 0; + scaler.y_res = 0; + + error = FTC_Manager_LookupSize( manager, &scaler, &size ); + if ( error ) + { + face = NULL; + size = NULL; + } + else + face = size->face; + + if ( aface ) + *aface = face; + + if ( asize ) + *asize = size; + + return error; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcmanag.h b/alienblaster/project/jni/freetype/src/cache/ftcmanag.h new file mode 100644 index 000000000..3fdc2c773 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcmanag.h @@ -0,0 +1,175 @@ +/***************************************************************************/ +/* */ +/* ftcmanag.h */ +/* */ +/* FreeType Cache Manager (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* A cache manager is in charge of the following: */ + /* */ + /* - Maintain a mapping between generic FTC_FaceIDs and live FT_Face */ + /* objects. The mapping itself is performed through a user-provided */ + /* callback. However, the manager maintains a small cache of FT_Face */ + /* and FT_Size objects in order to speed up things considerably. */ + /* */ + /* - Manage one or more cache objects. Each cache is in charge of */ + /* holding a varying number of `cache nodes'. Each cache node */ + /* represents a minimal amount of individually accessible cached */ + /* data. For example, a cache node can be an FT_Glyph image */ + /* containing a vector outline, or some glyph metrics, or anything */ + /* else. */ + /* */ + /* Each cache node has a certain size in bytes that is added to the */ + /* total amount of `cache memory' within the manager. */ + /* */ + /* All cache nodes are located in a global LRU list, where the oldest */ + /* node is at the tail of the list. */ + /* */ + /* Each node belongs to a single cache, and includes a reference */ + /* count to avoid destroying it (due to caching). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS BETA CODE. *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTCMANAG_H__ +#define __FTCMANAG_H__ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcmru.h" +#include "ftccache.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + +#define FTC_MAX_FACES_DEFAULT 2 +#define FTC_MAX_SIZES_DEFAULT 4 +#define FTC_MAX_BYTES_DEFAULT 200000L /* ~200kByte by default */ + + /* maximum number of caches registered in a single manager */ +#define FTC_MAX_CACHES 16 + + + typedef struct FTC_ManagerRec_ + { + FT_Library library; + FT_Memory memory; + + FTC_Node nodes_list; + FT_ULong max_weight; + FT_ULong cur_weight; + FT_UInt num_nodes; + + FTC_Cache caches[FTC_MAX_CACHES]; + FT_UInt num_caches; + + FTC_MruListRec faces; + FTC_MruListRec sizes; + + FT_Pointer request_data; + FTC_Face_Requester request_face; + + } FTC_ManagerRec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Compress */ + /* */ + /* <Description> */ + /* This function is used to check the state of the cache manager if */ + /* its `num_bytes' field is greater than its `max_bytes' field. It */ + /* will flush as many old cache nodes as possible (ignoring cache */ + /* nodes with a non-zero reference count). */ + /* */ + /* <InOut> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* <Note> */ + /* Client applications should not call this function directly. It is */ + /* normally invoked by specific cache implementations. */ + /* */ + /* The reason this function is exported is to allow client-specific */ + /* cache classes. */ + /* */ + FT_LOCAL( void ) + FTC_Manager_Compress( FTC_Manager manager ); + + + /* try to flush `count' old nodes from the cache; return the number + * of really flushed nodes + */ + FT_LOCAL( FT_UInt ) + FTC_Manager_FlushN( FTC_Manager manager, + FT_UInt count ); + + + /* this must be used internally for the moment */ + FT_LOCAL( FT_Error ) + FTC_Manager_RegisterCache( FTC_Manager manager, + FTC_CacheClass clazz, + FTC_Cache *acache ); + + /* */ + +#define FTC_SCALER_COMPARE( a, b ) \ + ( (a)->face_id == (b)->face_id && \ + (a)->width == (b)->width && \ + (a)->height == (b)->height && \ + ((a)->pixel != 0) == ((b)->pixel != 0) && \ + ( (a)->pixel || \ + ( (a)->x_res == (b)->x_res && \ + (a)->y_res == (b)->y_res ) ) ) + +#define FTC_SCALER_HASH( q ) \ + ( FTC_FACE_ID_HASH( (q)->face_id ) + \ + (q)->width + (q)->height*7 + \ + ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) ) + + /* */ + +FT_END_HEADER + +#endif /* __FTCMANAG_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcmru.c b/alienblaster/project/jni/freetype/src/cache/ftcmru.c new file mode 100644 index 000000000..9944b5898 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcmru.c @@ -0,0 +1,357 @@ +/***************************************************************************/ +/* */ +/* ftcmru.c */ +/* */ +/* FreeType MRU support (body). */ +/* */ +/* Copyright 2003, 2004, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcmru.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +#include "ftcerror.h" + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Prepend( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + + + if ( first ) + { + FTC_MruNode last = first->prev; + + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + + + do + { + if ( cnode == node ) + { + fprintf( stderr, "FTC_MruNode_Prepend: invalid action\n" ); + exit( 2 ); + } + cnode = cnode->next; + + } while ( cnode != first ); + } +#endif + + first->prev = node; + last->next = node; + node->next = first; + node->prev = last; + } + else + { + node->next = node; + node->prev = node; + } + *plist = node; + } + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Up( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + + + FT_ASSERT( first != NULL ); + + if ( first != node ) + { + FTC_MruNode prev, next, last; + + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + do + { + if ( cnode == node ) + goto Ok; + cnode = cnode->next; + + } while ( cnode != first ); + + fprintf( stderr, "FTC_MruNode_Up: invalid action\n" ); + exit( 2 ); + Ok: + } +#endif + prev = node->prev; + next = node->next; + + prev->next = next; + next->prev = prev; + + last = first->prev; + + last->next = node; + first->prev = node; + + node->next = first; + node->prev = last; + + *plist = node; + } + } + + + FT_LOCAL_DEF( void ) + FTC_MruNode_Remove( FTC_MruNode *plist, + FTC_MruNode node ) + { + FTC_MruNode first = *plist; + FTC_MruNode prev, next; + + + FT_ASSERT( first != NULL ); + +#ifdef FT_DEBUG_ERROR + { + FTC_MruNode cnode = first; + + + do + { + if ( cnode == node ) + goto Ok; + cnode = cnode->next; + + } while ( cnode != first ); + + fprintf( stderr, "FTC_MruNode_Remove: invalid action\n" ); + exit( 2 ); + Ok: + } +#endif + + prev = node->prev; + next = node->next; + + prev->next = next; + next->prev = prev; + + if ( node == next ) + { + FT_ASSERT( first == node ); + FT_ASSERT( prev == node ); + + *plist = NULL; + } + else if ( node == first ) + *plist = next; + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Init( FTC_MruList list, + FTC_MruListClass clazz, + FT_UInt max_nodes, + FT_Pointer data, + FT_Memory memory ) + { + list->num_nodes = 0; + list->max_nodes = max_nodes; + list->nodes = NULL; + list->clazz = *clazz; + list->data = data; + list->memory = memory; + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Reset( FTC_MruList list ) + { + while ( list->nodes ) + FTC_MruList_Remove( list, list->nodes ); + + FT_ASSERT( list->num_nodes == 0 ); + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_Done( FTC_MruList list ) + { + FTC_MruList_Reset( list ); + } + + +#ifndef FTC_INLINE + FT_LOCAL_DEF( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ) + { + FTC_MruNode_CompareFunc compare = list->clazz.node_compare; + FTC_MruNode first, node; + + + first = list->nodes; + node = NULL; + + if ( first ) + { + node = first; + do + { + if ( compare( node, key ) ) + { + if ( node != first ) + FTC_MruNode_Up( &list->nodes, node ); + + return node; + } + + node = node->next; + + } while ( node != first); + } + + return NULL; + } +#endif + + FT_LOCAL_DEF( FT_Error ) + FTC_MruList_New( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ) + { + FT_Error error; + FTC_MruNode node; + FT_Memory memory = list->memory; + + + if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 ) + { + node = list->nodes->prev; + + FT_ASSERT( node ); + + if ( list->clazz.node_reset ) + { + FTC_MruNode_Up( &list->nodes, node ); + + error = list->clazz.node_reset( node, key, list->data ); + if ( !error ) + goto Exit; + } + + FTC_MruNode_Remove( &list->nodes, node ); + list->num_nodes--; + + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + } + else if ( FT_ALLOC( node, list->clazz.node_size ) ) + goto Exit; + + error = list->clazz.node_init( node, key, list->data ); + if ( error ) + goto Fail; + + FTC_MruNode_Prepend( &list->nodes, node ); + list->num_nodes++; + + Exit: + *anode = node; + return error; + + Fail: + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + + FT_FREE( node ); + goto Exit; + } + + +#ifndef FTC_INLINE + FT_LOCAL_DEF( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ) + { + FTC_MruNode node; + + + node = FTC_MruList_Find( list, key ); + if ( node == NULL ) + return FTC_MruList_New( list, key, anode ); + + *anode = node; + return 0; + } +#endif /* FTC_INLINE */ + + FT_LOCAL_DEF( void ) + FTC_MruList_Remove( FTC_MruList list, + FTC_MruNode node ) + { + FTC_MruNode_Remove( &list->nodes, node ); + list->num_nodes--; + + { + FT_Memory memory = list->memory; + + + if ( list->clazz.node_done ) + list->clazz.node_done( node, list->data ); + + FT_FREE( node ); + } + } + + + FT_LOCAL_DEF( void ) + FTC_MruList_RemoveSelection( FTC_MruList list, + FTC_MruNode_CompareFunc selection, + FT_Pointer key ) + { + FTC_MruNode first, node, next; + + + first = list->nodes; + while ( first && ( selection == NULL || selection( first, key ) ) ) + { + FTC_MruList_Remove( list, first ); + first = list->nodes; + } + + if ( first ) + { + node = first->next; + while ( node != first ) + { + next = node->next; + + if ( selection( node, key ) ) + FTC_MruList_Remove( list, node ); + + node = next; + } + } + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcmru.h b/alienblaster/project/jni/freetype/src/cache/ftcmru.h new file mode 100644 index 000000000..5739439f4 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcmru.h @@ -0,0 +1,246 @@ +/***************************************************************************/ +/* */ +/* ftcmru.h */ +/* */ +/* Simple MRU list-cache (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* An MRU is a list that cannot hold more than a certain number of */ + /* elements (`max_elements'). All elements in the list are sorted in */ + /* least-recently-used order, i.e., the `oldest' element is at the tail */ + /* of the list. */ + /* */ + /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'), */ + /* the list is searched for an element with the corresponding key. If */ + /* it is found, the element is moved to the head of the list and is */ + /* returned. */ + /* */ + /* If no corresponding element is found, the lookup routine will try to */ + /* obtain a new element with the relevant key. If the list is already */ + /* full, the oldest element from the list is discarded and replaced by a */ + /* new one; a new element is added to the list otherwise. */ + /* */ + /* Note that it is possible to pre-allocate the element list nodes. */ + /* This is handy if `max_elements' is sufficiently small, as it saves */ + /* allocations/releases during the lookup process. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCMRU_H__ +#define __FTCMRU_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + +#define xxFT_DEBUG_ERROR +#define FTC_INLINE + +FT_BEGIN_HEADER + + typedef struct FTC_MruNodeRec_* FTC_MruNode; + + typedef struct FTC_MruNodeRec_ + { + FTC_MruNode next; + FTC_MruNode prev; + + } FTC_MruNodeRec; + + + FT_LOCAL( void ) + FTC_MruNode_Prepend( FTC_MruNode *plist, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruNode_Up( FTC_MruNode *plist, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruNode_Remove( FTC_MruNode *plist, + FTC_MruNode node ); + + + typedef struct FTC_MruListRec_* FTC_MruList; + + typedef struct FTC_MruListClassRec_ const * FTC_MruListClass; + + + typedef FT_Bool + (*FTC_MruNode_CompareFunc)( FTC_MruNode node, + FT_Pointer key ); + + typedef FT_Error + (*FTC_MruNode_InitFunc)( FTC_MruNode node, + FT_Pointer key, + FT_Pointer data ); + + typedef FT_Error + (*FTC_MruNode_ResetFunc)( FTC_MruNode node, + FT_Pointer key, + FT_Pointer data ); + + typedef void + (*FTC_MruNode_DoneFunc)( FTC_MruNode node, + FT_Pointer data ); + + + typedef struct FTC_MruListClassRec_ + { + FT_Offset node_size; + FTC_MruNode_CompareFunc node_compare; + FTC_MruNode_InitFunc node_init; + FTC_MruNode_ResetFunc node_reset; + FTC_MruNode_DoneFunc node_done; + + } FTC_MruListClassRec; + + typedef struct FTC_MruListRec_ + { + FT_UInt num_nodes; + FT_UInt max_nodes; + FTC_MruNode nodes; + FT_Pointer data; + FTC_MruListClassRec clazz; + FT_Memory memory; + + } FTC_MruListRec; + + + FT_LOCAL( void ) + FTC_MruList_Init( FTC_MruList list, + FTC_MruListClass clazz, + FT_UInt max_nodes, + FT_Pointer data, + FT_Memory memory ); + + FT_LOCAL( void ) + FTC_MruList_Reset( FTC_MruList list ); + + + FT_LOCAL( void ) + FTC_MruList_Done( FTC_MruList list ); + + + FT_LOCAL( FT_Error ) + FTC_MruList_New( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *anode ); + + FT_LOCAL( void ) + FTC_MruList_Remove( FTC_MruList list, + FTC_MruNode node ); + + FT_LOCAL( void ) + FTC_MruList_RemoveSelection( FTC_MruList list, + FTC_MruNode_CompareFunc selection, + FT_Pointer key ); + + +#ifdef FTC_INLINE + +#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error ) \ + FT_BEGIN_STMNT \ + FTC_MruNode* _pfirst = &(list)->nodes; \ + FTC_MruNode_CompareFunc _compare = (FTC_MruNode_CompareFunc)(compare); \ + FTC_MruNode _first, _node; \ + \ + \ + error = 0; \ + _first = *(_pfirst); \ + _node = NULL; \ + \ + if ( _first ) \ + { \ + _node = _first; \ + do \ + { \ + if ( _compare( _node, (key) ) ) \ + { \ + if ( _node != _first ) \ + FTC_MruNode_Up( _pfirst, _node ); \ + \ + node = _node; \ + goto _MruOk; \ + } \ + _node = _node->next; \ + \ + } while ( _node != _first) ; \ + } \ + \ + error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \ + _MruOk: \ + ; \ + FT_END_STMNT + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error ) + +#else /* !FTC_INLINE */ + + FT_LOCAL( FTC_MruNode ) + FTC_MruList_Find( FTC_MruList list, + FT_Pointer key ); + + FT_LOCAL( FT_Error ) + FTC_MruList_Lookup( FTC_MruList list, + FT_Pointer key, + FTC_MruNode *pnode ); + +#define FTC_MRULIST_LOOKUP( list, key, node, error ) \ + error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) ) + +#endif /* !FTC_INLINE */ + + +#define FTC_MRULIST_LOOP( list, node ) \ + FT_BEGIN_STMNT \ + FTC_MruNode _first = (list)->nodes; \ + \ + \ + if ( _first ) \ + { \ + FTC_MruNode _node = _first; \ + \ + \ + do \ + { \ + *(FTC_MruNode*)&(node) = _node; + + +#define FTC_MRULIST_LOOP_END() \ + _node = _node->next; \ + \ + } while ( _node != _first ); \ + } \ + FT_END_STMNT + + /* */ + +FT_END_HEADER + + +#endif /* __FTCMRU_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcsbits.c b/alienblaster/project/jni/freetype/src/cache/ftcsbits.c new file mode 100644 index 000000000..60d46aa7a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcsbits.c @@ -0,0 +1,404 @@ +/***************************************************************************/ +/* */ +/* ftcsbits.c */ +/* */ +/* FreeType sbits manager (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcsbits.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_ERRORS_H + +#include "ftccback.h" +#include "ftcerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_cache + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SBIT CACHE NODES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + ftc_sbit_copy_bitmap( FTC_SBit sbit, + FT_Bitmap* bitmap, + FT_Memory memory ) + { + FT_Error error; + FT_Int pitch = bitmap->pitch; + FT_ULong size; + + + if ( pitch < 0 ) + pitch = -pitch; + + size = (FT_ULong)( pitch * bitmap->rows ); + + if ( !FT_ALLOC( sbit->buffer, size ) ) + FT_MEM_COPY( sbit->buffer, bitmap->buffer, size ); + + return error; + } + + + FT_LOCAL_DEF( void ) + ftc_snode_free( FTC_Node ftcsnode, + FTC_Cache cache ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FTC_SBit sbit = snode->sbits; + FT_UInt count = snode->count; + FT_Memory memory = cache->memory; + + + for ( ; count > 0; sbit++, count-- ) + FT_FREE( sbit->buffer ); + + FTC_GNode_Done( FTC_GNODE( snode ), cache ); + + FT_FREE( snode ); + } + + + FT_LOCAL_DEF( void ) + FTC_SNode_Free( FTC_SNode snode, + FTC_Cache cache ) + { + ftc_snode_free( FTC_NODE( snode ), cache ); + } + + + /* + * This function tries to load a small bitmap within a given FTC_SNode. + * Note that it returns a non-zero error code _only_ in the case of + * out-of-memory condition. For all other errors (e.g., corresponding + * to a bad font file), this function will mark the sbit as `unavailable' + * and return a value of 0. + * + * You should also read the comment within the @ftc_snode_compare + * function below to see how out-of-memory is handled during a lookup. + */ + static FT_Error + ftc_snode_load( FTC_SNode snode, + FTC_Manager manager, + FT_UInt gindex, + FT_ULong *asize ) + { + FT_Error error; + FTC_GNode gnode = FTC_GNODE( snode ); + FTC_Family family = gnode->family; + FT_Memory memory = manager->memory; + FT_Face face; + FTC_SBit sbit; + FTC_SFamilyClass clazz; + + + if ( (FT_UInt)(gindex - gnode->gindex) >= snode->count ) + { + FT_ERROR(( "ftc_snode_load: invalid glyph index" )); + return FTC_Err_Invalid_Argument; + } + + sbit = snode->sbits + ( gindex - gnode->gindex ); + clazz = (FTC_SFamilyClass)family->clazz; + + sbit->buffer = 0; + + error = clazz->family_load_glyph( family, gindex, manager, &face ); + if ( error ) + goto BadGlyph; + + { + FT_Int temp; + FT_GlyphSlot slot = face->glyph; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Pos xadvance, yadvance; /* FT_GlyphSlot->advance.{x|y} */ + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + FT_TRACE0(( "ftc_snode_load:" + " glyph loaded didn't return a bitmap\n" )); + goto BadGlyph; + } + + /* Check that our values fit into 8-bit containers! */ + /* If this is not the case, our bitmap is too large */ + /* and we will leave it as `missing' with sbit.buffer = 0 */ + +#define CHECK_CHAR( d ) ( temp = (FT_Char)d, temp == d ) +#define CHECK_BYTE( d ) ( temp = (FT_Byte)d, temp == d ) + + /* horizontal advance in pixels */ + xadvance = ( slot->advance.x + 32 ) >> 6; + yadvance = ( slot->advance.y + 32 ) >> 6; + + if ( !CHECK_BYTE( bitmap->rows ) || + !CHECK_BYTE( bitmap->width ) || + !CHECK_CHAR( bitmap->pitch ) || + !CHECK_CHAR( slot->bitmap_left ) || + !CHECK_CHAR( slot->bitmap_top ) || + !CHECK_CHAR( xadvance ) || + !CHECK_CHAR( yadvance ) ) + goto BadGlyph; + + sbit->width = (FT_Byte)bitmap->width; + sbit->height = (FT_Byte)bitmap->rows; + sbit->pitch = (FT_Char)bitmap->pitch; + sbit->left = (FT_Char)slot->bitmap_left; + sbit->top = (FT_Char)slot->bitmap_top; + sbit->xadvance = (FT_Char)xadvance; + sbit->yadvance = (FT_Char)yadvance; + sbit->format = (FT_Byte)bitmap->pixel_mode; + sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1); + + /* copy the bitmap into a new buffer -- ignore error */ + error = ftc_sbit_copy_bitmap( sbit, bitmap, memory ); + + /* now, compute size */ + if ( asize ) + *asize = FT_ABS( sbit->pitch ) * sbit->height; + + } /* glyph loading successful */ + + /* ignore the errors that might have occurred -- */ + /* we mark unloaded glyphs with `sbit.buffer == 0' */ + /* and `width == 255', `height == 0' */ + /* */ + if ( error && error != FTC_Err_Out_Of_Memory ) + { + BadGlyph: + sbit->width = 255; + sbit->height = 0; + sbit->buffer = NULL; + error = 0; + if ( asize ) + *asize = 0; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + FTC_SNode_New( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + FT_Memory memory = cache->memory; + FT_Error error; + FTC_SNode snode = NULL; + FT_UInt gindex = gquery->gindex; + FTC_Family family = gquery->family; + + FTC_SFamilyClass clazz = FTC_CACHE__SFAMILY_CLASS( cache ); + FT_UInt total; + + + total = clazz->family_get_count( family, cache->manager ); + if ( total == 0 || gindex >= total ) + { + error = FT_Err_Invalid_Argument; + goto Exit; + } + + if ( !FT_NEW( snode ) ) + { + FT_UInt count, start; + + + start = gindex - ( gindex % FTC_SBIT_ITEMS_PER_NODE ); + count = total - start; + if ( count > FTC_SBIT_ITEMS_PER_NODE ) + count = FTC_SBIT_ITEMS_PER_NODE; + + FTC_GNode_Init( FTC_GNODE( snode ), start, family ); + + snode->count = count; + + error = ftc_snode_load( snode, + cache->manager, + gindex, + NULL ); + if ( error ) + { + FTC_SNode_Free( snode, cache ); + snode = NULL; + } + } + + Exit: + *psnode = snode; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + ftc_snode_new( FTC_Node *ftcpsnode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_SNode *psnode = (FTC_SNode*)ftcpsnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + + + return FTC_SNode_New( psnode, gquery, cache ); + } + + + FT_LOCAL_DEF( FT_Offset ) + ftc_snode_weight( FTC_Node ftcsnode, + FTC_Cache cache ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FT_UInt count = snode->count; + FTC_SBit sbit = snode->sbits; + FT_Int pitch; + FT_Offset size; + + FT_UNUSED( cache ); + + + FT_ASSERT( snode->count <= FTC_SBIT_ITEMS_PER_NODE ); + + /* the node itself */ + size = sizeof ( *snode ); + + for ( ; count > 0; count--, sbit++ ) + { + if ( sbit->buffer ) + { + pitch = sbit->pitch; + if ( pitch < 0 ) + pitch = -pitch; + + /* add the size of a given glyph image */ + size += pitch * sbit->height; + } + } + + return size; + } + + +#if 0 + + FT_LOCAL_DEF( FT_Offset ) + FTC_SNode_Weight( FTC_SNode snode ) + { + return ftc_snode_weight( FTC_NODE( snode ), NULL ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Bool ) + ftc_snode_compare( FTC_Node ftcsnode, + FT_Pointer ftcgquery, + FTC_Cache cache ) + { + FTC_SNode snode = (FTC_SNode)ftcsnode; + FTC_GQuery gquery = (FTC_GQuery)ftcgquery; + FTC_GNode gnode = FTC_GNODE( snode ); + FT_UInt gindex = gquery->gindex; + FT_Bool result; + + + result = FT_BOOL( gnode->family == gquery->family && + (FT_UInt)( gindex - gnode->gindex ) < snode->count ); + if ( result ) + { + /* check if we need to load the glyph bitmap now */ + FTC_SBit sbit = snode->sbits + ( gindex - gnode->gindex ); + + + /* + * The following code illustrates what to do when you want to + * perform operations that may fail within a lookup function. + * + * Here, we want to load a small bitmap on-demand; we thus + * need to call the `ftc_snode_load' function which may return + * a non-zero error code only when we are out of memory (OOM). + * + * The correct thing to do is to use @FTC_CACHE_TRYLOOP and + * @FTC_CACHE_TRYLOOP_END in order to implement a retry loop + * that is capable of flushing the cache incrementally when + * an OOM errors occur. + * + * However, we need to `lock' the node before this operation to + * prevent it from being flushed within the loop. + * + * When we exit the loop, we unlock the node, then check the `error' + * variable. If it is non-zero, this means that the cache was + * completely flushed and that no usable memory was found to load + * the bitmap. + * + * We then prefer to return a value of 0 (i.e., NO MATCH). This + * ensures that the caller will try to allocate a new node. + * This operation consequently _fail_ and the lookup function + * returns the appropriate OOM error code. + * + * Note that `buffer == NULL && width == 255' is a hack used to + * tag `unavailable' bitmaps in the array. We should never try + * to load these. + * + */ + + if ( sbit->buffer == NULL && sbit->width != 255 ) + { + FT_ULong size; + FT_Error error; + + + ftcsnode->ref_count++; /* lock node to prevent flushing */ + /* in retry loop */ + + FTC_CACHE_TRYLOOP( cache ) + { + error = ftc_snode_load( snode, cache->manager, gindex, &size ); + } + FTC_CACHE_TRYLOOP_END(); + + ftcsnode->ref_count--; /* unlock the node */ + + if ( error ) + result = 0; + else + cache->manager->cur_weight += size; + } + } + + return result; + } + + + FT_LOCAL_DEF( FT_Bool ) + FTC_SNode_Compare( FTC_SNode snode, + FTC_GQuery gquery, + FTC_Cache cache ) + { + return ftc_snode_compare( FTC_NODE( snode ), gquery, cache ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/ftcsbits.h b/alienblaster/project/jni/freetype/src/cache/ftcsbits.h new file mode 100644 index 000000000..6261745f1 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/ftcsbits.h @@ -0,0 +1,98 @@ +/***************************************************************************/ +/* */ +/* ftcsbits.h */ +/* */ +/* A small-bitmap cache (specification). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCSBITS_H__ +#define __FTCSBITS_H__ + + +#include <ft2build.h> +#include FT_CACHE_H +#include "ftcglyph.h" + + +FT_BEGIN_HEADER + +#define FTC_SBIT_ITEMS_PER_NODE 16 + + typedef struct FTC_SNodeRec_ + { + FTC_GNodeRec gnode; + FT_UInt count; + FTC_SBitRec sbits[FTC_SBIT_ITEMS_PER_NODE]; + + } FTC_SNodeRec, *FTC_SNode; + + +#define FTC_SNODE( x ) ( (FTC_SNode)( x ) ) +#define FTC_SNODE_GINDEX( x ) FTC_GNODE( x )->gindex +#define FTC_SNODE_FAMILY( x ) FTC_GNODE( x )->family + + typedef FT_UInt + (*FTC_SFamily_GetCountFunc)( FTC_Family family, + FTC_Manager manager ); + + typedef FT_Error + (*FTC_SFamily_LoadGlyphFunc)( FTC_Family family, + FT_UInt gindex, + FTC_Manager manager, + FT_Face *aface ); + + typedef struct FTC_SFamilyClassRec_ + { + FTC_MruListClassRec clazz; + FTC_SFamily_GetCountFunc family_get_count; + FTC_SFamily_LoadGlyphFunc family_load_glyph; + + } FTC_SFamilyClassRec; + + typedef const FTC_SFamilyClassRec* FTC_SFamilyClass; + +#define FTC_SFAMILY_CLASS( x ) ((FTC_SFamilyClass)(x)) + +#define FTC_CACHE__SFAMILY_CLASS( x ) \ + FTC_SFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS( x )->family_class ) + + + FT_LOCAL( void ) + FTC_SNode_Free( FTC_SNode snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + FTC_SNode_New( FTC_SNode *psnode, + FTC_GQuery gquery, + FTC_Cache cache ); + +#if 0 + FT_LOCAL( FT_ULong ) + FTC_SNode_Weight( FTC_SNode inode ); +#endif + + + FT_LOCAL( FT_Bool ) + FTC_SNode_Compare( FTC_SNode snode, + FTC_GQuery gquery, + FTC_Cache cache ); + + /* */ + +FT_END_HEADER + +#endif /* __FTCSBITS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cache/rules.mk b/alienblaster/project/jni/freetype/src/cache/rules.mk new file mode 100644 index 000000000..ed75a6a91 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cache/rules.mk @@ -0,0 +1,80 @@ +# +# FreeType 2 Cache configuration rules +# + + +# Copyright 2000, 2001, 2003, 2004, 2006, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Cache driver directory +# +CACHE_DIR := $(SRC_DIR)/cache + +# compilation flags for the driver +# +CACHE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CACHE_DIR)) + + +# Cache driver sources (i.e., C files) +# +CACHE_DRV_SRC := $(CACHE_DIR)/ftcbasic.c \ + $(CACHE_DIR)/ftccache.c \ + $(CACHE_DIR)/ftccmap.c \ + $(CACHE_DIR)/ftcglyph.c \ + $(CACHE_DIR)/ftcimage.c \ + $(CACHE_DIR)/ftcmanag.c \ + $(CACHE_DIR)/ftcmru.c \ + $(CACHE_DIR)/ftcsbits.c + +# Cache driver headers +# +CACHE_DRV_H := $(CACHE_DIR)/ftccache.h \ + $(CACHE_DIR)/ftccback.h \ + $(CACHE_DIR)/ftcerror.h \ + $(CACHE_DIR)/ftcglyph.h \ + $(CACHE_DIR)/ftcimage.h \ + $(CACHE_DIR)/ftcmanag.h \ + $(CACHE_DIR)/ftcmru.h \ + $(CACHE_DIR)/ftcsbits.h + + +# Cache driver object(s) +# +# CACHE_DRV_OBJ_M is used during `multi' builds. +# CACHE_DRV_OBJ_S is used during `single' builds. +# +CACHE_DRV_OBJ_M := $(CACHE_DRV_SRC:$(CACHE_DIR)/%.c=$(OBJ_DIR)/%.$O) +CACHE_DRV_OBJ_S := $(OBJ_DIR)/ftcache.$O + +# Cache driver source file for single build +# +CACHE_DRV_SRC_S := $(CACHE_DIR)/ftcache.c + + +# Cache driver - single object +# +$(CACHE_DRV_OBJ_S): $(CACHE_DRV_SRC_S) $(CACHE_DRV_SRC) \ + $(FREETYPE_H) $(CACHE_DRV_H) + $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CACHE_DRV_SRC_S)) + + +# Cache driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CACHE_DIR)/%.c $(FREETYPE_H) $(CACHE_DRV_H) + $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CACHE_DRV_OBJ_S) +DRV_OBJS_M += $(CACHE_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/cff/Jamfile b/alienblaster/project/jni/freetype/src/cff/Jamfile new file mode 100644 index 000000000..6705d3cfd --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/cff Jamfile +# +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) cff ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap cffpic ; + } + else + { + _sources = cff ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/cff Jamfile diff --git a/alienblaster/project/jni/freetype/src/cff/cffcmap.c b/alienblaster/project/jni/freetype/src/cff/cffcmap.c new file mode 100644 index 000000000..46d603e3a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffcmap.c @@ -0,0 +1,219 @@ +/***************************************************************************/ +/* */ +/* cffcmap.c */ +/* */ +/* CFF character mapping table (cmap) support (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "cffcmap.h" +#include "cffload.h" + +#include "cfferrs.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_encoding_init( CFF_CMapStd cmap ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Encoding encoding = &cff->encoding; + + + cmap->gids = encoding->codes; + + return 0; + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_encoding_done( CFF_CMapStd cmap ) + { + cmap->gids = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_encoding_char_index( CFF_CMapStd cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( char_code < 256 ) + result = cmap->gids[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + cff_cmap_encoding_char_next( CFF_CMapStd cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + *pchar_code = 0; + + if ( char_code < 255 ) + { + FT_UInt code = (FT_UInt)(char_code + 1); + + + for (;;) + { + if ( code >= 256 ) + break; + + result = cmap->gids[code]; + if ( result != 0 ) + { + *pchar_code = code; + break; + } + + code++; + } + } + return result; + } + + + FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec, + sizeof ( CFF_CMapStdRec ), + + (FT_CMap_InitFunc) cff_cmap_encoding_init, + (FT_CMap_DoneFunc) cff_cmap_encoding_done, + (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, + (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, + + NULL, NULL, NULL, NULL, NULL + ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char* ) + cff_sid_to_glyph_name( TT_Face face, + FT_UInt idx ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + FT_UInt sid = charset->sids[idx]; + + + return cff_index_get_sid_string( &cff->string_index, sid, psnames ); + } + + + FT_CALLBACK_DEF( void ) + cff_sid_free_glyph_name( TT_Face face, + const char* gname ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( gname ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_unicode_init( PS_Unicodes unicodes ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + /* can't build Unicode map for CID-keyed font */ + if ( !charset->sids ) + return CFF_Err_Invalid_Argument; + + return psnames->unicodes_init( memory, + unicodes, + cff->num_glyphs, + (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, + (PS_FreeGlyphNameFunc)&cff_sid_free_glyph_name, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + cff_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec, + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) cff_cmap_unicode_init, + (FT_CMap_DoneFunc) cff_cmap_unicode_done, + (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, + (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, + + NULL, NULL, NULL, NULL, NULL + ) + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffcmap.h b/alienblaster/project/jni/freetype/src/cff/cffcmap.h new file mode 100644 index 000000000..3f7f67bbe --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffcmap.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* cffcmap.h */ +/* */ +/* CFF character mapping table (cmap) support (specification). */ +/* */ +/* Copyright 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFCMAP_H__ +#define __CFFCMAP_H__ + +#include "cffobjs.h" + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct CFF_CMapStdRec_* CFF_CMapStd; + + typedef struct CFF_CMapStdRec_ + { + FT_CMapRec cmap; + FT_UShort* gids; /* up to 256 elements */ + + } CFF_CMapStdRec; + + + FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec) + + +FT_END_HEADER + +#endif /* __CFFCMAP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffdrivr.c b/alienblaster/project/jni/freetype/src/cff/cffdrivr.c new file mode 100644 index 000000000..dad0b65d8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffdrivr.c @@ -0,0 +1,691 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.c */ +/* */ +/* OpenType font driver implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_SERVICE_CID_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_TT_CMAP_H + +#include "cffdrivr.h" +#include "cffgload.h" +#include "cffload.h" +#include "cffcmap.h" +#include "cffparse.h" + +#include "cfferrs.h" +#include "cffpic.h" + +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_GLYPH_DICT_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#undef PAIR_TAG +#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ + (FT_ULong)right ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_get_kerning */ + /* */ + /* <Description> */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* <Output> */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings, are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + FT_CALLBACK_DEF( FT_Error ) + cff_get_kerning( FT_Face ttface, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face face = (TT_Face)ttface; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + + return CFF_Err_Ok; + } + + +#undef PAIR_TAG + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_Glyph */ + /* */ + /* <Description> */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* <Input> */ + /* slot :: A handle to the target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled, loaded, etc. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_??? constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_CALLBACK_DEF( FT_Error ) + Load_Glyph( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ + FT_Size cffsize, /* CFF_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; + CFF_Size size = (CFF_Size)cffsize; + + + if ( !slot ) + return CFF_Err_Invalid_Slot_Handle; + + /* check whether we want a scaled outline or bitmap */ + if ( !size ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + /* reset the size object if necessary */ + if ( load_flags & FT_LOAD_NO_SCALE ) + size = NULL; + + if ( size ) + { + /* these two objects must have the same parent */ + if ( cffsize->face != cffslot->face ) + return CFF_Err_Invalid_Face_Handle; + } + + /* now load the glyph outline if necessary */ + error = cff_slot_load( slot, size, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ) + { + FT_UInt nn; + FT_Error error = CFF_Err_Ok; + FT_GlyphSlot slot = face->glyph; + + + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + + for ( nn = 0; nn < count; nn++ ) + { + error = Load_Glyph( slot, face->size, start + nn, flags ); + if ( error ) + break; + + advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? slot->linearVertAdvance + : slot->linearHoriAdvance; + } + + return error; + } + + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + cff_get_glyph_name( CFF_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + CFF_Font font = (CFF_Font)face->extra.data; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_String* gname; + FT_UShort sid; + FT_Service_PsCMaps psnames; + FT_Error error; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + { + FT_ERROR(( "cff_get_glyph_name:" + " cannot get glyph name from CFF & CEF fonts\n" + " " + " without the `PSNames' module\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + /* first, locate the sid in the charset table */ + sid = font->charset.sids[glyph_index]; + + /* now, lookup the name itself */ + gname = cff_index_get_sid_string( &font->string_index, sid, psnames ); + + if ( gname ) + FT_STRCPYN( buffer, gname, buffer_max ); + + FT_FREE( gname ); + error = CFF_Err_Ok; + + Exit: + return error; + } + + + static FT_UInt + cff_get_name_index( CFF_Face face, + FT_String* glyph_name ) + { + CFF_Font cff; + CFF_Charset charset; + FT_Service_PsCMaps psnames; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_String* name; + FT_UShort sid; + FT_UInt i; + FT_Int result; + + + cff = (CFF_FontRec *)face->extra.data; + charset = &cff->charset; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + return 0; + + for ( i = 0; i < cff->num_glyphs; i++ ) + { + sid = charset->sids[i]; + + if ( sid > 390 ) + name = cff_index_get_name( &cff->string_index, sid - 391 ); + else + name = (FT_String *)psnames->adobe_std_strings( sid ); + + if ( !name ) + continue; + + result = ft_strcmp( glyph_name, name ); + + if ( sid > 390 ) + FT_FREE( name ); + + if ( !result ) + return i; + } + + return 0; + } + + + FT_DEFINE_SERVICE_GLYPHDICTREC(cff_service_glyph_dict, + (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)cff_get_name_index + ) + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Int + cff_ps_has_glyph_names( FT_Face face ) + { + return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; + } + + + static FT_Error + cff_ps_get_font_info( CFF_Face face, + PS_FontInfoRec* afont_info ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Error error = FT_Err_Ok; + + + if ( cff && cff->font_info == NULL ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + PS_FontInfoRec *font_info; + FT_Memory memory = face->root.memory; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) + goto Fail; + + font_info->version = cff_index_get_sid_string( &cff->string_index, + dict->version, + psnames ); + font_info->notice = cff_index_get_sid_string( &cff->string_index, + dict->notice, + psnames ); + font_info->full_name = cff_index_get_sid_string( &cff->string_index, + dict->full_name, + psnames ); + font_info->family_name = cff_index_get_sid_string( &cff->string_index, + dict->family_name, + psnames ); + font_info->weight = cff_index_get_sid_string( &cff->string_index, + dict->weight, + psnames ); + font_info->italic_angle = dict->italic_angle; + font_info->is_fixed_pitch = dict->is_fixed_pitch; + font_info->underline_position = (FT_Short)dict->underline_position; + font_info->underline_thickness = (FT_Short)dict->underline_thickness; + + cff->font_info = font_info; + } + + if ( cff ) + *afont_info = *cff->font_info; + + Fail: + return error; + } + + + FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info, + (PS_GetFontInfoFunc) cff_ps_get_font_info, + (PS_GetFontExtraFunc) NULL, + (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, + (PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */ + ) + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + cff_get_ps_name( CFF_Face face ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + return (const char*)cff->font_name; + } + + + FT_DEFINE_SERVICE_PSFONTNAMEREC(cff_service_ps_name, + (FT_PsName_GetFunc)cff_get_ps_name + ) + + + /* + * TT CMAP INFO + * + * If the charmap is a synthetic Unicode encoding cmap or + * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO + * service defined in SFNT module. + * + * Otherwise call the service function in the sfnt module. + * + */ + static FT_Error + cff_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = FT_CMAP( charmap ); + FT_Error error = CFF_Err_Ok; + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Library library = FT_FACE_LIBRARY( face ); + + + cmap_info->language = 0; + cmap_info->format = 0; + + if ( cmap->clazz != &FT_CFF_CMAP_ENCODING_CLASS_REC_GET && + cmap->clazz != &FT_CFF_CMAP_UNICODE_CLASS_REC_GET ) + { + FT_Module sfnt = FT_Get_Module( library, "sfnt" ); + FT_Service_TTCMaps service = + (FT_Service_TTCMaps)ft_module_get_service( sfnt, + FT_SERVICE_ID_TT_CMAP ); + + + if ( service && service->get_cmap_info ) + error = service->get_cmap_info( charmap, cmap_info ); + } + + return error; + } + + + FT_DEFINE_SERVICE_TTCMAPSREC(cff_service_get_cmap_info, + (TT_CMap_Info_GetFunc)cff_get_cmap_info + ) + + + /* + * CID INFO SERVICE + * + */ + static FT_Error + cff_get_ros( CFF_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + if ( registry ) + { + if ( cff->registry == NULL ) + cff->registry = cff_index_get_sid_string( &cff->string_index, + dict->cid_registry, + psnames ); + *registry = cff->registry; + } + + if ( ordering ) + { + if ( cff->ordering == NULL ) + cff->ordering = cff_index_get_sid_string( &cff->string_index, + dict->cid_ordering, + psnames ); + *ordering = cff->ordering; + } + + /* + * XXX: According to Adobe TechNote #5176, the supplement in CFF + * can be a real number. We truncate it to fit public API + * since freetype-2.3.6. + */ + if ( supplement ) + { + if ( dict->cid_supplement < FT_INT_MIN || + dict->cid_supplement > FT_INT_MAX ) + FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", + dict->cid_supplement )); + *supplement = (FT_Int)dict->cid_supplement; + } + } + + Fail: + return error; + } + + + static FT_Error + cff_get_is_cid( CFF_Face face, + FT_Bool *is_cid ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff = (CFF_Font)face->extra.data; + + + *is_cid = 0; + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry != 0xFFFFU ) + *is_cid = 1; + } + + return error; + } + + + static FT_Error + cff_get_cid_from_glyph_index( CFF_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = CFF_Err_Ok; + CFF_Font cff; + + + cff = (CFF_Font)face->extra.data; + + if ( cff ) + { + FT_UInt c; + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + if ( glyph_index > cff->num_glyphs ) + { + error = CFF_Err_Invalid_Argument; + goto Fail; + } + + c = cff->charset.sids[glyph_index]; + + if ( cid ) + *cid = c; + } + + Fail: + return error; + } + + + FT_DEFINE_SERVICE_CIDREC(cff_service_cid_info, + (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros, + (FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid, + (FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index + ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + FT_DEFINE_SERVICEDESCREC6(cff_services, + FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, + FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &FT_CFF_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET + ) +#else + FT_DEFINE_SERVICEDESCREC5(cff_services, + FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF, + FT_SERVICE_ID_POSTSCRIPT_INFO, &FT_CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET + ) +#endif + + FT_CALLBACK_DEF( FT_Module_Interface ) + cff_get_interface( FT_Module driver, /* CFF_Driver */ + const char* module_interface ) + { + FT_Module sfnt; + FT_Module_Interface result; + + + result = ft_service_list_lookup( FT_CFF_SERVICES_GET, module_interface ); + if ( result != NULL ) + return result; + + if ( !driver ) + return NULL; + + /* we pass our request to the `sfnt' module */ + sfnt = FT_Get_Module( driver->library, "sfnt" ); + + return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define CFF_SIZE_SELECT cff_size_select +#else +#define CFF_SIZE_SELECT 0 +#endif + + FT_DEFINE_DRIVER(cff_driver_class, + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof( CFF_DriverRec ), + "cff", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + cff_driver_init, + cff_driver_done, + cff_get_interface, + + /* now the specific driver fields */ + sizeof( TT_FaceRec ), + sizeof( CFF_SizeRec ), + sizeof( CFF_GlyphSlotRec ), + + cff_face_init, + cff_face_done, + cff_size_init, + cff_size_done, + cff_slot_init, + cff_slot_done, + + ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + Load_Glyph, + + cff_get_kerning, + 0, /* FT_Face_AttachFunc */ + cff_get_advances, /* FT_Face_GetAdvancesFunc */ + + cff_size_request, + + CFF_SIZE_SELECT + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffdrivr.h b/alienblaster/project/jni/freetype/src/cff/cffdrivr.h new file mode 100644 index 000000000..50e813870 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffdrivr.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.h */ +/* */ +/* High-level OpenType driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFDRIVER_H__ +#define __CFFDRIVER_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_DRIVER( cff_driver_class ) + + +FT_END_HEADER + +#endif /* __CFFDRIVER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cfferrs.h b/alienblaster/project/jni/freetype/src/cff/cfferrs.h new file mode 100644 index 000000000..1b2a5c95c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cfferrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* cfferrs.h */ +/* */ +/* CFF error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the CFF error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __CFFERRS_H__ +#define __CFFERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX CFF_Err_ +#define FT_ERR_BASE FT_Mod_Err_CFF + + +#include FT_ERRORS_H + +#endif /* __CFFERRS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffgload.c b/alienblaster/project/jni/freetype/src/cff/cffgload.c new file mode 100644 index 000000000..9330c0588 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffgload.c @@ -0,0 +1,2935 @@ +/***************************************************************************/ +/* */ +/* cffgload.c */ +/* */ +/* OpenType Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_OUTLINE_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + +#include "cffobjs.h" +#include "cffload.h" +#include "cffgload.h" + +#include "cfferrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffgload + + + typedef enum CFF_Operator_ + { + cff_op_unknown = 0, + + cff_op_rmoveto, + cff_op_hmoveto, + cff_op_vmoveto, + + cff_op_rlineto, + cff_op_hlineto, + cff_op_vlineto, + + cff_op_rrcurveto, + cff_op_hhcurveto, + cff_op_hvcurveto, + cff_op_rcurveline, + cff_op_rlinecurve, + cff_op_vhcurveto, + cff_op_vvcurveto, + + cff_op_flex, + cff_op_hflex, + cff_op_hflex1, + cff_op_flex1, + + cff_op_endchar, + + cff_op_hstem, + cff_op_vstem, + cff_op_hstemhm, + cff_op_vstemhm, + + cff_op_hintmask, + cff_op_cntrmask, + cff_op_dotsection, /* deprecated, acts as no-op */ + + cff_op_abs, + cff_op_add, + cff_op_sub, + cff_op_div, + cff_op_neg, + cff_op_random, + cff_op_mul, + cff_op_sqrt, + + cff_op_blend, + + cff_op_drop, + cff_op_exch, + cff_op_index, + cff_op_roll, + cff_op_dup, + + cff_op_put, + cff_op_get, + cff_op_store, + cff_op_load, + + cff_op_and, + cff_op_or, + cff_op_not, + cff_op_eq, + cff_op_ifelse, + + cff_op_callsubr, + cff_op_callgsubr, + cff_op_return, + + /* Type 1 opcodes: invalid but seen in real life */ + cff_op_hsbw, + cff_op_closepath, + cff_op_callothersubr, + cff_op_pop, + cff_op_seac, + cff_op_sbw, + cff_op_setcurrentpoint, + + /* do not remove */ + cff_op_max + + } CFF_Operator; + + +#define CFF_COUNT_CHECK_WIDTH 0x80 +#define CFF_COUNT_EXACT 0x40 +#define CFF_COUNT_CLEAR_STACK 0x20 + + /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */ + /* used for checking the width and requested numbers of arguments */ + /* only; they are set to zero afterwards */ + + /* the other two flags are informative only and unused currently */ + + static const FT_Byte cff_argument_counts[] = + { + 0, /* unknown */ + + 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */ + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + + 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 13, /* flex */ + 7, + 9, + 11, + + 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */ + + 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */ + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + + 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */ + 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */ + 0, /* dotsection */ + + 1, /* abs */ + 2, + 2, + 2, + 1, + 0, + 2, + 1, + + 1, /* blend */ + + 1, /* drop */ + 2, + 1, + 2, + 1, + + 2, /* put */ + 1, + 4, + 3, + + 2, /* and */ + 2, + 1, + 2, + 4, + + 1, /* callsubr */ + 1, + 0, + + 2, /* hsbw */ + 0, + 0, + 0, + 5, /* seac */ + 4, /* sbw */ + 2 /* setcurrentpoint */ + }; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** GENERIC CHARSTRING PARSING *********/ + /********** *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_builder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph builder. */ + /* */ + /* <InOut> */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting is active. */ + /* */ + static void + cff_builder_init( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->path_begun = 0; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->root.memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->root.internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = 0; + builder->hints_funcs = 0; + + if ( hinting && size ) + { + CFF_Internal internal = (CFF_Internal)size->root.internal; + + + builder->hints_globals = (void *)internal->topfont; + builder->hints_funcs = glyph->root.internal->glyph_hints; + } + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_builder_done */ + /* */ + /* <Description> */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* <Input> */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + static void + cff_builder_done( CFF_Builder* builder ) + { + CFF_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->root.outline = *builder->base; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_compute_bias */ + /* */ + /* <Description> */ + /* Computes the bias value in dependence of the number of glyph */ + /* subroutines. */ + /* */ + /* <Input> */ + /* in_charstring_type :: The `CharstringType' value of the top DICT */ + /* dictionary. */ + /* */ + /* num_subrs :: The number of glyph subroutines. */ + /* */ + /* <Return> */ + /* The bias value. */ + static FT_Int + cff_compute_bias( FT_Int in_charstring_type, + FT_UInt num_subrs ) + { + FT_Int result; + + + if ( in_charstring_type == 1 ) + result = 0; + else if ( num_subrs < 1240 ) + result = 107; + else if ( num_subrs < 33900U ) + result = 1131; + else + result = 32768U; + + return result; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_decoder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph decoder. */ + /* */ + /* <InOut> */ + /* decoder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* slot :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting is active. */ + /* */ + /* hint_mode :: The hinting mode. */ + /* */ + FT_LOCAL_DEF( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + /* clear everything */ + FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); + + /* initialize builder */ + cff_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* initialize Type2 decoder */ + decoder->cff = cff; + decoder->num_globals = cff->num_global_subrs; + decoder->globals = cff->global_subrs; + decoder->globals_bias = cff_compute_bias( + cff->top_font.font_dict.charstring_type, + decoder->num_globals ); + + decoder->hint_mode = hint_mode; + } + + + /* this function is used to select the subfont */ + /* and the locals subrs array */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ) + { + CFF_Builder *builder = &decoder->builder; + CFF_Font cff = (CFF_Font)builder->face->extra.data; + CFF_SubFont sub = &cff->top_font; + FT_Error error = CFF_Err_Ok; + + + /* manage CID fonts */ + if ( cff->num_subfonts ) + { + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, glyph_index ); + + + if ( fd_index >= cff->num_subfonts ) + { + FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + FT_TRACE4(( "glyph index %d (subfont %d):\n", glyph_index, fd_index )); + + sub = cff->subfonts[fd_index]; + + if ( builder->hints_funcs && size ) + { + CFF_Internal internal = (CFF_Internal)size->root.internal; + + + /* for CFFs without subfonts, this value has already been set */ + builder->hints_globals = (void *)internal->subfonts[fd_index]; + } + } +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE4(( "glyph index %d:\n", glyph_index )); +#endif + + decoder->num_locals = sub->num_local_subrs; + decoder->locals = sub->local_subrs; + decoder->locals_bias = cff_compute_bias( + decoder->cff->top_font.font_dict.charstring_type, + decoder->num_locals ); + + decoder->glyph_width = sub->private_dict.default_width; + decoder->nominal_width = sub->private_dict.nominal_width; + + Exit: + return error; + } + + + /* check that there is enough space for `count' more points */ + static FT_Error + check_points( CFF_Builder* builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + static void + cff_builder_add_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + + + point->x = x >> 16; + point->y = y >> 16; + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + static FT_Error + cff_builder_add_point1( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = check_points( builder, 1 ); + if ( !error ) + cff_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + static FT_Error + cff_builder_add_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + if ( !builder->load_points ) + { + outline->n_contours++; + return CFF_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + static FT_Error + cff_builder_start_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = CFF_Err_Ok; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + error = cff_builder_add_contour( builder ); + if ( !error ) + error = cff_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + static void + cff_builder_close_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and if it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether begin point and last point are the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + static FT_Int + cff_lookup_glyph_by_stdcharcode( CFF_Font cff, + FT_Int charcode ) + { + FT_UInt n; + FT_UShort glyph_sid; + + + /* CID-keyed fonts don't have glyph names */ + if ( !cff->charset.sids ) + return -1; + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + /* Get code to SID mapping from `cff_standard_encoding'. */ + glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode ); + + for ( n = 0; n < cff->num_glyphs; n++ ) + { + if ( cff->charset.sids[n] == glyph_sid ) + return n; + } + + return -1; + } + + + static FT_Error + cff_get_glyph_data( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + FT_Error error = + face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &data ); + + + *pointer = (FT_Byte*)data.pointer; + *length = data.length; + + return error; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + return cff_index_access_element( &cff->charstrings_index, glyph_index, + pointer, length ); + } + } + + + static void + cff_free_glyph_data( TT_Face face, + FT_Byte** pointer, + FT_ULong length ) + { +#ifndef FT_CONFIG_OPTION_INCREMENTAL + FT_UNUSED( length ); +#endif + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + + + data.pointer = *pointer; + data.length = length; + + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, &data ); + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + cff_index_forget_element( &cff->charstrings_index, pointer ); + } + } + + + static FT_Error + cff_operator_seac( CFF_Decoder* decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + CFF_Builder* builder = &decoder->builder; + FT_Int bchar_index, achar_index; + TT_Face face = decoder->builder.face; + FT_Vector left_bearing, advance; + FT_Byte* charstring; + FT_ULong charstring_len; + FT_Pos glyph_width; + + + if ( decoder->seac ) + { + FT_ERROR(( "cff_operator_seac: invalid nested seac\n" )); + return CFF_Err_Syntax_Error; + } + + adx += decoder->builder.left_bearing.x; + ady += decoder->builder.left_bearing.y; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Incremental fonts don't necessarily have valid charsets. */ + /* They use the character code, not the glyph index, in this case. */ + if ( face->root.internal->incremental_interface ) + { + bchar_index = bchar; + achar_index = achar; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar ); + achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "cff_operator_seac:" + " invalid seac character code arguments\n" )); + return CFF_Err_Syntax_Error; + } + + /* If we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( builder->no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)( adx >> 16 ); + subg->arg2 = (FT_Int)( ady >> 16 ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + } + + FT_GlyphLoader_Prepare( builder->loader ); + + /* First load `bchar' in builder */ + error = cff_get_glyph_data( face, bchar_index, + &charstring, &charstring_len ); + if ( !error ) + { + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len ); + decoder->seac = FALSE; + + if ( error ) + goto Exit; + + cff_free_glyph_data( face, &charstring, charstring_len ); + } + + /* Save the left bearing, advance and glyph width of the base */ + /* character as they will be erased by the next load. */ + + left_bearing = builder->left_bearing; + advance = builder->advance; + glyph_width = decoder->glyph_width; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + + builder->pos_x = adx - asb; + builder->pos_y = ady; + + /* Now load `achar' on top of the base outline. */ + error = cff_get_glyph_data( face, achar_index, + &charstring, &charstring_len ); + if ( !error ) + { + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len ); + decoder->seac = FALSE; + + if ( error ) + goto Exit; + + cff_free_glyph_data( face, &charstring, charstring_len ); + } + + /* Restore the left side bearing, advance and glyph width */ + /* of the base character. */ + builder->left_bearing = left_bearing; + builder->advance = advance; + decoder->glyph_width = glyph_width; + + builder->pos_x = 0; + builder->pos_y = 0; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cff_decoder_parse_charstrings */ + /* */ + /* <Description> */ + /* Parses a given Type 2 charstrings program. */ + /* */ + /* <InOut> */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* <Input> */ + /* charstring_base :: The base of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ) + { + FT_Error error; + CFF_Decoder_Zone* zone; + FT_Byte* ip; + FT_Byte* limit; + CFF_Builder* builder = &decoder->builder; + FT_Pos x, y; + FT_Fixed seed; + FT_Fixed* stack; + FT_Int charstring_type = + decoder->cff->top_font.font_dict.charstring_type; + + T2_Hints_Funcs hinter; + + + /* set default width */ + decoder->num_hints = 0; + decoder->read_width = 1; + + /* compute random seed from stack address of parameter */ + seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^ + (FT_PtrDist)(char*)&decoder ^ + (FT_PtrDist)(char*)&charstring_base ) & + FT_ULONG_MAX ) ; + seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; + if ( seed == 0 ) + seed = 0x7384; + + /* initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + stack = decoder->top; + + hinter = (T2_Hints_Funcs)builder->hints_funcs; + + builder->path_begun = 0; + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = CFF_Err_Ok; + + x = builder->pos_x; + y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + /* now execute loop */ + while ( ip < limit ) + { + CFF_Operator op; + FT_Byte v; + + + /********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + v = *ip++; + if ( v >= 32 || v == 28 ) + { + FT_Int shift = 16; + FT_Int32 val; + + + /* this is an operand, push it on the stack */ + if ( v == 28 ) + { + if ( ip + 1 >= limit ) + goto Syntax_Error; + val = (FT_Short)( ( (FT_Short)ip[0] << 8 ) | ip[1] ); + ip += 2; + } + else if ( v < 247 ) + val = (FT_Int32)v - 139; + else if ( v < 251 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108; + } + else if ( v < 255 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108; + } + else + { + if ( ip + 3 >= limit ) + goto Syntax_Error; + val = ( (FT_Int32)ip[0] << 24 ) | + ( (FT_Int32)ip[1] << 16 ) | + ( (FT_Int32)ip[2] << 8 ) | + ip[3]; + ip += 4; + if ( charstring_type == 2 ) + shift = 0; + } + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; + + val <<= shift; + *decoder->top++ = val; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !( val & 0xFFFFL ) ) + FT_TRACE4(( " %ld", (FT_Int32)( val >> 16 ) )); + else + FT_TRACE4(( " %.2f", val / 65536.0 )); +#endif + + } + else + { + /* The specification says that normally arguments are to be taken */ + /* from the bottom of the stack. However, this seems not to be */ + /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */ + /* arguments similar to a PS interpreter. */ + + FT_Fixed* args = decoder->top; + FT_Int num_args = (FT_Int)( args - decoder->stack ); + FT_Int req_args; + + + /* find operator */ + op = cff_op_unknown; + + switch ( v ) + { + case 1: + op = cff_op_hstem; + break; + case 3: + op = cff_op_vstem; + break; + case 4: + op = cff_op_vmoveto; + break; + case 5: + op = cff_op_rlineto; + break; + case 6: + op = cff_op_hlineto; + break; + case 7: + op = cff_op_vlineto; + break; + case 8: + op = cff_op_rrcurveto; + break; + case 9: + op = cff_op_closepath; + break; + case 10: + op = cff_op_callsubr; + break; + case 11: + op = cff_op_return; + break; + case 12: + { + if ( ip >= limit ) + goto Syntax_Error; + v = *ip++; + + switch ( v ) + { + case 0: + op = cff_op_dotsection; + break; + case 1: /* this is actually the Type1 vstem3 operator */ + op = cff_op_vstem; + break; + case 2: /* this is actually the Type1 hstem3 operator */ + op = cff_op_hstem; + break; + case 3: + op = cff_op_and; + break; + case 4: + op = cff_op_or; + break; + case 5: + op = cff_op_not; + break; + case 6: + op = cff_op_seac; + break; + case 7: + op = cff_op_sbw; + break; + case 8: + op = cff_op_store; + break; + case 9: + op = cff_op_abs; + break; + case 10: + op = cff_op_add; + break; + case 11: + op = cff_op_sub; + break; + case 12: + op = cff_op_div; + break; + case 13: + op = cff_op_load; + break; + case 14: + op = cff_op_neg; + break; + case 15: + op = cff_op_eq; + break; + case 16: + op = cff_op_callothersubr; + break; + case 17: + op = cff_op_pop; + break; + case 18: + op = cff_op_drop; + break; + case 20: + op = cff_op_put; + break; + case 21: + op = cff_op_get; + break; + case 22: + op = cff_op_ifelse; + break; + case 23: + op = cff_op_random; + break; + case 24: + op = cff_op_mul; + break; + case 26: + op = cff_op_sqrt; + break; + case 27: + op = cff_op_dup; + break; + case 28: + op = cff_op_exch; + break; + case 29: + op = cff_op_index; + break; + case 30: + op = cff_op_roll; + break; + case 33: + op = cff_op_setcurrentpoint; + break; + case 34: + op = cff_op_hflex; + break; + case 35: + op = cff_op_flex; + break; + case 36: + op = cff_op_hflex1; + break; + case 37: + op = cff_op_flex1; + break; + default: + /* decrement ip for syntax error message */ + ip--; + } + } + break; + case 13: + op = cff_op_hsbw; + break; + case 14: + op = cff_op_endchar; + break; + case 16: + op = cff_op_blend; + break; + case 18: + op = cff_op_hstemhm; + break; + case 19: + op = cff_op_hintmask; + break; + case 20: + op = cff_op_cntrmask; + break; + case 21: + op = cff_op_rmoveto; + break; + case 22: + op = cff_op_hmoveto; + break; + case 23: + op = cff_op_vstemhm; + break; + case 24: + op = cff_op_rcurveline; + break; + case 25: + op = cff_op_rlinecurve; + break; + case 26: + op = cff_op_vvcurveto; + break; + case 27: + op = cff_op_hhcurveto; + break; + case 29: + op = cff_op_callgsubr; + break; + case 30: + op = cff_op_vhcurveto; + break; + case 31: + op = cff_op_hvcurveto; + break; + default: + break; + } + + if ( op == cff_op_unknown ) + goto Syntax_Error; + + /* check arguments */ + req_args = cff_argument_counts[op]; + if ( req_args & CFF_COUNT_CHECK_WIDTH ) + { + if ( num_args > 0 && decoder->read_width ) + { + /* If `nominal_width' is non-zero, the number is really a */ + /* difference against `nominal_width'. Else, the number here */ + /* is truly a width, not a difference against `nominal_width'. */ + /* If the font does not set `nominal_width', then */ + /* `nominal_width' defaults to zero, and so we can set */ + /* `glyph_width' to `nominal_width' plus number on the stack */ + /* -- for either case. */ + + FT_Int set_width_ok; + + + switch ( op ) + { + case cff_op_hmoveto: + case cff_op_vmoveto: + set_width_ok = num_args & 2; + break; + + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + case cff_op_rmoveto: + case cff_op_hintmask: + case cff_op_cntrmask: + set_width_ok = num_args & 1; + break; + + case cff_op_endchar: + /* If there is a width specified for endchar, we either have */ + /* 1 argument or 5 arguments. We like to argue. */ + set_width_ok = ( num_args == 5 ) || ( num_args == 1 ); + break; + + default: + set_width_ok = 0; + break; + } + + if ( set_width_ok ) + { + decoder->glyph_width = decoder->nominal_width + + ( stack[0] >> 16 ); + + if ( decoder->width_only ) + { + /* we only want the advance width; stop here */ + break; + } + + /* Consumed an argument. */ + num_args--; + } + } + + decoder->read_width = 0; + req_args = 0; + } + + req_args &= 0x000F; + if ( num_args < req_args ) + goto Stack_Underflow; + args -= req_args; + num_args -= req_args; + + /* At this point, `args' points to the first argument of the */ + /* operand in case `req_args' isn't zero. Otherwise, we have */ + /* to adjust `args' manually. */ + + /* Note that we only pop arguments from the stack which we */ + /* really need and can digest so that we can continue in case */ + /* of superfluous stack elements. */ + + switch ( op ) + { + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + /* the number of arguments is always even here */ + FT_TRACE4(( + op == cff_op_hstem ? " hstem\n" : + ( op == cff_op_vstem ? " vstem\n" : + ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) )); + + if ( hinter ) + hinter->stems( hinter->hints, + ( op == cff_op_hstem || op == cff_op_hstemhm ), + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + args = stack; + break; + + case cff_op_hintmask: + case cff_op_cntrmask: + FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" )); + + /* implement vstem when needed -- */ + /* the specification doesn't say it, but this also works */ + /* with the 'cntrmask' operator */ + /* */ + if ( num_args > 0 ) + { + if ( hinter ) + hinter->stems( hinter->hints, + 0, + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + } + + if ( hinter ) + { + if ( op == cff_op_hintmask ) + hinter->hintmask( hinter->hints, + builder->current->n_points, + decoder->num_hints, + ip ); + else + hinter->counter( hinter->hints, + decoder->num_hints, + ip ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt maskbyte; + + + FT_TRACE4(( " (maskbytes: " )); + + for ( maskbyte = 0; + maskbyte < (FT_UInt)(( decoder->num_hints + 7 ) >> 3); + maskbyte++, ip++ ) + FT_TRACE4(( "0x%02X", *ip )); + + FT_TRACE4(( ")\n" )); + } +#else + ip += ( decoder->num_hints + 7 ) >> 3; +#endif + if ( ip >= limit ) + goto Syntax_Error; + args = stack; + break; + + case cff_op_rmoveto: + FT_TRACE4(( " rmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x += args[-2]; + y += args[-1]; + args = stack; + break; + + case cff_op_vmoveto: + FT_TRACE4(( " vmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + y += args[-1]; + args = stack; + break; + + case cff_op_hmoveto: + FT_TRACE4(( " hmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x += args[-1]; + args = stack; + break; + + case cff_op_rlineto: + FT_TRACE4(( " rlineto\n" )); + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_args / 2 ) ) + goto Fail; + + if ( num_args < 2 ) + goto Stack_Underflow; + + args -= num_args & ~1; + while ( args < decoder->top ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args += 2; + } + args = stack; + break; + + case cff_op_hlineto: + case cff_op_vlineto: + { + FT_Int phase = ( op == cff_op_hlineto ); + + + FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n" + : " vlineto\n" )); + + if ( num_args < 1 ) + goto Stack_Underflow; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_args ) ) + goto Fail; + + args = stack; + while ( args < decoder->top ) + { + if ( phase ) + x += args[0]; + else + y += args[0]; + + if ( cff_builder_add_point1( builder, x, y ) ) + goto Fail; + + args++; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rrcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " rrcurveto\n" )); + + if ( num_args < 6 ) + goto Stack_Underflow; + + nargs = num_args - num_args % 6; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, nargs / 2 ) ) + goto Fail; + + args -= nargs; + while ( args < decoder->top ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args += 6; + } + args = stack; + } + break; + + case cff_op_vvcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " vvcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we reduce it to 4n+1 */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + + if ( nargs & 1 ) + { + x += args[0]; + args++; + nargs--; + } + + if ( check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + y += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + y += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + args += 4; + } + args = stack; + } + break; + + case cff_op_hhcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " hhcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we reduce it to 4n+1 */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + if ( nargs & 1 ) + { + y += args[0]; + args++; + nargs--; + } + + if ( check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + args += 4; + } + args = stack; + } + break; + + case cff_op_vhcurveto: + case cff_op_hvcurveto: + { + FT_Int phase; + FT_Int nargs; + + + FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n" + : " hvcurveto\n" )); + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */ + /* we reduce it to the largest one which fits */ + + nargs = num_args - num_args % 4; + if ( num_args - nargs > 0 ) + nargs += 1; + + args -= nargs; + if ( check_points( builder, ( nargs / 4 ) * 3 ) ) + goto Stack_Underflow; + + phase = ( op == cff_op_hvcurveto ); + + while ( nargs >= 4 ) + { + nargs -= 4; + if ( phase ) + { + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + y += args[3]; + if ( nargs == 1 ) + x += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + } + else + { + y += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[3]; + if ( nargs == 1 ) + y += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + } + args += 4; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rlinecurve: + { + FT_Int num_lines; + FT_Int nargs; + + + FT_TRACE4(( " rlinecurve\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args & ~1; + num_lines = ( nargs - 6 ) / 2; + + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, num_lines + 3 ) ) + goto Fail; + + args -= nargs; + + /* first, add the line segments */ + while ( num_lines > 0 ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args += 2; + num_lines--; + } + + /* then the curve */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args = stack; + } + break; + + case cff_op_rcurveline: + { + FT_Int num_curves; + FT_Int nargs; + + + FT_TRACE4(( " rcurveline\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args - 2; + nargs = nargs - nargs % 6 + 2; + num_curves = ( nargs - 2 ) / 6; + + if ( cff_builder_start_point ( builder, x, y ) || + check_points( builder, num_curves * 3 + 2 ) ) + goto Fail; + + args -= nargs; + + /* first, add the curves */ + while ( num_curves > 0 ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + x += args[4]; + y += args[5]; + cff_builder_add_point( builder, x, y, 1 ); + args += 6; + num_curves--; + } + + /* then the final line */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 1 ); + args = stack; + } + break; + + case cff_op_hflex1: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex1\n" )); + + /* adding five more points: 4 control points, 1 on-curve point */ + /* -- make sure we have enough space for the start point if it */ + /* needs to be added */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y position for later use */ + start_y = y; + + /* first control point */ + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x += args[2]; + y += args[3]; + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x += args[4]; + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x += args[5]; + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x += args[6]; + y += args[7]; + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start */ + x += args[8]; + y = start_y; + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_hflex: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y-position for later use */ + start_y = y; + + /* first control point */ + x += args[0]; + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x += args[1]; + y += args[2]; + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x += args[3]; + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x += args[4]; + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x += args[5]; + y = start_y; + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start point's */ + /* y-value -- we don't add this point, though */ + x += args[6]; + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex1: + { + FT_Pos start_x, start_y; /* record start x, y values for */ + /* alter use */ + FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ + /* algorithm below */ + FT_Int horizontal, count; + FT_Fixed* temp; + + + FT_TRACE4(( " flex1\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's x, y position for later use */ + start_x = x; + start_y = y; + + /* XXX: figure out whether this is supposed to be a horizontal */ + /* or vertical flex; the Type 2 specification is vague... */ + + temp = args; + + /* grab up to the last argument */ + for ( count = 5; count > 0; count-- ) + { + dx += temp[0]; + dy += temp[1]; + temp += 2; + } + + if ( dx < 0 ) + dx = -dx; + if ( dy < 0 ) + dy = -dy; + + /* strange test, but here it is... */ + horizontal = ( dx > dy ); + + for ( count = 5; count > 0; count-- ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, + (FT_Bool)( count == 3 ) ); + args += 2; + } + + /* is last operand an x- or y-delta? */ + if ( horizontal ) + { + x += args[0]; + y = start_y; + } + else + { + x = start_x; + y += args[0]; + } + + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex: + { + FT_UInt count; + + + FT_TRACE4(( " flex\n" )); + + if ( cff_builder_start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + + for ( count = 6; count > 0; count-- ) + { + x += args[0]; + y += args[1]; + cff_builder_add_point( builder, x, y, + (FT_Bool)( count == 4 || count == 1 ) ); + args += 2; + } + + args = stack; + } + break; + + case cff_op_seac: + FT_TRACE4(( " seac\n" )); + + error = cff_operator_seac( decoder, + args[0], args[1], args[2], + (FT_Int)( args[3] >> 16 ), + (FT_Int)( args[4] >> 16 ) ); + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_endchar: + FT_TRACE4(( " endchar\n" )); + + /* We are going to emulate the seac operator. */ + if ( num_args >= 4 ) + { + /* Save glyph width so that the subglyphs don't overwrite it. */ + FT_Pos glyph_width = decoder->glyph_width; + + error = cff_operator_seac( decoder, + 0L, args[-4], args[-3], + (FT_Int)( args[-2] >> 16 ), + (FT_Int)( args[-1] >> 16 ) ); + + decoder->glyph_width = glyph_width; + } + else + { + if ( !error ) + error = CFF_Err_Ok; + + cff_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, + builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + } + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_abs: + FT_TRACE4(( " abs\n" )); + + if ( args[0] < 0 ) + args[0] = -args[0]; + args++; + break; + + case cff_op_add: + FT_TRACE4(( " add\n" )); + + args[0] += args[1]; + args++; + break; + + case cff_op_sub: + FT_TRACE4(( " sub\n" )); + + args[0] -= args[1]; + args++; + break; + + case cff_op_div: + FT_TRACE4(( " div\n" )); + + args[0] = FT_DivFix( args[0], args[1] ); + args++; + break; + + case cff_op_neg: + FT_TRACE4(( " neg\n" )); + + args[0] = -args[0]; + args++; + break; + + case cff_op_random: + { + FT_Fixed Rand; + + + FT_TRACE4(( " rand\n" )); + + Rand = seed; + if ( Rand >= 0x8000L ) + Rand++; + + args[0] = Rand; + seed = FT_MulFix( seed, 0x10000L - seed ); + if ( seed == 0 ) + seed += 0x2873; + args++; + } + break; + + case cff_op_mul: + FT_TRACE4(( " mul\n" )); + + args[0] = FT_MulFix( args[0], args[1] ); + args++; + break; + + case cff_op_sqrt: + FT_TRACE4(( " sqrt\n" )); + + if ( args[0] > 0 ) + { + FT_Int count = 9; + FT_Fixed root = args[0]; + FT_Fixed new_root; + + + for (;;) + { + new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1; + if ( new_root == root || count <= 0 ) + break; + root = new_root; + } + args[0] = new_root; + } + else + args[0] = 0; + args++; + break; + + case cff_op_drop: + /* nothing */ + FT_TRACE4(( " drop\n" )); + + break; + + case cff_op_exch: + { + FT_Fixed tmp; + + + FT_TRACE4(( " exch\n" )); + + tmp = args[0]; + args[0] = args[1]; + args[1] = tmp; + args += 2; + } + break; + + case cff_op_index: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + + + FT_TRACE4(( " index\n" )); + + if ( idx < 0 ) + idx = 0; + else if ( idx > num_args - 2 ) + idx = num_args - 2; + args[0] = args[-( idx + 1 )]; + args++; + } + break; + + case cff_op_roll: + { + FT_Int count = (FT_Int)( args[0] >> 16 ); + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " roll\n" )); + + if ( count <= 0 ) + count = 1; + + args -= count; + if ( args < stack ) + goto Stack_Underflow; + + if ( idx >= 0 ) + { + while ( idx > 0 ) + { + FT_Fixed tmp = args[count - 1]; + FT_Int i; + + + for ( i = count - 2; i >= 0; i-- ) + args[i + 1] = args[i]; + args[0] = tmp; + idx--; + } + } + else + { + while ( idx < 0 ) + { + FT_Fixed tmp = args[0]; + FT_Int i; + + + for ( i = 0; i < count - 1; i++ ) + args[i] = args[i + 1]; + args[count - 1] = tmp; + idx++; + } + } + args += count; + } + break; + + case cff_op_dup: + FT_TRACE4(( " dup\n" )); + + args[1] = args[0]; + args += 2; + break; + + case cff_op_put: + { + FT_Fixed val = args[0]; + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " put\n" )); + + if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) + decoder->buildchar[idx] = val; + } + break; + + case cff_op_get: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + FT_Fixed val = 0; + + + FT_TRACE4(( " get\n" )); + + if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) + val = decoder->buildchar[idx]; + + args[0] = val; + args++; + } + break; + + case cff_op_store: + FT_TRACE4(( " store\n")); + + goto Unimplemented; + + case cff_op_load: + FT_TRACE4(( " load\n" )); + + goto Unimplemented; + + case cff_op_dotsection: + /* this operator is deprecated and ignored by the parser */ + FT_TRACE4(( " dotsection\n" )); + break; + + case cff_op_closepath: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " closepath (invalid op)\n" )); + + args = stack; + break; + + case cff_op_hsbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " hsbw (invalid op)\n" )); + + decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 ); + + decoder->builder.left_bearing.x = args[0]; + decoder->builder.left_bearing.y = 0; + + x = decoder->builder.pos_x + args[0]; + y = decoder->builder.pos_y; + args = stack; + break; + + case cff_op_sbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " sbw (invalid op)\n" )); + + decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 ); + + decoder->builder.left_bearing.x = args[0]; + decoder->builder.left_bearing.y = args[1]; + + x = decoder->builder.pos_x + args[0]; + y = decoder->builder.pos_y + args[1]; + args = stack; + break; + + case cff_op_setcurrentpoint: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " setcurrentpoint (invalid op)\n" )); + + x = decoder->builder.pos_x + args[0]; + y = decoder->builder.pos_y + args[1]; + args = stack; + break; + + case cff_op_callothersubr: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " callothersubr (invalid op)\n" )); + + /* subsequent `pop' operands should add the arguments, */ + /* this is the implementation described for `unknown' other */ + /* subroutines in the Type1 spec. */ + args -= 2 + ( args[-2] >> 16 ); + break; + + case cff_op_pop: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " pop (invalid op)\n" )); + + args++; + break; + + case cff_op_and: + { + FT_Fixed cond = args[0] && args[1]; + + + FT_TRACE4(( " and\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_or: + { + FT_Fixed cond = args[0] || args[1]; + + + FT_TRACE4(( " or\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_eq: + { + FT_Fixed cond = !args[0]; + + + FT_TRACE4(( " eq\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_ifelse: + { + FT_Fixed cond = ( args[2] <= args[3] ); + + + FT_TRACE4(( " ifelse\n" )); + + if ( !cond ) + args[0] = args[1]; + args++; + } + break; + + case cff_op_callsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->locals_bias ); + + + FT_TRACE4(( " callsubr(%d)\n", idx )); + + if ( idx >= decoder->num_locals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invalid local subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->locals[idx]; + zone->limit = decoder->locals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_callgsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->globals_bias ); + + + FT_TRACE4(( " callgsubr(%d)\n", idx )); + + if ( idx >= decoder->num_globals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invalid global subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->globals[idx]; + zone->limit = decoder->globals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_return: + FT_TRACE4(( " return\n" )); + + if ( decoder->zone <= decoder->zones ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + decoder->zone--; + zone = decoder->zone; + ip = zone->cursor; + limit = zone->limit; + break; + + default: + Unimplemented: + FT_ERROR(( "Unimplemented opcode: %d", ip[-1] )); + + if ( ip[-1] == 12 ) + FT_ERROR(( " %d", ip[0] )); + FT_ERROR(( "\n" )); + + return CFF_Err_Unimplemented_Feature; + } + + decoder->top = args; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + Fail: + return error; + + Syntax_Error: + FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" )); + return CFF_Err_Invalid_File_Format; + + Stack_Underflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" )); + return CFF_Err_Too_Few_Arguments; + + Stack_Overflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" )); + return CFF_Err_Stack_Overflow; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#if 0 /* unused until we support pure CFF fonts */ + + + FT_LOCAL_DEF( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ) + { + FT_Error error = CFF_Err_Ok; + CFF_Decoder decoder; + FT_Int glyph_index; + CFF_Font cff = (CFF_Font)face->other; + + + *max_advance = 0; + + /* Initialize load decoder */ + cff_decoder_init( &decoder, face, 0, 0, 0, 0 ); + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + /* For each glyph, parse the glyph charstring and extract */ + /* the advance width. */ + for ( glyph_index = 0; glyph_index < face->root.num_glyphs; + glyph_index++ ) + { + FT_Byte* charstring; + FT_ULong charstring_len; + + + /* now get load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = cff_decoder_prepare( &decoder, size, glyph_index ); + if ( !error ) + error = cff_decoder_parse_charstrings( &decoder, + charstring, + charstring_len ); + + cff_free_glyph_data( face, &charstring, &charstring_len ); + } + + /* ignore the error if one has occurred -- skip to next glyph */ + error = CFF_Err_Ok; + } + + *max_advance = decoder.builder.advance.x; + + return CFF_Err_Ok; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_Decoder decoder; + TT_Face face = (TT_Face)glyph->root.face; + FT_Bool hinting, force_scaling; + CFF_Font cff = (CFF_Font)face->extra.data; + + FT_Matrix font_matrix; + FT_Vector font_offset; + + + force_scaling = FALSE; + + /* in a CID-keyed font, consider `glyph_index' as a CID and map */ + /* it immediately to the real glyph_index -- if it isn't a */ + /* subsetted font, glyph_indices and CIDs are identical, though */ + if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && + cff->charset.cids ) + { + /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */ + if ( glyph_index != 0 ) + { + glyph_index = cff_charset_cid_to_gindex( &cff->charset, + glyph_index ); + if ( glyph_index == 0 ) + return CFF_Err_Invalid_Argument; + } + } + else if ( glyph_index >= cff->num_glyphs ) + return CFF_Err_Invalid_Argument; + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + glyph->x_scale = 0x10000L; + glyph->y_scale = 0x10000L; + if ( size ) + { + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size ) + { + CFF_Face cff_face = (CFF_Face)size->root.face; + SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt; + FT_Stream stream = cff_face->root.stream; + + + if ( size->strike_index != 0xFFFFFFFFUL && + sfnt->load_eblc && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + TT_SBit_MetricsRec metrics; + + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_Int)load_flags, + stream, + &glyph->root.bitmap, + &metrics ); + + if ( !error ) + { + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + glyph->root.metrics.width = (FT_Pos)metrics.width << 6; + glyph->root.metrics.height = (FT_Pos)metrics.height << 6; + + glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; + glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; + glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; + + glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; + glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; + glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; + + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->root.bitmap_left = metrics.vertBearingX; + glyph->root.bitmap_top = metrics.vertBearingY; + } + else + { + glyph->root.bitmap_left = metrics.horiBearingX; + glyph->root.bitmap_top = metrics.horiBearingY; + } + return error; + } + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* return immediately if we only want the embedded bitmaps */ + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return CFF_Err_Invalid_Argument; + + /* if we have a CID subfont, use its matrix (which has already */ + /* been multiplied with the root matrix) */ + + /* this scaling is only relevant if the PS hinter isn't active */ + if ( cff->num_subfonts ) + { + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, + glyph_index ); + + FT_ULong top_upm = cff->top_font.font_dict.units_per_em; + FT_ULong sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em; + + + font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; + font_offset = cff->subfonts[fd_index]->font_dict.font_offset; + + if ( top_upm != sub_upm ) + { + glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm ); + glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm ); + + force_scaling = TRUE; + } + } + else + { + font_matrix = cff->top_font.font_dict.font_matrix; + font_offset = cff->top_font.font_dict.font_offset; + } + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */ + + { + FT_Byte* charstring; + FT_ULong charstring_len; + + + cff_decoder_init( &decoder, face, size, glyph, hinting, + FT_LOAD_TARGET_MODE( load_flags ) ); + + if ( load_flags & FT_LOAD_ADVANCE_ONLY ) + decoder.width_only = TRUE; + + decoder.builder.no_recurse = + (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE ); + + /* now load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = cff_decoder_prepare( &decoder, size, glyph_index ); + if ( !error ) + { + error = cff_decoder_parse_charstrings( &decoder, + charstring, + charstring_len ); + + cff_free_glyph_data( face, &charstring, charstring_len ); + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Control data and length may not be available for incremental */ + /* fonts. */ + if ( face->root.internal->incremental_interface ) + { + glyph->root.control_data = 0; + glyph->root.control_len = 0; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* We set control_data and control_len if charstrings is loaded. */ + /* See how charstring loads at cff_index_access_element() in */ + /* cffload.c. */ + { + CFF_Index csindex = &cff->charstrings_index; + + + if ( csindex->offsets ) + { + glyph->root.control_data = csindex->bytes + + csindex->offsets[glyph_index] - 1; + glyph->root.control_len = charstring_len; + } + } + } + } + + /* save new glyph tables */ + cff_builder_done( &decoder.builder ); + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && + face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = decoder.builder.left_bearing.x; + metrics.bearing_y = 0; + metrics.advance = decoder.builder.advance.x; + metrics.advance_v = decoder.builder.advance.y; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + + decoder.builder.left_bearing.x = metrics.bearing_x; + decoder.builder.advance.x = metrics.advance; + decoder.builder.advance.y = metrics.advance_v; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + if ( !error ) + { + /* Now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax. */ + + /* For composite glyphs, return only left side bearing and */ + /* advance width. */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = glyph->root.internal; + + + glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; + glyph->root.metrics.horiAdvance = decoder.glyph_width; + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &glyph->root.metrics; + FT_Vector advance; + FT_Bool has_vertical_info; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = decoder.glyph_width; + glyph->root.linearHoriAdvance = decoder.glyph_width; + glyph->root.internal->glyph_transformed = 0; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + has_vertical_info = FT_BOOL( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 && + face->vertical.long_metrics ); +#else + has_vertical_info = FT_BOOL( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ); +#endif + + /* get the vertical metrics from the vtmx table if we have one */ + if ( has_vertical_info ) + { + FT_Short vertBearingY = 0; + FT_UShort vertAdvance = 0; + + + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, + glyph_index, + &vertBearingY, + &vertAdvance ); + metrics->vertBearingY = vertBearingY; + metrics->vertAdvance = vertAdvance; + } + else + { + /* make up vertical ones */ + if ( face->os2.version != 0xFFFFU ) + metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + } + + glyph->root.linearVertAdvance = metrics->vertAdvance; + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + glyph->root.outline.flags = 0; + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; + + if ( !( font_matrix.xx == 0x10000L && + font_matrix.yy == 0x10000L && + font_matrix.xy == 0 && + font_matrix.yx == 0 ) ) + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + if ( !( font_offset.x == 0 && + font_offset.y == 0 ) ) + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, font_offset.y ); + + advance.x = metrics->horiAdvance; + advance.y = 0; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->horiAdvance = advance.x + font_offset.x; + + advance.x = 0; + advance.y = metrics->vertAdvance; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->vertAdvance = advance.y + font_offset.y; + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = &glyph->root.outline; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( has_vertical_info ) + metrics->vertBearingX = metrics->horiBearingX - + metrics->horiAdvance / 2; + else + { + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffgload.h b/alienblaster/project/jni/freetype/src/cff/cffgload.h new file mode 100644 index 000000000..38937be5c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffgload.h @@ -0,0 +1,201 @@ +/***************************************************************************/ +/* */ +/* cffgload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFGLOAD_H__ +#define __CFFGLOAD_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include "cffobjs.h" + + +FT_BEGIN_HEADER + + +#define CFF_MAX_OPERANDS 48 +#define CFF_MAX_SUBRS_CALLS 32 +#define CFF_MAX_TRANS_ELEMENTS 32 + + + /*************************************************************************/ + /* */ + /* <Structure> */ + /* CFF_Builder */ + /* */ + /* <Description> */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* <Fields> */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* loader :: The current glyph loader. */ + /* */ + /* base :: The base glyph outline. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* pos_x :: The horizontal translation (if composite glyph). */ + /* */ + /* pos_y :: The vertical translation (if composite glyph). */ + /* */ + /* left_bearing :: The left side bearing point. */ + /* */ + /* advance :: The horizontal advance vector. */ + /* */ + /* bbox :: Unused. */ + /* */ + /* path_begun :: A flag which indicates that a new path has begun. */ + /* */ + /* load_points :: If this flag is not set, no points are loaded. */ + /* */ + /* no_recurse :: Set but not used. */ + /* */ + /* metrics_only :: A boolean indicating that we only want to compute */ + /* the metrics of a given glyph, not load all of its */ + /* points. */ + /* */ + /* hints_funcs :: Auxiliary pointer for hinting. */ + /* */ + /* hints_globals :: Auxiliary pointer for hinting. */ + /* */ + typedef struct CFF_Builder_ + { + FT_Memory memory; + TT_Face face; + CFF_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + FT_Bool path_begun; + FT_Bool load_points; + FT_Bool no_recurse; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + } CFF_Builder; + + + /* execution context charstring zone */ + + typedef struct CFF_Decoder_Zone_ + { + FT_Byte* base; + FT_Byte* limit; + FT_Byte* cursor; + + } CFF_Decoder_Zone; + + + typedef struct CFF_Decoder_ + { + CFF_Builder builder; + CFF_Font cff; + + FT_Fixed stack[CFF_MAX_OPERANDS + 1]; + FT_Fixed* top; + + CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1]; + CFF_Decoder_Zone* zone; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + FT_Pos glyph_width; + FT_Pos nominal_width; + + FT_Bool read_width; + FT_Bool width_only; + FT_Int num_hints; + FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS]; + + FT_UInt num_locals; + FT_UInt num_globals; + + FT_Int locals_bias; + FT_Int globals_bias; + + FT_Byte** locals; + FT_Byte** globals; + + FT_Byte** glyph_names; /* for pure CFF fonts only */ + FT_UInt num_glyphs; /* number of glyphs in font */ + + FT_Render_Mode hint_mode; + + FT_Bool seac; + + } CFF_Decoder; + + + FT_LOCAL( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode ); + + FT_LOCAL( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ); + +#if 0 /* unused until we support pure CFF fonts */ + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + FT_LOCAL( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __CFFGLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffload.c b/alienblaster/project/jni/freetype/src/cff/cffload.c new file mode 100644 index 000000000..64d139572 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffload.c @@ -0,0 +1,1638 @@ +/***************************************************************************/ +/* */ +/* cffload.c */ +/* */ +/* OpenType and CFF data/program tables loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_TRUETYPE_TAGS_H +#include FT_TYPE1_TABLES_H + +#include "cffload.h" +#include "cffparse.h" + +#include "cfferrs.h" + + +#if 1 + + static const FT_UShort cff_isoadobe_charset[229] = + { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228 + }; + + static const FT_UShort cff_expert_charset[166] = + { + 0, 1, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, + 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 326, 150, + 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 + }; + + static const FT_UShort cff_expertsubset_charset[87] = + { + 0, 1, 231, 232, 235, 236, 237, 238, + 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, + 249, 250, 251, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, + 300, 301, 302, 305, 314, 315, 158, 155, + 163, 320, 321, 322, 323, 324, 325, 326, + 150, 164, 169, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 + }; + + static const FT_UShort cff_standard_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 115, 116, + 117, 118, 119, 120, 121, 122, 0, 123, + 0, 124, 125, 126, 127, 128, 129, 130, + 131, 0, 132, 133, 0, 134, 135, 136, + 137, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 0, 139, 0, 0, 0, 0, + 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, + 146, 147, 148, 149, 0, 0, 0, 0 + }; + + static const FT_UShort cff_expert_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 229, 230, 0, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 0, 253, 254, 255, 256, 257, 0, 0, + 0, 258, 0, 0, 259, 260, 261, 262, + 0, 0, 263, 264, 265, 0, 266, 109, + 110, 267, 268, 269, 0, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 304, 305, 306, 0, 0, 307, 308, + 309, 310, 311, 0, 312, 0, 0, 312, + 0, 0, 314, 315, 0, 0, 316, 317, + 318, 0, 0, 0, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 0, 0, + 326, 150, 164, 169, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378 + }; + +#endif /* 1 */ + + + FT_LOCAL_DEF( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ) + { + return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode] + : 0 ); + } + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffload + + + /* read an offset from the index's stream current position */ + static FT_ULong + cff_index_read_offset( CFF_Index idx, + FT_Error *errorp ) + { + FT_Error error; + FT_Stream stream = idx->stream; + FT_Byte tmp[4]; + FT_ULong result = 0; + + + if ( !FT_STREAM_READ( tmp, idx->off_size ) ) + { + FT_Int nn; + + + for ( nn = 0; nn < idx->off_size; nn++ ) + result = ( result << 8 ) | tmp[nn]; + } + + *errorp = error; + return result; + } + + + static FT_Error + cff_index_init( CFF_Index idx, + FT_Stream stream, + FT_Bool load ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UShort count; + + + FT_MEM_ZERO( idx, sizeof ( *idx ) ); + + idx->stream = stream; + idx->start = FT_STREAM_POS(); + if ( !FT_READ_USHORT( count ) && + count > 0 ) + { + FT_Byte offsize; + FT_ULong size; + + + /* there is at least one element; read the offset size, */ + /* then access the offset table to compute the index's total size */ + if ( FT_READ_BYTE( offsize ) ) + goto Exit; + + if ( offsize < 1 || offsize > 4 ) + { + error = FT_Err_Invalid_Table; + goto Exit; + } + + idx->count = count; + idx->off_size = offsize; + size = (FT_ULong)( count + 1 ) * offsize; + + idx->data_offset = idx->start + 3 + size; + + if ( FT_STREAM_SKIP( size - offsize ) ) + goto Exit; + + size = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( size == 0 ) + { + error = CFF_Err_Invalid_Table; + goto Exit; + } + + idx->data_size = --size; + + if ( load ) + { + /* load the data */ + if ( FT_FRAME_EXTRACT( size, idx->bytes ) ) + goto Exit; + } + else + { + /* skip the data */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + static void + cff_index_done( CFF_Index idx ) + { + if ( idx->stream ) + { + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->bytes ) + FT_FRAME_RELEASE( idx->bytes ); + + FT_FREE( idx->offsets ); + FT_MEM_ZERO( idx, sizeof ( *idx ) ); + } + } + + + static FT_Error + cff_index_load_offsets( CFF_Index idx ) + { + FT_Error error = CFF_Err_Ok; + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->count > 0 && idx->offsets == NULL ) + { + FT_Byte offsize = idx->off_size; + FT_ULong data_size; + FT_Byte* p; + FT_Byte* p_end; + FT_ULong* poff; + + + data_size = (FT_ULong)( idx->count + 1 ) * offsize; + + if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) || + FT_STREAM_SEEK( idx->start + 3 ) || + FT_FRAME_ENTER( data_size ) ) + goto Exit; + + poff = idx->offsets; + p = (FT_Byte*)stream->cursor; + p_end = p + data_size; + + switch ( offsize ) + { + case 1: + for ( ; p < p_end; p++, poff++ ) + poff[0] = p[0]; + break; + + case 2: + for ( ; p < p_end; p += 2, poff++ ) + poff[0] = FT_PEEK_USHORT( p ); + break; + + case 3: + for ( ; p < p_end; p += 3, poff++ ) + poff[0] = FT_PEEK_OFF3( p ); + break; + + default: + for ( ; p < p_end; p += 4, poff++ ) + poff[0] = FT_PEEK_ULONG( p ); + } + + FT_FRAME_EXIT(); + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + /* allocate a table containing pointers to an index's elements */ + static FT_Error + cff_index_get_pointers( CFF_Index idx, + FT_Byte*** table ) + { + FT_Error error = CFF_Err_Ok; + FT_Memory memory = idx->stream->memory; + FT_ULong n, offset, old_offset; + FT_Byte** t; + + + *table = 0; + + if ( idx->offsets == NULL ) + { + error = cff_index_load_offsets( idx ); + if ( error ) + goto Exit; + } + + if ( idx->count > 0 && !FT_NEW_ARRAY( t, idx->count + 1 ) ) + { + old_offset = 1; + for ( n = 0; n <= idx->count; n++ ) + { + /* at this point, `idx->offsets' can't be NULL */ + offset = idx->offsets[n]; + if ( !offset ) + offset = old_offset; + + /* two sanity checks for invalid offset tables */ + else if ( offset < old_offset ) + offset = old_offset; + + else if ( offset - 1 >= idx->data_size && n < idx->count ) + offset = old_offset; + + t[n] = idx->bytes + offset - 1; + + old_offset = offset; + } + *table = t; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ) + { + FT_Error error = CFF_Err_Ok; + + + if ( idx && idx->count > element ) + { + /* compute start and end offsets */ + FT_Stream stream = idx->stream; + FT_ULong off1, off2 = 0; + + + /* load offsets from file or the offset table */ + if ( !idx->offsets ) + { + FT_ULong pos = element * idx->off_size; + + + if ( FT_STREAM_SEEK( idx->start + 3 + pos ) ) + goto Exit; + + off1 = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( off1 != 0 ) + { + do + { + element++; + off2 = cff_index_read_offset( idx, &error ); + } + while ( off2 == 0 && element < idx->count ); + } + } + else /* use offsets table */ + { + off1 = idx->offsets[element]; + if ( off1 ) + { + do + { + element++; + off2 = idx->offsets[element]; + + } while ( off2 == 0 && element < idx->count ); + } + } + + /* access element */ + if ( off1 && off2 > off1 ) + { + *pbyte_len = off2 - off1; + + if ( idx->bytes ) + { + /* this index was completely loaded in memory, that's easy */ + *pbytes = idx->bytes + off1 - 1; + } + else + { + /* this index is still on disk/file, access it through a frame */ + if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) || + FT_FRAME_EXTRACT( off2 - off1, *pbytes ) ) + goto Exit; + } + } + else + { + /* empty index element */ + *pbytes = 0; + *pbyte_len = 0; + } + } + else + error = CFF_Err_Invalid_Argument; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ) + { + if ( idx->bytes == 0 ) + { + FT_Stream stream = idx->stream; + + + FT_FRAME_RELEASE( *pbytes ); + } + } + + + FT_LOCAL_DEF( FT_String* ) + cff_index_get_name( CFF_Index idx, + FT_UInt element ) + { + FT_Memory memory = idx->stream->memory; + FT_Byte* bytes; + FT_ULong byte_len; + FT_Error error; + FT_String* name = 0; + + + error = cff_index_access_element( idx, element, &bytes, &byte_len ); + if ( error ) + goto Exit; + + if ( !FT_ALLOC( name, byte_len + 1 ) ) + { + FT_MEM_COPY( name, bytes, byte_len ); + name[byte_len] = 0; + } + cff_index_forget_element( idx, &bytes ); + + Exit: + return name; + } + + + FT_LOCAL_DEF( FT_String* ) + cff_index_get_sid_string( CFF_Index idx, + FT_UInt sid, + FT_Service_PsCMaps psnames ) + { + /* value 0xFFFFU indicates a missing dictionary entry */ + if ( sid == 0xFFFFU ) + return 0; + + /* if it is not a standard string, return it */ + if ( sid > 390 ) + return cff_index_get_name( idx, sid - 391 ); + + /* CID-keyed CFF fonts don't have glyph names */ + if ( !psnames ) + return 0; + + /* that's a standard string, fetch a copy from the PSName module */ + { + FT_String* name = 0; + const char* adobe_name = psnames->adobe_std_strings( sid ); + + + if ( adobe_name ) + { + FT_Memory memory = idx->stream->memory; + FT_Error error; + + + (void)FT_STRDUP( name, adobe_name ); + + FT_UNUSED( error ); + } + + return name; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** FD Select table support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + + static void + CFF_Done_FD_Select( CFF_FDSelect fdselect, + FT_Stream stream ) + { + if ( fdselect->data ) + FT_FRAME_RELEASE( fdselect->data ); + + fdselect->data_size = 0; + fdselect->format = 0; + fdselect->range_count = 0; + } + + + static FT_Error + CFF_Load_FD_Select( CFF_FDSelect fdselect, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong offset ) + { + FT_Error error; + FT_Byte format; + FT_UInt num_ranges; + + + /* read format */ + if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) ) + goto Exit; + + fdselect->format = format; + fdselect->cache_count = 0; /* clear cache */ + + switch ( format ) + { + case 0: /* format 0, that's simple */ + fdselect->data_size = num_glyphs; + goto Load_Data; + + case 3: /* format 3, a tad more complex */ + if ( FT_READ_USHORT( num_ranges ) ) + goto Exit; + + fdselect->data_size = num_ranges * 3 + 2; + + Load_Data: + if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) + goto Exit; + break; + + default: /* hmm... that's wrong */ + error = CFF_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ) + { + FT_Byte fd = 0; + + + switch ( fdselect->format ) + { + case 0: + fd = fdselect->data[glyph_index]; + break; + + case 3: + /* first, compare to cache */ + if ( (FT_UInt)( glyph_index - fdselect->cache_first ) < + fdselect->cache_count ) + { + fd = fdselect->cache_fd; + break; + } + + /* then, lookup the ranges array */ + { + FT_Byte* p = fdselect->data; + FT_Byte* p_limit = p + fdselect->data_size; + FT_Byte fd2; + FT_UInt first, limit; + + + first = FT_NEXT_USHORT( p ); + do + { + if ( glyph_index < first ) + break; + + fd2 = *p++; + limit = FT_NEXT_USHORT( p ); + + if ( glyph_index < limit ) + { + fd = fd2; + + /* update cache */ + fdselect->cache_first = first; + fdselect->cache_count = limit-first; + fdselect->cache_fd = fd2; + break; + } + first = limit; + + } while ( p < p_limit ); + } + break; + + default: + ; + } + + return fd; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** CFF font support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + cff_charset_compute_cids( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_UInt i; + FT_Long j; + FT_UShort max_cid = 0; + + + if ( charset->max_cid > 0 ) + goto Exit; + + for ( i = 0; i < num_glyphs; i++ ) + if ( charset->sids[i] > max_cid ) + max_cid = charset->sids[i]; + max_cid++; + + if ( FT_NEW_ARRAY( charset->cids, max_cid ) ) + goto Exit; + + /* When multiple GIDs map to the same CID, we choose the lowest */ + /* GID. This is not described in any spec, but it matches the */ + /* behaviour of recent Acroread versions. */ + for ( j = num_glyphs - 1; j >= 0 ; j-- ) + charset->cids[charset->sids[j]] = (FT_UShort)j; + + charset->max_cid = max_cid; + charset->num_glyphs = num_glyphs; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ) + { + FT_UInt result = 0; + + + if ( cid < charset->max_cid ) + result = charset->cids[cid]; + + return result; + } + + + static void + cff_charset_free_cids( CFF_Charset charset, + FT_Memory memory ) + { + FT_FREE( charset->cids ); + charset->max_cid = 0; + } + + + static void + cff_charset_done( CFF_Charset charset, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + cff_charset_free_cids( charset, memory ); + + FT_FREE( charset->sids ); + charset->format = 0; + charset->offset = 0; + } + + + static FT_Error + cff_charset_load( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset, + FT_Bool invert ) + { + FT_Memory memory = stream->memory; + FT_Error error = CFF_Err_Ok; + FT_UShort glyph_sid; + + + /* If the the offset is greater than 2, we have to parse the */ + /* charset table. */ + if ( offset > 2 ) + { + FT_UInt j; + + + charset->offset = base_offset + offset; + + /* Get the format of the table. */ + if ( FT_STREAM_SEEK( charset->offset ) || + FT_READ_BYTE( charset->format ) ) + goto Exit; + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* assign the .notdef glyph */ + charset->sids[0] = 0; + + switch ( charset->format ) + { + case 0: + if ( num_glyphs > 0 ) + { + if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) + goto Exit; + + for ( j = 1; j < num_glyphs; j++ ) + { + FT_UShort sid = FT_GET_USHORT(); + + + /* this constant is given in the CFF specification */ + if ( sid < 65000L ) + charset->sids[j] = sid; + else + { + FT_TRACE0(( "cff_charset_load:" + " invalid SID value %d set to zero\n", sid )); + charset->sids[j] = 0; + } + } + + FT_FRAME_EXIT(); + } + break; + + case 1: + case 2: + { + FT_UInt nleft; + FT_UInt i; + + + j = 1; + + while ( j < num_glyphs ) + { + /* Read the first glyph sid of the range. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Read the number of glyphs in the range. */ + if ( charset->format == 2 ) + { + if ( FT_READ_USHORT( nleft ) ) + goto Exit; + } + else + { + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + } + + /* check whether the range contains at least one valid glyph; */ + /* the constant is given in the CFF specification */ + if ( glyph_sid >= 65000L ) { + FT_ERROR(( "cff_charset_load: invalid SID range\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* try to rescue some of the SIDs if `nleft' is too large */ + if ( nleft > 65000L - 1L || glyph_sid >= 65000L - nleft ) { + FT_ERROR(( "cff_charset_load: invalid SID range trimmed\n" )); + nleft = ( FT_UInt )( 65000L - 1L - glyph_sid ); + } + + /* Fill in the range of sids -- `nleft + 1' glyphs. */ + for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) + charset->sids[j] = glyph_sid; + } + } + break; + + default: + FT_ERROR(( "cff_charset_load: invalid table format\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + else + { + /* Parse default tables corresponding to offset == 0, 1, or 2. */ + /* CFF specification intimates the following: */ + /* */ + /* In order to use a predefined charset, the following must be */ + /* true: The charset constructed for the glyphs in the font's */ + /* charstrings dictionary must match the predefined charset in */ + /* the first num_glyphs. */ + + charset->offset = offset; /* record charset type */ + + switch ( (FT_UInt)offset ) + { + case 0: + if ( num_glyphs > 229 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe ISO-Latin)\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); + + break; + + case 1: + if ( num_glyphs > 166 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe Expert)\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); + + break; + + case 2: + if ( num_glyphs > 87 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe Expert Subset)\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); + + break; + + default: + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + + /* we have to invert the `sids' array for subsetted CID-keyed fonts */ + if ( invert ) + error = cff_charset_compute_cids( charset, num_glyphs, memory ); + + Exit: + /* Clean up if there was an error. */ + if ( error ) + { + FT_FREE( charset->sids ); + FT_FREE( charset->cids ); + charset->format = 0; + charset->offset = 0; + charset->sids = 0; + } + + return error; + } + + + static void + cff_encoding_done( CFF_Encoding encoding ) + { + encoding->format = 0; + encoding->offset = 0; + encoding->count = 0; + } + + + static FT_Error + cff_encoding_load( CFF_Encoding encoding, + CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset ) + { + FT_Error error = CFF_Err_Ok; + FT_UInt count; + FT_UInt j; + FT_UShort glyph_sid; + FT_UInt glyph_code; + + + /* Check for charset->sids. If we do not have this, we fail. */ + if ( !charset->sids ) + { + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Zero out the code to gid/sid mappings. */ + for ( j = 0; j < 256; j++ ) + { + encoding->sids [j] = 0; + encoding->codes[j] = 0; + } + + /* Note: The encoding table in a CFF font is indexed by glyph index; */ + /* the first encoded glyph index is 1. Hence, we read the character */ + /* code (`glyph_code') at index j and make the assignment: */ + /* */ + /* encoding->codes[glyph_code] = j + 1 */ + /* */ + /* We also make the assignment: */ + /* */ + /* encoding->sids[glyph_code] = charset->sids[j + 1] */ + /* */ + /* This gives us both a code to GID and a code to SID mapping. */ + + if ( offset > 1 ) + { + encoding->offset = base_offset + offset; + + /* we need to parse the table to determine its size */ + if ( FT_STREAM_SEEK( encoding->offset ) || + FT_READ_BYTE( encoding->format ) || + FT_READ_BYTE( count ) ) + goto Exit; + + switch ( encoding->format & 0x7F ) + { + case 0: + { + FT_Byte* p; + + + /* By convention, GID 0 is always ".notdef" and is never */ + /* coded in the font. Hence, the number of codes found */ + /* in the table is `count+1'. */ + /* */ + encoding->count = count + 1; + + if ( FT_FRAME_ENTER( count ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + + for ( j = 1; j <= count; j++ ) + { + glyph_code = *p++; + + /* Make sure j is not too big. */ + if ( j < num_glyphs ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)j; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[j]; + } + } + + FT_FRAME_EXIT(); + } + break; + + case 1: + { + FT_UInt nleft; + FT_UInt i = 1; + FT_UInt k; + + + encoding->count = 0; + + /* Parse the Format1 ranges. */ + for ( j = 0; j < count; j++, i += nleft ) + { + /* Read the first glyph code of the range. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the number of codes in the range. */ + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + + /* Increment nleft, so we read `nleft + 1' codes/sids. */ + nleft++; + + /* compute max number of character codes */ + if ( (FT_UInt)nleft > encoding->count ) + encoding->count = nleft; + + /* Fill in the range of codes/sids. */ + for ( k = i; k < nleft + i; k++, glyph_code++ ) + { + /* Make sure k is not too big. */ + if ( k < num_glyphs && glyph_code < 256 ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)k; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[k]; + } + } + } + + /* simple check; one never knows what can be found in a font */ + if ( encoding->count > 256 ) + encoding->count = 256; + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + + /* Parse supplemental encodings, if any. */ + if ( encoding->format & 0x80 ) + { + FT_UInt gindex; + + + /* count supplements */ + if ( FT_READ_BYTE( count ) ) + goto Exit; + + for ( j = 0; j < count; j++ ) + { + /* Read supplemental glyph code. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the SID associated with this glyph code. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = glyph_sid; + + /* First, look up GID which has been assigned to */ + /* SID glyph_sid. */ + for ( gindex = 0; gindex < num_glyphs; gindex++ ) + { + if ( charset->sids[gindex] == glyph_sid ) + { + encoding->codes[glyph_code] = (FT_UShort)gindex; + break; + } + } + } + } + } + else + { + /* We take into account the fact a CFF font can use a predefined */ + /* encoding without containing all of the glyphs encoded by this */ + /* encoding (see the note at the end of section 12 in the CFF */ + /* specification). */ + + switch ( (FT_UInt)offset ) + { + case 0: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); + goto Populate; + + case 1: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); + + Populate: + /* Construct code to GID mapping from code to SID mapping */ + /* and charset. */ + + encoding->count = 0; + + error = cff_charset_compute_cids( charset, num_glyphs, + stream->memory ); + if ( error ) + goto Exit; + + for ( j = 0; j < 256; j++ ) + { + FT_UInt sid = encoding->sids[j]; + FT_UInt gid = 0; + + + if ( sid ) + gid = cff_charset_cid_to_gindex( charset, sid ); + + if ( gid != 0 ) + { + encoding->codes[j] = (FT_UShort)gid; + + if ( encoding->count < j + 1 ) + encoding->count = j + 1; + } + else + { + encoding->codes[j] = 0; + encoding->sids [j] = 0; + } + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format\n" )); + error = CFF_Err_Invalid_File_Format; + goto Exit; + } + } + + Exit: + + /* Clean up if there was an error. */ + return error; + } + + + static FT_Error + cff_subfont_load( CFF_SubFont font, + CFF_Index idx, + FT_UInt font_index, + FT_Stream stream, + FT_ULong base_offset, + FT_Library library ) + { + FT_Error error; + CFF_ParserRec parser; + FT_Byte* dict = NULL; + FT_ULong dict_len; + CFF_FontRecDict top = &font->font_dict; + CFF_Private priv = &font->private_dict; + + + cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library ); + + /* set defaults */ + FT_MEM_ZERO( top, sizeof ( *top ) ); + + top->underline_position = -100L << 16; + top->underline_thickness = 50L << 16; + top->charstring_type = 2; + top->font_matrix.xx = 0x10000L; + top->font_matrix.yy = 0x10000L; + top->cid_count = 8720; + + /* we use the implementation specific SID value 0xFFFF to indicate */ + /* missing entries */ + top->version = 0xFFFFU; + top->notice = 0xFFFFU; + top->copyright = 0xFFFFU; + top->full_name = 0xFFFFU; + top->family_name = 0xFFFFU; + top->weight = 0xFFFFU; + top->embedded_postscript = 0xFFFFU; + + top->cid_registry = 0xFFFFU; + top->cid_ordering = 0xFFFFU; + top->cid_font_name = 0xFFFFU; + + error = cff_index_access_element( idx, font_index, &dict, &dict_len ); + if ( !error ) + error = cff_parser_run( &parser, dict, dict + dict_len ); + + cff_index_forget_element( idx, &dict ); + + if ( error ) + goto Exit; + + /* if it is a CID font, we stop there */ + if ( top->cid_registry != 0xFFFFU ) + goto Exit; + + /* parse the private dictionary, if any */ + if ( top->private_offset && top->private_size ) + { + /* set defaults */ + FT_MEM_ZERO( priv, sizeof ( *priv ) ); + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = -1; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library ); + + if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) || + FT_FRAME_ENTER( font->font_dict.private_size ) ) + goto Exit; + + error = cff_parser_run( &parser, + (FT_Byte*)stream->cursor, + (FT_Byte*)stream->limit ); + FT_FRAME_EXIT(); + if ( error ) + goto Exit; + + /* ensure that `num_blue_values' is even */ + priv->num_blue_values &= ~1; + } + + /* read the local subrs, if any */ + if ( priv->local_subrs_offset ) + { + if ( FT_STREAM_SEEK( base_offset + top->private_offset + + priv->local_subrs_offset ) ) + goto Exit; + + error = cff_index_init( &font->local_subrs_index, stream, 1 ); + if ( error ) + goto Exit; + + font->num_local_subrs = font->local_subrs_index.count; + error = cff_index_get_pointers( &font->local_subrs_index, + &font->local_subrs ); + if ( error ) + goto Exit; + } + + Exit: + return error; + } + + + static void + cff_subfont_done( FT_Memory memory, + CFF_SubFont subfont ) + { + if ( subfont ) + { + cff_index_done( &subfont->local_subrs_index ); + FT_FREE( subfont->local_subrs ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + FT_Bool pure_cff ) + { + static const FT_Frame_Field cff_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRec + + FT_FRAME_START( 4 ), + FT_FRAME_BYTE( version_major ), + FT_FRAME_BYTE( version_minor ), + FT_FRAME_BYTE( header_size ), + FT_FRAME_BYTE( absolute_offsize ), + FT_FRAME_END + }; + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong base_offset; + CFF_FontRecDict dict; + + + FT_ZERO( font ); + + font->stream = stream; + font->memory = memory; + dict = &font->top_font.font_dict; + base_offset = FT_STREAM_POS(); + + /* read CFF font header */ + if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) + goto Exit; + + /* check format */ + if ( font->version_major != 1 || + font->header_size < 4 || + font->absolute_offsize > 4 ) + { + FT_TRACE2(( "[not a CFF font header]\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + /* skip the rest of the header */ + if ( FT_STREAM_SKIP( font->header_size - 4 ) ) + goto Exit; + + /* read the name, top dict, string and global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->name_index, + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &font->font_dict_index, + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &font->string_index, + stream, 0 ) ) || + FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1 ) ) ) + goto Exit; + + /* well, we don't really forget the `disabled' fonts... */ + font->num_faces = font->name_index.count; + if ( face_index >= (FT_Int)font->num_faces ) + { + FT_ERROR(( "cff_font_load: incorrect face index = %d\n", + face_index )); + error = CFF_Err_Invalid_Argument; + } + + /* in case of a font format check, simply exit now */ + if ( face_index < 0 ) + goto Exit; + + /* now, parse the top-level font dictionary */ + error = cff_subfont_load( &font->top_font, + &font->font_dict_index, + face_index, + stream, + base_offset, + library ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) + goto Exit; + + error = cff_index_init( &font->charstrings_index, stream, 0 ); + if ( error ) + goto Exit; + + /* now, check for a CID font */ + if ( dict->cid_registry != 0xFFFFU ) + { + CFF_IndexRec fd_index; + CFF_SubFont sub; + FT_UInt idx; + + + /* this is a CID-keyed font, we must now allocate a table of */ + /* sub-fonts, then load each of them separately */ + if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) + goto Exit; + + error = cff_index_init( &fd_index, stream, 0 ); + if ( error ) + goto Exit; + + if ( fd_index.count > CFF_MAX_CID_FONTS ) + { + FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" )); + goto Fail_CID; + } + + /* allocate & read each font dict independently */ + font->num_subfonts = fd_index.count; + if ( FT_NEW_ARRAY( sub, fd_index.count ) ) + goto Fail_CID; + + /* set up pointer table */ + for ( idx = 0; idx < fd_index.count; idx++ ) + font->subfonts[idx] = sub + idx; + + /* now load each subfont independently */ + for ( idx = 0; idx < fd_index.count; idx++ ) + { + sub = font->subfonts[idx]; + error = cff_subfont_load( sub, &fd_index, idx, + stream, base_offset, library ); + if ( error ) + goto Fail_CID; + } + + /* now load the FD Select array */ + error = CFF_Load_FD_Select( &font->fd_select, + font->charstrings_index.count, + stream, + base_offset + dict->cid_fd_select_offset ); + + Fail_CID: + cff_index_done( &fd_index ); + + if ( error ) + goto Exit; + } + else + font->num_subfonts = 0; + + /* read the charstrings index now */ + if ( dict->charstrings_offset == 0 ) + { + FT_ERROR(( "cff_font_load: no charstrings offset\n" )); + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + /* explicit the global subrs */ + font->num_global_subrs = font->global_subrs_index.count; + font->num_glyphs = font->charstrings_index.count; + + error = cff_index_get_pointers( &font->global_subrs_index, + &font->global_subrs ) ; + + if ( error ) + goto Exit; + + /* read the Charset and Encoding tables if available */ + if ( font->num_glyphs > 0 ) + { + FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff ); + + + error = cff_charset_load( &font->charset, font->num_glyphs, stream, + base_offset, dict->charset_offset, invert ); + if ( error ) + goto Exit; + + /* CID-keyed CFFs don't have an encoding */ + if ( dict->cid_registry == 0xFFFFU ) + { + error = cff_encoding_load( &font->encoding, + &font->charset, + font->num_glyphs, + stream, + base_offset, + dict->encoding_offset ); + if ( error ) + goto Exit; + } + } + + /* get the font name (/CIDFontName for CID-keyed fonts, */ + /* /FontName otherwise) */ + font->font_name = cff_index_get_name( &font->name_index, face_index ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_font_done( CFF_Font font ) + { + FT_Memory memory = font->memory; + FT_UInt idx; + + + cff_index_done( &font->global_subrs_index ); + cff_index_done( &font->string_index ); + cff_index_done( &font->font_dict_index ); + cff_index_done( &font->name_index ); + cff_index_done( &font->charstrings_index ); + + /* release font dictionaries, but only if working with */ + /* a CID keyed CFF font */ + if ( font->num_subfonts > 0 ) + { + for ( idx = 0; idx < font->num_subfonts; idx++ ) + cff_subfont_done( memory, font->subfonts[idx] ); + + /* the subfonts array has been allocated as a single block */ + FT_FREE( font->subfonts[0] ); + } + + cff_encoding_done( &font->encoding ); + cff_charset_done( &font->charset, font->stream ); + + cff_subfont_done( memory, &font->top_font ); + + CFF_Done_FD_Select( &font->fd_select, font->stream ); + + if (font->font_info != NULL) + { + FT_FREE( font->font_info->version ); + FT_FREE( font->font_info->notice ); + FT_FREE( font->font_info->full_name ); + FT_FREE( font->font_info->family_name ); + FT_FREE( font->font_info->weight ); + FT_FREE( font->font_info ); + } + + FT_FREE( font->registry ); + FT_FREE( font->ordering ); + + FT_FREE( font->global_subrs ); + FT_FREE( font->font_name ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffload.h b/alienblaster/project/jni/freetype/src/cff/cffload.h new file mode 100644 index 000000000..2b313acf0 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffload.h @@ -0,0 +1,81 @@ +/***************************************************************************/ +/* */ +/* cffload.h */ +/* */ +/* OpenType & CFF data/program tables loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFLOAD_H__ +#define __CFFLOAD_H__ + + +#include <ft2build.h> +#include "cfftypes.h" +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + FT_LOCAL( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ); + + + FT_LOCAL( FT_String* ) + cff_index_get_name( CFF_Index idx, + FT_UInt element ); + + FT_LOCAL( FT_String* ) + cff_index_get_sid_string( CFF_Index idx, + FT_UInt sid, + FT_Service_PsCMaps psnames ); + + + FT_LOCAL( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ); + + FT_LOCAL( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ); + + + FT_LOCAL( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ); + + + FT_LOCAL( FT_Error ) + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + FT_Bool pure_cff ); + + FT_LOCAL( void ) + cff_font_done( CFF_Font font ); + + + FT_LOCAL( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ); + + +FT_END_HEADER + +#endif /* __CFFLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffobjs.c b/alienblaster/project/jni/freetype/src/cff/cffobjs.c new file mode 100644 index 000000000..bd56c4ba1 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffobjs.c @@ -0,0 +1,968 @@ +/***************************************************************************/ +/* */ +/* cffobjs.c */ +/* */ +/* OpenType objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_ERRORS_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_SFNT_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include "cffobjs.h" +#include "cffload.h" +#include "cffcmap.h" +#include "cfferrs.h" +#include "cffpic.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffobjs + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /* Note that we store the global hints in the size's `internal' root */ + /* field. */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + cff_size_get_globals_funcs( CFF_Size size ) + { + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = (PSHinter_Service)font->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + cff_size_done( FT_Size cffsize ) /* CFF_Size */ + { + CFF_Size size = (CFF_Size)cffsize; + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)cffsize->internal; + + + if ( internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = cff_size_get_globals_funcs( size ); + if ( funcs ) + { + FT_UInt i; + + + funcs->destroy( internal->topfont ); + + for ( i = font->num_subfonts; i > 0; i-- ) + funcs->destroy( internal->subfonts[i - 1] ); + } + + /* `internal' is freed by destroy_size (in ftobjs.c) */ + } + } + + + /* CFF and Type 1 private dictionaries have slightly different */ + /* structures; we need to synthesize a Type 1 dictionary on the fly */ + + static void + cff_make_private_dict( CFF_SubFont subfont, + PS_Private priv ) + { + CFF_Private cpriv = &subfont->private_dict; + FT_UInt n, count; + + + FT_MEM_ZERO( priv, sizeof ( *priv ) ); + + count = priv->num_blue_values = cpriv->num_blue_values; + for ( n = 0; n < count; n++ ) + priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; + + count = priv->num_other_blues = cpriv->num_other_blues; + for ( n = 0; n < count; n++ ) + priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; + + count = priv->num_family_blues = cpriv->num_family_blues; + for ( n = 0; n < count; n++ ) + priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; + + count = priv->num_family_other_blues = cpriv->num_family_other_blues; + for ( n = 0; n < count; n++ ) + priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; + + priv->blue_scale = cpriv->blue_scale; + priv->blue_shift = (FT_Int)cpriv->blue_shift; + priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; + + priv->standard_width[0] = (FT_UShort)cpriv->standard_width; + priv->standard_height[0] = (FT_UShort)cpriv->standard_height; + + count = priv->num_snap_widths = cpriv->num_snap_widths; + for ( n = 0; n < count; n++ ) + priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; + + count = priv->num_snap_heights = cpriv->num_snap_heights; + for ( n = 0; n < count; n++ ) + priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; + + priv->force_bold = cpriv->force_bold; + priv->language_group = cpriv->language_group; + priv->lenIV = cpriv->lenIV; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_size_init( FT_Size cffsize ) /* CFF_Size */ + { + CFF_Size size = (CFF_Size)cffsize; + FT_Error error = CFF_Err_Ok; + PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); + + + if ( funcs ) + { + CFF_Face face = (CFF_Face)cffsize->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal; + + PS_PrivateRec priv; + FT_Memory memory = cffsize->face->memory; + + FT_UInt i; + + + if ( FT_NEW( internal ) ) + goto Exit; + + cff_make_private_dict( &font->top_font, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->topfont ); + if ( error ) + goto Exit; + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + + + cff_make_private_dict( sub, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->subfonts[i - 1] ); + if ( error ) + goto Exit; + } + + cffsize->internal = (FT_Size_Internal)(void*)internal; + } + + size->strike_index = 0xFFFFFFFFUL; + + Exit: + return error; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + + cffsize->strike_index = strike_index; + + FT_Select_Metrics( size->face, strike_index ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face face = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal; + + FT_ULong top_upm = font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_ULong sub_upm = sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return CFF_Err_Ok; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + FT_LOCAL_DEF( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + CFF_Face cffface = (CFF_Face)size->face; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; + FT_ULong strike_index; + + + if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) + cffsize->strike_index = 0xFFFFFFFFUL; + else + return cff_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + FT_Request_Metrics( size->face, req ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face cffface = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)cffface->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal; + + FT_ULong top_upm = font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_ULong sub_upm = sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return CFF_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + cff_slot_done( FT_GlyphSlot slot ) + { + slot->internal->glyph_hints = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ) + { + CFF_Face face = (CFF_Face)slot->face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = (PSHinter_Service)font->pshinter; + + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->face->driver->root.library, + "pshinter" ); + if ( module ) + { + T2_Hints_Funcs funcs; + + + funcs = pshinter->get_t2_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return CFF_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + static FT_String* + cff_strcpy( FT_Memory memory, + const FT_String* source ) + { + FT_Error error; + FT_String* result; + + + (void)FT_STRDUP( result, source ); + + FT_UNUSED( error ); + + return result; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face cffface, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + CFF_Face face = (CFF_Face)cffface; + FT_Error error; + SFNT_Service sfnt; + FT_Service_PsCMaps psnames; + PSHinter_Service pshinter; + FT_Bool pure_cff = 1; + FT_Bool sfnt_format = 0; + FT_Library library = cffface->driver->root.library; + + +#if 0 + FT_FACE_FIND_GLOBAL_SERVICE( face, sfnt, SFNT ); + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_NAMES ); + FT_FACE_FIND_GLOBAL_SERVICE( face, pshinter, POSTSCRIPT_HINTER ); + + if ( !sfnt ) + goto Bad_Format; +#else + sfnt = (SFNT_Service)FT_Get_Module_Interface( + library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + + pshinter = (PSHinter_Service)FT_Get_Module_Interface( + library, "pshinter" ); +#endif + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check whether we have a valid OpenType file */ + error = sfnt->init_face( stream, face, face_index, num_params, params ); + if ( !error ) + { + if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ + { + FT_TRACE2(( "[not a valid OpenType/CFF font]\n" )); + goto Bad_Format; + } + + /* if we are performing a simple font format check, exit immediately */ + if ( face_index < 0 ) + return CFF_Err_Ok; + + /* UNDOCUMENTED! A CFF in an SFNT can have only a single font. */ + if ( face_index > 0 ) + { + FT_ERROR(( "cff_face_init: invalid face index\n" )); + error = CFF_Err_Invalid_Argument; + goto Exit; + } + + sfnt_format = 1; + + /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ + /* font; in the latter case it doesn't have a `head' table */ + error = face->goto_table( face, TTAG_head, stream, 0 ); + if ( !error ) + { + pure_cff = 0; + + /* load font directory */ + error = sfnt->load_face( stream, face, 0, num_params, params ); + if ( error ) + goto Exit; + } + else + { + /* load the `cmap' table explicitly */ + error = sfnt->load_cmap( face, stream ); + if ( error ) + goto Exit; + + /* XXX: we don't load the GPOS table, as OpenType Layout */ + /* support will be added later to a layout library on top of */ + /* FreeType 2 */ + } + + /* now load the CFF part of the file */ + error = face->goto_table( face, TTAG_CFF, stream, 0 ); + if ( error ) + goto Exit; + } + else + { + /* rewind to start of file; we are going to load a pure-CFF font */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + error = CFF_Err_Ok; + } + + /* now load and parse the CFF table in the file */ + { + CFF_Font cff; + CFF_FontRecDict dict; + FT_Memory memory = cffface->memory; + FT_Int32 flags; + FT_UInt i; + + + if ( FT_NEW( cff ) ) + goto Exit; + + face->extra.data = cff; + error = cff_font_load( library, stream, face_index, cff, pure_cff ); + if ( error ) + goto Exit; + + cff->pshinter = pshinter; + cff->psnames = (void*)psnames; + + cffface->face_index = face_index; + + /* Complement the root flags with some interesting information. */ + /* Note that this is only necessary for pure CFF and CEF fonts; */ + /* SFNT based fonts use the `name' table instead. */ + + cffface->num_glyphs = cff->num_glyphs; + + dict = &cff->top_font.font_dict; + + /* we need the `PSNames' module for CFF and CEF formats */ + /* which aren't CID-keyed */ + if ( dict->cid_registry == 0xFFFFU && !psnames ) + { + FT_ERROR(( "cff_face_init:" + " cannot open CFF & CEF fonts\n" + " " + " without the `PSNames' module\n" )); + goto Bad_Format; + } + + if ( !dict->units_per_em ) + dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; + + /* Normalize the font matrix so that `matrix->xx' is 1; the */ + /* scaling is done with `units_per_em' then (at this point, */ + /* it already contains the scaling factor, but without */ + /* normalization of the matrix). */ + /* */ + /* Note that the offsets must be expressed in integer font */ + /* units. */ + + { + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Fixed temp = FT_ABS( matrix->yy ); + + + if ( temp != 0x10000L ) + { + *upm = FT_DivFix( *upm, temp ); + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + for ( i = cff->num_subfonts; i > 0; i-- ) + { + CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; + CFF_FontRecDict top = &cff->top_font.font_dict; + + FT_Matrix* matrix; + FT_Vector* offset; + FT_ULong* upm; + FT_Fixed temp; + + + if ( sub->units_per_em ) + { + FT_Long scaling; + + + if ( top->units_per_em > 1 && sub->units_per_em > 1 ) + scaling = FT_MIN( top->units_per_em, sub->units_per_em ); + else + scaling = 1; + + FT_Matrix_Multiply_Scaled( &top->font_matrix, + &sub->font_matrix, + scaling ); + FT_Vector_Transform_Scaled( &sub->font_offset, + &top->font_matrix, + scaling ); + + sub->units_per_em = FT_MulDiv( sub->units_per_em, + top->units_per_em, + scaling ); + } + else + { + sub->font_matrix = top->font_matrix; + sub->font_offset = top->font_offset; + + sub->units_per_em = top->units_per_em; + } + + matrix = &sub->font_matrix; + offset = &sub->font_offset; + upm = &sub->units_per_em; + temp = FT_ABS( matrix->yy ); + + if ( temp != 0x10000L ) + { + *upm = FT_DivFix( *upm, temp ); + + /* if *upm is larger than 100*1000 we divide by 1000 -- */ + /* this can happen if e.g. there is no top-font FontMatrix */ + /* and the subfont FontMatrix already contains the complete */ + /* scaling for the subfont (see section 5.11 of the PLRM) */ + + /* 100 is a heuristic value */ + + if ( *upm > 100L * 1000L ) + *upm = ( *upm + 500 ) / 1000; + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + if ( pure_cff ) + { + char* style_name = NULL; + + + /* set up num_faces */ + cffface->num_faces = cff->num_faces; + + /* compute number of glyphs */ + if ( dict->cid_registry != 0xFFFFU ) + cffface->num_glyphs = cff->charset.max_cid; + else + cffface->num_glyphs = cff->charstrings_index.count; + + /* set global bbox, as well as EM size */ + cffface->bbox.xMin = dict->font_bbox.xMin >> 16; + cffface->bbox.yMin = dict->font_bbox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16; + cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16; + + cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); + + cffface->ascender = (FT_Short)( cffface->bbox.yMax ); + cffface->descender = (FT_Short)( cffface->bbox.yMin ); + + cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); + if ( cffface->height < cffface->ascender - cffface->descender ) + cffface->height = (FT_Short)( cffface->ascender - cffface->descender ); + + cffface->underline_position = + (FT_Short)( dict->underline_position >> 16 ); + cffface->underline_thickness = + (FT_Short)( dict->underline_thickness >> 16 ); + + /* retrieve font family & style name */ + cffface->family_name = cff_index_get_name( &cff->name_index, + face_index ); + + if ( cffface->family_name ) + { + char* full = cff_index_get_sid_string( &cff->string_index, + dict->full_name, + psnames ); + char* fullp = full; + char* family = cffface->family_name; + char* family_name = 0; + + + if ( dict->family_name ) + { + family_name = cff_index_get_sid_string( &cff->string_index, + dict->family_name, + psnames); + if ( family_name ) + family = family_name; + } + + /* We try to extract the style name from the full name. */ + /* We need to ignore spaces and dashes during the search. */ + if ( full && family ) + { + while ( *fullp ) + { + /* skip common characters at the start of both strings */ + if ( *fullp == *family ) + { + family++; + fullp++; + continue; + } + + /* ignore spaces and dashes in full name during comparison */ + if ( *fullp == ' ' || *fullp == '-' ) + { + fullp++; + continue; + } + + /* ignore spaces and dashes in family name during comparison */ + if ( *family == ' ' || *family == '-' ) + { + family++; + continue; + } + + if ( !*family && *fullp ) + { + /* The full name begins with the same characters as the */ + /* family name, with spaces and dashes removed. In this */ + /* case, the remaining string in `fullp' will be used as */ + /* the style name. */ + style_name = cff_strcpy( memory, fullp ); + } + break; + } + + if ( family_name ) + FT_FREE( family_name ); + FT_FREE( full ); + } + } + else + { + char *cid_font_name = + cff_index_get_sid_string( &cff->string_index, + dict->cid_font_name, + psnames ); + + + /* do we have a `/FontName' for a CID-keyed font? */ + if ( cid_font_name ) + cffface->family_name = cid_font_name; + } + + if ( style_name ) + cffface->style_name = style_name; + else + /* assume "Regular" style if we don't know better */ + cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); + + /*******************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + flags = (FT_UInt32)( FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER ); /* has native hinter */ + + if ( sfnt_format ) + flags |= (FT_UInt32)FT_FACE_FLAG_SFNT; + + /* fixed width font? */ + if ( dict->is_fixed_pitch ) + flags |= (FT_UInt32)FT_FACE_FLAG_FIXED_WIDTH; + + /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ +#if 0 + /* kerning available? */ + if ( face->kern_pairs ) + flags |= (FT_UInt32)FT_FACE_FLAG_KERNING; +#endif + + cffface->face_flags = flags; + + /*******************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + flags = 0; + + if ( dict->italic_angle ) + flags |= FT_STYLE_FLAG_ITALIC; + + { + char *weight = cff_index_get_sid_string( &cff->string_index, + dict->weight, + psnames ); + + + if ( weight ) + if ( !ft_strcmp( weight, "Bold" ) || + !ft_strcmp( weight, "Black" ) ) + flags |= FT_STYLE_FLAG_BOLD; + FT_FREE( weight ); + } + + /* double check */ + if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) + if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || + !ft_strncmp( cffface->style_name, "Black", 5 ) ) + flags |= FT_STYLE_FLAG_BOLD; + + cffface->style_flags = flags; + } + + +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ + /* has unset this flag because of the 3.0 `post' table. */ + if ( dict->cid_registry == 0xFFFFU ) + cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + if ( dict->cid_registry != 0xFFFFU && pure_cff ) + cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; + + + /*******************************************************************/ + /* */ + /* Compute char maps. */ + /* */ + + /* Try to synthesize a Unicode charmap if there is none available */ + /* already. If an OpenType font contains a Unicode "cmap", we */ + /* will use it, whatever be in the CFF part of the file. */ + { + FT_CharMapRec cmaprec; + FT_CharMap cmap; + FT_UInt nn; + CFF_Encoding encoding = &cff->encoding; + + + for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ ) + { + cmap = cffface->charmaps[nn]; + + /* Windows Unicode (3,1)? */ + if ( cmap->platform_id == 3 && cmap->encoding_id == 1 ) + goto Skip_Unicode; + + /* Deprecated Unicode platform id? */ + if ( cmap->platform_id == 0 ) + goto Skip_Unicode; /* Standard Unicode (deprecated) */ + } + + /* since CID-keyed fonts don't contain glyph names, we can't */ + /* construct a cmap */ + if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) + goto Exit; + + /* we didn't find a Unicode charmap -- synthesize one */ + cmaprec.face = cffface; + cmaprec.platform_id = 3; + cmaprec.encoding_id = 1; + cmaprec.encoding = FT_ENCODING_UNICODE; + + nn = (FT_UInt)cffface->num_charmaps; + + FT_CMap_New( &FT_CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, &cmaprec, NULL ); + + /* if no Unicode charmap was previously selected, select this one */ + if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps ) + cffface->charmap = cffface->charmaps[nn]; + + Skip_Unicode: + if ( encoding->count > 0 ) + { + FT_CMap_Class clazz; + + + cmaprec.face = cffface; + cmaprec.platform_id = 7; /* Adobe platform id */ + + if ( encoding->offset == 0 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; + cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; + clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; + } + else if ( encoding->offset == 1 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; + cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; + clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; + } + else + { + cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; + cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; + clazz = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET; + } + + FT_CMap_New( clazz, NULL, &cmaprec, NULL ); + } + } + } + + Exit: + return error; + + Bad_Format: + error = CFF_Err_Unknown_File_Format; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + cff_face_done( FT_Face cffface ) /* CFF_Face */ + { + CFF_Face face = (CFF_Face)cffface; + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = cffface->memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + sfnt->done_face( face ); + + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + cff_font_done( cff ); + FT_FREE( face->extra.data ); + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_driver_init( FT_Module module ) + { + FT_UNUSED( module ); + + return CFF_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + cff_driver_done( FT_Module module ) + { + FT_UNUSED( module ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffobjs.h b/alienblaster/project/jni/freetype/src/cff/cffobjs.h new file mode 100644 index 000000000..3c81cee00 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffobjs.h @@ -0,0 +1,181 @@ +/***************************************************************************/ +/* */ +/* cffobjs.h */ +/* */ +/* OpenType objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFOBJS_H__ +#define __CFFOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include "cfftypes.h" +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Driver */ + /* */ + /* <Description> */ + /* A handle to an OpenType driver object. */ + /* */ + typedef struct CFF_DriverRec_* CFF_Driver; + + typedef TT_Face CFF_Face; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Size */ + /* */ + /* <Description> */ + /* A handle to an OpenType size object. */ + /* */ + typedef struct CFF_SizeRec_ + { + FT_SizeRec root; + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + + } CFF_SizeRec, *CFF_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to an OpenType glyph slot object. */ + /* */ + typedef struct CFF_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } CFF_GlyphSlotRec, *CFF_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CFF_Internal */ + /* */ + /* <Description> */ + /* The interface to the `internal' field of `FT_Size'. */ + /* */ + typedef struct CFF_InternalRec_ + { + PSH_Globals topfont; + PSH_Globals subfonts[CFF_MAX_CID_FONTS]; + + } CFF_InternalRec, *CFF_Internal; + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct CFF_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } CFF_Transform; + + + /***********************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct CFF_DriverRec_ + { + FT_DriverRec root; + void* extension_component; + + } CFF_DriverRec; + + + FT_LOCAL( FT_Error ) + cff_size_init( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( void ) + cff_size_done( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ); + +#endif + + FT_LOCAL( void ) + cff_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face face, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cff_face_done( FT_Face face ); /* CFF_Face */ + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_driver_init( FT_Module module ); + + FT_LOCAL( void ) + cff_driver_done( FT_Module module ); + + +FT_END_HEADER + +#endif /* __CFFOBJS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffparse.c b/alienblaster/project/jni/freetype/src/cff/cffparse.c new file mode 100644 index 000000000..01266a193 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffparse.c @@ -0,0 +1,919 @@ +/***************************************************************************/ +/* */ +/* cffparse.c */ +/* */ +/* CFF token stream parser (body) */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "cffparse.h" +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + +#include "cfferrs.h" +#include "cffpic.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cffparse + + + + + FT_LOCAL_DEF( void ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object, + FT_Library library) + { + FT_MEM_ZERO( parser, sizeof ( *parser ) ); + + parser->top = parser->stack; + parser->object_code = code; + parser->object = object; + parser->library = library; + } + + + /* read an integer */ + static FT_Long + cff_parse_integer( FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Int v = *p++; + FT_Long val = 0; + + + if ( v == 28 ) + { + if ( p + 2 > limit ) + goto Bad; + + val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] ); + p += 2; + } + else if ( v == 29 ) + { + if ( p + 4 > limit ) + goto Bad; + + val = ( (FT_Long)p[0] << 24 ) | + ( (FT_Long)p[1] << 16 ) | + ( (FT_Long)p[2] << 8 ) | + p[3]; + p += 4; + } + else if ( v < 247 ) + { + val = v - 139; + } + else if ( v < 251 ) + { + if ( p + 1 > limit ) + goto Bad; + + val = ( v - 247 ) * 256 + p[0] + 108; + p++; + } + else + { + if ( p + 1 > limit ) + goto Bad; + + val = -( v - 251 ) * 256 - p[0] - 108; + p++; + } + + Exit: + return val; + + Bad: + val = 0; + goto Exit; + } + + + static const FT_Long power_tens[] = + { + 1L, + 10L, + 100L, + 1000L, + 10000L, + 100000L, + 1000000L, + 10000000L, + 100000000L, + 1000000000L + }; + + + /* read a real */ + static FT_Fixed + cff_parse_real( FT_Byte* start, + FT_Byte* limit, + FT_Long power_ten, + FT_Long* scaling ) + { + FT_Byte* p = start; + FT_UInt nib; + FT_UInt phase; + + FT_Long result, number, rest, exponent; + FT_Int sign = 0, exponent_sign = 0; + FT_Long exponent_add, integer_length, fraction_length; + + + if ( scaling ) + *scaling = 0; + + result = 0; + + number = 0; + rest = 0; + exponent = 0; + + exponent_add = 0; + integer_length = 0; + fraction_length = 0; + + FT_UNUSED( rest ); + + /* First of all, read the integer part. */ + phase = 4; + + for (;;) + { + /* If we entered this iteration with phase == 4, we need to */ + /* read a new byte. This also skips past the initial 0x1E. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + + if ( nib == 0xE ) + sign = 1; + else if ( nib > 9 ) + break; + else + { + /* Increase exponent if we can't add the digit. */ + if ( number >= 0xCCCCCCCL ) + exponent_add++; + /* Skip leading zeros. */ + else if ( nib || number ) + { + integer_length++; + number = number * 10 + nib; + } + } + } + + /* Read fraction part, if any. */ + if ( nib == 0xa ) + for (;;) + { + /* If we entered this iteration with phase == 4, we need */ + /* to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + /* Skip leading zeros if possible. */ + if ( !nib && !number ) + exponent_add--; + /* Only add digit if we don't overflow. */ + else if ( number < 0xCCCCCCCL && fraction_length < 9 ) + { + fraction_length++; + number = number * 10 + nib; + } + } + + /* Read exponent, if any. */ + if ( nib == 12 ) + { + exponent_sign = 1; + nib = 11; + } + + if ( nib == 11 ) + { + for (;;) + { + /* If we entered this iteration with phase == 4, */ + /* we need to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Exit; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + exponent = exponent * 10 + nib; + + /* Arbitrarily limit exponent. */ + if ( exponent > 1000 ) + goto Exit; + } + + if ( exponent_sign ) + exponent = -exponent; + } + + /* We don't check `power_ten' and `exponent_add'. */ + exponent += power_ten + exponent_add; + + if ( scaling ) + { + /* Only use `fraction_length'. */ + fraction_length += integer_length; + exponent += integer_length; + + if ( fraction_length <= 5 ) + { + if ( number > 0x7FFFL ) + { + result = FT_DivFix( number, 10 ); + *scaling = exponent - fraction_length + 1; + } + else + { + if ( exponent > 0 ) + { + FT_Long new_fraction_length, shift; + + + /* Make `scaling' as small as possible. */ + new_fraction_length = FT_MIN( exponent, 5 ); + exponent -= new_fraction_length; + shift = new_fraction_length - fraction_length; + + number *= power_tens[shift]; + if ( number > 0x7FFFL ) + { + number /= 10; + exponent += 1; + } + } + else + exponent -= fraction_length; + + result = number << 16; + *scaling = exponent; + } + } + else + { + if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) + { + result = FT_DivFix( number, power_tens[fraction_length - 4] ); + *scaling = exponent - 4; + } + else + { + result = FT_DivFix( number, power_tens[fraction_length - 5] ); + *scaling = exponent - 5; + } + } + } + else + { + integer_length += exponent; + fraction_length -= exponent; + + /* Check for overflow and underflow. */ + if ( FT_ABS( integer_length ) > 5 ) + goto Exit; + + /* Remove non-significant digits. */ + if ( integer_length < 0 ) { + number /= power_tens[-integer_length]; + fraction_length += integer_length; + } + + /* Convert into 16.16 format. */ + if ( fraction_length > 0 ) + { + if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) + goto Exit; + + result = FT_DivFix( number, power_tens[fraction_length] ); + } + else + { + number *= power_tens[-fraction_length]; + + if ( number > 0x7FFFL ) + goto Exit; + + result = number << 16; + } + } + + if ( sign ) + result = -result; + + Exit: + return result; + } + + + /* read a number, either integer or real */ + static FT_Long + cff_parse_num( FT_Byte** d ) + { + return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 ) + : cff_parse_integer( d[0], d[1] ); + } + + + /* read a floating point number, either integer or real */ + static FT_Fixed + cff_parse_fixed( FT_Byte** d ) + { + return **d == 30 ? cff_parse_real( d[0], d[1], 0, NULL ) + : cff_parse_integer( d[0], d[1] ) << 16; + } + + + /* read a floating point number, either integer or real, */ + /* but return `10^scaling' times the number read in */ + static FT_Fixed + cff_parse_fixed_scaled( FT_Byte** d, + FT_Long scaling ) + { + return **d == 30 ? cff_parse_real( d[0], d[1], scaling, NULL ) + : ( cff_parse_integer( d[0], d[1] ) * + power_tens[scaling] ) << 16; + } + + + /* read a floating point number, either integer or real, */ + /* and return it as precise as possible -- `scaling' returns */ + /* the scaling factor (as a power of 10) */ + static FT_Fixed + cff_parse_fixed_dynamic( FT_Byte** d, + FT_Long* scaling ) + { + FT_ASSERT( scaling ); + + if ( **d == 30 ) + return cff_parse_real( d[0], d[1], 0, scaling ); + else + { + FT_Long number; + FT_Int integer_length; + + + number = cff_parse_integer( d[0], d[1] ); + + if ( number > 0x7FFFL ) + { + for ( integer_length = 5; integer_length < 10; integer_length++ ) + if ( number < power_tens[integer_length] ) + break; + + if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) + { + *scaling = integer_length - 4; + return FT_DivFix( number, power_tens[integer_length - 4] ); + } + else + { + *scaling = integer_length - 5; + return FT_DivFix( number, power_tens[integer_length - 5] ); + } + } + else + { + *scaling = 0; + return number << 16; + } + } + } + + + static FT_Error + cff_parse_font_matrix( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Byte** data = parser->stack; + FT_Error error = CFF_Err_Stack_Underflow; + + + if ( parser->top >= parser->stack + 6 ) + { + FT_Long scaling; + + + error = CFF_Err_Ok; + + /* We expect a well-formed font matrix, this is, the matrix elements */ + /* `xx' and `yy' are of approximately the same magnitude. To avoid */ + /* loss of precision, we use the magnitude of element `xx' to scale */ + /* all other elements. The scaling factor is then contained in the */ + /* `units_per_em' value. */ + + matrix->xx = cff_parse_fixed_dynamic( data++, &scaling ); + + scaling = -scaling; + + if ( scaling < 0 || scaling > 9 ) + { + /* Return default matrix in case of unlikely values. */ + matrix->xx = 0x10000L; + matrix->yx = 0; + matrix->yx = 0; + matrix->yy = 0x10000L; + offset->x = 0; + offset->y = 0; + *upm = 1; + + goto Exit; + } + + matrix->yx = cff_parse_fixed_scaled( data++, scaling ); + matrix->xy = cff_parse_fixed_scaled( data++, scaling ); + matrix->yy = cff_parse_fixed_scaled( data++, scaling ); + offset->x = cff_parse_fixed_scaled( data++, scaling ); + offset->y = cff_parse_fixed_scaled( data, scaling ); + + *upm = power_tens[scaling]; + } + + Exit: + return error; + } + + + static FT_Error + cff_parse_font_bbox( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_BBox* bbox = &dict->font_bbox; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 4 ) + { + bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) ); + bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) ); + error = CFF_Err_Ok; + } + + return error; + } + + + static FT_Error + cff_parse_private_dict( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 2 ) + { + dict->private_size = cff_parse_num( data++ ); + dict->private_offset = cff_parse_num( data ); + error = CFF_Err_Ok; + } + + return error; + } + + + static FT_Error + cff_parse_cid_ros( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = CFF_Err_Stack_Underflow; + + if ( parser->top >= parser->stack + 3 ) + { + dict->cid_registry = (FT_UInt)cff_parse_num ( data++ ); + dict->cid_ordering = (FT_UInt)cff_parse_num ( data++ ); + if ( **data == 30 ) + FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); + dict->cid_supplement = cff_parse_num( data ); + if ( dict->cid_supplement < 0 ) + FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", + dict->cid_supplement )); + error = CFF_Err_Ok; + } + + return error; + } + + +#define CFF_FIELD_NUM( code, name ) \ + CFF_FIELD( code, name, cff_kind_num ) +#define CFF_FIELD_FIXED( code, name ) \ + CFF_FIELD( code, name, cff_kind_fixed ) +#define CFF_FIELD_FIXED_1000( code, name ) \ + CFF_FIELD( code, name, cff_kind_fixed_thousand ) +#define CFF_FIELD_STRING( code, name ) \ + CFF_FIELD( code, name, cff_kind_string ) +#define CFF_FIELD_BOOL( code, name ) \ + CFF_FIELD( code, name, cff_kind_bool ) +#define CFF_FIELD_DELTA( code, name, max ) \ + CFF_FIELD( code, name, cff_kind_delta ) + +#define CFFCODE_TOPDICT 0x1000 +#define CFFCODE_PRIVATE 0x2000 + +#ifndef FT_CONFIG_OPTION_PIC + +#define CFF_FIELD_CALLBACK( code, name ) \ + { \ + cff_kind_callback, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_ ## name, \ + 0, 0 \ + }, + +#undef CFF_FIELD +#define CFF_FIELD( code, name, kind ) \ + { \ + kind, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE( name ), \ + 0, 0, 0 \ + }, + +#undef CFF_FIELD_DELTA +#define CFF_FIELD_DELTA( code, name, max ) \ + { \ + cff_kind_delta, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE_DELTA( name ), \ + 0, \ + max, \ + FT_FIELD_OFFSET( num_ ## name ) \ + }, + + static const CFF_Field_Handler cff_field_handlers[] = + { + +#include "cfftoken.h" + + { 0, 0, 0, 0, 0, 0, 0 } + }; + + +#else /* FT_CONFIG_OPTION_PIC */ + + void FT_Destroy_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler* clazz) + { + FT_Memory memory = library->memory; + if ( clazz ) + FT_FREE( clazz ); + } + + FT_Error FT_Create_Class_cff_field_handlers(FT_Library library, CFF_Field_Handler** output_class) + { + CFF_Field_Handler* clazz; + FT_Error error; + FT_Memory memory = library->memory; + int i=0; + +#undef CFF_FIELD +#undef CFF_FIELD_DELTA +#undef CFF_FIELD_CALLBACK +#define CFF_FIELD_CALLBACK( code, name ) i++; +#define CFF_FIELD( code, name, kind ) i++; +#define CFF_FIELD_DELTA( code, name, max ) i++; + +#include "cfftoken.h" + i++;/*{ 0, 0, 0, 0, 0, 0, 0 }*/ + + if ( FT_ALLOC( clazz, sizeof(CFF_Field_Handler)*i ) ) + return error; + + i=0; +#undef CFF_FIELD +#undef CFF_FIELD_DELTA +#undef CFF_FIELD_CALLBACK + +#define CFF_FIELD_CALLBACK( code_, name_ ) \ + clazz[i].kind = cff_kind_callback; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = 0; \ + clazz[i].size = 0; \ + clazz[i].reader = cff_parse_ ## name_; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + i++; + +#undef CFF_FIELD +#define CFF_FIELD( code_, name_, kind_ ) \ + clazz[i].kind = kind_; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ + clazz[i].size = FT_FIELD_SIZE( name_ ); \ + clazz[i].reader = 0; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + i++; \ + +#undef CFF_FIELD_DELTA +#define CFF_FIELD_DELTA( code_, name_, max_ ) \ + clazz[i].kind = cff_kind_delta; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ + clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ + clazz[i].reader = 0; \ + clazz[i].array_max = max_; \ + clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ + i++; + +#include "cfftoken.h" + + clazz[i].kind = 0; + clazz[i].code = 0; + clazz[i].offset = 0; + clazz[i].size = 0; + clazz[i].reader = 0; + clazz[i].array_max = 0; + clazz[i].count_offset = 0; + + *output_class = clazz; + return FT_Err_Ok; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + + FT_LOCAL_DEF( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Error error = CFF_Err_Ok; + FT_Library library = parser->library; + FT_UNUSED(library); + + + parser->top = parser->stack; + parser->start = start; + parser->limit = limit; + parser->cursor = start; + + while ( p < limit ) + { + FT_UInt v = *p; + + + if ( v >= 27 && v != 31 ) + { + /* it's a number; we will push its position on the stack */ + if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH ) + goto Stack_Overflow; + + *parser->top ++ = p; + + /* now, skip it */ + if ( v == 30 ) + { + /* skip real number */ + p++; + for (;;) + { + /* An unterminated floating point number at the */ + /* end of a dictionary is invalid but harmless. */ + if ( p >= limit ) + goto Exit; + v = p[0] >> 4; + if ( v == 15 ) + break; + v = p[0] & 0xF; + if ( v == 15 ) + break; + p++; + } + } + else if ( v == 28 ) + p += 2; + else if ( v == 29 ) + p += 4; + else if ( v > 246 ) + p += 1; + } + else + { + /* This is not a number, hence it's an operator. Compute its code */ + /* and look for it in our current list. */ + + FT_UInt code; + FT_UInt num_args = (FT_UInt) + ( parser->top - parser->stack ); + const CFF_Field_Handler* field; + + + *parser->top = p; + code = v; + if ( v == 12 ) + { + /* two byte operator */ + p++; + if ( p >= limit ) + goto Syntax_Error; + + code = 0x100 | p[0]; + } + code = code | parser->object_code; + + for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ ) + { + if ( field->code == (FT_Int)code ) + { + /* we found our field's handler; read it */ + FT_Long val; + FT_Byte* q = (FT_Byte*)parser->object + field->offset; + + + /* check that we have enough arguments -- except for */ + /* delta encoded arrays, which can be empty */ + if ( field->kind != cff_kind_delta && num_args < 1 ) + goto Stack_Underflow; + + switch ( field->kind ) + { + case cff_kind_bool: + case cff_kind_string: + case cff_kind_num: + val = cff_parse_num( parser->stack ); + goto Store_Number; + + case cff_kind_fixed: + val = cff_parse_fixed( parser->stack ); + goto Store_Number; + + case cff_kind_fixed_thousand: + val = cff_parse_fixed_scaled( parser->stack, 3 ); + + Store_Number: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case cff_kind_delta: + { + FT_Byte* qcount = (FT_Byte*)parser->object + + field->count_offset; + + FT_Byte** data = parser->stack; + + + if ( num_args > field->array_max ) + num_args = field->array_max; + + /* store count */ + *qcount = (FT_Byte)num_args; + + val = 0; + while ( num_args > 0 ) + { + val += cff_parse_num( data++ ); + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + + q += field->size; + num_args--; + } + } + break; + + default: /* callback */ + error = field->reader( parser ); + if ( error ) + goto Exit; + } + goto Found; + } + } + + /* this is an unknown operator, or it is unsupported; */ + /* we will ignore it for now. */ + + Found: + /* clear stack */ + parser->top = parser->stack; + } + p++; + } + + Exit: + return error; + + Stack_Overflow: + error = CFF_Err_Invalid_Argument; + goto Exit; + + Stack_Underflow: + error = CFF_Err_Invalid_Argument; + goto Exit; + + Syntax_Error: + error = CFF_Err_Invalid_Argument; + goto Exit; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffparse.h b/alienblaster/project/jni/freetype/src/cff/cffparse.h new file mode 100644 index 000000000..7e2c00a04 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffparse.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* cffparse.h */ +/* */ +/* CFF token stream parser (specification) */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFF_PARSE_H__ +#define __CFF_PARSE_H__ + + +#include <ft2build.h> +#include "cfftypes.h" +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#define CFF_MAX_STACK_DEPTH 96 + +#define CFF_CODE_TOPDICT 0x1000 +#define CFF_CODE_PRIVATE 0x2000 + + + typedef struct CFF_ParserRec_ + { + FT_Library library; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* cursor; + + FT_Byte* stack[CFF_MAX_STACK_DEPTH + 1]; + FT_Byte** top; + + FT_UInt object_code; + void* object; + + } CFF_ParserRec, *CFF_Parser; + + + FT_LOCAL( void ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object, + FT_Library library); + + FT_LOCAL( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ); + + + enum + { + cff_kind_none = 0, + cff_kind_num, + cff_kind_fixed, + cff_kind_fixed_thousand, + cff_kind_string, + cff_kind_bool, + cff_kind_delta, + cff_kind_callback, + + cff_kind_max /* do not remove */ + }; + + + /* now generate handlers for the most simple fields */ + typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); + + typedef struct CFF_Field_Handler_ + { + int kind; + int code; + FT_UInt offset; + FT_Byte size; + CFF_Field_Reader reader; + FT_UInt array_max; + FT_UInt count_offset; + + } CFF_Field_Handler; + + +FT_END_HEADER + + +#endif /* __CFF_PARSE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffpic.c b/alienblaster/project/jni/freetype/src/cff/cffpic.c new file mode 100644 index 000000000..568956d6a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffpic.c @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* cffpic.c */ +/* */ +/* The FreeType position independent code services for cff module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "cffpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from cffdrivr.c */ + FT_Error FT_Create_Class_cff_services( FT_Library, FT_ServiceDescRec**); + void FT_Destroy_Class_cff_services( FT_Library, FT_ServiceDescRec*); + void FT_Init_Class_cff_service_ps_info( FT_Library, FT_Service_PsInfoRec*); + void FT_Init_Class_cff_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*); + void FT_Init_Class_cff_service_ps_name( FT_Library, FT_Service_PsFontNameRec*); + void FT_Init_Class_cff_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*); + void FT_Init_Class_cff_service_cid_info( FT_Library, FT_Service_CIDRec*); + + /* forward declaration of PIC init functions from cffparse.c */ + FT_Error FT_Create_Class_cff_field_handlers( FT_Library, CFF_Field_Handler**); + void FT_Destroy_Class_cff_field_handlers( FT_Library, CFF_Field_Handler*); + + /* forward declaration of PIC init functions from cffcmap.c */ + void FT_Init_Class_cff_cmap_encoding_class_rec( FT_Library, FT_CMap_ClassRec*); + void FT_Init_Class_cff_cmap_unicode_class_rec( FT_Library, FT_CMap_ClassRec*); + + void + cff_driver_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->cff ) + { + CffModulePIC* container = (CffModulePIC*)pic_container->cff; + if(container->cff_services) + FT_Destroy_Class_cff_services(library, container->cff_services); + container->cff_services = NULL; + if(container->cff_field_handlers) + FT_Destroy_Class_cff_field_handlers(library, container->cff_field_handlers); + container->cff_field_handlers = NULL; + FT_FREE( container ); + pic_container->cff = NULL; + } + } + + FT_Error + cff_driver_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + CffModulePIC* container; + FT_Memory memory = library->memory; + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->cff = container; + + /* initialize pointer table - this is how the module usually expects this data */ + error = FT_Create_Class_cff_services(library, &container->cff_services); + if(error) + goto Exit; + error = FT_Create_Class_cff_field_handlers(library, &container->cff_field_handlers); + if(error) + goto Exit; + FT_Init_Class_cff_service_ps_info(library, &container->cff_service_ps_info); + FT_Init_Class_cff_service_glyph_dict(library, &container->cff_service_glyph_dict); + FT_Init_Class_cff_service_ps_name(library, &container->cff_service_ps_name); + FT_Init_Class_cff_service_get_cmap_info(library, &container->cff_service_get_cmap_info); + FT_Init_Class_cff_service_cid_info(library, &container->cff_service_cid_info); + FT_Init_Class_cff_cmap_encoding_class_rec(library, &container->cff_cmap_encoding_class_rec); + FT_Init_Class_cff_cmap_unicode_class_rec(library, &container->cff_cmap_unicode_class_rec); +Exit: + if(error) + cff_driver_class_pic_free(library); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cffpic.h b/alienblaster/project/jni/freetype/src/cff/cffpic.h new file mode 100644 index 000000000..e29d06813 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cffpic.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* cffpic.h */ +/* */ +/* The FreeType position independent code services for cff module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFPIC_H__ +#define __CFFPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_CFF_SERVICE_PS_INFO_GET cff_service_ps_info +#define FT_CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict +#define FT_CFF_SERVICE_PS_NAME_GET cff_service_ps_name +#define FT_CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info +#define FT_CFF_SERVICE_CID_INFO_GET cff_service_cid_info +#define FT_CFF_SERVICES_GET cff_services +#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec +#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec +#define FT_CFF_FIELD_HANDLERS_GET cff_field_handlers + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_SERVICE_GLYPH_DICT_H +#include "cffparse.h" +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_TT_CMAP_H +#include FT_SERVICE_CID_H + + typedef struct CffModulePIC_ + { + FT_ServiceDescRec* cff_services; + CFF_Field_Handler* cff_field_handlers; + FT_Service_PsInfoRec cff_service_ps_info; + FT_Service_GlyphDictRec cff_service_glyph_dict; + FT_Service_PsFontNameRec cff_service_ps_name; + FT_Service_TTCMapsRec cff_service_get_cmap_info; + FT_Service_CIDRec cff_service_cid_info; + FT_CMap_ClassRec cff_cmap_encoding_class_rec; + FT_CMap_ClassRec cff_cmap_unicode_class_rec; + } CffModulePIC; + +#define GET_PIC(lib) ((CffModulePIC*)((lib)->pic_container.cff)) +#define FT_CFF_SERVICE_PS_INFO_GET (GET_PIC(library)->cff_service_ps_info) +#define FT_CFF_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->cff_service_glyph_dict) +#define FT_CFF_SERVICE_PS_NAME_GET (GET_PIC(library)->cff_service_ps_name) +#define FT_CFF_SERVICE_GET_CMAP_INFO_GET (GET_PIC(library)->cff_service_get_cmap_info) +#define FT_CFF_SERVICE_CID_INFO_GET (GET_PIC(library)->cff_service_cid_info) +#define FT_CFF_SERVICES_GET (GET_PIC(library)->cff_services) +#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET (GET_PIC(library)->cff_cmap_encoding_class_rec) +#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET (GET_PIC(library)->cff_cmap_unicode_class_rec) +#define FT_CFF_FIELD_HANDLERS_GET (GET_PIC(library)->cff_field_handlers) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __CFFPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cfftoken.h b/alienblaster/project/jni/freetype/src/cff/cfftoken.h new file mode 100644 index 000000000..6bb27d5ca --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cfftoken.h @@ -0,0 +1,97 @@ +/***************************************************************************/ +/* */ +/* cfftoken.h */ +/* */ +/* CFF token definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec + +#undef CFFCODE +#define CFFCODE CFFCODE_TOPDICT + + CFF_FIELD_STRING ( 0, version ) + CFF_FIELD_STRING ( 1, notice ) + CFF_FIELD_STRING ( 0x100, copyright ) + CFF_FIELD_STRING ( 2, full_name ) + CFF_FIELD_STRING ( 3, family_name ) + CFF_FIELD_STRING ( 4, weight ) + CFF_FIELD_BOOL ( 0x101, is_fixed_pitch ) + CFF_FIELD_FIXED ( 0x102, italic_angle ) + CFF_FIELD_FIXED ( 0x103, underline_position ) + CFF_FIELD_FIXED ( 0x104, underline_thickness ) + CFF_FIELD_NUM ( 0x105, paint_type ) + CFF_FIELD_NUM ( 0x106, charstring_type ) + CFF_FIELD_CALLBACK( 0x107, font_matrix ) + CFF_FIELD_NUM ( 13, unique_id ) + CFF_FIELD_CALLBACK( 5, font_bbox ) + CFF_FIELD_NUM ( 0x108, stroke_width ) + CFF_FIELD_NUM ( 15, charset_offset ) + CFF_FIELD_NUM ( 16, encoding_offset ) + CFF_FIELD_NUM ( 17, charstrings_offset ) + CFF_FIELD_CALLBACK( 18, private_dict ) + CFF_FIELD_NUM ( 0x114, synthetic_base ) + CFF_FIELD_STRING ( 0x115, embedded_postscript ) + +#if 0 + CFF_FIELD_STRING ( 0x116, base_font_name ) + CFF_FIELD_DELTA ( 0x117, base_font_blend, 16 ) + CFF_FIELD_CALLBACK( 0x118, multiple_master ) + CFF_FIELD_CALLBACK( 0x119, blend_axis_types ) +#endif + + CFF_FIELD_CALLBACK( 0x11E, cid_ros ) + CFF_FIELD_NUM ( 0x11F, cid_font_version ) + CFF_FIELD_NUM ( 0x120, cid_font_revision ) + CFF_FIELD_NUM ( 0x121, cid_font_type ) + CFF_FIELD_NUM ( 0x122, cid_count ) + CFF_FIELD_NUM ( 0x123, cid_uid_base ) + CFF_FIELD_NUM ( 0x124, cid_fd_array_offset ) + CFF_FIELD_NUM ( 0x125, cid_fd_select_offset ) + CFF_FIELD_STRING ( 0x126, cid_font_name ) + +#if 0 + CFF_FIELD_NUM ( 0x127, chameleon ) +#endif + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_PrivateRec +#undef CFFCODE +#define CFFCODE CFFCODE_PRIVATE + + CFF_FIELD_DELTA ( 6, blue_values, 14 ) + CFF_FIELD_DELTA ( 7, other_blues, 10 ) + CFF_FIELD_DELTA ( 8, family_blues, 14 ) + CFF_FIELD_DELTA ( 9, family_other_blues, 10 ) + CFF_FIELD_FIXED_1000( 0x109, blue_scale ) + CFF_FIELD_NUM ( 0x10A, blue_shift ) + CFF_FIELD_NUM ( 0x10B, blue_fuzz ) + CFF_FIELD_NUM ( 10, standard_width ) + CFF_FIELD_NUM ( 11, standard_height ) + CFF_FIELD_DELTA ( 0x10C, snap_widths, 13 ) + CFF_FIELD_DELTA ( 0x10D, snap_heights, 13 ) + CFF_FIELD_BOOL ( 0x10E, force_bold ) + CFF_FIELD_FIXED ( 0x10F, force_bold_threshold ) + CFF_FIELD_NUM ( 0x110, lenIV ) + CFF_FIELD_NUM ( 0x111, language_group ) + CFF_FIELD_FIXED ( 0x112, expansion_factor ) + CFF_FIELD_NUM ( 0x113, initial_random_seed ) + CFF_FIELD_NUM ( 19, local_subrs_offset ) + CFF_FIELD_NUM ( 20, default_width ) + CFF_FIELD_NUM ( 21, nominal_width ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/cfftypes.h b/alienblaster/project/jni/freetype/src/cff/cfftypes.h new file mode 100644 index 000000000..df92e9a1a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/cfftypes.h @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* cfftypes.h */ +/* */ +/* Basic OpenType/CFF type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CFFTYPES_H__ +#define __CFFTYPES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CFF_IndexRec */ + /* */ + /* <Description> */ + /* A structure used to model a CFF Index table. */ + /* */ + /* <Fields> */ + /* stream :: The source input stream. */ + /* */ + /* start :: The position of the first index byte in the */ + /* input stream. */ + /* */ + /* count :: The number of elements in the index. */ + /* */ + /* off_size :: The size in bytes of object offsets in index. */ + /* */ + /* data_offset :: The position of first data byte in the index's */ + /* bytes. */ + /* */ + /* data_size :: The size of the data table in this index. */ + /* */ + /* offsets :: A table of element offsets in the index. Must be */ + /* loaded explicitly. */ + /* */ + /* bytes :: If the index is loaded in memory, its bytes. */ + /* */ + typedef struct CFF_IndexRec_ + { + FT_Stream stream; + FT_ULong start; + FT_UInt count; + FT_Byte off_size; + FT_ULong data_offset; + FT_ULong data_size; + + FT_ULong* offsets; + FT_Byte* bytes; + + } CFF_IndexRec, *CFF_Index; + + + typedef struct CFF_EncodingRec_ + { + FT_UInt format; + FT_ULong offset; + + FT_UInt count; + FT_UShort sids [256]; /* avoid dynamic allocations */ + FT_UShort codes[256]; + + } CFF_EncodingRec, *CFF_Encoding; + + + typedef struct CFF_CharsetRec_ + { + + FT_UInt format; + FT_ULong offset; + + FT_UShort* sids; + FT_UShort* cids; /* the inverse mapping of `sids'; only needed */ + /* for CID-keyed fonts */ + FT_UInt max_cid; + FT_UInt num_glyphs; + + } CFF_CharsetRec, *CFF_Charset; + + + typedef struct CFF_FontRecDictRec_ + { + FT_UInt version; + FT_UInt notice; + FT_UInt copyright; + FT_UInt full_name; + FT_UInt family_name; + FT_UInt weight; + FT_Bool is_fixed_pitch; + FT_Fixed italic_angle; + FT_Fixed underline_position; + FT_Fixed underline_thickness; + FT_Int paint_type; + FT_Int charstring_type; + FT_Matrix font_matrix; + FT_ULong units_per_em; /* temporarily used as scaling value also */ + FT_Vector font_offset; + FT_ULong unique_id; + FT_BBox font_bbox; + FT_Pos stroke_width; + FT_ULong charset_offset; + FT_ULong encoding_offset; + FT_ULong charstrings_offset; + FT_ULong private_offset; + FT_ULong private_size; + FT_Long synthetic_base; + FT_UInt embedded_postscript; + + /* these should only be used for the top-level font dictionary */ + FT_UInt cid_registry; + FT_UInt cid_ordering; + FT_Long cid_supplement; + + FT_Long cid_font_version; + FT_Long cid_font_revision; + FT_Long cid_font_type; + FT_ULong cid_count; + FT_ULong cid_uid_base; + FT_ULong cid_fd_array_offset; + FT_ULong cid_fd_select_offset; + FT_UInt cid_font_name; + + } CFF_FontRecDictRec, *CFF_FontRecDict; + + + typedef struct CFF_PrivateRec_ + { + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Pos blue_values[14]; + FT_Pos other_blues[10]; + FT_Pos family_blues[14]; + FT_Pos family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Pos blue_shift; + FT_Pos blue_fuzz; + FT_Pos standard_width; + FT_Pos standard_height; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Pos snap_widths[13]; + FT_Pos snap_heights[13]; + FT_Bool force_bold; + FT_Fixed force_bold_threshold; + FT_Int lenIV; + FT_Int language_group; + FT_Fixed expansion_factor; + FT_Long initial_random_seed; + FT_ULong local_subrs_offset; + FT_Pos default_width; + FT_Pos nominal_width; + + } CFF_PrivateRec, *CFF_Private; + + + typedef struct CFF_FDSelectRec_ + { + FT_Byte format; + FT_UInt range_count; + + /* that's the table, taken from the file `as is' */ + FT_Byte* data; + FT_UInt data_size; + + /* small cache for format 3 only */ + FT_UInt cache_first; + FT_UInt cache_count; + FT_Byte cache_fd; + + } CFF_FDSelectRec, *CFF_FDSelect; + + + /* A SubFont packs a font dict and a private dict together. They are */ + /* needed to support CID-keyed CFF fonts. */ + typedef struct CFF_SubFontRec_ + { + CFF_FontRecDictRec font_dict; + CFF_PrivateRec private_dict; + + CFF_IndexRec local_subrs_index; + FT_UInt num_local_subrs; + FT_Byte** local_subrs; + + } CFF_SubFontRec, *CFF_SubFont; + + + /* maximum number of sub-fonts in a CID-keyed file */ +#define CFF_MAX_CID_FONTS 32 + + + typedef struct CFF_FontRec_ + { + FT_Stream stream; + FT_Memory memory; + FT_UInt num_faces; + FT_UInt num_glyphs; + + FT_Byte version_major; + FT_Byte version_minor; + FT_Byte header_size; + FT_Byte absolute_offsize; + + + CFF_IndexRec name_index; + CFF_IndexRec top_dict_index; + CFF_IndexRec string_index; + CFF_IndexRec global_subrs_index; + + CFF_EncodingRec encoding; + CFF_CharsetRec charset; + + CFF_IndexRec charstrings_index; + CFF_IndexRec font_dict_index; + CFF_IndexRec private_index; + CFF_IndexRec local_subrs_index; + + FT_String* font_name; + FT_UInt num_global_subrs; + FT_Byte** global_subrs; + + CFF_SubFontRec top_font; + FT_UInt num_subfonts; + CFF_SubFont subfonts[CFF_MAX_CID_FONTS]; + + CFF_FDSelectRec fd_select; + + /* interface to PostScript hinter */ + void* pshinter; + + /* interface to Postscript Names service */ + void* psnames; + + /* since version 2.3.0 */ + PS_FontInfoRec* font_info; /* font info dictionary */ + + /* since version 2.3.6 */ + FT_String* registry; + FT_String* ordering; + + } CFF_FontRec, *CFF_Font; + + +FT_END_HEADER + +#endif /* __CFFTYPES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cff/module.mk b/alienblaster/project/jni/freetype/src/cff/module.mk new file mode 100644 index 000000000..ef1391c27 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 CFF module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += CFF_DRIVER + +define CFF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)cff $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/cff/rules.mk b/alienblaster/project/jni/freetype/src/cff/rules.mk new file mode 100644 index 000000000..4100c8068 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cff/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 OpenType/CFF driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# OpenType driver directory +# +CFF_DIR := $(SRC_DIR)/cff + + +CFF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CFF_DIR)) + + +# CFF driver sources (i.e., C files) +# +CFF_DRV_SRC := $(CFF_DIR)/cffobjs.c \ + $(CFF_DIR)/cffload.c \ + $(CFF_DIR)/cffgload.c \ + $(CFF_DIR)/cffparse.c \ + $(CFF_DIR)/cffcmap.c \ + $(CFF_DIR)/cffdrivr.c + +# CFF driver headers +# +CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \ + $(CFF_DIR)/cfftoken.h \ + $(CFF_DIR)/cfftypes.h \ + $(CFF_DIR)/cfferrs.h + + +# CFF driver object(s) +# +# CFF_DRV_OBJ_M is used during `multi' builds +# CFF_DRV_OBJ_S is used during `single' builds +# +CFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O) +CFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O + +# CFF driver source file for single build +# +CFF_DRV_SRC_S := $(CFF_DIR)/cff.c + + +# CFF driver - single object +# +$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H) + $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S)) + + +# CFF driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H) + $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CFF_DRV_OBJ_S) +DRV_OBJS_M += $(CFF_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/cid/Jamfile b/alienblaster/project/jni/freetype/src/cid/Jamfile new file mode 100644 index 000000000..ebeaed54e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/cid Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) cid ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = cidobjs cidload cidgload cidriver cidparse ; + } + else + { + _sources = type1cid ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/cid Jamfile diff --git a/alienblaster/project/jni/freetype/src/cid/ciderrs.h b/alienblaster/project/jni/freetype/src/cid/ciderrs.h new file mode 100644 index 000000000..01813e189 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/ciderrs.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* ciderrs.h */ +/* */ +/* CID error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the CID error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __CIDERRS_H__ +#define __CIDERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX CID_Err_ +#define FT_ERR_BASE FT_Mod_Err_CID + +#include FT_ERRORS_H + +#endif /* __CIDERRS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidgload.c b/alienblaster/project/jni/freetype/src/cid/cidgload.c new file mode 100644 index 000000000..ea61b4e12 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidgload.c @@ -0,0 +1,443 @@ +/***************************************************************************/ +/* */ +/* cidgload.c */ +/* */ +/* CID-keyed Type1 Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "cidload.h" +#include "cidgload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_OUTLINE_H +#include FT_INTERNAL_CALC_H + +#include "ciderrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidgload + + + FT_CALLBACK_DEF( FT_Error ) + cid_load_glyph( T1_Decoder decoder, + FT_UInt glyph_index ) + { + CID_Face face = (CID_Face)decoder->builder.face; + CID_FaceInfo cid = &face->cid; + FT_Byte* p; + FT_UInt fd_select; + FT_Stream stream = face->cid_stream; + FT_Error error = CID_Err_Ok; + FT_Byte* charstring = 0; + FT_Memory memory = face->root.memory; + FT_ULong glyph_length = 0; + PSAux_Service psaux = (PSAux_Service)face->psaux; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec *inc = + face->root.internal->incremental_interface; +#endif + + + FT_TRACE4(( "cid_load_glyph: glyph index %d\n", glyph_index )); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* For incremental fonts get the character data using */ + /* the callback function. */ + if ( inc ) + { + FT_Data glyph_data; + + + error = inc->funcs->get_glyph_data( inc->object, + glyph_index, &glyph_data ); + if ( error ) + goto Exit; + + p = (FT_Byte*)glyph_data.pointer; + fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); + + if ( glyph_data.length != 0 ) + { + glyph_length = glyph_data.length - cid->fd_bytes; + (void)FT_ALLOC( charstring, glyph_length ); + if ( !error ) + ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes, + glyph_length ); + } + + inc->funcs->free_glyph_data( inc->object, &glyph_data ); + + if ( error ) + goto Exit; + } + + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* For ordinary fonts read the CID font dictionary index */ + /* and charstring offset from the CIDMap. */ + { + FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes; + FT_ULong off1; + + + if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset + + glyph_index * entry_len ) || + FT_FRAME_ENTER( 2 * entry_len ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + fd_select = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes ); + off1 = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes ); + p += cid->fd_bytes; + glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1; + FT_FRAME_EXIT(); + + if ( fd_select >= (FT_UInt)cid->num_dicts ) + { + error = CID_Err_Invalid_Offset; + goto Exit; + } + if ( glyph_length == 0 ) + goto Exit; + if ( FT_ALLOC( charstring, glyph_length ) ) + goto Exit; + if ( FT_STREAM_READ_AT( cid->data_offset + off1, + charstring, glyph_length ) ) + goto Exit; + } + + /* Now set up the subrs array and parse the charstrings. */ + { + CID_FaceDict dict; + CID_Subrs cid_subrs = face->subrs + fd_select; + FT_Int cs_offset; + + + /* Set up subrs */ + decoder->num_subrs = cid_subrs->num_subrs; + decoder->subrs = cid_subrs->code; + decoder->subrs_len = 0; + + /* Set up font matrix */ + dict = cid->font_dicts + fd_select; + + decoder->font_matrix = dict->font_matrix; + decoder->font_offset = dict->font_offset; + decoder->lenIV = dict->private_dict.lenIV; + + /* Decode the charstring. */ + + /* Adjustment for seed bytes. */ + cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + + /* Decrypt only if lenIV >= 0. */ + if ( decoder->lenIV >= 0 ) + psaux->t1_decrypt( charstring, glyph_length, 4330 ); + + error = decoder->funcs.parse_charstrings( + decoder, charstring + cs_offset, + (FT_Int)glyph_length - cs_offset ); + } + + FT_FREE( charstring ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && inc && inc->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x ); + metrics.bearing_y = 0; + metrics.advance = FIXED_TO_INT( decoder->builder.advance.x ); + metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y ); + + error = inc->funcs->get_glyph_metrics( inc->object, + glyph_index, FALSE, &metrics ); + + decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x ); + decoder->builder.advance.x = INT_TO_FIXED( metrics.advance ); + decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v ); + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + Exit: + return error; + } + + +#if 0 + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + cid_face_compute_max_advance( CID_Face face, + FT_Int* max_advance ) + { + FT_Error error; + T1_DecoderRec decoder; + FT_Int glyph_index; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + *max_advance = 0; + + /* Initialize load decoder */ + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + 0, /* glyph names! XXX */ + 0, /* blend == 0 */ + 0, /* hinting == 0 */ + cid_load_glyph ); + if ( error ) + return error; + + /* TODO: initialize decoder.len_buildchar and decoder.buildchar */ + /* if we ever support CID-keyed multiple master fonts */ + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + /* for each glyph, parse the glyph charstring and extract */ + /* the advance width */ + for ( glyph_index = 0; glyph_index < face->root.num_glyphs; + glyph_index++ ) + { + /* now get load the unscaled outline */ + error = cid_load_glyph( &decoder, glyph_index ); + /* ignore the error if one occurred - skip to next glyph */ + } + + *max_advance = FIXED_TO_INT( decoder.builder.advance.x ); + + psaux->t1_decoder_funcs->done( &decoder ); + + return CID_Err_Ok; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + cid_slot_load_glyph( FT_GlyphSlot cidglyph, /* CID_GlyphSlot */ + FT_Size cidsize, /* CID_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + CID_GlyphSlot glyph = (CID_GlyphSlot)cidglyph; + CID_Size size = (CID_Size)cidsize; + FT_Error error; + T1_DecoderRec decoder; + CID_Face face = (CID_Face)cidglyph->face; + FT_Bool hinting; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + FT_Matrix font_matrix; + FT_Vector font_offset; + + + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = CID_Err_Invalid_Argument; + goto Exit; + } + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + glyph->x_scale = cidsize->metrics.x_scale; + glyph->y_scale = cidsize->metrics.y_scale; + + cidglyph->outline.n_points = 0; + cidglyph->outline.n_contours = 0; + + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + + cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; + + error = psaux->t1_decoder_funcs->init( &decoder, + cidglyph->face, + cidsize, + cidglyph, + 0, /* glyph names -- XXX */ + 0, /* blend == 0 */ + hinting, + FT_LOAD_TARGET_MODE( load_flags ), + cid_load_glyph ); + if ( error ) + goto Exit; + + /* TODO: initialize decoder.len_buildchar and decoder.buildchar */ + /* if we ever support CID-keyed multiple master fonts */ + + /* set up the decoder */ + decoder.builder.no_recurse = FT_BOOL( + ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) ); + + error = cid_load_glyph( &decoder, glyph_index ); + if ( error ) + goto Exit; + + font_matrix = decoder.font_matrix; + font_offset = decoder.font_offset; + + /* save new glyph tables */ + psaux->t1_decoder_funcs->done( &decoder ); + + /* now set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax */ + cidglyph->outline.flags &= FT_OUTLINE_OWNER; + cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* for composite glyphs, return only left side bearing and */ + /* advance width */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = cidglyph->internal; + + + cidglyph->metrics.horiBearingX = + FIXED_TO_INT( decoder.builder.left_bearing.x ); + cidglyph->metrics.horiAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &cidglyph->metrics; + FT_Vector advance; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + cidglyph->linearHoriAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + cidglyph->internal->glyph_transformed = 0; + + /* make up vertical ones */ + metrics->vertAdvance = ( face->cid.font_bbox.yMax - + face->cid.font_bbox.yMin ) >> 16; + cidglyph->linearVertAdvance = metrics->vertAdvance; + + cidglyph->format = FT_GLYPH_FORMAT_OUTLINE; + + if ( size && cidsize->metrics.y_ppem < 24 ) + cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + /* apply the font matrix */ + FT_Outline_Transform( &cidglyph->outline, &font_matrix ); + + FT_Outline_Translate( &cidglyph->outline, + font_offset.x, + font_offset.y ); + + advance.x = metrics->horiAdvance; + advance.y = 0; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->horiAdvance = advance.x + font_offset.x; + + advance.x = 0; + advance.y = metrics->vertAdvance; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->vertAdvance = advance.y + font_offset.y; + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = decoder.builder.base; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &cidglyph->outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + /* make up vertical ones */ + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + + Exit: + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidgload.h b/alienblaster/project/jni/freetype/src/cid/cidgload.h new file mode 100644 index 000000000..a0a91bfea --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidgload.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* cidgload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDGLOAD_H__ +#define __CIDGLOAD_H__ + + +#include <ft2build.h> +#include "cidobjs.h" + + +FT_BEGIN_HEADER + + +#if 0 + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cid_face_compute_max_advance( CID_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + FT_LOCAL( FT_Error ) + cid_slot_load_glyph( FT_GlyphSlot glyph, /* CID_Glyph_Slot */ + FT_Size size, /* CID_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __CIDGLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidload.c b/alienblaster/project/jni/freetype/src/cid/cidload.c new file mode 100644 index 000000000..3bb359446 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidload.c @@ -0,0 +1,672 @@ +/***************************************************************************/ +/* */ +/* cidload.c */ +/* */ +/* CID-keyed Type1 font loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_TYPE1_TYPES_H + +#include "cidload.h" + +#include "ciderrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidload + + + /* read a single offset */ + FT_LOCAL_DEF( FT_Long ) + cid_get_offset( FT_Byte* *start, + FT_Byte offsize ) + { + FT_Long result; + FT_Byte* p = *start; + + + for ( result = 0; offsize > 0; offsize-- ) + { + result <<= 8; + result |= *p++; + } + + *start = p; + return result; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 SYMBOL PARSING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + cid_load_keyword( CID_Face face, + CID_Loader* loader, + const T1_Field keyword ) + { + FT_Error error; + CID_Parser* parser = &loader->parser; + FT_Byte* object; + void* dummy_object; + CID_FaceInfo cid = &face->cid; + + + /* if the keyword has a dedicated callback, call it */ + if ( keyword->type == T1_FIELD_TYPE_CALLBACK ) + { + keyword->reader( (FT_Face)face, parser ); + error = parser->root.error; + goto Exit; + } + + /* we must now compute the address of our target object */ + switch ( keyword->location ) + { + case T1_FIELD_LOCATION_CID_INFO: + object = (FT_Byte*)cid; + break; + + case T1_FIELD_LOCATION_FONT_INFO: + object = (FT_Byte*)&cid->font_info; + break; + + case T1_FIELD_LOCATION_FONT_EXTRA: + object = (FT_Byte*)&face->font_extra; + break; + + case T1_FIELD_LOCATION_BBOX: + object = (FT_Byte*)&cid->font_bbox; + break; + + default: + { + CID_FaceDict dict; + + + if ( parser->num_dict < 0 ) + { + FT_ERROR(( "cid_load_keyword: invalid use of `%s'\n", + keyword->ident )); + error = CID_Err_Syntax_Error; + goto Exit; + } + + dict = cid->font_dicts + parser->num_dict; + switch ( keyword->location ) + { + case T1_FIELD_LOCATION_PRIVATE: + object = (FT_Byte*)&dict->private_dict; + break; + + default: + object = (FT_Byte*)dict; + } + } + } + + dummy_object = object; + + /* now, load the keyword data in the object's field(s) */ + if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY || + keyword->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = cid_parser_load_field_table( &loader->parser, keyword, + &dummy_object ); + else + error = cid_parser_load_field( &loader->parser, + keyword, &dummy_object ); + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + parse_font_matrix( CID_Face face, + CID_Parser* parser ) + { + FT_Matrix* matrix; + FT_Vector* offset; + CID_FaceDict dict; + FT_Face root = (FT_Face)&face->root; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + + + if ( parser->num_dict >= 0 ) + { + dict = face->cid.font_dicts + parser->num_dict; + matrix = &dict->font_matrix; + offset = &dict->font_offset; + + (void)cid_parser_to_fixed_array( parser, 6, temp, 3 ); + + temp_scale = FT_ABS( temp[3] ); + + /* Set units per EM based on FontMatrix values. We set the value to */ + /* `1000/temp_scale', because temp_scale was already multiplied by */ + /* 1000 (in `t1_tofixed', from psobjs.c). */ + root->units_per_EM = (FT_UShort)( FT_DivFix( 0x10000L, + FT_DivFix( temp_scale, 1000 ) ) ); + + /* we need to scale the values by 1.0/temp[3] */ + if ( temp_scale != 0x10000L ) + { + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = 0x10000L; + } + + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + /* note that the font offsets are expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + return CID_Err_Ok; /* this is a callback function; */ + /* we must return an error code */ + } + + + FT_CALLBACK_DEF( FT_Error ) + parse_fd_array( CID_Face face, + CID_Parser* parser ) + { + CID_FaceInfo cid = &face->cid; + FT_Memory memory = face->root.memory; + FT_Error error = CID_Err_Ok; + FT_Long num_dicts; + + + num_dicts = cid_parser_to_int( parser ); + + if ( !cid->font_dicts ) + { + FT_Int n; + + + if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) ) + goto Exit; + + cid->num_dicts = (FT_UInt)num_dicts; + + /* don't forget to set a few defaults */ + for ( n = 0; n < cid->num_dicts; n++ ) + { + CID_FaceDict dict = cid->font_dicts + n; + + + /* default value for lenIV */ + dict->private_dict.lenIV = 4; + } + } + + Exit: + return error; + } + + + /* by mistake, `expansion_factor' appears both in PS_PrivateRec */ + /* and CID_FaceDictRec (both are public header files and can't */ + /* changed); we simply copy the value */ + + FT_CALLBACK_DEF( FT_Error ) + parse_expansion_factor( CID_Face face, + CID_Parser* parser ) + { + CID_FaceDict dict; + + + if ( parser->num_dict >= 0 ) + { + dict = face->cid.font_dicts + parser->num_dict; + + dict->expansion_factor = cid_parser_to_fixed( parser, 0 ); + dict->private_dict.expansion_factor = dict->expansion_factor; + } + + return CID_Err_Ok; + } + + + static + const T1_FieldRec cid_field_records[] = + { + +#include "cidtoken.h" + + T1_FIELD_CALLBACK( "FDArray", parse_fd_array, 0 ) + T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix, 0 ) + T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 ) + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + + static FT_Error + cid_parse_dict( CID_Face face, + CID_Loader* loader, + FT_Byte* base, + FT_Long size ) + { + CID_Parser* parser = &loader->parser; + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = CID_Err_Ok; + + { + FT_Byte* cur = base; + FT_Byte* limit = cur + size; + + + for (;;) + { + FT_Byte* newlimit; + + + parser->root.cursor = cur; + cid_parser_skip_spaces( parser ); + + if ( parser->root.cursor >= limit ) + newlimit = limit - 1 - 17; + else + newlimit = parser->root.cursor - 17; + + /* look for `%ADOBeginFontDict' */ + for ( ; cur < newlimit; cur++ ) + { + if ( *cur == '%' && + ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 ) + { + /* if /FDArray was found, then cid->num_dicts is > 0, and */ + /* we can start increasing parser->num_dict */ + if ( face->cid.num_dicts > 0 ) + parser->num_dict++; + } + } + + cur = parser->root.cursor; + /* no error can occur in cid_parser_skip_spaces */ + if ( cur >= limit ) + break; + + cid_parser_skip_PS_token( parser ); + if ( parser->root.cursor >= limit || parser->root.error ) + break; + + /* look for immediates */ + if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; + + + cur++; + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 ) + { + /* now compare the immediate name to the keyword table */ + T1_Field keyword = (T1_Field)cid_field_records; + + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == (FT_PtrDist)ft_strlen( (const char*)name ) ) + { + FT_PtrDist n; + + + for ( n = 1; n < len; n++ ) + if ( cur[n] != name[n] ) + break; + + if ( n >= len ) + { + /* we found it - run the parsing callback */ + parser->root.error = cid_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + break; + } + } + keyword++; + } + } + } + + cur = parser->root.cursor; + } + } + return parser->root.error; + } + + + /* read the subrmap and the subrs of each font dict */ + static FT_Error + cid_read_subrs( CID_Face face ) + { + CID_FaceInfo cid = &face->cid; + FT_Memory memory = face->root.memory; + FT_Stream stream = face->cid_stream; + FT_Error error; + FT_Int n; + CID_Subrs subr; + FT_UInt max_offsets = 0; + FT_ULong* offsets = 0; + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) ) + goto Exit; + + subr = face->subrs; + for ( n = 0; n < cid->num_dicts; n++, subr++ ) + { + CID_FaceDict dict = cid->font_dicts + n; + FT_Int lenIV = dict->private_dict.lenIV; + FT_UInt count, num_subrs = dict->num_subrs; + FT_ULong data_len; + FT_Byte* p; + + + /* reallocate offsets array if needed */ + if ( num_subrs + 1 > max_offsets ) + { + FT_UInt new_max = FT_PAD_CEIL( num_subrs + 1, 4 ); + + + if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) ) + goto Fail; + + max_offsets = new_max; + } + + /* read the subrmap's offsets */ + if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) || + FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) ) + goto Fail; + + p = (FT_Byte*)stream->cursor; + for ( count = 0; count <= num_subrs; count++ ) + offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes ); + + FT_FRAME_EXIT(); + + /* now, compute the size of subrs charstrings, */ + /* allocate, and read them */ + data_len = offsets[num_subrs] - offsets[0]; + + if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) || + FT_ALLOC( subr->code[0], data_len ) ) + goto Fail; + + if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) || + FT_STREAM_READ( subr->code[0], data_len ) ) + goto Fail; + + /* set up pointers */ + for ( count = 1; count <= num_subrs; count++ ) + { + FT_ULong len; + + + len = offsets[count] - offsets[count - 1]; + subr->code[count] = subr->code[count - 1] + len; + } + + /* decrypt subroutines, but only if lenIV >= 0 */ + if ( lenIV >= 0 ) + { + for ( count = 0; count < num_subrs; count++ ) + { + FT_ULong len; + + + len = offsets[count + 1] - offsets[count]; + psaux->t1_decrypt( subr->code[count], len, 4330 ); + } + } + + subr->num_subrs = num_subrs; + } + + Exit: + FT_FREE( offsets ); + return error; + + Fail: + if ( face->subrs ) + { + for ( n = 0; n < cid->num_dicts; n++ ) + { + if ( face->subrs[n].code ) + FT_FREE( face->subrs[n].code[0] ); + + FT_FREE( face->subrs[n].code ); + } + FT_FREE( face->subrs ); + } + goto Exit; + } + + + static void + t1_init_loader( CID_Loader* loader, + CID_Face face ) + { + FT_UNUSED( face ); + + FT_MEM_ZERO( loader, sizeof ( *loader ) ); + } + + + static void + t1_done_loader( CID_Loader* loader ) + { + CID_Parser* parser = &loader->parser; + + + /* finalize parser */ + cid_parser_done( parser ); + } + + + static FT_Error + cid_hex_to_binary( FT_Byte* data, + FT_Long data_len, + FT_ULong offset, + CID_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Error error; + + FT_Byte buffer[256]; + FT_Byte *p, *plimit; + FT_Byte *d, *dlimit; + FT_Byte val; + + FT_Bool upper_nibble, done; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + d = data; + dlimit = d + data_len; + p = buffer; + plimit = p; + + upper_nibble = 1; + done = 0; + + while ( d < dlimit ) + { + if ( p >= plimit ) + { + FT_ULong oldpos = FT_STREAM_POS(); + FT_ULong size = stream->size - oldpos; + + + if ( size == 0 ) + { + error = CID_Err_Syntax_Error; + goto Exit; + } + + if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) ) + goto Exit; + p = buffer; + plimit = p + FT_STREAM_POS() - oldpos; + } + + if ( ft_isdigit( *p ) ) + val = (FT_Byte)( *p - '0' ); + else if ( *p >= 'a' && *p <= 'f' ) + val = (FT_Byte)( *p - 'a' ); + else if ( *p >= 'A' && *p <= 'F' ) + val = (FT_Byte)( *p - 'A' + 10 ); + else if ( *p == ' ' || + *p == '\t' || + *p == '\r' || + *p == '\n' || + *p == '\f' || + *p == '\0' ) + { + p++; + continue; + } + else if ( *p == '>' ) + { + val = 0; + done = 1; + } + else + { + error = CID_Err_Syntax_Error; + goto Exit; + } + + if ( upper_nibble ) + *d = (FT_Byte)( val << 4 ); + else + { + *d = (FT_Byte)( *d + val ); + d++; + } + + upper_nibble = (FT_Byte)( 1 - upper_nibble ); + + if ( done ) + break; + + p++; + } + + error = CID_Err_Ok; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cid_face_open( CID_Face face, + FT_Int face_index ) + { + CID_Loader loader; + CID_Parser* parser; + FT_Memory memory = face->root.memory; + FT_Error error; + + + t1_init_loader( &loader, face ); + + parser = &loader.parser; + error = cid_parser_new( parser, face->root.stream, face->root.memory, + (PSAux_Service)face->psaux ); + if ( error ) + goto Exit; + + error = cid_parse_dict( face, &loader, + parser->postscript, + parser->postscript_len ); + if ( error ) + goto Exit; + + if ( face_index < 0 ) + goto Exit; + + if ( FT_NEW( face->cid_stream ) ) + goto Exit; + + if ( parser->binary_length ) + { + /* we must convert the data section from hexadecimal to binary */ + if ( FT_ALLOC( face->binary_data, parser->binary_length ) || + cid_hex_to_binary( face->binary_data, parser->binary_length, + parser->data_offset, face ) ) + goto Exit; + + FT_Stream_OpenMemory( face->cid_stream, + face->binary_data, parser->binary_length ); + face->cid.data_offset = 0; + } + else + { + *face->cid_stream = *face->root.stream; + face->cid.data_offset = loader.parser.data_offset; + } + + error = cid_read_subrs( face ); + + Exit: + t1_done_loader( &loader ); + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidload.h b/alienblaster/project/jni/freetype/src/cid/cidload.h new file mode 100644 index 000000000..8c172ffee --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidload.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* cidload.h */ +/* */ +/* CID-keyed Type1 font loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDLOAD_H__ +#define __CIDLOAD_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include "cidparse.h" + + +FT_BEGIN_HEADER + + + typedef struct CID_Loader_ + { + CID_Parser parser; /* parser used to read the stream */ + FT_Int num_chars; /* number of characters in encoding */ + + } CID_Loader; + + + FT_LOCAL( FT_Long ) + cid_get_offset( FT_Byte** start, + FT_Byte offsize ); + + FT_LOCAL( FT_Error ) + cid_face_open( CID_Face face, + FT_Int face_index ); + + +FT_END_HEADER + +#endif /* __CIDLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidobjs.c b/alienblaster/project/jni/freetype/src/cid/cidobjs.c new file mode 100644 index 000000000..82678af0d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidobjs.c @@ -0,0 +1,482 @@ +/***************************************************************************/ +/* */ +/* cidobjs.c */ +/* */ +/* CID objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include "cidgload.h" +#include "cidload.h" + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + +#include "ciderrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidobjs + + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + cid_slot_done( FT_GlyphSlot slot ) + { + slot->internal->glyph_hints = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + cid_slot_init( FT_GlyphSlot slot ) + { + CID_Face face; + PSHinter_Service pshinter; + + + face = (CID_Face)slot->face; + pshinter = (PSHinter_Service)face->pshinter; + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->face->driver->root.library, + "pshinter" ); + if ( module ) + { + T1_Hints_Funcs funcs; + + + funcs = pshinter->get_t1_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return 0; + } + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + cid_size_get_globals_funcs( CID_Size size ) + { + CID_Face face = (CID_Face)size->root.face; + PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + cid_size_done( FT_Size cidsize ) /* CID_Size */ + { + CID_Size size = (CID_Size)cidsize; + + + if ( cidsize->internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = cid_size_get_globals_funcs( size ); + if ( funcs ) + funcs->destroy( (PSH_Globals)cidsize->internal ); + + cidsize->internal = 0; + } + } + + + FT_LOCAL_DEF( FT_Error ) + cid_size_init( FT_Size cidsize ) /* CID_Size */ + { + CID_Size size = (CID_Size)cidsize; + FT_Error error = 0; + PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size ); + + + if ( funcs ) + { + PSH_Globals globals; + CID_Face face = (CID_Face)cidsize->face; + CID_FaceDict dict = face->cid.font_dicts + face->root.face_index; + PS_Private priv = &dict->private_dict; + + + error = funcs->create( cidsize->face->memory, priv, &globals ); + if ( !error ) + cidsize->internal = (FT_Size_Internal)(void*)globals; + } + + return error; + } + + + FT_LOCAL( FT_Error ) + cid_size_request( FT_Size size, + FT_Size_Request req ) + { + PSH_Globals_Funcs funcs; + + + FT_Request_Metrics( size->face, req ); + + funcs = cid_size_get_globals_funcs( (CID_Size)size ); + + if ( funcs ) + funcs->set_scale( (PSH_Globals)size->internal, + size->metrics.x_scale, + size->metrics.y_scale, + 0, 0 ); + + return CID_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_face_done */ + /* */ + /* <Description> */ + /* Finalizes a given face object. */ + /* */ + /* <Input> */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + cid_face_done( FT_Face cidface ) /* CID_Face */ + { + CID_Face face = (CID_Face)cidface; + FT_Memory memory; + CID_FaceInfo cid; + PS_FontInfo info; + + + if ( !face ) + return; + + cid = &face->cid; + info = &cid->font_info; + memory = cidface->memory; + + /* release subrs */ + if ( face->subrs ) + { + FT_Int n; + + + for ( n = 0; n < cid->num_dicts; n++ ) + { + CID_Subrs subr = face->subrs + n; + + + if ( subr->code ) + { + FT_FREE( subr->code[0] ); + FT_FREE( subr->code ); + } + } + + FT_FREE( face->subrs ); + } + + /* release FontInfo strings */ + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + + /* release font dictionaries */ + FT_FREE( cid->font_dicts ); + cid->num_dicts = 0; + + /* release other strings */ + FT_FREE( cid->cid_font_name ); + FT_FREE( cid->registry ); + FT_FREE( cid->ordering ); + + cidface->family_name = 0; + cidface->style_name = 0; + + FT_FREE( face->binary_data ); + FT_FREE( face->cid_stream ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_face_init */ + /* */ + /* <Description> */ + /* Initializes a given CID face object. */ + /* */ + /* <Input> */ + /* stream :: The source font stream. */ + /* */ + /* face_index :: The index of the font face in the resource. */ + /* */ + /* num_params :: Number of additional generic parameters. Ignored. */ + /* */ + /* params :: Additional generic parameters. Ignored. */ + /* */ + /* <InOut> */ + /* face :: The newly built face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cid_face_init( FT_Stream stream, + FT_Face cidface, /* CID_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + CID_Face face = (CID_Face)cidface; + FT_Error error; + PSAux_Service psaux; + PSHinter_Service pshinter; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( stream ); + + + cidface->num_faces = 1; + + psaux = (PSAux_Service)face->psaux; + if ( !psaux ) + { + psaux = (PSAux_Service)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "psaux" ); + + face->psaux = psaux; + } + + pshinter = (PSHinter_Service)face->pshinter; + if ( !pshinter ) + { + pshinter = (PSHinter_Service)FT_Get_Module_Interface( + FT_FACE_LIBRARY( face ), "pshinter" ); + + face->pshinter = pshinter; + } + + /* open the tokenizer; this will also check the font format */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + error = cid_face_open( face, face_index ); + if ( error ) + goto Exit; + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + /* XXX: handle CID fonts with more than a single face */ + if ( face_index != 0 ) + { + FT_ERROR(( "cid_face_init: invalid face index\n" )); + error = CID_Err_Invalid_Argument; + goto Exit; + } + + /* now load the font program into the face object */ + + /* initialize the face object fields */ + + /* set up root face fields */ + { + CID_FaceInfo cid = &face->cid; + PS_FontInfo info = &cid->font_info; + + + cidface->num_glyphs = cid->cid_count; + cidface->num_charmaps = 0; + + cidface->face_index = face_index; + cidface->face_flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ + + if ( info->is_fixed_pitch ) + cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* XXX: TODO: add kerning with .afm support */ + + /* get style name -- be careful, some broken fonts only */ + /* have a /FontName dictionary entry! */ + cidface->family_name = info->family_name; + /* assume "Regular" style if we don't know better */ + cidface->style_name = (char *)"Regular"; + if ( cidface->family_name ) + { + char* full = info->full_name; + char* family = cidface->family_name; + + + if ( full ) + { + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + if ( !*family ) + cidface->style_name = full; + break; + } + } + } + } + } + else + { + /* do we have a `/FontName'? */ + if ( cid->cid_font_name ) + cidface->family_name = cid->cid_font_name; + } + + /* compute style flags */ + cidface->style_flags = 0; + if ( info->italic_angle ) + cidface->style_flags |= FT_STYLE_FLAG_ITALIC; + if ( info->weight ) + { + if ( !ft_strcmp( info->weight, "Bold" ) || + !ft_strcmp( info->weight, "Black" ) ) + cidface->style_flags |= FT_STYLE_FLAG_BOLD; + } + + /* no embedded bitmap support */ + cidface->num_fixed_sizes = 0; + cidface->available_sizes = 0; + + cidface->bbox.xMin = cid->font_bbox.xMin >> 16; + cidface->bbox.yMin = cid->font_bbox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16; + cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16; + + if ( !cidface->units_per_EM ) + cidface->units_per_EM = 1000; + + cidface->ascender = (FT_Short)( cidface->bbox.yMax ); + cidface->descender = (FT_Short)( cidface->bbox.yMin ); + + cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 ); + if ( cidface->height < cidface->ascender - cidface->descender ) + cidface->height = (FT_Short)( cidface->ascender - cidface->descender ); + + cidface->underline_position = (FT_Short)info->underline_position; + cidface->underline_thickness = (FT_Short)info->underline_thickness; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_driver_init */ + /* */ + /* <Description> */ + /* Initializes a given CID driver object. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target driver object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cid_driver_init( FT_Module driver ) + { + FT_UNUSED( driver ); + + return CID_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* cid_driver_done */ + /* */ + /* <Description> */ + /* Finalizes a given CID driver. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target CID driver. */ + /* */ + FT_LOCAL_DEF( void ) + cid_driver_done( FT_Module driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidobjs.h b/alienblaster/project/jni/freetype/src/cid/cidobjs.h new file mode 100644 index 000000000..aee346d1c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidobjs.h @@ -0,0 +1,154 @@ +/***************************************************************************/ +/* */ +/* cidobjs.h */ +/* */ +/* CID objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDOBJS_H__ +#define __CIDOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + /* The following structures must be defined by the hinter */ + typedef struct CID_Size_Hints_ CID_Size_Hints; + typedef struct CID_Glyph_Hints_ CID_Glyph_Hints; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CID_Driver */ + /* */ + /* <Description> */ + /* A handle to a Type 1 driver object. */ + /* */ + typedef struct CID_DriverRec_* CID_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CID_Size */ + /* */ + /* <Description> */ + /* A handle to a Type 1 size object. */ + /* */ + typedef struct CID_SizeRec_* CID_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CID_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a Type 1 glyph slot object. */ + /* */ + typedef struct CID_GlyphSlotRec_* CID_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* CID_CharMap */ + /* */ + /* <Description> */ + /* A handle to a Type 1 character mapping object. */ + /* */ + /* <Note> */ + /* The Type 1 format doesn't use a charmap but an encoding table. */ + /* The driver is responsible for making up charmap objects */ + /* corresponding to these tables. */ + /* */ + typedef struct CID_CharMapRec_* CID_CharMap; + + + /*************************************************************************/ + /* */ + /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF */ + /* */ + /*************************************************************************/ + + + typedef struct CID_SizeRec_ + { + FT_SizeRec root; + FT_Bool valid; + + } CID_SizeRec; + + + typedef struct CID_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } CID_GlyphSlotRec; + + + FT_LOCAL( void ) + cid_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cid_slot_init( FT_GlyphSlot slot ); + + + FT_LOCAL( void ) + cid_size_done( FT_Size size ); /* CID_Size */ + + FT_LOCAL( FT_Error ) + cid_size_init( FT_Size size ); /* CID_Size */ + + FT_LOCAL( FT_Error ) + cid_size_request( FT_Size size, /* CID_Size */ + FT_Size_Request req ); + + FT_LOCAL( FT_Error ) + cid_face_init( FT_Stream stream, + FT_Face face, /* CID_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cid_face_done( FT_Face face ); /* CID_Face */ + + + FT_LOCAL( FT_Error ) + cid_driver_init( FT_Module driver ); + + FT_LOCAL( void ) + cid_driver_done( FT_Module driver ); + + +FT_END_HEADER + +#endif /* __CIDOBJS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidparse.c b/alienblaster/project/jni/freetype/src/cid/cidparse.c new file mode 100644 index 000000000..efed618f5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidparse.c @@ -0,0 +1,225 @@ +/***************************************************************************/ +/* */ +/* cidparse.c */ +/* */ +/* CID-keyed Type1 parser (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H + +#include "cidparse.h" + +#include "ciderrs.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_cidparse + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INPUT STREAM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + cid_parser_new( CID_Parser* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error; + FT_ULong base_offset, offset, ps_len; + FT_Byte *cur, *limit; + FT_Byte *arg1, *arg2; + + + FT_MEM_ZERO( parser, sizeof ( *parser ) ); + psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); + + parser->stream = stream; + + base_offset = FT_STREAM_POS(); + + /* first of all, check the font format in the header */ + if ( FT_FRAME_ENTER( 31 ) ) + goto Exit; + + if ( ft_strncmp( (char *)stream->cursor, + "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) ) + { + FT_TRACE2(( "[not a valid CID-keyed font]\n" )); + error = CID_Err_Unknown_File_Format; + } + + FT_FRAME_EXIT(); + if ( error ) + goto Exit; + + Again: + /* now, read the rest of the file until we find */ + /* `StartData' or `/sfnts' */ + { + FT_Byte buffer[256 + 10]; + FT_Long read_len = 256 + 10; /* same as signed FT_Stream->size */ + FT_Byte* p = buffer; + + + for ( offset = FT_STREAM_POS(); ; offset += 256 ) + { + FT_Long stream_len; /* same as signed FT_Stream->size */ + + + stream_len = stream->size - FT_STREAM_POS(); + if ( stream_len == 0 ) + { + FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" )); + error = CID_Err_Unknown_File_Format; + goto Exit; + } + + read_len = FT_MIN( read_len, stream_len ); + if ( FT_STREAM_READ( p, read_len ) ) + goto Exit; + + if ( read_len < 256 ) + p[read_len] = '\0'; + + limit = p + read_len - 10; + + for ( p = buffer; p < limit; p++ ) + { + if ( p[0] == 'S' && ft_strncmp( (char*)p, "StartData", 9 ) == 0 ) + { + /* save offset of binary data after `StartData' */ + offset += p - buffer + 10; + goto Found; + } + else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 ) + { + offset += p - buffer + 7; + goto Found; + } + } + + FT_MEM_MOVE( buffer, p, 10 ); + read_len = 256; + p = buffer + 10; + } + } + + Found: + /* We have found the start of the binary data or the `/sfnts' token. */ + /* Now rewind and extract the frame corresponding to this PostScript */ + /* section. */ + + ps_len = offset - base_offset; + if ( FT_STREAM_SEEK( base_offset ) || + FT_FRAME_EXTRACT( ps_len, parser->postscript ) ) + goto Exit; + + parser->data_offset = offset; + parser->postscript_len = ps_len; + parser->root.base = parser->postscript; + parser->root.cursor = parser->postscript; + parser->root.limit = parser->root.cursor + ps_len; + parser->num_dict = -1; + + /* Finally, we check whether `StartData' or `/sfnts' was real -- */ + /* it could be in a comment or string. We also get the arguments */ + /* of `StartData' to find out whether the data is represented in */ + /* binary or hex format. */ + + arg1 = parser->root.cursor; + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + arg2 = parser->root.cursor; + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + + limit = parser->root.limit; + cur = parser->root.cursor; + + while ( cur < limit ) + { + if ( parser->root.error ) + { + error = parser->root.error; + goto Exit; + } + + if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 ) + { + if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 ) + parser->binary_length = ft_atol( (const char *)arg2 ); + + limit = parser->root.limit; + cur = parser->root.cursor; + goto Exit; + } + else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 ) + { + FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" )); + error = CID_Err_Unknown_File_Format; + goto Exit; + } + + cid_parser_skip_PS_token( parser ); + cid_parser_skip_spaces ( parser ); + arg1 = arg2; + arg2 = cur; + cur = parser->root.cursor; + } + + /* we haven't found the correct `StartData'; go back and continue */ + /* searching */ + FT_FRAME_RELEASE( parser->postscript ); + if ( !FT_STREAM_SEEK( offset ) ) + goto Again; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cid_parser_done( CID_Parser* parser ) + { + /* always free the private dictionary */ + if ( parser->postscript ) + { + FT_Stream stream = parser->stream; + + + FT_FRAME_RELEASE( parser->postscript ); + } + parser->root.funcs.done( &parser->root ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidparse.h b/alienblaster/project/jni/freetype/src/cid/cidparse.h new file mode 100644 index 000000000..ca37deab9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidparse.h @@ -0,0 +1,123 @@ +/***************************************************************************/ +/* */ +/* cidparse.h */ +/* */ +/* CID-keyed Type1 parser (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDPARSE_H__ +#define __CIDPARSE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_Parser */ + /* */ + /* <Description> */ + /* A CID_Parser is an object used to parse a Type 1 fonts very */ + /* quickly. */ + /* */ + /* <Fields> */ + /* root :: The root PS_ParserRec fields. */ + /* */ + /* stream :: The current input stream. */ + /* */ + /* postscript :: A pointer to the data to be parsed. */ + /* */ + /* postscript_len :: The length of the data to be parsed. */ + /* */ + /* data_offset :: The start position of the binary data (i.e., the */ + /* end of the data to be parsed. */ + /* */ + /* binary_length :: The length of the data after the `StartData' */ + /* command if the data format is hexadecimal. */ + /* */ + /* cid :: A structure which holds the information about */ + /* the current font. */ + /* */ + /* num_dict :: The number of font dictionaries. */ + /* */ + typedef struct CID_Parser_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* postscript; + FT_Long postscript_len; + + FT_ULong data_offset; + + FT_Long binary_length; + + CID_FaceInfo cid; + FT_Int num_dict; + + } CID_Parser; + + + FT_LOCAL( FT_Error ) + cid_parser_new( CID_Parser* parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( void ) + cid_parser_done( CID_Parser* parser ); + + + /*************************************************************************/ + /* */ + /* PARSING ROUTINES */ + /* */ + /*************************************************************************/ + +#define cid_parser_skip_spaces( p ) \ + (p)->root.funcs.skip_spaces( &(p)->root ) +#define cid_parser_skip_PS_token( p ) \ + (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define cid_parser_to_int( p ) (p)->root.funcs.to_int( &(p)->root ) +#define cid_parser_to_fixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) + +#define cid_parser_to_coord_array( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) +#define cid_parser_to_fixed_array( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define cid_parser_to_token( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) +#define cid_parser_to_token_array( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) + +#define cid_parser_load_field( p, f, o ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 ) +#define cid_parser_load_field_table( p, f, o ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 ) + + +FT_END_HEADER + +#endif /* __CIDPARSE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidriver.c b/alienblaster/project/jni/freetype/src/cid/cidriver.c new file mode 100644 index 000000000..3a2d22532 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidriver.c @@ -0,0 +1,240 @@ +/***************************************************************************/ +/* */ +/* cidriver.c */ +/* */ +/* CID driver interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "cidriver.h" +#include "cidgload.h" +#include FT_INTERNAL_DEBUG_H + +#include "ciderrs.h" + +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_CID_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ciddriver + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + cid_get_postscript_name( CID_Face face ) + { + const char* result = face->cid.cid_font_name; + + + if ( result && result[0] == '/' ) + result++; + + return result; + } + + + static const FT_Service_PsFontNameRec cid_service_ps_name = + { + (FT_PsName_GetFunc) cid_get_postscript_name + }; + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + cid_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((CID_Face)face)->cid.font_info; + + return CID_Err_Ok; + } + + static FT_Error + cid_ps_get_font_extra( FT_Face face, + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ((CID_Face)face)->font_extra; + + return CID_Err_Ok; + } + + static const FT_Service_PsInfoRec cid_service_ps_info = + { + (PS_GetFontInfoFunc) cid_ps_get_font_info, + (PS_GetFontExtraFunc) cid_ps_get_font_extra, + (PS_HasGlyphNamesFunc) NULL, /* unsupported with CID fonts */ + (PS_GetFontPrivateFunc)NULL /* unsupported */ + }; + + + /* + * CID INFO SERVICE + * + */ + static FT_Error + cid_get_ros( CID_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ) + { + CID_FaceInfo cid = &face->cid; + + + if ( registry ) + *registry = cid->registry; + + if ( ordering ) + *ordering = cid->ordering; + + if ( supplement ) + *supplement = cid->supplement; + + return CID_Err_Ok; + } + + + static FT_Error + cid_get_is_cid( CID_Face face, + FT_Bool *is_cid ) + { + FT_Error error = CID_Err_Ok; + FT_UNUSED( face ); + + + if ( is_cid ) + *is_cid = 1; /* cid driver is only used for CID keyed fonts */ + + return error; + } + + + static FT_Error + cid_get_cid_from_glyph_index( CID_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = CID_Err_Ok; + FT_UNUSED( face ); + + + if ( cid ) + *cid = glyph_index; /* identity mapping */ + + return error; + } + + + static const FT_Service_CIDRec cid_service_cid_info = + { + (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros, + (FT_CID_GetIsInternallyCIDKeyedFunc) cid_get_is_cid, + (FT_CID_GetCIDFromGlyphIndexFunc) cid_get_cid_from_glyph_index + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec cid_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info }, + { FT_SERVICE_ID_CID, &cid_service_cid_info }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + cid_get_interface( FT_Module module, + const char* cid_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( cid_services, cid_interface ); + } + + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec t1cid_driver_class = + { + /* first of all, the FT_Module_Class fields */ + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof( FT_DriverRec ), + "t1cid", /* module name */ + 0x10000L, /* version 1.0 of driver */ + 0x20000L, /* requires FreeType 2.0 */ + + 0, + + cid_driver_init, + cid_driver_done, + cid_get_interface + }, + + /* then the other font drivers fields */ + sizeof( CID_FaceRec ), + sizeof( CID_SizeRec ), + sizeof( CID_GlyphSlotRec ), + + cid_face_init, + cid_face_done, + + cid_size_init, + cid_size_done, + cid_slot_init, + cid_slot_done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + + cid_slot_load_glyph, + + 0, /* FT_Face_GetKerningFunc */ + 0, /* FT_Face_AttachFunc */ + + 0, /* FT_Face_GetAdvancesFunc */ + + cid_size_request, + 0 /* FT_Size_SelectFunc */ + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidriver.h b/alienblaster/project/jni/freetype/src/cid/cidriver.h new file mode 100644 index 000000000..c7f424bb3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidriver.h @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* cidriver.h */ +/* */ +/* High-level CID driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __CIDRIVER_H__ +#define __CIDRIVER_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_CALLBACK_TABLE + const FT_Driver_ClassRec t1cid_driver_class; + + +FT_END_HEADER + +#endif /* __CIDRIVER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/cidtoken.h b/alienblaster/project/jni/freetype/src/cid/cidtoken.h new file mode 100644 index 000000000..904cb09cf --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/cidtoken.h @@ -0,0 +1,112 @@ +/***************************************************************************/ +/* */ +/* cidtoken.h */ +/* */ +/* CID token definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CID_FaceInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_CID_INFO + + T1_FIELD_KEY ( "CIDFontName", cid_font_name, 0 ) + T1_FIELD_FIXED ( "CIDFontVersion", cid_version, 0 ) + T1_FIELD_NUM ( "CIDFontType", cid_font_type, 0 ) + T1_FIELD_STRING( "Registry", registry, 0 ) + T1_FIELD_STRING( "Ordering", ordering, 0 ) + T1_FIELD_NUM ( "Supplement", supplement, 0 ) + T1_FIELD_NUM ( "UIDBase", uid_base, 0 ) + T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset, 0 ) + T1_FIELD_NUM ( "FDBytes", fd_bytes, 0 ) + T1_FIELD_NUM ( "GDBytes", gd_bytes, 0 ) + T1_FIELD_NUM ( "CIDCount", cid_count, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, 0 ) + T1_FIELD_STRING( "Notice", notice, 0 ) + T1_FIELD_STRING( "FullName", full_name, 0 ) + T1_FIELD_STRING( "FamilyName", family_name, 0 ) + T1_FIELD_STRING( "Weight", weight, 0 ) + T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CID_FaceDictRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_NUM ( "PaintType", paint_type, 0 ) + T1_FIELD_NUM ( "FontType", font_type, 0 ) + T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset, 0 ) + T1_FIELD_NUM ( "SDBytes", sd_bytes, 0 ) + T1_FIELD_NUM ( "SubrCount", num_subrs, 0 ) + T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar, 0 ) + T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_PrivateRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_PRIVATE + + T1_FIELD_NUM ( "UniqueID", unique_id, 0 ) + T1_FIELD_NUM ( "lenIV", lenIV, 0 ) + T1_FIELD_NUM ( "LanguageGroup", language_group, 0 ) + T1_FIELD_NUM ( "password", password, 0 ) + + T1_FIELD_FIXED_1000( "BlueScale", blue_scale, 0 ) + T1_FIELD_NUM ( "BlueShift", blue_shift, 0 ) + T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, 0 ) + + T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, 0 ) + T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, 0 ) + T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, 0 ) + T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 ) + + T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, 0 ) + T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, 0 ) + T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, 0 ) + + T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, 0 ) + T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, 0 ) + + T1_FIELD_BOOL ( "ForceBold", force_bold, 0 ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, 0 ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/cid/module.mk b/alienblaster/project/jni/freetype/src/cid/module.mk new file mode 100644 index 000000000..ce30bfd7a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 CID module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE1CID_DRIVER + +define TYPE1CID_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)cid $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/cid/rules.mk b/alienblaster/project/jni/freetype/src/cid/rules.mk new file mode 100644 index 000000000..f36274461 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/cid/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 CID driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# CID driver directory +# +CID_DIR := $(SRC_DIR)/cid + + +CID_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CID_DIR)) + + +# CID driver sources (i.e., C files) +# +CID_DRV_SRC := $(CID_DIR)/cidparse.c \ + $(CID_DIR)/cidload.c \ + $(CID_DIR)/cidriver.c \ + $(CID_DIR)/cidgload.c \ + $(CID_DIR)/cidobjs.c + +# CID driver headers +# +CID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \ + $(CID_DIR)/cidtoken.h \ + $(CID_DIR)/ciderrs.h + + +# CID driver object(s) +# +# CID_DRV_OBJ_M is used during `multi' builds +# CID_DRV_OBJ_S is used during `single' builds +# +CID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O) +CID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O + +# CID driver source file for single build +# +CID_DRV_SRC_S := $(CID_DIR)/type1cid.c + + +# CID driver - single object +# +$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H) + $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S)) + + +# CID driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H) + $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(CID_DRV_OBJ_S) +DRV_OBJS_M += $(CID_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/gxvalid/Jamfile b/alienblaster/project/jni/freetype/src/gxvalid/Jamfile new file mode 100644 index 000000000..88049a625 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/Jamfile @@ -0,0 +1,33 @@ +# FreeType 2 src/gxvalid Jamfile +# +# Copyright 2005 by +# suzuki toshiya, Masatake YAMATO and Red Hat K.K. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) gxvalid ; + + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = gxvcommn gxvfeat gxvbsln gxvtrak gxvopbd gxvprop + gxvmort gxvmort0 gxvmort1 gxvmort2 gxvmort4 gxvmort5 + gxvmorx gxvmorx0 gxvmorx1 gxvmorx2 gxvmorx4 gxvmorx5 + gxvlcar gxvkern gxvmod gxvjust ; + } + else + { + _sources = gxvalid ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/gxvalid Jamfile diff --git a/alienblaster/project/jni/freetype/src/gxvalid/README b/alienblaster/project/jni/freetype/src/gxvalid/README new file mode 100644 index 000000000..28e535b0b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/README @@ -0,0 +1,532 @@ +gxvalid: TrueType GX validator +============================== + + +1. What is this +--------------- + + `gxvalid' is a module to validate TrueType GX tables: a collection of + additional tables in TrueType font which are used by `QuickDraw GX + Text', Apple Advanced Typography (AAT). In addition, gxvalid can + validates `kern' tables which have been extended for AAT. Like the + otvalid module, gxvalid uses Freetype 2's validator framework + (ftvalid). + + You can link gxvalid with your program; before running your own layout + engine, gxvalid validates a font file. As the result, you can remove + error-checking code from the layout engine. It is also possible to + use gxvalid as a stand-alone font validator; the `ftvalid' test + program included in the ft2demo bundle calls gxvalid internally. + A stand-alone font validator may be useful for font developers. + + This documents documents the following issues. + + - supported TrueType GX tables + - fundamental validation limitations + - permissive error handling of broken GX tables + - `kern' table issue. + + +2. Supported tables +------------------- + + The following GX tables are currently supported. + + bsln + feat + just + kern(*) + lcar + mort + morx + opbd + prop + trak + + The following GX tables are currently unsupported. + + cvar + fdsc + fmtx + fvar + gvar + Zapf + + The following GX tables won't be supported. + + acnt(**) + hsty(***) + + The following undocumented tables in TrueType fonts designed for Apple + platform aren't handled either. + + addg + CVTM + TPNM + umif + + + *) The `kern' validator handles both the classic and the new kern + formats; the former is supported on both Microsoft and Apple + platforms, while the latter is supported on Apple platforms. + + **) `acnt' tables are not supported by currently available Apple font + tools. + + ***) There is one more Apple extension, `hsty', but it is for + Newton-OS, not GX (Newton-OS is a platform by Apple, but it can + use sfnt- housed bitmap fonts only). Therefore, it should be + excluded from `Apple platform' in the context of TrueType. + gxvalid ignores it as Apple font tools do so. + + + We have checked 183 fonts bundled with MacOS 9.1, MacOS 9.2, MacOS + 10.0, MacOS X 10.1, MSIE for MacOS, and AppleWorks 6.0. In addition, + we have checked 67 Dynalab fonts (designed for MacOS) and 189 Ricoh + fonts (designed for Windows and MacOS dual platforms). The number of + fonts including TrueType GX tables are as follows. + + bsln: 76 + feat: 191 + just: 84 + kern: 59 + lcar: 4 + mort: 326 + morx: 19 + opbd: 4 + prop: 114 + trak: 16 + + Dynalab and Ricoh fonts don't have GX tables except of `feat' and + `mort'. + + +3. Fundamental validation limitations +------------------------------------- + + TrueType GX provides layout information to libraries for font + rasterizers and text layout. gxvalid can check whether the layout + data in a font is conformant to the TrueType GX format specified by + Apple. But gxvalid cannot check a how QuickDraw GX/AAT renderer uses + the stored information. + + 3-1. Validation of State Machine activity + ----------------------------------------- + + QuickDraw GX/AAT uses a `State Machine' to provide `stateful' layout + features, and TrueType GX stores the state transition diagram of + this `State Machine' in a `StateTable' data structure. While the + State Machine receives a series of glyph IDs, the State Machine + starts with `start of text' state, walks around various states and + generates various layout information to the renderer, and finally + reaches the `end of text' state. + + gxvalid can check essential errors like: + + - possibility of state transitions to undefined states + - existence of glyph IDs that the State Machine doesn't know how + to handle + - the State Machine cannot compute the layout information from + given diagram + + These errors can be checked within finite steps, and without the + State Machine itself, because these are `expression' errors of state + transition diagram. + + There is no limitation about how long the State Machine walks + around, so validation of the algorithm in the state transition + diagram requires infinite steps, even if we had a State Machine in + gxvalid. Therefore, the following errors and problems cannot be + checked. + + - existence of states which the State Machine never transits to + - the possibility that the State Machine never reaches `end of + text' + - the possibility of stack underflow/overflow in the State Machine + (in ligature and contextual glyph substitutions, the State + Machine can store 16 glyphs onto its stack) + + In addition, gxvalid doesn't check `temporary glyph IDs' used in the + chained State Machines (in `mort' and `morx' tables). If a layout + feature is implemented by a single State Machine, a glyph ID + converted by the State Machine is passed to the glyph renderer, thus + it should not point to an undefined glyph ID. But if a layout + feature is implemented by chained State Machines, a component State + Machine (if it is not the final one) is permitted to generate + undefined glyph IDs for temporary use, because it is handled by next + component State Machine and not by the glyph renderer. To validate + such temporary glyph IDs, gxvalid must stack all undefined glyph IDs + which can occur in the output of the previous State Machine and + search them in the `ClassTable' structure of the current State + Machine. It is too complex to list all possible glyph IDs from the + StateTable, especially from a ligature substitution table. + + 3-2. Validation of relationship between multiple layout features + ---------------------------------------------------------------- + + gxvalid does not validate the relationship between multiple layout + features at all. + + If multiple layout features are defined in TrueType GX tables, + possible interactions, overrides, and conflicts between layout + features are implicitly given in the font too. For example, there + are several predefined spacing control features: + + - Text Spacing (Proportional/Monospace/Half-width/Normal) + - Number Spacing (Monospaced-numbers/Proportional-numbers) + - Kana Spacing (Full-width/Proportional) + - Ideographic Spacing (Full-width/Proportional) + - CJK Roman Spacing (Half-width/Proportional/Default-roman + /Full-width-roman/Proportional) + + If all layout features are independently managed, we can activate + inconsistent typographic rules like `Text Spacing=Monospace' and + `Ideographic Spacing=Proportional' at the same time. + + The combinations of layout features is managed by a 32bit integer + (one bit each for selector setting), so we can define relationships + between up to 32 features, theoretically. But if one feature + setting affects another feature setting, we need typographic + priority rules to validate the relationship. Unfortunately, the + TrueType GX format specification does not give such information even + for predefined features. + + +4. Permissive error handling of broken GX tables +------------------------------------------------ + + When Apple's font rendering system finds an inconsistency, like a + specification violation or an unspecified value in a TrueType GX + table, it does not always return error. In most cases, the rendering + engine silently ignores such wrong values or even whole tables. In + fact, MacOS is shipped with fonts including broken GX/AAT tables, but + no harmful effects due to `officially broken' fonts are observed by + end-users. + + gxvalid is designed to continue the validation process as long as + possible. When gxvalid find wrong values, gxvalid warns it at least, + and takes a fallback procedure if possible. The fallback procedure + depends on the debug level. + + We used the following three tools to investigate Apple's error handling. + + - FontValidator (for MacOS 8.5 - 9.2) resource fork font + - ftxvalidator (for MacOS X 10.1 -) dfont or naked-sfnt + - ftxdumperfuser (for MacOS X 10.1 -) dfont or naked-sfnt + + However, all tests were done on a PowerPC based Macintosh; at present, + we have not checked those tools on a m68k-based Macintosh. + + In total, we checked 183 fonts bundled to MacOS 9.1, MacOS 9.2, MacOS + 10.0, MacOS X 10.1, MSIE for MacOS, and AppleWorks 6.0. These fonts + are distributed officially, but many broken GX/AAT tables were found + by Apple's font tools. In the following, we list typical violation of + the GX specification, in fonts officially distributed with those Apple + systems. + + 4-1. broken BinSrchHeader (19/183) + ---------------------------------- + + `BinSrchHeader' is a header of a data array for m68k platforms to + access memory efficiently. Although there are only two independent + parameters for real (`unitSize' and `nUnits'), BinSrchHeader has + three additional parameters which can be calculated from `unitSize' + and `nUnits', for fast setup. Apple font tools ignore them + silently, so gxvalid warns if it finds and inconsistency, and always + continues validation. The additional parameters are ignored + regardless of the consistency. + + 19 fonts include such inconsistencies; all breaks are in the + BinSrchHeader structure of the `kern' table. + + 4-2. too-short LookupTable (5/183) + ---------------------------------- + + LookupTable format 0 is a simple array to get a value from a given + GID (glyph ID); the index of this array is a GID too. Therefore, + the length of the array is expected to be same as the maximum GID + value defined in the `maxp' table, but there are some fonts whose + LookupTable format 0 is too short to cover all GIDs. FontValidator + ignores this error silently, ftxvalidator and ftxdumperfuser both + warn and continue. Similar problems are found in format 3 subtables + of `kern'. gxvalid warns always and abort if the validation level + is set to FT_VALIDATE_PARANOID. + + 5 fonts include too-short kern format 0 subtables. + 1 font includes too-short kern format 3 subtable. + + 4-3. broken LookupTable format 2 (1/183) + ---------------------------------------- + + LookupTable format 2, subformat 4 covers the GID space by a + collection of segments which are specified by `firstGlyph' and + `lastGlyph'. Some fonts store `firstGlyph' and `lastGlyph' in + reverse order, so the segment specification is broken. Apple font + tools ignore this error silently; a broken segment is ignored as if + it did not exist. gxvalid warns and normalize the segment at + FT_VALIDATE_DEFAULT, or ignore the segment at FT_VALIDATE_TIGHT, or + abort at FT_VALIDATE_PARANOID. + + 1 font includes broken LookupTable format 2, in the `just' table. + + *) It seems that all fonts manufactured by ITC for AppleWorks have + this error. + + 4-4. bad bracketing in glyph property (14/183) + ---------------------------------------------- + + GX/AAT defines a `bracketing' property of the glyphs in the `prop' + table, to control layout features of strings enclosed inside and + outside of brackets. Some fonts give inappropriate bracket + properties to glyphs. Apple font tools warn about this error; + gxvalid warns too and aborts at FT_VALIDATE_PARANOID. + + 14 fonts include wrong bracket properties. + + + 4-5. invalid feature number (117/183) + ------------------------------------- + + The GX/AAT extension can include 255 different layout features, but + popular layout features are predefined (see + http://developer.apple.com/fonts/Registry/index.html). Some fonts + include feature numbers which are incompatible with the predefined + feature registry. + + In our survey, there are 140 fonts including `feat' table. + + a) 67 fonts use a feature number which should not be used. + b) 117 fonts set the wrong feature range (nSetting). This is mostly + found in the `mort' and `morx' tables. + + Apple font tools give no warning, although they cannot recognize + what the feature is. At FT_VALIDATE_DEFAULT, gxvalid warns but + continues in both cases (a, b). At FT_VALIDATE_TIGHT, gxvalid warns + and aborts for (a), but continues for (b). At FT_VALIDATE_PARANOID, + gxvalid warns and aborts in both cases (a, b). + + 4-6. invalid prop version (10/183) + ---------------------------------- + + As most TrueType GX tables, the `prop' table must start with a 32bit + version identifier: 0x00010000, 0x00020000 or 0x00030000. But some + fonts store nonsense binary data instead. When Apple font tools + find them, they abort the processing immediately, and the data which + follows is unhandled. gxvalid does the same. + + 10 fonts include broken `prop' version. + + All of these fonts are classic TrueType fonts for the Japanese + script, manufactured by Apple. + + 4-7. unknown resource name (2/183) + ------------------------------------ + + NOTE: THIS IS NOT A TRUETYPE GX ERROR. + + If a TrueType font is stored in the resource fork or in dfont + format, the data must be tagged as `sfnt' in the resource fork index + to invoke TrueType font handler for the data. But the TrueType font + data in `Keyboard.dfont' is tagged as `kbd', and that in + `LastResort.dfont' is tagged as `lst'. Apple font tools can detect + that the data is in TrueType format and successfully validate them. + Maybe this is possible because they are known to be dfont. The + current implementation of the resource fork driver of FreeType + cannot do that, thus gxvalid cannot validate them. + + 2 fonts use an unknown tag for the TrueType font resource. + +5. `kern' table issues +---------------------- + + In common terminology of TrueType, `kern' is classified as a basic and + platform-independent table. But there are Apple extensions of `kern', + and there is an extension which requires a GX state machine for + contextual kerning. Therefore, gxvalid includes a special validator + for `kern' tables. Unfortunately, there is no exact algorithm to + check Apple's extension, so gxvalid includes a heuristic algorithm to + find the proper validation routines for all possible data formats, + including the data format for Microsoft. By calling + classic_kern_validate() instead of gxv_validate(), you can specify the + `kern' format explicitly. However, current FreeType2 uses Microsoft + `kern' format only, others are ignored (and should be handled in a + library one level higher than FreeType). + + 5-1. History + ------------ + + The original 16bit version of `kern' was designed by Apple in the + pre-GX era, and it was also approved by Microsoft. Afterwards, + Apple designed a new 32bit version of the `kern' table. According + to the documentation, the difference between the 16bit and 32bit + version is only the size of variables in the `kern' header. In the + following, we call the original 16bit version as `classic', and + 32bit version as `new'. + + 5-2. Versions and dialects which should be differentiated + --------------------------------------------------------- + + The `kern' table consists of a table header and several subtables. + The version number which identifies a `classic' or a `new' version + is explicitly written in the table header, but there are + undocumented differences between Microsoft's and Apple's formats. + It is called a `dialect' in the following. There are three cases + which should be handled: the new Apple-dialect, the classic + Apple-dialect, and the classic Microsoft-dialect. An analysis of + the formats and the auto detection algorithm of gxvalid is described + in the following. + + 5-2-1. Version detection: classic and new kern + ---------------------------------------------- + + According to Apple TrueType specification, there are only two + differences between the classic and the new: + + - The `kern' table header starts with the version number. + The classic version starts with 0x0000 (16bit), + the new version starts with 0x00010000 (32bit). + + - In the `kern' table header, the number of subtables follows + the version number. + In the classic version, it is stored as a 16bit value. + In the new version, it is stored as a 32bit value. + + From Apple font tool's output (DumpKERN is also tested in addition + to the three Apple font tools in above), there is another + undocumented difference. In the new version, the subtable header + includes a 16bit variable named `tupleIndex' which does not exist + in the classic version. + + The new version can store all subtable formats (0, 1, 2, and 3), + but the Apple TrueType specification does not mention the subtable + formats available in the classic version. + + 5-2-2. Available subtable formats in classic version + ---------------------------------------------------- + + Although the Apple TrueType specification recommends to use the + classic version in the case if the font is designed for both the + Apple and Microsoft platforms, it does not document the available + subtable formats in the classic version. + + According to the Microsoft TrueType specification, the subtable + format assured for Windows and OS/2 support is only subtable + format 0. The Microsoft TrueType specification also describes + subtable format 2, but does not mention which platforms support + it. Aubtable formats 1, 3, and higher are documented as reserved + for future use. Therefore, the classic version can store subtable + formats 0 and 2, at least. `ttfdump.exe', a font tool provided by + Microsoft, ignores the subtable format written in the subtable + header, and parses the table as if all subtables are in format 0. + + `kern' subtable format 1 uses a StateTable, so it cannot be + utilized without a GX State Machine. Therefore, it is reasonable + to assume that format 1 (and 3) were introduced after Apple had + introduced GX and moved to the new 32bit version. + + 5-2-3. Apple and Microsoft dialects + ----------------------------------- + + The `kern' subtable has a 16bit `coverage' field to describe + kerning attributes, but bit interpretations by Apple and Microsoft + are different: For example, Apple uses bits 0-7 to identify the + subtable, while Microsoft uses bits 8-15. + + In addition, due to the output of DumpKERN and FontValidator, + Apple's bit interpretations of coverage in classic and new version + are incompatible also. In summary, there are three dialects: + classic Apple dialect, classic Microsoft dialect, and new Apple + dialect. The classic Microsoft dialect and the new Apple dialect + are documented by each vendors' TrueType font specification, but + the documentation for classic Apple dialect is not available. + + For example, in the new Apple dialect, bit 15 is documented as + `set to 1 if the kerning is vertical'. On the other hand, in + classic Microsoft dialect, bit 1 is documented as `set to 1 if the + kerning is horizontal'. From the outputs of DumpKERN and + FontValidator, classic Apple dialect recognizes 15 as `set to 1 + when the kerning is horizontal'. From the results of similar + experiments, classic Apple dialect seems to be the Endian reverse + of the classic Microsoft dialect. + + As a conclusion it must be noted that no font tool can identify + classic Apple dialect or classic Microsoft dialect automatically. + + 5-2-4. gxvalid auto dialect detection algorithm + ----------------------------------------------- + + The first 16 bits of the `kern' table are enough to identify the + version: + + - if the first 16 bits are 0x0000, the `kern' table is in + classic Apple dialect or classic Microsoft dialect + - if the first 16 bits are 0x0001, and next 16 bits are 0x0000, + the kern table is in new Apple dialect. + + If the `kern' table is a classic one, the 16bit `coverage' field + is checked next. Firstly, the coverage bits are decoded for the + classic Apple dialect using the following bit masks (this is based + on DumpKERN output): + + 0x8000: 1=horizontal, 0=vertical + 0x4000: not used + 0x2000: 1=cross-stream, 0=normal + 0x1FF0: reserved + 0x000F: subtable format + + If any of reserved bits are set or the subtable bits is + interpreted as format 1 or 3, we take it as `impossible in classic + Apple dialect' and retry, using the classic Microsoft dialect. + + The most popular coverage in new Apple-dialect: 0x8000, + The most popular coverage in classic Apple-dialect: 0x0000, + The most popular coverage in classic Microsoft dialect: 0x0001. + + 5-3. Tested fonts + ----------------- + + We checked 59 fonts bundled with MacOS and 38 fonts bundled with + Windows, where all font include a `kern' table. + + - fonts bundled with MacOS + * new Apple dialect + format 0: 18 + format 2: 1 + format 3: 1 + * classic Apple dialect + format 0: 14 + * classic Microsoft dialect + format 0: 15 + + - fonts bundled with Windows + * classic Microsoft dialect + format 0: 38 + + It looks strange that classic Microsoft-dialect fonts are bundled to + MacOS: they come from MSIE for MacOS, except of MarkerFelt.dfont. + + + ACKNOWLEDGEMENT + --------------- + + Some parts of gxvalid are derived from both the `gxlayout' module and + the `otvalid' module. Development of gxlayout was supported by the + Information-technology Promotion Agency(IPA), Japan. + + The detailed analysis of undefined glyph ID utilization in `mort' and + `morx' tables is provided by George Williams. + +------------------------------------------------------------------------ + +Copyright 2004, 2005, 2007 by +suzuki toshiya, Masatake YAMATO, Red hat K.K., +David Turner, Robert Wilhelm, and Werner Lemberg. + +This file is part of the FreeType project, and may only be used, +modified, and distributed under the terms of the FreeType project +license, LICENSE.TXT. By continuing to use, modify, or distribute this +file you indicate that you have read the license and understand and +accept it fully. + + +--- end of README --- diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvalid.h b/alienblaster/project/jni/freetype/src/gxvalid/gxvalid.h new file mode 100644 index 000000000..27be9ecca --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvalid.h @@ -0,0 +1,107 @@ +/***************************************************************************/ +/* */ +/* gxvalid.h */ +/* */ +/* TrueTyeeGX/AAT table validation (specification only). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVALID_H__ +#define __GXVALID_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#include "gxverror.h" /* must come before FT_INTERNAL_VALIDATE_H */ + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + gxv_feat_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + + FT_LOCAL( void ) + gxv_bsln_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + + FT_LOCAL( void ) + gxv_trak_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_just_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_kern_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_kern_validate_classic( FT_Bytes table, + FT_Face face, + FT_Int dialect_flags, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_opbd_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_prop_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + FT_LOCAL( void ) + gxv_lcar_validate( FT_Bytes table, + FT_Face face, + FT_Validator valid ); + + +FT_END_HEADER + + +#endif /* __GXVALID_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvbsln.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvbsln.c new file mode 100644 index 000000000..3d1003156 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvbsln.c @@ -0,0 +1,333 @@ +/***************************************************************************/ +/* */ +/* gxvbsln.c */ +/* */ +/* TrueTypeGX/AAT bsln table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvbsln + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_BSLN_VALUE_COUNT 32 +#define GXV_BSLN_VALUE_EMPTY 0xFFFFU + + + typedef struct GXV_bsln_DataRec_ + { + FT_Bytes ctlPoints_p; + FT_UShort defaultBaseline; + + } GXV_bsln_DataRec, *GXV_bsln_Data; + + +#define GXV_BSLN_DATA( field ) GXV_TABLE_DATA( bsln, field ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_bsln_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + FT_UShort v = value_p->u; + FT_UShort* ctlPoints; + + FT_UNUSED( glyph ); + + + GXV_NAME_ENTER( "lookup value" ); + + if ( v >= GXV_BSLN_VALUE_COUNT ) + FT_INVALID_DATA; + + ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p ); + if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY ) + FT_INVALID_DATA; + + GXV_EXIT; + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + ... | + | + 16bit value array | + +===============+ | + | value | <-------+ + ... + */ + + static GXV_LookupValueDesc + gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range ? */ + offset = (FT_UShort)( base_value_p->u + + ( relative_gindex * sizeof ( FT_UShort ) ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + GXV_LIMIT_CHECK( 2 ); + + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + static void + gxv_bsln_parts_fmt0_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 0" ); + + /* deltas */ + GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT ); + + valid->table_data = NULL; /* No ctlPoints here. */ + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt1_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 1" ); + + /* deltas */ + gxv_bsln_parts_fmt0_validate( p, limit, valid ); + + /* mappingData */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_bsln_LookupValue_validate; + valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; + gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT, + limit, + valid ); + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt2_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = tables; + + FT_UShort stdGlyph; + FT_UShort ctlPoint; + FT_Int i; + + FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline ); + + + GXV_NAME_ENTER( "parts format 2" ); + + GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) ); + + /* stdGlyph */ + stdGlyph = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph )); + + gxv_glyphid_validate( stdGlyph, valid ); + + /* Record the position of ctlPoints */ + GXV_BSLN_DATA( ctlPoints_p ) = p; + + /* ctlPoints */ + for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ ) + { + ctlPoint = FT_NEXT_USHORT( p ); + if ( ctlPoint == GXV_BSLN_VALUE_EMPTY ) + { + if ( i == defaultBaseline ) + FT_INVALID_DATA; + } + else + gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid ); + } + + GXV_EXIT; + } + + + static void + gxv_bsln_parts_fmt3_validate( FT_Bytes tables, + FT_Bytes limit, + GXV_Validator valid) + { + FT_Bytes p = tables; + + + GXV_NAME_ENTER( "parts format 3" ); + + /* stdGlyph + ctlPoints */ + gxv_bsln_parts_fmt2_validate( p, limit, valid ); + + /* mappingData */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_bsln_LookupValue_validate; + valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit; + gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ), + limit, + valid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** bsln TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_bsln_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_bsln_DataRec bslnrec; + GXV_bsln_Data bsln = &bslnrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong version; + FT_UShort format; + FT_UShort defaultBaseline; + + GXV_Validate_Func fmt_funcs_table [] = + { + gxv_bsln_parts_fmt0_validate, + gxv_bsln_parts_fmt1_validate, + gxv_bsln_parts_fmt2_validate, + gxv_bsln_parts_fmt3_validate, + }; + + + valid->root = ftvalid; + valid->table_data = bsln; + valid->face = face; + + FT_TRACE3(( "validating `bsln' table\n" )); + GXV_INIT; + + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + defaultBaseline = FT_NEXT_USHORT( p ); + + /* only version 1.0 is defined (1996) */ + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* only format 1, 2, 3 are defined (1996) */ + GXV_TRACE(( " (format = %d)\n", format )); + if ( format > 3 ) + FT_INVALID_FORMAT; + + if ( defaultBaseline > 31 ) + FT_INVALID_FORMAT; + + bsln->defaultBaseline = defaultBaseline; + + fmt_funcs_table[format]( p, limit, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc + (do not change this comment) */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvcommn.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvcommn.c new file mode 100644 index 000000000..de7ce6fde --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvcommn.c @@ -0,0 +1,1759 @@ +/***************************************************************************/ +/* */ +/* gxvcommn.c */ +/* */ +/* TrueTypeGX/AAT common tables validation (body). */ +/* */ +/* Copyright 2004, 2005, 2009 */ +/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvcommon + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 16bit offset sorter *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static int + gxv_compare_ushort_offset( FT_UShort* a, + FT_UShort* b ) + { + if ( *a < *b ) + return -1; + else if ( *a > *b ) + return 1; + else + return 0; + } + + + FT_LOCAL_DEF( void ) + gxv_set_length_by_ushort_offset( FT_UShort* offset, + FT_UShort** length, + FT_UShort* buff, + FT_UInt nmemb, + FT_UShort limit, + GXV_Validator valid ) + { + FT_UInt i; + + + for ( i = 0; i < nmemb; i++ ) + *(length[i]) = 0; + + for ( i = 0; i < nmemb; i++ ) + buff[i] = offset[i]; + buff[nmemb] = limit; + + ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_UShort ), + ( int(*)(const void*, const void*) )gxv_compare_ushort_offset ); + + if ( buff[nmemb] > limit ) + FT_INVALID_OFFSET; + + for ( i = 0; i < nmemb; i++ ) + { + FT_UInt j; + + + for ( j = 0; j < nmemb; j++ ) + if ( buff[j] == offset[i] ) + break; + + if ( j == nmemb ) + FT_INVALID_OFFSET; + + *(length[i]) = (FT_UShort)( buff[j + 1] - buff[j] ); + + if ( 0 != offset[i] && 0 == *(length[i]) ) + FT_INVALID_OFFSET; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 32bit offset sorter *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static int + gxv_compare_ulong_offset( FT_ULong* a, + FT_ULong* b ) + { + if ( *a < *b ) + return -1; + else if ( *a > *b ) + return 1; + else + return 0; + } + + + FT_LOCAL_DEF( void ) + gxv_set_length_by_ulong_offset( FT_ULong* offset, + FT_ULong** length, + FT_ULong* buff, + FT_UInt nmemb, + FT_ULong limit, + GXV_Validator valid) + { + FT_UInt i; + + + for ( i = 0; i < nmemb; i++ ) + *(length[i]) = 0; + + for ( i = 0; i < nmemb; i++ ) + buff[i] = offset[i]; + buff[nmemb] = limit; + + ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_ULong ), + ( int(*)(const void*, const void*) )gxv_compare_ulong_offset ); + + if ( buff[nmemb] > limit ) + FT_INVALID_OFFSET; + + for ( i = 0; i < nmemb; i++ ) + { + FT_UInt j; + + + for ( j = 0; j < nmemb; j++ ) + if ( buff[j] == offset[i] ) + break; + + if ( j == nmemb ) + FT_INVALID_OFFSET; + + *(length[i]) = buff[j + 1] - buff[j]; + + if ( 0 != offset[i] && 0 == *(length[i]) ) + FT_INVALID_OFFSET; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** scan value array and get min & max *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + gxv_array_getlimits_byte( FT_Bytes table, + FT_Bytes limit, + FT_Byte* min, + FT_Byte* max, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + *min = 0xFF; + *max = 0x00; + + while ( p < limit ) + { + FT_Byte val; + + + GXV_LIMIT_CHECK( 1 ); + val = FT_NEXT_BYTE( p ); + + *min = (FT_Byte)FT_MIN( *min, val ); + *max = (FT_Byte)FT_MAX( *max, val ); + } + + valid->subtable_length = p - table; + } + + + FT_LOCAL_DEF( void ) + gxv_array_getlimits_ushort( FT_Bytes table, + FT_Bytes limit, + FT_UShort* min, + FT_UShort* max, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + *min = 0xFFFFU; + *max = 0x0000; + + while ( p < limit ) + { + FT_UShort val; + + + GXV_LIMIT_CHECK( 2 ); + val = FT_NEXT_USHORT( p ); + + *min = (FT_Byte)FT_MIN( *min, val ); + *max = (FT_Byte)FT_MAX( *max, val ); + } + + valid->subtable_length = p - table; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BINSEARCHHEADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_BinSrchHeader_ + { + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort searchRange; + FT_UShort entrySelector; + FT_UShort rangeShift; + + } GXV_BinSrchHeader; + + + static void + gxv_BinSrchHeader_check_consistency( GXV_BinSrchHeader* binSrchHeader, + GXV_Validator valid ) + { + FT_UShort searchRange; + FT_UShort entrySelector; + FT_UShort rangeShift; + + + if ( binSrchHeader->unitSize == 0 ) + FT_INVALID_DATA; + + if ( binSrchHeader->nUnits == 0 ) + { + if ( binSrchHeader->searchRange == 0 && + binSrchHeader->entrySelector == 0 && + binSrchHeader->rangeShift == 0 ) + return; + else + FT_INVALID_DATA; + } + + for ( searchRange = 1, entrySelector = 1; + ( searchRange * 2 ) <= binSrchHeader->nUnits && + searchRange < 0x8000U; + searchRange *= 2, entrySelector++ ) + ; + + entrySelector--; + searchRange = (FT_UShort)( searchRange * binSrchHeader->unitSize ); + rangeShift = (FT_UShort)( binSrchHeader->nUnits * binSrchHeader->unitSize + - searchRange ); + + if ( searchRange != binSrchHeader->searchRange || + entrySelector != binSrchHeader->entrySelector || + rangeShift != binSrchHeader->rangeShift ) + { + GXV_TRACE(( "Inconsistency found in BinSrchHeader\n" )); + GXV_TRACE(( "originally: unitSize=%d, nUnits=%d, " + "searchRange=%d, entrySelector=%d, " + "rangeShift=%d\n", + binSrchHeader->unitSize, binSrchHeader->nUnits, + binSrchHeader->searchRange, binSrchHeader->entrySelector, + binSrchHeader->rangeShift )); + GXV_TRACE(( "calculated: unitSize=%d, nUnits=%d, " + "searchRange=%d, entrySelector=%d, " + "rangeShift=%d\n", + binSrchHeader->unitSize, binSrchHeader->nUnits, + searchRange, entrySelector, rangeShift )); + + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + } + + + /* + * parser & validator of BinSrchHeader + * which is used in LookupTable format 2, 4, 6. + * + * Essential parameters (unitSize, nUnits) are returned by + * given pointer, others (searchRange, entrySelector, rangeShift) + * can be calculated by essential parameters, so they are just + * validated and discarded. + * + * However, wrong values in searchRange, entrySelector, rangeShift + * won't cause fatal errors, because these parameters might be + * only used in old m68k font driver in MacOS. + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + + FT_LOCAL_DEF( void ) + gxv_BinSrchHeader_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort* unitSize_p, + FT_UShort* nUnits_p, + GXV_Validator valid ) + { + FT_Bytes p = table; + GXV_BinSrchHeader binSrchHeader; + + + GXV_NAME_ENTER( "BinSrchHeader validate" ); + + if ( *unitSize_p == 0 ) + { + GXV_LIMIT_CHECK( 2 ); + binSrchHeader.unitSize = FT_NEXT_USHORT( p ); + } + else + binSrchHeader.unitSize = *unitSize_p; + + if ( *nUnits_p == 0 ) + { + GXV_LIMIT_CHECK( 2 ); + binSrchHeader.nUnits = FT_NEXT_USHORT( p ); + } + else + binSrchHeader.nUnits = *nUnits_p; + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + binSrchHeader.searchRange = FT_NEXT_USHORT( p ); + binSrchHeader.entrySelector = FT_NEXT_USHORT( p ); + binSrchHeader.rangeShift = FT_NEXT_USHORT( p ); + GXV_TRACE(( "nUnits %d\n", binSrchHeader.nUnits )); + + gxv_BinSrchHeader_check_consistency( &binSrchHeader, valid ); + + if ( *unitSize_p == 0 ) + *unitSize_p = binSrchHeader.unitSize; + + if ( *nUnits_p == 0 ) + *nUnits_p = binSrchHeader.nUnits; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUP TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_LOOKUP_VALUE_LOAD( P, SIGNSPEC ) \ + ( P += 2, gxv_lookup_value_load( P - 2, SIGNSPEC ) ) + + static GXV_LookupValueDesc + gxv_lookup_value_load( FT_Bytes p, + int signspec ) + { + GXV_LookupValueDesc v; + + + if ( signspec == GXV_LOOKUPVALUE_UNSIGNED ) + v.u = FT_NEXT_USHORT( p ); + else + v.s = FT_NEXT_SHORT( p ); + + return v; + } + + +#define GXV_UNITSIZE_VALIDATE( FORMAT, UNITSIZE, NUNITS, CORRECTSIZE ) \ + FT_BEGIN_STMNT \ + if ( UNITSIZE != CORRECTSIZE ) \ + { \ + FT_ERROR(( "unitSize=%d differs from" \ + " expected unitSize=%d" \ + " in LookupTable %s\n", \ + UNITSIZE, CORRECTSIZE, FORMAT )); \ + if ( UNITSIZE != 0 && NUNITS != 0 ) \ + { \ + FT_ERROR(( " cannot validate anymore\n" )); \ + FT_INVALID_FORMAT; \ + } \ + else \ + FT_ERROR(( " forcibly continues\n" )); \ + } \ + FT_END_STMNT + + + /* ================= Simple Array Format 0 Lookup Table ================ */ + static void + gxv_LookupTable_fmt0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 0" ); + + GXV_LIMIT_CHECK( 2 * valid->face->num_glyphs ); + + for ( i = 0; i < valid->face->num_glyphs; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + if ( p + 2 >= limit ) /* some fonts have too-short fmt0 array */ + { + GXV_TRACE(( "too short, glyphs %d - %d are missing\n", + i, valid->face->num_glyphs )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + break; + } + + value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); + valid->lookupval_func( i, &value, valid ); + } + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /* ================= Segment Single Format 2 Loolup Table ============== */ + /* + * Apple spec says: + * + * To guarantee that a binary search terminates, you must include one or + * more special `end of search table' values at the end of the data to + * be searched. The number of termination values that need to be + * included is table-specific. The value that indicates binary search + * termination is 0xFFFF. + * + * The problem is that nUnits does not include this end-marker. It's + * quite difficult to discriminate whether the following 0xFFFF comes from + * the end-marker or some next data. + * + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + static void + gxv_LookupTable_fmt2_skip_endmarkers( FT_Bytes table, + FT_UShort unitSize, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + while ( ( p + 4 ) < valid->root->limit ) + { + if ( p[0] != 0xFF || p[1] != 0xFF || /* lastGlyph */ + p[2] != 0xFF || p[3] != 0xFF ) /* firstGlyph */ + break; + p += unitSize; + } + + valid->subtable_length = p - table; + } + + + static void + gxv_LookupTable_fmt2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort gid; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort unit; + FT_UShort lastGlyph; + FT_UShort firstGlyph; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 2" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); + p += valid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format2", unitSize, nUnits, 6 ); + + for ( unit = 0, gid = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + lastGlyph = FT_NEXT_USHORT( p ); + firstGlyph = FT_NEXT_USHORT( p ); + value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); + + gxv_glyphid_validate( firstGlyph, valid ); + gxv_glyphid_validate( lastGlyph, valid ); + + if ( lastGlyph < gid ) + { + GXV_TRACE(( "reverse ordered segment specification:" + " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n", + unit, lastGlyph, unit - 1 , gid )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + + if ( lastGlyph < firstGlyph ) + { + GXV_TRACE(( "reverse ordered range specification at unit %d:", + " lastGlyph %d < firstGlyph %d ", + unit, lastGlyph, firstGlyph )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + + if ( valid->root->level == FT_VALIDATE_TIGHT ) + continue; /* ftxvalidator silently skips such an entry */ + + FT_TRACE4(( "continuing with exchanged values\n" )); + gid = firstGlyph; + firstGlyph = lastGlyph; + lastGlyph = gid; + } + + for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) + valid->lookupval_func( gid, &value, valid ); + } + + gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /* ================= Segment Array Format 4 Lookup Table =============== */ + static void + gxv_LookupTable_fmt4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort unit; + FT_UShort gid; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort lastGlyph; + FT_UShort firstGlyph; + GXV_LookupValueDesc base_value; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 4" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); + p += valid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format4", unitSize, nUnits, 6 ); + + for ( unit = 0, gid = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 ); + lastGlyph = FT_NEXT_USHORT( p ); + firstGlyph = FT_NEXT_USHORT( p ); + + gxv_glyphid_validate( firstGlyph, valid ); + gxv_glyphid_validate( lastGlyph, valid ); + + if ( lastGlyph < gid ) + { + GXV_TRACE(( "reverse ordered segment specification:" + " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n", + unit, lastGlyph, unit - 1 , gid )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + + if ( lastGlyph < firstGlyph ) + { + GXV_TRACE(( "reverse ordered range specification at unit %d:", + " lastGlyph %d < firstGlyph %d ", + unit, lastGlyph, firstGlyph )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + + if ( valid->root->level == FT_VALIDATE_TIGHT ) + continue; /* ftxvalidator silently skips such an entry */ + + FT_TRACE4(( "continuing with exchanged values\n" )); + gid = firstGlyph; + firstGlyph = lastGlyph; + lastGlyph = gid; + } + + GXV_LIMIT_CHECK( 2 ); + base_value = GXV_LOOKUP_VALUE_LOAD( p, GXV_LOOKUPVALUE_UNSIGNED ); + + for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) + { + value = valid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ), + &base_value, + limit, + valid ); + + valid->lookupval_func( gid, &value, valid ); + } + } + + gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /* ================= Segment Table Format 6 Lookup Table =============== */ + static void + gxv_LookupTable_fmt6_skip_endmarkers( FT_Bytes table, + FT_UShort unitSize, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + while ( p < valid->root->limit ) + { + if ( p[0] != 0xFF || p[1] != 0xFF ) + break; + p += unitSize; + } + + valid->subtable_length = p - table; + } + + + static void + gxv_LookupTable_fmt6_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort unit; + FT_UShort prev_glyph; + + FT_UShort unitSize; + FT_UShort nUnits; + FT_UShort glyph; + GXV_LookupValueDesc value; + + + GXV_NAME_ENTER( "LookupTable format 6" ); + + unitSize = nUnits = 0; + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid ); + p += valid->subtable_length; + + GXV_UNITSIZE_VALIDATE( "format6", unitSize, nUnits, 4 ); + + for ( unit = 0, prev_glyph = 0; unit < nUnits; unit++ ) + { + GXV_LIMIT_CHECK( 2 + 2 ); + glyph = FT_NEXT_USHORT( p ); + value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); + + if ( gxv_glyphid_validate( glyph, valid ) ) + GXV_TRACE(( " endmarker found within defined range" + " (entry %d < nUnits=%d)\n", + unit, nUnits )); + + if ( prev_glyph > glyph ) + { + GXV_TRACE(( "current gid 0x%04x < previous gid 0x%04x\n", + glyph, prev_glyph )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + prev_glyph = glyph; + + valid->lookupval_func( glyph, &value, valid ); + } + + gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + /* ================= Trimmed Array Format 8 Lookup Table =============== */ + static void + gxv_LookupTable_fmt8_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_LookupValueDesc value; + FT_UShort firstGlyph; + FT_UShort glyphCount; + + + GXV_NAME_ENTER( "LookupTable format 8" ); + + /* firstGlyph + glyphCount */ + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + glyphCount = FT_NEXT_USHORT( p ); + + gxv_glyphid_validate( firstGlyph, valid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), valid ); + + /* valueArray */ + for ( i = 0; i < glyphCount; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); + valid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, valid ); + } + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_LookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort format; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_LookupTable_fmt0_validate, /* 0 */ + NULL, /* 1 */ + gxv_LookupTable_fmt2_validate, /* 2 */ + NULL, /* 3 */ + gxv_LookupTable_fmt4_validate, /* 4 */ + NULL, /* 5 */ + gxv_LookupTable_fmt6_validate, /* 6 */ + NULL, /* 7 */ + gxv_LookupTable_fmt8_validate, /* 8 */ + }; + + GXV_Validate_Func func; + + + GXV_NAME_ENTER( "LookupTable" ); + + /* lookuptbl_head may be used in fmt4 transit function. */ + valid->lookuptbl_head = table; + + /* format */ + GXV_LIMIT_CHECK( 2 ); + format = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (format %d)\n", format )); + + if ( format > 8 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[format]; + if ( func == NULL ) + FT_INVALID_FORMAT; + + func( p, limit, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Glyph ID *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Int ) + gxv_glyphid_validate( FT_UShort gid, + GXV_Validator valid ) + { + FT_Face face; + + + if ( gid == 0xFFFFU ) + { + GXV_EXIT; + return 1; + } + + face = valid->face; + if ( face->num_glyphs < gid ) + { + GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %d < %d\n", + face->num_glyphs, gid )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CONTROL POINT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_ctlPoint_validate( FT_UShort gid, + FT_Short ctl_point, + GXV_Validator valid ) + { + FT_Face face; + FT_Error error; + + FT_GlyphSlot glyph; + FT_Outline outline; + short n_points; + + + face = valid->face; + + error = FT_Load_Glyph( face, + gid, + FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM ); + if ( error ) + FT_INVALID_GLYPH_ID; + + glyph = face->glyph; + outline = glyph->outline; + n_points = outline.n_points; + + + if ( !( ctl_point < n_points ) ) + FT_INVALID_DATA; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SFNT NAME *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_sfntName_validate( FT_UShort name_index, + FT_UShort min_index, + FT_UShort max_index, + GXV_Validator valid ) + { + FT_SfntName name; + FT_UInt i; + FT_UInt nnames; + + + GXV_NAME_ENTER( "sfntName" ); + + if ( name_index < min_index || max_index < name_index ) + FT_INVALID_FORMAT; + + nnames = FT_Get_Sfnt_Name_Count( valid->face ); + for ( i = 0; i < nnames; i++ ) + { + if ( FT_Get_Sfnt_Name( valid->face, i, &name ) != FT_Err_Ok ) + continue ; + + if ( name.name_id == name_index ) + goto Out; + } + + GXV_TRACE(( " nameIndex = %d (UNTITLED)\n", name_index )); + FT_INVALID_DATA; + goto Exit; /* make compiler happy */ + + Out: + FT_TRACE1(( " nameIndex = %d (", name_index )); + GXV_TRACE_HEXDUMP_SFNTNAME( name ); + FT_TRACE1(( ")\n" )); + + Exit: + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STATE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* -------------------------- Class Table --------------------------- */ + + /* + * highestClass specifies how many classes are defined in this + * Class Subtable. Apple spec does not mention whether undefined + * holes in the class (e.g.: 0-3 are predefined, 4 is unused, 5 is used) + * are permitted. At present, holes in a defined class are not checked. + * -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp> + */ + + static void + gxv_ClassTable_validate( FT_Bytes table, + FT_UShort* length_p, + FT_UShort stateSize, + FT_Byte* maxClassID_p, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort firstGlyph; + FT_UShort nGlyphs; + + + GXV_NAME_ENTER( "ClassTable" ); + + *maxClassID_p = 3; /* Classes 0, 2, and 3 are predefined */ + + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + nGlyphs = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (firstGlyph = %d, nGlyphs = %d)\n", firstGlyph, nGlyphs )); + + if ( !nGlyphs ) + goto Out; + + gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), valid ); + + { + FT_Byte nGlyphInClass[256]; + FT_Byte classID; + FT_UShort i; + + + ft_memset( nGlyphInClass, 0, 256 ); + + + for ( i = 0; i < nGlyphs; i++ ) + { + GXV_LIMIT_CHECK( 1 ); + classID = FT_NEXT_BYTE( p ); + switch ( classID ) + { + /* following classes should not appear in class array */ + case 0: /* end of text */ + case 2: /* out of bounds */ + case 3: /* end of line */ + FT_INVALID_DATA; + break; + + case 1: /* out of bounds */ + default: /* user-defined: 4 - ( stateSize - 1 ) */ + if ( classID >= stateSize ) + FT_INVALID_DATA; /* assign glyph to undefined state */ + + nGlyphInClass[classID]++; + break; + } + } + *length_p = (FT_UShort)( p - table ); + + /* scan max ClassID in use */ + for ( i = 0; i < stateSize; i++ ) + if ( ( 3 < i ) && ( nGlyphInClass[i] > 0 ) ) + *maxClassID_p = (FT_Byte)i; /* XXX: Check Range? */ + } + + Out: + GXV_TRACE(( "Declared stateSize=0x%02x, Used maxClassID=0x%02x\n", + stateSize, *maxClassID_p )); + GXV_EXIT; + } + + + /* --------------------------- State Array ----------------------------- */ + + static void + gxv_StateArray_validate( FT_Bytes table, + FT_UShort* length_p, + FT_Byte maxClassID, + FT_UShort stateSize, + FT_Byte* maxState_p, + FT_Byte* maxEntry_p, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_Byte clazz; + FT_Byte entry; + + FT_UNUSED( stateSize ); /* for the non-debugging case */ + + + GXV_NAME_ENTER( "StateArray" ); + + GXV_TRACE(( "parse %d bytes by stateSize=%d maxClassID=%d\n", + (int)(*length_p), stateSize, (int)(maxClassID) )); + + /* + * 2 states are predefined and must be described in StateArray: + * state 0 (start of text), 1 (start of line) + */ + GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 ); + + *maxState_p = 0; + *maxEntry_p = 0; + + /* read if enough to read another state */ + while ( p + ( 1 + maxClassID ) <= limit ) + { + (*maxState_p)++; + for ( clazz = 0; clazz <= maxClassID; clazz++ ) + { + entry = FT_NEXT_BYTE( p ); + *maxEntry_p = (FT_Byte)FT_MAX( *maxEntry_p, entry ); + } + } + GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", + *maxState_p, *maxEntry_p )); + + *length_p = (FT_UShort)( p - table ); + + GXV_EXIT; + } + + + /* --------------------------- Entry Table ----------------------------- */ + + static void + gxv_EntryTable_validate( FT_Bytes table, + FT_UShort* length_p, + FT_Byte maxEntry, + FT_UShort stateArray, + FT_UShort stateArray_length, + FT_Byte maxClassID, + FT_Bytes statetable_table, + FT_Bytes statetable_limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_Byte entry; + FT_Byte state; + FT_Int entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( statetable ); + + GXV_XStateTable_GlyphOffsetDesc glyphOffset; + + + GXV_NAME_ENTER( "EntryTable" ); + + GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize )); + + if ( ( maxEntry + 1 ) * entrySize > *length_p ) + { + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_TOO_SHORT; + + /* ftxvalidator and FontValidator both warn and continue */ + maxEntry = (FT_Byte)( *length_p / entrySize - 1 ); + GXV_TRACE(( "too large maxEntry, shrinking to %d fit EntryTable length\n", + maxEntry )); + } + + for ( entry = 0; entry <= maxEntry; entry++ ) + { + FT_UShort newState; + FT_UShort flags; + + + GXV_LIMIT_CHECK( 2 + 2 ); + newState = FT_NEXT_USHORT( p ); + flags = FT_NEXT_USHORT( p ); + + + if ( newState < stateArray || + stateArray + stateArray_length < newState ) + { + GXV_TRACE(( " newState offset 0x%04x is out of stateArray\n", + newState )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + continue; + } + + if ( 0 != ( ( newState - stateArray ) % ( 1 + maxClassID ) ) ) + { + GXV_TRACE(( " newState offset 0x%04x is not aligned to %d-classes\n", + newState, 1 + maxClassID )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + continue; + } + + state = (FT_Byte)( ( newState - stateArray ) / ( 1 + maxClassID ) ); + + switch ( GXV_GLYPHOFFSET_FMT( statetable ) ) + { + case GXV_GLYPHOFFSET_NONE: + glyphOffset.uc = 0; /* make compiler happy */ + break; + + case GXV_GLYPHOFFSET_UCHAR: + glyphOffset.uc = FT_NEXT_BYTE( p ); + break; + + case GXV_GLYPHOFFSET_CHAR: + glyphOffset.c = FT_NEXT_CHAR( p ); + break; + + case GXV_GLYPHOFFSET_USHORT: + glyphOffset.u = FT_NEXT_USHORT( p ); + break; + + case GXV_GLYPHOFFSET_SHORT: + glyphOffset.s = FT_NEXT_SHORT( p ); + break; + + case GXV_GLYPHOFFSET_ULONG: + glyphOffset.ul = FT_NEXT_ULONG( p ); + break; + + case GXV_GLYPHOFFSET_LONG: + glyphOffset.l = FT_NEXT_LONG( p ); + break; + + default: + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_FORMAT; + goto Exit; + } + + if ( NULL != valid->statetable.entry_validate_func ) + valid->statetable.entry_validate_func( state, + flags, + &glyphOffset, + statetable_table, + statetable_limit, + valid ); + } + + Exit: + *length_p = (FT_UShort)( p - table ); + + GXV_EXIT; + } + + + /* =========================== State Table ============================= */ + + FT_LOCAL_DEF( void ) + gxv_StateTable_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ) + { + FT_UShort o[3]; + FT_UShort* l[3]; + FT_UShort buff[4]; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + + gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, valid ); + } + + + FT_LOCAL_DEF( void ) + gxv_StateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort stateSize; + FT_UShort classTable; /* offset to Class(Sub)Table */ + FT_UShort stateArray; /* offset to StateArray */ + FT_UShort entryTable; /* offset to EntryTable */ + + FT_UShort classTable_length; + FT_UShort stateArray_length; + FT_UShort entryTable_length; + FT_Byte maxClassID; + FT_Byte maxState; + FT_Byte maxEntry; + + GXV_StateTable_Subtable_Setup_Func setup_func; + + FT_Bytes p = table; + + + GXV_NAME_ENTER( "StateTable" ); + + GXV_TRACE(( "StateTable header\n" )); + + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + stateSize = FT_NEXT_USHORT( p ); + classTable = FT_NEXT_USHORT( p ); + stateArray = FT_NEXT_USHORT( p ); + entryTable = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "stateSize=0x%04x\n", stateSize )); + GXV_TRACE(( "offset to classTable=0x%04x\n", classTable )); + GXV_TRACE(( "offset to stateArray=0x%04x\n", stateArray )); + GXV_TRACE(( "offset to entryTable=0x%04x\n", entryTable )); + + if ( stateSize > 0xFF ) + FT_INVALID_DATA; + + if ( valid->statetable.optdata_load_func != NULL ) + valid->statetable.optdata_load_func( p, limit, valid ); + + if ( valid->statetable.subtable_setup_func != NULL) + setup_func = valid->statetable.subtable_setup_func; + else + setup_func = gxv_StateTable_subtable_setup; + + setup_func( (FT_UShort)( limit - table ), + classTable, + stateArray, + entryTable, + &classTable_length, + &stateArray_length, + &entryTable_length, + valid ); + + GXV_TRACE(( "StateTable Subtables\n" )); + + if ( classTable != 0 ) + gxv_ClassTable_validate( table + classTable, + &classTable_length, + stateSize, + &maxClassID, + valid ); + else + maxClassID = (FT_Byte)( stateSize - 1 ); + + if ( stateArray != 0 ) + gxv_StateArray_validate( table + stateArray, + &stateArray_length, + maxClassID, + stateSize, + &maxState, + &maxEntry, + valid ); + else + { + maxState = 1; /* 0:start of text, 1:start of line are predefined */ + maxEntry = 0; + } + + if ( maxEntry > 0 && entryTable == 0 ) + FT_INVALID_OFFSET; + + if ( entryTable != 0 ) + gxv_EntryTable_validate( table + entryTable, + &entryTable_length, + maxEntry, + stateArray, + stateArray_length, + maxClassID, + table, + limit, + valid ); + + GXV_EXIT; + } + + + /* ================= eXtended State Table (for morx) =================== */ + + FT_LOCAL_DEF( void ) + gxv_XStateTable_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ) + { + FT_ULong o[3]; + FT_ULong* l[3]; + FT_ULong buff[4]; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + + gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid ); + } + + + static void + gxv_XClassTable_lookupval_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value_p->u >= valid->xstatetable.nClasses ) + FT_INVALID_DATA; + if ( value_p->u > valid->xstatetable.maxClassID ) + valid->xstatetable.maxClassID = value_p->u; + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 16bit value array | + +===============+ | + | value | <-------+ + .... + */ + static GXV_LookupValueDesc + gxv_XClassTable_lookupfmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + static void + gxv_XStateArray_validate( FT_Bytes table, + FT_ULong* length_p, + FT_UShort maxClassID, + FT_ULong stateSize, + FT_UShort* maxState_p, + FT_UShort* maxEntry_p, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort clazz; + FT_UShort entry; + + FT_UNUSED( stateSize ); /* for the non-debugging case */ + + + GXV_NAME_ENTER( "XStateArray" ); + + GXV_TRACE(( "parse % 3d bytes by stateSize=% 3d maxClassID=% 3d\n", + (int)(*length_p), stateSize, (int)(maxClassID) )); + + /* + * 2 states are predefined and must be described: + * state 0 (start of text), 1 (start of line) + */ + GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 * 2 ); + + *maxState_p = 0; + *maxEntry_p = 0; + + /* read if enough to read another state */ + while ( p + ( ( 1 + maxClassID ) * 2 ) <= limit ) + { + (*maxState_p)++; + for ( clazz = 0; clazz <= maxClassID; clazz++ ) + { + entry = FT_NEXT_USHORT( p ); + *maxEntry_p = (FT_UShort)FT_MAX( *maxEntry_p, entry ); + } + } + GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", + *maxState_p, *maxEntry_p )); + + *length_p = p - table; + + GXV_EXIT; + } + + + static void + gxv_XEntryTable_validate( FT_Bytes table, + FT_ULong* length_p, + FT_UShort maxEntry, + FT_ULong stateArray_length, + FT_UShort maxClassID, + FT_Bytes xstatetable_table, + FT_Bytes xstatetable_limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes limit = table + *length_p; + FT_UShort entry; + FT_UShort state; + FT_Int entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( xstatetable ); + + + GXV_NAME_ENTER( "XEntryTable" ); + GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize )); + + if ( ( p + ( maxEntry + 1 ) * entrySize ) > limit ) + FT_INVALID_TOO_SHORT; + + for (entry = 0; entry <= maxEntry ; entry++ ) + { + FT_UShort newState_idx; + FT_UShort flags; + GXV_XStateTable_GlyphOffsetDesc glyphOffset; + + + GXV_LIMIT_CHECK( 2 + 2 ); + newState_idx = FT_NEXT_USHORT( p ); + flags = FT_NEXT_USHORT( p ); + + if ( stateArray_length < (FT_ULong)( newState_idx * 2 ) ) + { + GXV_TRACE(( " newState index 0x%04x points out of stateArray\n", + newState_idx )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + } + + state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) ); + if ( 0 != ( newState_idx % ( 1 + maxClassID ) ) ) + { + FT_TRACE4(( "-> new state = %d (supposed)\n" + "but newState index 0x%04x is not aligned to %d-classes\n", + state, newState_idx, 1 + maxClassID )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + } + + switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) ) + { + case GXV_GLYPHOFFSET_NONE: + glyphOffset.uc = 0; /* make compiler happy */ + break; + + case GXV_GLYPHOFFSET_UCHAR: + glyphOffset.uc = FT_NEXT_BYTE( p ); + break; + + case GXV_GLYPHOFFSET_CHAR: + glyphOffset.c = FT_NEXT_CHAR( p ); + break; + + case GXV_GLYPHOFFSET_USHORT: + glyphOffset.u = FT_NEXT_USHORT( p ); + break; + + case GXV_GLYPHOFFSET_SHORT: + glyphOffset.s = FT_NEXT_SHORT( p ); + break; + + case GXV_GLYPHOFFSET_ULONG: + glyphOffset.ul = FT_NEXT_ULONG( p ); + break; + + case GXV_GLYPHOFFSET_LONG: + glyphOffset.l = FT_NEXT_LONG( p ); + break; + + default: + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_FORMAT; + goto Exit; + } + + if ( NULL != valid->xstatetable.entry_validate_func ) + valid->xstatetable.entry_validate_func( state, + flags, + &glyphOffset, + xstatetable_table, + xstatetable_limit, + valid ); + } + + Exit: + *length_p = p - table; + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_XStateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + /* StateHeader members */ + FT_ULong classTable; /* offset to Class(Sub)Table */ + FT_ULong stateArray; /* offset to StateArray */ + FT_ULong entryTable; /* offset to EntryTable */ + + FT_ULong classTable_length; + FT_ULong stateArray_length; + FT_ULong entryTable_length; + FT_UShort maxState; + FT_UShort maxEntry; + + GXV_XStateTable_Subtable_Setup_Func setup_func; + + FT_Bytes p = table; + + + GXV_NAME_ENTER( "XStateTable" ); + + GXV_TRACE(( "XStateTable header\n" )); + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); + valid->xstatetable.nClasses = FT_NEXT_ULONG( p ); + classTable = FT_NEXT_ULONG( p ); + stateArray = FT_NEXT_ULONG( p ); + entryTable = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "nClasses =0x%08x\n", valid->xstatetable.nClasses )); + GXV_TRACE(( "offset to classTable=0x%08x\n", classTable )); + GXV_TRACE(( "offset to stateArray=0x%08x\n", stateArray )); + GXV_TRACE(( "offset to entryTable=0x%08x\n", entryTable )); + + if ( valid->xstatetable.nClasses > 0xFFFFU ) + FT_INVALID_DATA; + + GXV_TRACE(( "StateTable Subtables\n" )); + + if ( valid->xstatetable.optdata_load_func != NULL ) + valid->xstatetable.optdata_load_func( p, limit, valid ); + + if ( valid->xstatetable.subtable_setup_func != NULL ) + setup_func = valid->xstatetable.subtable_setup_func; + else + setup_func = gxv_XStateTable_subtable_setup; + + setup_func( limit - table, + classTable, + stateArray, + entryTable, + &classTable_length, + &stateArray_length, + &entryTable_length, + valid ); + + if ( classTable != 0 ) + { + valid->xstatetable.maxClassID = 0; + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_XClassTable_lookupval_validate; + valid->lookupfmt4_trans = gxv_XClassTable_lookupfmt4_transit; + gxv_LookupTable_validate( table + classTable, + table + classTable + classTable_length, + valid ); + if ( valid->subtable_length < classTable_length ) + classTable_length = valid->subtable_length; + } + else + { + /* XXX: check range? */ + valid->xstatetable.maxClassID = + (FT_UShort)( valid->xstatetable.nClasses - 1 ); + } + + if ( stateArray != 0 ) + gxv_XStateArray_validate( table + stateArray, + &stateArray_length, + valid->xstatetable.maxClassID, + valid->xstatetable.nClasses, + &maxState, + &maxEntry, + valid ); + else + { + maxState = 1; /* 0:start of text, 1:start of line are predefined */ + maxEntry = 0; + } + + if ( maxEntry > 0 && entryTable == 0 ) + FT_INVALID_OFFSET; + + if ( entryTable != 0 ) + gxv_XEntryTable_validate( table + entryTable, + &entryTable_length, + maxEntry, + stateArray_length, + valid->xstatetable.maxClassID, + table, + limit, + valid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Table overlapping *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static int + gxv_compare_ranges( FT_Bytes table1_start, + FT_ULong table1_length, + FT_Bytes table2_start, + FT_ULong table2_length ) + { + if ( table1_start == table2_start ) + { + if ( ( table1_length == 0 || table2_length == 0 ) ) + goto Out; + } + else if ( table1_start < table2_start ) + { + if ( ( table1_start + table1_length ) <= table2_start ) + goto Out; + } + else if ( table1_start > table2_start ) + { + if ( ( table1_start >= table2_start + table2_length ) ) + goto Out; + } + return 1; + + Out: + return 0; + } + + + FT_LOCAL_DEF( void ) + gxv_odtect_add_range( FT_Bytes start, + FT_ULong length, + const FT_String* name, + GXV_odtect_Range odtect ) + { + odtect->range[ odtect->nRanges ].start = start; + odtect->range[ odtect->nRanges ].length = length; + odtect->range[ odtect->nRanges ].name = (FT_String*)name; + odtect->nRanges++; + } + + + FT_LOCAL_DEF( void ) + gxv_odtect_validate( GXV_odtect_Range odtect, + GXV_Validator valid ) + { + FT_UInt i, j; + + + GXV_NAME_ENTER( "check overlap among multi ranges" ); + + for ( i = 0; i < odtect->nRanges; i++ ) + for ( j = 0; j < i; j++ ) + if ( 0 != gxv_compare_ranges( odtect->range[i].start, + odtect->range[i].length, + odtect->range[j].start, + odtect->range[j].length ) ) + { + if ( odtect->range[i].name || odtect->range[j].name ) + GXV_TRACE(( "found overlap between range %d and range %d\n", + i, j )); + else + GXV_TRACE(( "found overlap between `%s' and `%s\'\n", + odtect->range[i].name, + odtect->range[j].name )); + FT_INVALID_OFFSET; + } + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvcommn.h b/alienblaster/project/jni/freetype/src/gxvalid/gxvcommn.h new file mode 100644 index 000000000..404c07ffa --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvcommn.h @@ -0,0 +1,565 @@ +/***************************************************************************/ +/* */ +/* gxvcommn.h */ +/* */ +/* TrueTypeGX/AAT common tables validation (specification). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + + /* + * keywords in variable naming + * --------------------------- + * table: Of type FT_Bytes, pointing to the start of this table/subtable. + * limit: Of type FT_Bytes, pointing to the end of this table/subtable, + * including padding for alignment. + * offset: Of type FT_UInt, the number of octets from the start to target. + * length: Of type FT_UInt, the number of octets from the start to the + * end in this table/subtable, including padding for alignment. + * + * _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc. + */ + + +#ifndef __GXVCOMMN_H__ +#define __GXVCOMMN_H__ + + +#include <ft2build.h> +#include "gxvalid.h" +#include FT_INTERNAL_DEBUG_H +#include FT_SFNT_NAMES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALIDATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_ValidatorRec_* GXV_Validator; + + +#define DUMMY_LIMIT 0 + + typedef void + (*GXV_Validate_Func)( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + + /* ====================== LookupTable Validator ======================== */ + + typedef union GXV_LookupValueDesc_ + { + FT_UShort u; + FT_Short s; + + } GXV_LookupValueDesc; + + typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr; + + typedef enum GXV_LookupValue_SignSpec_ + { + GXV_LOOKUPVALUE_UNSIGNED = 0, + GXV_LOOKUPVALUE_SIGNED + + } GXV_LookupValue_SignSpec; + + + typedef void + (*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ); + + typedef GXV_LookupValueDesc + (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ); + + + /* ====================== StateTable Validator ========================= */ + + typedef enum GXV_GlyphOffset_Format_ + { + GXV_GLYPHOFFSET_NONE = -1, + GXV_GLYPHOFFSET_UCHAR = 2, + GXV_GLYPHOFFSET_CHAR, + GXV_GLYPHOFFSET_USHORT = 4, + GXV_GLYPHOFFSET_SHORT, + GXV_GLYPHOFFSET_ULONG = 8, + GXV_GLYPHOFFSET_LONG + + } GXV_GlyphOffset_Format; + + +#define GXV_GLYPHOFFSET_FMT( table ) \ + ( valid->table.entry_glyphoffset_fmt ) + +#define GXV_GLYPHOFFSET_SIZE( table ) \ + ( valid->table.entry_glyphoffset_fmt / 2 ) + + + /* ----------------------- 16bit StateTable ---------------------------- */ + + typedef union GXV_StateTable_GlyphOffsetDesc_ + { + FT_Byte uc; + FT_UShort u; /* same as GXV_LookupValueDesc */ + FT_ULong ul; + FT_Char c; + FT_Short s; /* same as GXV_LookupValueDesc */ + FT_Long l; + + } GXV_StateTable_GlyphOffsetDesc; + + typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr; + + typedef void + (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ); + + typedef void + (*GXV_StateTable_Entry_Validate_Func)( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes statetable_table, + FT_Bytes statetable_limit, + GXV_Validator valid ); + + typedef void + (*GXV_StateTable_OptData_Load_Func)( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + typedef struct GXV_StateTable_ValidatorRec_ + { + GXV_GlyphOffset_Format entry_glyphoffset_fmt; + void* optdata; + + GXV_StateTable_Subtable_Setup_Func subtable_setup_func; + GXV_StateTable_Entry_Validate_Func entry_validate_func; + GXV_StateTable_OptData_Load_Func optdata_load_func; + + } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData; + + + /* ---------------------- 32bit XStateTable ---------------------------- */ + + typedef GXV_StateTable_GlyphOffsetDesc GXV_XStateTable_GlyphOffsetDesc; + + typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr; + + typedef void + (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ); + + typedef void + (*GXV_XStateTable_Entry_Validate_Func)( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes xstatetable_table, + FT_Bytes xstatetable_limit, + GXV_Validator valid ); + + + typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func; + + + typedef struct GXV_XStateTable_ValidatorRec_ + { + int entry_glyphoffset_fmt; + void* optdata; + + GXV_XStateTable_Subtable_Setup_Func subtable_setup_func; + GXV_XStateTable_Entry_Validate_Func entry_validate_func; + GXV_XStateTable_OptData_Load_Func optdata_load_func; + + FT_ULong nClasses; + FT_UShort maxClassID; + + } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData; + + + /* ===================================================================== */ + + typedef struct GXV_ValidatorRec_ + { + FT_Validator root; + + FT_Face face; + void* table_data; + + FT_ULong subtable_length; + + GXV_LookupValue_SignSpec lookupval_sign; + GXV_Lookup_Value_Validate_Func lookupval_func; + GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans; + FT_Bytes lookuptbl_head; + + GXV_StateTable_ValidatorRec statetable; + GXV_XStateTable_ValidatorRec xstatetable; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt debug_indent; + const FT_String* debug_function_name[3]; +#endif + + } GXV_ValidatorRec; + + +#define GXV_TABLE_DATA( tag, field ) \ + ( ( (GXV_ ## tag ## _Data)valid->table_data )->field ) + +#undef FT_INVALID_ +#define FT_INVALID_( _prefix, _error ) \ + ft_validator_error( valid->root, _prefix ## _error ) + +#define GXV_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( p + _count > ( limit? limit : valid->root->limit ) ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define GXV_INIT valid->debug_indent = 0 + +#define GXV_NAME_ENTER( name ) \ + FT_BEGIN_STMNT \ + valid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4(( "%s table\n", name )); \ + FT_END_STMNT + +#define GXV_EXIT valid->debug_indent -= 2 + +#define GXV_TRACE( s ) \ + FT_BEGIN_STMNT \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4( s ); \ + FT_END_STMNT + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define GXV_INIT do { } while ( 0 ) +#define GXV_NAME_ENTER( name ) do { } while ( 0 ) +#define GXV_EXIT do { } while ( 0 ) + +#define GXV_TRACE( s ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** 32bit alignment checking *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \ + FT_BEGIN_STMNT \ + { \ + if ( 0 != ( (a) % 4 ) ) \ + FT_INVALID_OFFSET ; \ + } \ + FT_END_STMNT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Dumping Binary Data *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_TRACE_HEXDUMP( p, len ) \ + FT_BEGIN_STMNT \ + { \ + FT_Bytes b; \ + \ + \ + for ( b = p; b < (FT_Bytes)p + len; b++ ) \ + FT_TRACE1(("\\x%02x", *b)) ; \ + } \ + FT_END_STMNT + +#define GXV_TRACE_HEXDUMP_C( p, len ) \ + FT_BEGIN_STMNT \ + { \ + FT_Bytes b; \ + \ + \ + for ( b = p; b < (FT_Bytes)p + len; b++ ) \ + if ( 0x40 < *b && *b < 0x7e ) \ + FT_TRACE1(("%c", *b)) ; \ + else \ + FT_TRACE1(("\\x%02x", *b)) ; \ + } \ + FT_END_STMNT + +#define GXV_TRACE_HEXDUMP_SFNTNAME( n ) \ + GXV_TRACE_HEXDUMP( n.string, n.string_len ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUP TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_BinSrchHeader_validate( FT_Bytes p, + FT_Bytes limit, + FT_UShort* unitSize_p, + FT_UShort* nUnits_p, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_LookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Glyph ID *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( FT_Int ) + gxv_glyphid_validate( FT_UShort gid, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CONTROL POINT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_ctlPoint_validate( FT_UShort gid, + FT_Short ctl_point, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SFNT NAME *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_sfntName_validate( FT_UShort name_index, + FT_UShort min_index, + FT_UShort max_index, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STATE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_StateTable_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_XStateTable_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_StateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_XStateTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY MACROS AND FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + gxv_array_getlimits_byte( FT_Bytes table, + FT_Bytes limit, + FT_Byte* min, + FT_Byte* max, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_array_getlimits_ushort( FT_Bytes table, + FT_Bytes limit, + FT_UShort* min, + FT_UShort* max, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_set_length_by_ushort_offset( FT_UShort* offset, + FT_UShort** length, + FT_UShort* buff, + FT_UInt nmemb, + FT_UShort limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_set_length_by_ulong_offset( FT_ULong* offset, + FT_ULong** length, + FT_ULong* buff, + FT_UInt nmemb, + FT_ULong limit, + GXV_Validator valid); + + +#define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \ + FT_BEGIN_STMNT \ + if ( (_offset) > valid->subtable_length ) \ + FT_INVALID_OFFSET; \ + FT_END_STMNT + +#define GXV_SUBTABLE_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( ( p + (_count) - valid->subtable_start ) > \ + valid->subtable_length ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + +#define GXV_USHORT_TO_SHORT( _us ) \ + ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) ) + +#define GXV_STATETABLE_HEADER_SIZE ( 2 + 2 + 2 + 2 ) +#define GXV_STATEHEADER_SIZE GXV_STATETABLE_HEADER_SIZE + +#define GXV_XSTATETABLE_HEADER_SIZE ( 4 + 4 + 4 + 4 ) +#define GXV_XSTATEHEADER_SIZE GXV_XSTATETABLE_HEADER_SIZE + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Table overlapping *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_odtect_DataRec_ + { + FT_Bytes start; + FT_ULong length; + FT_String* name; + + } GXV_odtect_DataRec, *GXV_odtect_Data; + + typedef struct GXV_odtect_RangeRec_ + { + FT_UInt nRanges; + GXV_odtect_Data range; + + } GXV_odtect_RangeRec, *GXV_odtect_Range; + + + FT_LOCAL( void ) + gxv_odtect_add_range( FT_Bytes start, + FT_ULong length, + const FT_String* name, + GXV_odtect_Range odtect ); + + FT_LOCAL( void ) + gxv_odtect_validate( GXV_odtect_Range odtect, + GXV_Validator valid ); + + +#define GXV_ODTECT( n, odtect ) \ + GXV_odtect_DataRec odtect ## _range[n]; \ + GXV_odtect_RangeRec odtect ## _rec = { 0, NULL }; \ + GXV_odtect_Range odtect = NULL + +#define GXV_ODTECT_INIT( odtect ) \ + FT_BEGIN_STMNT \ + odtect ## _rec.nRanges = 0; \ + odtect ## _rec.range = odtect ## _range; \ + odtect = & odtect ## _rec; \ + FT_END_STMNT + + + /* */ + +FT_END_HEADER + +#endif /* __GXVCOMMN_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxverror.h b/alienblaster/project/jni/freetype/src/gxvalid/gxverror.h new file mode 100644 index 000000000..019619922 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxverror.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* gxverror.h */ +/* */ +/* TrueTypeGX/AAT validation module error codes (specification only). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the OpenType validation module error */ + /* enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __GXVERROR_H__ +#define __GXVERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX GXV_Err_ +#define FT_ERR_BASE FT_Mod_Err_GXV + +#define FT_KEEP_ERR_PREFIX + +#include FT_ERRORS_H + +#endif /* __GXVERROR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvfeat.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvfeat.c new file mode 100644 index 000000000..002fec6d6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvfeat.c @@ -0,0 +1,344 @@ +/***************************************************************************/ +/* */ +/* gxvfeat.c */ +/* */ +/* TrueTypeGX/AAT feat table validation (body). */ +/* */ +/* Copyright 2004, 2005, 2008 by */ +/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" +#include "gxvfeat.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvfeat + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_feat_DataRec_ + { + FT_UInt reserved_size; + FT_UShort feature; + FT_UShort setting; + + } GXV_feat_DataRec, *GXV_feat_Data; + + +#define GXV_FEAT_DATA( field ) GXV_TABLE_DATA( feat, field ) + + + typedef enum GXV_FeatureFlagsMask_ + { + GXV_FEAT_MASK_EXCLUSIVE_SETTINGS = 0x8000U, + GXV_FEAT_MASK_DYNAMIC_DEFAULT = 0x4000, + GXV_FEAT_MASK_UNUSED = 0x3F00, + GXV_FEAT_MASK_DEFAULT_SETTING = 0x00FF + + } GXV_FeatureFlagsMask; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_feat_registry_validate( FT_UShort feature, + FT_UShort nSettings, + FT_Bool exclusive, + GXV_Validator valid ) + { + GXV_NAME_ENTER( "feature in registry" ); + + GXV_TRACE(( " (feature = %u)\n", feature )); + + if ( feature >= gxv_feat_registry_length ) + { + GXV_TRACE(( "feature number %d is out of range %d\n", + feature, gxv_feat_registry_length )); + if ( valid->root->level == FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + goto Exit; + } + + if ( gxv_feat_registry[feature].existence == 0 ) + { + GXV_TRACE(( "feature number %d is in defined range but doesn't exist\n", + feature )); + if ( valid->root->level == FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + goto Exit; + } + + if ( gxv_feat_registry[feature].apple_reserved ) + { + /* Don't use here. Apple is reserved. */ + GXV_TRACE(( "feature number %d is reserved by Apple\n", feature )); + if ( valid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + if ( nSettings != gxv_feat_registry[feature].nSettings ) + { + GXV_TRACE(( "feature %d: nSettings %d != defined nSettings %d\n", + feature, nSettings, + gxv_feat_registry[feature].nSettings )); + if ( valid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + if ( exclusive != gxv_feat_registry[feature].exclusive ) + { + GXV_TRACE(( "exclusive flag %d differs from predefined value\n", + exclusive )); + if ( valid->root->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + } + + Exit: + GXV_EXIT; + } + + + static void + gxv_feat_name_index_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + FT_Short nameIndex; + + + GXV_NAME_ENTER( "nameIndex" ); + + GXV_LIMIT_CHECK( 2 ); + nameIndex = FT_NEXT_SHORT ( p ); + GXV_TRACE(( " (nameIndex = %d)\n", nameIndex )); + + gxv_sfntName_validate( (FT_UShort)nameIndex, + 255, + 32768U, + valid ); + + GXV_EXIT; + } + + + static void + gxv_feat_setting_validate( FT_Bytes table, + FT_Bytes limit, + FT_Bool exclusive, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort setting; + + + GXV_NAME_ENTER( "setting" ); + + GXV_LIMIT_CHECK( 2 ); + + setting = FT_NEXT_USHORT( p ); + + /* If we have exclusive setting, the setting should be odd. */ + if ( exclusive && ( setting % 2 ) == 0 ) + FT_INVALID_DATA; + + gxv_feat_name_index_validate( p, limit, valid ); + + GXV_FEAT_DATA( setting ) = setting; + + GXV_EXIT; + } + + + static void + gxv_feat_name_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt reserved_size = GXV_FEAT_DATA( reserved_size ); + + FT_UShort feature; + FT_UShort nSettings; + FT_ULong settingTable; + FT_UShort featureFlags; + + FT_Bool exclusive; + FT_Int last_setting; + FT_UInt i; + + + GXV_NAME_ENTER( "name" ); + + /* feature + nSettings + settingTable + featureFlags */ + GXV_LIMIT_CHECK( 2 + 2 + 4 + 2 ); + + feature = FT_NEXT_USHORT( p ); + GXV_FEAT_DATA( feature ) = feature; + + nSettings = FT_NEXT_USHORT( p ); + settingTable = FT_NEXT_ULONG ( p ); + featureFlags = FT_NEXT_USHORT( p ); + + if ( settingTable < reserved_size ) + FT_INVALID_OFFSET; + + if ( valid->root->level == FT_VALIDATE_PARANOID && + ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 ) + FT_INVALID_DATA; + + exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS ); + if ( exclusive ) + { + FT_Byte dynamic_default; + + + if ( featureFlags & GXV_FEAT_MASK_DYNAMIC_DEFAULT ) + dynamic_default = (FT_Byte)( featureFlags & + GXV_FEAT_MASK_DEFAULT_SETTING ); + else + dynamic_default = 0; + + /* If exclusive, check whether default setting is in the range. */ + if ( !( dynamic_default < nSettings ) ) + FT_INVALID_FORMAT; + } + + gxv_feat_registry_validate( feature, nSettings, exclusive, valid ); + + gxv_feat_name_index_validate( p, limit, valid ); + + p = valid->root->base + settingTable; + for ( last_setting = -1, i = 0; i < nSettings; i++ ) + { + gxv_feat_setting_validate( p, limit, exclusive, valid ); + + if ( valid->root->level == FT_VALIDATE_PARANOID && + (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting ) + FT_INVALID_FORMAT; + + last_setting = (FT_Int)GXV_FEAT_DATA( setting ); + /* setting + nameIndex */ + p += ( 2 + 2 ); + } + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** feat TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_feat_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_feat_DataRec featrec; + GXV_feat_Data feat = &featrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_UInt featureNameCount; + + FT_UInt i; + FT_Int last_feature; + + + valid->root = ftvalid; + valid->table_data = feat; + valid->face = face; + + FT_TRACE3(( "validating `feat' table\n" )); + GXV_INIT; + + feat->reserved_size = 0; + + /* version + featureNameCount + none_0 + none_1 */ + GXV_LIMIT_CHECK( 4 + 2 + 2 + 4 ); + feat->reserved_size += 4 + 2 + 2 + 4; + + if ( FT_NEXT_ULONG( p ) != 0x00010000UL ) /* Version */ + FT_INVALID_FORMAT; + + featureNameCount = FT_NEXT_USHORT( p ); + GXV_TRACE(( " (featureNameCount = %d)\n", featureNameCount )); + + if ( valid->root->level != FT_VALIDATE_PARANOID ) + p += 6; /* skip (none) and (none) */ + else + { + if ( FT_NEXT_USHORT( p ) != 0 ) + FT_INVALID_DATA; + + if ( FT_NEXT_ULONG( p ) != 0 ) + FT_INVALID_DATA; + } + + feat->reserved_size += featureNameCount * ( 2 + 2 + 4 + 2 + 2 ); + + for ( last_feature = -1, i = 0; i < featureNameCount; i++ ) + { + gxv_feat_name_validate( p, limit, valid ); + + if ( valid->root->level == FT_VALIDATE_PARANOID && + (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature ) + FT_INVALID_FORMAT; + + last_feature = GXV_FEAT_DATA( feature ); + p += 2 + 2 + 4 + 2 + 2; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvfeat.h b/alienblaster/project/jni/freetype/src/gxvalid/gxvfeat.h new file mode 100644 index 000000000..049d23a0b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvfeat.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* gxvfeat.h */ +/* */ +/* TrueTypeGX/AAT feat table validation (specification). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVFEAT_H__ +#define __GXVFEAT_H__ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Registry predefined by Apple *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* TODO: More compact format */ + typedef struct GXV_Feature_RegistryRec_ + { + FT_Bool existence; + FT_Bool apple_reserved; + FT_Bool exclusive; + FT_Byte nSettings; + + } GX_Feature_RegistryRec; + + +#define gxv_feat_registry_length \ + ( sizeof ( gxv_feat_registry ) / \ + sizeof ( GX_Feature_RegistryRec ) ) + + + static GX_Feature_RegistryRec gxv_feat_registry[] = + { + /* Generated from gxvfgen.c */ + {1, 0, 0, 1}, /* All Typographic Features */ + {1, 0, 0, 8}, /* Ligatures */ + {1, 0, 1, 3}, /* Cursive Connection */ + {1, 0, 1, 6}, /* Letter Case */ + {1, 0, 0, 1}, /* Vertical Substitution */ + {1, 0, 0, 1}, /* Linguistic Rearrangement */ + {1, 0, 1, 2}, /* Number Spacing */ + {1, 1, 0, 0}, /* Apple Reserved 1 */ + {1, 0, 0, 5}, /* Smart Swashes */ + {1, 0, 1, 3}, /* Diacritics */ + {1, 0, 1, 4}, /* Vertical Position */ + {1, 0, 1, 3}, /* Fractions */ + {1, 1, 0, 0}, /* Apple Reserved 2 */ + {1, 0, 0, 1}, /* Overlapping Characters */ + {1, 0, 0, 6}, /* Typographic Extras */ + {1, 0, 0, 5}, /* Mathematical Extras */ + {1, 0, 1, 7}, /* Ornament Sets */ + {1, 0, 1, 1}, /* Character Alternatives */ + {1, 0, 1, 5}, /* Design Complexity */ + {1, 0, 1, 6}, /* Style Options */ + {1, 0, 1, 11}, /* Character Shape */ + {1, 0, 1, 2}, /* Number Case */ + {1, 0, 1, 4}, /* Text Spacing */ + {1, 0, 1, 10}, /* Transliteration */ + {1, 0, 1, 9}, /* Annotation */ + {1, 0, 1, 2}, /* Kana Spacing */ + {1, 0, 1, 2}, /* Ideographic Spacing */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {0, 0, 0, 0}, /* __EMPTY__ */ + {1, 0, 1, 4}, /* Text Spacing */ + {1, 0, 1, 2}, /* Kana Spacing */ + {1, 0, 1, 2}, /* Ideographic Spacing */ + {1, 0, 1, 4}, /* CJK Roman Spacing */ + }; + + +#endif /* __GXVFEAT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvjust.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvjust.c new file mode 100644 index 000000000..e14f946f2 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvjust.c @@ -0,0 +1,630 @@ +/***************************************************************************/ +/* */ +/* gxvjust.c */ +/* */ +/* TrueTypeGX/AAT just table validation (body). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include FT_SFNT_NAMES_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvjust + + /* + * referred `just' table format specification: + * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6just.html + * last updated 2000. + * ---------------------------------------------- + * [JUST HEADER]: GXV_JUST_HEADER_SIZE + * version (fixed: 32bit) = 0x00010000 + * format (uint16: 16bit) = 0 is only defined (2000) + * horizOffset (uint16: 16bit) + * vertOffset (uint16: 16bit) + * ---------------------------------------------- + */ + + typedef struct GXV_just_DataRec_ + { + FT_UShort wdc_offset_max; + FT_UShort wdc_offset_min; + FT_UShort pc_offset_max; + FT_UShort pc_offset_min; + + } GXV_just_DataRec, *GXV_just_Data; + + +#define GXV_JUST_DATA( a ) GXV_TABLE_DATA( just, a ) + + + static void + gxv_just_wdp_entry_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong justClass; + FT_Fixed beforeGrowLimit; + FT_Fixed beforeShrinkGrowLimit; + FT_Fixed afterGrowLimit; + FT_Fixed afterShrinkGrowLimit; + FT_UShort growFlags; + FT_UShort shrinkFlags; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 + 4 + 2 + 2 ); + justClass = FT_NEXT_ULONG( p ); + beforeGrowLimit = FT_NEXT_ULONG( p ); + beforeShrinkGrowLimit = FT_NEXT_ULONG( p ); + afterGrowLimit = FT_NEXT_ULONG( p ); + afterShrinkGrowLimit = FT_NEXT_ULONG( p ); + growFlags = FT_NEXT_USHORT( p ); + shrinkFlags = FT_NEXT_USHORT( p ); + + /* TODO: decode flags for human readability */ + + valid->subtable_length = p - table; + } + + + static void + gxv_just_wdc_entry_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong count, i; + + + GXV_LIMIT_CHECK( 4 ); + count = FT_NEXT_ULONG( p ); + for ( i = 0; i < count; i++ ) + { + GXV_TRACE(( "validating wdc pair %d/%d\n", i + 1, count )); + gxv_just_wdp_entry_validate( p, limit, valid ); + p += valid->subtable_length; + } + + valid->subtable_length = p - table; + } + + + static void + gxv_just_widthDeltaClusters_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table ; + FT_Bytes wdc_end = table + GXV_JUST_DATA( wdc_offset_max ); + FT_UInt i; + + + GXV_NAME_ENTER( "just justDeltaClusters" ); + + if ( limit <= wdc_end ) + FT_INVALID_OFFSET; + + for ( i = 0; p <= wdc_end; i++ ) + { + gxv_just_wdc_entry_validate( p, limit, valid ); + p += valid->subtable_length; + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_just_actSubrecord_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + FT_Fixed lowerLimit; + FT_Fixed upperLimit; + + FT_UShort order; + FT_UShort decomposedCount; + + FT_UInt i; + + + GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 ); + lowerLimit = FT_NEXT_ULONG( p ); + upperLimit = FT_NEXT_ULONG( p ); + order = FT_NEXT_USHORT( p ); + decomposedCount = FT_NEXT_USHORT( p ); + + for ( i = 0; i < decomposedCount; i++ ) + { + FT_UShort glyphs; + + + GXV_LIMIT_CHECK( 2 ); + glyphs = FT_NEXT_USHORT( p ); + } + + valid->subtable_length = p - table; + } + + + static void + gxv_just_actSubrecord_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort addGlyph; + + + GXV_LIMIT_CHECK( 2 ); + addGlyph = FT_NEXT_USHORT( p ); + + valid->subtable_length = p - table; + } + + + static void + gxv_just_actSubrecord_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_Fixed substThreshhold; /* Apple misspelled "Threshhold" */ + FT_UShort addGlyph; + FT_UShort substGlyph; + + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + substThreshhold = FT_NEXT_ULONG( p ); + addGlyph = FT_NEXT_USHORT( p ); + substGlyph = FT_NEXT_USHORT( p ); + + valid->subtable_length = p - table; + } + + + static void + gxv_just_actSubrecord_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong variantsAxis; + FT_Fixed minimumLimit; + FT_Fixed noStretchValue; + FT_Fixed maximumLimit; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); + variantsAxis = FT_NEXT_ULONG( p ); + minimumLimit = FT_NEXT_ULONG( p ); + noStretchValue = FT_NEXT_ULONG( p ); + maximumLimit = FT_NEXT_ULONG( p ); + + valid->subtable_length = p - table; + } + + + static void + gxv_just_actSubrecord_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort flags; + FT_UShort glyph; + + + GXV_LIMIT_CHECK( 2 + 2 ); + flags = FT_NEXT_USHORT( p ); + glyph = FT_NEXT_USHORT( p ); + + valid->subtable_length = p - table; + } + + + /* parse single actSubrecord */ + static void + gxv_just_actSubrecord_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort actionClass; + FT_UShort actionType; + FT_ULong actionLength; + + + GXV_NAME_ENTER( "just actSubrecord" ); + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + actionClass = FT_NEXT_USHORT( p ); + actionType = FT_NEXT_USHORT( p ); + actionLength = FT_NEXT_ULONG( p ); + + if ( actionType == 0 ) + gxv_just_actSubrecord_type0_validate( p, limit, valid ); + else if ( actionType == 1 ) + gxv_just_actSubrecord_type1_validate( p, limit, valid ); + else if ( actionType == 2 ) + gxv_just_actSubrecord_type2_validate( p, limit, valid ); + else if ( actionType == 3 ) + ; /* Stretch glyph action: no actionData */ + else if ( actionType == 4 ) + gxv_just_actSubrecord_type4_validate( p, limit, valid ); + else if ( actionType == 5 ) + gxv_just_actSubrecord_type5_validate( p, limit, valid ); + else + FT_INVALID_DATA; + + valid->subtable_length = actionLength; + + GXV_EXIT; + } + + + static void + gxv_just_pcActionRecord_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong actionCount; + FT_ULong i; + + + GXV_LIMIT_CHECK( 4 ); + actionCount = FT_NEXT_ULONG( p ); + GXV_TRACE(( "actionCount = %d\n", actionCount )); + + for ( i = 0; i < actionCount; i++ ) + { + gxv_just_actSubrecord_validate( p, limit, valid ); + p += valid->subtable_length; + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_just_pcTable_LookupValue_entry_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value_p->u > GXV_JUST_DATA( pc_offset_max ) ) + GXV_JUST_DATA( pc_offset_max ) = value_p->u; + if ( value_p->u < GXV_JUST_DATA( pc_offset_max ) ) + GXV_JUST_DATA( pc_offset_min ) = value_p->u; + } + + + static void + gxv_just_pcLookupTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "just pcLookupTable" ); + GXV_JUST_DATA( pc_offset_max ) = 0x0000; + GXV_JUST_DATA( pc_offset_min ) = 0xFFFFU; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_just_pcTable_LookupValue_entry_validate; + + gxv_LookupTable_validate( p, limit, valid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + static void + gxv_just_postcompTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "just postcompTable" ); + + gxv_just_pcLookupTable_validate( p, limit, valid ); + p += valid->subtable_length; + + gxv_just_pcActionRecord_validate( p, limit, valid ); + p += valid->subtable_length; + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_just_classTable_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setMark; + FT_UShort dontAdvance; + FT_UShort markClass; + FT_UShort currentClass; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset_p ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + FT_UNUSED( valid ); + + + setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markClass = (FT_UShort)( ( flags >> 7 ) & 0x7F ); + currentClass = (FT_UShort)( flags & 0x7F ); + + /* TODO: validate markClass & currentClass */ + } + + + static void + gxv_just_justClassTable_validate ( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort length; + FT_UShort coverage; + FT_ULong subFeatureFlags; + + + GXV_NAME_ENTER( "just justClassTable" ); + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + subFeatureFlags = FT_NEXT_ULONG( p ); + + GXV_TRACE(( " justClassTable: coverage = 0x%04x (%s)", + coverage, + ( 0x4000 & coverage ) == 0 ? "ascending" : "descending" )); + + valid->statetable.optdata = NULL; + valid->statetable.optdata_load_func = NULL; + valid->statetable.subtable_setup_func = NULL; + valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + valid->statetable.entry_validate_func = + gxv_just_classTable_entry_validate; + + gxv_StateTable_validate( p, table + length, valid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + static void + gxv_just_wdcTable_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + if ( value_p->u > GXV_JUST_DATA( wdc_offset_max ) ) + GXV_JUST_DATA( wdc_offset_max ) = value_p->u; + if ( value_p->u < GXV_JUST_DATA( wdc_offset_min ) ) + GXV_JUST_DATA( wdc_offset_min ) = value_p->u; + } + + + static void + gxv_just_justData_lookuptable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_JUST_DATA( wdc_offset_max ) = 0x0000; + GXV_JUST_DATA( wdc_offset_min ) = 0xFFFFU; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_just_wdcTable_LookupValue_validate; + + gxv_LookupTable_validate( p, limit, valid ); + + /* subtable_length is set by gxv_LookupTable_validate() */ + + GXV_EXIT; + } + + + /* + * gxv_just_justData_validate() parses and validates horizData, vertData. + */ + static void + gxv_just_justData_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + /* + * following 3 offsets are measured from the start of `just' + * (which table points to), not justData + */ + FT_UShort justClassTableOffset; + FT_UShort wdcTableOffset; + FT_UShort pcTableOffset; + FT_Bytes p = table; + + GXV_ODTECT( 4, odtect ); + + + GXV_NAME_ENTER( "just justData" ); + + GXV_ODTECT_INIT( odtect ); + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + justClassTableOffset = FT_NEXT_USHORT( p ); + wdcTableOffset = FT_NEXT_USHORT( p ); + pcTableOffset = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (justClassTableOffset = 0x%04x)\n", justClassTableOffset )); + GXV_TRACE(( " (wdcTableOffset = 0x%04x)\n", wdcTableOffset )); + GXV_TRACE(( " (pcTableOffset = 0x%04x)\n", pcTableOffset )); + + gxv_just_justData_lookuptable_validate( p, limit, valid ); + gxv_odtect_add_range( p, valid->subtable_length, + "just_LookupTable", odtect ); + + if ( wdcTableOffset ) + { + gxv_just_widthDeltaClusters_validate( + valid->root->base + wdcTableOffset, limit, valid ); + gxv_odtect_add_range( valid->root->base + wdcTableOffset, + valid->subtable_length, "just_wdcTable", odtect ); + } + + if ( pcTableOffset ) + { + gxv_just_postcompTable_validate( valid->root->base + pcTableOffset, + limit, valid ); + gxv_odtect_add_range( valid->root->base + pcTableOffset, + valid->subtable_length, "just_pcTable", odtect ); + } + + if ( justClassTableOffset ) + { + gxv_just_justClassTable_validate( + valid->root->base + justClassTableOffset, limit, valid ); + gxv_odtect_add_range( valid->root->base + justClassTableOffset, + valid->subtable_length, "just_justClassTable", + odtect ); + } + + gxv_odtect_validate( odtect, valid ); + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_just_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_Offset table_size; + + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + GXV_just_DataRec justrec; + GXV_just_Data just = &justrec; + + FT_ULong version; + FT_UShort format; + FT_UShort horizOffset; + FT_UShort vertOffset; + + GXV_ODTECT( 3, odtect ); + + + GXV_ODTECT_INIT( odtect ); + + valid->root = ftvalid; + valid->table_data = just; + valid->face = face; + + FT_TRACE3(( "validating `just' table\n" )); + GXV_INIT; + + limit = valid->root->limit; + table_size = limit - table; + + GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + horizOffset = FT_NEXT_USHORT( p ); + vertOffset = FT_NEXT_USHORT( p ); + gxv_odtect_add_range( table, p - table, "just header", odtect ); + + + /* Version 1.0 (always:2000) */ + GXV_TRACE(( " (version = 0x%08x)\n", version )); + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* format 0 (always:2000) */ + GXV_TRACE(( " (format = 0x%04x)\n", format )); + if ( format != 0x0000 ) + FT_INVALID_FORMAT; + + GXV_TRACE(( " (horizOffset = %d)\n", horizOffset )); + GXV_TRACE(( " (vertOffset = %d)\n", vertOffset )); + + + /* validate justData */ + if ( 0 < horizOffset ) + { + gxv_just_justData_validate( table + horizOffset, limit, valid ); + gxv_odtect_add_range( table + horizOffset, valid->subtable_length, + "horizJustData", odtect ); + } + + if ( 0 < vertOffset ) + { + gxv_just_justData_validate( table + vertOffset, limit, valid ); + gxv_odtect_add_range( table + vertOffset, valid->subtable_length, + "vertJustData", odtect ); + } + + gxv_odtect_validate( odtect, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvkern.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvkern.c new file mode 100644 index 000000000..2137db842 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvkern.c @@ -0,0 +1,876 @@ +/***************************************************************************/ +/* */ +/* gxvkern.c */ +/* */ +/* TrueTypeGX/AAT kern table validation (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 */ +/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include FT_SFNT_NAMES_H +#include FT_SERVICE_GX_VALIDATE_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvkern + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef enum GXV_kern_Version_ + { + KERN_VERSION_CLASSIC = 0x0000, + KERN_VERSION_NEW = 0x0001 + + } GXV_kern_Version; + + + typedef enum GXV_kern_Dialect_ + { + KERN_DIALECT_UNKNOWN = 0, + KERN_DIALECT_MS = FT_VALIDATE_MS, + KERN_DIALECT_APPLE = FT_VALIDATE_APPLE, + KERN_DIALECT_ANY = FT_VALIDATE_CKERN + + } GXV_kern_Dialect; + + + typedef struct GXV_kern_DataRec_ + { + GXV_kern_Version version; + void *subtable_data; + GXV_kern_Dialect dialect_request; + + } GXV_kern_DataRec, *GXV_kern_Data; + + +#define GXV_KERN_DATA( field ) GXV_TABLE_DATA( kern, field ) + +#define KERN_IS_CLASSIC( valid ) \ + ( KERN_VERSION_CLASSIC == GXV_KERN_DATA( version ) ) +#define KERN_IS_NEW( valid ) \ + ( KERN_VERSION_NEW == GXV_KERN_DATA( version ) ) + +#define KERN_DIALECT( valid ) \ + GXV_KERN_DATA( dialect_request ) +#define KERN_ALLOWS_MS( valid ) \ + ( KERN_DIALECT( valid ) & KERN_DIALECT_MS ) +#define KERN_ALLOWS_APPLE( valid ) \ + ( KERN_DIALECT( valid ) & KERN_DIALECT_APPLE ) + +#define GXV_KERN_HEADER_SIZE ( KERN_IS_NEW( valid ) ? 8 : 4 ) +#define GXV_KERN_SUBTABLE_HEADER_SIZE ( KERN_IS_NEW( valid ) ? 8 : 6 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SUBTABLE VALIDATORS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* ============================= format 0 ============================== */ + + static void + gxv_kern_subtable_fmt0_pairs_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nPairs, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + FT_UShort last_gid_left = 0; + FT_UShort last_gid_right = 0; + + FT_UNUSED( limit ); + + + GXV_NAME_ENTER( "kern format 0 pairs" ); + + for ( i = 0; i < nPairs; i++ ) + { + FT_UShort gid_left; + FT_UShort gid_right; + FT_Short kernValue; + + + /* left */ + gid_left = FT_NEXT_USHORT( p ); + gxv_glyphid_validate( gid_left, valid ); + + /* right */ + gid_right = FT_NEXT_USHORT( p ); + gxv_glyphid_validate( gid_right, valid ); + + /* Pairs of left and right GIDs must be unique and sorted. */ + GXV_TRACE(( "left gid = %u, right gid = %u\n", gid_left, gid_right )); + if ( gid_left == last_gid_left ) + { + if ( last_gid_right < gid_right ) + last_gid_right = gid_right; + else + FT_INVALID_DATA; + } + else if ( last_gid_left < gid_left ) + { + last_gid_left = gid_left; + last_gid_right = gid_right; + } + else + FT_INVALID_DATA; + + /* skip the kern value */ + kernValue = FT_NEXT_SHORT( p ); + } + + GXV_EXIT; + } + + static void + gxv_kern_subtable_fmt0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + + FT_UShort nPairs; + FT_UShort unitSize; + + + GXV_NAME_ENTER( "kern subtable format 0" ); + + unitSize = 2 + 2 + 2; + nPairs = 0; + + /* nPairs, searchRange, entrySelector, rangeShift */ + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + gxv_BinSrchHeader_validate( p, limit, &unitSize, &nPairs, valid ); + p += 2 + 2 + 2 + 2; + + gxv_kern_subtable_fmt0_pairs_validate( p, limit, nPairs, valid ); + + GXV_EXIT; + } + + + /* ============================= format 1 ============================== */ + + + typedef struct GXV_kern_fmt1_StateOptRec_ + { + FT_UShort valueTable; + FT_UShort valueTable_length; + + } GXV_kern_fmt1_StateOptRec, *GXV_kern_fmt1_StateOptRecData; + + + static void + gxv_kern_subtable_fmt1_valueTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + GXV_kern_fmt1_StateOptRecData optdata = + (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->valueTable = FT_NEXT_USHORT( p ); + } + + + /* + * passed tables_size covers whole StateTable, including kern fmt1 header + */ + static void + gxv_kern_subtable_fmt1_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ) + { + FT_UShort o[4]; + FT_UShort *l[4]; + FT_UShort buff[5]; + + GXV_kern_fmt1_StateOptRecData optdata = + (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->valueTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->valueTable_length); + + gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid ); + } + + + /* + * passed table & limit are of whole StateTable, not including subtables + */ + static void + gxv_kern_subtable_fmt1_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort push; + FT_UShort dontAdvance; + FT_UShort valueOffset; + FT_UShort kernAction; + FT_UShort kernValue; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset_p ); + + + push = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + valueOffset = (FT_UShort)( flags & 0x3FFF ); + + { + GXV_kern_fmt1_StateOptRecData vt_rec = + (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata; + FT_Bytes p; + + + if ( valueOffset < vt_rec->valueTable ) + FT_INVALID_OFFSET; + + p = table + valueOffset; + limit = table + vt_rec->valueTable + vt_rec->valueTable_length; + + GXV_LIMIT_CHECK( 2 + 2 ); + kernAction = FT_NEXT_USHORT( p ); + kernValue = FT_NEXT_USHORT( p ); + } + } + + + static void + gxv_kern_subtable_fmt1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + GXV_kern_fmt1_StateOptRec vt_rec; + + + GXV_NAME_ENTER( "kern subtable format 1" ); + + valid->statetable.optdata = + &vt_rec; + valid->statetable.optdata_load_func = + gxv_kern_subtable_fmt1_valueTable_load; + valid->statetable.subtable_setup_func = + gxv_kern_subtable_fmt1_subtable_setup; + valid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_NONE; + valid->statetable.entry_validate_func = + gxv_kern_subtable_fmt1_entry_validate; + + gxv_StateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + + /* ================ Data for Class-Based Subtables 2, 3 ================ */ + + typedef enum GXV_kern_ClassSpec_ + { + GXV_KERN_CLS_L = 0, + GXV_KERN_CLS_R + + } GXV_kern_ClassSpec; + + + /* ============================= format 2 ============================== */ + + /* ---------------------- format 2 specific data ----------------------- */ + + typedef struct GXV_kern_subtable_fmt2_DataRec_ + { + FT_UShort rowWidth; + FT_UShort array; + FT_UShort offset_min[2]; + FT_UShort offset_max[2]; + const FT_String* class_tag[2]; + GXV_odtect_Range odtect; + + } GXV_kern_subtable_fmt2_DataRec, *GXV_kern_subtable_fmt2_Data; + + +#define GXV_KERN_FMT2_DATA( field ) \ + ( ( (GXV_kern_subtable_fmt2_DataRec *) \ + ( GXV_KERN_DATA( subtable_data ) ) )->field ) + + + /* -------------------------- utility functions ----------------------- */ + + static void + gxv_kern_subtable_fmt2_clstbl_validate( FT_Bytes table, + FT_Bytes limit, + GXV_kern_ClassSpec spec, + GXV_Validator valid ) + { + const FT_String* tag = GXV_KERN_FMT2_DATA( class_tag[spec] ); + GXV_odtect_Range odtect = GXV_KERN_FMT2_DATA( odtect ); + + FT_Bytes p = table; + FT_UShort firstGlyph; + FT_UShort nGlyphs; + + + GXV_NAME_ENTER( "kern format 2 classTable" ); + + GXV_LIMIT_CHECK( 2 + 2 ); + firstGlyph = FT_NEXT_USHORT( p ); + nGlyphs = FT_NEXT_USHORT( p ); + GXV_TRACE(( " %s firstGlyph=%d, nGlyphs=%d\n", + tag, firstGlyph, nGlyphs )); + + gxv_glyphid_validate( firstGlyph, valid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), valid ); + + gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ), + &( GXV_KERN_FMT2_DATA( offset_min[spec] ) ), + &( GXV_KERN_FMT2_DATA( offset_max[spec] ) ), + valid ); + + gxv_odtect_add_range( table, 2 * nGlyphs, tag, odtect ); + + GXV_EXIT; + } + + + static void + gxv_kern_subtable_fmt2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + GXV_ODTECT( 3, odtect ); + GXV_kern_subtable_fmt2_DataRec fmt2_rec = + { 0, 0, { 0, 0 }, { 0, 0 }, { "leftClass", "rightClass" }, NULL }; + + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + FT_UShort leftOffsetTable; + FT_UShort rightOffsetTable; + + + GXV_NAME_ENTER( "kern subtable format 2" ); + + GXV_ODTECT_INIT( odtect ); + fmt2_rec.odtect = odtect; + GXV_KERN_DATA( subtable_data ) = &fmt2_rec; + + GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 ); + GXV_KERN_FMT2_DATA( rowWidth ) = FT_NEXT_USHORT( p ); + leftOffsetTable = FT_NEXT_USHORT( p ); + rightOffsetTable = FT_NEXT_USHORT( p ); + GXV_KERN_FMT2_DATA( array ) = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "rowWidth = %d\n", GXV_KERN_FMT2_DATA( rowWidth ) )); + + + GXV_LIMIT_CHECK( leftOffsetTable ); + GXV_LIMIT_CHECK( rightOffsetTable ); + GXV_LIMIT_CHECK( GXV_KERN_FMT2_DATA( array ) ); + + gxv_kern_subtable_fmt2_clstbl_validate( table + leftOffsetTable, limit, + GXV_KERN_CLS_L, valid ); + + gxv_kern_subtable_fmt2_clstbl_validate( table + rightOffsetTable, limit, + GXV_KERN_CLS_R, valid ); + + if ( GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_L] ) + + GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_R] ) + < GXV_KERN_FMT2_DATA( array ) ) + FT_INVALID_OFFSET; + + gxv_odtect_add_range( table + GXV_KERN_FMT2_DATA( array ), + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_L] ) + + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_R] ) + - GXV_KERN_FMT2_DATA( array ), + "array", odtect ); + + gxv_odtect_validate( odtect, valid ); + + GXV_EXIT; + } + + + /* ============================= format 3 ============================== */ + + static void + gxv_kern_subtable_fmt3_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE; + FT_UShort glyphCount; + FT_Byte kernValueCount; + FT_Byte leftClassCount; + FT_Byte rightClassCount; + FT_Byte flags; + + + GXV_NAME_ENTER( "kern subtable format 3" ); + + GXV_LIMIT_CHECK( 2 + 1 + 1 + 1 + 1 ); + glyphCount = FT_NEXT_USHORT( p ); + kernValueCount = FT_NEXT_BYTE( p ); + leftClassCount = FT_NEXT_BYTE( p ); + rightClassCount = FT_NEXT_BYTE( p ); + flags = FT_NEXT_BYTE( p ); + + if ( valid->face->num_glyphs != glyphCount ) + { + GXV_TRACE(( "maxGID=%d, but glyphCount=%d\n", + valid->face->num_glyphs, glyphCount )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + + /* + * just skip kernValue[kernValueCount] + */ + GXV_LIMIT_CHECK( 2 * kernValueCount ); + p += 2 * kernValueCount; + + /* + * check leftClass[gid] < leftClassCount + */ + { + FT_Byte min, max; + + + GXV_LIMIT_CHECK( glyphCount ); + gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid ); + p += valid->subtable_length; + + if ( leftClassCount < max ) + FT_INVALID_DATA; + } + + /* + * check rightClass[gid] < rightClassCount + */ + { + FT_Byte min, max; + + + GXV_LIMIT_CHECK( glyphCount ); + gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid ); + p += valid->subtable_length; + + if ( rightClassCount < max ) + FT_INVALID_DATA; + } + + /* + * check kernIndex[i, j] < kernValueCount + */ + { + FT_UShort i, j; + + + for ( i = 0; i < leftClassCount; i++ ) + { + for ( j = 0; j < rightClassCount; j++ ) + { + GXV_LIMIT_CHECK( 1 ); + if ( kernValueCount < FT_NEXT_BYTE( p ) ) + FT_INVALID_OFFSET; + } + } + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static FT_Bool + gxv_kern_coverage_new_apple_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator valid ) + { + /* new Apple-dialect */ + FT_Bool kernVertical; + FT_Bool kernCrossStream; + FT_Bool kernVariation; + + FT_UNUSED( valid ); + + + /* reserved bits = 0 */ + if ( coverage & 0x1FFC ) + return 0; + + kernVertical = FT_BOOL( ( coverage >> 15 ) & 1 ); + kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 ); + kernVariation = FT_BOOL( ( coverage >> 13 ) & 1 ); + + *format = (FT_UShort)( coverage & 0x0003 ); + + GXV_TRACE(( "new Apple-dialect: " + "horizontal=%d, cross-stream=%d, variation=%d, format=%d\n", + !kernVertical, kernCrossStream, kernVariation, *format )); + + GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" )); + + return 1; + } + + + static FT_Bool + gxv_kern_coverage_classic_apple_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator valid ) + { + /* classic Apple-dialect */ + FT_Bool horizontal; + FT_Bool cross_stream; + + + /* check expected flags, but don't check if MS-dialect is impossible */ + if ( !( coverage & 0xFD00 ) && KERN_ALLOWS_MS( valid ) ) + return 0; + + /* reserved bits = 0 */ + if ( coverage & 0x02FC ) + return 0; + + horizontal = FT_BOOL( ( coverage >> 15 ) & 1 ); + cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 ); + + *format = (FT_UShort)( coverage & 0x0003 ); + + GXV_TRACE(( "classic Apple-dialect: " + "horizontal=%d, cross-stream=%d, format=%d\n", + horizontal, cross_stream, *format )); + + /* format 1 requires GX State Machine, too new for classic */ + if ( *format == 1 ) + return 0; + + GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" )); + + return 1; + } + + + static FT_Bool + gxv_kern_coverage_classic_microsoft_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator valid ) + { + /* classic Microsoft-dialect */ + FT_Bool horizontal; + FT_Bool minimum; + FT_Bool cross_stream; + FT_Bool override; + + FT_UNUSED( valid ); + + + /* reserved bits = 0 */ + if ( coverage & 0xFDF0 ) + return 0; + + horizontal = FT_BOOL( coverage & 1 ); + minimum = FT_BOOL( ( coverage >> 1 ) & 1 ); + cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 ); + override = FT_BOOL( ( coverage >> 3 ) & 1 ); + + *format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 ); + + GXV_TRACE(( "classic Microsoft-dialect: " + "horizontal=%d, minimum=%d, cross-stream=%d, " + "override=%d, format=%d\n", + horizontal, minimum, cross_stream, override, *format )); + + if ( *format == 2 ) + GXV_TRACE(( + "kerning values in Microsoft format 2 subtable are ignored\n" )); + + return 1; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MAIN *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static GXV_kern_Dialect + gxv_kern_coverage_validate( FT_UShort coverage, + FT_UShort* format, + GXV_Validator valid ) + { + GXV_kern_Dialect result = KERN_DIALECT_UNKNOWN; + + + GXV_NAME_ENTER( "validating coverage" ); + + GXV_TRACE(( "interprete coverage 0x%04x by Apple style\n", coverage )); + + if ( KERN_IS_NEW( valid ) ) + { + if ( gxv_kern_coverage_new_apple_validate( coverage, + format, + valid ) ) + { + result = KERN_DIALECT_APPLE; + goto Exit; + } + } + + if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_APPLE( valid ) ) + { + if ( gxv_kern_coverage_classic_apple_validate( coverage, + format, + valid ) ) + { + result = KERN_DIALECT_APPLE; + goto Exit; + } + } + + if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_MS( valid ) ) + { + if ( gxv_kern_coverage_classic_microsoft_validate( coverage, + format, + valid ) ) + { + result = KERN_DIALECT_MS; + goto Exit; + } + } + + GXV_TRACE(( "cannot interprete coverage, broken kern subtable\n" )); + + Exit: + GXV_EXIT; + return result; + } + + + static void + gxv_kern_subtable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort version = 0; /* MS only: subtable version, unused */ + FT_ULong length; /* MS: 16bit, Apple: 32bit*/ + FT_UShort coverage; + FT_UShort tupleIndex = 0; /* Apple only */ + FT_UShort u16[2]; + FT_UShort format = 255; /* subtable format */ + + + GXV_NAME_ENTER( "kern subtable" ); + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + u16[0] = FT_NEXT_USHORT( p ); /* Apple: length_hi MS: version */ + u16[1] = FT_NEXT_USHORT( p ); /* Apple: length_lo MS: length */ + coverage = FT_NEXT_USHORT( p ); + + switch ( gxv_kern_coverage_validate( coverage, &format, valid ) ) + { + case KERN_DIALECT_MS: + version = u16[0]; + length = u16[1]; + tupleIndex = 0; + GXV_TRACE(( "Subtable version = %d\n", version )); + GXV_TRACE(( "Subtable length = %d\n", length )); + break; + + case KERN_DIALECT_APPLE: + version = 0; + length = ( u16[0] << 16 ) + u16[1]; + tupleIndex = 0; + GXV_TRACE(( "Subtable length = %d\n", length )); + + if ( KERN_IS_NEW( valid ) ) + { + GXV_LIMIT_CHECK( 2 ); + tupleIndex = FT_NEXT_USHORT( p ); + GXV_TRACE(( "Subtable tupleIndex = %d\n", tupleIndex )); + } + break; + + default: + length = u16[1]; + GXV_TRACE(( "cannot detect subtable dialect, " + "just skip %d byte\n", length )); + goto Exit; + } + + /* formats 1, 2, 3 require the position of the start of this subtable */ + if ( format == 0 ) + gxv_kern_subtable_fmt0_validate( table, table + length, valid ); + else if ( format == 1 ) + gxv_kern_subtable_fmt1_validate( table, table + length, valid ); + else if ( format == 2 ) + gxv_kern_subtable_fmt2_validate( table, table + length, valid ); + else if ( format == 3 ) + gxv_kern_subtable_fmt3_validate( table, table + length, valid ); + else + FT_INVALID_DATA; + + Exit: + valid->subtable_length = length; + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** kern TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_kern_validate_generic( FT_Bytes table, + FT_Face face, + FT_Bool classic_only, + GXV_kern_Dialect dialect_request, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_kern_DataRec kernrec; + GXV_kern_Data kern = &kernrec; + + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong nTables = 0; + FT_UInt i; + + + valid->root = ftvalid; + valid->table_data = kern; + valid->face = face; + + FT_TRACE3(( "validating `kern' table\n" )); + GXV_INIT; + KERN_DIALECT( valid ) = dialect_request; + + GXV_LIMIT_CHECK( 2 ); + GXV_KERN_DATA( version ) = (GXV_kern_Version)FT_NEXT_USHORT( p ); + GXV_TRACE(( "version 0x%04x (higher 16bit)\n", + GXV_KERN_DATA( version ) )); + + if ( 0x0001 < GXV_KERN_DATA( version ) ) + FT_INVALID_FORMAT; + else if ( KERN_IS_CLASSIC( valid ) ) + { + GXV_LIMIT_CHECK( 2 ); + nTables = FT_NEXT_USHORT( p ); + } + else if ( KERN_IS_NEW( valid ) ) + { + if ( classic_only ) + FT_INVALID_FORMAT; + + if ( 0x0000 != FT_NEXT_USHORT( p ) ) + FT_INVALID_FORMAT; + + GXV_LIMIT_CHECK( 4 ); + nTables = FT_NEXT_ULONG( p ); + } + + for ( i = 0; i < nTables; i++ ) + { + GXV_TRACE(( "validating subtable %d/%d\n", i, nTables )); + /* p should be 32bit-aligned? */ + gxv_kern_subtable_validate( p, 0, valid ); + p += valid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + + FT_LOCAL_DEF( void ) + gxv_kern_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + gxv_kern_validate_generic( table, face, 0, KERN_DIALECT_ANY, ftvalid ); + } + + + FT_LOCAL_DEF( void ) + gxv_kern_validate_classic( FT_Bytes table, + FT_Face face, + FT_Int dialect_flags, + FT_Validator ftvalid ) + { + GXV_kern_Dialect dialect_request; + + + dialect_request = (GXV_kern_Dialect)dialect_flags; + gxv_kern_validate_generic( table, face, 1, dialect_request, ftvalid ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvlcar.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvlcar.c new file mode 100644 index 000000000..f14fa5b13 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvlcar.c @@ -0,0 +1,223 @@ +/***************************************************************************/ +/* */ +/* gxvlcar.c */ +/* */ +/* TrueTypeGX/AAT lcar table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvlcar + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_lcar_DataRec_ + { + FT_UShort format; + + } GXV_lcar_DataRec, *GXV_lcar_Data; + + +#define GXV_LCAR_DATA( FIELD ) GXV_TABLE_DATA( lcar, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_lcar_partial_validate( FT_UShort partial, + FT_UShort glyph, + GXV_Validator valid ) + { + GXV_NAME_ENTER( "partial" ); + + if ( GXV_LCAR_DATA( format ) != 1 ) + goto Exit; + + gxv_ctlPoint_validate( glyph, partial, valid ); + + Exit: + GXV_EXIT; + } + + + static void + gxv_lcar_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + FT_Bytes p = valid->root->base + value_p->u; + FT_Bytes limit = valid->root->limit; + FT_UShort count; + FT_Short partial; + FT_UShort i; + + + GXV_NAME_ENTER( "element in lookupTable" ); + + GXV_LIMIT_CHECK( 2 ); + count = FT_NEXT_USHORT( p ); + + GXV_LIMIT_CHECK( 2 * count ); + for ( i = 0; i < count; i++ ) + { + partial = FT_NEXT_SHORT( p ); + gxv_lcar_partial_validate( partial, glyph, valid ); + } + + GXV_EXIT; + } + + + /* + +------ lcar --------------------+ + | | + | +===============+ | + | | looup header | | + | +===============+ | + | | BinSrchHeader | | + | +===============+ | + | | lastGlyph[0] | | + | +---------------+ | + | | firstGlyph[0] | | head of lcar sfnt table + | +---------------+ | + + | | offset[0] | -> | offset [byte] + | +===============+ | + + | | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + | +---------------+ | + | | firstGlyph[1] | | + | +---------------+ | + | | offset[1] | | + | +===============+ | + | | + | .... | + | | + | 16bit value array | + | +===============+ | + +------| value | <-------+ + | .... + | + | + | + | + | + +----> lcar values...handled by lcar callback function + */ + + static GXV_LookupValueDesc + gxv_lcar_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + FT_UNUSED( lookuptbl_limit ); + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + p = valid->root->base + offset; + limit = valid->root->limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** lcar TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_lcar_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_lcar_DataRec lcarrec; + GXV_lcar_Data lcar = &lcarrec; + + FT_Fixed version; + + + valid->root = ftvalid; + valid->table_data = lcar; + valid->face = face; + + FT_TRACE3(( "validating `lcar' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 ); + version = FT_NEXT_ULONG( p ); + GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p ); + + if ( version != 0x00010000UL) + FT_INVALID_FORMAT; + + if ( GXV_LCAR_DATA( format ) > 1 ) + FT_INVALID_FORMAT; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_lcar_LookupValue_validate; + valid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit; + gxv_LookupTable_validate( p, limit, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmod.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmod.c new file mode 100644 index 000000000..b2b16b1ff --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmod.c @@ -0,0 +1,285 @@ +/***************************************************************************/ +/* */ +/* gxvmod.c */ +/* */ +/* FreeType's TrueTypeGX/AAT validation module implementation (body). */ +/* */ +/* Copyright 2004, 2005, 2006 */ +/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H +#include FT_GX_VALIDATE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_GX_VALIDATE_H + +#include "gxvmod.h" +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmodule + + + static FT_Error + gxv_load_table( FT_Face face, + FT_Tag tag, + FT_Byte* volatile* table, + FT_ULong* table_len ) + { + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len ); + if ( error == GXV_Err_Table_Missing ) + return GXV_Err_Ok; + if ( error ) + goto Exit; + + if ( FT_ALLOC( *table, *table_len ) ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len ); + + Exit: + return error; + } + + +#define GXV_TABLE_DECL( _sfnt ) \ + FT_Byte* volatile _sfnt = NULL; \ + FT_ULong len_ ## _sfnt = 0 + +#define GXV_TABLE_LOAD( _sfnt ) \ + if ( ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) && \ + ( gx_flags & FT_VALIDATE_ ## _sfnt ) ) \ + { \ + error = gxv_load_table( face, TTAG_ ## _sfnt, \ + &_sfnt, &len_ ## _sfnt ); \ + if ( error ) \ + goto Exit; \ + } + +#define GXV_TABLE_VALIDATE( _sfnt ) \ + if ( _sfnt ) \ + { \ + ft_validator_init( &valid, _sfnt, _sfnt + len_ ## _sfnt, \ + FT_VALIDATE_DEFAULT ); \ + if ( ft_setjmp( valid.jump_buffer ) == 0 ) \ + gxv_ ## _sfnt ## _validate( _sfnt, face, &valid ); \ + error = valid.error; \ + if ( error ) \ + goto Exit; \ + } + +#define GXV_TABLE_SET( _sfnt ) \ + if ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) \ + tables[FT_VALIDATE_ ## _sfnt ## _INDEX] = (FT_Bytes)_sfnt + + + static FT_Error + gxv_validate( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_count ) + { + FT_Memory volatile memory = FT_FACE_MEMORY( face ); + + FT_Error error = GXV_Err_Ok; + FT_ValidatorRec volatile valid; + + FT_UInt i; + + + GXV_TABLE_DECL( feat ); + GXV_TABLE_DECL( bsln ); + GXV_TABLE_DECL( trak ); + GXV_TABLE_DECL( just ); + GXV_TABLE_DECL( mort ); + GXV_TABLE_DECL( morx ); + GXV_TABLE_DECL( kern ); + GXV_TABLE_DECL( opbd ); + GXV_TABLE_DECL( prop ); + GXV_TABLE_DECL( lcar ); + + for ( i = 0; i < table_count; i++ ) + tables[i] = 0; + + /* load tables */ + GXV_TABLE_LOAD( feat ); + GXV_TABLE_LOAD( bsln ); + GXV_TABLE_LOAD( trak ); + GXV_TABLE_LOAD( just ); + GXV_TABLE_LOAD( mort ); + GXV_TABLE_LOAD( morx ); + GXV_TABLE_LOAD( kern ); + GXV_TABLE_LOAD( opbd ); + GXV_TABLE_LOAD( prop ); + GXV_TABLE_LOAD( lcar ); + + /* validate tables */ + GXV_TABLE_VALIDATE( feat ); + GXV_TABLE_VALIDATE( bsln ); + GXV_TABLE_VALIDATE( trak ); + GXV_TABLE_VALIDATE( just ); + GXV_TABLE_VALIDATE( mort ); + GXV_TABLE_VALIDATE( morx ); + GXV_TABLE_VALIDATE( kern ); + GXV_TABLE_VALIDATE( opbd ); + GXV_TABLE_VALIDATE( prop ); + GXV_TABLE_VALIDATE( lcar ); + + /* Set results */ + GXV_TABLE_SET( feat ); + GXV_TABLE_SET( mort ); + GXV_TABLE_SET( morx ); + GXV_TABLE_SET( bsln ); + GXV_TABLE_SET( just ); + GXV_TABLE_SET( kern ); + GXV_TABLE_SET( opbd ); + GXV_TABLE_SET( trak ); + GXV_TABLE_SET( prop ); + GXV_TABLE_SET( lcar ); + + Exit: + if ( error ) + { + FT_FREE( feat ); + FT_FREE( bsln ); + FT_FREE( trak ); + FT_FREE( just ); + FT_FREE( mort ); + FT_FREE( morx ); + FT_FREE( kern ); + FT_FREE( opbd ); + FT_FREE( prop ); + FT_FREE( lcar ); + } + + return error; + } + + + static FT_Error + classic_kern_validate( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes* ckern_table ) + { + FT_Memory volatile memory = FT_FACE_MEMORY( face ); + + FT_Byte* volatile ckern = NULL; + FT_ULong len_ckern = 0; + + /* without volatile on `error' GCC 4.1.1. emits: */ + /* warning: variable 'error' might be clobbered by 'longjmp' or 'vfork' */ + /* this warning seems spurious but --- */ + FT_Error volatile error = GXV_Err_Ok; + FT_ValidatorRec volatile valid; + + + *ckern_table = NULL; + + error = gxv_load_table( face, TTAG_kern, &ckern, &len_ckern ); + if ( error ) + goto Exit; + + if ( ckern ) + { + ft_validator_init( &valid, ckern, ckern + len_ckern, + FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + gxv_kern_validate_classic( ckern, face, + ckern_flags & FT_VALIDATE_CKERN, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + *ckern_table = ckern; + + Exit: + if ( error ) + FT_FREE( ckern ); + + return error; + } + + + static + const FT_Service_GXvalidateRec gxvalid_interface = + { + gxv_validate + }; + + + static + const FT_Service_CKERNvalidateRec ckernvalid_interface = + { + classic_kern_validate + }; + + + static + const FT_ServiceDescRec gxvalid_services[] = + { + { FT_SERVICE_ID_GX_VALIDATE, &gxvalid_interface }, + { FT_SERVICE_ID_CLASSICKERN_VALIDATE, &ckernvalid_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + gxvalid_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( gxvalid_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class gxv_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "gxvalid", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) gxvalid_get_service + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmod.h b/alienblaster/project/jni/freetype/src/gxvalid/gxvmod.h new file mode 100644 index 000000000..d912a8f83 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmod.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* gxvmod.h */ +/* */ +/* FreeType's TrueTypeGX/AAT validation module implementation */ +/* (specification). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVMOD_H__ +#define __GXVMOD_H__ + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_EXPORT_VAR( const FT_Module_Class ) gxv_module_class; + + +FT_END_HEADER + +#endif /* __GXVMOD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmort.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort.c new file mode 100644 index 000000000..0aa066339 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort.c @@ -0,0 +1,285 @@ +/***************************************************************************/ +/* */ +/* gxvmort.c */ +/* */ +/* TrueTypeGX/AAT mort table validation (body). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" +#include "gxvfeat.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + static void + gxv_mort_feature_validate( GXV_mort_feature f, + GXV_Validator valid ) + { + if ( f->featureType >= gxv_feat_registry_length ) + { + GXV_TRACE(( "featureType %d is out of registered range, " + "setting %d is unchecked\n", + f->featureType, f->featureSetting )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + else if ( !gxv_feat_registry[f->featureType].existence ) + { + GXV_TRACE(( "featureType %d is within registered area " + "but undefined, setting %d is unchecked\n", + f->featureType, f->featureSetting )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + else + { + FT_Byte nSettings_max; + + + /* nSettings in gxvfeat.c is halved for exclusive on/off settings */ + nSettings_max = gxv_feat_registry[f->featureType].nSettings; + if ( gxv_feat_registry[f->featureType].exclusive ) + nSettings_max = (FT_Byte)( 2 * nSettings_max ); + + GXV_TRACE(( "featureType %d is registered", f->featureType )); + GXV_TRACE(( "setting %d", f->featureSetting )); + + if ( f->featureSetting > nSettings_max ) + { + GXV_TRACE(( "out of defined range %d", nSettings_max )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + GXV_TRACE(( "\n" )); + } + + /* TODO: enableFlags must be unique value in specified chain? */ + } + + + /* + * nFeatureFlags is typed to FT_ULong to accept that in + * mort (typed FT_UShort) and morx (typed FT_ULong). + */ + FT_LOCAL_DEF( void ) + gxv_mort_featurearray_validate( FT_Bytes table, + FT_Bytes limit, + FT_ULong nFeatureFlags, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong i; + + GXV_mort_featureRec f = GXV_MORT_FEATURE_OFF; + + + GXV_NAME_ENTER( "mort feature list" ); + for ( i = 0; i < nFeatureFlags; i++ ) + { + GXV_LIMIT_CHECK( 2 + 2 + 4 + 4 ); + f.featureType = FT_NEXT_USHORT( p ); + f.featureSetting = FT_NEXT_USHORT( p ); + f.enableFlags = FT_NEXT_ULONG( p ); + f.disableFlags = FT_NEXT_ULONG( p ); + + gxv_mort_feature_validate( &f, valid ); + } + + if ( !IS_GXV_MORT_FEATURE_OFF( f ) ) + FT_INVALID_DATA; + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_coverage_validate( FT_UShort coverage, + GXV_Validator valid ) + { + FT_UNUSED( valid ); + + if ( coverage & 0x8000U ) + GXV_TRACE(( " this subtable is for vertical text only\n" )); + else + GXV_TRACE(( " this subtable is for horizontal text only\n" )); + + if ( coverage & 0x4000 ) + GXV_TRACE(( " this subtable is applied to glyph array " + "in descending order\n" )); + else + GXV_TRACE(( " this subtable is applied to glyph array " + "in ascending order\n" )); + + if ( coverage & 0x2000 ) + GXV_TRACE(( " this subtable is forcibly applied to " + "vertical/horizontal text\n" )); + + if ( coverage & 0x1FF8 ) + GXV_TRACE(( " coverage has non-zero bits in reserved area\n" )); + } + + + static void + gxv_mort_subtables_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nSubtables, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_mort_subtable_type0_validate, /* 0 */ + gxv_mort_subtable_type1_validate, /* 1 */ + gxv_mort_subtable_type2_validate, /* 2 */ + NULL, /* 3 */ + gxv_mort_subtable_type4_validate, /* 4 */ + gxv_mort_subtable_type5_validate, /* 5 */ + + }; + + GXV_Validate_Func func; + FT_UShort i; + + + GXV_NAME_ENTER( "subtables in a chain" ); + + for ( i = 0; i < nSubtables; i++ ) + { + FT_UShort length; + FT_UShort coverage; + FT_ULong subFeatureFlags; + FT_UInt type; + FT_UInt rest; + + + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + subFeatureFlags = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n", + i + 1, nSubtables, length )); + type = coverage & 0x0007; + rest = length - ( 2 + 2 + 4 ); + + GXV_LIMIT_CHECK( rest ); + gxv_mort_coverage_validate( coverage, valid ); + + if ( type > 5 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[type]; + if ( func == NULL ) + GXV_TRACE(( "morx type %d is reserved\n", type )); + + func( p, p + rest, valid ); + + p += rest; + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_mort_chain_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong defaultFlags; + FT_ULong chainLength; + FT_UShort nFeatureFlags; + FT_UShort nSubtables; + + + GXV_NAME_ENTER( "mort chain header" ); + + GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 ); + defaultFlags = FT_NEXT_ULONG( p ); + chainLength = FT_NEXT_ULONG( p ); + nFeatureFlags = FT_NEXT_USHORT( p ); + nSubtables = FT_NEXT_USHORT( p ); + + gxv_mort_featurearray_validate( p, table + chainLength, + nFeatureFlags, valid ); + p += valid->subtable_length; + gxv_mort_subtables_validate( p, table + chainLength, nSubtables, valid ); + valid->subtable_length = chainLength; + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_ULong version; + FT_ULong nChains; + FT_ULong i; + + + valid->root = ftvalid; + valid->face = face; + limit = valid->root->limit; + + FT_TRACE3(( "validating `mort' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 4 ); + version = FT_NEXT_ULONG( p ); + nChains = FT_NEXT_ULONG( p ); + + if (version != 0x00010000UL) + FT_INVALID_FORMAT; + + for ( i = 0; i < nChains; i++ ) + { + GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains )); + GXV_32BIT_ALIGNMENT_VALIDATE( p - table ); + gxv_mort_chain_validate( p, limit, valid ); + p += valid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmort.h b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort.h new file mode 100644 index 000000000..1e5a1f5ab --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort.h @@ -0,0 +1,93 @@ +/***************************************************************************/ +/* */ +/* gxvmort.h */ +/* */ +/* TrueTypeGX/AAT common definition for mort table (specification). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVMORT_H__ +#define __GXVMORT_H__ + +#include "gxvalid.h" +#include "gxvcommn.h" + +#include FT_SFNT_NAMES_H + + + typedef struct GXV_mort_featureRec_ + { + FT_UShort featureType; + FT_UShort featureSetting; + FT_ULong enableFlags; + FT_ULong disableFlags; + + } GXV_mort_featureRec, *GXV_mort_feature; + +#define GXV_MORT_FEATURE_OFF {0, 1, 0x00000000UL, 0x00000000UL} + +#define IS_GXV_MORT_FEATURE_OFF( f ) \ + ( (f).featureType == 0 || \ + (f).featureSetting == 1 || \ + (f).enableFlags == 0x00000000UL || \ + (f).disableFlags == 0x00000000UL ) + + + FT_LOCAL( void ) + gxv_mort_featurearray_validate( FT_Bytes table, + FT_Bytes limit, + FT_ULong nFeatureFlags, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_coverage_validate( FT_UShort coverage, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_mort_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + +#endif /* __GXVMORT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmort0.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort0.c new file mode 100644 index 000000000..0453062f6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort0.c @@ -0,0 +1,137 @@ +/***************************************************************************/ +/* */ +/* gxvmort0.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type0 (Indic Script Rearrangement) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + static const char* GXV_Mort_IndicScript_Msg[] = + { + "no change", + "Ax => xA", + "xD => Dx", + "AxD => DxA", + "ABx => xAB", + "ABx => xBA", + "xCD => CDx", + "xCD => DCx", + "AxCD => CDxA", + "AxCD => DCxA", + "ABxD => DxAB", + "ABxD => DxBA", + "ABxCD => CDxAB", + "ABxCD => CDxBA", + "ABxCD => DCxAB", + "ABxCD => DCxBA", + + }; + + + static void + gxv_mort_subtable_type0_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort markFirst; + FT_UShort dontAdvance; + FT_UShort markLast; + FT_UShort reserved; + FT_UShort verb = 0; + + FT_UNUSED( state ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */ + FT_UNUSED( glyphOffset_p ); /* case */ + + + markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FF0 ); + verb = (FT_UShort)( flags & 0x000F ); + + GXV_TRACE(( " IndicScript MorphRule for glyphOffset 0x%04x", + glyphOffset_p->u )); + GXV_TRACE(( " markFirst=%01d", markFirst )); + GXV_TRACE(( " dontAdvance=%01d", dontAdvance )); + GXV_TRACE(( " markLast=%01d", markLast )); + GXV_TRACE(( " %02d", verb )); + GXV_TRACE(( " %s\n", GXV_Mort_IndicScript_Msg[verb] )); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + FT_INVALID_DATA; + } + else + GXV_TRACE(( "\n" )); + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( + "mort chain subtable type0 (Indic-Script Rearrangement)" ); + + GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE ); + + valid->statetable.optdata = NULL; + valid->statetable.optdata_load_func = NULL; + valid->statetable.subtable_setup_func = NULL; + valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + valid->statetable.entry_validate_func = + gxv_mort_subtable_type0_entry_validate; + + gxv_StateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmort1.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort1.c new file mode 100644 index 000000000..696d85032 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort1.c @@ -0,0 +1,258 @@ +/***************************************************************************/ +/* */ +/* gxvmort1.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type1 (Contextual Substitution) subtable. */ +/* */ +/* Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + typedef struct GXV_mort_subtable_type1_StateOptRec_ + { + FT_UShort substitutionTable; + FT_UShort substitutionTable_length; + + } GXV_mort_subtable_type1_StateOptRec, + *GXV_mort_subtable_type1_StateOptRecData; + +#define GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 ) + + + static void + gxv_mort_subtable_type1_substitutionTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type1_StateOptRecData optdata = + (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->substitutionTable = FT_NEXT_USHORT( p ); + } + + + static void + gxv_mort_subtable_type1_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ) + { + FT_UShort o[4]; + FT_UShort *l[4]; + FT_UShort buff[5]; + + GXV_mort_subtable_type1_StateOptRecData optdata = + (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->substitutionTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &( optdata->substitutionTable_length ); + + gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid ); + } + + + static void + gxv_mort_subtable_type1_offset_to_subst_validate( + FT_Short wordOffset, + const FT_String* tag, + FT_Byte state, + GXV_Validator valid ) + { + FT_UShort substTable; + FT_UShort substTable_limit; + FT_UShort min_gid; + FT_UShort max_gid; + + FT_UNUSED( tag ); + FT_UNUSED( state ); + + + substTable = + ((GXV_mort_subtable_type1_StateOptRec *) + (valid->statetable.optdata))->substitutionTable; + substTable_limit = + (FT_UShort)( substTable + + ((GXV_mort_subtable_type1_StateOptRec *) + (valid->statetable.optdata))->substitutionTable_length ); + + min_gid = (FT_UShort)( ( substTable - wordOffset * 2 ) / 2 ); + max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 ); + max_gid = (FT_UShort)( FT_MAX( max_gid, valid->face->num_glyphs ) ); + + /* XXX: check range? */ + + /* TODO: min_gid & max_gid comparison with ClassTable contents */ + } + + + static void + gxv_mort_subtable_type1_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setMark; + FT_UShort dontAdvance; + FT_UShort reserved; + FT_Short markOffset; + FT_Short currentOffset; + + FT_UNUSED( table ); + FT_UNUSED( limit ); + + + setMark = (FT_UShort)( flags >> 15 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + reserved = (FT_Short)( flags & 0x3FFF ); + + markOffset = (FT_Short)( glyphOffset_p->ul >> 16 ); + currentOffset = (FT_Short)( glyphOffset_p->ul ); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + + gxv_mort_subtable_type1_offset_to_subst_validate( markOffset, + "markOffset", + state, + valid ); + + gxv_mort_subtable_type1_offset_to_subst_validate( currentOffset, + "currentOffset", + state, + valid ); + } + + + static void + gxv_mort_subtable_type1_substTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort num_gids = (FT_UShort)( + ((GXV_mort_subtable_type1_StateOptRec *) + (valid->statetable.optdata))->substitutionTable_length / 2 ); + FT_UShort i; + + + GXV_NAME_ENTER( "validating contents of substitutionTable" ); + for ( i = 0; i < num_gids ; i ++ ) + { + FT_UShort dst_gid; + + + GXV_LIMIT_CHECK( 2 ); + dst_gid = FT_NEXT_USHORT( p ); + + if ( dst_gid >= 0xFFFFU ) + continue; + + if ( dst_gid > valid->face->num_glyphs ) + { + GXV_TRACE(( "substTable include too large gid[%d]=%d >" + " max defined gid #%d\n", + i, dst_gid, valid->face->num_glyphs )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_GLYPH_ID; + } + } + + GXV_EXIT; + } + + + /* + * subtable for Contextual glyph substitution is a modified StateTable. + * In addition to classTable, stateArray, and entryTable, the field + * `substitutionTable' is added. + */ + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type1_StateOptRec st_rec; + + + GXV_NAME_ENTER( "mort chain subtable type1 (Contextual Glyph Subst)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE ); + + valid->statetable.optdata = + &st_rec; + valid->statetable.optdata_load_func = + gxv_mort_subtable_type1_substitutionTable_load; + valid->statetable.subtable_setup_func = + gxv_mort_subtable_type1_subtable_setup; + valid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->statetable.entry_validate_func = + + gxv_mort_subtable_type1_entry_validate; + gxv_StateTable_validate( p, limit, valid ); + + gxv_mort_subtable_type1_substTable_validate( + table + st_rec.substitutionTable, + table + st_rec.substitutionTable + st_rec.substitutionTable_length, + valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmort2.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort2.c new file mode 100644 index 000000000..6f77cf39c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort2.c @@ -0,0 +1,282 @@ +/***************************************************************************/ +/* */ +/* gxvmort2.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type2 (Ligature Substitution) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + typedef struct GXV_mort_subtable_type2_StateOptRec_ + { + FT_UShort ligActionTable; + FT_UShort componentTable; + FT_UShort ligatureTable; + FT_UShort ligActionTable_length; + FT_UShort componentTable_length; + FT_UShort ligatureTable_length; + + } GXV_mort_subtable_type2_StateOptRec, + *GXV_mort_subtable_type2_StateOptRecData; + +#define GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 + 2 + 2 ) + + + static void + gxv_mort_subtable_type2_opttable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata; + + + GXV_LIMIT_CHECK( 2 + 2 + 2 ); + optdata->ligActionTable = FT_NEXT_USHORT( p ); + optdata->componentTable = FT_NEXT_USHORT( p ); + optdata->ligatureTable = FT_NEXT_USHORT( p ); + + GXV_TRACE(( "offset to ligActionTable=0x%04x\n", + optdata->ligActionTable )); + GXV_TRACE(( "offset to componentTable=0x%04x\n", + optdata->componentTable )); + GXV_TRACE(( "offset to ligatureTable=0x%04x\n", + optdata->ligatureTable )); + } + + + static void + gxv_mort_subtable_type2_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort *classTable_length_p, + FT_UShort *stateArray_length_p, + FT_UShort *entryTable_length_p, + GXV_Validator valid ) + { + FT_UShort o[6]; + FT_UShort *l[6]; + FT_UShort buff[7]; + + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata; + + + GXV_NAME_ENTER( "subtable boundaries setup" ); + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->ligActionTable; + o[4] = optdata->componentTable; + o[5] = optdata->ligatureTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->ligActionTable_length); + l[4] = &(optdata->componentTable_length); + l[5] = &(optdata->ligatureTable_length); + + gxv_set_length_by_ushort_offset( o, l, buff, 6, table_size, valid ); + + GXV_TRACE(( "classTable: offset=0x%04x length=0x%04x\n", + classTable, *classTable_length_p )); + GXV_TRACE(( "stateArray: offset=0x%04x length=0x%04x\n", + stateArray, *stateArray_length_p )); + GXV_TRACE(( "entryTable: offset=0x%04x length=0x%04x\n", + entryTable, *entryTable_length_p )); + GXV_TRACE(( "ligActionTable: offset=0x%04x length=0x%04x\n", + optdata->ligActionTable, + optdata->ligActionTable_length )); + GXV_TRACE(( "componentTable: offset=0x%04x length=0x%04x\n", + optdata->componentTable, + optdata->componentTable_length )); + GXV_TRACE(( "ligatureTable: offset=0x%04x length=0x%04x\n", + optdata->ligatureTable, + optdata->ligatureTable_length )); + + GXV_EXIT; + } + + + static void + gxv_mort_subtable_type2_ligActionOffset_validate( + FT_Bytes table, + FT_UShort ligActionOffset, + GXV_Validator valid ) + { + /* access ligActionTable */ + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata; + + FT_Bytes lat_base = table + optdata->ligActionTable; + FT_Bytes p = table + ligActionOffset; + FT_Bytes lat_limit = lat_base + optdata->ligActionTable; + + + GXV_32BIT_ALIGNMENT_VALIDATE( ligActionOffset ); + if ( p < lat_base ) + { + GXV_TRACE(( "too short offset 0x%04x: p < lat_base (%d byte rewind)\n", + ligActionOffset, lat_base - p )); + + /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */ + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + } + else if ( lat_limit < p ) + { + GXV_TRACE(( "too large offset 0x%04x: lat_limit < p (%d byte overrun)\n", + ligActionOffset, p - lat_limit )); + + /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */ + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_OFFSET; + } + else + { + /* validate entry in ligActionTable */ + FT_ULong lig_action; + FT_UShort last; + FT_UShort store; + FT_ULong offset; + + + lig_action = FT_NEXT_ULONG( p ); + last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); + store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); + + offset = lig_action & 0x3FFFFFFFUL; + } + } + + + static void + gxv_mort_subtable_type2_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setComponent; + FT_UShort dontAdvance; + FT_UShort offset; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset_p ); + FT_UNUSED( limit ); + + + setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + + offset = (FT_UShort)( flags & 0x3FFFU ); + + if ( 0 < offset ) + gxv_mort_subtable_type2_ligActionOffset_validate( table, offset, + valid ); + } + + + static void + gxv_mort_subtable_type2_ligatureTable_validate( FT_Bytes table, + GXV_Validator valid ) + { + GXV_mort_subtable_type2_StateOptRecData optdata = + (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata; + + FT_Bytes p = table + optdata->ligatureTable; + FT_Bytes limit = table + optdata->ligatureTable + + optdata->ligatureTable_length; + + + GXV_NAME_ENTER( "mort chain subtable type2 - substitutionTable" ); + if ( 0 != optdata->ligatureTable ) + { + /* Apple does not give specification of ligatureTable format */ + while ( p < limit ) + { + FT_UShort lig_gid; + + + GXV_LIMIT_CHECK( 2 ); + lig_gid = FT_NEXT_USHORT( p ); + } + } + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type2_StateOptRec lig_rec; + + + GXV_NAME_ENTER( "mort chain subtable type2 (Ligature Substitution)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE ); + + valid->statetable.optdata = + &lig_rec; + valid->statetable.optdata_load_func = + gxv_mort_subtable_type2_opttable_load; + valid->statetable.subtable_setup_func = + gxv_mort_subtable_type2_subtable_setup; + valid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_NONE; + valid->statetable.entry_validate_func = + gxv_mort_subtable_type2_entry_validate; + + gxv_StateTable_validate( p, limit, valid ); + + p += valid->subtable_length; + gxv_mort_subtable_type2_ligatureTable_validate( table, valid ); + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmort4.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort4.c new file mode 100644 index 000000000..83470988c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort4.c @@ -0,0 +1,125 @@ +/***************************************************************************/ +/* */ +/* gxvmort4.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type4 (Non-Contextual Glyph Substitution) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + static void + gxv_mort_subtable_type4_lookupval_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); + + gxv_glyphid_validate( value_p->u, valid ); + } + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 16bit value array | + +===============+ | + | value | <-------+ + .... + */ + + static GXV_LookupValueDesc + gxv_mort_subtable_type4_lookupfmt4_transit( + FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( "mort chain subtable type4 " + "(Non-Contextual Glyph Substitution)" ); + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_mort_subtable_type4_lookupval_validate; + valid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit; + + gxv_LookupTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmort5.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort5.c new file mode 100644 index 000000000..ec0bcb634 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmort5.c @@ -0,0 +1,226 @@ +/***************************************************************************/ +/* */ +/* gxvmort5.c */ +/* */ +/* TrueTypeGX/AAT mort table validation */ +/* body for type5 (Contextual Glyph Insertion) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmort.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmort + + + /* + * mort subtable type5 (Contextual Glyph Insertion) + * has the format of StateTable with insertion-glyph-list, + * but without name. The offset is given by glyphOffset in + * entryTable. There is no table location declaration + * like xxxTable. + */ + + typedef struct GXV_mort_subtable_type5_StateOptRec_ + { + FT_UShort classTable; + FT_UShort stateArray; + FT_UShort entryTable; + +#define GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE GXV_STATETABLE_HEADER_SIZE + + FT_UShort* classTable_length_p; + FT_UShort* stateArray_length_p; + FT_UShort* entryTable_length_p; + + } GXV_mort_subtable_type5_StateOptRec, + *GXV_mort_subtable_type5_StateOptRecData; + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type5_subtable_setup( FT_UShort table_size, + FT_UShort classTable, + FT_UShort stateArray, + FT_UShort entryTable, + FT_UShort* classTable_length_p, + FT_UShort* stateArray_length_p, + FT_UShort* entryTable_length_p, + GXV_Validator valid ) + { + GXV_mort_subtable_type5_StateOptRecData optdata = + (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata; + + + gxv_StateTable_subtable_setup( table_size, + classTable, + stateArray, + entryTable, + classTable_length_p, + stateArray_length_p, + entryTable_length_p, + valid ); + + optdata->classTable = classTable; + optdata->stateArray = stateArray; + optdata->entryTable = entryTable; + + optdata->classTable_length_p = classTable_length_p; + optdata->stateArray_length_p = stateArray_length_p; + optdata->entryTable_length_p = entryTable_length_p; + } + + + static void + gxv_mort_subtable_type5_InsertList_validate( FT_UShort offset, + FT_UShort count, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + /* + * We don't know the range of insertion-glyph-list. + * Set range by whole of state table. + */ + FT_Bytes p = table + offset; + + GXV_mort_subtable_type5_StateOptRecData optdata = + (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata; + + if ( optdata->classTable < offset && + offset < optdata->classTable + *(optdata->classTable_length_p) ) + GXV_TRACE(( " offset runs into ClassTable" )); + if ( optdata->stateArray < offset && + offset < optdata->stateArray + *(optdata->stateArray_length_p) ) + GXV_TRACE(( " offset runs into StateArray" )); + if ( optdata->entryTable < offset && + offset < optdata->entryTable + *(optdata->entryTable_length_p) ) + GXV_TRACE(( " offset runs into EntryTable" )); + + while ( p < table + offset + ( count * 2 ) ) + { + FT_UShort insert_glyphID; + + + GXV_LIMIT_CHECK( 2 ); + insert_glyphID = FT_NEXT_USHORT( p ); + GXV_TRACE(( " 0x%04x", insert_glyphID )); + } + + GXV_TRACE(( "\n" )); + } + + + static void + gxv_mort_subtable_type5_entry_validate( + FT_Byte state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bool setMark; + FT_Bool dontAdvance; + FT_Bool currentIsKashidaLike; + FT_Bool markedIsKashidaLike; + FT_Bool currentInsertBefore; + FT_Bool markedInsertBefore; + FT_Byte currentInsertCount; + FT_Byte markedInsertCount; + FT_UShort currentInsertList; + FT_UShort markedInsertList; + + FT_UNUSED( state ); + + + setMark = FT_BOOL( ( flags >> 15 ) & 1 ); + dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); + currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); + markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); + currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); + markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); + + currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); + markedInsertCount = (FT_Byte)( flags & 0x001F ); + + currentInsertList = (FT_UShort)( glyphOffset->ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset->ul ); + + if ( 0 != currentInsertList && 0 != currentInsertCount ) + { + gxv_mort_subtable_type5_InsertList_validate( currentInsertList, + currentInsertCount, + table, + limit, + valid ); + } + + if ( 0 != markedInsertList && 0 != markedInsertCount ) + { + gxv_mort_subtable_type5_InsertList_validate( markedInsertList, + markedInsertCount, + table, + limit, + valid ); + } + } + + + FT_LOCAL_DEF( void ) + gxv_mort_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_mort_subtable_type5_StateOptRec et_rec; + GXV_mort_subtable_type5_StateOptRecData et = &et_rec; + + + GXV_NAME_ENTER( "mort chain subtable type5 (Glyph Insertion)" ); + + GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE ); + + valid->statetable.optdata = + et; + valid->statetable.optdata_load_func = + NULL; + valid->statetable.subtable_setup_func = + gxv_mort_subtable_type5_subtable_setup; + valid->statetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->statetable.entry_validate_func = + gxv_mort_subtable_type5_entry_validate; + + gxv_StateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx.c new file mode 100644 index 000000000..f8ba5b985 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx.c @@ -0,0 +1,184 @@ +/***************************************************************************/ +/* */ +/* gxvmorx.c */ +/* */ +/* TrueTypeGX/AAT morx table validation (body). */ +/* */ +/* Copyright 2005, 2008 by */ +/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + static void + gxv_morx_subtables_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nSubtables, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_Validate_Func fmt_funcs_table[] = + { + gxv_morx_subtable_type0_validate, /* 0 */ + gxv_morx_subtable_type1_validate, /* 1 */ + gxv_morx_subtable_type2_validate, /* 2 */ + NULL, /* 3 */ + gxv_morx_subtable_type4_validate, /* 4 */ + gxv_morx_subtable_type5_validate, /* 5 */ + + }; + + GXV_Validate_Func func; + + FT_UShort i; + + + GXV_NAME_ENTER( "subtables in a chain" ); + + for ( i = 0; i < nSubtables; i++ ) + { + FT_ULong length; + FT_ULong coverage; + FT_ULong subFeatureFlags; + FT_ULong type; + FT_ULong rest; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 ); + length = FT_NEXT_ULONG( p ); + coverage = FT_NEXT_ULONG( p ); + subFeatureFlags = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n", + i + 1, nSubtables, length )); + + type = coverage & 0x0007; + rest = length - ( 4 + 4 + 4 ); + GXV_LIMIT_CHECK( rest ); + + /* morx coverage consists of mort_coverage & 16bit padding */ + gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ), + valid ); + if ( type > 5 ) + FT_INVALID_FORMAT; + + func = fmt_funcs_table[type]; + if ( func == NULL ) + GXV_TRACE(( "morx type %d is reserved\n", type )); + + func( p, p + rest, valid ); + + p += rest; + } + + valid->subtable_length = p - table; + + GXV_EXIT; + } + + + static void + gxv_morx_chain_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_ULong defaultFlags; + FT_ULong chainLength; + FT_ULong nFeatureFlags; + FT_ULong nSubtables; + + + GXV_NAME_ENTER( "morx chain header" ); + + GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 ); + defaultFlags = FT_NEXT_ULONG( p ); + chainLength = FT_NEXT_ULONG( p ); + nFeatureFlags = FT_NEXT_ULONG( p ); + nSubtables = FT_NEXT_ULONG( p ); + + /* feature-array of morx is same with that of mort */ + gxv_mort_featurearray_validate( p, limit, nFeatureFlags, valid ); + p += valid->subtable_length; + + if ( nSubtables >= 0x10000L ) + FT_INVALID_DATA; + + gxv_morx_subtables_validate( p, table + chainLength, + (FT_UShort)nSubtables, valid ); + + valid->subtable_length = chainLength; + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_morx_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_ULong version; + FT_ULong nChains; + FT_ULong i; + + + valid->root = ftvalid; + valid->face = face; + + FT_TRACE3(( "validating `morx' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 4 ); + version = FT_NEXT_ULONG( p ); + nChains = FT_NEXT_ULONG( p ); + + if ( version != 0x00020000UL ) + FT_INVALID_FORMAT; + + for ( i = 0; i < nChains; i++ ) + { + GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains )); + GXV_32BIT_ALIGNMENT_VALIDATE( p - table ); + gxv_morx_chain_validate( p, limit, valid ); + p += valid->subtable_length; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx.h b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx.h new file mode 100644 index 000000000..28c1a44f6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* gxvmorx.h */ +/* */ +/* TrueTypeGX/AAT common definition for morx table (specification). */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __GXVMORX_H__ +#define __GXVMORX_H__ + + +#include "gxvalid.h" +#include "gxvcommn.h" +#include "gxvmort.h" + +#include FT_SFNT_NAMES_H + + + FT_LOCAL( void ) + gxv_morx_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + FT_LOCAL( void ) + gxv_morx_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ); + + +#endif /* __GXVMORX_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx0.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx0.c new file mode 100644 index 000000000..0159c5aef --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx0.c @@ -0,0 +1,103 @@ +/***************************************************************************/ +/* */ +/* gxvmorx0.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for type0 (Indic Script Rearrangement) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + static void + gxv_morx_subtable_type0_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_XStateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort markFirst; + FT_UShort dontAdvance; + FT_UShort markLast; + FT_UShort reserved; + FT_UShort verb; + + FT_UNUSED( state ); + FT_UNUSED( glyphOffset_p ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + + markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FF0 ); + verb = (FT_UShort)( flags & 0x000F ); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + FT_INVALID_DATA; + } + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type0_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + + GXV_NAME_ENTER( + "morx chain subtable type0 (Indic-Script Rearrangement)" ); + + GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE ); + + valid->xstatetable.optdata = NULL; + valid->xstatetable.optdata_load_func = NULL; + valid->xstatetable.subtable_setup_func = NULL; + valid->xstatetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type0_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx1.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx1.c new file mode 100644 index 000000000..e1c162fa0 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx1.c @@ -0,0 +1,274 @@ +/***************************************************************************/ +/* */ +/* gxvmorx1.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for type1 (Contextual Substitution) subtable. */ +/* */ +/* Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + typedef struct GXV_morx_subtable_type1_StateOptRec_ + { + FT_ULong substitutionTable; + FT_ULong substitutionTable_length; + FT_UShort substitutionTable_num_lookupTables; + + } GXV_morx_subtable_type1_StateOptRec, + *GXV_morx_subtable_type1_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 2 ) + + + static void + gxv_morx_subtable_type1_substitutionTable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 2 ); + optdata->substitutionTable = FT_NEXT_USHORT( p ); + } + + + static void + gxv_morx_subtable_type1_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ) + { + FT_ULong o[4]; + FT_ULong *l[4]; + FT_ULong buff[5]; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->substitutionTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->substitutionTable_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid ); + } + + + static void + gxv_morx_subtable_type1_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setMark; + FT_UShort dontAdvance; + FT_UShort reserved; + FT_Short markIndex; + FT_Short currentIndex; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + FT_UNUSED( state ); + FT_UNUSED( table ); + FT_UNUSED( limit ); + + + setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x3FFF ); + + markIndex = (FT_Short)( glyphOffset_p->ul >> 16 ); + currentIndex = (FT_Short)( glyphOffset_p->ul ); + + GXV_TRACE(( " setMark=%01d dontAdvance=%01d\n", + setMark, dontAdvance )); + + if ( 0 < reserved ) + { + GXV_TRACE(( " non-zero bits found in reserved range\n" )); + if ( valid->root->level >= FT_VALIDATE_PARANOID ) + FT_INVALID_DATA; + } + + GXV_TRACE(( "markIndex = %d, currentIndex = %d\n", + markIndex, currentIndex )); + + if ( optdata->substitutionTable_num_lookupTables < markIndex + 1 ) + optdata->substitutionTable_num_lookupTables = + (FT_Short)( markIndex + 1 ); + + if ( optdata->substitutionTable_num_lookupTables < currentIndex + 1 ) + optdata->substitutionTable_num_lookupTables = + (FT_Short)( currentIndex + 1 ); + } + + + static void + gxv_morx_subtable_type1_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + FT_UNUSED( glyph ); /* for the non-debugging case */ + + GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value_p->u )); + + if ( value_p->u > valid->face->num_glyphs ) + FT_INVALID_GLYPH_ID; + } + + + static GXV_LookupValueDesc + gxv_morx_subtable_type1_LookupFmt4_transit( + FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof ( FT_UShort ) ); + + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /* + * TODO: length should be limit? + **/ + static void + gxv_morx_subtable_type1_substitutionTable_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort i; + + GXV_morx_subtable_type1_StateOptRecData optdata = + (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata; + + + /* TODO: calculate offset/length for each lookupTables */ + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_morx_subtable_type1_LookupValue_validate; + valid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit; + + for ( i = 0; i < optdata->substitutionTable_num_lookupTables; i++ ) + { + FT_ULong offset; + + + GXV_LIMIT_CHECK( 4 ); + offset = FT_NEXT_ULONG( p ); + + gxv_LookupTable_validate( table + offset, limit, valid ); + } + + /* TODO: overlapping of lookupTables in substitutionTable */ + } + + + /* + * subtable for Contextual glyph substitution is a modified StateTable. + * In addition to classTable, stateArray, entryTable, the field + * `substitutionTable' is added. + */ + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type1_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type1_StateOptRec st_rec; + + + GXV_NAME_ENTER( "morx chain subtable type1 (Contextual Glyph Subst)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE ); + + st_rec.substitutionTable_num_lookupTables = 0; + + valid->xstatetable.optdata = + &st_rec; + valid->xstatetable.optdata_load_func = + gxv_morx_subtable_type1_substitutionTable_load; + valid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type1_subtable_setup; + valid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type1_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + gxv_morx_subtable_type1_substitutionTable_validate( + table + st_rec.substitutionTable, + table + st_rec.substitutionTable + st_rec.substitutionTable_length, + valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx2.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx2.c new file mode 100644 index 000000000..b4bb3353f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx2.c @@ -0,0 +1,285 @@ +/***************************************************************************/ +/* */ +/* gxvmorx2.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for type2 (Ligature Substitution) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + typedef struct GXV_morx_subtable_type2_StateOptRec_ + { + FT_ULong ligActionTable; + FT_ULong componentTable; + FT_ULong ligatureTable; + FT_ULong ligActionTable_length; + FT_ULong componentTable_length; + FT_ULong ligatureTable_length; + + } GXV_morx_subtable_type2_StateOptRec, + *GXV_morx_subtable_type2_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE \ + ( GXV_XSTATETABLE_HEADER_SIZE + 4 + 4 + 4 ) + + + static void + gxv_morx_subtable_type2_opttable_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 4 + 4 + 4 ); + optdata->ligActionTable = FT_NEXT_ULONG( p ); + optdata->componentTable = FT_NEXT_ULONG( p ); + optdata->ligatureTable = FT_NEXT_ULONG( p ); + + GXV_TRACE(( "offset to ligActionTable=0x%08x\n", + optdata->ligActionTable )); + GXV_TRACE(( "offset to componentTable=0x%08x\n", + optdata->componentTable )); + GXV_TRACE(( "offset to ligatureTable=0x%08x\n", + optdata->ligatureTable )); + } + + + static void + gxv_morx_subtable_type2_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ) + { + FT_ULong o[6]; + FT_ULong* l[6]; + FT_ULong buff[7]; + + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata; + + + GXV_NAME_ENTER( "subtable boundaries setup" ); + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->ligActionTable; + o[4] = optdata->componentTable; + o[5] = optdata->ligatureTable; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->ligActionTable_length); + l[4] = &(optdata->componentTable_length); + l[5] = &(optdata->ligatureTable_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 6, table_size, valid ); + + GXV_TRACE(( "classTable: offset=0x%08x length=0x%08x\n", + classTable, *classTable_length_p )); + GXV_TRACE(( "stateArray: offset=0x%08x length=0x%08x\n", + stateArray, *stateArray_length_p )); + GXV_TRACE(( "entryTable: offset=0x%08x length=0x%08x\n", + entryTable, *entryTable_length_p )); + GXV_TRACE(( "ligActionTable: offset=0x%08x length=0x%08x\n", + optdata->ligActionTable, + optdata->ligActionTable_length )); + GXV_TRACE(( "componentTable: offset=0x%08x length=0x%08x\n", + optdata->componentTable, + optdata->componentTable_length )); + GXV_TRACE(( "ligatureTable: offset=0x%08x length=0x%08x\n", + optdata->ligatureTable, + optdata->ligatureTable_length )); + + GXV_EXIT; + } + + +#define GXV_MORX_LIGACTION_ENTRY_SIZE 4 + + + static void + gxv_morx_subtable_type2_ligActionIndex_validate( + FT_Bytes table, + FT_UShort ligActionIndex, + GXV_Validator valid ) + { + /* access ligActionTable */ + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata; + + FT_Bytes lat_base = table + optdata->ligActionTable; + FT_Bytes p = lat_base + + ligActionIndex * GXV_MORX_LIGACTION_ENTRY_SIZE; + FT_Bytes lat_limit = lat_base + optdata->ligActionTable; + + + if ( p < lat_base ) + { + GXV_TRACE(( "p < lat_base (%d byte rewind)\n", lat_base - p )); + FT_INVALID_OFFSET; + } + else if ( lat_limit < p ) + { + GXV_TRACE(( "lat_limit < p (%d byte overrun)\n", p - lat_limit )); + FT_INVALID_OFFSET; + } + + { + /* validate entry in ligActionTable */ + FT_ULong lig_action; + FT_UShort last; + FT_UShort store; + FT_ULong offset; + + + lig_action = FT_NEXT_ULONG( p ); + last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); + store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); + + offset = lig_action & 0x3FFFFFFFUL; + } + } + + + static void + gxv_morx_subtable_type2_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_UShort setComponent; + FT_UShort dontAdvance; + FT_UShort performAction; + FT_UShort reserved; + FT_UShort ligActionIndex; + + FT_UNUSED( state ); + FT_UNUSED( limit ); + + + setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + performAction = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FFF ); + ligActionIndex = glyphOffset_p->u; + + if ( reserved > 0 ) + GXV_TRACE(( " reserved 14bit is non-zero\n" )); + + if ( 0 < ligActionIndex ) + gxv_morx_subtable_type2_ligActionIndex_validate( + table, ligActionIndex, valid ); + } + + + static void + gxv_morx_subtable_type2_ligatureTable_validate( FT_Bytes table, + GXV_Validator valid ) + { + GXV_morx_subtable_type2_StateOptRecData optdata = + (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata; + + FT_Bytes p = table + optdata->ligatureTable; + FT_Bytes limit = table + optdata->ligatureTable + + optdata->ligatureTable_length; + + + GXV_NAME_ENTER( "morx chain subtable type2 - substitutionTable" ); + + if ( 0 != optdata->ligatureTable ) + { + /* Apple does not give specification of ligatureTable format */ + while ( p < limit ) + { + FT_UShort lig_gid; + + + GXV_LIMIT_CHECK( 2 ); + lig_gid = FT_NEXT_USHORT( p ); + } + } + + GXV_EXIT; + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type2_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type2_StateOptRec lig_rec; + + + GXV_NAME_ENTER( "morx chain subtable type2 (Ligature Substitution)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE ); + + valid->xstatetable.optdata = + &lig_rec; + valid->xstatetable.optdata_load_func = + gxv_morx_subtable_type2_opttable_load; + valid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type2_subtable_setup; + valid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_USHORT; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type2_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + p += valid->subtable_length; + gxv_morx_subtable_type2_ligatureTable_validate( table, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx4.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx4.c new file mode 100644 index 000000000..c0d2f78e3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx4.c @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* gxvmorx4.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for "morx" type4 (Non-Contextual Glyph Substitution) subtable. */ +/* */ +/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type4_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + GXV_NAME_ENTER( "morx chain subtable type4 " + "(Non-Contextual Glyph Substitution)" ); + + gxv_mort_subtable_type4_validate( table, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx5.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx5.c new file mode 100644 index 000000000..5e3a16437 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvmorx5.c @@ -0,0 +1,217 @@ +/***************************************************************************/ +/* */ +/* gxvmorx5.c */ +/* */ +/* TrueTypeGX/AAT morx table validation */ +/* body for type5 (Contextual Glyph Insertion) subtable. */ +/* */ +/* Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvmorx.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvmorx + + + /* + * `morx' subtable type5 (Contextual Glyph Insertion) + * has format of a StateTable with insertion-glyph-list + * without name. However, the 32bit offset from the head + * of subtable to the i-g-l is given after `entryTable', + * without variable name specification (the existence of + * this offset to the table is different from mort type5). + */ + + + typedef struct GXV_morx_subtable_type5_StateOptRec_ + { + FT_ULong insertionGlyphList; + FT_ULong insertionGlyphList_length; + + } GXV_morx_subtable_type5_StateOptRec, + *GXV_morx_subtable_type5_StateOptRecData; + + +#define GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE \ + ( GXV_STATETABLE_HEADER_SIZE + 4 ) + + + static void + gxv_morx_subtable_type5_insertionGlyphList_load( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type5_StateOptRecData optdata = + (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata; + + + GXV_LIMIT_CHECK( 4 ); + optdata->insertionGlyphList = FT_NEXT_ULONG( p ); + } + + + static void + gxv_morx_subtable_type5_subtable_setup( FT_ULong table_size, + FT_ULong classTable, + FT_ULong stateArray, + FT_ULong entryTable, + FT_ULong* classTable_length_p, + FT_ULong* stateArray_length_p, + FT_ULong* entryTable_length_p, + GXV_Validator valid ) + { + FT_ULong o[4]; + FT_ULong* l[4]; + FT_ULong buff[5]; + + GXV_morx_subtable_type5_StateOptRecData optdata = + (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata; + + + o[0] = classTable; + o[1] = stateArray; + o[2] = entryTable; + o[3] = optdata->insertionGlyphList; + l[0] = classTable_length_p; + l[1] = stateArray_length_p; + l[2] = entryTable_length_p; + l[3] = &(optdata->insertionGlyphList_length); + + gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid ); + } + + + static void + gxv_morx_subtable_type5_InsertList_validate( FT_UShort table_index, + FT_UShort count, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table + table_index * 2; + + + while ( p < table + count * 2 + table_index * 2 ) + { + FT_UShort insert_glyphID; + + + GXV_LIMIT_CHECK( 2 ); + insert_glyphID = FT_NEXT_USHORT( p ); + GXV_TRACE(( " 0x%04x", insert_glyphID )); + } + + GXV_TRACE(( "\n" )); + } + + + static void + gxv_morx_subtable_type5_entry_validate( + FT_UShort state, + FT_UShort flags, + GXV_StateTable_GlyphOffsetCPtr glyphOffset_p, + FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bool setMark; + FT_Bool dontAdvance; + FT_Bool currentIsKashidaLike; + FT_Bool markedIsKashidaLike; + FT_Bool currentInsertBefore; + FT_Bool markedInsertBefore; + FT_Byte currentInsertCount; + FT_Byte markedInsertCount; + FT_Byte currentInsertList; + FT_UShort markedInsertList; + + FT_UNUSED( state ); + + + setMark = FT_BOOL( ( flags >> 15 ) & 1 ); + dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); + currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); + markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); + currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); + markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); + + currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); + markedInsertCount = (FT_Byte)( flags & 0x001F ); + + currentInsertList = (FT_Byte) ( glyphOffset_p->ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset_p->ul ); + + if ( currentInsertList && 0 != currentInsertCount ) + gxv_morx_subtable_type5_InsertList_validate( currentInsertList, + currentInsertCount, + table, limit, + valid ); + + if ( markedInsertList && 0 != markedInsertCount ) + gxv_morx_subtable_type5_InsertList_validate( markedInsertList, + markedInsertCount, + table, limit, + valid ); + } + + + FT_LOCAL_DEF( void ) + gxv_morx_subtable_type5_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + + GXV_morx_subtable_type5_StateOptRec et_rec; + GXV_morx_subtable_type5_StateOptRecData et = &et_rec; + + + GXV_NAME_ENTER( "morx chain subtable type5 (Glyph Insertion)" ); + + GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE ); + + valid->xstatetable.optdata = + et; + valid->xstatetable.optdata_load_func = + gxv_morx_subtable_type5_insertionGlyphList_load; + valid->xstatetable.subtable_setup_func = + gxv_morx_subtable_type5_subtable_setup; + valid->xstatetable.entry_glyphoffset_fmt = + GXV_GLYPHOFFSET_ULONG; + valid->xstatetable.entry_validate_func = + gxv_morx_subtable_type5_entry_validate; + + gxv_XStateTable_validate( p, limit, valid ); + + GXV_EXIT; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvopbd.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvopbd.c new file mode 100644 index 000000000..e12506094 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvopbd.c @@ -0,0 +1,217 @@ +/***************************************************************************/ +/* */ +/* gxvopbd.c */ +/* */ +/* TrueTypeGX/AAT opbd table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvopbd + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct GXV_opbd_DataRec_ + { + FT_UShort format; + FT_UShort valueOffset_min; + + } GXV_opbd_DataRec, *GXV_opbd_Data; + + +#define GXV_OPBD_DATA( FIELD ) GXV_TABLE_DATA( opbd, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_opbd_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + /* offset in LookupTable is measured from the head of opbd table */ + FT_Bytes p = valid->root->base + value_p->u; + FT_Bytes limit = valid->root->limit; + FT_Short delta_value; + int i; + + + if ( value_p->u < GXV_OPBD_DATA( valueOffset_min ) ) + GXV_OPBD_DATA( valueOffset_min ) = value_p->u; + + for ( i = 0; i < 4; i++ ) + { + GXV_LIMIT_CHECK( 2 ); + delta_value = FT_NEXT_SHORT( p ); + + if ( GXV_OPBD_DATA( format ) ) /* format 1, value is ctrl pt. */ + { + if ( delta_value == -1 ) + continue; + + gxv_ctlPoint_validate( glyph, delta_value, valid ); + } + else /* format 0, value is distance */ + continue; + } + } + + + /* + opbd ---------------------+ + | + +===============+ | + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of opbd sfnt table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + .... | + | + 48bit value array | + +===============+ | + | value | <-------+ + | | + | | + | | + +---------------+ + .... */ + + static GXV_LookupValueDesc + gxv_opbd_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + GXV_LookupValueDesc value; + + FT_UNUSED( lookuptbl_limit ); + FT_UNUSED( valid ); + + /* XXX: check range? */ + value.u = (FT_UShort)( base_value_p->u + + relative_gindex * 4 * sizeof ( FT_Short ) ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** opbd TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_opbd_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + GXV_opbd_DataRec opbdrec; + GXV_opbd_Data opbd = &opbdrec; + FT_Bytes p = table; + FT_Bytes limit = 0; + + FT_ULong version; + + + valid->root = ftvalid; + valid->table_data = opbd; + valid->face = face; + + FT_TRACE3(( "validating `opbd' table\n" )); + GXV_INIT; + GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU; + + + GXV_LIMIT_CHECK( 4 + 2 ); + version = FT_NEXT_ULONG( p ); + GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p ); + + + /* only 0x00010000 is defined (1996) */ + GXV_TRACE(( "(version=0x%08x)\n", version )); + if ( 0x00010000UL != version ) + FT_INVALID_FORMAT; + + /* only values 0 and 1 are defined (1996) */ + GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) )); + if ( 0x0001 < GXV_OPBD_DATA( format ) ) + FT_INVALID_FORMAT; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_opbd_LookupValue_validate; + valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit; + + gxv_LookupTable_validate( p, limit, valid ); + p += valid->subtable_length; + + if ( p > table + GXV_OPBD_DATA( valueOffset_min ) ) + { + GXV_TRACE(( + "found overlap between LookupTable and opbd_value array\n" )); + FT_INVALID_OFFSET; + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvprop.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvprop.c new file mode 100644 index 000000000..66c3ab740 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvprop.c @@ -0,0 +1,301 @@ +/***************************************************************************/ +/* */ +/* gxvprop.c */ +/* */ +/* TrueTypeGX/AAT prop table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvprop + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define GXV_PROP_HEADER_SIZE ( 4 + 2 + 2 ) +#define GXV_PROP_SIZE_MIN GXV_PROP_HEADER_SIZE + + typedef struct GXV_prop_DataRec_ + { + FT_Fixed version; + + } GXV_prop_DataRec, *GXV_prop_Data; + +#define GXV_PROP_DATA( field ) GXV_TABLE_DATA( prop, field ) + +#define GXV_PROP_FLOATER 0x8000U +#define GXV_PROP_USE_COMPLEMENTARY_BRACKET 0x1000U +#define GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET 0x0F00U +#define GXV_PROP_ATTACHING_TO_RIGHT 0x0080U +#define GXV_PROP_RESERVED 0x0060U +#define GXV_PROP_DIRECTIONALITY_CLASS 0x001FU + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_prop_zero_advance_validate( FT_UShort gid, + GXV_Validator valid ) + { + FT_Face face; + FT_Error error; + FT_GlyphSlot glyph; + + + GXV_NAME_ENTER( "zero advance" ); + + face = valid->face; + + error = FT_Load_Glyph( face, + gid, + FT_LOAD_IGNORE_TRANSFORM ); + if ( error ) + FT_INVALID_GLYPH_ID; + + glyph = face->glyph; + + if ( glyph->advance.x != (FT_Pos)0 || + glyph->advance.y != (FT_Pos)0 ) + FT_INVALID_DATA; + + GXV_EXIT; + } + + + /* Pass 0 as GLYPH to check the default property */ + static void + gxv_prop_property_validate( FT_UShort property, + FT_UShort glyph, + GXV_Validator valid ) + { + if ( glyph != 0 && ( property & GXV_PROP_FLOATER ) ) + gxv_prop_zero_advance_validate( glyph, valid ); + + if ( property & GXV_PROP_USE_COMPLEMENTARY_BRACKET ) + { + FT_UShort offset; + char complement; + + + offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ); + if ( offset == 0 ) + FT_INVALID_DATA; + + complement = (char)( offset >> 8 ); + if ( complement & 0x08 ) + { + /* Top bit is set: negative */ + + /* Calculate the absolute offset */ + complement = (char)( ( complement & 0x07 ) + 1 ); + + /* The gid for complement must be greater than 0 */ + if ( glyph <= complement ) + FT_INVALID_DATA; + } + else + { + /* The gid for complement must be the face. */ + gxv_glyphid_validate( (FT_UShort)( glyph + complement ), valid ); + } + } + else + { + if ( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ) + GXV_TRACE(( "glyph %d cannot have complementary bracketing\n", + glyph )); + } + + /* this is introduced in version 2.0 */ + if ( property & GXV_PROP_ATTACHING_TO_RIGHT ) + { + if ( GXV_PROP_DATA( version ) == 0x00010000UL ) + FT_INVALID_DATA; + } + + if ( property & GXV_PROP_RESERVED ) + FT_INVALID_DATA; + + if ( ( property & GXV_PROP_DIRECTIONALITY_CLASS ) > 11 ) + { + /* TODO: Too restricted. Use the validation level. */ + if ( GXV_PROP_DATA( version ) == 0x00010000UL || + GXV_PROP_DATA( version ) == 0x00020000UL ) + FT_INVALID_DATA; + } + } + + + static void + gxv_prop_LookupValue_validate( FT_UShort glyph, + GXV_LookupValueCPtr value_p, + GXV_Validator valid ) + { + gxv_prop_property_validate( value_p->u, glyph, valid ); + } + + + /* + +===============+ --------+ + | lookup header | | + +===============+ | + | BinSrchHeader | | + +===============+ | + | lastGlyph[0] | | + +---------------+ | + | firstGlyph[0] | | head of lookup table + +---------------+ | + + | offset[0] | -> | offset [byte] + +===============+ | + + | lastGlyph[1] | | (glyphID - firstGlyph) * 2 [byte] + +---------------+ | + | firstGlyph[1] | | + +---------------+ | + | offset[1] | | + +===============+ | + | + ... | + | + 16bit value array | + +===============+ | + | value | <-------+ + ... + */ + + static GXV_LookupValueDesc + gxv_prop_LookupFmt4_transit( FT_UShort relative_gindex, + GXV_LookupValueCPtr base_value_p, + FT_Bytes lookuptbl_limit, + GXV_Validator valid ) + { + FT_Bytes p; + FT_Bytes limit; + FT_UShort offset; + GXV_LookupValueDesc value; + + /* XXX: check range? */ + offset = (FT_UShort)( base_value_p->u + + relative_gindex * sizeof( FT_UShort ) ); + p = valid->lookuptbl_head + offset; + limit = lookuptbl_limit; + + GXV_LIMIT_CHECK ( 2 ); + value.u = FT_NEXT_USHORT( p ); + + return value; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** prop TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_prop_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + + GXV_prop_DataRec proprec; + GXV_prop_Data prop = &proprec; + + FT_Fixed version; + FT_UShort format; + FT_UShort defaultProp; + + + valid->root = ftvalid; + valid->table_data = prop; + valid->face = face; + + FT_TRACE3(( "validating `prop' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + defaultProp = FT_NEXT_USHORT( p ); + + /* only versions 1.0, 2.0, 3.0 are defined (1996) */ + if ( version != 0x00010000UL && + version != 0x00020000UL && + version != 0x00030000UL ) + FT_INVALID_FORMAT; + + + /* only formats 0x0000, 0x0001 are defined (1996) */ + if ( format > 1 ) + FT_INVALID_FORMAT; + + gxv_prop_property_validate( defaultProp, 0, valid ); + + if ( format == 0 ) + { + FT_TRACE3(( "(format 0, no per-glyph properties, " + "remaining %d bytes are skipped)", limit - p )); + goto Exit; + } + + /* format == 1 */ + GXV_PROP_DATA( version ) = version; + + valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED; + valid->lookupval_func = gxv_prop_LookupValue_validate; + valid->lookupfmt4_trans = gxv_prop_LookupFmt4_transit; + + gxv_LookupTable_validate( p, limit, valid ); + + Exit: + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/gxvtrak.c b/alienblaster/project/jni/freetype/src/gxvalid/gxvtrak.c new file mode 100644 index 000000000..df3fd15c0 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/gxvtrak.c @@ -0,0 +1,277 @@ +/***************************************************************************/ +/* */ +/* gxvtrak.c */ +/* */ +/* TrueTypeGX/AAT trak table validation (body). */ +/* */ +/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include "gxvalid.h" +#include "gxvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_gxvtrak + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Data and Types *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * referred track table format specification: + * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6trak.html + * last update was 1996. + * ---------------------------------------------- + * [MINIMUM HEADER]: GXV_TRAK_SIZE_MIN + * version (fixed: 32bit) = 0x00010000 + * format (uint16: 16bit) = 0 is only defined (1996) + * horizOffset (uint16: 16bit) + * vertOffset (uint16: 16bit) + * reserved (uint16: 16bit) = 0 + * ---------------------------------------------- + * [VARIABLE BODY]: + * horizData + * header ( 2 + 2 + 4 + * trackTable + nTracks * ( 4 + 2 + 2 ) + * sizeTable + nSizes * 4 ) + * ---------------------------------------------- + * vertData + * header ( 2 + 2 + 4 + * trackTable + nTracks * ( 4 + 2 + 2 ) + * sizeTable + nSizes * 4 ) + * ---------------------------------------------- + */ + typedef struct GXV_trak_DataRec_ + { + FT_UShort trackValueOffset_min; + FT_UShort trackValueOffset_max; + + } GXV_trak_DataRec, *GXV_trak_Data; + + +#define GXV_TRAK_DATA( FIELD ) GXV_TABLE_DATA( trak, FIELD ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + gxv_trak_trackTable_validate( FT_Bytes table, + FT_Bytes limit, + FT_UShort nTracks, + GXV_Validator valid ) + { + FT_Bytes p = table; + + FT_Fixed track; + FT_UShort nameIndex; + FT_UShort offset; + FT_UShort i; + + + GXV_NAME_ENTER( "trackTable" ); + + GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFFU; + GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000; + + for ( i = 0; i < nTracks; i ++ ) + { + GXV_LIMIT_CHECK( 4 + 2 + 2 ); + track = FT_NEXT_LONG( p ); + nameIndex = FT_NEXT_USHORT( p ); + offset = FT_NEXT_USHORT( p ); + + if ( offset < GXV_TRAK_DATA( trackValueOffset_min ) ) + GXV_TRAK_DATA( trackValueOffset_min ) = offset; + if ( offset > GXV_TRAK_DATA( trackValueOffset_max ) ) + GXV_TRAK_DATA( trackValueOffset_max ) = offset; + + gxv_sfntName_validate( nameIndex, 256, 32767, valid ); + } + + valid->subtable_length = p - table; + GXV_EXIT; + } + + + static void + gxv_trak_trackData_validate( FT_Bytes table, + FT_Bytes limit, + GXV_Validator valid ) + { + FT_Bytes p = table; + FT_UShort nTracks; + FT_UShort nSizes; + FT_ULong sizeTableOffset; + + GXV_ODTECT( 4, odtect ); + + + GXV_ODTECT_INIT( odtect ); + GXV_NAME_ENTER( "trackData" ); + + /* read the header of trackData */ + GXV_LIMIT_CHECK( 2 + 2 + 4 ); + nTracks = FT_NEXT_USHORT( p ); + nSizes = FT_NEXT_USHORT( p ); + sizeTableOffset = FT_NEXT_ULONG( p ); + + gxv_odtect_add_range( table, p - table, "trackData header", odtect ); + + /* validate trackTable */ + gxv_trak_trackTable_validate( p, limit, nTracks, valid ); + gxv_odtect_add_range( p, valid->subtable_length, + "trackTable", odtect ); + + /* sizeTable is array of FT_Fixed, don't check contents */ + p = valid->root->base + sizeTableOffset; + GXV_LIMIT_CHECK( nSizes * 4 ); + gxv_odtect_add_range( p, nSizes * 4, "sizeTable", odtect ); + + /* validate trackValueOffet */ + p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_min ); + if ( limit - p < nTracks * nSizes * 2 ) + GXV_TRACE(( "too short trackValue array\n" )); + + p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_max ); + GXV_LIMIT_CHECK( nSizes * 2 ); + + gxv_odtect_add_range( valid->root->base + + GXV_TRAK_DATA( trackValueOffset_min ), + GXV_TRAK_DATA( trackValueOffset_max ) + - GXV_TRAK_DATA( trackValueOffset_min ) + + nSizes * 2, + "trackValue array", odtect ); + + gxv_odtect_validate( odtect, valid ); + + GXV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** trak TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + gxv_trak_validate( FT_Bytes table, + FT_Face face, + FT_Validator ftvalid ) + { + FT_Bytes p = table; + FT_Bytes limit = 0; + FT_Offset table_size; + + GXV_ValidatorRec validrec; + GXV_Validator valid = &validrec; + GXV_trak_DataRec trakrec; + GXV_trak_Data trak = &trakrec; + + FT_ULong version; + FT_UShort format; + FT_UShort horizOffset; + FT_UShort vertOffset; + FT_UShort reserved; + + + GXV_ODTECT( 3, odtect ); + + GXV_ODTECT_INIT( odtect ); + valid->root = ftvalid; + valid->table_data = trak; + valid->face = face; + + limit = valid->root->limit; + table_size = limit - table; + + FT_TRACE3(( "validating `trak' table\n" )); + GXV_INIT; + + GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 + 2 ); + version = FT_NEXT_ULONG( p ); + format = FT_NEXT_USHORT( p ); + horizOffset = FT_NEXT_USHORT( p ); + vertOffset = FT_NEXT_USHORT( p ); + reserved = FT_NEXT_USHORT( p ); + + GXV_TRACE(( " (version = 0x%08x)\n", version )); + GXV_TRACE(( " (format = 0x%04x)\n", format )); + GXV_TRACE(( " (horizOffset = 0x%04x)\n", horizOffset )); + GXV_TRACE(( " (vertOffset = 0x%04x)\n", vertOffset )); + GXV_TRACE(( " (reserved = 0x%04x)\n", reserved )); + + /* Version 1.0 (always:1996) */ + if ( version != 0x00010000UL ) + FT_INVALID_FORMAT; + + /* format 0 (always:1996) */ + if ( format != 0x0000 ) + FT_INVALID_FORMAT; + + GXV_32BIT_ALIGNMENT_VALIDATE( horizOffset ); + GXV_32BIT_ALIGNMENT_VALIDATE( vertOffset ); + + /* Reserved Fixed Value (always) */ + if ( reserved != 0x0000 ) + FT_INVALID_DATA; + + /* validate trackData */ + if ( 0 < horizOffset ) + { + gxv_trak_trackData_validate( table + horizOffset, limit, valid ); + gxv_odtect_add_range( table + horizOffset, valid->subtable_length, + "horizJustData", odtect ); + } + + if ( 0 < vertOffset ) + { + gxv_trak_trackData_validate( table + vertOffset, limit, valid ); + gxv_odtect_add_range( table + vertOffset, valid->subtable_length, + "vertJustData", odtect ); + } + + gxv_odtect_validate( odtect, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gxvalid/module.mk b/alienblaster/project/jni/freetype/src/gxvalid/module.mk new file mode 100644 index 000000000..9fd098e2c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 gxvalid module definition +# + +# Copyright 2004, 2005, 2006 +# by suzuki toshiya, Masatake YAMATO, Red Hat K.K., +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += GXVALID_MODULE + +define GXVALID_MODULE +$(OPEN_DRIVER) FT_Module_Class, gxv_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)gxvalid $(ECHO_DRIVER_DESC)TrueTypeGX/AAT validation module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/gxvalid/rules.mk b/alienblaster/project/jni/freetype/src/gxvalid/rules.mk new file mode 100644 index 000000000..57bc0823d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gxvalid/rules.mk @@ -0,0 +1,94 @@ +# +# FreeType 2 TrueTypeGX/AAT validation driver configuration rules +# + + +# Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# GXV driver directory +# +GXV_DIR := $(SRC_DIR)/gxvalid + + +# compilation flags for the driver +# +GXV_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GXV_DIR)) + + +# GXV driver sources (i.e., C files) +# +GXV_DRV_SRC := $(GXV_DIR)/gxvcommn.c \ + $(GXV_DIR)/gxvfeat.c \ + $(GXV_DIR)/gxvbsln.c \ + $(GXV_DIR)/gxvtrak.c \ + $(GXV_DIR)/gxvopbd.c \ + $(GXV_DIR)/gxvprop.c \ + $(GXV_DIR)/gxvjust.c \ + $(GXV_DIR)/gxvmort.c \ + $(GXV_DIR)/gxvmort0.c \ + $(GXV_DIR)/gxvmort1.c \ + $(GXV_DIR)/gxvmort2.c \ + $(GXV_DIR)/gxvmort4.c \ + $(GXV_DIR)/gxvmort5.c \ + $(GXV_DIR)/gxvmorx.c \ + $(GXV_DIR)/gxvmorx0.c \ + $(GXV_DIR)/gxvmorx1.c \ + $(GXV_DIR)/gxvmorx2.c \ + $(GXV_DIR)/gxvmorx4.c \ + $(GXV_DIR)/gxvmorx5.c \ + $(GXV_DIR)/gxvlcar.c \ + $(GXV_DIR)/gxvkern.c \ + $(GXV_DIR)/gxvmod.c + +# GXV driver headers +# +GXV_DRV_H := $(GXV_DIR)/gxvalid.h \ + $(GXV_DIR)/gxverror.h \ + $(GXV_DIR)/gxvcommn.h \ + $(GXV_DIR)/gxvfeat.h \ + $(GXV_DIR)/gxvmod.h \ + $(GXV_DIR)/gxvmort.h \ + $(GXV_DIR)/gxvmorx.h + + +# GXV driver object(s) +# +# GXV_DRV_OBJ_M is used during `multi' builds. +# GXV_DRV_OBJ_S is used during `single' builds. +# +GXV_DRV_OBJ_M := $(GXV_DRV_SRC:$(GXV_DIR)/%.c=$(OBJ_DIR)/%.$O) +GXV_DRV_OBJ_S := $(OBJ_DIR)/gxvalid.$O + +# GXV driver source file for single build +# +GXV_DRV_SRC_S := $(GXV_DIR)/gxvalid.c + + +# GXV driver - single object +# +$(GXV_DRV_OBJ_S): $(GXV_DRV_SRC_S) $(GXV_DRV_SRC) \ + $(FREETYPE_H) $(GXV_DRV_H) + $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GXV_DRV_SRC_S)) + + +# GXV driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(GXV_DIR)/%.c $(FREETYPE_H) $(GXV_DRV_H) + $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(GXV_DRV_OBJ_S) +DRV_OBJS_M += $(GXV_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/gzip/Jamfile b/alienblaster/project/jni/freetype/src/gzip/Jamfile new file mode 100644 index 000000000..a7aafa051 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gzip/Jamfile @@ -0,0 +1,16 @@ +# FreeType 2 src/gzip Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) gzip ; + +Library $(FT2_LIB) : ftgzip.c ; + +# end of src/pcf Jamfile diff --git a/alienblaster/project/jni/freetype/src/gzip/ftgzip.c b/alienblaster/project/jni/freetype/src/gzip/ftgzip.c new file mode 100644 index 000000000..6f0c51572 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gzip/ftgzip.c @@ -0,0 +1,688 @@ +/***************************************************************************/ +/* */ +/* ftgzip.c */ +/* */ +/* FreeType support for .gz compressed files. */ +/* */ +/* This optional component relies on zlib. It should mainly be used to */ +/* parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include FT_GZIP_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX Gzip_Err_ +#define FT_ERR_BASE FT_Mod_Err_Gzip + +#include FT_ERRORS_H + + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + +#ifdef FT_CONFIG_OPTION_PIC +#error "gzip code does not support PIC yet" +#endif + +#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB + +#include <zlib.h> + +#else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + /* In this case, we include our own modified sources of the ZLib */ + /* within the "ftgzip" component. The modifications were necessary */ + /* to #include all files without conflicts, as well as preventing */ + /* the definition of "extern" functions that may cause linking */ + /* conflicts when a program is linked with both FreeType and the */ + /* original ZLib. */ + +#define NO_DUMMY_DECL +#ifndef USE_ZLIB_ZCALLOC +#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutils.c */ +#endif + +#include "zlib.h" + +#undef SLOW +#define SLOW 1 /* we can't use asm-optimized sources here! */ + + /* Urgh. `inflate_mask' must not be declared twice -- C++ doesn't like + this. We temporarily disable it and load all necessary header files. */ +#define NO_INFLATE_MASK +#include "zutil.h" +#include "inftrees.h" +#include "infblock.h" +#include "infcodes.h" +#include "infutil.h" +#undef NO_INFLATE_MASK + + /* infutil.c must be included before infcodes.c */ +#include "zutil.c" +#include "inftrees.c" +#include "infutil.c" +#include "infcodes.c" +#include "infblock.c" +#include "inflate.c" +#include "adler32.c" + +#endif /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** Z L I B M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + /* it is better to use FreeType memory routines instead of raw + 'malloc/free' */ + + static voidpf + ft_gzip_alloc( FT_Memory memory, + uInt items, + uInt size ) + { + FT_ULong sz = (FT_ULong)size * items; + FT_Error error; + FT_Pointer p; + + + (void)FT_ALLOC( p, sz ); + return p; + } + + + static void + ft_gzip_free( FT_Memory memory, + voidpf address ) + { + FT_MEM_FREE( address ); + } + + +#if !defined( FT_CONFIG_OPTION_SYSTEM_ZLIB ) && !defined( USE_ZLIB_ZCALLOC ) + + local voidpf + zcalloc ( voidpf opaque, + unsigned items, + unsigned size ) + { + return ft_gzip_alloc( (FT_Memory)opaque, items, size ); + } + + local void + zcfree( voidpf opaque, + voidpf ptr ) + { + ft_gzip_free( (FT_Memory)opaque, ptr ); + } + +#endif /* !SYSTEM_ZLIB && !USE_ZLIB_ZCALLOC */ + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** Z L I B F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_GZIP_BUFFER_SIZE 4096 + + typedef struct FT_GZipFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + z_stream zstream; /* zlib input stream */ + + FT_ULong start; /* starting position, after .gz header */ + FT_Byte input[FT_GZIP_BUFFER_SIZE]; /* input read buffer */ + + FT_Byte buffer[FT_GZIP_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_GZipFileRec, *FT_GZipFile; + + + /* gzip flag byte */ +#define FT_GZIP_ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define FT_GZIP_HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define FT_GZIP_EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define FT_GZIP_ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define FT_GZIP_COMMENT 0x10 /* bit 4 set: file comment present */ +#define FT_GZIP_RESERVED 0xE0 /* bits 5..7: reserved */ + + + /* check and skip .gz header - we don't support `transparent' compression */ + static FT_Error + ft_gzip_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[4]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 4 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers; */ + /* head[2] is the method, and head[3] the flags */ + if ( head[0] != 0x1f || + head[1] != 0x8b || + head[2] != Z_DEFLATED || + (head[3] & FT_GZIP_RESERVED) ) + { + error = Gzip_Err_Invalid_File_Format; + goto Exit; + } + + /* skip time, xflags and os code */ + (void)FT_STREAM_SKIP( 6 ); + + /* skip the extra field */ + if ( head[3] & FT_GZIP_EXTRA_FIELD ) + { + FT_UInt len; + + + if ( FT_READ_USHORT_LE( len ) || + FT_STREAM_SKIP( len ) ) + goto Exit; + } + + /* skip original file name */ + if ( head[3] & FT_GZIP_ORIG_NAME ) + for (;;) + { + FT_UInt c; + + + if ( FT_READ_BYTE( c ) ) + goto Exit; + + if ( c == 0 ) + break; + } + + /* skip .gz comment */ + if ( head[3] & FT_GZIP_COMMENT ) + for (;;) + { + FT_UInt c; + + + if ( FT_READ_BYTE( c ) ) + goto Exit; + + if ( c == 0 ) + break; + } + + /* skip CRC */ + if ( head[3] & FT_GZIP_HEAD_CRC ) + if ( FT_STREAM_SKIP( 2 ) ) + goto Exit; + + Exit: + return error; + } + + + static FT_Error + ft_gzip_file_init( FT_GZipFile zip, + FT_Stream stream, + FT_Stream source ) + { + z_stream* zstream = &zip->zstream; + FT_Error error = Gzip_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .gz header */ + { + stream = source; + + error = ft_gzip_check_header( stream ); + if ( error ) + goto Exit; + + zip->start = FT_STREAM_POS(); + } + + /* initialize zlib -- there is no zlib header in the compressed stream */ + zstream->zalloc = (alloc_func)ft_gzip_alloc; + zstream->zfree = (free_func) ft_gzip_free; + zstream->opaque = stream->memory; + + zstream->avail_in = 0; + zstream->next_in = zip->buffer; + + if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK || + zstream->next_in == NULL ) + error = Gzip_Err_Invalid_File_Format; + + Exit: + return error; + } + + + static void + ft_gzip_file_done( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + + + inflateEnd( zstream ); + + /* clear the rest */ + zstream->zalloc = NULL; + zstream->zfree = NULL; + zstream->opaque = NULL; + zstream->next_in = NULL; + zstream->next_out = NULL; + zstream->avail_in = 0; + zstream->avail_out = 0; + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_gzip_file_reset( FT_GZipFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( zip->start ) ) + { + z_stream* zstream = &zip->zstream; + + + inflateReset( zstream ); + + zstream->avail_in = 0; + zstream->next_in = zip->input; + zstream->avail_out = 0; + zstream->next_out = zip->buffer; + + zip->limit = zip->buffer + FT_GZIP_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_gzip_file_fill_input( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + FT_Stream stream = zip->source; + FT_ULong size; + + + if ( stream->read ) + { + size = stream->read( stream, stream->pos, zip->input, + FT_GZIP_BUFFER_SIZE ); + if ( size == 0 ) + return Gzip_Err_Invalid_Stream_Operation; + } + else + { + size = stream->size - stream->pos; + if ( size > FT_GZIP_BUFFER_SIZE ) + size = FT_GZIP_BUFFER_SIZE; + + if ( size == 0 ) + return Gzip_Err_Invalid_Stream_Operation; + + FT_MEM_COPY( zip->input, stream->base + stream->pos, size ); + } + stream->pos += size; + + zstream->next_in = zip->input; + zstream->avail_in = size; + + return Gzip_Err_Ok; + } + + + static FT_Error + ft_gzip_file_fill_output( FT_GZipFile zip ) + { + z_stream* zstream = &zip->zstream; + FT_Error error = 0; + + + zip->cursor = zip->buffer; + zstream->next_out = zip->cursor; + zstream->avail_out = FT_GZIP_BUFFER_SIZE; + + while ( zstream->avail_out > 0 ) + { + int err; + + + if ( zstream->avail_in == 0 ) + { + error = ft_gzip_file_fill_input( zip ); + if ( error ) + break; + } + + err = inflate( zstream, Z_NO_FLUSH ); + + if ( err == Z_STREAM_END ) + { + zip->limit = zstream->next_out; + if ( zip->limit == zip->cursor ) + error = Gzip_Err_Invalid_Stream_Operation; + break; + } + else if ( err != Z_OK ) + { + error = Gzip_Err_Invalid_Stream_Operation; + break; + } + } + + return error; + } + + + /* fill output buffer; `count' must be <= FT_GZIP_BUFFER_SIZE */ + static FT_Error + ft_gzip_file_skip_output( FT_GZipFile zip, + FT_ULong count ) + { + FT_Error error = Gzip_Err_Ok; + FT_ULong delta; + + + for (;;) + { + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_gzip_file_fill_output( zip ); + if ( error ) + break; + } + + return error; + } + + + static FT_ULong + ft_gzip_file_io( FT_GZipFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* Reset inflate stream if we're seeking backwards. */ + /* Yes, that is not too efficient, but it saves memory :-) */ + if ( pos < zip->pos ) + { + error = ft_gzip_file_reset( zip ); + if ( error ) + goto Exit; + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_gzip_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer, zip->cursor, delta ); + buffer += delta; + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_gzip_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** G Z E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_gzip_stream_close( FT_Stream stream ) + { + FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize gzip file descriptor */ + ft_gzip_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static FT_ULong + ft_gzip_stream_io( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_GZipFile zip = (FT_GZipFile)stream->descriptor.pointer; + + + return ft_gzip_file_io( zip, pos, buffer, count ); + } + + + static FT_ULong + ft_gzip_get_uncompressed_size( FT_Stream stream ) + { + FT_Error error; + FT_ULong old_pos; + FT_ULong result = 0; + + + old_pos = stream->pos; + if ( !FT_Stream_Seek( stream, stream->size - 4 ) ) + { + result = (FT_ULong)FT_Stream_ReadLong( stream, &error ); + if ( error ) + result = 0; + + (void)FT_Stream_Seek( stream, old_pos ); + } + + return result; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory = source->memory; + FT_GZipFile zip; + + + /* + * check the header right now; this prevents allocating un-necessary + * objects when we don't need them + */ + error = ft_gzip_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_QNEW( zip ) ) + { + error = ft_gzip_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + /* + * We use the following trick to try to dramatically improve the + * performance while dealing with small files. If the original stream + * size is less than a certain threshold, we try to load the whole font + * file into memory. This saves us from using the 32KB buffer needed + * to inflate the file, plus the two 4KB intermediate input/output + * buffers used in the `FT_GZipFile' structure. + */ + { + FT_ULong zip_size = ft_gzip_get_uncompressed_size( source ); + + + if ( zip_size != 0 && zip_size < 40 * 1024 ) + { + FT_Byte* zip_buff; + + + if ( !FT_ALLOC( zip_buff, zip_size ) ) + { + FT_ULong count; + + + count = ft_gzip_file_io( zip, 0, zip_buff, zip_size ); + if ( count == zip_size ) + { + ft_gzip_file_done( zip ); + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + + stream->size = zip_size; + stream->pos = 0; + stream->base = zip_buff; + stream->read = NULL; + stream->close = ft_gzip_stream_close; + + goto Exit; + } + + ft_gzip_file_io( zip, 0, NULL, 0 ); + FT_FREE( zip_buff ); + } + error = 0; + } + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = 0; + stream->read = ft_gzip_stream_io; + stream->close = ft_gzip_stream_close; + + Exit: + return error; + } + +#else /* !FT_CONFIG_OPTION_USE_ZLIB */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return Gzip_Err_Unimplemented_Feature; + } + +#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/gzip/rules.mk b/alienblaster/project/jni/freetype/src/gzip/rules.mk new file mode 100644 index 000000000..d2a43a6a8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/gzip/rules.mk @@ -0,0 +1,75 @@ +# +# FreeType 2 GZip support configuration rules +# + + +# Copyright 2002, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# gzip driver directory +# +GZIP_DIR := $(SRC_DIR)/gzip + + +# compilation flags for the driver +# +ifeq ($(SYSTEM_ZLIB),) + GZIP_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GZIP_DIR)) +else + GZIP_COMPILE := $(FT_COMPILE) +endif + + +# gzip support sources (i.e., C files) +# +GZIP_DRV_SRC := $(GZIP_DIR)/ftgzip.c + +# gzip support headers +# +GZIP_DRV_H := + + +# gzip driver object(s) +# +# GZIP_DRV_OBJ_M is used during `multi' builds +# GZIP_DRV_OBJ_S is used during `single' builds +# +ifeq ($(SYSTEM_ZLIB),) + GZIP_DRV_OBJ_M := $(GZIP_DRV_SRC:$(GZIP_DIR)/%.c=$(OBJ_DIR)/%.$O) +else + GZIP_DRV_OBJ_M := $(OBJ_DIR)/ftgzip.$O +endif +GZIP_DRV_OBJ_S := $(OBJ_DIR)/ftgzip.$O + +# gzip support source file for single build +# +GZIP_DRV_SRC_S := $(GZIP_DIR)/ftgzip.c + + +# gzip support - single object +# +$(GZIP_DRV_OBJ_S): $(GZIP_DRV_SRC_S) $(GZIP_DRV_SRC) $(FREETYPE_H) \ + $(GZIP_DRV_H) + $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GZIP_DRV_SRC_S)) + + +# gzip support - multiple objects +# +$(OBJ_DIR)/%.$O: $(GZIP_DIR)/%.c $(FREETYPE_H) $(GZIP_DRV_H) + $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(GZIP_DRV_OBJ_S) +DRV_OBJS_M += $(GZIP_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/lzw/Jamfile b/alienblaster/project/jni/freetype/src/lzw/Jamfile new file mode 100644 index 000000000..6f1f516e7 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/lzw/Jamfile @@ -0,0 +1,16 @@ +# FreeType 2 src/lzw Jamfile +# +# Copyright 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) lzw ; + +Library $(FT2_LIB) : ftlzw.c ; + +# end of src/lzw Jamfile diff --git a/alienblaster/project/jni/freetype/src/lzw/ftlzw.c b/alienblaster/project/jni/freetype/src/lzw/ftlzw.c new file mode 100644 index 000000000..6e57dedb9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/lzw/ftlzw.c @@ -0,0 +1,412 @@ +/***************************************************************************/ +/* */ +/* ftlzw.c */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2004, 2005, 2006, 2009, 2010 by */ +/* Albert Chin-A-Young. */ +/* */ +/* Based on code in src/gzip/ftgzip.c, Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include FT_LZW_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX LZW_Err_ +#define FT_ERR_BASE FT_Mod_Err_LZW + +#include FT_ERRORS_H + + +#ifdef FT_CONFIG_OPTION_USE_LZW + +#ifdef FT_CONFIG_OPTION_PIC +#error "lzw code does not support PIC yet" +#endif + +#include "ftzopen.h" + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** M E M O R Y M A N A G E M E N T *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** F I L E D E S C R I P T O R *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + +#define FT_LZW_BUFFER_SIZE 4096 + + typedef struct FT_LZWFileRec_ + { + FT_Stream source; /* parent/source stream */ + FT_Stream stream; /* embedding stream */ + FT_Memory memory; /* memory allocator */ + FT_LzwStateRec lzw; /* lzw decompressor state */ + + FT_Byte buffer[FT_LZW_BUFFER_SIZE]; /* output buffer */ + FT_ULong pos; /* position in output */ + FT_Byte* cursor; + FT_Byte* limit; + + } FT_LZWFileRec, *FT_LZWFile; + + + /* check and skip .Z header */ + static FT_Error + ft_lzw_check_header( FT_Stream stream ) + { + FT_Error error; + FT_Byte head[2]; + + + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ( head, 2 ) ) + goto Exit; + + /* head[0] && head[1] are the magic numbers */ + if ( head[0] != 0x1f || + head[1] != 0x9d ) + error = LZW_Err_Invalid_File_Format; + + Exit: + return error; + } + + + static FT_Error + ft_lzw_file_init( FT_LZWFile zip, + FT_Stream stream, + FT_Stream source ) + { + FT_LzwState lzw = &zip->lzw; + FT_Error error = LZW_Err_Ok; + + + zip->stream = stream; + zip->source = source; + zip->memory = stream->memory; + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + + /* check and skip .Z header */ + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + + /* initialize internal lzw variable */ + ft_lzwstate_init( lzw, source ); + + Exit: + return error; + } + + + static void + ft_lzw_file_done( FT_LZWFile zip ) + { + /* clear the rest */ + ft_lzwstate_done( &zip->lzw ); + + zip->memory = NULL; + zip->source = NULL; + zip->stream = NULL; + } + + + static FT_Error + ft_lzw_file_reset( FT_LZWFile zip ) + { + FT_Stream stream = zip->source; + FT_Error error; + + + if ( !FT_STREAM_SEEK( 0 ) ) + { + ft_lzwstate_reset( &zip->lzw ); + + zip->limit = zip->buffer + FT_LZW_BUFFER_SIZE; + zip->cursor = zip->limit; + zip->pos = 0; + } + + return error; + } + + + static FT_Error + ft_lzw_file_fill_output( FT_LZWFile zip ) + { + FT_LzwState lzw = &zip->lzw; + FT_ULong count; + FT_Error error = 0; + + + zip->cursor = zip->buffer; + + count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE ); + + zip->limit = zip->cursor + count; + + if ( count == 0 ) + error = LZW_Err_Invalid_Stream_Operation; + + return error; + } + + + /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */ + static FT_Error + ft_lzw_file_skip_output( FT_LZWFile zip, + FT_ULong count ) + { + FT_Error error = LZW_Err_Ok; + + + /* first, we skip what we can from the output buffer */ + { + FT_ULong delta = (FT_ULong)( zip->limit - zip->cursor ); + + + if ( delta >= count ) + delta = count; + + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + } + + /* next, we skip as many bytes remaining as possible */ + while ( count > 0 ) + { + FT_ULong delta = FT_LZW_BUFFER_SIZE; + FT_ULong numread; + + + if ( delta > count ) + delta = count; + + numread = ft_lzwstate_io( &zip->lzw, NULL, delta ); + if ( numread < delta ) + { + /* not enough bytes */ + error = LZW_Err_Invalid_Stream_Operation; + break; + } + + zip->pos += delta; + count -= delta; + } + + return error; + } + + + static FT_ULong + ft_lzw_file_io( FT_LZWFile zip, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong result = 0; + FT_Error error; + + + /* seeking backwards. */ + if ( pos < zip->pos ) + { + /* If the new position is within the output buffer, simply */ + /* decrement pointers, otherwise we reset the stream completely! */ + if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) ) + { + zip->cursor -= zip->pos - pos; + zip->pos = pos; + } + else + { + error = ft_lzw_file_reset( zip ); + if ( error ) + goto Exit; + } + } + + /* skip unwanted bytes */ + if ( pos > zip->pos ) + { + error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) ); + if ( error ) + goto Exit; + } + + if ( count == 0 ) + goto Exit; + + /* now read the data */ + for (;;) + { + FT_ULong delta; + + + delta = (FT_ULong)( zip->limit - zip->cursor ); + if ( delta >= count ) + delta = count; + + FT_MEM_COPY( buffer + result, zip->cursor, delta ); + result += delta; + zip->cursor += delta; + zip->pos += delta; + + count -= delta; + if ( count == 0 ) + break; + + error = ft_lzw_file_fill_output( zip ); + if ( error ) + break; + } + + Exit: + return result; + } + + +/***************************************************************************/ +/***************************************************************************/ +/***** *****/ +/***** L Z W E M B E D D I N G S T R E A M *****/ +/***** *****/ +/***************************************************************************/ +/***************************************************************************/ + + static void + ft_lzw_stream_close( FT_Stream stream ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + FT_Memory memory = stream->memory; + + + if ( zip ) + { + /* finalize lzw file descriptor */ + ft_lzw_file_done( zip ); + + FT_FREE( zip ); + + stream->descriptor.pointer = NULL; + } + } + + + static FT_ULong + ft_lzw_stream_io( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_LZWFile zip = (FT_LZWFile)stream->descriptor.pointer; + + + return ft_lzw_file_io( zip, pos, buffer, count ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_Error error; + FT_Memory memory = source->memory; + FT_LZWFile zip; + + + /* + * Check the header right now; this prevents allocation of a huge + * LZWFile object (400 KByte of heap memory) if not necessary. + * + * Did I mention that you should never use .Z compressed font + * files? + */ + error = ft_lzw_check_header( source ); + if ( error ) + goto Exit; + + FT_ZERO( stream ); + stream->memory = memory; + + if ( !FT_NEW( zip ) ) + { + error = ft_lzw_file_init( zip, stream, source ); + if ( error ) + { + FT_FREE( zip ); + goto Exit; + } + + stream->descriptor.pointer = zip; + } + + stream->size = 0x7FFFFFFFL; /* don't know the real size! */ + stream->pos = 0; + stream->base = 0; + stream->read = ft_lzw_stream_io; + stream->close = ft_lzw_stream_close; + + Exit: + return error; + } + + +#include "ftzopen.c" + + +#else /* !FT_CONFIG_OPTION_USE_LZW */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ) + { + FT_UNUSED( stream ); + FT_UNUSED( source ); + + return LZW_Err_Unimplemented_Feature; + } + + +#endif /* !FT_CONFIG_OPTION_USE_LZW */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/lzw/ftzopen.c b/alienblaster/project/jni/freetype/src/lzw/ftzopen.c new file mode 100644 index 000000000..8bc65c8f5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/lzw/ftzopen.c @@ -0,0 +1,401 @@ +/***************************************************************************/ +/* */ +/* ftzopen.c */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2005, 2006, 2007, 2009 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include "ftzopen.h" +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H + + + static int + ft_lzwstate_refill( FT_LzwState state ) + { + FT_ULong count; + + + if ( state->in_eof ) + return -1; + + count = FT_Stream_TryRead( state->source, + state->buf_tab, + state->num_bits ); /* WHY? */ + + state->buf_size = (FT_UInt)count; + state->buf_total += count; + state->in_eof = FT_BOOL( count < state->num_bits ); + state->buf_offset = 0; + state->buf_size = ( state->buf_size << 3 ) - ( state->num_bits - 1 ); + + if ( count == 0 ) /* end of file */ + return -1; + + return 0; + } + + + static FT_Int32 + ft_lzwstate_get_code( FT_LzwState state ) + { + FT_UInt num_bits = state->num_bits; + FT_Int offset = state->buf_offset; + FT_Byte* p; + FT_Int result; + + + if ( state->buf_clear || + offset >= state->buf_size || + state->free_ent >= state->free_bits ) + { + if ( state->free_ent >= state->free_bits ) + { + state->num_bits = ++num_bits; + state->free_bits = state->num_bits < state->max_bits + ? (FT_UInt)( ( 1UL << num_bits ) - 256 ) + : state->max_free + 1; + } + + if ( state->buf_clear ) + { + state->num_bits = num_bits = LZW_INIT_BITS; + state->free_bits = (FT_UInt)( ( 1UL << num_bits ) - 256 ); + state->buf_clear = 0; + } + + if ( ft_lzwstate_refill( state ) < 0 ) + return -1; + + offset = 0; + } + + state->buf_offset = offset + num_bits; + + p = &state->buf_tab[offset >> 3]; + offset &= 7; + result = *p++ >> offset; + offset = 8 - offset; + num_bits -= offset; + + if ( num_bits >= 8 ) + { + result |= *p++ << offset; + offset += 8; + num_bits -= 8; + } + if ( num_bits > 0 ) + result |= ( *p & LZW_MASK( num_bits ) ) << offset; + + return result; + } + + + /* grow the character stack */ + static int + ft_lzwstate_stack_grow( FT_LzwState state ) + { + if ( state->stack_top >= state->stack_size ) + { + FT_Memory memory = state->memory; + FT_Error error; + FT_Offset old_size = state->stack_size; + FT_Offset new_size = old_size; + + new_size = new_size + ( new_size >> 1 ) + 4; + + if ( state->stack == state->stack_0 ) + { + state->stack = NULL; + old_size = 0; + } + + if ( FT_RENEW_ARRAY( state->stack, old_size, new_size ) ) + return -1; + + state->stack_size = new_size; + } + return 0; + } + + + /* grow the prefix/suffix arrays */ + static int + ft_lzwstate_prefix_grow( FT_LzwState state ) + { + FT_UInt old_size = state->prefix_size; + FT_UInt new_size = old_size; + FT_Memory memory = state->memory; + FT_Error error; + + + if ( new_size == 0 ) /* first allocation -> 9 bits */ + new_size = 512; + else + new_size += new_size >> 2; /* don't grow too fast */ + + /* + * Note that the `suffix' array is located in the same memory block + * pointed to by `prefix'. + * + * I know that sizeof(FT_Byte) == 1 by definition, but it is clearer + * to write it literally. + * + */ + if ( FT_REALLOC_MULT( state->prefix, old_size, new_size, + sizeof ( FT_UShort ) + sizeof ( FT_Byte ) ) ) + return -1; + + /* now adjust `suffix' and move the data accordingly */ + state->suffix = (FT_Byte*)( state->prefix + new_size ); + + FT_MEM_MOVE( state->suffix, + state->prefix + old_size, + old_size * sizeof ( FT_Byte ) ); + + state->prefix_size = new_size; + return 0; + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_reset( FT_LzwState state ) + { + state->in_eof = 0; + state->buf_offset = 0; + state->buf_size = 0; + state->buf_clear = 0; + state->buf_total = 0; + state->stack_top = 0; + state->num_bits = LZW_INIT_BITS; + state->phase = FT_LZW_PHASE_START; + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ) + { + FT_ZERO( state ); + + state->source = source; + state->memory = source->memory; + + state->prefix = NULL; + state->suffix = NULL; + state->prefix_size = 0; + + state->stack = state->stack_0; + state->stack_size = sizeof ( state->stack_0 ); + + ft_lzwstate_reset( state ); + } + + + FT_LOCAL_DEF( void ) + ft_lzwstate_done( FT_LzwState state ) + { + FT_Memory memory = state->memory; + + + ft_lzwstate_reset( state ); + + if ( state->stack != state->stack_0 ) + FT_FREE( state->stack ); + + FT_FREE( state->prefix ); + state->suffix = NULL; + + FT_ZERO( state ); + } + + +#define FTLZW_STACK_PUSH( c ) \ + FT_BEGIN_STMNT \ + if ( state->stack_top >= state->stack_size && \ + ft_lzwstate_stack_grow( state ) < 0 ) \ + goto Eof; \ + \ + state->stack[state->stack_top++] = (FT_Byte)(c); \ + FT_END_STMNT + + + FT_LOCAL_DEF( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ) + { + FT_ULong result = 0; + + FT_UInt old_char = state->old_char; + FT_UInt old_code = state->old_code; + FT_UInt in_code = state->in_code; + + + if ( out_size == 0 ) + goto Exit; + + switch ( state->phase ) + { + case FT_LZW_PHASE_START: + { + FT_Byte max_bits; + FT_Int32 c; + + + /* skip magic bytes, and read max_bits + block_flag */ + if ( FT_Stream_Seek( state->source, 2 ) != 0 || + FT_Stream_TryRead( state->source, &max_bits, 1 ) != 1 ) + goto Eof; + + state->max_bits = max_bits & LZW_BIT_MASK; + state->block_mode = max_bits & LZW_BLOCK_MASK; + state->max_free = (FT_UInt)( ( 1UL << state->max_bits ) - 256 ); + + if ( state->max_bits > LZW_MAX_BITS ) + goto Eof; + + state->num_bits = LZW_INIT_BITS; + state->free_ent = ( state->block_mode ? LZW_FIRST + : LZW_CLEAR ) - 256; + in_code = 0; + + state->free_bits = state->num_bits < state->max_bits + ? (FT_UInt)( ( 1UL << state->num_bits ) - 256 ) + : state->max_free + 1; + + c = ft_lzwstate_get_code( state ); + if ( c < 0 ) + goto Eof; + + old_code = old_char = (FT_UInt)c; + + if ( buffer ) + buffer[result] = (FT_Byte)old_char; + + if ( ++result >= out_size ) + goto Exit; + + state->phase = FT_LZW_PHASE_CODE; + } + /* fall-through */ + + case FT_LZW_PHASE_CODE: + { + FT_Int32 c; + FT_UInt code; + + + NextCode: + c = ft_lzwstate_get_code( state ); + if ( c < 0 ) + goto Eof; + + code = (FT_UInt)c; + + if ( code == LZW_CLEAR && state->block_mode ) + { + /* why not LZW_FIRST-256 ? */ + state->free_ent = ( LZW_FIRST - 1 ) - 256; + state->buf_clear = 1; + c = ft_lzwstate_get_code( state ); + if ( c < 0 ) + goto Eof; + + code = (FT_UInt)c; + } + + in_code = code; /* save code for later */ + + if ( code >= 256U ) + { + /* special case for KwKwKwK */ + if ( code - 256U >= state->free_ent ) + { + FTLZW_STACK_PUSH( old_char ); + code = old_code; + } + + while ( code >= 256U ) + { + if ( !state->prefix ) + goto Eof; + + FTLZW_STACK_PUSH( state->suffix[code - 256] ); + code = state->prefix[code - 256]; + } + } + + old_char = code; + FTLZW_STACK_PUSH( old_char ); + + state->phase = FT_LZW_PHASE_STACK; + } + /* fall-through */ + + case FT_LZW_PHASE_STACK: + { + while ( state->stack_top > 0 ) + { + --state->stack_top; + + if ( buffer ) + buffer[result] = state->stack[state->stack_top]; + + if ( ++result == out_size ) + goto Exit; + } + + /* now create new entry */ + if ( state->free_ent < state->max_free ) + { + if ( state->free_ent >= state->prefix_size && + ft_lzwstate_prefix_grow( state ) < 0 ) + goto Eof; + + FT_ASSERT( state->free_ent < state->prefix_size ); + + state->prefix[state->free_ent] = (FT_UShort)old_code; + state->suffix[state->free_ent] = (FT_Byte) old_char; + + state->free_ent += 1; + } + + old_code = in_code; + + state->phase = FT_LZW_PHASE_CODE; + goto NextCode; + } + + default: /* state == EOF */ + ; + } + + Exit: + state->old_code = old_code; + state->old_char = old_char; + state->in_code = in_code; + + return result; + + Eof: + state->phase = FT_LZW_PHASE_EOF; + goto Exit; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/lzw/ftzopen.h b/alienblaster/project/jni/freetype/src/lzw/ftzopen.h new file mode 100644 index 000000000..f7d2936be --- /dev/null +++ b/alienblaster/project/jni/freetype/src/lzw/ftzopen.h @@ -0,0 +1,171 @@ +/***************************************************************************/ +/* */ +/* ftzopen.h */ +/* */ +/* FreeType support for .Z compressed files. */ +/* */ +/* This optional component relies on NetBSD's zopen(). It should mainly */ +/* be used to parse compressed PCF fonts, as found with many X11 server */ +/* distributions. */ +/* */ +/* Copyright 2005, 2006, 2007, 2008 by David Turner. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FT_ZOPEN_H__ +#define __FT_ZOPEN_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + + + /* + * This is a complete re-implementation of the LZW file reader, + * since the old one was incredibly badly written, using + * 400 KByte of heap memory before decompressing anything. + * + */ + +#define FT_LZW_IN_BUFF_SIZE 64 +#define FT_LZW_DEFAULT_STACK_SIZE 64 + +#define LZW_INIT_BITS 9 +#define LZW_MAX_BITS 16 + +#define LZW_CLEAR 256 +#define LZW_FIRST 257 + +#define LZW_BIT_MASK 0x1f +#define LZW_BLOCK_MASK 0x80 +#define LZW_MASK( n ) ( ( 1U << (n) ) - 1U ) + + + typedef enum FT_LzwPhase_ + { + FT_LZW_PHASE_START = 0, + FT_LZW_PHASE_CODE, + FT_LZW_PHASE_STACK, + FT_LZW_PHASE_EOF + + } FT_LzwPhase; + + + /* + * state of LZW decompressor + * + * small technical note + * -------------------- + * + * We use a few tricks in this implementation that are explained here to + * ease debugging and maintenance. + * + * - First of all, the `prefix' and `suffix' arrays contain the suffix + * and prefix for codes over 256; this means that + * + * prefix_of(code) == state->prefix[code-256] + * suffix_of(code) == state->suffix[code-256] + * + * Each prefix is a 16-bit code, and each suffix an 8-bit byte. + * + * Both arrays are stored in a single memory block, pointed to by + * `state->prefix'. This means that the following equality is always + * true: + * + * state->suffix == (FT_Byte*)(state->prefix + state->prefix_size) + * + * Of course, state->prefix_size is the number of prefix/suffix slots + * in the arrays, corresponding to codes 256..255+prefix_size. + * + * - `free_ent' is the index of the next free entry in the `prefix' + * and `suffix' arrays. This means that the corresponding `next free + * code' is really `256+free_ent'. + * + * Moreover, `max_free' is the maximum value that `free_ent' can reach. + * + * `max_free' corresponds to `(1 << max_bits) - 256'. Note that this + * value is always <= 0xFF00, which means that both `free_ent' and + * `max_free' can be stored in an FT_UInt variable, even on 16-bit + * machines. + * + * If `free_ent == max_free', you cannot add new codes to the + * prefix/suffix table. + * + * - `num_bits' is the current number of code bits, starting at 9 and + * growing each time `free_ent' reaches the value of `free_bits'. The + * latter is computed as follows + * + * if num_bits < max_bits: + * free_bits = (1 << num_bits)-256 + * else: + * free_bits = max_free + 1 + * + * Since the value of `max_free + 1' can never be reached by + * `free_ent', `num_bits' cannot grow larger than `max_bits'. + */ + + typedef struct FT_LzwStateRec_ + { + FT_LzwPhase phase; + FT_Int in_eof; + + FT_Byte buf_tab[16]; + FT_Int buf_offset; + FT_Int buf_size; + FT_Bool buf_clear; + FT_Offset buf_total; + + FT_UInt max_bits; /* max code bits, from file header */ + FT_Int block_mode; /* block mode flag, from file header */ + FT_UInt max_free; /* (1 << max_bits) - 256 */ + + FT_UInt num_bits; /* current code bit number */ + FT_UInt free_ent; /* index of next free entry */ + FT_UInt free_bits; /* if reached by free_ent, increment num_bits */ + FT_UInt old_code; + FT_UInt old_char; + FT_UInt in_code; + + FT_UShort* prefix; /* always dynamically allocated / reallocated */ + FT_Byte* suffix; /* suffix = (FT_Byte*)(prefix + prefix_size) */ + FT_UInt prefix_size; /* number of slots in `prefix' or `suffix' */ + + FT_Byte* stack; /* character stack */ + FT_UInt stack_top; + FT_Offset stack_size; + FT_Byte stack_0[FT_LZW_DEFAULT_STACK_SIZE]; /* minimize heap alloc */ + + FT_Stream source; /* source stream */ + FT_Memory memory; + + } FT_LzwStateRec, *FT_LzwState; + + + FT_LOCAL( void ) + ft_lzwstate_init( FT_LzwState state, + FT_Stream source ); + + FT_LOCAL( void ) + ft_lzwstate_done( FT_LzwState state ); + + + FT_LOCAL( void ) + ft_lzwstate_reset( FT_LzwState state ); + + + FT_LOCAL( FT_ULong ) + ft_lzwstate_io( FT_LzwState state, + FT_Byte* buffer, + FT_ULong out_size ); + +/* */ + +#endif /* __FT_ZOPEN_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/lzw/rules.mk b/alienblaster/project/jni/freetype/src/lzw/rules.mk new file mode 100644 index 000000000..5550a48d6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/lzw/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 LZW support configuration rules +# + + +# Copyright 2004, 2005, 2006 by +# Albert Chin-A-Young. +# +# Based on src/lzw/rules.mk, Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# LZW driver directory +# +LZW_DIR := $(SRC_DIR)/lzw + + +# compilation flags for the driver +# +LZW_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(LZW_DIR)) + + +# LZW support sources (i.e., C files) +# +LZW_DRV_SRC := $(LZW_DIR)/ftlzw.c + +# LZW support headers +# +LZW_DRV_H := $(LZW_DIR)/ftzopen.h \ + $(LZW_DIR)/ftzopen.c + + +# LZW driver object(s) +# +# LZW_DRV_OBJ_M is used during `multi' builds +# LZW_DRV_OBJ_S is used during `single' builds +# +LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O +LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O + +# LZW support source file for single build +# +LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c + + +# LZW support - single object +# +$(LZW_DRV_OBJ_S): $(LZW_DRV_SRC_S) $(LZW_DRV_SRC) $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(LZW_DRV_SRC_S)) + + +# LZW support - multiple objects +# +$(OBJ_DIR)/%.$O: $(LZW_DIR)/%.c $(FREETYPE_H) $(LZW_DRV_H) + $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(LZW_DRV_OBJ_S) +DRV_OBJS_M += $(LZW_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/otvalid/Jamfile b/alienblaster/project/jni/freetype/src/otvalid/Jamfile new file mode 100644 index 000000000..b457143de --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/otvalid Jamfile +# +# Copyright 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) otvalid ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = otvbase otvcommn otvgdef otvgpos otvgsub otvjstf otvmod otvmath ; + } + else + { + _sources = otvalid ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/otvalid Jamfile diff --git a/alienblaster/project/jni/freetype/src/otvalid/module.mk b/alienblaster/project/jni/freetype/src/otvalid/module.mk new file mode 100644 index 000000000..9cadde55e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 otvalid module definition +# + + +# Copyright 2004, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += OTVALID_MODULE + +define OTVALID_MODULE +$(OPEN_DRIVER) FT_Module_Class, otv_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)otvalid $(ECHO_DRIVER_DESC)OpenType validation module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvalid.h b/alienblaster/project/jni/freetype/src/otvalid/otvalid.h new file mode 100644 index 000000000..eb99b9cc4 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvalid.h @@ -0,0 +1,78 @@ +/***************************************************************************/ +/* */ +/* otvalid.h */ +/* */ +/* OpenType table validation (specification only). */ +/* */ +/* Copyright 2004, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __OTVALID_H__ +#define __OTVALID_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#include "otverror.h" /* must come before FT_INTERNAL_VALIDATE_H */ + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + otv_BASE_validate( FT_Bytes table, + FT_Validator valid ); + + /* GSUB and GPOS tables should already be validated; */ + /* if missing, set corresponding argument to 0 */ + FT_LOCAL( void ) + otv_GDEF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_GPOS_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_GSUB_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator valid ); + + /* GSUB and GPOS tables should already be validated; */ + /* if missing, set corresponding argument to 0 */ + FT_LOCAL( void ) + otv_JSTF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator valid ); + + FT_LOCAL( void ) + otv_MATH_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ); + + +FT_END_HEADER + +#endif /* __OTVALID_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvbase.c b/alienblaster/project/jni/freetype/src/otvalid/otvbase.c new file mode 100644 index 000000000..d742d2dc9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvbase.c @@ -0,0 +1,318 @@ +/***************************************************************************/ +/* */ +/* otvbase.c */ +/* */ +/* OpenType BASE table validation (body). */ +/* */ +/* Copyright 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvbase + + + static void + otv_BaseCoord_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BaseCoordFormat; + + + OTV_NAME_ENTER( "BaseCoord" ); + + OTV_LIMIT_CHECK( 4 ); + BaseCoordFormat = FT_NEXT_USHORT( p ); + p += 2; /* skip Coordinate */ + + OTV_TRACE(( " (format %d)\n", BaseCoordFormat )); + + switch ( BaseCoordFormat ) + { + case 1: /* BaseCoordFormat1 */ + break; + + case 2: /* BaseCoordFormat2 */ + OTV_LIMIT_CHECK( 4 ); /* ReferenceGlyph, BaseCoordPoint */ + break; + + case 3: /* BaseCoordFormat3 */ + OTV_LIMIT_CHECK( 2 ); + /* DeviceTable */ + otv_Device_validate( table + FT_NEXT_USHORT( p ), valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static void + otv_BaseTagList_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BaseTagCount; + + + OTV_NAME_ENTER( "BaseTagList" ); + + OTV_LIMIT_CHECK( 2 ); + + BaseTagCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount )); + + OTV_LIMIT_CHECK( BaseTagCount * 4 ); /* BaselineTag */ + + OTV_EXIT; + } + + + static void + otv_BaseValues_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BaseCoordCount; + + + OTV_NAME_ENTER( "BaseValues" ); + + OTV_LIMIT_CHECK( 4 ); + + p += 2; /* skip DefaultIndex */ + BaseCoordCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount )); + + OTV_LIMIT_CHECK( BaseCoordCount * 2 ); + + /* BaseCoord */ + for ( ; BaseCoordCount > 0; BaseCoordCount-- ) + otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), valid ); + + OTV_EXIT; + } + + + static void + otv_MinMax_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt FeatMinMaxCount; + + OTV_OPTIONAL_TABLE( MinCoord ); + OTV_OPTIONAL_TABLE( MaxCoord ); + + + OTV_NAME_ENTER( "MinMax" ); + + OTV_LIMIT_CHECK( 6 ); + + OTV_OPTIONAL_OFFSET( MinCoord ); + OTV_OPTIONAL_OFFSET( MaxCoord ); + FeatMinMaxCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount )); + + table_size = FeatMinMaxCount * 8 + 6; + + OTV_SIZE_CHECK( MinCoord ); + if ( MinCoord ) + otv_BaseCoord_validate( table + MinCoord, valid ); + + OTV_SIZE_CHECK( MaxCoord ); + if ( MaxCoord ) + otv_BaseCoord_validate( table + MaxCoord, valid ); + + OTV_LIMIT_CHECK( FeatMinMaxCount * 8 ); + + /* FeatMinMaxRecord */ + for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- ) + { + p += 4; /* skip FeatureTableTag */ + + OTV_OPTIONAL_OFFSET( MinCoord ); + OTV_OPTIONAL_OFFSET( MaxCoord ); + + OTV_SIZE_CHECK( MinCoord ); + if ( MinCoord ) + otv_BaseCoord_validate( table + MinCoord, valid ); + + OTV_SIZE_CHECK( MaxCoord ); + if ( MaxCoord ) + otv_BaseCoord_validate( table + MaxCoord, valid ); + } + + OTV_EXIT; + } + + + static void + otv_BaseScript_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt BaseLangSysCount; + + OTV_OPTIONAL_TABLE( BaseValues ); + OTV_OPTIONAL_TABLE( DefaultMinMax ); + + + OTV_NAME_ENTER( "BaseScript" ); + + OTV_LIMIT_CHECK( 6 ); + OTV_OPTIONAL_OFFSET( BaseValues ); + OTV_OPTIONAL_OFFSET( DefaultMinMax ); + BaseLangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount )); + + table_size = BaseLangSysCount * 6 + 6; + + OTV_SIZE_CHECK( BaseValues ); + if ( BaseValues ) + otv_BaseValues_validate( table + BaseValues, valid ); + + OTV_SIZE_CHECK( DefaultMinMax ); + if ( DefaultMinMax ) + otv_MinMax_validate( table + DefaultMinMax, valid ); + + OTV_LIMIT_CHECK( BaseLangSysCount * 6 ); + + /* BaseLangSysRecord */ + for ( ; BaseLangSysCount > 0; BaseLangSysCount-- ) + { + p += 4; /* skip BaseLangSysTag */ + + otv_MinMax_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + static void + otv_BaseScriptList_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BaseScriptCount; + + + OTV_NAME_ENTER( "BaseScriptList" ); + + OTV_LIMIT_CHECK( 2 ); + BaseScriptCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount )); + + OTV_LIMIT_CHECK( BaseScriptCount * 6 ); + + /* BaseScriptRecord */ + for ( ; BaseScriptCount > 0; BaseScriptCount-- ) + { + p += 4; /* skip BaseScriptTag */ + + /* BaseScript */ + otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + static void + otv_Axis_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( BaseTagList ); + + + OTV_NAME_ENTER( "Axis" ); + + OTV_LIMIT_CHECK( 4 ); + OTV_OPTIONAL_OFFSET( BaseTagList ); + + table_size = 4; + + OTV_SIZE_CHECK( BaseTagList ); + if ( BaseTagList ) + otv_BaseTagList_validate( table + BaseTagList, valid ); + + /* BaseScriptList */ + otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), valid ); + + OTV_EXIT; + } + + + FT_LOCAL_DEF( void ) + otv_BASE_validate( FT_Bytes table, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( HorizAxis ); + OTV_OPTIONAL_TABLE( VertAxis ); + + + valid->root = ftvalid; + + FT_TRACE3(( "validating BASE table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 6 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + table_size = 6; + + OTV_OPTIONAL_OFFSET( HorizAxis ); + OTV_SIZE_CHECK( HorizAxis ); + if ( HorizAxis ) + otv_Axis_validate( table + HorizAxis, valid ); + + OTV_OPTIONAL_OFFSET( VertAxis ); + OTV_SIZE_CHECK( VertAxis ); + if ( VertAxis ) + otv_Axis_validate( table + VertAxis, valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvcommn.c b/alienblaster/project/jni/freetype/src/otvalid/otvcommn.c new file mode 100644 index 000000000..a4f885b51 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvcommn.c @@ -0,0 +1,1086 @@ +/***************************************************************************/ +/* */ +/* otvcommn.c */ +/* */ +/* OpenType common tables validation (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvcommon + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** COVERAGE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Coverage_validate( FT_Bytes table, + OTV_Validator valid, + FT_Int expected_count ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat; + FT_UInt total = 0; + + + OTV_NAME_ENTER( "Coverage" ); + + OTV_LIMIT_CHECK( 4 ); + CoverageFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", CoverageFormat )); + + switch ( CoverageFormat ) + { + case 1: /* CoverageFormat1 */ + { + FT_UInt GlyphCount; + FT_UInt i; + + + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); /* GlyphArray */ + + for ( i = 0; i < GlyphCount; ++i ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + + total = GlyphCount; + } + break; + + case 2: /* CoverageFormat2 */ + { + FT_UInt n, RangeCount; + FT_UInt Start, End, StartCoverageIndex, last = 0; + + + RangeCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (RangeCount = %d)\n", RangeCount )); + + OTV_LIMIT_CHECK( RangeCount * 6 ); + + /* RangeRecord */ + for ( n = 0; n < RangeCount; n++ ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + StartCoverageIndex = FT_NEXT_USHORT( p ); + + if ( Start > End || StartCoverageIndex != total ) + FT_INVALID_DATA; + + if ( End >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + + if ( n > 0 && Start <= last ) + FT_INVALID_DATA; + + total += End - Start + 1; + last = End; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + /* Generally, a coverage table offset has an associated count field. */ + /* The number of glyphs in the table should match this field. If */ + /* there is no associated count, a value of -1 tells us not to check. */ + if ( expected_count != -1 && (FT_UInt)expected_count != total ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_first( FT_Bytes table ) + { + FT_Bytes p = table; + + + p += 4; /* skip CoverageFormat and Glyph/RangeCount */ + + return FT_NEXT_USHORT( p ); + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_last( FT_Bytes table ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat = FT_NEXT_USHORT( p ); + FT_UInt count = FT_NEXT_USHORT( p ); /* Glyph/RangeCount */ + FT_UInt result = 0; + + + switch ( CoverageFormat ) + { + case 1: + p += ( count - 1 ) * 2; + result = FT_NEXT_USHORT( p ); + break; + + case 2: + p += ( count - 1 ) * 6 + 2; + result = FT_NEXT_USHORT( p ); + break; + + default: + ; + } + + return result; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_Coverage_get_count( FT_Bytes table ) + { + FT_Bytes p = table; + FT_UInt CoverageFormat = FT_NEXT_USHORT( p ); + FT_UInt count = FT_NEXT_USHORT( p ); /* Glyph/RangeCount */ + FT_UInt result = 0; + + + switch ( CoverageFormat ) + { + case 1: + return count; + + case 2: + { + FT_UInt Start, End; + + + for ( ; count > 0; count-- ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + p += 2; /* skip StartCoverageIndex */ + + result += End - Start + 1; + } + } + break; + + default: + ; + } + + return result; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CLASS DEFINITION TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_ClassDef_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt ClassFormat; + + + OTV_NAME_ENTER( "ClassDef" ); + + OTV_LIMIT_CHECK( 4 ); + ClassFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", ClassFormat )); + + switch ( ClassFormat ) + { + case 1: /* ClassDefFormat1 */ + { + FT_UInt StartGlyph; + FT_UInt GlyphCount; + + + OTV_LIMIT_CHECK( 4 ); + + StartGlyph = FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); /* ClassValueArray */ + + if ( StartGlyph + GlyphCount - 1 >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + break; + + case 2: /* ClassDefFormat2 */ + { + FT_UInt n, ClassRangeCount; + FT_UInt Start, End, last = 0; + + + ClassRangeCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassRangeCount = %d)\n", ClassRangeCount )); + + OTV_LIMIT_CHECK( ClassRangeCount * 6 ); + + /* ClassRangeRecord */ + for ( n = 0; n < ClassRangeCount; n++ ) + { + Start = FT_NEXT_USHORT( p ); + End = FT_NEXT_USHORT( p ); + p += 2; /* skip Class */ + + if ( Start > End || ( n > 0 && Start <= last ) ) + FT_INVALID_DATA; + + if ( End >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + + last = End; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + /* no need to check glyph indices used as input to class definition */ + /* tables since even invalid glyph indices return a meaningful result */ + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** DEVICE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Device_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt StartSize, EndSize, DeltaFormat, count; + + + OTV_NAME_ENTER( "Device" ); + + OTV_LIMIT_CHECK( 8 ); + StartSize = FT_NEXT_USHORT( p ); + EndSize = FT_NEXT_USHORT( p ); + DeltaFormat = FT_NEXT_USHORT( p ); + + if ( DeltaFormat < 1 || DeltaFormat > 3 ) + FT_INVALID_FORMAT; + + if ( EndSize < StartSize ) + FT_INVALID_DATA; + + count = EndSize - StartSize + 1; + OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 ); /* DeltaValue */ + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->type_count */ + /* uses valid->type_funcs */ + + FT_LOCAL_DEF( void ) + otv_Lookup_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt LookupType, SubTableCount; + OTV_Validate_Func validate; + + + OTV_NAME_ENTER( "Lookup" ); + + OTV_LIMIT_CHECK( 6 ); + LookupType = FT_NEXT_USHORT( p ); + p += 2; /* skip LookupFlag */ + SubTableCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (type %d)\n", LookupType )); + + if ( LookupType == 0 || LookupType > valid->type_count ) + FT_INVALID_DATA; + + validate = valid->type_funcs[LookupType - 1]; + + OTV_TRACE(( " (SubTableCount = %d)\n", SubTableCount )); + + OTV_LIMIT_CHECK( SubTableCount * 2 ); + + /* SubTable */ + for ( ; SubTableCount > 0; SubTableCount-- ) + validate( table + FT_NEXT_USHORT( p ), valid ); + + OTV_EXIT; + } + + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_LookupList_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt LookupCount; + + + OTV_NAME_ENTER( "LookupList" ); + + OTV_LIMIT_CHECK( 2 ); + LookupCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookupCount = %d)\n", LookupCount )); + + OTV_LIMIT_CHECK( LookupCount * 2 ); + + valid->lookup_count = LookupCount; + + /* Lookup */ + for ( ; LookupCount > 0; LookupCount-- ) + otv_Lookup_validate( table + FT_NEXT_USHORT( p ), valid ); + + OTV_EXIT; + } + + + static FT_UInt + otv_LookupList_get_count( FT_Bytes table ) + { + return FT_NEXT_USHORT( table ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FEATURES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_Feature_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt LookupCount; + + + OTV_NAME_ENTER( "Feature" ); + + OTV_LIMIT_CHECK( 4 ); + p += 2; /* skip FeatureParams (unused) */ + LookupCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookupCount = %d)\n", LookupCount )); + + OTV_LIMIT_CHECK( LookupCount * 2 ); + + /* LookupListIndex */ + for ( ; LookupCount > 0; LookupCount-- ) + if ( FT_NEXT_USHORT( p ) >= valid->lookup_count ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + static FT_UInt + otv_Feature_get_count( FT_Bytes table ) + { + return FT_NEXT_USHORT( table ); + } + + + /* sets valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_FeatureList_validate( FT_Bytes table, + FT_Bytes lookups, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt FeatureCount; + + + OTV_NAME_ENTER( "FeatureList" ); + + OTV_LIMIT_CHECK( 2 ); + FeatureCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount )); + + OTV_LIMIT_CHECK( FeatureCount * 2 ); + + valid->lookup_count = otv_LookupList_get_count( lookups ); + + /* FeatureRecord */ + for ( ; FeatureCount > 0; FeatureCount-- ) + { + p += 4; /* skip FeatureTag */ + + /* Feature */ + otv_Feature_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LANGUAGE SYSTEM *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* uses valid->extra1 (number of features) */ + + FT_LOCAL_DEF( void ) + otv_LangSys_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt ReqFeatureIndex; + FT_UInt FeatureCount; + + + OTV_NAME_ENTER( "LangSys" ); + + OTV_LIMIT_CHECK( 6 ); + p += 2; /* skip LookupOrder (unused) */ + ReqFeatureIndex = FT_NEXT_USHORT( p ); + FeatureCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ReqFeatureIndex = %d)\n", ReqFeatureIndex )); + OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount )); + + if ( ReqFeatureIndex != 0xFFFFU && ReqFeatureIndex >= valid->extra1 ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( FeatureCount * 2 ); + + /* FeatureIndex */ + for ( ; FeatureCount > 0; FeatureCount-- ) + if ( FT_NEXT_USHORT( p ) >= valid->extra1 ) + FT_INVALID_DATA; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SCRIPTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + otv_Script_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_UInt DefaultLangSys, LangSysCount; + FT_Bytes p = table; + + + OTV_NAME_ENTER( "Script" ); + + OTV_LIMIT_CHECK( 4 ); + DefaultLangSys = FT_NEXT_USHORT( p ); + LangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LangSysCount = %d)\n", LangSysCount )); + + if ( DefaultLangSys != 0 ) + otv_LangSys_validate( table + DefaultLangSys, valid ); + + OTV_LIMIT_CHECK( LangSysCount * 6 ); + + /* LangSysRecord */ + for ( ; LangSysCount > 0; LangSysCount-- ) + { + p += 4; /* skip LangSysTag */ + + /* LangSys */ + otv_LangSys_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + /* sets valid->extra1 (number of features) */ + + FT_LOCAL_DEF( void ) + otv_ScriptList_validate( FT_Bytes table, + FT_Bytes features, + OTV_Validator valid ) + { + FT_UInt ScriptCount; + FT_Bytes p = table; + + + OTV_NAME_ENTER( "ScriptList" ); + + OTV_LIMIT_CHECK( 2 ); + ScriptCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ScriptCount = %d)\n", ScriptCount )); + + OTV_LIMIT_CHECK( ScriptCount * 6 ); + + valid->extra1 = otv_Feature_get_count( features ); + + /* ScriptRecord */ + for ( ; ScriptCount > 0; ScriptCount-- ) + { + p += 4; /* skip ScriptTag */ + + otv_Script_validate( table + FT_NEXT_USHORT( p ), valid ); /* Script */ + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + u: uint16 + ux: unit16 [x] + + s: struct + sx: struct [x] + sxy: struct [x], using external y count + + x: uint16 x + + C: Coverage + + O: Offset + On: Offset (NULL) + Ox: Offset [x] + Onx: Offset (NULL) [x] + */ + + FT_LOCAL_DEF( void ) + otv_x_Ox( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count; + OTV_Validate_Func func; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + + for ( ; Count > 0; Count-- ) + func( table + FT_NEXT_USHORT( p ), valid ); + + valid->nesting_level--; + + OTV_EXIT; + } + + + FT_LOCAL_DEF( void ) + otv_u_C_x_Ox( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count, Coverage; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + otv_Coverage_validate( table + Coverage, valid, Count ); + + OTV_LIMIT_CHECK( Count * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + + for ( ; Count > 0; Count-- ) + func( table + FT_NEXT_USHORT( p ), valid ); + + valid->nesting_level--; + + OTV_EXIT; + } + + + /* uses valid->extra1 (if > 0: array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_ux( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 2 ); + + if ( valid->extra1 ) + { + for ( ; Count > 0; Count-- ) + if ( FT_NEXT_USHORT( p ) >= valid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* `ux' in the function's name is not really correct since only x-1 */ + /* elements are tested */ + + /* uses valid->extra1 (array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_y_ux_sy( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count1, Count2; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + Count1 = FT_NEXT_USHORT( p ); + Count2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count1 = %d)\n", Count1 )); + OTV_TRACE(( " (Count2 = %d)\n", Count2 )); + + if ( Count1 == 0 ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( ( Count1 - 1 ) * 2 + Count2 * 4 ); + p += ( Count1 - 1 ) * 2; + + for ( ; Count2 > 0; Count2-- ) + { + if ( FT_NEXT_USHORT( p ) >= Count1 ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* `uy' in the function's name is not really correct since only y-1 */ + /* elements are tested */ + + /* uses valid->extra1 (array value limit) */ + + FT_LOCAL_DEF( void ) + otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BacktrackCount, InputCount, LookaheadCount; + FT_UInt Count; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + BacktrackCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackCount = %d)\n", BacktrackCount )); + + OTV_LIMIT_CHECK( BacktrackCount * 2 + 2 ); + p += BacktrackCount * 2; + + InputCount = FT_NEXT_USHORT( p ); + if ( InputCount == 0 ) + FT_INVALID_DATA; + + OTV_TRACE(( " (InputCount = %d)\n", InputCount )); + + OTV_LIMIT_CHECK( InputCount * 2 ); + p += ( InputCount - 1 ) * 2; + + LookaheadCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadCount = %d)\n", LookaheadCount )); + + OTV_LIMIT_CHECK( LookaheadCount * 2 + 2 ); + p += LookaheadCount * 2; + + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * 4 ); + + for ( ; Count > 0; Count-- ) + { + if ( FT_NEXT_USHORT( p ) >= InputCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->extra1 ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* sets valid->extra1 (valid->lookup_count) */ + + FT_LOCAL_DEF( void ) + otv_u_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Coverage, ClassDef, ClassSetCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 6 ); + Coverage = FT_NEXT_USHORT( p ); + ClassDef = FT_NEXT_USHORT( p ); + ClassSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassSetCount = %d)\n", ClassSetCount )); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + otv_ClassDef_validate( table + ClassDef, valid ); + + OTV_LIMIT_CHECK( ClassSetCount * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + valid->extra1 = valid->lookup_count; + + for ( ; ClassSetCount > 0; ClassSetCount-- ) + { + FT_UInt offset = FT_NEXT_USHORT( p ); + + + if ( offset ) + func( table + offset, valid ); + } + + valid->nesting_level--; + + OTV_EXIT; + } + + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_u_x_y_Ox_sy( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt GlyphCount, Count, count1; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 4 ); + GlyphCount = FT_NEXT_USHORT( p ); + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( GlyphCount * 2 + Count * 4 ); + + for ( count1 = GlyphCount; count1 > 0; count1-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + for ( ; Count > 0; Count-- ) + { + if ( FT_NEXT_USHORT( p ) >= GlyphCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->lookup_count ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + /* sets valid->extra1 (valid->lookup_count) */ + + FT_LOCAL_DEF( void ) + otv_u_O_O_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Coverage; + FT_UInt BacktrackClassDef, InputClassDef, LookaheadClassDef; + FT_UInt ChainClassSetCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 10 ); + Coverage = FT_NEXT_USHORT( p ); + BacktrackClassDef = FT_NEXT_USHORT( p ); + InputClassDef = FT_NEXT_USHORT( p ); + LookaheadClassDef = FT_NEXT_USHORT( p ); + ChainClassSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ChainClassSetCount = %d)\n", ChainClassSetCount )); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + + otv_ClassDef_validate( table + BacktrackClassDef, valid ); + otv_ClassDef_validate( table + InputClassDef, valid ); + otv_ClassDef_validate( table + LookaheadClassDef, valid ); + + OTV_LIMIT_CHECK( ChainClassSetCount * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + valid->extra1 = valid->lookup_count; + + for ( ; ChainClassSetCount > 0; ChainClassSetCount-- ) + { + FT_UInt offset = FT_NEXT_USHORT( p ); + + + if ( offset ) + func( table + offset, valid ); + } + + valid->nesting_level--; + + OTV_EXIT; + } + + + /* uses valid->lookup_count */ + + FT_LOCAL_DEF( void ) + otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt BacktrackGlyphCount, InputGlyphCount, LookaheadGlyphCount; + FT_UInt count1, count2; + + + OTV_ENTER; + + p += 2; /* skip Format */ + + OTV_LIMIT_CHECK( 2 ); + BacktrackGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount )); + + OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); + + for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + InputGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (InputGlyphCount = %d)\n", InputGlyphCount )); + + OTV_LIMIT_CHECK( InputGlyphCount * 2 + 2 ); + + for ( count1 = InputGlyphCount; count1 > 0; count1-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + LookaheadGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount )); + + OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 ); + + for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + count2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", count2 )); + + OTV_LIMIT_CHECK( count2 * 4 ); + + for ( ; count2 > 0; count2-- ) + { + if ( FT_NEXT_USHORT( p ) >= InputGlyphCount ) + FT_INVALID_DATA; + + if ( FT_NEXT_USHORT( p ) >= valid->lookup_count ) + FT_INVALID_DATA; + } + + OTV_EXIT; + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ) + { + FT_Bytes p = table + 8; + + + return otv_LookupList_get_count( table + FT_NEXT_USHORT( p ) ); + } + + + FT_LOCAL_DEF( FT_UInt ) + otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ) + { + FT_Bytes p, lookup; + FT_UInt count; + + + if ( !table ) + return 0; + + /* LookupList */ + p = table + 8; + table += FT_NEXT_USHORT( p ); + + /* LookupCount */ + p = table; + count = FT_NEXT_USHORT( p ); + + for ( ; count > 0; count-- ) + { + FT_Bytes oldp; + + + /* Lookup */ + lookup = table + FT_NEXT_USHORT( p ); + + oldp = p; + + /* LookupFlag */ + p = lookup + 2; + if ( FT_NEXT_USHORT( p ) & 0xFF00U ) + return 1; + + p = oldp; + } + + return 0; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvcommn.h b/alienblaster/project/jni/freetype/src/otvalid/otvcommn.h new file mode 100644 index 000000000..898887fc9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvcommn.h @@ -0,0 +1,437 @@ +/***************************************************************************/ +/* */ +/* otvcommn.h */ +/* */ +/* OpenType common tables validation (specification). */ +/* */ +/* Copyright 2004, 2005, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __OTVCOMMN_H__ +#define __OTVCOMMN_H__ + + +#include <ft2build.h> +#include "otvalid.h" +#include FT_INTERNAL_DEBUG_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALIDATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct OTV_ValidatorRec_* OTV_Validator; + + typedef void (*OTV_Validate_Func)( FT_Bytes table, + OTV_Validator valid ); + + typedef struct OTV_ValidatorRec_ + { + FT_Validator root; + FT_UInt type_count; + OTV_Validate_Func* type_funcs; + + FT_UInt lookup_count; + FT_UInt glyph_count; + + FT_UInt nesting_level; + + OTV_Validate_Func func[3]; + + FT_UInt extra1; /* for passing parameters */ + FT_UInt extra2; + FT_Bytes extra3; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt debug_indent; + const FT_String* debug_function_name[3]; +#endif + + } OTV_ValidatorRec; + + +#undef FT_INVALID_ +#define FT_INVALID_( _prefix, _error ) \ + ft_validator_error( valid->root, _prefix ## _error ) + +#define OTV_OPTIONAL_TABLE( _table ) FT_UShort _table; \ + FT_Bytes _table ## _p + +#define OTV_OPTIONAL_OFFSET( _offset ) \ + FT_BEGIN_STMNT \ + _offset ## _p = p; \ + _offset = FT_NEXT_USHORT( p ); \ + FT_END_STMNT + +#define OTV_LIMIT_CHECK( _count ) \ + FT_BEGIN_STMNT \ + if ( p + (_count) > valid->root->limit ) \ + FT_INVALID_TOO_SHORT; \ + FT_END_STMNT + +#define OTV_SIZE_CHECK( _size ) \ + FT_BEGIN_STMNT \ + if ( _size > 0 && _size < table_size ) \ + { \ + if ( valid->root->level == FT_VALIDATE_PARANOID ) \ + FT_INVALID_OFFSET; \ + else \ + { \ + /* strip off `const' */ \ + FT_Byte* pp = (FT_Byte*)_size ## _p; \ + \ + \ + FT_TRACE3(( "\n" \ + "Invalid offset to optional table `%s'" \ + " set to zero.\n" \ + "\n", #_size )); \ + \ + /* always assume 16bit entities */ \ + _size = pp[0] = pp[1] = 0; \ + } \ + } \ + FT_END_STMNT + + +#define OTV_NAME_(x) #x +#define OTV_NAME(x) OTV_NAME_(x) + +#define OTV_FUNC_(x) x##Func +#define OTV_FUNC(x) OTV_FUNC_(x) + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define OTV_NEST1( x ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->debug_function_name[0] = OTV_NAME( x ); \ + FT_END_STMNT + +#define OTV_NEST2( x, y ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->func[1] = OTV_FUNC( y ); \ + valid->debug_function_name[0] = OTV_NAME( x ); \ + valid->debug_function_name[1] = OTV_NAME( y ); \ + FT_END_STMNT + +#define OTV_NEST3( x, y, z ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->func[1] = OTV_FUNC( y ); \ + valid->func[2] = OTV_FUNC( z ); \ + valid->debug_function_name[0] = OTV_NAME( x ); \ + valid->debug_function_name[1] = OTV_NAME( y ); \ + valid->debug_function_name[2] = OTV_NAME( z ); \ + FT_END_STMNT + +#define OTV_INIT valid->debug_indent = 0 + +#define OTV_ENTER \ + FT_BEGIN_STMNT \ + valid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4(( "%s table\n", \ + valid->debug_function_name[valid->nesting_level] )); \ + FT_END_STMNT + +#define OTV_NAME_ENTER( name ) \ + FT_BEGIN_STMNT \ + valid->debug_indent += 2; \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4(( "%s table\n", name )); \ + FT_END_STMNT + +#define OTV_EXIT valid->debug_indent -= 2 + +#define OTV_TRACE( s ) \ + FT_BEGIN_STMNT \ + FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \ + FT_TRACE4( s ); \ + FT_END_STMNT + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define OTV_NEST1( x ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + FT_END_STMNT + +#define OTV_NEST2( x, y ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->func[1] = OTV_FUNC( y ); \ + FT_END_STMNT + +#define OTV_NEST3( x, y, z ) \ + FT_BEGIN_STMNT \ + valid->nesting_level = 0; \ + valid->func[0] = OTV_FUNC( x ); \ + valid->func[1] = OTV_FUNC( y ); \ + valid->func[2] = OTV_FUNC( z ); \ + FT_END_STMNT + +#define OTV_INIT do { } while ( 0 ) +#define OTV_ENTER do { } while ( 0 ) +#define OTV_NAME_ENTER( name ) do { } while ( 0 ) +#define OTV_EXIT do { } while ( 0 ) + +#define OTV_TRACE( s ) do { } while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#define OTV_RUN valid->func[0] + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** COVERAGE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Coverage_validate( FT_Bytes table, + OTV_Validator valid, + FT_Int expected_count ); + + /* return first covered glyph */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_first( FT_Bytes table ); + + /* return last covered glyph */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_last( FT_Bytes table ); + + /* return number of covered glyphs */ + FT_LOCAL( FT_UInt ) + otv_Coverage_get_count( FT_Bytes table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CLASS DEFINITION TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_ClassDef_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** DEVICE TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Device_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LOOKUPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Lookup_validate( FT_Bytes table, + OTV_Validator valid ); + + FT_LOCAL( void ) + otv_LookupList_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FEATURES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Feature_validate( FT_Bytes table, + OTV_Validator valid ); + + /* lookups must already be validated */ + FT_LOCAL( void ) + otv_FeatureList_validate( FT_Bytes table, + FT_Bytes lookups, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LANGUAGE SYSTEM *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_LangSys_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SCRIPTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + otv_Script_validate( FT_Bytes table, + OTV_Validator valid ); + + /* features must already be validated */ + FT_LOCAL( void ) + otv_ScriptList_validate( FT_Bytes table, + FT_Bytes features, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define ChainPosClassSetFunc otv_x_Ox +#define ChainPosRuleSetFunc otv_x_Ox +#define ChainSubClassSetFunc otv_x_Ox +#define ChainSubRuleSetFunc otv_x_Ox +#define JstfLangSysFunc otv_x_Ox +#define JstfMaxFunc otv_x_Ox +#define LigGlyphFunc otv_x_Ox +#define LigatureArrayFunc otv_x_Ox +#define LigatureSetFunc otv_x_Ox +#define PosClassSetFunc otv_x_Ox +#define PosRuleSetFunc otv_x_Ox +#define SubClassSetFunc otv_x_Ox +#define SubRuleSetFunc otv_x_Ox + + FT_LOCAL( void ) + otv_x_Ox ( FT_Bytes table, + OTV_Validator valid ); + +#define AlternateSubstFormat1Func otv_u_C_x_Ox +#define ChainContextPosFormat1Func otv_u_C_x_Ox +#define ChainContextSubstFormat1Func otv_u_C_x_Ox +#define ContextPosFormat1Func otv_u_C_x_Ox +#define ContextSubstFormat1Func otv_u_C_x_Ox +#define LigatureSubstFormat1Func otv_u_C_x_Ox +#define MultipleSubstFormat1Func otv_u_C_x_Ox + + FT_LOCAL( void ) + otv_u_C_x_Ox( FT_Bytes table, + OTV_Validator valid ); + +#define AlternateSetFunc otv_x_ux +#define AttachPointFunc otv_x_ux +#define ExtenderGlyphFunc otv_x_ux +#define JstfGPOSModListFunc otv_x_ux +#define JstfGSUBModListFunc otv_x_ux +#define SequenceFunc otv_x_ux + + FT_LOCAL( void ) + otv_x_ux( FT_Bytes table, + OTV_Validator valid ); + +#define PosClassRuleFunc otv_x_y_ux_sy +#define PosRuleFunc otv_x_y_ux_sy +#define SubClassRuleFunc otv_x_y_ux_sy +#define SubRuleFunc otv_x_y_ux_sy + + FT_LOCAL( void ) + otv_x_y_ux_sy( FT_Bytes table, + OTV_Validator valid ); + +#define ChainPosClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainPosRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainSubClassRuleFunc otv_x_ux_y_uy_z_uz_p_sp +#define ChainSubRuleFunc otv_x_ux_y_uy_z_uz_p_sp + + FT_LOCAL( void ) + otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes table, + OTV_Validator valid ); + +#define ContextPosFormat2Func otv_u_O_O_x_Onx +#define ContextSubstFormat2Func otv_u_O_O_x_Onx + + FT_LOCAL( void ) + otv_u_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ); + +#define ContextPosFormat3Func otv_u_x_y_Ox_sy +#define ContextSubstFormat3Func otv_u_x_y_Ox_sy + + FT_LOCAL( void ) + otv_u_x_y_Ox_sy( FT_Bytes table, + OTV_Validator valid ); + +#define ChainContextPosFormat2Func otv_u_O_O_O_O_x_Onx +#define ChainContextSubstFormat2Func otv_u_O_O_O_O_x_Onx + + FT_LOCAL( void ) + otv_u_O_O_O_O_x_Onx( FT_Bytes table, + OTV_Validator valid ); + +#define ChainContextPosFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp +#define ChainContextSubstFormat3Func otv_u_x_Ox_y_Oy_z_Oz_p_sp + + FT_LOCAL( void ) + otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes table, + OTV_Validator valid ); + + + FT_LOCAL( FT_UInt ) + otv_GSUBGPOS_get_Lookup_count( FT_Bytes table ); + + FT_LOCAL( FT_UInt ) + otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes table ); + + /* */ + +FT_END_HEADER + +#endif /* __OTVCOMMN_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otverror.h b/alienblaster/project/jni/freetype/src/otvalid/otverror.h new file mode 100644 index 000000000..041b53836 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otverror.h @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* otverror.h */ +/* */ +/* OpenType validation module error codes (specification only). */ +/* */ +/* Copyright 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the OpenType validation module error */ + /* enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __OTVERROR_H__ +#define __OTVERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX OTV_Err_ +#define FT_ERR_BASE FT_Mod_Err_OTvalid + +#define FT_KEEP_ERR_PREFIX + +#include FT_ERRORS_H + +#endif /* __OTVERROR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvgdef.c b/alienblaster/project/jni/freetype/src/otvalid/otvgdef.c new file mode 100644 index 000000000..3633ad0de --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvgdef.c @@ -0,0 +1,224 @@ +/***************************************************************************/ +/* */ +/* otvgdef.c */ +/* */ +/* OpenType GDEF table validation (body). */ +/* */ +/* Copyright 2004, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvgdef + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define AttachListFunc otv_O_x_Ox +#define LigCaretListFunc otv_O_x_Ox + + /* sets valid->extra1 (0) */ + + static void + otv_O_x_Ox( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_Bytes Coverage; + FT_UInt GlyphCount; + OTV_Validate_Func func; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + otv_Coverage_validate( Coverage, valid, GlyphCount ); + if ( GlyphCount != otv_Coverage_get_count( Coverage ) ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + valid->extra1 = 0; + + for ( ; GlyphCount > 0; GlyphCount-- ) + func( table + FT_NEXT_USHORT( p ), valid ); + + valid->nesting_level--; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** LIGATURE CARETS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define CaretValueFunc otv_CaretValue_validate + + static void + otv_CaretValue_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt CaretValueFormat; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + + CaretValueFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format = %d)\n", CaretValueFormat )); + + switch ( CaretValueFormat ) + { + case 1: /* CaretValueFormat1 */ + /* skip Coordinate, no test */ + break; + + case 2: /* CaretValueFormat2 */ + /* skip CaretValuePoint, no test */ + break; + + case 3: /* CaretValueFormat3 */ + p += 2; /* skip Coordinate */ + + OTV_LIMIT_CHECK( 2 ); + + /* DeviceTable */ + otv_Device_validate( table + FT_NEXT_USHORT( p ), valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GDEF TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GDEF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt table_size; + FT_Bool need_MarkAttachClassDef; + + OTV_OPTIONAL_TABLE( GlyphClassDef ); + OTV_OPTIONAL_TABLE( AttachListOffset ); + OTV_OPTIONAL_TABLE( LigCaretListOffset ); + OTV_OPTIONAL_TABLE( MarkAttachClassDef ); + + + valid->root = ftvalid; + + FT_TRACE3(( "validating GDEF table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 12 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + /* MarkAttachClassDef has been added to the OpenType */ + /* specification without increasing GDEF's version, */ + /* so we use this ugly hack to find out whether the */ + /* table is needed actually. */ + + need_MarkAttachClassDef = FT_BOOL( + otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) || + otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) ); + + if ( need_MarkAttachClassDef ) + table_size = 12; /* OpenType >= 1.2 */ + else + table_size = 10; /* OpenType < 1.2 */ + + valid->glyph_count = glyph_count; + + OTV_OPTIONAL_OFFSET( GlyphClassDef ); + OTV_SIZE_CHECK( GlyphClassDef ); + if ( GlyphClassDef ) + otv_ClassDef_validate( table + GlyphClassDef, valid ); + + OTV_OPTIONAL_OFFSET( AttachListOffset ); + OTV_SIZE_CHECK( AttachListOffset ); + if ( AttachListOffset ) + { + OTV_NEST2( AttachList, AttachPoint ); + OTV_RUN( table + AttachListOffset, valid ); + } + + OTV_OPTIONAL_OFFSET( LigCaretListOffset ); + OTV_SIZE_CHECK( LigCaretListOffset ); + if ( LigCaretListOffset ) + { + OTV_NEST3( LigCaretList, LigGlyph, CaretValue ); + OTV_RUN( table + LigCaretListOffset, valid ); + } + + if ( need_MarkAttachClassDef ) + { + OTV_OPTIONAL_OFFSET( MarkAttachClassDef ); + OTV_SIZE_CHECK( MarkAttachClassDef ); + if ( MarkAttachClassDef ) + otv_ClassDef_validate( table + MarkAttachClassDef, valid ); + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvgpos.c b/alienblaster/project/jni/freetype/src/otvalid/otvgpos.c new file mode 100644 index 000000000..49b46183a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvgpos.c @@ -0,0 +1,1017 @@ +/***************************************************************************/ +/* */ +/* otvgpos.c */ +/* */ +/* OpenType GPOS table validation (body). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvgpos + + + static void + otv_Anchor_validate( FT_Bytes table, + OTV_Validator valid ); + + static void + otv_MarkArray_validate( FT_Bytes table, + OTV_Validator valid ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** UTILITY FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define BaseArrayFunc otv_x_sxy +#define LigatureAttachFunc otv_x_sxy +#define Mark2ArrayFunc otv_x_sxy + + /* uses valid->extra1 (counter) */ + /* uses valid->extra2 (boolean to handle NULL anchor field) */ + + static void + otv_x_sxy( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Count, count1, table_size; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 2 ); + + Count = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (Count = %d)\n", Count )); + + OTV_LIMIT_CHECK( Count * valid->extra1 * 2 ); + + table_size = Count * valid->extra1 * 2 + 2; + + for ( ; Count > 0; Count-- ) + for ( count1 = valid->extra1; count1 > 0; count1-- ) + { + OTV_OPTIONAL_TABLE( anchor_offset ); + + + OTV_OPTIONAL_OFFSET( anchor_offset ); + + if ( valid->extra2 ) + { + OTV_SIZE_CHECK( anchor_offset ); + if ( anchor_offset ) + otv_Anchor_validate( table + anchor_offset, valid ); + } + else + otv_Anchor_validate( table + anchor_offset, valid ); + } + + OTV_EXIT; + } + + +#define MarkBasePosFormat1Func otv_u_O_O_u_O_O +#define MarkLigPosFormat1Func otv_u_O_O_u_O_O +#define MarkMarkPosFormat1Func otv_u_O_O_u_O_O + + /* sets valid->extra1 (class count) */ + + static void + otv_u_O_O_u_O_O( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt Coverage1, Coverage2, ClassCount; + FT_UInt Array1, Array2; + OTV_Validate_Func func; + + + OTV_ENTER; + + p += 2; /* skip PosFormat */ + + OTV_LIMIT_CHECK( 10 ); + Coverage1 = FT_NEXT_USHORT( p ); + Coverage2 = FT_NEXT_USHORT( p ); + ClassCount = FT_NEXT_USHORT( p ); + Array1 = FT_NEXT_USHORT( p ); + Array2 = FT_NEXT_USHORT( p ); + + otv_Coverage_validate( table + Coverage1, valid, -1 ); + otv_Coverage_validate( table + Coverage2, valid, -1 ); + + otv_MarkArray_validate( table + Array1, valid ); + + valid->nesting_level++; + func = valid->func[valid->nesting_level]; + valid->extra1 = ClassCount; + + func( table + Array2, valid ); + + valid->nesting_level--; + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** VALUE RECORDS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_UInt + otv_value_length( FT_UInt format ) + { + FT_UInt count; + + + count = ( ( format & 0xAA ) >> 1 ) + ( format & 0x55 ); + count = ( ( count & 0xCC ) >> 2 ) + ( count & 0x33 ); + count = ( ( count & 0xF0 ) >> 4 ) + ( count & 0x0F ); + + return count * 2; + } + + + /* uses valid->extra3 (pointer to base table) */ + + static void + otv_ValueRecord_validate( FT_Bytes table, + FT_UInt format, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt count; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Int loop; + FT_ULong res = 0; + + + OTV_NAME_ENTER( "ValueRecord" ); + + /* display `format' in dual representation */ + for ( loop = 7; loop >= 0; loop-- ) + { + res <<= 4; + res += ( format >> loop ) & 1; + } + + OTV_TRACE(( " (format 0b%08lx)\n", res )); +#endif + + if ( format >= 0x100 ) + FT_INVALID_FORMAT; + + for ( count = 4; count > 0; count-- ) + { + if ( format & 1 ) + { + /* XPlacement, YPlacement, XAdvance, YAdvance */ + OTV_LIMIT_CHECK( 2 ); + p += 2; + } + + format >>= 1; + } + + for ( count = 4; count > 0; count-- ) + { + if ( format & 1 ) + { + FT_PtrDist table_size; + + OTV_OPTIONAL_TABLE( device ); + + + /* XPlaDevice, YPlaDevice, XAdvDevice, YAdvDevice */ + OTV_LIMIT_CHECK( 2 ); + OTV_OPTIONAL_OFFSET( device ); + + /* XXX: this value is usually too small, especially if the current */ + /* ValueRecord is part of an array -- getting the correct table */ + /* size is probably not worth the trouble */ + + table_size = p - valid->extra3; + + OTV_SIZE_CHECK( device ); + if ( device ) + otv_Device_validate( valid->extra3 + device, valid ); + } + format >>= 1; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** ANCHORS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_Anchor_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt AnchorFormat; + + + OTV_NAME_ENTER( "Anchor"); + + OTV_LIMIT_CHECK( 6 ); + AnchorFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", AnchorFormat )); + + p += 4; /* skip XCoordinate and YCoordinate */ + + switch ( AnchorFormat ) + { + case 1: + break; + + case 2: + OTV_LIMIT_CHECK( 2 ); /* AnchorPoint */ + break; + + case 3: + { + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( XDeviceTable ); + OTV_OPTIONAL_TABLE( YDeviceTable ); + + + OTV_LIMIT_CHECK( 4 ); + OTV_OPTIONAL_OFFSET( XDeviceTable ); + OTV_OPTIONAL_OFFSET( YDeviceTable ); + + table_size = 6 + 4; + + OTV_SIZE_CHECK( XDeviceTable ); + if ( XDeviceTable ) + otv_Device_validate( table + XDeviceTable, valid ); + + OTV_SIZE_CHECK( YDeviceTable ); + if ( YDeviceTable ) + otv_Device_validate( table + YDeviceTable, valid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MARK ARRAYS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MarkArray_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt MarkCount; + + + OTV_NAME_ENTER( "MarkArray" ); + + OTV_LIMIT_CHECK( 2 ); + MarkCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (MarkCount = %d)\n", MarkCount )); + + OTV_LIMIT_CHECK( MarkCount * 4 ); + + /* MarkRecord */ + for ( ; MarkCount > 0; MarkCount-- ) + { + p += 2; /* skip Class */ + /* MarkAnchor */ + otv_Anchor_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 1 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra3 (pointer to base table) */ + + static void + otv_SinglePos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "SinglePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + valid->extra3 = table; + + switch ( PosFormat ) + { + case 1: /* SinglePosFormat1 */ + { + FT_UInt Coverage, ValueFormat; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat = FT_NEXT_USHORT( p ); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + otv_ValueRecord_validate( p, ValueFormat, valid ); /* Value */ + } + break; + + case 2: /* SinglePosFormat2 */ + { + FT_UInt Coverage, ValueFormat, ValueCount, len_value; + + + OTV_LIMIT_CHECK( 6 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat = FT_NEXT_USHORT( p ); + ValueCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ValueCount = %d)\n", ValueCount )); + + len_value = otv_value_length( ValueFormat ); + + otv_Coverage_validate( table + Coverage, valid, ValueCount ); + + OTV_LIMIT_CHECK( ValueCount * len_value ); + + /* Value */ + for ( ; ValueCount > 0; ValueCount-- ) + { + otv_ValueRecord_validate( p, ValueFormat, valid ); + p += len_value; + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 2 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_PairSet_validate( FT_Bytes table, + FT_UInt format1, + FT_UInt format2, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt value_len1, value_len2, PairValueCount; + + + OTV_NAME_ENTER( "PairSet" ); + + OTV_LIMIT_CHECK( 2 ); + PairValueCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (PairValueCount = %d)\n", PairValueCount )); + + value_len1 = otv_value_length( format1 ); + value_len2 = otv_value_length( format2 ); + + OTV_LIMIT_CHECK( PairValueCount * ( value_len1 + value_len2 + 2 ) ); + + /* PairValueRecord */ + for ( ; PairValueCount > 0; PairValueCount-- ) + { + p += 2; /* skip SecondGlyph */ + + if ( format1 ) + otv_ValueRecord_validate( p, format1, valid ); /* Value1 */ + p += value_len1; + + if ( format2 ) + otv_ValueRecord_validate( p, format2, valid ); /* Value2 */ + p += value_len2; + } + + OTV_EXIT; + } + + + /* sets valid->extra3 (pointer to base table) */ + + static void + otv_PairPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "PairPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + valid->extra3 = table; + + switch ( PosFormat ) + { + case 1: /* PairPosFormat1 */ + { + FT_UInt Coverage, ValueFormat1, ValueFormat2, PairSetCount; + + + OTV_LIMIT_CHECK( 8 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat1 = FT_NEXT_USHORT( p ); + ValueFormat2 = FT_NEXT_USHORT( p ); + PairSetCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (PairSetCount = %d)\n", PairSetCount )); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + + OTV_LIMIT_CHECK( PairSetCount * 2 ); + + /* PairSetOffset */ + for ( ; PairSetCount > 0; PairSetCount-- ) + otv_PairSet_validate( table + FT_NEXT_USHORT( p ), + ValueFormat1, ValueFormat2, valid ); + } + break; + + case 2: /* PairPosFormat2 */ + { + FT_UInt Coverage, ValueFormat1, ValueFormat2, ClassDef1, ClassDef2; + FT_UInt ClassCount1, ClassCount2, len_value1, len_value2, count; + + + OTV_LIMIT_CHECK( 14 ); + Coverage = FT_NEXT_USHORT( p ); + ValueFormat1 = FT_NEXT_USHORT( p ); + ValueFormat2 = FT_NEXT_USHORT( p ); + ClassDef1 = FT_NEXT_USHORT( p ); + ClassDef2 = FT_NEXT_USHORT( p ); + ClassCount1 = FT_NEXT_USHORT( p ); + ClassCount2 = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (ClassCount1 = %d)\n", ClassCount1 )); + OTV_TRACE(( " (ClassCount2 = %d)\n", ClassCount2 )); + + len_value1 = otv_value_length( ValueFormat1 ); + len_value2 = otv_value_length( ValueFormat2 ); + + otv_Coverage_validate( table + Coverage, valid, -1 ); + otv_ClassDef_validate( table + ClassDef1, valid ); + otv_ClassDef_validate( table + ClassDef2, valid ); + + OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 * + ( len_value1 + len_value2 ) ); + + /* Class1Record */ + for ( ; ClassCount1 > 0; ClassCount1-- ) + { + /* Class2Record */ + for ( count = ClassCount2; count > 0; count-- ) + { + if ( ValueFormat1 ) + /* Value1 */ + otv_ValueRecord_validate( p, ValueFormat1, valid ); + p += len_value1; + + if ( ValueFormat2 ) + /* Value2 */ + otv_ValueRecord_validate( p, ValueFormat2, valid ); + p += len_value2; + } + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 3 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_CursivePos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "CursivePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: /* CursivePosFormat1 */ + { + FT_UInt table_size; + FT_UInt Coverage, EntryExitCount; + + OTV_OPTIONAL_TABLE( EntryAnchor ); + OTV_OPTIONAL_TABLE( ExitAnchor ); + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + EntryExitCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (EntryExitCount = %d)\n", EntryExitCount )); + + otv_Coverage_validate( table + Coverage, valid, EntryExitCount ); + + OTV_LIMIT_CHECK( EntryExitCount * 4 ); + + table_size = EntryExitCount * 4 + 4; + + /* EntryExitRecord */ + for ( ; EntryExitCount > 0; EntryExitCount-- ) + { + OTV_OPTIONAL_OFFSET( EntryAnchor ); + OTV_OPTIONAL_OFFSET( ExitAnchor ); + + OTV_SIZE_CHECK( EntryAnchor ); + if ( EntryAnchor ) + otv_Anchor_validate( table + EntryAnchor, valid ); + + OTV_SIZE_CHECK( ExitAnchor ); + if ( ExitAnchor ) + otv_Anchor_validate( table + ExitAnchor, valid ); + } + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* UNDOCUMENTED (in OpenType 1.5): */ + /* BaseRecord tables can contain NULL pointers. */ + + /* sets valid->extra2 (1) */ + + static void + otv_MarkBasePos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkBasePos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + valid->extra2 = 1; + OTV_NEST2( MarkBasePosFormat1, BaseArray ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 5 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra2 (1) */ + + static void + otv_MarkLigPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkLigPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + valid->extra2 = 1; + OTV_NEST3( MarkLigPosFormat1, LigatureArray, LigatureAttach ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra2 (0) */ + + static void + otv_MarkMarkPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "MarkMarkPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + valid->extra2 = 0; + OTV_NEST2( MarkMarkPosFormat1, Mark2Array ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 7 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (lookup count) */ + + static void + otv_ContextPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ContextPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + valid->extra1 = valid->lookup_count; + OTV_NEST3( ContextPosFormat1, PosRuleSet, PosRule ); + OTV_RUN( table, valid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ContextPosFormat2, PosClassSet, PosClassRule ); + OTV_RUN( table, valid ); + break; + + case 3: + OTV_NEST1( ContextPosFormat3 ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 8 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (lookup count) */ + + static void + otv_ChainContextPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ChainContextPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + valid->extra1 = valid->lookup_count; + OTV_NEST3( ChainContextPosFormat1, + ChainPosRuleSet, ChainPosRule ); + OTV_RUN( table, valid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ChainContextPosFormat2, + ChainPosClassSet, ChainPosClassRule ); + OTV_RUN( table, valid ); + break; + + case 3: + OTV_NEST1( ChainContextPosFormat3 ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS LOOKUP TYPE 9 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->type_funcs */ + + static void + otv_ExtensionPos_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt PosFormat; + + + OTV_NAME_ENTER( "ExtensionPos" ); + + OTV_LIMIT_CHECK( 2 ); + PosFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", PosFormat )); + + switch ( PosFormat ) + { + case 1: /* ExtensionPosFormat1 */ + { + FT_UInt ExtensionLookupType; + FT_ULong ExtensionOffset; + OTV_Validate_Func validate; + + + OTV_LIMIT_CHECK( 6 ); + ExtensionLookupType = FT_NEXT_USHORT( p ); + ExtensionOffset = FT_NEXT_ULONG( p ); + + if ( ExtensionLookupType == 0 || ExtensionLookupType >= 9 ) + FT_INVALID_DATA; + + validate = valid->type_funcs[ExtensionLookupType - 1]; + validate( table + ExtensionOffset, valid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static const OTV_Validate_Func otv_gpos_validate_funcs[9] = + { + otv_SinglePos_validate, + otv_PairPos_validate, + otv_CursivePos_validate, + otv_MarkBasePos_validate, + otv_MarkLigPos_validate, + otv_MarkMarkPos_validate, + otv_ContextPos_validate, + otv_ChainContextPos_validate, + otv_ExtensionPos_validate + }; + + + /* sets valid->type_count */ + /* sets valid->type_funcs */ + + FT_LOCAL_DEF( void ) + otv_GPOS_subtable_validate( FT_Bytes table, + OTV_Validator valid ) + { + valid->type_count = 9; + valid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; + + otv_Lookup_validate( table, valid ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GPOS TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GPOS_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt ScriptList, FeatureList, LookupList; + + + valid->root = ftvalid; + + FT_TRACE3(( "validating GPOS table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 10 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + ScriptList = FT_NEXT_USHORT( p ); + FeatureList = FT_NEXT_USHORT( p ); + LookupList = FT_NEXT_USHORT( p ); + + valid->type_count = 9; + valid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs; + valid->glyph_count = glyph_count; + + otv_LookupList_validate( table + LookupList, + valid ); + otv_FeatureList_validate( table + FeatureList, table + LookupList, + valid ); + otv_ScriptList_validate( table + ScriptList, table + FeatureList, + valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvgpos.h b/alienblaster/project/jni/freetype/src/otvalid/otvgpos.h new file mode 100644 index 000000000..14ca40826 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvgpos.h @@ -0,0 +1,36 @@ +/***************************************************************************/ +/* */ +/* otvgpos.h */ +/* */ +/* OpenType GPOS table validator (specification). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __OTVGPOS_H__ +#define __OTVGPOS_H__ + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + otv_GPOS_subtable_validate( FT_Bytes table, + OTV_Validator valid ); + + +FT_END_HEADER + +#endif /* __OTVGPOS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvgsub.c b/alienblaster/project/jni/freetype/src/otvalid/otvgsub.c new file mode 100644 index 000000000..ed499d1e9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvgsub.c @@ -0,0 +1,585 @@ +/***************************************************************************/ +/* */ +/* otvgsub.c */ +/* */ +/* OpenType GSUB table validation (body). */ +/* */ +/* Copyright 2004, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvgsub + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 1 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->glyph_count */ + + static void + otv_SingleSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "SingleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* SingleSubstFormat1 */ + { + FT_Bytes Coverage; + FT_Int DeltaGlyphID; + FT_Long idx; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + DeltaGlyphID = FT_NEXT_SHORT( p ); + + otv_Coverage_validate( Coverage, valid, -1 ); + + idx = otv_Coverage_get_first( Coverage ) + DeltaGlyphID; + if ( idx < 0 ) + FT_INVALID_DATA; + + idx = otv_Coverage_get_last( Coverage ) + DeltaGlyphID; + if ( (FT_UInt)idx >= valid->glyph_count ) + FT_INVALID_DATA; + } + break; + + case 2: /* SingleSubstFormat2 */ + { + FT_UInt Coverage, GlyphCount; + + + OTV_LIMIT_CHECK( 4 ); + Coverage = FT_NEXT_USHORT( p ); + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + otv_Coverage_validate( table + Coverage, valid, GlyphCount ); + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + /* Substitute */ + for ( ; GlyphCount > 0; GlyphCount-- ) + if ( FT_NEXT_USHORT( p ) >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 2 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (glyph count) */ + + static void + otv_MultipleSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "MultipleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + valid->extra1 = valid->glyph_count; + OTV_NEST2( MultipleSubstFormat1, Sequence ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 3 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (glyph count) */ + + static void + otv_AlternateSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "AlternateSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + valid->extra1 = valid->glyph_count; + OTV_NEST2( AlternateSubstFormat1, AlternateSet ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define LigatureFunc otv_Ligature_validate + + /* uses valid->glyph_count */ + + static void + otv_Ligature_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt LigatureGlyph, CompCount; + + + OTV_ENTER; + + OTV_LIMIT_CHECK( 4 ); + LigatureGlyph = FT_NEXT_USHORT( p ); + if ( LigatureGlyph >= valid->glyph_count ) + FT_INVALID_DATA; + + CompCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (CompCount = %d)\n", CompCount )); + + if ( CompCount == 0 ) + FT_INVALID_DATA; + + CompCount--; + + OTV_LIMIT_CHECK( CompCount * 2 ); /* Component */ + + /* no need to check the Component glyph indices */ + + OTV_EXIT; + } + + + static void + otv_LigatureSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "LigatureSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + OTV_NEST3( LigatureSubstFormat1, LigatureSet, Ligature ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 5 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (lookup count) */ + + static void + otv_ContextSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ContextSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + valid->extra1 = valid->lookup_count; + OTV_NEST3( ContextSubstFormat1, SubRuleSet, SubRule ); + OTV_RUN( table, valid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ContextSubstFormat2, SubClassSet, SubClassRule ); + OTV_RUN( table, valid ); + break; + + case 3: + OTV_NEST1( ContextSubstFormat3 ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->extra1 (lookup count) */ + + static void + otv_ChainContextSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ChainContextSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + valid->extra1 = valid->lookup_count; + OTV_NEST3( ChainContextSubstFormat1, + ChainSubRuleSet, ChainSubRule ); + OTV_RUN( table, valid ); + break; + + case 2: + /* no need to check glyph indices/classes used as input for these */ + /* context rules since even invalid glyph indices/classes return */ + /* meaningful results */ + + OTV_NEST3( ChainContextSubstFormat2, + ChainSubClassSet, ChainSubClassRule ); + OTV_RUN( table, valid ); + break; + + case 3: + OTV_NEST1( ChainContextSubstFormat3 ); + OTV_RUN( table, valid ); + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 7 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->type_funcs */ + + static void + otv_ExtensionSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt SubstFormat; + + + OTV_NAME_ENTER( "ExtensionSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* ExtensionSubstFormat1 */ + { + FT_UInt ExtensionLookupType; + FT_ULong ExtensionOffset; + OTV_Validate_Func validate; + + + OTV_LIMIT_CHECK( 6 ); + ExtensionLookupType = FT_NEXT_USHORT( p ); + ExtensionOffset = FT_NEXT_ULONG( p ); + + if ( ExtensionLookupType == 0 || + ExtensionLookupType == 7 || + ExtensionLookupType > 8 ) + FT_INVALID_DATA; + + validate = valid->type_funcs[ExtensionLookupType - 1]; + validate( table + ExtensionOffset, valid ); + } + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB LOOKUP TYPE 8 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* uses valid->glyph_count */ + + static void + otv_ReverseChainSingleSubst_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table, Coverage; + FT_UInt SubstFormat; + FT_UInt BacktrackGlyphCount, LookaheadGlyphCount, GlyphCount; + + + OTV_NAME_ENTER( "ReverseChainSingleSubst" ); + + OTV_LIMIT_CHECK( 2 ); + SubstFormat = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (format %d)\n", SubstFormat )); + + switch ( SubstFormat ) + { + case 1: /* ReverseChainSingleSubstFormat1 */ + OTV_LIMIT_CHECK( 4 ); + Coverage = table + FT_NEXT_USHORT( p ); + BacktrackGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount )); + + otv_Coverage_validate( Coverage, valid, -1 ); + + OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 ); + + for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + LookaheadGlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount )); + + OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 ); + + for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- ) + otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 ); + + GlyphCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount )); + + if ( GlyphCount != otv_Coverage_get_count( Coverage ) ) + FT_INVALID_DATA; + + OTV_LIMIT_CHECK( GlyphCount * 2 ); + + /* Substitute */ + for ( ; GlyphCount > 0; GlyphCount-- ) + if ( FT_NEXT_USHORT( p ) >= valid->glyph_count ) + FT_INVALID_DATA; + + break; + + default: + FT_INVALID_FORMAT; + } + + OTV_EXIT; + } + + + static const OTV_Validate_Func otv_gsub_validate_funcs[8] = + { + otv_SingleSubst_validate, + otv_MultipleSubst_validate, + otv_AlternateSubst_validate, + otv_LigatureSubst_validate, + otv_ContextSubst_validate, + otv_ChainContextSubst_validate, + otv_ExtensionSubst_validate, + otv_ReverseChainSingleSubst_validate + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GSUB TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->type_count */ + /* sets valid->type_funcs */ + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_GSUB_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt ScriptList, FeatureList, LookupList; + + + valid->root = ftvalid; + + FT_TRACE3(( "validating GSUB table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 10 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + ScriptList = FT_NEXT_USHORT( p ); + FeatureList = FT_NEXT_USHORT( p ); + LookupList = FT_NEXT_USHORT( p ); + + valid->type_count = 8; + valid->type_funcs = (OTV_Validate_Func*)otv_gsub_validate_funcs; + valid->glyph_count = glyph_count; + + otv_LookupList_validate( table + LookupList, + valid ); + otv_FeatureList_validate( table + FeatureList, table + LookupList, + valid ); + otv_ScriptList_validate( table + ScriptList, table + FeatureList, + valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvjstf.c b/alienblaster/project/jni/freetype/src/otvalid/otvjstf.c new file mode 100644 index 000000000..a616a2343 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvjstf.c @@ -0,0 +1,258 @@ +/***************************************************************************/ +/* */ +/* otvjstf.c */ +/* */ +/* OpenType JSTF table validation (body). */ +/* */ +/* Copyright 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvjstf + + +#define JstfPriorityFunc otv_JstfPriority_validate +#define JstfLookupFunc otv_GPOS_subtable_validate + + /* uses valid->extra1 (GSUB lookup count) */ + /* uses valid->extra2 (GPOS lookup count) */ + /* sets valid->extra1 (counter) */ + + static void + otv_JstfPriority_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt gsub_lookup_count, gpos_lookup_count; + + OTV_OPTIONAL_TABLE( ShrinkageEnableGSUB ); + OTV_OPTIONAL_TABLE( ShrinkageDisableGSUB ); + OTV_OPTIONAL_TABLE( ShrinkageEnableGPOS ); + OTV_OPTIONAL_TABLE( ShrinkageDisableGPOS ); + OTV_OPTIONAL_TABLE( ExtensionEnableGSUB ); + OTV_OPTIONAL_TABLE( ExtensionDisableGSUB ); + OTV_OPTIONAL_TABLE( ExtensionEnableGPOS ); + OTV_OPTIONAL_TABLE( ExtensionDisableGPOS ); + OTV_OPTIONAL_TABLE( ShrinkageJstfMax ); + OTV_OPTIONAL_TABLE( ExtensionJstfMax ); + + + OTV_ENTER; + OTV_TRACE(( "JstfPriority table\n" )); + + OTV_LIMIT_CHECK( 20 ); + + gsub_lookup_count = valid->extra1; + gpos_lookup_count = valid->extra2; + + table_size = 20; + + valid->extra1 = gsub_lookup_count; + + OTV_OPTIONAL_OFFSET( ShrinkageEnableGSUB ); + OTV_SIZE_CHECK( ShrinkageEnableGSUB ); + if ( ShrinkageEnableGSUB ) + otv_x_ux( table + ShrinkageEnableGSUB, valid ); + + OTV_OPTIONAL_OFFSET( ShrinkageDisableGSUB ); + OTV_SIZE_CHECK( ShrinkageDisableGSUB ); + if ( ShrinkageDisableGSUB ) + otv_x_ux( table + ShrinkageDisableGSUB, valid ); + + valid->extra1 = gpos_lookup_count; + + OTV_OPTIONAL_OFFSET( ShrinkageEnableGPOS ); + OTV_SIZE_CHECK( ShrinkageEnableGPOS ); + if ( ShrinkageEnableGPOS ) + otv_x_ux( table + ShrinkageEnableGPOS, valid ); + + OTV_OPTIONAL_OFFSET( ShrinkageDisableGPOS ); + OTV_SIZE_CHECK( ShrinkageDisableGPOS ); + if ( ShrinkageDisableGPOS ) + otv_x_ux( table + ShrinkageDisableGPOS, valid ); + + OTV_OPTIONAL_OFFSET( ShrinkageJstfMax ); + OTV_SIZE_CHECK( ShrinkageJstfMax ); + if ( ShrinkageJstfMax ) + { + /* XXX: check lookup types? */ + OTV_NEST2( JstfMax, JstfLookup ); + OTV_RUN( table + ShrinkageJstfMax, valid ); + } + + valid->extra1 = gsub_lookup_count; + + OTV_OPTIONAL_OFFSET( ExtensionEnableGSUB ); + OTV_SIZE_CHECK( ExtensionEnableGSUB ); + if ( ExtensionEnableGSUB ) + otv_x_ux( table + ExtensionEnableGSUB, valid ); + + OTV_OPTIONAL_OFFSET( ExtensionDisableGSUB ); + OTV_SIZE_CHECK( ExtensionDisableGSUB ); + if ( ExtensionDisableGSUB ) + otv_x_ux( table + ExtensionDisableGSUB, valid ); + + valid->extra1 = gpos_lookup_count; + + OTV_OPTIONAL_OFFSET( ExtensionEnableGPOS ); + OTV_SIZE_CHECK( ExtensionEnableGPOS ); + if ( ExtensionEnableGPOS ) + otv_x_ux( table + ExtensionEnableGPOS, valid ); + + OTV_OPTIONAL_OFFSET( ExtensionDisableGPOS ); + OTV_SIZE_CHECK( ExtensionDisableGPOS ); + if ( ExtensionDisableGPOS ) + otv_x_ux( table + ExtensionDisableGPOS, valid ); + + OTV_OPTIONAL_OFFSET( ExtensionJstfMax ); + OTV_SIZE_CHECK( ExtensionJstfMax ); + if ( ExtensionJstfMax ) + { + /* XXX: check lookup types? */ + OTV_NEST2( JstfMax, JstfLookup ); + OTV_RUN( table + ExtensionJstfMax, valid ); + } + + valid->extra1 = gsub_lookup_count; + valid->extra2 = gpos_lookup_count; + + OTV_EXIT; + } + + + /* sets valid->extra (glyph count) */ + /* sets valid->func1 (otv_JstfPriority_validate) */ + + static void + otv_JstfScript_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt table_size; + FT_UInt JstfLangSysCount; + + OTV_OPTIONAL_TABLE( ExtGlyph ); + OTV_OPTIONAL_TABLE( DefJstfLangSys ); + + + OTV_NAME_ENTER( "JstfScript" ); + + OTV_LIMIT_CHECK( 6 ); + OTV_OPTIONAL_OFFSET( ExtGlyph ); + OTV_OPTIONAL_OFFSET( DefJstfLangSys ); + JstfLangSysCount = FT_NEXT_USHORT( p ); + + OTV_TRACE(( " (JstfLangSysCount = %d)\n", JstfLangSysCount )); + + table_size = JstfLangSysCount * 6 + 6; + + OTV_SIZE_CHECK( ExtGlyph ); + if ( ExtGlyph ) + { + valid->extra1 = valid->glyph_count; + OTV_NEST1( ExtenderGlyph ); + OTV_RUN( table + ExtGlyph, valid ); + } + + OTV_SIZE_CHECK( DefJstfLangSys ); + if ( DefJstfLangSys ) + { + OTV_NEST2( JstfLangSys, JstfPriority ); + OTV_RUN( table + DefJstfLangSys, valid ); + } + + OTV_LIMIT_CHECK( 6 * JstfLangSysCount ); + + /* JstfLangSysRecord */ + OTV_NEST2( JstfLangSys, JstfPriority ); + for ( ; JstfLangSysCount > 0; JstfLangSysCount-- ) + { + p += 4; /* skip JstfLangSysTag */ + + OTV_RUN( table + FT_NEXT_USHORT( p ), valid ); + } + + OTV_EXIT; + } + + + /* sets valid->extra1 (GSUB lookup count) */ + /* sets valid->extra2 (GPOS lookup count) */ + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_JSTF_validate( FT_Bytes table, + FT_Bytes gsub, + FT_Bytes gpos, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt JstfScriptCount; + + + valid->root = ftvalid; + + FT_TRACE3(( "validating JSTF table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 6 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + JstfScriptCount = FT_NEXT_USHORT( p ); + + FT_TRACE3(( " (JstfScriptCount = %d)\n", JstfScriptCount )); + + OTV_LIMIT_CHECK( JstfScriptCount * 6 ); + + if ( gsub ) + valid->extra1 = otv_GSUBGPOS_get_Lookup_count( gsub ); + else + valid->extra1 = 0; + + if ( gpos ) + valid->extra2 = otv_GSUBGPOS_get_Lookup_count( gpos ); + else + valid->extra2 = 0; + + valid->glyph_count = glyph_count; + + /* JstfScriptRecord */ + for ( ; JstfScriptCount > 0; JstfScriptCount-- ) + { + p += 4; /* skip JstfScriptTag */ + + /* JstfScript */ + otv_JstfScript_validate( table + FT_NEXT_USHORT( p ), valid ); + } + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvmath.c b/alienblaster/project/jni/freetype/src/otvalid/otvmath.c new file mode 100644 index 000000000..50ed10cf2 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvmath.c @@ -0,0 +1,452 @@ +/***************************************************************************/ +/* */ +/* otvmath.c */ +/* */ +/* OpenType MATH table validation (body). */ +/* */ +/* Copyright 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* Written by George Williams. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "otvalid.h" +#include "otvcommn.h" +#include "otvgpos.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvmath + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH TYPOGRAPHIC CONSTANTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathConstants_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt i; + FT_UInt table_size; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + OTV_NAME_ENTER( "MathConstants" ); + + /* 56 constants, 51 have device tables */ + OTV_LIMIT_CHECK( 2 * ( 56 + 51 ) ); + table_size = 2 * ( 56 + 51 ); + + p += 4 * 2; /* First 4 constants have no device tables */ + for ( i = 0; i < 51; ++i ) + { + p += 2; /* skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH ITALICS CORRECTION *****/ + /***** MATH TOP ACCENT ATTACHMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathItalicsCorrectionInfo_validate( FT_Bytes table, + OTV_Validator valid, + FT_Int isItalic ) + { + FT_Bytes p = table; + FT_UInt i, cnt, table_size ; + + OTV_OPTIONAL_TABLE( Coverage ); + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + FT_UNUSED( isItalic ); /* only used if tracing is active */ + + + OTV_NAME_ENTER( isItalic ? "MathItalicsCorrectionInfo" + : "MathTopAccentAttachment" ); + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( Coverage ); + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * cnt ); + table_size = 4 + 4 * cnt; + + OTV_SIZE_CHECK( Coverage ); + otv_Coverage_validate( table + Coverage, valid, cnt ); + + for ( i = 0; i < cnt; ++i ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH KERNING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathKern_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt i, cnt, table_size; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + /* OTV_NAME_ENTER( "MathKern" );*/ + + OTV_LIMIT_CHECK( 2 ); + + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * cnt + 2 ); + table_size = 4 + 4 * cnt; + + /* Heights */ + for ( i = 0; i < cnt; ++i ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + } + + /* One more Kerning value */ + for ( i = 0; i < cnt + 1; ++i ) + { + p += 2; /* Skip the value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + } + + OTV_EXIT; + } + + + static void + otv_MathKernInfo_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt i, j, cnt, table_size; + + OTV_OPTIONAL_TABLE( Coverage ); + OTV_OPTIONAL_TABLE( MKRecordOffset ); + + + OTV_NAME_ENTER( "MathKernInfo" ); + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( Coverage ); + cnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 8 * cnt ); + table_size = 4 + 8 * cnt; + + OTV_SIZE_CHECK( Coverage ); + otv_Coverage_validate( table + Coverage, valid, cnt ); + + for ( i = 0; i < cnt; ++i ) + { + for ( j = 0; j < 4; ++j ) + { + OTV_OPTIONAL_OFFSET( MKRecordOffset ); + OTV_SIZE_CHECK( MKRecordOffset ); + if ( MKRecordOffset ) + otv_MathKern_validate( table + MKRecordOffset, valid ); + } + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH GLYPH INFO *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_MathGlyphInfo_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt MathItalicsCorrectionInfo, MathTopAccentAttachment; + FT_UInt ExtendedShapeCoverage, MathKernInfo; + + + OTV_NAME_ENTER( "MathGlyphInfo" ); + + OTV_LIMIT_CHECK( 8 ); + + MathItalicsCorrectionInfo = FT_NEXT_USHORT( p ); + MathTopAccentAttachment = FT_NEXT_USHORT( p ); + ExtendedShapeCoverage = FT_NEXT_USHORT( p ); + MathKernInfo = FT_NEXT_USHORT( p ); + + if ( MathItalicsCorrectionInfo ) + otv_MathItalicsCorrectionInfo_validate( + table + MathItalicsCorrectionInfo, valid, TRUE ); + + /* Italic correction and Top Accent Attachment have the same format */ + if ( MathTopAccentAttachment ) + otv_MathItalicsCorrectionInfo_validate( + table + MathTopAccentAttachment, valid, FALSE ); + + if ( ExtendedShapeCoverage ) { + OTV_NAME_ENTER( "ExtendedShapeCoverage" ); + otv_Coverage_validate( table + ExtendedShapeCoverage, valid, -1 ); + OTV_EXIT; + } + + if ( MathKernInfo ) + otv_MathKernInfo_validate( table + MathKernInfo, valid ); + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH GLYPH CONSTRUCTION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + otv_GlyphAssembly_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt pcnt, table_size; + FT_UInt i; + + OTV_OPTIONAL_TABLE( DeviceTableOffset ); + + + /* OTV_NAME_ENTER( "GlyphAssembly" ); */ + + OTV_LIMIT_CHECK( 6 ); + + p += 2; /* Skip the Italics Correction value */ + OTV_OPTIONAL_OFFSET( DeviceTableOffset ); + pcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 8 * pcnt ); + table_size = 6 + 8 * pcnt; + + OTV_SIZE_CHECK( DeviceTableOffset ); + if ( DeviceTableOffset ) + otv_Device_validate( table + DeviceTableOffset, valid ); + + for ( i = 0; i < pcnt; ++i ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + p += 2*4; /* skip the Start, End, Full, and Flags fields */ + } + + /* OTV_EXIT; */ + } + + + static void + otv_MathGlyphConstruction_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt vcnt, table_size; + FT_UInt i; + + OTV_OPTIONAL_TABLE( GlyphAssembly ); + + + /* OTV_NAME_ENTER( "MathGlyphConstruction" ); */ + + OTV_LIMIT_CHECK( 4 ); + + OTV_OPTIONAL_OFFSET( GlyphAssembly ); + vcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 4 * vcnt ); + table_size = 4 + 4 * vcnt; + + for ( i = 0; i < vcnt; ++i ) + { + FT_UInt gid; + + + gid = FT_NEXT_USHORT( p ); + if ( gid >= valid->glyph_count ) + FT_INVALID_GLYPH_ID; + p += 2; /* skip the size */ + } + + OTV_SIZE_CHECK( GlyphAssembly ); + if ( GlyphAssembly ) + otv_GlyphAssembly_validate( table+GlyphAssembly, valid ); + + /* OTV_EXIT; */ + } + + + static void + otv_MathVariants_validate( FT_Bytes table, + OTV_Validator valid ) + { + FT_Bytes p = table; + FT_UInt vcnt, hcnt, i, table_size; + + OTV_OPTIONAL_TABLE( VCoverage ); + OTV_OPTIONAL_TABLE( HCoverage ); + OTV_OPTIONAL_TABLE( Offset ); + + + OTV_NAME_ENTER( "MathVariants" ); + + OTV_LIMIT_CHECK( 10 ); + + p += 2; /* Skip the MinConnectorOverlap constant */ + OTV_OPTIONAL_OFFSET( VCoverage ); + OTV_OPTIONAL_OFFSET( HCoverage ); + vcnt = FT_NEXT_USHORT( p ); + hcnt = FT_NEXT_USHORT( p ); + + OTV_LIMIT_CHECK( 2 * vcnt + 2 * hcnt ); + table_size = 10 + 2 * vcnt + 2 * hcnt; + + OTV_SIZE_CHECK( VCoverage ); + if ( VCoverage ) + otv_Coverage_validate( table + VCoverage, valid, vcnt ); + + OTV_SIZE_CHECK( HCoverage ); + if ( HCoverage ) + otv_Coverage_validate( table + HCoverage, valid, hcnt ); + + for ( i = 0; i < vcnt; ++i ) + { + OTV_OPTIONAL_OFFSET( Offset ); + OTV_SIZE_CHECK( Offset ); + otv_MathGlyphConstruction_validate( table + Offset, valid ); + } + + for ( i = 0; i < hcnt; ++i ) + { + OTV_OPTIONAL_OFFSET( Offset ); + OTV_SIZE_CHECK( Offset ); + otv_MathGlyphConstruction_validate( table + Offset, valid ); + } + + OTV_EXIT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MATH TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* sets valid->glyph_count */ + + FT_LOCAL_DEF( void ) + otv_MATH_validate( FT_Bytes table, + FT_UInt glyph_count, + FT_Validator ftvalid ) + { + OTV_ValidatorRec validrec; + OTV_Validator valid = &validrec; + FT_Bytes p = table; + FT_UInt MathConstants, MathGlyphInfo, MathVariants; + + + valid->root = ftvalid; + + FT_TRACE3(( "validating MATH table\n" )); + OTV_INIT; + + OTV_LIMIT_CHECK( 10 ); + + if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */ + FT_INVALID_FORMAT; + + MathConstants = FT_NEXT_USHORT( p ); + MathGlyphInfo = FT_NEXT_USHORT( p ); + MathVariants = FT_NEXT_USHORT( p ); + + valid->glyph_count = glyph_count; + + otv_MathConstants_validate( table + MathConstants, + valid ); + otv_MathGlyphInfo_validate( table + MathGlyphInfo, + valid ); + otv_MathVariants_validate ( table + MathVariants, + valid ); + + FT_TRACE4(( "\n" )); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvmod.c b/alienblaster/project/jni/freetype/src/otvalid/otvmod.c new file mode 100644 index 000000000..324856456 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvmod.c @@ -0,0 +1,280 @@ +/***************************************************************************/ +/* */ +/* otvmod.c */ +/* */ +/* FreeType's OpenType validation module implementation (body). */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H +#include FT_OPENTYPE_VALIDATE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_OPENTYPE_VALIDATE_H + +#include "otvmod.h" +#include "otvalid.h" +#include "otvcommn.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_otvmodule + + + static FT_Error + otv_load_table( FT_Face face, + FT_Tag tag, + FT_Byte* volatile* table, + FT_ULong* table_len ) + { + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len ); + if ( error == OTV_Err_Table_Missing ) + return OTV_Err_Ok; + if ( error ) + goto Exit; + + if ( FT_ALLOC( *table, *table_len ) ) + goto Exit; + + error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len ); + + Exit: + return error; + } + + + static FT_Error + otv_validate( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *ot_base, + FT_Bytes *ot_gdef, + FT_Bytes *ot_gpos, + FT_Bytes *ot_gsub, + FT_Bytes *ot_jstf ) + { + FT_Error error = OTV_Err_Ok; + FT_Byte* volatile base; + FT_Byte* volatile gdef; + FT_Byte* volatile gpos; + FT_Byte* volatile gsub; + FT_Byte* volatile jstf; + FT_Byte* volatile math; + FT_ULong len_base, len_gdef, len_gpos, len_gsub, len_jstf; + FT_ULong len_math; + FT_UInt num_glyphs = (FT_UInt)face->num_glyphs; + FT_ValidatorRec volatile valid; + + + base = gdef = gpos = gsub = jstf = math = NULL; + len_base = len_gdef = len_gpos = len_gsub = len_jstf = len_math = 0; + + /* + * XXX: OpenType tables cannot handle 32-bit glyph index, + * although broken TrueType can have 32-bit glyph index. + */ + if ( face->num_glyphs > 0xFFFFL ) + { + FT_TRACE1(( "otv_validate: Invalid glyphs index (0x0000FFFF - 0x%08x) ", + face->num_glyphs )); + FT_TRACE1(( "are not handled by OpenType tables\n" )); + num_glyphs = 0xFFFF; + } + + /* load tables */ + + if ( ot_flags & FT_VALIDATE_BASE ) + { + error = otv_load_table( face, TTAG_BASE, &base, &len_base ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GDEF ) + { + error = otv_load_table( face, TTAG_GDEF, &gdef, &len_gdef ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GPOS ) + { + error = otv_load_table( face, TTAG_GPOS, &gpos, &len_gpos ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_GSUB ) + { + error = otv_load_table( face, TTAG_GSUB, &gsub, &len_gsub ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_JSTF ) + { + error = otv_load_table( face, TTAG_JSTF, &jstf, &len_jstf ); + if ( error ) + goto Exit; + } + + if ( ot_flags & FT_VALIDATE_MATH ) + { + error = otv_load_table( face, TTAG_MATH, &math, &len_math ); + if ( error ) + goto Exit; + } + + /* validate tables */ + + if ( base ) + { + ft_validator_init( &valid, base, base + len_base, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_BASE_validate( base, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gpos ) + { + ft_validator_init( &valid, gpos, gpos + len_gpos, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GPOS_validate( gpos, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gsub ) + { + ft_validator_init( &valid, gsub, gsub + len_gsub, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GSUB_validate( gsub, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( gdef ) + { + ft_validator_init( &valid, gdef, gdef + len_gdef, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_GDEF_validate( gdef, gsub, gpos, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( jstf ) + { + ft_validator_init( &valid, jstf, jstf + len_jstf, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_JSTF_validate( jstf, gsub, gpos, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + if ( math ) + { + ft_validator_init( &valid, math, math + len_math, FT_VALIDATE_DEFAULT ); + if ( ft_setjmp( valid.jump_buffer ) == 0 ) + otv_MATH_validate( math, num_glyphs, &valid ); + error = valid.error; + if ( error ) + goto Exit; + } + + *ot_base = (FT_Bytes)base; + *ot_gdef = (FT_Bytes)gdef; + *ot_gpos = (FT_Bytes)gpos; + *ot_gsub = (FT_Bytes)gsub; + *ot_jstf = (FT_Bytes)jstf; + + Exit: + if ( error ) { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( base ); + FT_FREE( gdef ); + FT_FREE( gpos ); + FT_FREE( gsub ); + FT_FREE( jstf ); + } + { + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( math ); /* Can't return this as API is frozen */ + } + + return error; + } + + + static + const FT_Service_OTvalidateRec otvalid_interface = + { + otv_validate + }; + + + static + const FT_ServiceDescRec otvalid_services[] = + { + { FT_SERVICE_ID_OPENTYPE_VALIDATE, &otvalid_interface }, + { NULL, NULL } + }; + + + static FT_Pointer + otvalid_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( otvalid_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class otv_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "otvalid", + 0x10000L, + 0x20000L, + + 0, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) otvalid_get_service + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/otvmod.h b/alienblaster/project/jni/freetype/src/otvalid/otvmod.h new file mode 100644 index 000000000..573b2a0c4 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/otvmod.h @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* otvmod.h */ +/* */ +/* FreeType's OpenType validation module implementation */ +/* (specification). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __OTVMOD_H__ +#define __OTVMOD_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_EXPORT_VAR( const FT_Module_Class ) otv_module_class; + + +FT_END_HEADER + +#endif /* __OTVMOD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/otvalid/rules.mk b/alienblaster/project/jni/freetype/src/otvalid/rules.mk new file mode 100644 index 000000000..53bd41e5e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/otvalid/rules.mk @@ -0,0 +1,78 @@ +# +# FreeType 2 OpenType validation driver configuration rules +# + + +# Copyright 2004, 2007 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# OTV driver directory +# +OTV_DIR := $(SRC_DIR)/otvalid + + +# compilation flags for the driver +# +OTV_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(OTV_DIR)) + + +# OTV driver sources (i.e., C files) +# +OTV_DRV_SRC := $(OTV_DIR)/otvbase.c \ + $(OTV_DIR)/otvcommn.c \ + $(OTV_DIR)/otvgdef.c \ + $(OTV_DIR)/otvgpos.c \ + $(OTV_DIR)/otvgsub.c \ + $(OTV_DIR)/otvjstf.c \ + $(OTV_DIR)/otvmath.c \ + $(OTV_DIR)/otvmod.c + +# OTV driver headers +# +OTV_DRV_H := $(OTV_DIR)/otvalid.h \ + $(OTV_DIR)/otvcommn.h \ + $(OTV_DIR)/otverror.h \ + $(OTV_DIR)/otvgpos.h \ + $(OTV_DIR)/otvmod.h + + +# OTV driver object(s) +# +# OTV_DRV_OBJ_M is used during `multi' builds. +# OTV_DRV_OBJ_S is used during `single' builds. +# +OTV_DRV_OBJ_M := $(OTV_DRV_SRC:$(OTV_DIR)/%.c=$(OBJ_DIR)/%.$O) +OTV_DRV_OBJ_S := $(OBJ_DIR)/otvalid.$O + +# OTV driver source file for single build +# +OTV_DRV_SRC_S := $(OTV_DIR)/otvalid.c + + +# OTV driver - single object +# +$(OTV_DRV_OBJ_S): $(OTV_DRV_SRC_S) $(OTV_DRV_SRC) \ + $(FREETYPE_H) $(OTV_DRV_H) + $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(OTV_DRV_SRC_S)) + + +# OTV driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(OTV_DIR)/%.c $(FREETYPE_H) $(OTV_DRV_H) + $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(OTV_DRV_OBJ_S) +DRV_OBJS_M += $(OTV_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/pcf/Jamfile b/alienblaster/project/jni/freetype/src/pcf/Jamfile new file mode 100644 index 000000000..752fcac2a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/pcf Jamfile +# +# Copyright 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) pcf ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = pcfdrivr pcfread pcfutil ; + } + else + { + _sources = pcf ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/pcf Jamfile diff --git a/alienblaster/project/jni/freetype/src/pcf/README b/alienblaster/project/jni/freetype/src/pcf/README new file mode 100644 index 000000000..cc1480b2d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/README @@ -0,0 +1,114 @@ + FreeType font driver for PCF fonts + + Francesco Zappa Nardelli + <francesco.zappa.nardelli@ens.fr> + + +Introduction +************ + +PCF (Portable Compiled Format) is a binary bitmap font format, largely used +in X world. This code implements a PCF driver for the FreeType library. +Glyph images are loaded into memory only on demand, thus leading to a small +memory footprint. + +Information on the PCF font format can only be worked out from +`pcfread.c', and `pcfwrite.c', to be found, for instance, in the XFree86 +(www.xfree86.org) source tree (xc/lib/font/bitmap/). + +Many good bitmap fonts in bdf format come with XFree86: they can be +compiled into the pcf format using the `bdftopcf' utility. + + +Supported hardware +****************** + +The driver has been tested on linux/x86 and sunos5.5/sparc. In both +cases the compiler was gcc. When back in Paris, I will test it also +on linux/alpha. + + +Encodings +********* + +The variety of encodings that accompanies pcf fonts appears to encompass the +small set defined in freetype.h. On the other hand, each pcf font defines +two properties that specify encoding and registry. + +I decided to make these two properties directly accessible, leaving to the +client application the work of interpreting them. For instance: + + #include "pcftypes.h" /* include/freetype/internal/pcftypes.h */ + + FT_Face face; + PCF_Public_Face pcfface; + + FT_New_Face( library,..., &face ); + + pcfface = (PCF_Public_Face)face; + + if ((pcfface->charset_registry == "ISO10646") && + (pcfface->charset_encoding) == "1")) [..] + +Thus the driver always export `ft_encoding_none' as +face->charmap.encoding. FT_Get_Char_Index() behavior is unmodified, that +is, it converts the ULong value given as argument into the corresponding +glyph number. + + +Known problems +************** + +- dealing explicitly with encodings breaks the uniformity of freetype2 + api. + +- except for encodings properties, client applications have no + visibility of the PCF_Face object. This means that applications + cannot directly access font tables and are obliged to trust + FreeType. + +- currently, glyph names and ink_metrics are ignored. + +I plan to give full visibility of the PCF_Face object in the next +release of the driver, thus implementing also glyph names and +ink_metrics. + +- height is defined as (ascent - descent). Is this correct? + +- if unable to read size information from the font, PCF_Init_Face + sets available_size->width and available_size->height to 12. + +- too many english grammar errors in the readme file :-( + + +License +******* + +Copyright (C) 2000 by Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +Credits +******* + +Keith Packard wrote the pcf driver found in XFree86. His work is at +the same time the specification and the sample implementation of the +PCF format. Undoubtedly, this driver is inspired from his work. diff --git a/alienblaster/project/jni/freetype/src/pcf/module.mk b/alienblaster/project/jni/freetype/src/pcf/module.mk new file mode 100644 index 000000000..df383ff0f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/module.mk @@ -0,0 +1,34 @@ +# +# FreeType 2 PCF module definition +# + +# Copyright 2000, 2006 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +FTMODULE_H_COMMANDS += PCF_DRIVER + +define PCF_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, pcf_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pcf $(ECHO_DRIVER_DESC)pcf bitmap fonts$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/pcf/pcf.h b/alienblaster/project/jni/freetype/src/pcf/pcf.h new file mode 100644 index 000000000..1cd56c13a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/pcf.h @@ -0,0 +1,237 @@ +/* pcf.h + + FreeType font driver for pcf fonts + + Copyright (C) 2000, 2001, 2002, 2003, 2006 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCF_H__ +#define __PCF_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + typedef struct PCF_TableRec_ + { + FT_ULong type; + FT_ULong format; + FT_ULong size; + FT_ULong offset; + + } PCF_TableRec, *PCF_Table; + + + typedef struct PCF_TocRec_ + { + FT_ULong version; + FT_ULong count; + PCF_Table tables; + + } PCF_TocRec, *PCF_Toc; + + + typedef struct PCF_ParsePropertyRec_ + { + FT_Long name; + FT_Byte isString; + FT_Long value; + + } PCF_ParsePropertyRec, *PCF_ParseProperty; + + + typedef struct PCF_PropertyRec_ + { + FT_String* name; + FT_Byte isString; + + union + { + FT_String* atom; + FT_Long l; + FT_ULong ul; + + } value; + + } PCF_PropertyRec, *PCF_Property; + + + typedef struct PCF_Compressed_MetricRec_ + { + FT_Byte leftSideBearing; + FT_Byte rightSideBearing; + FT_Byte characterWidth; + FT_Byte ascent; + FT_Byte descent; + + } PCF_Compressed_MetricRec, *PCF_Compressed_Metric; + + + typedef struct PCF_MetricRec_ + { + FT_Short leftSideBearing; + FT_Short rightSideBearing; + FT_Short characterWidth; + FT_Short ascent; + FT_Short descent; + FT_Short attributes; + FT_ULong bits; + + } PCF_MetricRec, *PCF_Metric; + + + typedef struct PCF_AccelRec_ + { + FT_Byte noOverlap; + FT_Byte constantMetrics; + FT_Byte terminalFont; + FT_Byte constantWidth; + FT_Byte inkInside; + FT_Byte inkMetrics; + FT_Byte drawDirection; + FT_Long fontAscent; + FT_Long fontDescent; + FT_Long maxOverlap; + PCF_MetricRec minbounds; + PCF_MetricRec maxbounds; + PCF_MetricRec ink_minbounds; + PCF_MetricRec ink_maxbounds; + + } PCF_AccelRec, *PCF_Accel; + + + typedef struct PCF_EncodingRec_ + { + FT_Long enc; + FT_UShort glyph; + + } PCF_EncodingRec, *PCF_Encoding; + + + typedef struct PCF_FaceRec_ + { + FT_FaceRec root; + + FT_StreamRec gzip_stream; + FT_Stream gzip_source; + + char* charset_encoding; + char* charset_registry; + + PCF_TocRec toc; + PCF_AccelRec accel; + + int nprops; + PCF_Property properties; + + FT_Long nmetrics; + PCF_Metric metrics; + FT_Long nencodings; + PCF_Encoding encodings; + + FT_Short defaultChar; + + FT_ULong bitmapsFormat; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + } PCF_FaceRec, *PCF_Face; + + + /* macros for pcf font format */ + +#define LSBFirst 0 +#define MSBFirst 1 + +#define PCF_FILE_VERSION ( ( 'p' << 24 ) | \ + ( 'c' << 16 ) | \ + ( 'f' << 8 ) | 1 ) +#define PCF_FORMAT_MASK 0xFFFFFF00UL + +#define PCF_DEFAULT_FORMAT 0x00000000UL +#define PCF_INKBOUNDS 0x00000200UL +#define PCF_ACCEL_W_INKBOUNDS 0x00000100UL +#define PCF_COMPRESSED_METRICS 0x00000100UL + +#define PCF_FORMAT_MATCH( a, b ) \ + ( ( (a) & PCF_FORMAT_MASK ) == ( (b) & PCF_FORMAT_MASK ) ) + +#define PCF_GLYPH_PAD_MASK ( 3 << 0 ) +#define PCF_BYTE_MASK ( 1 << 2 ) +#define PCF_BIT_MASK ( 1 << 3 ) +#define PCF_SCAN_UNIT_MASK ( 3 << 4 ) + +#define PCF_BYTE_ORDER( f ) \ + ( ( (f) & PCF_BYTE_MASK ) ? MSBFirst : LSBFirst ) +#define PCF_BIT_ORDER( f ) \ + ( ( (f) & PCF_BIT_MASK ) ? MSBFirst : LSBFirst ) +#define PCF_GLYPH_PAD_INDEX( f ) \ + ( (f) & PCF_GLYPH_PAD_MASK ) +#define PCF_GLYPH_PAD( f ) \ + ( 1 << PCF_GLYPH_PAD_INDEX( f ) ) +#define PCF_SCAN_UNIT_INDEX( f ) \ + ( ( (f) & PCF_SCAN_UNIT_MASK ) >> 4 ) +#define PCF_SCAN_UNIT( f ) \ + ( 1 << PCF_SCAN_UNIT_INDEX( f ) ) +#define PCF_FORMAT_BITS( f ) \ + ( (f) & ( PCF_GLYPH_PAD_MASK | \ + PCF_BYTE_MASK | \ + PCF_BIT_MASK | \ + PCF_SCAN_UNIT_MASK ) ) + +#define PCF_SIZE_TO_INDEX( s ) ( (s) == 4 ? 2 : (s) == 2 ? 1 : 0 ) +#define PCF_INDEX_TO_SIZE( b ) ( 1 << b ) + +#define PCF_FORMAT( bit, byte, glyph, scan ) \ + ( ( PCF_SIZE_TO_INDEX( scan ) << 4 ) | \ + ( ( (bit) == MSBFirst ? 1 : 0 ) << 3 ) | \ + ( ( (byte) == MSBFirst ? 1 : 0 ) << 2 ) | \ + ( PCF_SIZE_TO_INDEX( glyph ) << 0 ) ) + +#define PCF_PROPERTIES ( 1 << 0 ) +#define PCF_ACCELERATORS ( 1 << 1 ) +#define PCF_METRICS ( 1 << 2 ) +#define PCF_BITMAPS ( 1 << 3 ) +#define PCF_INK_METRICS ( 1 << 4 ) +#define PCF_BDF_ENCODINGS ( 1 << 5 ) +#define PCF_SWIDTHS ( 1 << 6 ) +#define PCF_GLYPH_NAMES ( 1 << 7 ) +#define PCF_BDF_ACCELERATORS ( 1 << 8 ) + +#define GLYPHPADOPTIONS 4 /* I'm not sure about this */ + + FT_LOCAL( FT_Error ) + pcf_load_font( FT_Stream, + PCF_Face ); + +FT_END_HEADER + +#endif /* __PCF_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pcf/pcfdrivr.c b/alienblaster/project/jni/freetype/src/pcf/pcfdrivr.c new file mode 100644 index 000000000..b34e542ae --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/pcfdrivr.c @@ -0,0 +1,695 @@ +/* pcfdrivr.c + + FreeType font driver for pcf files + + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#include <ft2build.h> + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H +#include FT_GZIP_H +#include FT_LZW_H +#include FT_ERRORS_H +#include FT_BDF_H + +#include "pcf.h" +#include "pcfdrivr.h" +#include "pcfread.h" + +#include "pcferror.h" +#include "pcfutil.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pcfread + +#include FT_SERVICE_BDF_H +#include FT_SERVICE_XFREE86_NAME_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_pcfdriver + + + typedef struct PCF_CMapRec_ + { + FT_CMapRec root; + FT_UInt num_encodings; + PCF_Encoding encodings; + + } PCF_CMapRec, *PCF_CMap; + + + FT_CALLBACK_DEF( FT_Error ) + pcf_cmap_init( FT_CMap pcfcmap, /* PCF_CMap */ + FT_Pointer init_data ) + { + PCF_CMap cmap = (PCF_CMap)pcfcmap; + PCF_Face face = (PCF_Face)FT_CMAP_FACE( pcfcmap ); + + FT_UNUSED( init_data ); + + + cmap->num_encodings = (FT_UInt)face->nencodings; + cmap->encodings = face->encodings; + + return PCF_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + pcf_cmap_done( FT_CMap pcfcmap ) /* PCF_CMap */ + { + PCF_CMap cmap = (PCF_CMap)pcfcmap; + + + cmap->encodings = NULL; + cmap->num_encodings = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pcf_cmap_char_index( FT_CMap pcfcmap, /* PCF_CMap */ + FT_UInt32 charcode ) + { + PCF_CMap cmap = (PCF_CMap)pcfcmap; + PCF_Encoding encodings = cmap->encodings; + FT_UInt min, max, mid; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_ULong code; + + + mid = ( min + max ) >> 1; + code = encodings[mid].enc; + + if ( charcode == code ) + { + result = encodings[mid].glyph + 1; + break; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pcf_cmap_char_next( FT_CMap pcfcmap, /* PCF_CMap */ + FT_UInt32 *acharcode ) + { + PCF_CMap cmap = (PCF_CMap)pcfcmap; + PCF_Encoding encodings = cmap->encodings; + FT_UInt min, max, mid; + FT_ULong charcode = *acharcode + 1; + FT_UInt result = 0; + + + min = 0; + max = cmap->num_encodings; + + while ( min < max ) + { + FT_ULong code; + + + mid = ( min + max ) >> 1; + code = encodings[mid].enc; + + if ( charcode == code ) + { + result = encodings[mid].glyph + 1; + goto Exit; + } + + if ( charcode < code ) + max = mid; + else + min = mid + 1; + } + + charcode = 0; + if ( min < cmap->num_encodings ) + { + charcode = encodings[min].enc; + result = encodings[min].glyph + 1; + } + + Exit: + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "pcf_cmap_char_next: charcode 0x%x > 32bit API" )); + *acharcode = 0; + /* XXX: result should be changed to indicate an overflow error */ + } + else + *acharcode = (FT_UInt32)charcode; + return result; + } + + + FT_CALLBACK_TABLE_DEF + const FT_CMap_ClassRec pcf_cmap_class = + { + sizeof ( PCF_CMapRec ), + pcf_cmap_init, + pcf_cmap_done, + pcf_cmap_char_index, + pcf_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + FT_CALLBACK_DEF( void ) + PCF_Face_Done( FT_Face pcfface ) /* PCF_Face */ + { + PCF_Face face = (PCF_Face)pcfface; + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + FT_FREE( face->encodings ); + FT_FREE( face->metrics ); + + /* free properties */ + { + PCF_Property prop; + FT_Int i; + + + if ( face->properties ) + { + for ( i = 0; i < face->nprops; i++ ) + { + prop = &face->properties[i]; + + if ( prop ) { + FT_FREE( prop->name ); + if ( prop->isString ) + FT_FREE( prop->value.atom ); + } + } + } + FT_FREE( face->properties ); + } + + FT_FREE( face->toc.tables ); + FT_FREE( pcfface->family_name ); + FT_FREE( pcfface->style_name ); + FT_FREE( pcfface->available_sizes ); + FT_FREE( face->charset_encoding ); + FT_FREE( face->charset_registry ); + + FT_TRACE4(( "PCF_Face_Done: done face\n" )); + + /* close gzip/LZW stream if any */ + if ( pcfface->stream == &face->gzip_stream ) + { + FT_Stream_Close( &face->gzip_stream ); + pcfface->stream = face->gzip_source; + } + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Face_Init( FT_Stream stream, + FT_Face pcfface, /* PCF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + PCF_Face face = (PCF_Face)pcfface; + FT_Error error = PCF_Err_Ok; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( face_index ); + + + error = pcf_load_font( stream, face ); + if ( error ) + { + PCF_Face_Done( pcfface ); + +#if defined( FT_CONFIG_OPTION_USE_ZLIB ) || \ + defined( FT_CONFIG_OPTION_USE_LZW ) + +#ifdef FT_CONFIG_OPTION_USE_ZLIB + { + FT_Error error2; + + + /* this didn't work, try gzip support! */ + error2 = FT_Stream_OpenGzip( &face->gzip_stream, stream ); + if ( FT_ERROR_BASE( error2 ) == FT_Err_Unimplemented_Feature ) + goto Fail; + + error = error2; + } +#endif /* FT_CONFIG_OPTION_USE_ZLIB */ + +#ifdef FT_CONFIG_OPTION_USE_LZW + if ( error ) + { + FT_Error error3; + + + /* this didn't work, try LZW support! */ + error3 = FT_Stream_OpenLZW( &face->gzip_stream, stream ); + if ( FT_ERROR_BASE( error3 ) == FT_Err_Unimplemented_Feature ) + goto Fail; + + error = error3; + } +#endif /* FT_CONFIG_OPTION_USE_LZW */ + + if ( error ) + goto Fail; + + face->gzip_source = stream; + pcfface->stream = &face->gzip_stream; + + stream = pcfface->stream; + + error = pcf_load_font( stream, face ); + if ( error ) + goto Fail; + +#else /* !(FT_CONFIG_OPTION_USE_ZLIB || FT_CONFIG_OPTION_USE_LZW) */ + + goto Fail; + +#endif + } + + /* set up charmap */ + { + FT_String *charset_registry = face->charset_registry; + FT_String *charset_encoding = face->charset_encoding; + FT_Bool unicode_charmap = 0; + + + if ( charset_registry && charset_encoding ) + { + char* s = charset_registry; + + + /* Uh, oh, compare first letters manually to avoid dependency + on locales. */ + if ( ( s[0] == 'i' || s[0] == 'I' ) && + ( s[1] == 's' || s[1] == 'S' ) && + ( s[2] == 'o' || s[2] == 'O' ) ) + { + s += 3; + if ( !ft_strcmp( s, "10646" ) || + ( !ft_strcmp( s, "8859" ) && + !ft_strcmp( face->charset_encoding, "1" ) ) ) + unicode_charmap = 1; + } + } + + { + FT_CharMapRec charmap; + + + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; + charmap.platform_id = 0; + charmap.encoding_id = 0; + + if ( unicode_charmap ) + { + charmap.encoding = FT_ENCODING_UNICODE; + charmap.platform_id = 3; + charmap.encoding_id = 1; + } + + error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if ( pcfface->num_charmaps ) + pcfface->charmap = pcfface->charmaps[0]; +#endif + } + } + + Exit: + return error; + + Fail: + FT_TRACE2(( "[not a valid PCF file]\n" )); + PCF_Face_Done( pcfface ); + error = PCF_Err_Unknown_File_Format; /* error */ + goto Exit; + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Size_Select( FT_Size size, + FT_ULong strike_index ) + { + PCF_Accel accel = &( (PCF_Face)size->face )->accel; + + + FT_Select_Metrics( size->face, strike_index ); + + size->metrics.ascender = accel->fontAscent << 6; + size->metrics.descender = -accel->fontDescent << 6; + size->metrics.max_advance = accel->maxbounds.characterWidth << 6; + + return PCF_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Size_Request( FT_Size size, + FT_Size_Request req ) + { + PCF_Face face = (PCF_Face)size->face; + FT_Bitmap_Size* bsize = size->face->available_sizes; + FT_Error error = PCF_Err_Invalid_Pixel_Size; + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = PCF_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == ( face->accel.fontAscent + + face->accel.fontDescent ) ) + error = PCF_Err_Ok; + break; + + default: + error = PCF_Err_Unimplemented_Feature; + break; + } + + if ( error ) + return error; + else + return PCF_Size_Select( size, 0 ); + } + + + FT_CALLBACK_DEF( FT_Error ) + PCF_Glyph_Load( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + PCF_Face face = (PCF_Face)FT_SIZE_FACE( size ); + FT_Stream stream; + FT_Error error = PCF_Err_Ok; + FT_Bitmap* bitmap = &slot->bitmap; + PCF_Metric metric; + FT_Offset bytes; + + FT_UNUSED( load_flags ); + + + FT_TRACE4(( "load_glyph %d ---", glyph_index )); + + if ( !face || glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = PCF_Err_Invalid_Argument; + goto Exit; + } + + stream = face->root.stream; + + if ( glyph_index > 0 ) + glyph_index--; + + metric = face->metrics + glyph_index; + + bitmap->rows = metric->ascent + metric->descent; + bitmap->width = metric->rightSideBearing - metric->leftSideBearing; + bitmap->num_grays = 1; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + + FT_TRACE6(( "BIT_ORDER %d ; BYTE_ORDER %d ; GLYPH_PAD %d\n", + PCF_BIT_ORDER( face->bitmapsFormat ), + PCF_BYTE_ORDER( face->bitmapsFormat ), + PCF_GLYPH_PAD( face->bitmapsFormat ) )); + + switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) ) + { + case 1: + bitmap->pitch = ( bitmap->width + 7 ) >> 3; + break; + + case 2: + bitmap->pitch = ( ( bitmap->width + 15 ) >> 4 ) << 1; + break; + + case 4: + bitmap->pitch = ( ( bitmap->width + 31 ) >> 5 ) << 2; + break; + + case 8: + bitmap->pitch = ( ( bitmap->width + 63 ) >> 6 ) << 3; + break; + + default: + return PCF_Err_Invalid_File_Format; + } + + /* XXX: to do: are there cases that need repadding the bitmap? */ + bytes = bitmap->pitch * bitmap->rows; + + error = ft_glyphslot_alloc_bitmap( slot, bytes ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( metric->bits ) || + FT_STREAM_READ( bitmap->buffer, bytes ) ) + goto Exit; + + if ( PCF_BIT_ORDER( face->bitmapsFormat ) != MSBFirst ) + BitOrderInvert( bitmap->buffer, bytes ); + + if ( ( PCF_BYTE_ORDER( face->bitmapsFormat ) != + PCF_BIT_ORDER( face->bitmapsFormat ) ) ) + { + switch ( PCF_SCAN_UNIT( face->bitmapsFormat ) ) + { + case 1: + break; + + case 2: + TwoByteSwap( bitmap->buffer, bytes ); + break; + + case 4: + FourByteSwap( bitmap->buffer, bytes ); + break; + } + } + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = metric->leftSideBearing; + slot->bitmap_top = metric->ascent; + + slot->metrics.horiAdvance = metric->characterWidth << 6; + slot->metrics.horiBearingX = metric->leftSideBearing << 6; + slot->metrics.horiBearingY = metric->ascent << 6; + slot->metrics.width = ( metric->rightSideBearing - + metric->leftSideBearing ) << 6; + slot->metrics.height = bitmap->rows << 6; + + ft_synthesize_vertical_metrics( &slot->metrics, + ( face->accel.fontAscent + + face->accel.fontDescent ) << 6 ); + + FT_TRACE4(( " --- ok\n" )); + + Exit: + return error; + } + + + /* + * + * BDF SERVICE + * + */ + + static FT_Error + pcf_get_bdf_property( PCF_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + PCF_Property prop; + + + prop = pcf_find_property( face, prop_name ); + if ( prop != NULL ) + { + if ( prop->isString ) + { + aproperty->type = BDF_PROPERTY_TYPE_ATOM; + aproperty->u.atom = prop->value.atom; + } + else + { + if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) ) + { + FT_TRACE1(( "pcf_get_bdf_property: " )); + FT_TRACE1(( "too large integer 0x%x is truncated\n" )); + } + /* Apparently, the PCF driver loads all properties as signed integers! + * This really doesn't seem to be a problem, because this is + * sufficient for any meaningful values. + */ + aproperty->type = BDF_PROPERTY_TYPE_INTEGER; + aproperty->u.integer = (FT_Int32)prop->value.l; + } + return 0; + } + + return PCF_Err_Invalid_Argument; + } + + + static FT_Error + pcf_get_charset_id( PCF_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + *acharset_encoding = face->charset_encoding; + *acharset_registry = face->charset_registry; + + return 0; + } + + + static const FT_Service_BDFRec pcf_service_bdf = + { + (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id, + (FT_BDF_GetPropertyFunc) pcf_get_bdf_property + }; + + + /* + * + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec pcf_services[] = + { + { FT_SERVICE_ID_BDF, &pcf_service_bdf }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PCF }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + pcf_driver_requester( FT_Module module, + const char* name ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pcf_services, name ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec pcf_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + sizeof ( FT_DriverRec ), + + "pcf", + 0x10000L, + 0x20000L, + + 0, + + 0, + 0, + pcf_driver_requester + }, + + sizeof ( PCF_FaceRec ), + sizeof ( FT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + PCF_Face_Init, + PCF_Face_Done, + 0, /* FT_Size_InitFunc */ + 0, /* FT_Size_DoneFunc */ + 0, /* FT_Slot_InitFunc */ + 0, /* FT_Slot_DoneFunc */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + PCF_Glyph_Load, + + 0, /* FT_Face_GetKerningFunc */ + 0, /* FT_Face_AttachFunc */ + 0, /* FT_Face_GetAdvancesFunc */ + + PCF_Size_Request, + PCF_Size_Select + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pcf/pcfdrivr.h b/alienblaster/project/jni/freetype/src/pcf/pcfdrivr.h new file mode 100644 index 000000000..a81d7309e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/pcfdrivr.h @@ -0,0 +1,48 @@ +/* pcfdrivr.h + + FreeType font driver for pcf fonts + + Copyright 2000-2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFDRIVR_H__ +#define __PCFDRIVR_H__ + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) pcf_driver_class; + +FT_END_HEADER + + +#endif /* __PCFDRIVR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pcf/pcferror.h b/alienblaster/project/jni/freetype/src/pcf/pcferror.h new file mode 100644 index 000000000..d75c067aa --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/pcferror.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* pcferror.h */ +/* */ +/* PCF error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PCF error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PCFERROR_H__ +#define __PCFERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PCF_Err_ +#define FT_ERR_BASE FT_Mod_Err_PCF + +#include FT_ERRORS_H + +#endif /* __PCFERROR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pcf/pcfread.c b/alienblaster/project/jni/freetype/src/pcf/pcfread.c new file mode 100644 index 000000000..08becf99c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/pcfread.c @@ -0,0 +1,1274 @@ +/* pcfread.c + + FreeType font driver for pcf fonts + + Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#include <ft2build.h> + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H + +#include "pcf.h" +#include "pcfread.h" + +#include "pcferror.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_pcfread + + +#ifdef FT_DEBUG_LEVEL_TRACE + static const char* const tableNames[] = + { + "prop", "accl", "mtrcs", "bmps", "imtrcs", + "enc", "swidth", "names", "accel" + }; +#endif + + + static + const FT_Frame_Field pcf_toc_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_TocRec + + FT_FRAME_START( 8 ), + FT_FRAME_ULONG_LE( version ), + FT_FRAME_ULONG_LE( count ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_table_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_TableRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE( type ), + FT_FRAME_ULONG_LE( format ), + FT_FRAME_ULONG_LE( size ), + FT_FRAME_ULONG_LE( offset ), + FT_FRAME_END + }; + + + static FT_Error + pcf_read_TOC( FT_Stream stream, + PCF_Face face ) + { + FT_Error error; + PCF_Toc toc = &face->toc; + PCF_Table tables; + + FT_Memory memory = FT_FACE(face)->memory; + FT_UInt n; + + + if ( FT_STREAM_SEEK ( 0 ) || + FT_STREAM_READ_FIELDS ( pcf_toc_header, toc ) ) + return PCF_Err_Cannot_Open_Resource; + + if ( toc->version != PCF_FILE_VERSION || + toc->count > FT_ARRAY_MAX( face->toc.tables ) || + toc->count == 0 ) + return PCF_Err_Invalid_File_Format; + + if ( FT_NEW_ARRAY( face->toc.tables, toc->count ) ) + return PCF_Err_Out_Of_Memory; + + tables = face->toc.tables; + for ( n = 0; n < toc->count; n++ ) + { + if ( FT_STREAM_READ_FIELDS( pcf_table_header, tables ) ) + goto Exit; + tables++; + } + + /* Sort tables and check for overlaps. Because they are almost */ + /* always ordered already, an in-place bubble sort with simultaneous */ + /* boundary checking seems appropriate. */ + tables = face->toc.tables; + + for ( n = 0; n < toc->count - 1; n++ ) + { + FT_UInt i, have_change; + + + have_change = 0; + + for ( i = 0; i < toc->count - 1 - n; i++ ) + { + PCF_TableRec tmp; + + + if ( tables[i].offset > tables[i + 1].offset ) + { + tmp = tables[i]; + tables[i] = tables[i + 1]; + tables[i + 1] = tmp; + + have_change = 1; + } + + if ( ( tables[i].size > tables[i + 1].offset ) || + ( tables[i].offset > tables[i + 1].offset - tables[i].size ) ) + return PCF_Err_Invalid_Offset; + } + + if ( !have_change ) + break; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + + { + FT_UInt i, j; + const char* name = "?"; + + + FT_TRACE4(( "pcf_read_TOC:\n" )); + + FT_TRACE4(( " number of tables: %ld\n", face->toc.count )); + + tables = face->toc.tables; + for ( i = 0; i < toc->count; i++ ) + { + for ( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] ); + j++ ) + if ( tables[i].type == (FT_UInt)( 1 << j ) ) + name = tableNames[j]; + + FT_TRACE4(( " %d: type=%s, format=0x%X, " + "size=%ld (0x%lX), offset=%ld (0x%lX)\n", + i, name, + tables[i].format, + tables[i].size, tables[i].size, + tables[i].offset, tables[i].offset )); + } + } + +#endif + + return PCF_Err_Ok; + + Exit: + FT_FREE( face->toc.tables ); + return error; + } + + +#define PCF_METRIC_SIZE 12 + + static + const FT_Frame_Field pcf_metric_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_MetricRec + + FT_FRAME_START( PCF_METRIC_SIZE ), + FT_FRAME_SHORT_LE( leftSideBearing ), + FT_FRAME_SHORT_LE( rightSideBearing ), + FT_FRAME_SHORT_LE( characterWidth ), + FT_FRAME_SHORT_LE( ascent ), + FT_FRAME_SHORT_LE( descent ), + FT_FRAME_SHORT_LE( attributes ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_metric_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_MetricRec + + FT_FRAME_START( PCF_METRIC_SIZE ), + FT_FRAME_SHORT( leftSideBearing ), + FT_FRAME_SHORT( rightSideBearing ), + FT_FRAME_SHORT( characterWidth ), + FT_FRAME_SHORT( ascent ), + FT_FRAME_SHORT( descent ), + FT_FRAME_SHORT( attributes ), + FT_FRAME_END + }; + + +#define PCF_COMPRESSED_METRIC_SIZE 5 + + static + const FT_Frame_Field pcf_compressed_metric_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_Compressed_MetricRec + + FT_FRAME_START( PCF_COMPRESSED_METRIC_SIZE ), + FT_FRAME_BYTE( leftSideBearing ), + FT_FRAME_BYTE( rightSideBearing ), + FT_FRAME_BYTE( characterWidth ), + FT_FRAME_BYTE( ascent ), + FT_FRAME_BYTE( descent ), + FT_FRAME_END + }; + + + static FT_Error + pcf_get_metric( FT_Stream stream, + FT_ULong format, + PCF_Metric metric ) + { + FT_Error error = PCF_Err_Ok; + + + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + const FT_Frame_Field* fields; + + + /* parsing normal metrics */ + fields = PCF_BYTE_ORDER( format ) == MSBFirst + ? pcf_metric_msb_header + : pcf_metric_header; + + /* the following sets `error' but doesn't return in case of failure */ + (void)FT_STREAM_READ_FIELDS( fields, metric ); + } + else + { + PCF_Compressed_MetricRec compr; + + + /* parsing compressed metrics */ + if ( FT_STREAM_READ_FIELDS( pcf_compressed_metric_header, &compr ) ) + goto Exit; + + metric->leftSideBearing = (FT_Short)( compr.leftSideBearing - 0x80 ); + metric->rightSideBearing = (FT_Short)( compr.rightSideBearing - 0x80 ); + metric->characterWidth = (FT_Short)( compr.characterWidth - 0x80 ); + metric->ascent = (FT_Short)( compr.ascent - 0x80 ); + metric->descent = (FT_Short)( compr.descent - 0x80 ); + metric->attributes = 0; + } + + Exit: + return error; + } + + + static FT_Error + pcf_seek_to_table_type( FT_Stream stream, + PCF_Table tables, + FT_ULong ntables, /* same as PCF_Toc->count */ + FT_ULong type, + FT_ULong *aformat, + FT_ULong *asize ) + { + FT_Error error = PCF_Err_Invalid_File_Format; + FT_ULong i; + + + for ( i = 0; i < ntables; i++ ) + if ( tables[i].type == type ) + { + if ( stream->pos > tables[i].offset ) + { + error = PCF_Err_Invalid_Stream_Skip; + goto Fail; + } + + if ( FT_STREAM_SKIP( tables[i].offset - stream->pos ) ) + { + error = PCF_Err_Invalid_Stream_Skip; + goto Fail; + } + + *asize = tables[i].size; + *aformat = tables[i].format; + + return PCF_Err_Ok; + } + + Fail: + *asize = 0; + return error; + } + + + static FT_Bool + pcf_has_table_type( PCF_Table tables, + FT_ULong ntables, /* same as PCF_Toc->count */ + FT_ULong type ) + { + FT_ULong i; + + + for ( i = 0; i < ntables; i++ ) + if ( tables[i].type == type ) + return TRUE; + + return FALSE; + } + + +#define PCF_PROPERTY_SIZE 9 + + static + const FT_Frame_Field pcf_property_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_ParsePropertyRec + + FT_FRAME_START( PCF_PROPERTY_SIZE ), + FT_FRAME_LONG_LE( name ), + FT_FRAME_BYTE ( isString ), + FT_FRAME_LONG_LE( value ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_property_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_ParsePropertyRec + + FT_FRAME_START( PCF_PROPERTY_SIZE ), + FT_FRAME_LONG( name ), + FT_FRAME_BYTE( isString ), + FT_FRAME_LONG( value ), + FT_FRAME_END + }; + + + FT_LOCAL_DEF( PCF_Property ) + pcf_find_property( PCF_Face face, + const FT_String* prop ) + { + PCF_Property properties = face->properties; + FT_Bool found = 0; + int i; + + + for ( i = 0 ; i < face->nprops && !found; i++ ) + { + if ( !ft_strcmp( properties[i].name, prop ) ) + found = 1; + } + + if ( found ) + return properties + i - 1; + else + return NULL; + } + + + static FT_Error + pcf_get_properties( FT_Stream stream, + PCF_Face face ) + { + PCF_ParseProperty props = 0; + PCF_Property properties; + FT_ULong nprops, i; + FT_ULong format, size; + FT_Error error; + FT_Memory memory = FT_FACE(face)->memory; + FT_ULong string_size; + FT_String* strings = 0; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_PROPERTIES, + &format, + &size ); + if ( error ) + goto Bail; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + FT_TRACE4(( "pcf_get_properties:\n" )); + + FT_TRACE4(( " format = %ld\n", format )); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + goto Bail; + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( nprops ); + else + (void)FT_READ_ULONG_LE( nprops ); + if ( error ) + goto Bail; + + FT_TRACE4(( " nprop = %d (truncate %d props)\n", + (int)nprops, nprops - (int)nprops )); + + nprops = (int)nprops; + + /* rough estimate */ + if ( nprops > size / PCF_PROPERTY_SIZE ) + { + error = PCF_Err_Invalid_Table; + goto Bail; + } + + face->nprops = (int)nprops; + + if ( FT_NEW_ARRAY( props, nprops ) ) + goto Bail; + + for ( i = 0; i < nprops; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + if ( FT_STREAM_READ_FIELDS( pcf_property_msb_header, props + i ) ) + goto Bail; + } + else + { + if ( FT_STREAM_READ_FIELDS( pcf_property_header, props + i ) ) + goto Bail; + } + } + + /* pad the property array */ + /* */ + /* clever here - nprops is the same as the number of odd-units read, */ + /* as only isStringProp are odd length (Keith Packard) */ + /* */ + if ( nprops & 3 ) + { + i = 4 - ( nprops & 3 ); + if ( FT_STREAM_SKIP( i ) ) + { + error = PCF_Err_Invalid_Stream_Skip; + goto Bail; + } + } + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( string_size ); + else + (void)FT_READ_ULONG_LE( string_size ); + if ( error ) + goto Bail; + + FT_TRACE4(( " string_size = %ld\n", string_size )); + + /* rough estimate */ + if ( string_size > size - nprops * PCF_PROPERTY_SIZE ) + { + error = PCF_Err_Invalid_Table; + goto Bail; + } + + if ( FT_NEW_ARRAY( strings, string_size ) ) + goto Bail; + + error = FT_Stream_Read( stream, (FT_Byte*)strings, string_size ); + if ( error ) + goto Bail; + + if ( FT_NEW_ARRAY( properties, nprops ) ) + goto Bail; + + face->properties = properties; + + for ( i = 0; i < nprops; i++ ) + { + FT_Long name_offset = props[i].name; + + + if ( ( name_offset < 0 ) || + ( (FT_ULong)name_offset > string_size ) ) + { + error = PCF_Err_Invalid_Offset; + goto Bail; + } + + if ( FT_STRDUP( properties[i].name, strings + name_offset ) ) + goto Bail; + + FT_TRACE4(( " %s:", properties[i].name )); + + properties[i].isString = props[i].isString; + + if ( props[i].isString ) + { + FT_Long value_offset = props[i].value; + + + if ( ( value_offset < 0 ) || + ( (FT_ULong)value_offset > string_size ) ) + { + error = PCF_Err_Invalid_Offset; + goto Bail; + } + + if ( FT_STRDUP( properties[i].value.atom, strings + value_offset ) ) + goto Bail; + + FT_TRACE4(( " `%s'\n", properties[i].value.atom )); + } + else + { + properties[i].value.l = props[i].value; + + FT_TRACE4(( " %d\n", properties[i].value.l )); + } + } + + error = PCF_Err_Ok; + + Bail: + FT_FREE( props ); + FT_FREE( strings ); + + return error; + } + + + static FT_Error + pcf_get_metrics( FT_Stream stream, + PCF_Face face ) + { + FT_Error error = PCF_Err_Ok; + FT_Memory memory = FT_FACE(face)->memory; + FT_ULong format, size; + PCF_Metric metrics = 0; + FT_ULong nmetrics, i; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_METRICS, + &format, + &size ); + if ( error ) + return error; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && + !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ) + return PCF_Err_Invalid_File_Format; + + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_ULONG( nmetrics ); + else + (void)FT_READ_ULONG_LE( nmetrics ); + } + else + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_USHORT( nmetrics ); + else + (void)FT_READ_USHORT_LE( nmetrics ); + } + if ( error ) + return PCF_Err_Invalid_File_Format; + + face->nmetrics = nmetrics; + + FT_TRACE4(( "pcf_get_metrics:\n" )); + + FT_TRACE4(( " number of metrics: %d\n", nmetrics )); + + /* rough estimate */ + if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + { + if ( nmetrics > size / PCF_METRIC_SIZE ) + return PCF_Err_Invalid_Table; + } + else + { + if ( nmetrics > size / PCF_COMPRESSED_METRIC_SIZE ) + return PCF_Err_Invalid_Table; + } + + if ( FT_NEW_ARRAY( face->metrics, nmetrics ) ) + return PCF_Err_Out_Of_Memory; + + metrics = face->metrics; + for ( i = 0; i < nmetrics; i++ ) + { + error = pcf_get_metric( stream, format, metrics + i ); + + metrics[i].bits = 0; + + FT_TRACE5(( " idx %d: width=%d, " + "lsb=%d, rsb=%d, ascent=%d, descent=%d, swidth=%d\n", + i, + ( metrics + i )->characterWidth, + ( metrics + i )->leftSideBearing, + ( metrics + i )->rightSideBearing, + ( metrics + i )->ascent, + ( metrics + i )->descent, + ( metrics + i )->attributes )); + + if ( error ) + break; + } + + if ( error ) + FT_FREE( face->metrics ); + + Bail: + return error; + } + + + static FT_Error + pcf_get_bitmaps( FT_Stream stream, + PCF_Face face ) + { + FT_Error error = PCF_Err_Ok; + FT_Memory memory = FT_FACE(face)->memory; + FT_Long* offsets; + FT_Long bitmapSizes[GLYPHPADOPTIONS]; + FT_ULong format, size; + FT_ULong nbitmaps, i, sizebitmaps = 0; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_BITMAPS, + &format, + &size ); + if ( error ) + return error; + + error = FT_Stream_EnterFrame( stream, 8 ); + if ( error ) + return error; + + format = FT_GET_ULONG_LE(); + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + nbitmaps = FT_GET_ULONG(); + else + nbitmaps = FT_GET_ULONG_LE(); + + FT_Stream_ExitFrame( stream ); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + return PCF_Err_Invalid_File_Format; + + FT_TRACE4(( "pcf_get_bitmaps:\n" )); + + FT_TRACE4(( " number of bitmaps: %d\n", nbitmaps )); + + /* XXX: PCF_Face->nmetrics is singed FT_Long, see pcf.h */ + if ( face->nmetrics < 0 || nbitmaps != ( FT_ULong )face->nmetrics ) + return PCF_Err_Invalid_File_Format; + + if ( FT_NEW_ARRAY( offsets, nbitmaps ) ) + return error; + + for ( i = 0; i < nbitmaps; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_LONG( offsets[i] ); + else + (void)FT_READ_LONG_LE( offsets[i] ); + + FT_TRACE5(( " bitmap %d: offset %ld (0x%lX)\n", + i, offsets[i], offsets[i] )); + } + if ( error ) + goto Bail; + + for ( i = 0; i < GLYPHPADOPTIONS; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + (void)FT_READ_LONG( bitmapSizes[i] ); + else + (void)FT_READ_LONG_LE( bitmapSizes[i] ); + if ( error ) + goto Bail; + + sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX( format )]; + + FT_TRACE4(( " padding %d implies a size of %ld\n", i, bitmapSizes[i] )); + } + + FT_TRACE4(( " %d bitmaps, padding index %ld\n", + nbitmaps, + PCF_GLYPH_PAD_INDEX( format ) )); + FT_TRACE4(( " bitmap size = %d\n", sizebitmaps )); + + FT_UNUSED( sizebitmaps ); /* only used for debugging */ + + for ( i = 0; i < nbitmaps; i++ ) + { + /* rough estimate */ + if ( ( offsets[i] < 0 ) || + ( (FT_ULong)offsets[i] > size ) ) + { + FT_TRACE0(( "pcf_get_bitmaps:" + " invalid offset to bitmap data of glyph %d\n", i )); + } + else + face->metrics[i].bits = stream->pos + offsets[i]; + } + + face->bitmapsFormat = format; + + Bail: + FT_FREE( offsets ); + return error; + } + + + static FT_Error + pcf_get_encodings( FT_Stream stream, + PCF_Face face ) + { + FT_Error error = PCF_Err_Ok; + FT_Memory memory = FT_FACE(face)->memory; + FT_ULong format, size; + int firstCol, lastCol; + int firstRow, lastRow; + int nencoding, encodingOffset; + int i, j; + PCF_Encoding tmpEncoding, encoding = 0; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + PCF_BDF_ENCODINGS, + &format, + &size ); + if ( error ) + return error; + + error = FT_Stream_EnterFrame( stream, 14 ); + if ( error ) + return error; + + format = FT_GET_ULONG_LE(); + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + firstCol = FT_GET_SHORT(); + lastCol = FT_GET_SHORT(); + firstRow = FT_GET_SHORT(); + lastRow = FT_GET_SHORT(); + face->defaultChar = FT_GET_SHORT(); + } + else + { + firstCol = FT_GET_SHORT_LE(); + lastCol = FT_GET_SHORT_LE(); + firstRow = FT_GET_SHORT_LE(); + lastRow = FT_GET_SHORT_LE(); + face->defaultChar = FT_GET_SHORT_LE(); + } + + FT_Stream_ExitFrame( stream ); + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) ) + return PCF_Err_Invalid_File_Format; + + FT_TRACE4(( "pdf_get_encodings:\n" )); + + FT_TRACE4(( " firstCol %d, lastCol %d, firstRow %d, lastRow %d\n", + firstCol, lastCol, firstRow, lastRow )); + + nencoding = ( lastCol - firstCol + 1 ) * ( lastRow - firstRow + 1 ); + + if ( FT_NEW_ARRAY( tmpEncoding, nencoding ) ) + return PCF_Err_Out_Of_Memory; + + error = FT_Stream_EnterFrame( stream, 2 * nencoding ); + if ( error ) + goto Bail; + + for ( i = 0, j = 0 ; i < nencoding; i++ ) + { + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + encodingOffset = FT_GET_SHORT(); + else + encodingOffset = FT_GET_SHORT_LE(); + + if ( encodingOffset != -1 ) + { + tmpEncoding[j].enc = ( ( ( i / ( lastCol - firstCol + 1 ) ) + + firstRow ) * 256 ) + + ( ( i % ( lastCol - firstCol + 1 ) ) + + firstCol ); + + tmpEncoding[j].glyph = (FT_Short)encodingOffset; + + FT_TRACE5(( " code %d (0x%04X): idx %d\n", + tmpEncoding[j].enc, tmpEncoding[j].enc, + tmpEncoding[j].glyph )); + + j++; + } + } + FT_Stream_ExitFrame( stream ); + + if ( FT_NEW_ARRAY( encoding, j ) ) + goto Bail; + + for ( i = 0; i < j; i++ ) + { + encoding[i].enc = tmpEncoding[i].enc; + encoding[i].glyph = tmpEncoding[i].glyph; + } + + face->nencodings = j; + face->encodings = encoding; + FT_FREE( tmpEncoding ); + + return error; + + Bail: + FT_FREE( encoding ); + FT_FREE( tmpEncoding ); + return error; + } + + + static + const FT_Frame_Field pcf_accel_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_AccelRec + + FT_FRAME_START( 20 ), + FT_FRAME_BYTE ( noOverlap ), + FT_FRAME_BYTE ( constantMetrics ), + FT_FRAME_BYTE ( terminalFont ), + FT_FRAME_BYTE ( constantWidth ), + FT_FRAME_BYTE ( inkInside ), + FT_FRAME_BYTE ( inkMetrics ), + FT_FRAME_BYTE ( drawDirection ), + FT_FRAME_SKIP_BYTES( 1 ), + FT_FRAME_LONG_LE ( fontAscent ), + FT_FRAME_LONG_LE ( fontDescent ), + FT_FRAME_LONG_LE ( maxOverlap ), + FT_FRAME_END + }; + + + static + const FT_Frame_Field pcf_accel_msb_header[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PCF_AccelRec + + FT_FRAME_START( 20 ), + FT_FRAME_BYTE ( noOverlap ), + FT_FRAME_BYTE ( constantMetrics ), + FT_FRAME_BYTE ( terminalFont ), + FT_FRAME_BYTE ( constantWidth ), + FT_FRAME_BYTE ( inkInside ), + FT_FRAME_BYTE ( inkMetrics ), + FT_FRAME_BYTE ( drawDirection ), + FT_FRAME_SKIP_BYTES( 1 ), + FT_FRAME_LONG ( fontAscent ), + FT_FRAME_LONG ( fontDescent ), + FT_FRAME_LONG ( maxOverlap ), + FT_FRAME_END + }; + + + static FT_Error + pcf_get_accel( FT_Stream stream, + PCF_Face face, + FT_ULong type ) + { + FT_ULong format, size; + FT_Error error = PCF_Err_Ok; + PCF_Accel accel = &face->accel; + + + error = pcf_seek_to_table_type( stream, + face->toc.tables, + face->toc.count, + type, + &format, + &size ); + if ( error ) + goto Bail; + + if ( FT_READ_ULONG_LE( format ) ) + goto Bail; + + if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) && + !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) + goto Bail; + + if ( PCF_BYTE_ORDER( format ) == MSBFirst ) + { + if ( FT_STREAM_READ_FIELDS( pcf_accel_msb_header, accel ) ) + goto Bail; + } + else + { + if ( FT_STREAM_READ_FIELDS( pcf_accel_header, accel ) ) + goto Bail; + } + + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->minbounds) ); + if ( error ) + goto Bail; + + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->maxbounds) ); + if ( error ) + goto Bail; + + if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ) + { + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->ink_minbounds) ); + if ( error ) + goto Bail; + + error = pcf_get_metric( stream, + format & ( ~PCF_FORMAT_MASK ), + &(accel->ink_maxbounds) ); + if ( error ) + goto Bail; + } + else + { + accel->ink_minbounds = accel->minbounds; /* I'm not sure about this */ + accel->ink_maxbounds = accel->maxbounds; + } + + Bail: + return error; + } + + + static FT_Error + pcf_interpret_style( PCF_Face pcf ) + { + FT_Error error = PCF_Err_Ok; + FT_Face face = FT_FACE( pcf ); + FT_Memory memory = face->memory; + + PCF_Property prop; + + size_t nn, len; + char* strings[4] = { NULL, NULL, NULL, NULL }; + size_t lengths[4]; + + + face->style_flags = 0; + + prop = pcf_find_property( pcf, "SLANT" ); + if ( prop && prop->isString && + ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' || + *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) ) + { + face->style_flags |= FT_STYLE_FLAG_ITALIC; + strings[2] = ( *(prop->value.atom) == 'O' || + *(prop->value.atom) == 'o' ) ? (char *)"Oblique" + : (char *)"Italic"; + } + + prop = pcf_find_property( pcf, "WEIGHT_NAME" ); + if ( prop && prop->isString && + ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) ) + { + face->style_flags |= FT_STYLE_FLAG_BOLD; + strings[1] = (char *)"Bold"; + } + + prop = pcf_find_property( pcf, "SETWIDTH_NAME" ); + if ( prop && prop->isString && + *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[3] = (char *)(prop->value.atom); + + prop = pcf_find_property( pcf, "ADD_STYLE_NAME" ); + if ( prop && prop->isString && + *(prop->value.atom) && + !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) ) + strings[0] = (char *)(prop->value.atom); + + for ( len = 0, nn = 0; nn < 4; nn++ ) + { + lengths[nn] = 0; + if ( strings[nn] ) + { + lengths[nn] = ft_strlen( strings[nn] ); + len += lengths[nn] + 1; + } + } + + if ( len == 0 ) + { + strings[0] = (char *)"Regular"; + lengths[0] = ft_strlen( strings[0] ); + len = lengths[0] + 1; + } + + { + char* s; + + + if ( FT_ALLOC( face->style_name, len ) ) + return error; + + s = face->style_name; + + for ( nn = 0; nn < 4; nn++ ) + { + char* src = strings[nn]; + + + len = lengths[nn]; + + if ( src == NULL ) + continue; + + /* separate elements with a space */ + if ( s != face->style_name ) + *s++ = ' '; + + ft_memcpy( s, src, len ); + + /* need to convert spaces to dashes for */ + /* add_style_name and setwidth_name */ + if ( nn == 0 || nn == 3 ) + { + size_t mm; + + + for ( mm = 0; mm < len; mm++ ) + if (s[mm] == ' ') + s[mm] = '-'; + } + + s += len; + } + *s = 0; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + pcf_load_font( FT_Stream stream, + PCF_Face face ) + { + FT_Error error = PCF_Err_Ok; + FT_Memory memory = FT_FACE(face)->memory; + FT_Bool hasBDFAccelerators; + + + error = pcf_read_TOC( stream, face ); + if ( error ) + goto Exit; + + error = pcf_get_properties( stream, face ); + if ( error ) + goto Exit; + + /* Use the old accelerators if no BDF accelerators are in the file. */ + hasBDFAccelerators = pcf_has_table_type( face->toc.tables, + face->toc.count, + PCF_BDF_ACCELERATORS ); + if ( !hasBDFAccelerators ) + { + error = pcf_get_accel( stream, face, PCF_ACCELERATORS ); + if ( error ) + goto Exit; + } + + /* metrics */ + error = pcf_get_metrics( stream, face ); + if ( error ) + goto Exit; + + /* bitmaps */ + error = pcf_get_bitmaps( stream, face ); + if ( error ) + goto Exit; + + /* encodings */ + error = pcf_get_encodings( stream, face ); + if ( error ) + goto Exit; + + /* BDF style accelerators (i.e. bounds based on encoded glyphs) */ + if ( hasBDFAccelerators ) + { + error = pcf_get_accel( stream, face, PCF_BDF_ACCELERATORS ); + if ( error ) + goto Exit; + } + + /* XXX: TO DO: inkmetrics and glyph_names are missing */ + + /* now construct the face object */ + { + FT_Face root = FT_FACE( face ); + PCF_Property prop; + + + root->num_faces = 1; + root->face_index = 0; + root->face_flags = FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_FAST_GLYPHS; + + if ( face->accel.constantWidth ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( ( error = pcf_interpret_style( face ) ) != 0 ) + goto Exit; + + prop = pcf_find_property( face, "FAMILY_NAME" ); + if ( prop && prop->isString ) + { + if ( FT_STRDUP( root->family_name, prop->value.atom ) ) + goto Exit; + } + else + root->family_name = NULL; + + /* + * Note: We shift all glyph indices by +1 since we must + * respect the convention that glyph 0 always corresponds + * to the `missing glyph'. + * + * This implies bumping the number of `available' glyphs by 1. + */ + root->num_glyphs = face->nmetrics + 1; + + root->num_fixed_sizes = 1; + if ( FT_NEW_ARRAY( root->available_sizes, 1 ) ) + goto Exit; + + { + FT_Bitmap_Size* bsize = root->available_sizes; + FT_Short resolution_x = 0, resolution_y = 0; + + + FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) ); + +#if 0 + bsize->height = face->accel.maxbounds.ascent << 6; +#endif + bsize->height = (FT_Short)( face->accel.fontAscent + + face->accel.fontDescent ); + + prop = pcf_find_property( face, "AVERAGE_WIDTH" ); + if ( prop ) + bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 ); + else + bsize->width = (FT_Short)( bsize->height * 2/3 ); + + prop = pcf_find_property( face, "POINT_SIZE" ); + if ( prop ) + /* convert from 722.7 decipoints to 72 points per inch */ + bsize->size = + (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L ); + + prop = pcf_find_property( face, "PIXEL_SIZE" ); + if ( prop ) + bsize->y_ppem = (FT_Short)prop->value.l << 6; + + prop = pcf_find_property( face, "RESOLUTION_X" ); + if ( prop ) + resolution_x = (FT_Short)prop->value.l; + + prop = pcf_find_property( face, "RESOLUTION_Y" ); + if ( prop ) + resolution_y = (FT_Short)prop->value.l; + + if ( bsize->y_ppem == 0 ) + { + bsize->y_ppem = bsize->size; + if ( resolution_y ) + bsize->y_ppem = bsize->y_ppem * resolution_y / 72; + } + if ( resolution_x && resolution_y ) + bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; + else + bsize->x_ppem = bsize->y_ppem; + } + + /* set up charset */ + { + PCF_Property charset_registry = 0, charset_encoding = 0; + + + charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" ); + charset_encoding = pcf_find_property( face, "CHARSET_ENCODING" ); + + if ( charset_registry && charset_registry->isString && + charset_encoding && charset_encoding->isString ) + { + if ( FT_STRDUP( face->charset_encoding, + charset_encoding->value.atom ) || + FT_STRDUP( face->charset_registry, + charset_registry->value.atom ) ) + goto Exit; + } + } + } + + Exit: + if ( error ) + { + /* This is done to respect the behaviour of the original */ + /* PCF font driver. */ + error = PCF_Err_Invalid_File_Format; + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pcf/pcfread.h b/alienblaster/project/jni/freetype/src/pcf/pcfread.h new file mode 100644 index 000000000..c9524f134 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/pcfread.h @@ -0,0 +1,45 @@ +/* pcfread.h + + FreeType font driver for pcf fonts + + Copyright 2003 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFREAD_H__ +#define __PCFREAD_H__ + + +#include <ft2build.h> + +FT_BEGIN_HEADER + + FT_LOCAL( PCF_Property ) + pcf_find_property( PCF_Face face, + const FT_String* prop ); + +FT_END_HEADER + +#endif /* __PCFREAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pcf/pcfutil.c b/alienblaster/project/jni/freetype/src/pcf/pcfutil.c new file mode 100644 index 000000000..b91274f93 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/pcfutil.c @@ -0,0 +1,104 @@ +/* + +Copyright 1990, 1994, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ +/* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.3 1999/08/22 08:58:58 dawes Exp $ */ + +/* + * Author: Keith Packard, MIT X Consortium + */ + +/* Modified for use with FreeType */ + + +#include <ft2build.h> +#include "pcfutil.h" + + + /* + * Invert bit order within each BYTE of an array. + */ + + FT_LOCAL_DEF( void ) + BitOrderInvert( unsigned char* buf, + size_t nbytes ) + { + for ( ; nbytes > 0; nbytes--, buf++ ) + { + unsigned int val = *buf; + + + val = ( ( val >> 1 ) & 0x55 ) | ( ( val << 1 ) & 0xAA ); + val = ( ( val >> 2 ) & 0x33 ) | ( ( val << 2 ) & 0xCC ); + val = ( ( val >> 4 ) & 0x0F ) | ( ( val << 4 ) & 0xF0 ); + + *buf = (unsigned char)val; + } + } + + + /* + * Invert byte order within each 16-bits of an array. + */ + + FT_LOCAL_DEF( void ) + TwoByteSwap( unsigned char* buf, + size_t nbytes ) + { + unsigned char c; + + + for ( ; nbytes >= 2; nbytes -= 2, buf += 2 ) + { + c = buf[0]; + buf[0] = buf[1]; + buf[1] = c; + } + } + + /* + * Invert byte order within each 32-bits of an array. + */ + + FT_LOCAL_DEF( void ) + FourByteSwap( unsigned char* buf, + size_t nbytes ) + { + unsigned char c; + + + for ( ; nbytes >= 4; nbytes -= 4, buf += 4 ) + { + c = buf[0]; + buf[0] = buf[3]; + buf[3] = c; + + c = buf[1]; + buf[1] = buf[2]; + buf[2] = c; + } + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pcf/pcfutil.h b/alienblaster/project/jni/freetype/src/pcf/pcfutil.h new file mode 100644 index 000000000..ce10fb541 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/pcfutil.h @@ -0,0 +1,55 @@ +/* pcfutil.h + + FreeType font driver for pcf fonts + + Copyright 2000, 2001, 2004 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFUTIL_H__ +#define __PCFUTIL_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H + + +FT_BEGIN_HEADER + + FT_LOCAL( void ) + BitOrderInvert( unsigned char* buf, + size_t nbytes ); + + FT_LOCAL( void ) + TwoByteSwap( unsigned char* buf, + size_t nbytes ); + + FT_LOCAL( void ) + FourByteSwap( unsigned char* buf, + size_t nbytes ); + +FT_END_HEADER + +#endif /* __PCFUTIL_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pcf/rules.mk b/alienblaster/project/jni/freetype/src/pcf/rules.mk new file mode 100644 index 000000000..78641528f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pcf/rules.mk @@ -0,0 +1,79 @@ +# +# FreeType 2 pcf driver configuration rules +# + + +# Copyright (C) 2000, 2001, 2003, 2008 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +# pcf driver directory +# +PCF_DIR := $(SRC_DIR)/pcf + + +PCF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PCF_DIR)) + + +# pcf driver sources (i.e., C files) +# +PCF_DRV_SRC := $(PCF_DIR)/pcfdrivr.c \ + $(PCF_DIR)/pcfread.c \ + $(PCF_DIR)/pcfutil.c + +# pcf driver headers +# +PCF_DRV_H := $(PCF_DRV_SRC:%.c=%.h) \ + $(PCF_DIR)/pcf.h \ + $(PCF_DIR)/pcferror.h + +# pcf driver object(s) +# +# PCF_DRV_OBJ_M is used during `multi' builds +# PCF_DRV_OBJ_S is used during `single' builds +# +PCF_DRV_OBJ_M := $(PCF_DRV_SRC:$(PCF_DIR)/%.c=$(OBJ_DIR)/%.$O) +PCF_DRV_OBJ_S := $(OBJ_DIR)/pcf.$O + +# pcf driver source file for single build +# +PCF_DRV_SRC_S := $(PCF_DIR)/pcf.c + + +# pcf driver - single object +# +$(PCF_DRV_OBJ_S): $(PCF_DRV_SRC_S) $(PCF_DRV_SRC) $(FREETYPE_H) $(PCF_DRV_H) + $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PCF_DRV_SRC_S)) + + +# pcf driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PCF_DIR)/%.c $(FREETYPE_H) $(PCF_DRV_H) + $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PCF_DRV_OBJ_S) +DRV_OBJS_M += $(PCF_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/pfr/Jamfile b/alienblaster/project/jni/freetype/src/pfr/Jamfile new file mode 100644 index 000000000..9e2f2b8d0 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/pfr Jamfile +# +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) pfr ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = pfrdrivr pfrgload pfrload pfrobjs pfrcmap pfrsbit ; + } + else + { + _sources = pfr ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/pfr Jamfile diff --git a/alienblaster/project/jni/freetype/src/pfr/module.mk b/alienblaster/project/jni/freetype/src/pfr/module.mk new file mode 100644 index 000000000..8d1d28a9d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PFR module definition +# + + +# Copyright 2002, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PFR_DRIVER + +define PFR_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, pfr_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pfr $(ECHO_DRIVER_DESC)PFR/TrueDoc font files with extension *.pfr$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrcmap.c b/alienblaster/project/jni/freetype/src/pfr/pfrcmap.c new file mode 100644 index 000000000..9c8f9ed8e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrcmap.c @@ -0,0 +1,166 @@ +/***************************************************************************/ +/* */ +/* pfrcmap.c */ +/* */ +/* FreeType PFR cmap handling (body). */ +/* */ +/* Copyright 2002, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrcmap.h" +#include "pfrobjs.h" + +#include "pfrerror.h" + + + FT_CALLBACK_DEF( FT_Error ) + pfr_cmap_init( PFR_CMap cmap ) + { + FT_Error error = PFR_Err_Ok; + PFR_Face face = (PFR_Face)FT_CMAP_FACE( cmap ); + + + cmap->num_chars = face->phy_font.num_chars; + cmap->chars = face->phy_font.chars; + + /* just for safety, check that the character entries are correctly */ + /* sorted in increasing character code order */ + { + FT_UInt n; + + + for ( n = 1; n < cmap->num_chars; n++ ) + { + if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code ) + { + error = PFR_Err_Invalid_Table; + goto Exit; + } + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + pfr_cmap_done( PFR_CMap cmap ) + { + cmap->chars = NULL; + cmap->num_chars = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + pfr_cmap_char_index( PFR_CMap cmap, + FT_UInt32 char_code ) + { + FT_UInt min = 0; + FT_UInt max = cmap->num_chars; + FT_UInt mid; + PFR_Char gchar; + + + while ( min < max ) + { + mid = min + ( max - min ) / 2; + gchar = cmap->chars + mid; + + if ( gchar->char_code == char_code ) + return mid + 1; + + if ( gchar->char_code < char_code ) + min = mid + 1; + else + max = mid; + } + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + pfr_cmap_char_next( PFR_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + Restart: + { + FT_UInt min = 0; + FT_UInt max = cmap->num_chars; + FT_UInt mid; + PFR_Char gchar; + + + while ( min < max ) + { + mid = min + ( ( max - min ) >> 1 ); + gchar = cmap->chars + mid; + + if ( gchar->char_code == char_code ) + { + result = mid; + if ( result != 0 ) + { + result++; + goto Exit; + } + + char_code++; + goto Restart; + } + + if ( gchar->char_code < char_code ) + min = mid+1; + else + max = mid; + } + + /* we didn't find it, but we have a pair just above it */ + char_code = 0; + + if ( min < cmap->num_chars ) + { + gchar = cmap->chars + min; + result = min; + if ( result != 0 ) + { + result++; + char_code = gchar->char_code; + } + } + } + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + pfr_cmap_class_rec = + { + sizeof ( PFR_CMapRec ), + + (FT_CMap_InitFunc) pfr_cmap_init, + (FT_CMap_DoneFunc) pfr_cmap_done, + (FT_CMap_CharIndexFunc)pfr_cmap_char_index, + (FT_CMap_CharNextFunc) pfr_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrcmap.h b/alienblaster/project/jni/freetype/src/pfr/pfrcmap.h new file mode 100644 index 000000000..a62695305 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrcmap.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* pfrcmap.h */ +/* */ +/* FreeType PFR cmap handling (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRCMAP_H__ +#define __PFRCMAP_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include "pfrtypes.h" + + +FT_BEGIN_HEADER + + typedef struct PFR_CMapRec_ + { + FT_CMapRec cmap; + FT_UInt num_chars; + PFR_Char chars; + + } PFR_CMapRec, *PFR_CMap; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec pfr_cmap_class_rec; + +FT_END_HEADER + + +#endif /* __PFRCMAP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrdrivr.c b/alienblaster/project/jni/freetype/src/pfr/pfrdrivr.c new file mode 100644 index 000000000..15cca9854 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrdrivr.c @@ -0,0 +1,214 @@ +/***************************************************************************/ +/* */ +/* pfrdrivr.c */ +/* */ +/* FreeType PFR driver interface (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_PFR_H +#include FT_SERVICE_XFREE86_NAME_H +#include "pfrdrivr.h" +#include "pfrobjs.h" + +#include "pfrerror.h" + + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_kerning( FT_Face pfrface, /* PFR_Face */ + FT_UInt left, + FT_UInt right, + FT_Vector *avector ) + { + PFR_Face face = (PFR_Face)pfrface; + PFR_PhyFont phys = &face->phy_font; + + + pfr_face_get_kerning( pfrface, left, right, avector ); + + /* convert from metrics to outline units when necessary */ + if ( phys->outline_resolution != phys->metrics_resolution ) + { + if ( avector->x != 0 ) + avector->x = FT_MulDiv( avector->x, phys->outline_resolution, + phys->metrics_resolution ); + + if ( avector->y != 0 ) + avector->y = FT_MulDiv( avector->x, phys->outline_resolution, + phys->metrics_resolution ); + } + + return PFR_Err_Ok; + } + + + /* + * PFR METRICS SERVICE + * + */ + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_advance( FT_Face pfrface, /* PFR_Face */ + FT_UInt gindex, + FT_Pos *anadvance ) + { + PFR_Face face = (PFR_Face)pfrface; + FT_Error error = PFR_Err_Invalid_Argument; + + + *anadvance = 0; + + if ( !gindex ) + goto Exit; + + gindex--; + + if ( face ) + { + PFR_PhyFont phys = &face->phy_font; + + + if ( gindex < phys->num_chars ) + { + *anadvance = phys->chars[gindex].advance; + error = 0; + } + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + pfr_get_metrics( FT_Face pfrface, /* PFR_Face */ + FT_UInt *anoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ) + { + PFR_Face face = (PFR_Face)pfrface; + PFR_PhyFont phys = &face->phy_font; + FT_Fixed x_scale, y_scale; + FT_Size size = face->root.size; + + + if ( anoutline_resolution ) + *anoutline_resolution = phys->outline_resolution; + + if ( ametrics_resolution ) + *ametrics_resolution = phys->metrics_resolution; + + x_scale = 0x10000L; + y_scale = 0x10000L; + + if ( size ) + { + x_scale = FT_DivFix( size->metrics.x_ppem << 6, + phys->metrics_resolution ); + + y_scale = FT_DivFix( size->metrics.y_ppem << 6, + phys->metrics_resolution ); + } + + if ( ametrics_x_scale ) + *ametrics_x_scale = x_scale; + + if ( ametrics_y_scale ) + *ametrics_y_scale = y_scale; + + return PFR_Err_Ok; + } + + + FT_CALLBACK_TABLE_DEF + const FT_Service_PfrMetricsRec pfr_metrics_service_rec = + { + pfr_get_metrics, + pfr_face_get_kerning, + pfr_get_advance + }; + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec pfr_services[] = + { + { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PFR }, + { NULL, NULL } + }; + + + FT_CALLBACK_DEF( FT_Module_Interface ) + pfr_get_service( FT_Module module, + const FT_String* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( pfr_services, service_id ); + } + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec pfr_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE, + + sizeof( FT_DriverRec ), + + "pfr", + 0x10000L, + 0x20000L, + + NULL, + + 0, + 0, + pfr_get_service + }, + + sizeof( PFR_FaceRec ), + sizeof( PFR_SizeRec ), + sizeof( PFR_SlotRec ), + + pfr_face_init, + pfr_face_done, + 0, /* FT_Size_InitFunc */ + 0, /* FT_Size_DoneFunc */ + pfr_slot_init, + pfr_slot_done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + pfr_slot_load, + + pfr_get_kerning, + 0, /* FT_Face_AttachFunc */ + 0, /* FT_Face_GetAdvancesFunc */ + 0, /* FT_Size_RequestFunc */ + 0, /* FT_Size_SelectFunc */ + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrdrivr.h b/alienblaster/project/jni/freetype/src/pfr/pfrdrivr.h new file mode 100644 index 000000000..da0a1aa63 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrdrivr.h @@ -0,0 +1,43 @@ +/***************************************************************************/ +/* */ +/* pfrdrivr.h */ +/* */ +/* High-level Type PFR driver interface (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRDRIVR_H__ +#define __PFRDRIVR_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) pfr_driver_class; + + +FT_END_HEADER + + +#endif /* __PFRDRIVR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrerror.h b/alienblaster/project/jni/freetype/src/pfr/pfrerror.h new file mode 100644 index 000000000..2e1c401dd --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrerror.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* pfrerror.h */ +/* */ +/* PFR error codes (specification only). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PFR error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PFRERROR_H__ +#define __PFRERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PFR_Err_ +#define FT_ERR_BASE FT_Mod_Err_PFR + +#include FT_ERRORS_H + +#endif /* __PFRERROR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrgload.c b/alienblaster/project/jni/freetype/src/pfr/pfrgload.c new file mode 100644 index 000000000..6fe6e4225 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrgload.c @@ -0,0 +1,828 @@ +/***************************************************************************/ +/* */ +/* pfrgload.c */ +/* */ +/* FreeType PFR glyph loader (body). */ +/* */ +/* Copyright 2002, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrgload.h" +#include "pfrsbit.h" +#include "pfrload.h" /* for macro definitions */ +#include FT_INTERNAL_DEBUG_H + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR GLYPH BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( void ) + pfr_glyph_init( PFR_Glyph glyph, + FT_GlyphLoader loader ) + { + FT_ZERO( glyph ); + + glyph->loader = loader; + glyph->path_begun = 0; + + FT_GlyphLoader_Rewind( loader ); + } + + + FT_LOCAL_DEF( void ) + pfr_glyph_done( PFR_Glyph glyph ) + { + FT_Memory memory = glyph->loader->memory; + + + FT_FREE( glyph->x_control ); + glyph->y_control = NULL; + + glyph->max_xy_control = 0; +#if 0 + glyph->num_x_control = 0; + glyph->num_y_control = 0; +#endif + + FT_FREE( glyph->subs ); + + glyph->max_subs = 0; + glyph->num_subs = 0; + + glyph->loader = NULL; + glyph->path_begun = 0; + } + + + /* close current contour, if any */ + static void + pfr_glyph_close_contour( PFR_Glyph glyph ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Int last, first; + + + if ( !glyph->path_begun ) + return; + + /* compute first and last point indices in current glyph outline */ + last = outline->n_points - 1; + first = 0; + if ( outline->n_contours > 0 ) + first = outline->contours[outline->n_contours - 1]; + + /* if the last point falls on the same location than the first one */ + /* we need to delete it */ + if ( last > first ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + last; + + + if ( p1->x == p2->x && p1->y == p2->y ) + { + outline->n_points--; + last--; + } + } + + /* don't add empty contours */ + if ( last >= first ) + outline->contours[outline->n_contours++] = (short)last; + + glyph->path_begun = 0; + } + + + /* reset glyph to start the loading of a new glyph */ + static void + pfr_glyph_start( PFR_Glyph glyph ) + { + glyph->path_begun = 0; + } + + + static FT_Error + pfr_glyph_line_to( PFR_Glyph glyph, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Error error; + + + /* check that we have begun a new path */ + if ( !glyph->path_begun ) + { + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" )); + goto Exit; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 0 ); + if ( !error ) + { + FT_UInt n = outline->n_points; + + + outline->points[n] = *to; + outline->tags [n] = FT_CURVE_TAG_ON; + + outline->n_points++; + } + + Exit: + return error; + } + + + static FT_Error + pfr_glyph_curve_to( PFR_Glyph glyph, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Outline* outline = &loader->current.outline; + FT_Error error; + + + /* check that we have begun a new path */ + if ( !glyph->path_begun ) + { + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" )); + goto Exit; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 3, 0 ); + if ( !error ) + { + FT_Vector* vec = outline->points + outline->n_points; + FT_Byte* tag = (FT_Byte*)outline->tags + outline->n_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + tag[0] = FT_CURVE_TAG_CUBIC; + tag[1] = FT_CURVE_TAG_CUBIC; + tag[2] = FT_CURVE_TAG_ON; + + outline->n_points = (FT_Short)( outline->n_points + 3 ); + } + + Exit: + return error; + } + + + static FT_Error + pfr_glyph_move_to( PFR_Glyph glyph, + FT_Vector* to ) + { + FT_GlyphLoader loader = glyph->loader; + FT_Error error; + + + /* close current contour if any */ + pfr_glyph_close_contour( glyph ); + + /* indicate that a new contour has started */ + glyph->path_begun = 1; + + /* check that there is space for a new contour and a new point */ + error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 1 ); + if ( !error ) + /* add new start point */ + error = pfr_glyph_line_to( glyph, to ); + + return error; + } + + + static void + pfr_glyph_end( PFR_Glyph glyph ) + { + /* close current contour if any */ + pfr_glyph_close_contour( glyph ); + + /* merge the current glyph into the stack */ + FT_GlyphLoader_Add( glyph->loader ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR GLYPH LOADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* load a simple glyph */ + static FT_Error + pfr_glyph_load_simple( PFR_Glyph glyph, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Error error = 0; + FT_Memory memory = glyph->loader->memory; + FT_UInt flags, x_count, y_count, i, count, mask; + FT_Int x; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + /* test for composite glyphs */ + if ( flags & PFR_GLYPH_IS_COMPOUND ) + goto Failure; + + x_count = 0; + y_count = 0; + + if ( flags & PFR_GLYPH_1BYTE_XYCOUNT ) + { + PFR_CHECK( 1 ); + count = PFR_NEXT_BYTE( p ); + x_count = ( count & 15 ); + y_count = ( count >> 4 ); + } + else + { + if ( flags & PFR_GLYPH_XCOUNT ) + { + PFR_CHECK( 1 ); + x_count = PFR_NEXT_BYTE( p ); + } + + if ( flags & PFR_GLYPH_YCOUNT ) + { + PFR_CHECK( 1 ); + y_count = PFR_NEXT_BYTE( p ); + } + } + + count = x_count + y_count; + + /* re-allocate array when necessary */ + if ( count > glyph->max_xy_control ) + { + FT_UInt new_max = FT_PAD_CEIL( count, 8 ); + + + if ( FT_RENEW_ARRAY( glyph->x_control, + glyph->max_xy_control, + new_max ) ) + goto Exit; + + glyph->max_xy_control = new_max; + } + + glyph->y_control = glyph->x_control + x_count; + + mask = 0; + x = 0; + + for ( i = 0; i < count; i++ ) + { + if ( ( i & 7 ) == 0 ) + { + PFR_CHECK( 1 ); + mask = PFR_NEXT_BYTE( p ); + } + + if ( mask & 1 ) + { + PFR_CHECK( 2 ); + x = PFR_NEXT_SHORT( p ); + } + else + { + PFR_CHECK( 1 ); + x += PFR_NEXT_BYTE( p ); + } + + glyph->x_control[i] = x; + + mask >>= 1; + } + + /* XXX: for now we ignore the secondary stroke and edge definitions */ + /* since we don't want to support native PFR hinting */ + /* */ + if ( flags & PFR_GLYPH_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if ( error ) + goto Exit; + } + + pfr_glyph_start( glyph ); + + /* now load a simple glyph */ + { + FT_Vector pos[4]; + FT_Vector* cur; + + + pos[0].x = pos[0].y = 0; + pos[3] = pos[0]; + + for (;;) + { + FT_UInt format, format_low, args_format = 0, args_count, n; + + + /***************************************************************/ + /* read instruction */ + /* */ + PFR_CHECK( 1 ); + format = PFR_NEXT_BYTE( p ); + format_low = format & 15; + + switch ( format >> 4 ) + { + case 0: /* end glyph */ + FT_TRACE6(( "- end glyph" )); + args_count = 0; + break; + + case 1: /* general line operation */ + FT_TRACE6(( "- general line" )); + goto Line1; + + case 4: /* move to inside contour */ + FT_TRACE6(( "- move to inside" )); + goto Line1; + + case 5: /* move to outside contour */ + FT_TRACE6(( "- move to outside" )); + Line1: + args_format = format_low; + args_count = 1; + break; + + case 2: /* horizontal line to */ + FT_TRACE6(( "- horizontal line to cx.%d", format_low )); + if ( format_low > x_count ) + goto Failure; + pos[0].x = glyph->x_control[format_low]; + pos[0].y = pos[3].y; + pos[3] = pos[0]; + args_count = 0; + break; + + case 3: /* vertical line to */ + FT_TRACE6(( "- vertical line to cy.%d", format_low )); + if ( format_low > y_count ) + goto Failure; + pos[0].x = pos[3].x; + pos[0].y = glyph->y_control[format_low]; + pos[3] = pos[0]; + args_count = 0; + break; + + case 6: /* horizontal to vertical curve */ + FT_TRACE6(( "- hv curve " )); + args_format = 0xB8E; + args_count = 3; + break; + + case 7: /* vertical to horizontal curve */ + FT_TRACE6(( "- vh curve" )); + args_format = 0xE2B; + args_count = 3; + break; + + default: /* general curve to */ + FT_TRACE6(( "- general curve" )); + args_count = 4; + args_format = format_low; + } + + /***********************************************************/ + /* now read arguments */ + /* */ + cur = pos; + for ( n = 0; n < args_count; n++ ) + { + FT_UInt idx; + FT_Int delta; + + + /* read the X argument */ + switch ( args_format & 3 ) + { + case 0: /* 8-bit index */ + PFR_CHECK( 1 ); + idx = PFR_NEXT_BYTE( p ); + if ( idx > x_count ) + goto Failure; + cur->x = glyph->x_control[idx]; + FT_TRACE7(( " cx#%d", idx )); + break; + + case 1: /* 16-bit value */ + PFR_CHECK( 2 ); + cur->x = PFR_NEXT_SHORT( p ); + FT_TRACE7(( " x.%d", cur->x )); + break; + + case 2: /* 8-bit delta */ + PFR_CHECK( 1 ); + delta = PFR_NEXT_INT8( p ); + cur->x = pos[3].x + delta; + FT_TRACE7(( " dx.%d", delta )); + break; + + default: + FT_TRACE7(( " |" )); + cur->x = pos[3].x; + } + + /* read the Y argument */ + switch ( ( args_format >> 2 ) & 3 ) + { + case 0: /* 8-bit index */ + PFR_CHECK( 1 ); + idx = PFR_NEXT_BYTE( p ); + if ( idx > y_count ) + goto Failure; + cur->y = glyph->y_control[idx]; + FT_TRACE7(( " cy#%d", idx )); + break; + + case 1: /* 16-bit absolute value */ + PFR_CHECK( 2 ); + cur->y = PFR_NEXT_SHORT( p ); + FT_TRACE7(( " y.%d", cur->y )); + break; + + case 2: /* 8-bit delta */ + PFR_CHECK( 1 ); + delta = PFR_NEXT_INT8( p ); + cur->y = pos[3].y + delta; + FT_TRACE7(( " dy.%d", delta )); + break; + + default: + FT_TRACE7(( " -" )); + cur->y = pos[3].y; + } + + /* read the additional format flag for the general curve */ + if ( n == 0 && args_count == 4 ) + { + PFR_CHECK( 1 ); + args_format = PFR_NEXT_BYTE( p ); + args_count--; + } + else + args_format >>= 4; + + /* save the previous point */ + pos[3] = cur[0]; + cur++; + } + + FT_TRACE7(( "\n" )); + + /***********************************************************/ + /* finally, execute instruction */ + /* */ + switch ( format >> 4 ) + { + case 0: /* end glyph => EXIT */ + pfr_glyph_end( glyph ); + goto Exit; + + case 1: /* line operations */ + case 2: + case 3: + error = pfr_glyph_line_to( glyph, pos ); + goto Test_Error; + + case 4: /* move to inside contour */ + case 5: /* move to outside contour */ + error = pfr_glyph_move_to( glyph, pos ); + goto Test_Error; + + default: /* curve operations */ + error = pfr_glyph_curve_to( glyph, pos, pos + 1, pos + 2 ); + + Test_Error: /* test error condition */ + if ( error ) + goto Exit; + } + } /* for (;;) */ + } + + Exit: + return error; + + Failure: + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_load_simple: invalid glyph data\n" )); + goto Exit; + } + + + /* load a composite/compound glyph */ + static FT_Error + pfr_glyph_load_compound( PFR_Glyph glyph, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Error error = 0; + FT_GlyphLoader loader = glyph->loader; + FT_Memory memory = loader->memory; + PFR_SubGlyph subglyph; + FT_UInt flags, i, count, org_count; + FT_Int x_pos, y_pos; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + /* test for composite glyphs */ + if ( !( flags & PFR_GLYPH_IS_COMPOUND ) ) + goto Failure; + + count = flags & 0x3F; + + /* ignore extra items when present */ + /* */ + if ( flags & PFR_GLYPH_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if (error) goto Exit; + } + + /* we can't rely on the FT_GlyphLoader to load sub-glyphs, because */ + /* the PFR format is dumb, using direct file offsets to point to the */ + /* sub-glyphs (instead of glyph indices). Sigh. */ + /* */ + /* For now, we load the list of sub-glyphs into a different array */ + /* but this will prevent us from using the auto-hinter at its best */ + /* quality. */ + /* */ + org_count = glyph->num_subs; + + if ( org_count + count > glyph->max_subs ) + { + FT_UInt new_max = ( org_count + count + 3 ) & (FT_UInt)-4; + + + if ( FT_RENEW_ARRAY( glyph->subs, glyph->max_subs, new_max ) ) + goto Exit; + + glyph->max_subs = new_max; + } + + subglyph = glyph->subs + org_count; + + for ( i = 0; i < count; i++, subglyph++ ) + { + FT_UInt format; + + + x_pos = 0; + y_pos = 0; + + PFR_CHECK( 1 ); + format = PFR_NEXT_BYTE( p ); + + /* read scale when available */ + subglyph->x_scale = 0x10000L; + if ( format & PFR_SUBGLYPH_XSCALE ) + { + PFR_CHECK( 2 ); + subglyph->x_scale = PFR_NEXT_SHORT( p ) << 4; + } + + subglyph->y_scale = 0x10000L; + if ( format & PFR_SUBGLYPH_YSCALE ) + { + PFR_CHECK( 2 ); + subglyph->y_scale = PFR_NEXT_SHORT( p ) << 4; + } + + /* read offset */ + switch ( format & 3 ) + { + case 1: + PFR_CHECK( 2 ); + x_pos = PFR_NEXT_SHORT( p ); + break; + + case 2: + PFR_CHECK( 1 ); + x_pos += PFR_NEXT_INT8( p ); + break; + + default: + ; + } + + switch ( ( format >> 2 ) & 3 ) + { + case 1: + PFR_CHECK( 2 ); + y_pos = PFR_NEXT_SHORT( p ); + break; + + case 2: + PFR_CHECK( 1 ); + y_pos += PFR_NEXT_INT8( p ); + break; + + default: + ; + } + + subglyph->x_delta = x_pos; + subglyph->y_delta = y_pos; + + /* read glyph position and size now */ + if ( format & PFR_SUBGLYPH_2BYTE_SIZE ) + { + PFR_CHECK( 2 ); + subglyph->gps_size = PFR_NEXT_USHORT( p ); + } + else + { + PFR_CHECK( 1 ); + subglyph->gps_size = PFR_NEXT_BYTE( p ); + } + + if ( format & PFR_SUBGLYPH_3BYTE_OFFSET ) + { + PFR_CHECK( 3 ); + subglyph->gps_offset = PFR_NEXT_LONG( p ); + } + else + { + PFR_CHECK( 2 ); + subglyph->gps_offset = PFR_NEXT_USHORT( p ); + } + + glyph->num_subs++; + } + + Exit: + return error; + + Failure: + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_glyph_load_compound: invalid glyph data\n" )); + goto Exit; + } + + + static FT_Error + pfr_glyph_load_rec( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ) + { + FT_Error error; + FT_Byte* p; + FT_Byte* limit; + + + if ( FT_STREAM_SEEK( gps_offset + offset ) || + FT_FRAME_ENTER( size ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + limit = p + size; + + if ( size > 0 && *p & PFR_GLYPH_IS_COMPOUND ) + { + FT_Int n, old_count, count; + FT_GlyphLoader loader = glyph->loader; + FT_Outline* base = &loader->base.outline; + + + old_count = glyph->num_subs; + + /* this is a compound glyph - load it */ + error = pfr_glyph_load_compound( glyph, p, limit ); + + FT_FRAME_EXIT(); + + if ( error ) + goto Exit; + + count = glyph->num_subs - old_count; + + /* now, load each individual glyph */ + for ( n = 0; n < count; n++ ) + { + FT_Int i, old_points, num_points; + PFR_SubGlyph subglyph; + + + subglyph = glyph->subs + old_count + n; + old_points = base->n_points; + + error = pfr_glyph_load_rec( glyph, stream, gps_offset, + subglyph->gps_offset, + subglyph->gps_size ); + if ( error ) + goto Exit; + + /* note that `glyph->subs' might have been re-allocated */ + subglyph = glyph->subs + old_count + n; + num_points = base->n_points - old_points; + + /* translate and eventually scale the new glyph points */ + if ( subglyph->x_scale != 0x10000L || subglyph->y_scale != 0x10000L ) + { + FT_Vector* vec = base->points + old_points; + + + for ( i = 0; i < num_points; i++, vec++ ) + { + vec->x = FT_MulFix( vec->x, subglyph->x_scale ) + + subglyph->x_delta; + vec->y = FT_MulFix( vec->y, subglyph->y_scale ) + + subglyph->y_delta; + } + } + else + { + FT_Vector* vec = loader->base.outline.points + old_points; + + + for ( i = 0; i < num_points; i++, vec++ ) + { + vec->x += subglyph->x_delta; + vec->y += subglyph->y_delta; + } + } + + /* proceed to next sub-glyph */ + } + } + else + { + /* load a simple glyph */ + error = pfr_glyph_load_simple( glyph, p, limit ); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + + + + FT_LOCAL_DEF( FT_Error ) + pfr_glyph_load( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ) + { + /* initialize glyph loader */ + FT_GlyphLoader_Rewind( glyph->loader ); + + glyph->num_subs = 0; + + /* load the glyph, recursively when needed */ + return pfr_glyph_load_rec( glyph, stream, gps_offset, offset, size ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrgload.h b/alienblaster/project/jni/freetype/src/pfr/pfrgload.h new file mode 100644 index 000000000..7cc7a8702 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrgload.h @@ -0,0 +1,49 @@ +/***************************************************************************/ +/* */ +/* pfrgload.h */ +/* */ +/* FreeType PFR glyph loader (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRGLOAD_H__ +#define __PFRGLOAD_H__ + +#include "pfrtypes.h" + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + pfr_glyph_init( PFR_Glyph glyph, + FT_GlyphLoader loader ); + + FT_LOCAL( void ) + pfr_glyph_done( PFR_Glyph glyph ); + + + FT_LOCAL( FT_Error ) + pfr_glyph_load( PFR_Glyph glyph, + FT_Stream stream, + FT_ULong gps_offset, + FT_ULong offset, + FT_ULong size ); + + +FT_END_HEADER + + +#endif /* __PFRGLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrload.c b/alienblaster/project/jni/freetype/src/pfr/pfrload.c new file mode 100644 index 000000000..bc5c035f3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrload.c @@ -0,0 +1,941 @@ +/***************************************************************************/ +/* */ +/* pfrload.c */ +/* */ +/* FreeType PFR loader (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** EXTRA ITEMS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + pfr_extra_items_skip( FT_Byte* *pp, + FT_Byte* limit ) + { + return pfr_extra_items_parse( pp, limit, NULL, NULL ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_extra_items_parse( FT_Byte* *pp, + FT_Byte* limit, + PFR_ExtraItem item_list, + FT_Pointer item_data ) + { + FT_Error error = 0; + FT_Byte* p = *pp; + FT_UInt num_items, item_type, item_size; + + + PFR_CHECK( 1 ); + num_items = PFR_NEXT_BYTE( p ); + + for ( ; num_items > 0; num_items-- ) + { + PFR_CHECK( 2 ); + item_size = PFR_NEXT_BYTE( p ); + item_type = PFR_NEXT_BYTE( p ); + + PFR_CHECK( item_size ); + + if ( item_list ) + { + PFR_ExtraItem extra = item_list; + + + for ( extra = item_list; extra->parser != NULL; extra++ ) + { + if ( extra->type == item_type ) + { + error = extra->parser( p, p + item_size, item_data ); + if ( error ) goto Exit; + + break; + } + } + } + + p += item_size; + } + + Exit: + *pp = p; + return error; + + Too_Short: + FT_ERROR(( "pfr_extra_items_parse: invalid extra items table\n" )); + error = PFR_Err_Invalid_Table; + goto Exit; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR HEADER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static const FT_Frame_Field pfr_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE PFR_HeaderRec + + FT_FRAME_START( 58 ), + FT_FRAME_ULONG ( signature ), + FT_FRAME_USHORT( version ), + FT_FRAME_USHORT( signature2 ), + FT_FRAME_USHORT( header_size ), + + FT_FRAME_USHORT( log_dir_size ), + FT_FRAME_USHORT( log_dir_offset ), + + FT_FRAME_USHORT( log_font_max_size ), + FT_FRAME_UOFF3 ( log_font_section_size ), + FT_FRAME_UOFF3 ( log_font_section_offset ), + + FT_FRAME_USHORT( phy_font_max_size ), + FT_FRAME_UOFF3 ( phy_font_section_size ), + FT_FRAME_UOFF3 ( phy_font_section_offset ), + + FT_FRAME_USHORT( gps_max_size ), + FT_FRAME_UOFF3 ( gps_section_size ), + FT_FRAME_UOFF3 ( gps_section_offset ), + + FT_FRAME_BYTE ( max_blue_values ), + FT_FRAME_BYTE ( max_x_orus ), + FT_FRAME_BYTE ( max_y_orus ), + + FT_FRAME_BYTE ( phy_font_max_size_high ), + FT_FRAME_BYTE ( color_flags ), + + FT_FRAME_UOFF3 ( bct_max_size ), + FT_FRAME_UOFF3 ( bct_set_max_size ), + FT_FRAME_UOFF3 ( phy_bct_set_max_size ), + + FT_FRAME_USHORT( num_phy_fonts ), + FT_FRAME_BYTE ( max_vert_stem_snap ), + FT_FRAME_BYTE ( max_horz_stem_snap ), + FT_FRAME_USHORT( max_chars ), + FT_FRAME_END + }; + + + FT_LOCAL_DEF( FT_Error ) + pfr_header_load( PFR_Header header, + FT_Stream stream ) + { + FT_Error error; + + + /* read header directly */ + if ( !FT_STREAM_SEEK( 0 ) && + !FT_STREAM_READ_FIELDS( pfr_header_fields, header ) ) + { + /* make a few adjustments to the header */ + header->phy_font_max_size += + (FT_UInt32)header->phy_font_max_size_high << 16; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Bool ) + pfr_header_check( PFR_Header header ) + { + FT_Bool result = 1; + + + /* check signature and header size */ + if ( header->signature != 0x50465230L || /* "PFR0" */ + header->version > 4 || + header->header_size < 58 || + header->signature2 != 0x0d0a ) /* CR/LF */ + { + result = 0; + } + return result; + } + + + /***********************************************************************/ + /***********************************************************************/ + /***** *****/ + /***** PFR LOGICAL FONTS *****/ + /***** *****/ + /***********************************************************************/ + /***********************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + pfr_log_font_count( FT_Stream stream, + FT_UInt32 section_offset, + FT_UInt *acount ) + { + FT_Error error; + FT_UInt count; + FT_UInt result = 0; + + + if ( FT_STREAM_SEEK( section_offset ) || FT_READ_USHORT( count ) ) + goto Exit; + + result = count; + + Exit: + *acount = result; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_log_font_load( PFR_LogFont log_font, + FT_Stream stream, + FT_UInt idx, + FT_UInt32 section_offset, + FT_Bool size_increment ) + { + FT_UInt num_log_fonts; + FT_UInt flags; + FT_UInt32 offset; + FT_UInt32 size; + FT_Error error; + + + if ( FT_STREAM_SEEK( section_offset ) || + FT_READ_USHORT( num_log_fonts ) ) + goto Exit; + + if ( idx >= num_log_fonts ) + return PFR_Err_Invalid_Argument; + + if ( FT_STREAM_SKIP( idx * 5 ) || + FT_READ_USHORT( size ) || + FT_READ_UOFF3 ( offset ) ) + goto Exit; + + /* save logical font size and offset */ + log_font->size = size; + log_font->offset = offset; + + /* now, check the rest of the table before loading it */ + { + FT_Byte* p; + FT_Byte* limit; + FT_UInt local; + + + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) + goto Exit; + + p = stream->cursor; + limit = p + size; + + PFR_CHECK(13); + + log_font->matrix[0] = PFR_NEXT_LONG( p ); + log_font->matrix[1] = PFR_NEXT_LONG( p ); + log_font->matrix[2] = PFR_NEXT_LONG( p ); + log_font->matrix[3] = PFR_NEXT_LONG( p ); + + flags = PFR_NEXT_BYTE( p ); + + local = 0; + if ( flags & PFR_LOG_STROKE ) + { + local++; + if ( flags & PFR_LOG_2BYTE_STROKE ) + local++; + + if ( (flags & PFR_LINE_JOIN_MASK) == PFR_LINE_JOIN_MITER ) + local += 3; + } + if ( flags & PFR_LOG_BOLD ) + { + local++; + if ( flags & PFR_LOG_2BYTE_BOLD ) + local++; + } + + PFR_CHECK( local ); + + if ( flags & PFR_LOG_STROKE ) + { + log_font->stroke_thickness = ( flags & PFR_LOG_2BYTE_STROKE ) + ? PFR_NEXT_SHORT( p ) + : PFR_NEXT_BYTE( p ); + + if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER ) + log_font->miter_limit = PFR_NEXT_LONG( p ); + } + + if ( flags & PFR_LOG_BOLD ) + { + log_font->bold_thickness = ( flags & PFR_LOG_2BYTE_BOLD ) + ? PFR_NEXT_SHORT( p ) + : PFR_NEXT_BYTE( p ); + } + + if ( flags & PFR_LOG_EXTRA_ITEMS ) + { + error = pfr_extra_items_skip( &p, limit ); + if (error) goto Fail; + } + + PFR_CHECK(5); + log_font->phys_size = PFR_NEXT_USHORT( p ); + log_font->phys_offset = PFR_NEXT_ULONG( p ); + if ( size_increment ) + { + PFR_CHECK( 1 ); + log_font->phys_size += (FT_UInt32)PFR_NEXT_BYTE( p ) << 16; + } + } + + Fail: + FT_FRAME_EXIT(); + + Exit: + return error; + + Too_Short: + FT_ERROR(( "pfr_log_font_load: invalid logical font table\n" )); + error = PFR_Err_Invalid_Table; + goto Fail; + } + + + /***********************************************************************/ + /***********************************************************************/ + /***** *****/ + /***** PFR PHYSICAL FONTS *****/ + /***** *****/ + /***********************************************************************/ + /***********************************************************************/ + + + /* load bitmap strikes lists */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_bitmap_info( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + FT_Memory memory = phy_font->memory; + PFR_Strike strike; + FT_UInt flags0; + FT_UInt n, count, size1; + FT_Error error = 0; + + + PFR_CHECK( 5 ); + + p += 3; /* skip bctSize */ + flags0 = PFR_NEXT_BYTE( p ); + count = PFR_NEXT_BYTE( p ); + + /* re-allocate when needed */ + if ( phy_font->num_strikes + count > phy_font->max_strikes ) + { + FT_UInt new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 ); + + + if ( FT_RENEW_ARRAY( phy_font->strikes, + phy_font->num_strikes, + new_max ) ) + goto Exit; + + phy_font->max_strikes = new_max; + } + + size1 = 1 + 1 + 1 + 2 + 2 + 1; + if ( flags0 & PFR_STRIKE_2BYTE_XPPM ) + size1++; + + if ( flags0 & PFR_STRIKE_2BYTE_YPPM ) + size1++; + + if ( flags0 & PFR_STRIKE_3BYTE_SIZE ) + size1++; + + if ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) + size1++; + + if ( flags0 & PFR_STRIKE_2BYTE_COUNT ) + size1++; + + strike = phy_font->strikes + phy_font->num_strikes; + + PFR_CHECK( count * size1 ); + + for ( n = 0; n < count; n++, strike++ ) + { + strike->x_ppm = ( flags0 & PFR_STRIKE_2BYTE_XPPM ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + strike->y_ppm = ( flags0 & PFR_STRIKE_2BYTE_YPPM ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + strike->flags = PFR_NEXT_BYTE( p ); + + strike->bct_size = ( flags0 & PFR_STRIKE_3BYTE_SIZE ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + + strike->bct_offset = ( flags0 & PFR_STRIKE_3BYTE_OFFSET ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + + strike->num_bitmaps = ( flags0 & PFR_STRIKE_2BYTE_COUNT ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + } + + phy_font->num_strikes += count; + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_extra_item_load_bitmap_info:" + " invalid bitmap info table\n" )); + goto Exit; + } + + + /* Load font ID. This is a so-called "unique" name that is rather + * long and descriptive (like "Tiresias ScreenFont v7.51"). + * + * Note that a PFR font's family name is contained in an *undocumented* + * string of the "auxiliary data" portion of a physical font record. This + * may also contain the "real" style name! + * + * If no family name is present, the font ID is used instead for the + * family. + */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_font_id( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + FT_Error error = 0; + FT_Memory memory = phy_font->memory; + FT_PtrDist len = limit - p; + + + if ( phy_font->font_id != NULL ) + goto Exit; + + if ( FT_ALLOC( phy_font->font_id, len + 1 ) ) + goto Exit; + + /* copy font ID name, and terminate it for safety */ + FT_MEM_COPY( phy_font->font_id, p, len ); + phy_font->font_id[len] = 0; + + Exit: + return error; + } + + + /* load stem snap tables */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_stem_snaps( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + FT_UInt count, num_vert, num_horz; + FT_Int* snaps; + FT_Error error = 0; + FT_Memory memory = phy_font->memory; + + + if ( phy_font->vertical.stem_snaps != NULL ) + goto Exit; + + PFR_CHECK( 1 ); + count = PFR_NEXT_BYTE( p ); + + num_vert = count & 15; + num_horz = count >> 4; + count = num_vert + num_horz; + + PFR_CHECK( count * 2 ); + + if ( FT_NEW_ARRAY( snaps, count ) ) + goto Exit; + + phy_font->vertical.stem_snaps = snaps; + phy_font->horizontal.stem_snaps = snaps + num_vert; + + for ( ; count > 0; count--, snaps++ ) + *snaps = FT_NEXT_SHORT( p ); + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_exta_item_load_stem_snaps:" + " invalid stem snaps table\n" )); + goto Exit; + } + + + + /* load kerning pair data */ + FT_CALLBACK_DEF( FT_Error ) + pfr_extra_item_load_kerning_pairs( FT_Byte* p, + FT_Byte* limit, + PFR_PhyFont phy_font ) + { + PFR_KernItem item; + FT_Error error = 0; + FT_Memory memory = phy_font->memory; + + + FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" )); + + if ( FT_NEW( item ) ) + goto Exit; + + PFR_CHECK( 4 ); + + item->pair_count = PFR_NEXT_BYTE( p ); + item->base_adj = PFR_NEXT_SHORT( p ); + item->flags = PFR_NEXT_BYTE( p ); + item->offset = phy_font->offset + ( p - phy_font->cursor ); + +#ifndef PFR_CONFIG_NO_CHECKS + item->pair_size = 3; + + if ( item->flags & PFR_KERN_2BYTE_CHAR ) + item->pair_size += 2; + + if ( item->flags & PFR_KERN_2BYTE_ADJ ) + item->pair_size += 1; + + PFR_CHECK( item->pair_count * item->pair_size ); +#endif + + /* load first and last pairs into the item to speed up */ + /* lookup later... */ + if ( item->pair_count > 0 ) + { + FT_UInt char1, char2; + FT_Byte* q; + + + if ( item->flags & PFR_KERN_2BYTE_CHAR ) + { + q = p; + char1 = PFR_NEXT_USHORT( q ); + char2 = PFR_NEXT_USHORT( q ); + + item->pair1 = PFR_KERN_INDEX( char1, char2 ); + + q = p + item->pair_size * ( item->pair_count - 1 ); + char1 = PFR_NEXT_USHORT( q ); + char2 = PFR_NEXT_USHORT( q ); + + item->pair2 = PFR_KERN_INDEX( char1, char2 ); + } + else + { + q = p; + char1 = PFR_NEXT_BYTE( q ); + char2 = PFR_NEXT_BYTE( q ); + + item->pair1 = PFR_KERN_INDEX( char1, char2 ); + + q = p + item->pair_size * ( item->pair_count - 1 ); + char1 = PFR_NEXT_BYTE( q ); + char2 = PFR_NEXT_BYTE( q ); + + item->pair2 = PFR_KERN_INDEX( char1, char2 ); + } + + /* add new item to the current list */ + item->next = NULL; + *phy_font->kern_items_tail = item; + phy_font->kern_items_tail = &item->next; + phy_font->num_kern_pairs += item->pair_count; + } + else + { + /* empty item! */ + FT_FREE( item ); + } + + Exit: + return error; + + Too_Short: + FT_FREE( item ); + + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_extra_item_load_kerning_pairs:" + " invalid kerning pairs table\n" )); + goto Exit; + } + + + + static const PFR_ExtraItemRec pfr_phy_font_extra_items[] = + { + { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info }, + { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id }, + { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps }, + { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs }, + { 0, NULL } + }; + + + /* Loads a name from the auxiliary data. Since this extracts undocumented + * strings from the font file, we need to be careful here. + */ + static FT_Error + pfr_aux_name_load( FT_Byte* p, + FT_UInt len, + FT_Memory memory, + FT_String* *astring ) + { + FT_Error error = 0; + FT_String* result = NULL; + FT_UInt n, ok; + + + if ( len > 0 && p[len - 1] == 0 ) + len--; + + /* check that each character is ASCII for making sure not to + load garbage + */ + ok = ( len > 0 ); + for ( n = 0; n < len; n++ ) + if ( p[n] < 32 || p[n] > 127 ) + { + ok = 0; + break; + } + + if ( ok ) + { + if ( FT_ALLOC( result, len + 1 ) ) + goto Exit; + + FT_MEM_COPY( result, p, len ); + result[len] = 0; + } + Exit: + *astring = result; + return error; + } + + + FT_LOCAL_DEF( void ) + pfr_phy_font_done( PFR_PhyFont phy_font, + FT_Memory memory ) + { + FT_FREE( phy_font->font_id ); + FT_FREE( phy_font->family_name ); + FT_FREE( phy_font->style_name ); + + FT_FREE( phy_font->vertical.stem_snaps ); + phy_font->vertical.num_stem_snaps = 0; + + phy_font->horizontal.stem_snaps = NULL; + phy_font->horizontal.num_stem_snaps = 0; + + FT_FREE( phy_font->strikes ); + phy_font->num_strikes = 0; + phy_font->max_strikes = 0; + + FT_FREE( phy_font->chars ); + phy_font->num_chars = 0; + phy_font->chars_offset = 0; + + FT_FREE( phy_font->blue_values ); + phy_font->num_blue_values = 0; + + { + PFR_KernItem item, next; + + + item = phy_font->kern_items; + while ( item ) + { + next = item->next; + FT_FREE( item ); + item = next; + } + phy_font->kern_items = NULL; + phy_font->kern_items_tail = NULL; + } + + phy_font->num_kern_pairs = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_phy_font_load( PFR_PhyFont phy_font, + FT_Stream stream, + FT_UInt32 offset, + FT_UInt32 size ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt flags; + FT_ULong num_aux; + FT_Byte* p; + FT_Byte* limit; + + + phy_font->memory = memory; + phy_font->offset = offset; + + phy_font->kern_items = NULL; + phy_font->kern_items_tail = &phy_font->kern_items; + + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) ) + goto Exit; + + phy_font->cursor = stream->cursor; + + p = stream->cursor; + limit = p + size; + + PFR_CHECK( 15 ); + phy_font->font_ref_number = PFR_NEXT_USHORT( p ); + phy_font->outline_resolution = PFR_NEXT_USHORT( p ); + phy_font->metrics_resolution = PFR_NEXT_USHORT( p ); + phy_font->bbox.xMin = PFR_NEXT_SHORT( p ); + phy_font->bbox.yMin = PFR_NEXT_SHORT( p ); + phy_font->bbox.xMax = PFR_NEXT_SHORT( p ); + phy_font->bbox.yMax = PFR_NEXT_SHORT( p ); + phy_font->flags = flags = PFR_NEXT_BYTE( p ); + + /* get the standard advance for non-proportional fonts */ + if ( !(flags & PFR_PHY_PROPORTIONAL) ) + { + PFR_CHECK( 2 ); + phy_font->standard_advance = PFR_NEXT_SHORT( p ); + } + + /* load the extra items when present */ + if ( flags & PFR_PHY_EXTRA_ITEMS ) + { + error = pfr_extra_items_parse( &p, limit, + pfr_phy_font_extra_items, phy_font ); + + if ( error ) + goto Fail; + } + + /* In certain fonts, the auxiliary bytes contain interesting */ + /* information. These are not in the specification but can be */ + /* guessed by looking at the content of a few PFR0 fonts. */ + PFR_CHECK( 3 ); + num_aux = PFR_NEXT_ULONG( p ); + + if ( num_aux > 0 ) + { + FT_Byte* q = p; + FT_Byte* q2; + + + PFR_CHECK( num_aux ); + p += num_aux; + + while ( num_aux > 0 ) + { + FT_UInt length, type; + + + if ( q + 4 > p ) + break; + + length = PFR_NEXT_USHORT( q ); + if ( length < 4 || length > num_aux ) + break; + + q2 = q + length - 2; + type = PFR_NEXT_USHORT( q ); + + switch ( type ) + { + case 1: + /* this seems to correspond to the font's family name, + * padded to 16-bits with one zero when necessary + */ + error = pfr_aux_name_load( q, length - 4U, memory, + &phy_font->family_name ); + if ( error ) + goto Exit; + break; + + case 2: + if ( q + 32 > q2 ) + break; + + q += 10; + phy_font->ascent = PFR_NEXT_SHORT( q ); + phy_font->descent = PFR_NEXT_SHORT( q ); + phy_font->leading = PFR_NEXT_SHORT( q ); + q += 16; + break; + + case 3: + /* this seems to correspond to the font's style name, + * padded to 16-bits with one zero when necessary + */ + error = pfr_aux_name_load( q, length - 4U, memory, + &phy_font->style_name ); + if ( error ) + goto Exit; + break; + + default: + ; + } + + q = q2; + num_aux -= length; + } + } + + /* read the blue values */ + { + FT_UInt n, count; + + + PFR_CHECK( 1 ); + phy_font->num_blue_values = count = PFR_NEXT_BYTE( p ); + + PFR_CHECK( count * 2 ); + + if ( FT_NEW_ARRAY( phy_font->blue_values, count ) ) + goto Fail; + + for ( n = 0; n < count; n++ ) + phy_font->blue_values[n] = PFR_NEXT_SHORT( p ); + } + + PFR_CHECK( 8 ); + phy_font->blue_fuzz = PFR_NEXT_BYTE( p ); + phy_font->blue_scale = PFR_NEXT_BYTE( p ); + + phy_font->vertical.standard = PFR_NEXT_USHORT( p ); + phy_font->horizontal.standard = PFR_NEXT_USHORT( p ); + + /* read the character descriptors */ + { + FT_UInt n, count, Size; + + + phy_font->num_chars = count = PFR_NEXT_USHORT( p ); + phy_font->chars_offset = offset + ( p - stream->cursor ); + + if ( FT_NEW_ARRAY( phy_font->chars, count ) ) + goto Fail; + + Size = 1 + 1 + 2; + if ( flags & PFR_PHY_2BYTE_CHARCODE ) + Size += 1; + + if ( flags & PFR_PHY_PROPORTIONAL ) + Size += 2; + + if ( flags & PFR_PHY_ASCII_CODE ) + Size += 1; + + if ( flags & PFR_PHY_2BYTE_GPS_SIZE ) + Size += 1; + + if ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) + Size += 1; + + PFR_CHECK( count * Size ); + + for ( n = 0; n < count; n++ ) + { + PFR_Char cur = &phy_font->chars[n]; + + + cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + cur->advance = ( flags & PFR_PHY_PROPORTIONAL ) + ? PFR_NEXT_SHORT( p ) + : (FT_Int) phy_font->standard_advance; + +#if 0 + cur->ascii = ( flags & PFR_PHY_ASCII_CODE ) + ? PFR_NEXT_BYTE( p ) + : 0; +#else + if ( flags & PFR_PHY_ASCII_CODE ) + p += 1; +#endif + cur->gps_size = ( flags & PFR_PHY_2BYTE_GPS_SIZE ) + ? PFR_NEXT_USHORT( p ) + : PFR_NEXT_BYTE( p ); + + cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET ) + ? PFR_NEXT_ULONG( p ) + : PFR_NEXT_USHORT( p ); + } + } + + /* that's it! */ + + Fail: + FT_FRAME_EXIT(); + + /* save position of bitmap info */ + phy_font->bct_offset = FT_STREAM_POS(); + phy_font->cursor = NULL; + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_phy_font_load: invalid physical font table\n" )); + goto Fail; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrload.h b/alienblaster/project/jni/freetype/src/pfr/pfrload.h new file mode 100644 index 000000000..ed010715d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrload.h @@ -0,0 +1,118 @@ +/***************************************************************************/ +/* */ +/* pfrload.h */ +/* */ +/* FreeType PFR loader (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRLOAD_H__ +#define __PFRLOAD_H__ + +#include "pfrobjs.h" +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + +#ifdef PFR_CONFIG_NO_CHECKS +#define PFR_CHECK( x ) do { } while ( 0 ) +#else +#define PFR_CHECK( x ) do \ + { \ + if ( p + (x) > limit ) \ + goto Too_Short; \ + } while ( 0 ) +#endif + +#define PFR_NEXT_BYTE( p ) FT_NEXT_BYTE( p ) +#define PFR_NEXT_INT8( p ) FT_NEXT_CHAR( p ) +#define PFR_NEXT_SHORT( p ) FT_NEXT_SHORT( p ) +#define PFR_NEXT_USHORT( p ) FT_NEXT_USHORT( p ) +#define PFR_NEXT_LONG( p ) FT_NEXT_OFF3( p ) +#define PFR_NEXT_ULONG( p ) FT_NEXT_UOFF3( p ) + + + /* handling extra items */ + + typedef FT_Error + (*PFR_ExtraItem_ParseFunc)( FT_Byte* p, + FT_Byte* limit, + FT_Pointer data ); + + typedef struct PFR_ExtraItemRec_ + { + FT_UInt type; + PFR_ExtraItem_ParseFunc parser; + + } PFR_ExtraItemRec; + + typedef const struct PFR_ExtraItemRec_* PFR_ExtraItem; + + + FT_LOCAL( FT_Error ) + pfr_extra_items_skip( FT_Byte* *pp, + FT_Byte* limit ); + + FT_LOCAL( FT_Error ) + pfr_extra_items_parse( FT_Byte* *pp, + FT_Byte* limit, + PFR_ExtraItem item_list, + FT_Pointer item_data ); + + + /* load a PFR header */ + FT_LOCAL( FT_Error ) + pfr_header_load( PFR_Header header, + FT_Stream stream ); + + /* check a PFR header */ + FT_LOCAL( FT_Bool ) + pfr_header_check( PFR_Header header ); + + + /* return number of logical fonts in this file */ + FT_LOCAL( FT_Error ) + pfr_log_font_count( FT_Stream stream, + FT_UInt32 log_section_offset, + FT_UInt *acount ); + + /* load a pfr logical font entry */ + FT_LOCAL( FT_Error ) + pfr_log_font_load( PFR_LogFont log_font, + FT_Stream stream, + FT_UInt face_index, + FT_UInt32 section_offset, + FT_Bool size_increment ); + + + /* load a physical font entry */ + FT_LOCAL( FT_Error ) + pfr_phy_font_load( PFR_PhyFont phy_font, + FT_Stream stream, + FT_UInt32 offset, + FT_UInt32 size ); + + /* finalize a physical font */ + FT_LOCAL( void ) + pfr_phy_font_done( PFR_PhyFont phy_font, + FT_Memory memory ); + + /* */ + +FT_END_HEADER + +#endif /* __PFRLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrobjs.c b/alienblaster/project/jni/freetype/src/pfr/pfrobjs.c new file mode 100644 index 000000000..56d617d88 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrobjs.c @@ -0,0 +1,581 @@ +/***************************************************************************/ +/* */ +/* pfrobjs.c */ +/* */ +/* FreeType PFR object methods (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrobjs.h" +#include "pfrload.h" +#include "pfrgload.h" +#include "pfrcmap.h" +#include "pfrsbit.h" +#include FT_OUTLINE_H +#include FT_INTERNAL_DEBUG_H + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FACE OBJECT METHODS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + pfr_face_done( FT_Face pfrface ) /* PFR_Face */ + { + PFR_Face face = (PFR_Face)pfrface; + FT_Memory memory; + + + if ( !face ) + return; + + memory = pfrface->driver->root.memory; + + /* we don't want dangling pointers */ + pfrface->family_name = NULL; + pfrface->style_name = NULL; + + /* finalize the physical font record */ + pfr_phy_font_done( &face->phy_font, FT_FACE_MEMORY( face ) ); + + /* no need to finalize the logical font or the header */ + FT_FREE( pfrface->available_sizes ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_face_init( FT_Stream stream, + FT_Face pfrface, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + PFR_Face face = (PFR_Face)pfrface; + FT_Error error; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + /* load the header and check it */ + error = pfr_header_load( &face->header, stream ); + if ( error ) + goto Exit; + + if ( !pfr_header_check( &face->header ) ) + { + FT_TRACE4(( "pfr_face_init: not a valid PFR font\n" )); + error = PFR_Err_Unknown_File_Format; + goto Exit; + } + + /* check face index */ + { + FT_UInt num_faces; + + + error = pfr_log_font_count( stream, + face->header.log_dir_offset, + &num_faces ); + if ( error ) + goto Exit; + + pfrface->num_faces = num_faces; + } + + if ( face_index < 0 ) + goto Exit; + + if ( face_index >= pfrface->num_faces ) + { + FT_ERROR(( "pfr_face_init: invalid face index\n" )); + error = PFR_Err_Invalid_Argument; + goto Exit; + } + + /* load the face */ + error = pfr_log_font_load( + &face->log_font, stream, face_index, + face->header.log_dir_offset, + FT_BOOL( face->header.phy_font_max_size_high != 0 ) ); + if ( error ) + goto Exit; + + /* now load the physical font descriptor */ + error = pfr_phy_font_load( &face->phy_font, stream, + face->log_font.phys_offset, + face->log_font.phys_size ); + if ( error ) + goto Exit; + + /* now set up all root face fields */ + { + PFR_PhyFont phy_font = &face->phy_font; + + + pfrface->face_index = face_index; + pfrface->num_glyphs = phy_font->num_chars + 1; + pfrface->face_flags = FT_FACE_FLAG_SCALABLE; + + /* if all characters point to the same gps_offset 0, we */ + /* assume that the font only contains bitmaps */ + { + FT_UInt nn; + + + for ( nn = 0; nn < phy_font->num_chars; nn++ ) + if ( phy_font->chars[nn].gps_offset != 0 ) + break; + + if ( nn == phy_font->num_chars ) + pfrface->face_flags = 0; /* not scalable */ + } + + if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 ) + pfrface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( phy_font->flags & PFR_PHY_VERTICAL ) + pfrface->face_flags |= FT_FACE_FLAG_VERTICAL; + else + pfrface->face_flags |= FT_FACE_FLAG_HORIZONTAL; + + if ( phy_font->num_strikes > 0 ) + pfrface->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + + if ( phy_font->num_kern_pairs > 0 ) + pfrface->face_flags |= FT_FACE_FLAG_KERNING; + + /* If no family name was found in the "undocumented" auxiliary + * data, use the font ID instead. This sucks but is better than + * nothing. + */ + pfrface->family_name = phy_font->family_name; + if ( pfrface->family_name == NULL ) + pfrface->family_name = phy_font->font_id; + + /* note that the style name can be NULL in certain PFR fonts, + * probably meaning "Regular" + */ + pfrface->style_name = phy_font->style_name; + + pfrface->num_fixed_sizes = 0; + pfrface->available_sizes = 0; + + pfrface->bbox = phy_font->bbox; + pfrface->units_per_EM = (FT_UShort)phy_font->outline_resolution; + pfrface->ascender = (FT_Short) phy_font->bbox.yMax; + pfrface->descender = (FT_Short) phy_font->bbox.yMin; + + pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 ); + if ( pfrface->height < pfrface->ascender - pfrface->descender ) + pfrface->height = (FT_Short)(pfrface->ascender - pfrface->descender); + + if ( phy_font->num_strikes > 0 ) + { + FT_UInt n, count = phy_font->num_strikes; + FT_Bitmap_Size* size; + PFR_Strike strike; + FT_Memory memory = pfrface->stream->memory; + + + if ( FT_NEW_ARRAY( pfrface->available_sizes, count ) ) + goto Exit; + + size = pfrface->available_sizes; + strike = phy_font->strikes; + for ( n = 0; n < count; n++, size++, strike++ ) + { + size->height = (FT_UShort)strike->y_ppm; + size->width = (FT_UShort)strike->x_ppm; + size->size = strike->y_ppm << 6; + size->x_ppem = strike->x_ppm << 6; + size->y_ppem = strike->y_ppm << 6; + } + pfrface->num_fixed_sizes = count; + } + + /* now compute maximum advance width */ + if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 ) + pfrface->max_advance_width = (FT_Short)phy_font->standard_advance; + else + { + FT_Int max = 0; + FT_UInt count = phy_font->num_chars; + PFR_Char gchar = phy_font->chars; + + + for ( ; count > 0; count--, gchar++ ) + { + if ( max < gchar->advance ) + max = gchar->advance; + } + + pfrface->max_advance_width = (FT_Short)max; + } + + pfrface->max_advance_height = pfrface->height; + + pfrface->underline_position = (FT_Short)( -pfrface->units_per_EM / 10 ); + pfrface->underline_thickness = (FT_Short)( pfrface->units_per_EM / 30 ); + + /* create charmap */ + { + FT_CharMapRec charmap; + + + charmap.face = pfrface; + charmap.platform_id = 3; + charmap.encoding_id = 1; + charmap.encoding = FT_ENCODING_UNICODE; + + FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if ( pfrface->num_charmaps ) + pfrface->charmap = pfrface->charmaps[0]; +#endif + } + + /* check whether we've loaded any kerning pairs */ + if ( phy_font->num_kern_pairs ) + pfrface->face_flags |= FT_FACE_FLAG_KERNING; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SLOT OBJECT METHOD *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + pfr_slot_init( FT_GlyphSlot pfrslot ) /* PFR_Slot */ + { + PFR_Slot slot = (PFR_Slot)pfrslot; + FT_GlyphLoader loader = pfrslot->internal->loader; + + + pfr_glyph_init( &slot->glyph, loader ); + + return 0; + } + + + FT_LOCAL_DEF( void ) + pfr_slot_done( FT_GlyphSlot pfrslot ) /* PFR_Slot */ + { + PFR_Slot slot = (PFR_Slot)pfrslot; + + + pfr_glyph_done( &slot->glyph ); + } + + + FT_LOCAL_DEF( FT_Error ) + pfr_slot_load( FT_GlyphSlot pfrslot, /* PFR_Slot */ + FT_Size pfrsize, /* PFR_Size */ + FT_UInt gindex, + FT_Int32 load_flags ) + { + PFR_Slot slot = (PFR_Slot)pfrslot; + PFR_Size size = (PFR_Size)pfrsize; + FT_Error error; + PFR_Face face = (PFR_Face)pfrslot->face; + PFR_Char gchar; + FT_Outline* outline = &pfrslot->outline; + FT_ULong gps_offset; + + + if ( gindex > 0 ) + gindex--; + + if ( !face || gindex >= face->phy_font.num_chars ) + { + error = PFR_Err_Invalid_Argument; + goto Exit; + } + + /* try to load an embedded bitmap */ + if ( ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) == 0 ) + { + error = pfr_slot_load_bitmap( slot, size, gindex ); + if ( error == 0 ) + goto Exit; + } + + if ( load_flags & FT_LOAD_SBITS_ONLY ) + { + error = PFR_Err_Invalid_Argument; + goto Exit; + } + + gchar = face->phy_font.chars + gindex; + pfrslot->format = FT_GLYPH_FORMAT_OUTLINE; + outline->n_points = 0; + outline->n_contours = 0; + gps_offset = face->header.gps_section_offset; + + /* load the glyph outline (FT_LOAD_NO_RECURSE isn't supported) */ + error = pfr_glyph_load( &slot->glyph, face->root.stream, + gps_offset, gchar->gps_offset, gchar->gps_size ); + + if ( !error ) + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &pfrslot->metrics; + FT_Pos advance; + FT_Int em_metrics, em_outline; + FT_Bool scaling; + + + scaling = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ); + + /* copy outline data */ + *outline = slot->glyph.loader->base.outline; + + outline->flags &= ~FT_OUTLINE_OWNER; + outline->flags |= FT_OUTLINE_REVERSE_FILL; + + if ( size && pfrsize->metrics.y_ppem < 24 ) + outline->flags |= FT_OUTLINE_HIGH_PRECISION; + + /* compute the advance vector */ + metrics->horiAdvance = 0; + metrics->vertAdvance = 0; + + advance = gchar->advance; + em_metrics = face->phy_font.metrics_resolution; + em_outline = face->phy_font.outline_resolution; + + if ( em_metrics != em_outline ) + advance = FT_MulDiv( advance, em_outline, em_metrics ); + + if ( face->phy_font.flags & PFR_PHY_VERTICAL ) + metrics->vertAdvance = advance; + else + metrics->horiAdvance = advance; + + pfrslot->linearHoriAdvance = metrics->horiAdvance; + pfrslot->linearVertAdvance = metrics->vertAdvance; + + /* make-up vertical metrics(?) */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + +#if 0 /* some fonts seem to be broken here! */ + + /* Apply the font matrix, if any. */ + /* TODO: Test existing fonts with unusual matrix */ + /* whether we have to adjust Units per EM. */ + { + FT_Matrix font_matrix; + + + font_matrix.xx = face->log_font.matrix[0] << 8; + font_matrix.yx = face->log_font.matrix[1] << 8; + font_matrix.xy = face->log_font.matrix[2] << 8; + font_matrix.yy = face->log_font.matrix[3] << 8; + + FT_Outline_Transform( outline, &font_matrix ); + } +#endif + + /* scale when needed */ + if ( scaling ) + { + FT_Int n; + FT_Fixed x_scale = pfrsize->metrics.x_scale; + FT_Fixed y_scale = pfrsize->metrics.y_scale; + FT_Vector* vec = outline->points; + + + /* scale outline points */ + for ( n = 0; n < outline->n_points; n++, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* scale the advance */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the rest of the metrics */ + FT_Outline_Get_CBox( outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax - metrics->height; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** KERNING METHOD *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( FT_Error ) + pfr_face_get_kerning( FT_Face pfrface, /* PFR_Face */ + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + PFR_Face face = (PFR_Face)pfrface; + FT_Error error = PFR_Err_Ok; + PFR_PhyFont phy_font = &face->phy_font; + FT_UInt32 code1, code2, pair; + + + kerning->x = 0; + kerning->y = 0; + + if ( glyph1 > 0 ) + glyph1--; + + if ( glyph2 > 0 ) + glyph2--; + + /* convert glyph indices to character codes */ + if ( glyph1 > phy_font->num_chars || + glyph2 > phy_font->num_chars ) + goto Exit; + + code1 = phy_font->chars[glyph1].char_code; + code2 = phy_font->chars[glyph2].char_code; + pair = PFR_KERN_INDEX( code1, code2 ); + + /* now search the list of kerning items */ + { + PFR_KernItem item = phy_font->kern_items; + FT_Stream stream = pfrface->stream; + + + for ( ; item; item = item->next ) + { + if ( pair >= item->pair1 && pair <= item->pair2 ) + goto FoundPair; + } + goto Exit; + + FoundPair: /* we found an item, now parse it and find the value if any */ + if ( FT_STREAM_SEEK( item->offset ) || + FT_FRAME_ENTER( item->pair_count * item->pair_size ) ) + goto Exit; + + { + FT_UInt count = item->pair_count; + FT_UInt size = item->pair_size; + FT_UInt power = (FT_UInt)ft_highpow2( (FT_UInt32)count ); + FT_UInt probe = power * size; + FT_UInt extra = count - power; + FT_Byte* base = stream->cursor; + FT_Bool twobytes = FT_BOOL( item->flags & 1 ); + FT_Bool twobyte_adj = FT_BOOL( item->flags & 2 ); + FT_Byte* p; + FT_UInt32 cpair; + + + if ( extra > 0 ) + { + p = base + extra * size; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + goto Found; + + if ( cpair < pair ) + { + if ( twobyte_adj ) + p += 2; + else + p++; + base = p; + } + } + + while ( probe > size ) + { + probe >>= 1; + p = base + probe; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + goto Found; + + if ( cpair < pair ) + base += probe; + } + + p = base; + + if ( twobytes ) + cpair = FT_NEXT_ULONG( p ); + else + cpair = PFR_NEXT_KPAIR( p ); + + if ( cpair == pair ) + { + FT_Int value; + + + Found: + if ( twobyte_adj ) + value = FT_PEEK_SHORT( p ); + else + value = p[0]; + + kerning->x = item->base_adj + value; + } + } + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrobjs.h b/alienblaster/project/jni/freetype/src/pfr/pfrobjs.h new file mode 100644 index 000000000..f6aa8b44c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrobjs.h @@ -0,0 +1,96 @@ +/***************************************************************************/ +/* */ +/* pfrobjs.h */ +/* */ +/* FreeType PFR object methods (specification). */ +/* */ +/* Copyright 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFROBJS_H__ +#define __PFROBJS_H__ + +#include "pfrtypes.h" + + +FT_BEGIN_HEADER + + typedef struct PFR_FaceRec_* PFR_Face; + + typedef struct PFR_SizeRec_* PFR_Size; + + typedef struct PFR_SlotRec_* PFR_Slot; + + + typedef struct PFR_FaceRec_ + { + FT_FaceRec root; + PFR_HeaderRec header; + PFR_LogFontRec log_font; + PFR_PhyFontRec phy_font; + + } PFR_FaceRec; + + + typedef struct PFR_SizeRec_ + { + FT_SizeRec root; + + } PFR_SizeRec; + + + typedef struct PFR_SlotRec_ + { + FT_GlyphSlotRec root; + PFR_GlyphRec glyph; + + } PFR_SlotRec; + + + FT_LOCAL( FT_Error ) + pfr_face_init( FT_Stream stream, + FT_Face face, /* PFR_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + pfr_face_done( FT_Face face ); /* PFR_Face */ + + + FT_LOCAL( FT_Error ) + pfr_face_get_kerning( FT_Face face, /* PFR_Face */ + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + + FT_LOCAL( FT_Error ) + pfr_slot_init( FT_GlyphSlot slot ); /* PFR_Slot */ + + FT_LOCAL( void ) + pfr_slot_done( FT_GlyphSlot slot ); /* PFR_Slot */ + + + FT_LOCAL( FT_Error ) + pfr_slot_load( FT_GlyphSlot slot, /* PFR_Slot */ + FT_Size size, /* PFR_Size */ + FT_UInt gindex, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __PFROBJS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrsbit.c b/alienblaster/project/jni/freetype/src/pfr/pfrsbit.c new file mode 100644 index 000000000..d2f17dc9c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrsbit.c @@ -0,0 +1,698 @@ +/***************************************************************************/ +/* */ +/* pfrsbit.c */ +/* */ +/* FreeType PFR bitmap loader (body). */ +/* */ +/* Copyright 2002, 2003, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "pfrsbit.h" +#include "pfrload.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include "pfrerror.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pfr + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PFR BIT WRITER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PFR_BitWriter_ + { + FT_Byte* line; /* current line start */ + FT_Int pitch; /* line size in bytes */ + FT_Int width; /* width in pixels/bits */ + FT_Int rows; /* number of remaining rows to scan */ + FT_Int total; /* total number of bits to draw */ + + } PFR_BitWriterRec, *PFR_BitWriter; + + + static void + pfr_bitwriter_init( PFR_BitWriter writer, + FT_Bitmap* target, + FT_Bool decreasing ) + { + writer->line = target->buffer; + writer->pitch = target->pitch; + writer->width = target->width; + writer->rows = target->rows; + writer->total = writer->width * writer->rows; + + if ( !decreasing ) + { + writer->line += writer->pitch * ( target->rows-1 ); + writer->pitch = -writer->pitch; + } + } + + + static void + pfr_bitwriter_decode_bytes( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Int n, reload; + FT_Int left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt val = 0; + FT_UInt c = 0; + + + n = (FT_Int)( limit - p ) * 8; + if ( n > writer->total ) + n = writer->total; + + reload = n & 7; + + for ( ; n > 0; n-- ) + { + if ( ( n & 7 ) == reload ) + val = *p++; + + if ( val & 0x80 ) + c |= mask; + + val <<= 1; + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte)c; + left = writer->width; + mask = 0x80; + + writer->line += writer->pitch; + cur = writer->line; + c = 0; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + mask = 0x80; + c = 0; + cur ++; + } + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte)c; + } + + + static void + pfr_bitwriter_decode_rle1( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Int n, phase, count, counts[2], reload; + FT_Int left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt c = 0; + + + n = writer->total; + + phase = 1; + counts[0] = 0; + counts[1] = 0; + count = 0; + reload = 1; + + for ( ; n > 0; n-- ) + { + if ( reload ) + { + do + { + if ( phase ) + { + FT_Int v; + + + if ( p >= limit ) + break; + + v = *p++; + counts[0] = v >> 4; + counts[1] = v & 15; + phase = 0; + count = counts[0]; + } + else + { + phase = 1; + count = counts[1]; + } + + } while ( count == 0 ); + } + + if ( phase ) + c |= mask; + + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte) c; + left = writer->width; + mask = 0x80; + + writer->line += writer->pitch; + cur = writer->line; + c = 0; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + mask = 0x80; + c = 0; + cur ++; + } + + reload = ( --count <= 0 ); + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte) c; + } + + + static void + pfr_bitwriter_decode_rle2( PFR_BitWriter writer, + FT_Byte* p, + FT_Byte* limit ) + { + FT_Int n, phase, count, reload; + FT_Int left = writer->width; + FT_Byte* cur = writer->line; + FT_UInt mask = 0x80; + FT_UInt c = 0; + + + n = writer->total; + + phase = 1; + count = 0; + reload = 1; + + for ( ; n > 0; n-- ) + { + if ( reload ) + { + do + { + if ( p >= limit ) + break; + + count = *p++; + phase = phase ^ 1; + + } while ( count == 0 ); + } + + if ( phase ) + c |= mask; + + mask >>= 1; + + if ( --left <= 0 ) + { + cur[0] = (FT_Byte) c; + c = 0; + mask = 0x80; + left = writer->width; + + writer->line += writer->pitch; + cur = writer->line; + } + else if ( mask == 0 ) + { + cur[0] = (FT_Byte)c; + c = 0; + mask = 0x80; + cur ++; + } + + reload = ( --count <= 0 ); + } + + if ( mask != 0x80 ) + cur[0] = (FT_Byte) c; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BITMAP DATA DECODING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + pfr_lookup_bitmap_data( FT_Byte* base, + FT_Byte* limit, + FT_UInt count, + FT_UInt flags, + FT_UInt char_code, + FT_ULong* found_offset, + FT_ULong* found_size ) + { + FT_UInt left, right, char_len; + FT_Bool two = FT_BOOL( flags & 1 ); + FT_Byte* buff; + + + char_len = 4; + if ( two ) char_len += 1; + if ( flags & 2 ) char_len += 1; + if ( flags & 4 ) char_len += 1; + + left = 0; + right = count; + + while ( left < right ) + { + FT_UInt middle, code; + + + middle = ( left + right ) >> 1; + buff = base + middle * char_len; + + /* check that we are not outside of the table -- */ + /* this is possible with broken fonts... */ + if ( buff + char_len > limit ) + goto Fail; + + if ( two ) + code = PFR_NEXT_USHORT( buff ); + else + code = PFR_NEXT_BYTE( buff ); + + if ( code == char_code ) + goto Found_It; + + if ( code < char_code ) + left = middle; + else + right = middle; + } + + Fail: + /* Not found */ + *found_size = 0; + *found_offset = 0; + return; + + Found_It: + if ( flags & 2 ) + *found_size = PFR_NEXT_USHORT( buff ); + else + *found_size = PFR_NEXT_BYTE( buff ); + + if ( flags & 4 ) + *found_offset = PFR_NEXT_ULONG( buff ); + else + *found_offset = PFR_NEXT_USHORT( buff ); + } + + + /* load bitmap metrics. "*padvance" must be set to the default value */ + /* before calling this function... */ + /* */ + static FT_Error + pfr_load_bitmap_metrics( FT_Byte** pdata, + FT_Byte* limit, + FT_Long scaled_advance, + FT_Long *axpos, + FT_Long *aypos, + FT_UInt *axsize, + FT_UInt *aysize, + FT_Long *aadvance, + FT_UInt *aformat ) + { + FT_Error error = 0; + FT_Byte flags; + FT_Char b; + FT_Byte* p = *pdata; + FT_Long xpos, ypos, advance; + FT_UInt xsize, ysize; + + + PFR_CHECK( 1 ); + flags = PFR_NEXT_BYTE( p ); + + xpos = 0; + ypos = 0; + xsize = 0; + ysize = 0; + advance = 0; + + switch ( flags & 3 ) + { + case 0: + PFR_CHECK( 1 ); + b = PFR_NEXT_INT8( p ); + xpos = b >> 4; + ypos = ( (FT_Char)( b << 4 ) ) >> 4; + break; + + case 1: + PFR_CHECK( 2 ); + xpos = PFR_NEXT_INT8( p ); + ypos = PFR_NEXT_INT8( p ); + break; + + case 2: + PFR_CHECK( 4 ); + xpos = PFR_NEXT_SHORT( p ); + ypos = PFR_NEXT_SHORT( p ); + break; + + case 3: + PFR_CHECK( 6 ); + xpos = PFR_NEXT_LONG( p ); + ypos = PFR_NEXT_LONG( p ); + break; + + default: + ; + } + + flags >>= 2; + switch ( flags & 3 ) + { + case 0: + /* blank image */ + xsize = 0; + ysize = 0; + break; + + case 1: + PFR_CHECK( 1 ); + b = PFR_NEXT_BYTE( p ); + xsize = ( b >> 4 ) & 0xF; + ysize = b & 0xF; + break; + + case 2: + PFR_CHECK( 2 ); + xsize = PFR_NEXT_BYTE( p ); + ysize = PFR_NEXT_BYTE( p ); + break; + + case 3: + PFR_CHECK( 4 ); + xsize = PFR_NEXT_USHORT( p ); + ysize = PFR_NEXT_USHORT( p ); + break; + + default: + ; + } + + flags >>= 2; + switch ( flags & 3 ) + { + case 0: + advance = scaled_advance; + break; + + case 1: + PFR_CHECK( 1 ); + advance = PFR_NEXT_INT8( p ) << 8; + break; + + case 2: + PFR_CHECK( 2 ); + advance = PFR_NEXT_SHORT( p ); + break; + + case 3: + PFR_CHECK( 3 ); + advance = PFR_NEXT_LONG( p ); + break; + + default: + ; + } + + *axpos = xpos; + *aypos = ypos; + *axsize = xsize; + *aysize = ysize; + *aadvance = advance; + *aformat = flags >> 2; + *pdata = p; + + Exit: + return error; + + Too_Short: + error = PFR_Err_Invalid_Table; + FT_ERROR(( "pfr_load_bitmap_metrics: invalid glyph data\n" )); + goto Exit; + } + + + static FT_Error + pfr_load_bitmap_bits( FT_Byte* p, + FT_Byte* limit, + FT_UInt format, + FT_Bool decreasing, + FT_Bitmap* target ) + { + FT_Error error = 0; + PFR_BitWriterRec writer; + + + if ( target->rows > 0 && target->width > 0 ) + { + pfr_bitwriter_init( &writer, target, decreasing ); + + switch ( format ) + { + case 0: /* packed bits */ + pfr_bitwriter_decode_bytes( &writer, p, limit ); + break; + + case 1: /* RLE1 */ + pfr_bitwriter_decode_rle1( &writer, p, limit ); + break; + + case 2: /* RLE2 */ + pfr_bitwriter_decode_rle2( &writer, p, limit ); + break; + + default: + FT_ERROR(( "pfr_read_bitmap_data: invalid image type\n" )); + error = PFR_Err_Invalid_File_Format; + } + } + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BITMAP LOADING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( FT_Error ) + pfr_slot_load_bitmap( PFR_Slot glyph, + PFR_Size size, + FT_UInt glyph_index ) + { + FT_Error error; + PFR_Face face = (PFR_Face) glyph->root.face; + FT_Stream stream = face->root.stream; + PFR_PhyFont phys = &face->phy_font; + FT_ULong gps_offset; + FT_ULong gps_size; + PFR_Char character; + PFR_Strike strike; + + + character = &phys->chars[glyph_index]; + + /* Look-up a bitmap strike corresponding to the current */ + /* character dimensions */ + { + FT_UInt n; + + + strike = phys->strikes; + for ( n = 0; n < phys->num_strikes; n++ ) + { + if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem && + strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem ) + { + goto Found_Strike; + } + + strike++; + } + + /* couldn't find it */ + return PFR_Err_Invalid_Argument; + } + + Found_Strike: + + /* Now lookup the glyph's position within the file */ + { + FT_UInt char_len; + + + char_len = 4; + if ( strike->flags & 1 ) char_len += 1; + if ( strike->flags & 2 ) char_len += 1; + if ( strike->flags & 4 ) char_len += 1; + + /* Access data directly in the frame to speed lookups */ + if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) || + FT_FRAME_ENTER( char_len * strike->num_bitmaps ) ) + goto Exit; + + pfr_lookup_bitmap_data( stream->cursor, + stream->limit, + strike->num_bitmaps, + strike->flags, + character->char_code, + &gps_offset, + &gps_size ); + + FT_FRAME_EXIT(); + + if ( gps_size == 0 ) + { + /* Could not find a bitmap program string for this glyph */ + error = PFR_Err_Invalid_Argument; + goto Exit; + } + } + + /* get the bitmap metrics */ + { + FT_Long xpos = 0, ypos = 0, advance = 0; + FT_UInt xsize = 0, ysize = 0, format = 0; + FT_Byte* p; + + + /* compute linear advance */ + advance = character->advance; + if ( phys->metrics_resolution != phys->outline_resolution ) + advance = FT_MulDiv( advance, + phys->outline_resolution, + phys->metrics_resolution ); + + glyph->root.linearHoriAdvance = advance; + + /* compute default advance, i.e., scaled advance. This can be */ + /* overridden in the bitmap header of certain glyphs. */ + advance = FT_MulDiv( (FT_Fixed)size->root.metrics.x_ppem << 8, + character->advance, + phys->metrics_resolution ); + + if ( FT_STREAM_SEEK( face->header.gps_section_offset + gps_offset ) || + FT_FRAME_ENTER( gps_size ) ) + goto Exit; + + p = stream->cursor; + error = pfr_load_bitmap_metrics( &p, stream->limit, + advance, + &xpos, &ypos, + &xsize, &ysize, + &advance, &format ); + + /* + * XXX: on 16bit system, we return an error for huge bitmap + * which causes a size truncation, because truncated + * size properties makes bitmap glyph broken. + */ + if ( xpos > FT_INT_MAX || ( ypos + ysize ) > FT_INT_MAX ) + { + FT_TRACE1(( "pfr_slot_load_bitmap:" )); + FT_TRACE1(( "huge bitmap glyph %dx%d over FT_GlyphSlot\n", + xpos, ypos )); + error = PFR_Err_Invalid_Pixel_Size; + } + + if ( !error ) + { + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + /* Set up glyph bitmap and metrics */ + + /* XXX: needs casts to fit FT_Bitmap.{width|rows|pitch} */ + glyph->root.bitmap.width = (FT_Int)xsize; + glyph->root.bitmap.rows = (FT_Int)ysize; + glyph->root.bitmap.pitch = (FT_Int)( xsize + 7 ) >> 3; + glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO; + + /* XXX: needs casts to fit FT_Glyph_Metrics.{width|height} */ + glyph->root.metrics.width = (FT_Pos)xsize << 6; + glyph->root.metrics.height = (FT_Pos)ysize << 6; + glyph->root.metrics.horiBearingX = xpos << 6; + glyph->root.metrics.horiBearingY = ypos << 6; + glyph->root.metrics.horiAdvance = FT_PIX_ROUND( ( advance >> 2 ) ); + glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1; + glyph->root.metrics.vertBearingY = 0; + glyph->root.metrics.vertAdvance = size->root.metrics.height; + + /* XXX: needs casts fit FT_GlyphSlotRec.bitmap_{left|top} */ + glyph->root.bitmap_left = (FT_Int)xpos; + glyph->root.bitmap_top = (FT_Int)(ypos + ysize); + + /* Allocate and read bitmap data */ + { + FT_ULong len = glyph->root.bitmap.pitch * ysize; + + + error = ft_glyphslot_alloc_bitmap( &glyph->root, len ); + if ( !error ) + { + error = pfr_load_bitmap_bits( + p, + stream->limit, + format, + FT_BOOL(face->header.color_flags & 2), + &glyph->root.bitmap ); + } + } + } + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrsbit.h b/alienblaster/project/jni/freetype/src/pfr/pfrsbit.h new file mode 100644 index 000000000..015e9e6da --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrsbit.h @@ -0,0 +1,36 @@ +/***************************************************************************/ +/* */ +/* pfrsbit.h */ +/* */ +/* FreeType PFR bitmap loader (specification). */ +/* */ +/* Copyright 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRSBIT_H__ +#define __PFRSBIT_H__ + +#include "pfrobjs.h" + +FT_BEGIN_HEADER + + FT_LOCAL( FT_Error ) + pfr_slot_load_bitmap( PFR_Slot glyph, + PFR_Size size, + FT_UInt glyph_index ); + +FT_END_HEADER + +#endif /* __PFR_SBIT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/pfrtypes.h b/alienblaster/project/jni/freetype/src/pfr/pfrtypes.h new file mode 100644 index 000000000..918310814 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/pfrtypes.h @@ -0,0 +1,362 @@ +/***************************************************************************/ +/* */ +/* pfrtypes.h */ +/* */ +/* FreeType PFR data structures (specification only). */ +/* */ +/* Copyright 2002, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PFRTYPES_H__ +#define __PFRTYPES_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + +FT_BEGIN_HEADER + + /************************************************************************/ + + /* the PFR Header structure */ + typedef struct PFR_HeaderRec_ + { + FT_UInt32 signature; + FT_UInt version; + FT_UInt signature2; + FT_UInt header_size; + + FT_UInt log_dir_size; + FT_UInt log_dir_offset; + + FT_UInt log_font_max_size; + FT_UInt32 log_font_section_size; + FT_UInt32 log_font_section_offset; + + FT_UInt32 phy_font_max_size; + FT_UInt32 phy_font_section_size; + FT_UInt32 phy_font_section_offset; + + FT_UInt gps_max_size; + FT_UInt32 gps_section_size; + FT_UInt32 gps_section_offset; + + FT_UInt max_blue_values; + FT_UInt max_x_orus; + FT_UInt max_y_orus; + + FT_UInt phy_font_max_size_high; + FT_UInt color_flags; + + FT_UInt32 bct_max_size; + FT_UInt32 bct_set_max_size; + FT_UInt32 phy_bct_set_max_size; + + FT_UInt num_phy_fonts; + FT_UInt max_vert_stem_snap; + FT_UInt max_horz_stem_snap; + FT_UInt max_chars; + + } PFR_HeaderRec, *PFR_Header; + + + /* used in `color_flags' field of the PFR_Header */ + typedef enum PFR_HeaderFlags_ + { + PFR_FLAG_BLACK_PIXEL = 1, + PFR_FLAG_INVERT_BITMAP = 2 + + } PFR_HeaderFlags; + + + /************************************************************************/ + + typedef struct PFR_LogFontRec_ + { + FT_UInt32 size; + FT_UInt32 offset; + + FT_Int32 matrix[4]; + FT_UInt stroke_flags; + FT_Int stroke_thickness; + FT_Int bold_thickness; + FT_Int32 miter_limit; + + FT_UInt32 phys_size; + FT_UInt32 phys_offset; + + } PFR_LogFontRec, *PFR_LogFont; + + + typedef enum PFR_LogFlags_ + { + PFR_LOG_EXTRA_ITEMS = 0x40, + PFR_LOG_2BYTE_BOLD = 0x20, + PFR_LOG_BOLD = 0x10, + PFR_LOG_2BYTE_STROKE = 8, + PFR_LOG_STROKE = 4, + PFR_LINE_JOIN_MASK = 3 + + } PFR_LogFlags; + + + typedef enum PFR_LineJoinFlags_ + { + PFR_LINE_JOIN_MITER = 0, + PFR_LINE_JOIN_ROUND = 1, + PFR_LINE_JOIN_BEVEL = 2 + + } PFR_LineJoinFlags; + + + /************************************************************************/ + + typedef enum PFR_BitmapFlags_ + { + PFR_BITMAP_3BYTE_OFFSET = 4, + PFR_BITMAP_2BYTE_SIZE = 2, + PFR_BITMAP_2BYTE_CHARCODE = 1 + + } PFR_BitmapFlags; + + + typedef struct PFR_BitmapCharRec_ + { + FT_UInt char_code; + FT_UInt gps_size; + FT_UInt32 gps_offset; + + } PFR_BitmapCharRec, *PFR_BitmapChar; + + + typedef enum PFR_StrikeFlags_ + { + PFR_STRIKE_2BYTE_COUNT = 0x10, + PFR_STRIKE_3BYTE_OFFSET = 0x08, + PFR_STRIKE_3BYTE_SIZE = 0x04, + PFR_STRIKE_2BYTE_YPPM = 0x02, + PFR_STRIKE_2BYTE_XPPM = 0x01 + + } PFR_StrikeFlags; + + + typedef struct PFR_StrikeRec_ + { + FT_UInt x_ppm; + FT_UInt y_ppm; + FT_UInt flags; + + FT_UInt32 gps_size; + FT_UInt32 gps_offset; + + FT_UInt32 bct_size; + FT_UInt32 bct_offset; + + /* optional */ + FT_UInt num_bitmaps; + PFR_BitmapChar bitmaps; + + } PFR_StrikeRec, *PFR_Strike; + + + /************************************************************************/ + + typedef struct PFR_CharRec_ + { + FT_UInt char_code; + FT_Int advance; + FT_UInt gps_size; + FT_UInt32 gps_offset; + + } PFR_CharRec, *PFR_Char; + + + /************************************************************************/ + + typedef struct PFR_DimensionRec_ + { + FT_UInt standard; + FT_UInt num_stem_snaps; + FT_Int* stem_snaps; + + } PFR_DimensionRec, *PFR_Dimension; + + /************************************************************************/ + + typedef struct PFR_KernItemRec_* PFR_KernItem; + + typedef struct PFR_KernItemRec_ + { + PFR_KernItem next; + FT_Byte pair_count; + FT_Byte flags; + FT_Short base_adj; + FT_UInt pair_size; + FT_Offset offset; + FT_UInt32 pair1; + FT_UInt32 pair2; + + } PFR_KernItemRec; + + +#define PFR_KERN_INDEX( g1, g2 ) \ + ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) ) + +#define PFR_KERN_PAIR_INDEX( pair ) \ + PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 ) + +#define PFR_NEXT_KPAIR( p ) ( p += 2, \ + ( (FT_UInt32)p[-2] << 16 ) | p[-1] ) + + + /************************************************************************/ + + typedef struct PFR_PhyFontRec_ + { + FT_Memory memory; + FT_UInt32 offset; + + FT_UInt font_ref_number; + FT_UInt outline_resolution; + FT_UInt metrics_resolution; + FT_BBox bbox; + FT_UInt flags; + FT_UInt standard_advance; + + FT_Int ascent; /* optional, bbox.yMax if not present */ + FT_Int descent; /* optional, bbox.yMin if not present */ + FT_Int leading; /* optional, 0 if not present */ + + PFR_DimensionRec horizontal; + PFR_DimensionRec vertical; + + FT_String* font_id; + FT_String* family_name; + FT_String* style_name; + + FT_UInt num_strikes; + FT_UInt max_strikes; + PFR_StrikeRec* strikes; + + FT_UInt num_blue_values; + FT_Int *blue_values; + FT_UInt blue_fuzz; + FT_UInt blue_scale; + + FT_UInt num_chars; + FT_Offset chars_offset; + PFR_Char chars; + + FT_UInt num_kern_pairs; + PFR_KernItem kern_items; + PFR_KernItem* kern_items_tail; + + /* not part of the spec, but used during load */ + FT_Long bct_offset; + FT_Byte* cursor; + + } PFR_PhyFontRec, *PFR_PhyFont; + + + typedef enum PFR_PhyFlags_ + { + PFR_PHY_EXTRA_ITEMS = 0x80, + PFR_PHY_3BYTE_GPS_OFFSET = 0x20, + PFR_PHY_2BYTE_GPS_SIZE = 0x10, + PFR_PHY_ASCII_CODE = 0x08, + PFR_PHY_PROPORTIONAL = 0x04, + PFR_PHY_2BYTE_CHARCODE = 0x02, + PFR_PHY_VERTICAL = 0x01 + + } PFR_PhyFlags; + + + typedef enum PFR_KernFlags_ + { + PFR_KERN_2BYTE_CHAR = 0x01, + PFR_KERN_2BYTE_ADJ = 0x02 + + } PFR_KernFlags; + + + /************************************************************************/ + + typedef enum PFR_GlyphFlags_ + { + PFR_GLYPH_IS_COMPOUND = 0x80, + PFR_GLYPH_EXTRA_ITEMS = 0x08, + PFR_GLYPH_1BYTE_XYCOUNT = 0x04, + PFR_GLYPH_XCOUNT = 0x02, + PFR_GLYPH_YCOUNT = 0x01 + + } PFR_GlyphFlags; + + + /* controlled coordinate */ + typedef struct PFR_CoordRec_ + { + FT_UInt org; + FT_UInt cur; + + } PFR_CoordRec, *PFR_Coord; + + + typedef struct PFR_SubGlyphRec_ + { + FT_Fixed x_scale; + FT_Fixed y_scale; + FT_Int x_delta; + FT_Int y_delta; + FT_UInt32 gps_offset; + FT_UInt gps_size; + + } PFR_SubGlyphRec, *PFR_SubGlyph; + + + typedef enum PFR_SubgGlyphFlags_ + { + PFR_SUBGLYPH_3BYTE_OFFSET = 0x80, + PFR_SUBGLYPH_2BYTE_SIZE = 0x40, + PFR_SUBGLYPH_YSCALE = 0x20, + PFR_SUBGLYPH_XSCALE = 0x10 + + } PFR_SubGlyphFlags; + + + typedef struct PFR_GlyphRec_ + { + FT_Byte format; + +#if 0 + FT_UInt num_x_control; + FT_UInt num_y_control; +#endif + FT_UInt max_xy_control; + FT_Pos* x_control; + FT_Pos* y_control; + + + FT_UInt num_subs; + FT_UInt max_subs; + PFR_SubGlyphRec* subs; + + FT_GlyphLoader loader; + FT_Bool path_begun; + + } PFR_GlyphRec, *PFR_Glyph; + + +FT_END_HEADER + +#endif /* __PFRTYPES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pfr/rules.mk b/alienblaster/project/jni/freetype/src/pfr/rules.mk new file mode 100644 index 000000000..60b96c741 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pfr/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 PFR driver configuration rules +# + + +# Copyright 2002, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# pfr driver directory +# +PFR_DIR := $(SRC_DIR)/pfr + + +# compilation flags for the driver +# +PFR_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PFR_DIR)) + + +# pfr driver sources (i.e., C files) +# +PFR_DRV_SRC := $(PFR_DIR)/pfrload.c \ + $(PFR_DIR)/pfrgload.c \ + $(PFR_DIR)/pfrcmap.c \ + $(PFR_DIR)/pfrdrivr.c \ + $(PFR_DIR)/pfrsbit.c \ + $(PFR_DIR)/pfrobjs.c + +# pfr driver headers +# +PFR_DRV_H := $(PFR_DRV_SRC:%.c=%.h) \ + $(PFR_DIR)/pfrerror.h \ + $(PFR_DIR)/pfrtypes.h + + +# Pfr driver object(s) +# +# PFR_DRV_OBJ_M is used during `multi' builds +# PFR_DRV_OBJ_S is used during `single' builds +# +PFR_DRV_OBJ_M := $(PFR_DRV_SRC:$(PFR_DIR)/%.c=$(OBJ_DIR)/%.$O) +PFR_DRV_OBJ_S := $(OBJ_DIR)/pfr.$O + +# pfr driver source file for single build +# +PFR_DRV_SRC_S := $(PFR_DIR)/pfr.c + + +# pfr driver - single object +# +$(PFR_DRV_OBJ_S): $(PFR_DRV_SRC_S) $(PFR_DRV_SRC) $(FREETYPE_H) $(PFR_DRV_H) + $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PFR_DRV_SRC_S)) + + +# pfr driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PFR_DIR)/%.c $(FREETYPE_H) $(PFR_DRV_H) + $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PFR_DRV_OBJ_S) +DRV_OBJS_M += $(PFR_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/psaux/Jamfile b/alienblaster/project/jni/freetype/src/psaux/Jamfile new file mode 100644 index 000000000..faeded904 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/Jamfile @@ -0,0 +1,31 @@ +# FreeType 2 src/psaux Jamfile +# +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) psaux ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = psauxmod psobjs t1decode t1cmap + psconv afmparse + ; + } + else + { + _sources = psaux ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/psaux Jamfile diff --git a/alienblaster/project/jni/freetype/src/psaux/afmparse.c b/alienblaster/project/jni/freetype/src/psaux/afmparse.c new file mode 100644 index 000000000..91a17e236 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/afmparse.c @@ -0,0 +1,964 @@ +/***************************************************************************/ +/* */ +/* afmparse.c */ +/* */ +/* AFM parser (body). */ +/* */ +/* Copyright 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "afmparse.h" +#include "psconv.h" + +#include "psauxerr.h" + + +/***************************************************************************/ +/* */ +/* AFM_Stream */ +/* */ +/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. */ +/* */ +/* */ + + enum + { + AFM_STREAM_STATUS_NORMAL, + AFM_STREAM_STATUS_EOC, + AFM_STREAM_STATUS_EOL, + AFM_STREAM_STATUS_EOF + }; + + + typedef struct AFM_StreamRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + FT_Int status; + + } AFM_StreamRec; + + +#ifndef EOF +#define EOF -1 +#endif + + + /* this works because empty lines are ignored */ +#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' ) + +#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' ) +#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' ) + + /* column separator; there is no `column' in the spec actually */ +#define AFM_IS_SEP( ch ) ( (ch) == ';' ) + +#define AFM_GETC() \ + ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ + : EOF ) + +#define AFM_STREAM_KEY_BEGIN( stream ) \ + (char*)( (stream)->cursor - 1 ) + +#define AFM_STREAM_KEY_LEN( stream, key ) \ + ( (char*)(stream)->cursor - key - 1 ) + +#define AFM_STATUS_EOC( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOC ) + +#define AFM_STATUS_EOL( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOL ) + +#define AFM_STATUS_EOF( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOF ) + + + static int + afm_stream_skip_spaces( AFM_Stream stream ) + { + int ch = 0; /* make stupid compiler happy */ + + + if ( AFM_STATUS_EOC( stream ) ) + return ';'; + + while ( 1 ) + { + ch = AFM_GETC(); + if ( !AFM_IS_SPACE( ch ) ) + break; + } + + if ( AFM_IS_NEWLINE( ch ) ) + stream->status = AFM_STREAM_STATUS_EOL; + else if ( AFM_IS_SEP( ch ) ) + stream->status = AFM_STREAM_STATUS_EOC; + else if ( AFM_IS_EOF( ch ) ) + stream->status = AFM_STREAM_STATUS_EOF; + + return ch; + } + + + /* read a key or value in current column */ + static char* + afm_stream_read_one( AFM_Stream stream ) + { + char* str; + int ch; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOC( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + while ( 1 ) + { + ch = AFM_GETC(); + if ( AFM_IS_SPACE( ch ) ) + break; + else if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_SEP( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOC; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /* read a string (i.e., read to EOL) */ + static char* + afm_stream_read_string( AFM_Stream stream ) + { + char* str; + int ch; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOL( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + /* scan to eol */ + while ( 1 ) + { + ch = AFM_GETC(); + if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /*************************************************************************/ + /* */ + /* AFM_Parser */ + /* */ + /* */ + + /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */ + typedef enum AFM_Token_ + { + AFM_TOKEN_ASCENDER, + AFM_TOKEN_AXISLABEL, + AFM_TOKEN_AXISTYPE, + AFM_TOKEN_B, + AFM_TOKEN_BLENDAXISTYPES, + AFM_TOKEN_BLENDDESIGNMAP, + AFM_TOKEN_BLENDDESIGNPOSITIONS, + AFM_TOKEN_C, + AFM_TOKEN_CC, + AFM_TOKEN_CH, + AFM_TOKEN_CAPHEIGHT, + AFM_TOKEN_CHARWIDTH, + AFM_TOKEN_CHARACTERSET, + AFM_TOKEN_CHARACTERS, + AFM_TOKEN_DESCENDER, + AFM_TOKEN_ENCODINGSCHEME, + AFM_TOKEN_ENDAXIS, + AFM_TOKEN_ENDCHARMETRICS, + AFM_TOKEN_ENDCOMPOSITES, + AFM_TOKEN_ENDDIRECTION, + AFM_TOKEN_ENDFONTMETRICS, + AFM_TOKEN_ENDKERNDATA, + AFM_TOKEN_ENDKERNPAIRS, + AFM_TOKEN_ENDTRACKKERN, + AFM_TOKEN_ESCCHAR, + AFM_TOKEN_FAMILYNAME, + AFM_TOKEN_FONTBBOX, + AFM_TOKEN_FONTNAME, + AFM_TOKEN_FULLNAME, + AFM_TOKEN_ISBASEFONT, + AFM_TOKEN_ISCIDFONT, + AFM_TOKEN_ISFIXEDPITCH, + AFM_TOKEN_ISFIXEDV, + AFM_TOKEN_ITALICANGLE, + AFM_TOKEN_KP, + AFM_TOKEN_KPH, + AFM_TOKEN_KPX, + AFM_TOKEN_KPY, + AFM_TOKEN_L, + AFM_TOKEN_MAPPINGSCHEME, + AFM_TOKEN_METRICSSETS, + AFM_TOKEN_N, + AFM_TOKEN_NOTICE, + AFM_TOKEN_PCC, + AFM_TOKEN_STARTAXIS, + AFM_TOKEN_STARTCHARMETRICS, + AFM_TOKEN_STARTCOMPOSITES, + AFM_TOKEN_STARTDIRECTION, + AFM_TOKEN_STARTFONTMETRICS, + AFM_TOKEN_STARTKERNDATA, + AFM_TOKEN_STARTKERNPAIRS, + AFM_TOKEN_STARTKERNPAIRS0, + AFM_TOKEN_STARTKERNPAIRS1, + AFM_TOKEN_STARTTRACKKERN, + AFM_TOKEN_STDHW, + AFM_TOKEN_STDVW, + AFM_TOKEN_TRACKKERN, + AFM_TOKEN_UNDERLINEPOSITION, + AFM_TOKEN_UNDERLINETHICKNESS, + AFM_TOKEN_VV, + AFM_TOKEN_VVECTOR, + AFM_TOKEN_VERSION, + AFM_TOKEN_W, + AFM_TOKEN_W0, + AFM_TOKEN_W0X, + AFM_TOKEN_W0Y, + AFM_TOKEN_W1, + AFM_TOKEN_W1X, + AFM_TOKEN_W1Y, + AFM_TOKEN_WX, + AFM_TOKEN_WY, + AFM_TOKEN_WEIGHT, + AFM_TOKEN_WEIGHTVECTOR, + AFM_TOKEN_XHEIGHT, + N_AFM_TOKENS, + AFM_TOKEN_UNKNOWN + + } AFM_Token; + + + static const char* const afm_key_table[N_AFM_TOKENS] = + { + "Ascender", + "AxisLabel", + "AxisType", + "B", + "BlendAxisTypes", + "BlendDesignMap", + "BlendDesignPositions", + "C", + "CC", + "CH", + "CapHeight", + "CharWidth", + "CharacterSet", + "Characters", + "Descender", + "EncodingScheme", + "EndAxis", + "EndCharMetrics", + "EndComposites", + "EndDirection", + "EndFontMetrics", + "EndKernData", + "EndKernPairs", + "EndTrackKern", + "EscChar", + "FamilyName", + "FontBBox", + "FontName", + "FullName", + "IsBaseFont", + "IsCIDFont", + "IsFixedPitch", + "IsFixedV", + "ItalicAngle", + "KP", + "KPH", + "KPX", + "KPY", + "L", + "MappingScheme", + "MetricsSets", + "N", + "Notice", + "PCC", + "StartAxis", + "StartCharMetrics", + "StartComposites", + "StartDirection", + "StartFontMetrics", + "StartKernData", + "StartKernPairs", + "StartKernPairs0", + "StartKernPairs1", + "StartTrackKern", + "StdHW", + "StdVW", + "TrackKern", + "UnderlinePosition", + "UnderlineThickness", + "VV", + "VVector", + "Version", + "W", + "W0", + "W0X", + "W0Y", + "W1", + "W1X", + "W1Y", + "WX", + "WY", + "Weight", + "WeightVector", + "XHeight" + }; + + + /* + * `afm_parser_read_vals' and `afm_parser_next_key' provide + * high-level operations to an AFM_Stream. The rest of the + * parser functions should use them without accessing the + * AFM_Stream directly. + */ + + FT_LOCAL_DEF( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_UInt n ) + { + AFM_Stream stream = parser->stream; + char* str; + FT_UInt i; + + + if ( n > AFM_MAX_ARGUMENTS ) + return 0; + + for ( i = 0; i < n; i++ ) + { + FT_Offset len; + AFM_Value val = vals + i; + + + if ( val->type == AFM_VALUE_TYPE_STRING ) + str = afm_stream_read_string( stream ); + else + str = afm_stream_read_one( stream ); + + if ( !str ) + break; + + len = AFM_STREAM_KEY_LEN( stream, str ); + + switch ( val->type ) + { + case AFM_VALUE_TYPE_STRING: + case AFM_VALUE_TYPE_NAME: + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( !FT_QALLOC( val->u.s, len + 1 ) ) + { + ft_memcpy( val->u.s, str, len ); + val->u.s[len] = '\0'; + } + } + break; + + case AFM_VALUE_TYPE_FIXED: + val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len, 0 ); + break; + + case AFM_VALUE_TYPE_INTEGER: + val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len ); + break; + + case AFM_VALUE_TYPE_BOOL: + val->u.b = FT_BOOL( len == 4 && + !ft_strncmp( str, "true", 4 ) ); + break; + + case AFM_VALUE_TYPE_INDEX: + if ( parser->get_index ) + val->u.i = parser->get_index( str, len, parser->user_data ); + else + val->u.i = 0; + break; + } + } + + return i; + } + + + FT_LOCAL_DEF( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_Offset* len ) + { + AFM_Stream stream = parser->stream; + char* key = 0; /* make stupid compiler happy */ + + + if ( line ) + { + while ( 1 ) + { + /* skip current line */ + if ( !AFM_STATUS_EOL( stream ) ) + afm_stream_read_string( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty line */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOL( stream ) ) + continue; + + break; + } + } + else + { + while ( 1 ) + { + /* skip current column */ + while ( !AFM_STATUS_EOC( stream ) ) + afm_stream_read_one( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty column */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOC( stream ) ) + continue; + + break; + } + } + + if ( len ) + *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key ) + : 0; + + return key; + } + + + static AFM_Token + afm_tokenize( const char* key, + FT_Offset len ) + { + int n; + + + for ( n = 0; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) == *key ) + { + for ( ; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) != *key ) + return AFM_TOKEN_UNKNOWN; + + if ( ft_strncmp( afm_key_table[n], key, len ) == 0 ) + return (AFM_Token) n; + } + } + } + + return AFM_TOKEN_UNKNOWN; + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ) + { + AFM_Stream stream; + FT_Error error; + + + if ( FT_NEW( stream ) ) + return error; + + stream->cursor = stream->base = base; + stream->limit = limit; + + /* don't skip the first line during the first call */ + stream->status = AFM_STREAM_STATUS_EOL; + + parser->memory = memory; + parser->stream = stream; + parser->FontInfo = NULL; + parser->get_index = NULL; + + return PSaux_Err_Ok; + } + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + + + FT_FREE( parser->stream ); + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_read_int( AFM_Parser parser, + FT_Int* aint ) + { + AFM_ValueRec val; + + + val.type = AFM_VALUE_TYPE_INTEGER; + + if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) + { + *aint = val.u.i; + + return PSaux_Err_Ok; + } + else + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parse_track_kern( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_TrackKern tk; + char* key; + FT_Offset len; + int n = -1; + + + if ( afm_parser_read_int( parser, &fi->NumTrackKern ) ) + goto Fail; + + if ( fi->NumTrackKern ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[5]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_TRACKKERN: + n++; + + if ( n >= fi->NumTrackKern ) + goto Fail; + + tk = fi->TrackKerns + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + shared_vals[4].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) + goto Fail; + + tk->degree = shared_vals[0].u.i; + tk->min_ptsize = shared_vals[1].u.f; + tk->min_kern = shared_vals[2].u.f; + tk->max_ptsize = shared_vals[3].u.f; + tk->max_kern = shared_vals[4].u.f; + + /* is this correct? */ + if ( tk->degree < 0 && tk->min_kern > 0 ) + tk->min_kern = -tk->min_kern; + break; + + case AFM_TOKEN_ENDTRACKKERN: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + fi->NumTrackKern = n + 1; + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) + + + /* compare two kerning pairs */ + FT_CALLBACK_DEF( int ) + afm_compare_kern_pairs( const void* a, + const void* b ) + { + AFM_KernPair kp1 = (AFM_KernPair)a; + AFM_KernPair kp2 = (AFM_KernPair)b; + + FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 ); + FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 ); + + + if ( index1 > index2 ) + return 1; + else if ( index1 < index2 ) + return -1; + else + return 0; + } + + + static FT_Error + afm_parse_kern_pairs( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_KernPair kp; + char* key; + FT_Offset len; + int n = -1; + + + if ( afm_parser_read_int( parser, &fi->NumKernPair ) ) + goto Fail; + + if ( fi->NumKernPair ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + switch ( token ) + { + case AFM_TOKEN_KP: + case AFM_TOKEN_KPX: + case AFM_TOKEN_KPY: + { + FT_Int r; + AFM_ValueRec shared_vals[4]; + + + n++; + + if ( n >= fi->NumKernPair ) + goto Fail; + + kp = fi->KernPairs + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INDEX; + shared_vals[1].type = AFM_VALUE_TYPE_INDEX; + shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; + r = afm_parser_read_vals( parser, shared_vals, 4 ); + if ( r < 3 ) + goto Fail; + + kp->index1 = shared_vals[0].u.i; + kp->index2 = shared_vals[1].u.i; + if ( token == AFM_TOKEN_KPY ) + { + kp->x = 0; + kp->y = shared_vals[2].u.i; + } + else + { + kp->x = shared_vals[2].u.i; + kp->y = ( token == AFM_TOKEN_KP && r == 4 ) + ? shared_vals[3].u.i : 0; + } + } + break; + + case AFM_TOKEN_ENDKERNPAIRS: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + fi->NumKernPair = n + 1; + ft_qsort( fi->KernPairs, fi->NumKernPair, + sizeof( AFM_KernPairRec ), + afm_compare_kern_pairs ); + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parse_kern_data( AFM_Parser parser ) + { + FT_Error error; + char* key; + FT_Offset len; + + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_STARTTRACKKERN: + error = afm_parse_track_kern( parser ); + if ( error ) + return error; + break; + + case AFM_TOKEN_STARTKERNPAIRS: + case AFM_TOKEN_STARTKERNPAIRS0: + error = afm_parse_kern_pairs( parser ); + if ( error ) + return error; + break; + + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + return PSaux_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + static FT_Error + afm_parser_skip_section( AFM_Parser parser, + FT_UInt n, + AFM_Token end_section ) + { + char* key; + FT_Offset len; + + + while ( n-- > 0 ) + { + key = afm_parser_next_key( parser, 1, NULL ); + if ( !key ) + goto Fail; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) + return PSaux_Err_Ok; + } + + Fail: + return PSaux_Err_Syntax_Error; + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_parse( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + AFM_FontInfo fi = parser->FontInfo; + FT_Error error = PSaux_Err_Syntax_Error; + char* key; + FT_Offset len; + FT_Int metrics_sets = 0; + + + if ( !fi ) + return PSaux_Err_Invalid_Argument; + + key = afm_parser_next_key( parser, 1, &len ); + if ( !key || len != 16 || + ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) + return PSaux_Err_Unknown_File_Format; + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[4]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_METRICSSETS: + if ( afm_parser_read_int( parser, &metrics_sets ) ) + goto Fail; + + if ( metrics_sets != 0 && metrics_sets != 2 ) + { + error = PSaux_Err_Unimplemented_Feature; + + goto Fail; + } + break; + + case AFM_TOKEN_ISCIDFONT: + shared_vals[0].type = AFM_VALUE_TYPE_BOOL; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->IsCIDFont = shared_vals[0].u.b; + break; + + case AFM_TOKEN_FONTBBOX: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 ) + goto Fail; + + fi->FontBBox.xMin = shared_vals[0].u.f; + fi->FontBBox.yMin = shared_vals[1].u.f; + fi->FontBBox.xMax = shared_vals[2].u.f; + fi->FontBBox.yMax = shared_vals[3].u.f; + break; + + case AFM_TOKEN_ASCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Ascender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_DESCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Descender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_STARTCHARMETRICS: + { + FT_Int n = 0; + + + if ( afm_parser_read_int( parser, &n ) ) + goto Fail; + + error = afm_parser_skip_section( parser, n, + AFM_TOKEN_ENDCHARMETRICS ); + if ( error ) + return error; + } + break; + + case AFM_TOKEN_STARTKERNDATA: + error = afm_parse_kern_data( parser ); + if ( error ) + goto Fail; + /* fall through since we only support kern data */ + + case AFM_TOKEN_ENDFONTMETRICS: + return PSaux_Err_Ok; + + default: + break; + } + } + + Fail: + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + fi->IsCIDFont = 0; + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/afmparse.h b/alienblaster/project/jni/freetype/src/psaux/afmparse.h new file mode 100644 index 000000000..de2a530b2 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/afmparse.h @@ -0,0 +1,87 @@ +/***************************************************************************/ +/* */ +/* afmparse.h */ +/* */ +/* AFM parser (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __AFMPARSE_H__ +#define __AFMPARSE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ); + + + FT_LOCAL( FT_Error ) + afm_parser_parse( AFM_Parser parser ); + + + enum AFM_ValueType_ + { + AFM_VALUE_TYPE_STRING, + AFM_VALUE_TYPE_NAME, + AFM_VALUE_TYPE_FIXED, /* real number */ + AFM_VALUE_TYPE_INTEGER, + AFM_VALUE_TYPE_BOOL, + AFM_VALUE_TYPE_INDEX /* glyph index */ + }; + + + typedef struct AFM_ValueRec_ + { + enum AFM_ValueType_ type; + union { + char* s; + FT_Fixed f; + FT_Int i; + FT_Bool b; + + } u; + + } AFM_ValueRec, *AFM_Value; + +#define AFM_MAX_ARGUMENTS 5 + + FT_LOCAL( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_UInt n ); + + /* read the next key from the next line or column */ + FT_LOCAL( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_Offset* len ); + +FT_END_HEADER + +#endif /* __AFMPARSE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/module.mk b/alienblaster/project/jni/freetype/src/psaux/module.mk new file mode 100644 index 000000000..42bf6f519 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSaux module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSAUX_MODULE + +define PSAUX_MODULE +$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)psaux $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/psaux/psauxerr.h b/alienblaster/project/jni/freetype/src/psaux/psauxerr.h new file mode 100644 index 000000000..d0baa3cbb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/psauxerr.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* psauxerr.h */ +/* */ +/* PS auxiliary module error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PS auxiliary module error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSAUXERR_H__ +#define __PSAUXERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSaux_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSaux + +#include FT_ERRORS_H + +#endif /* __PSAUXERR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/psauxmod.c b/alienblaster/project/jni/freetype/src/psaux/psauxmod.c new file mode 100644 index 000000000..4c3579f7b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/psauxmod.c @@ -0,0 +1,139 @@ +/***************************************************************************/ +/* */ +/* psauxmod.c */ +/* */ +/* FreeType auxiliary PostScript module implementation (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "psauxmod.h" +#include "psobjs.h" +#include "t1decode.h" +#include "t1cmap.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "afmparse.h" +#endif + + + FT_CALLBACK_TABLE_DEF + const PS_Table_FuncsRec ps_table_funcs = + { + ps_table_new, + ps_table_done, + ps_table_add, + ps_table_release + }; + + + FT_CALLBACK_TABLE_DEF + const PS_Parser_FuncsRec ps_parser_funcs = + { + ps_parser_init, + ps_parser_done, + ps_parser_skip_spaces, + ps_parser_skip_PS_token, + ps_parser_to_int, + ps_parser_to_fixed, + ps_parser_to_bytes, + ps_parser_to_coord_array, + ps_parser_to_fixed_array, + ps_parser_to_token, + ps_parser_to_token_array, + ps_parser_load_field, + ps_parser_load_field_table + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Builder_FuncsRec t1_builder_funcs = + { + t1_builder_init, + t1_builder_done, + t1_builder_check_points, + t1_builder_add_point, + t1_builder_add_point1, + t1_builder_add_contour, + t1_builder_start_point, + t1_builder_close_contour + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Decoder_FuncsRec t1_decoder_funcs = + { + t1_decoder_init, + t1_decoder_done, + t1_decoder_parse_charstrings + }; + + +#ifndef T1_CONFIG_OPTION_NO_AFM + FT_CALLBACK_TABLE_DEF + const AFM_Parser_FuncsRec afm_parser_funcs = + { + afm_parser_init, + afm_parser_done, + afm_parser_parse + }; +#endif + + + FT_CALLBACK_TABLE_DEF + const T1_CMap_ClassesRec t1_cmap_classes = + { + &t1_cmap_standard_class_rec, + &t1_cmap_expert_class_rec, + &t1_cmap_custom_class_rec, + &t1_cmap_unicode_class_rec + }; + + + static + const PSAux_Interface psaux_interface = + { + &ps_table_funcs, + &ps_parser_funcs, + &t1_builder_funcs, + &t1_decoder_funcs, + t1_decrypt, + + (const T1_CMap_ClassesRec*) &t1_cmap_classes, + +#ifndef T1_CONFIG_OPTION_NO_AFM + &afm_parser_funcs, +#else + 0, +#endif + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class psaux_module_class = + { + 0, + sizeof( FT_ModuleRec ), + "psaux", + 0x20000L, + 0x20000L, + + &psaux_interface, /* module-specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/psauxmod.h b/alienblaster/project/jni/freetype/src/psaux/psauxmod.h new file mode 100644 index 000000000..35e042dbc --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/psauxmod.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* psauxmod.h */ +/* */ +/* FreeType auxiliary PostScript module implementation (specification). */ +/* */ +/* Copyright 2000-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSAUXMOD_H__ +#define __PSAUXMOD_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; + + +FT_END_HEADER + +#endif /* __PSAUXMOD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/psconv.c b/alienblaster/project/jni/freetype/src/psaux/psconv.c new file mode 100644 index 000000000..1531d8f0f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/psconv.c @@ -0,0 +1,472 @@ +/***************************************************************************/ +/* */ +/* psconv.c */ +/* */ +/* Some convenience conversions (body). */ +/* */ +/* Copyright 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "psconv.h" +#include "psauxerr.h" + + + /* The following array is used by various functions to quickly convert */ + /* digits (both decimal and non-decimal) into numbers. */ + +#if 'A' == 65 + /* ASCII */ + + static const FT_Char ft_char_table[128] = + { + /* 0x00 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + }; + + /* no character >= 0x80 can represent a valid number */ +#define OP >= + +#endif /* 'A' == 65 */ + +#if 'A' == 193 + /* EBCDIC */ + + static const FT_Char ft_char_table[128] = + { + /* 0x80 */ + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + }; + + /* no character < 0x80 can represent a valid number */ +#define OP < + +#endif /* 'A' == 193 */ + + + FT_LOCAL_DEF( FT_Int ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Int base ) + { + FT_Byte* p = *cursor; + FT_Int num = 0; + FT_Bool sign = 0; + + + if ( p == limit || base < 2 || base > 36 ) + return 0; + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + return 0; + } + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( c < 0 || c >= base ) + break; + + num = num * base + c; + } + + if ( sign ) + num = -num; + + *cursor = p; + + return num; + } + + + FT_LOCAL_DEF( FT_Int ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ) + + { + FT_Byte* p; + FT_Int num; + + + num = PS_Conv_Strtol( cursor, limit, 10 ); + p = *cursor; + + if ( p < limit && *p == '#' ) + { + *cursor = p + 1; + + return PS_Conv_Strtol( cursor, limit, num ); + } + else + return num; + } + + + FT_LOCAL_DEF( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Int power_ten ) + { + FT_Byte* p = *cursor; + FT_Fixed integral; + FT_Long decimal = 0, divider = 1; + FT_Bool sign = 0; + + + if ( p == limit ) + return 0; + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + return 0; + } + + if ( *p != '.' ) + integral = PS_Conv_ToInt( &p, limit ) << 16; + else + integral = 0; + + /* read the decimal part */ + if ( p < limit && *p == '.' ) + { + p++; + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( c < 0 || c >= 10 ) + break; + + if ( !integral && power_ten > 0 ) + { + power_ten--; + decimal = decimal * 10 + c; + } + else + { + if ( divider < 10000000L ) + { + decimal = decimal * 10 + c; + divider *= 10; + } + } + } + } + + /* read exponent, if any */ + if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) ) + { + p++; + power_ten += PS_Conv_ToInt( &p, limit ); + } + + while ( power_ten > 0 ) + { + integral *= 10; + decimal *= 10; + power_ten--; + } + + while ( power_ten < 0 ) + { + integral /= 10; + divider *= 10; + power_ten++; + } + + if ( decimal ) + integral += FT_DivFix( decimal, divider ); + + if ( sign ) + integral = -integral; + + *cursor = p; + + return integral; + } + + +#if 0 + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ) + { + FT_Byte* p; + FT_UInt r = 0; + + + for ( p = *cursor; r < n && p < limit; p++ ) + { + FT_Byte b; + + + if ( *p != '\\' ) + { + buffer[r++] = *p; + + continue; + } + + p++; + + switch ( *p ) + { + case 'n': + b = '\n'; + break; + case 'r': + b = '\r'; + break; + case 't': + b = '\t'; + break; + case 'b': + b = '\b'; + break; + case 'f': + b = '\f'; + break; + case '\r': + p++; + if ( *p != '\n' ) + { + b = *p; + + break; + } + /* no break */ + case '\n': + continue; + break; + default: + if ( IS_PS_DIGIT( *p ) ) + { + b = *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + { + b = b * 8 + *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + b = b * 8 + *p - '0'; + else + { + buffer[r++] = b; + b = *p; + } + } + else + { + buffer[r++] = b; + b = *p; + } + } + else + b = *p; + break; + } + + buffer[r++] = b; + } + + *cursor = p; + + return r; + } +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ) + { + FT_Byte* p; + FT_UInt r = 0; + FT_UInt w = 0; + FT_UInt pad = 0x01; + + + n *= 2; + +#if 1 + + p = *cursor; + if ( n > (FT_UInt)( limit - p ) ) + n = (FT_UInt)( limit - p ); + + /* we try to process two nibbles at a time to be as fast as possible */ + for ( ; r < n; r++ ) + { + FT_UInt c = p[r]; + + + if ( IS_PS_SPACE( c ) ) + continue; + + if ( c OP 0x80 ) + break; + + c = ft_char_table[c & 0x7F]; + if ( (unsigned)c >= 16 ) + break; + + pad = ( pad << 4 ) | c; + if ( pad & 0x100 ) + { + buffer[w++] = (FT_Byte)pad; + pad = 0x01; + } + } + + if ( pad != 0x01 ) + buffer[w++] = (FT_Byte)( pad << 4 ); + + *cursor = p + r; + + return w; + +#else /* 0 */ + + for ( r = 0; r < n; r++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) ) + continue; + + if ( *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7f]; + + if ( (unsigned)c >= 16 ) + break; + + if ( r & 1 ) + { + *buffer = (FT_Byte)(*buffer + c); + buffer++; + } + else + *buffer = (FT_Byte)(c << 4); + + r++; + } + + *cursor = p; + + return ( r + 1 ) / 2; + +#endif /* 0 */ + + } + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n, + FT_UShort* seed ) + { + FT_Byte* p; + FT_UInt r; + FT_UInt s = *seed; + + +#if 1 + + p = *cursor; + if ( n > (FT_UInt)(limit - p) ) + n = (FT_UInt)(limit - p); + + for ( r = 0; r < n; r++ ) + { + FT_UInt val = p[r]; + FT_UInt b = ( val ^ ( s >> 8 ) ); + + + s = ( (val + s)*52845U + 22719 ) & 0xFFFFU; + buffer[r] = (FT_Byte) b; + } + + *cursor = p + n; + *seed = (FT_UShort)s; + +#else /* 0 */ + + for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ ) + { + FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) ); + + + s = (FT_UShort)( ( *p + s ) * 52845U + 22719 ); + *buffer++ = b; + } + *cursor = p; + *seed = s; + +#endif /* 0 */ + + return r; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/psconv.h b/alienblaster/project/jni/freetype/src/psaux/psconv.h new file mode 100644 index 000000000..84854ba0d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/psconv.h @@ -0,0 +1,71 @@ +/***************************************************************************/ +/* */ +/* psconv.h */ +/* */ +/* Some convenience conversions (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSCONV_H__ +#define __PSCONV_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Int ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Int base ); + + + FT_LOCAL( FT_Int ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ); + + FT_LOCAL( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Int power_ten ); + +#if 0 + FT_LOCAL( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ); +#endif + + FT_LOCAL( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ); + + FT_LOCAL( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n, + FT_UShort* seed ); + + +FT_END_HEADER + +#endif /* __PSCONV_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/psobjs.c b/alienblaster/project/jni/freetype/src/psaux/psobjs.c new file mode 100644 index 000000000..fe8398ae3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/psobjs.c @@ -0,0 +1,1703 @@ +/***************************************************************************/ +/* */ +/* psobjs.c */ +/* */ +/* Auxiliary functions for PostScript fonts (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H + +#include "psobjs.h" +#include "psconv.h" + +#include "psauxerr.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_psobjs + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_new */ + /* */ + /* <Description> */ + /* Initializes a PS_Table. */ + /* */ + /* <InOut> */ + /* table :: The address of the target table. */ + /* */ + /* <Input> */ + /* count :: The table size = the maximum number of elements. */ + /* */ + /* memory :: The memory object to use for all subsequent */ + /* reallocations. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ) + { + FT_Error error; + + + table->memory = memory; + if ( FT_NEW_ARRAY( table->elements, count ) || + FT_NEW_ARRAY( table->lengths, count ) ) + goto Exit; + + table->max_elems = count; + table->init = 0xDEADBEEFUL; + table->num_elems = 0; + table->block = 0; + table->capacity = 0; + table->cursor = 0; + + *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs; + + Exit: + if ( error ) + FT_FREE( table->elements ); + + return error; + } + + + static void + shift_elements( PS_Table table, + FT_Byte* old_base ) + { + FT_PtrDist delta = table->block - old_base; + FT_Byte** offset = table->elements; + FT_Byte** limit = offset + table->max_elems; + + + for ( ; offset < limit; offset++ ) + { + if ( offset[0] ) + offset[0] += delta; + } + } + + + static FT_Error + reallocate_t1_table( PS_Table table, + FT_Long new_size ) + { + FT_Memory memory = table->memory; + FT_Byte* old_base = table->block; + FT_Error error; + + + /* allocate new base block */ + if ( FT_ALLOC( table->block, new_size ) ) + { + table->block = old_base; + return error; + } + + /* copy elements and shift offsets */ + if ( old_base ) + { + FT_MEM_COPY( table->block, old_base, table->capacity ); + shift_elements( table, old_base ); + FT_FREE( old_base ); + } + + table->capacity = new_size; + + return PSaux_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_add */ + /* */ + /* <Description> */ + /* Adds an object to a PS_Table, possibly growing its memory block. */ + /* */ + /* <InOut> */ + /* table :: The target table. */ + /* */ + /* <Input> */ + /* idx :: The index of the object in the table. */ + /* */ + /* object :: The address of the object to copy in memory. */ + /* */ + /* length :: The length in bytes of the source object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. An error is returned if a */ + /* reallocation fails. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ) + { + if ( idx < 0 || idx >= table->max_elems ) + { + FT_ERROR(( "ps_table_add: invalid index\n" )); + return PSaux_Err_Invalid_Argument; + } + + if ( length < 0 ) + { + FT_ERROR(( "ps_table_add: invalid length\n" )); + return PSaux_Err_Invalid_Argument; + } + + /* grow the base block if needed */ + if ( table->cursor + length > table->capacity ) + { + FT_Error error; + FT_Offset new_size = table->capacity; + FT_Long in_offset; + + + in_offset = (FT_Long)((FT_Byte*)object - table->block); + if ( (FT_ULong)in_offset >= table->capacity ) + in_offset = -1; + + while ( new_size < table->cursor + length ) + { + /* increase size by 25% and round up to the nearest multiple + of 1024 */ + new_size += ( new_size >> 2 ) + 1; + new_size = FT_PAD_CEIL( new_size, 1024 ); + } + + error = reallocate_t1_table( table, new_size ); + if ( error ) + return error; + + if ( in_offset >= 0 ) + object = table->block + in_offset; + } + + /* add the object to the base block and adjust offset */ + table->elements[idx] = table->block + table->cursor; + table->lengths [idx] = length; + FT_MEM_COPY( table->block + table->cursor, object, length ); + + table->cursor += length; + return PSaux_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ps_table_done */ + /* */ + /* <Description> */ + /* Finalizes a PS_TableRec (i.e., reallocate it to its current */ + /* cursor). */ + /* */ + /* <InOut> */ + /* table :: The target table. */ + /* */ + /* <Note> */ + /* This function does NOT release the heap's memory block. It is up */ + /* to the caller to clean it, or reference it in its own structures. */ + /* */ + FT_LOCAL_DEF( void ) + ps_table_done( PS_Table table ) + { + FT_Memory memory = table->memory; + FT_Error error; + FT_Byte* old_base = table->block; + + + /* should never fail, because rec.cursor <= rec.size */ + if ( !old_base ) + return; + + if ( FT_ALLOC( table->block, table->cursor ) ) + return; + FT_MEM_COPY( table->block, old_base, table->cursor ); + shift_elements( table, old_base ); + + table->capacity = table->cursor; + FT_FREE( old_base ); + + FT_UNUSED( error ); + } + + + FT_LOCAL_DEF( void ) + ps_table_release( PS_Table table ) + { + FT_Memory memory = table->memory; + + + if ( (FT_ULong)table->init == 0xDEADBEEFUL ) + { + FT_FREE( table->block ); + FT_FREE( table->elements ); + FT_FREE( table->lengths ); + table->init = 0; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* first character must be already part of the comment */ + + static void + skip_comment( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( IS_PS_NEWLINE( *cur ) ) + break; + cur++; + } + + *acur = cur; + } + + + static void + skip_spaces( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( !IS_PS_SPACE( *cur ) ) + { + if ( *cur == '%' ) + /* According to the PLRM, a comment is equal to a space. */ + skip_comment( &cur, limit ); + else + break; + } + cur++; + } + + *acur = cur; + } + + +#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' ) + + + /* first character must be `('; */ + /* *acur is positioned at the character after the closing `)' */ + + static FT_Error + skip_literal_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Int embed = 0; + FT_Error error = PSaux_Err_Invalid_File_Format; + unsigned int i; + + + while ( cur < limit ) + { + FT_Byte c = *cur; + + + ++cur; + + if ( c == '\\' ) + { + /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */ + /* A backslash can introduce three different types */ + /* of escape sequences: */ + /* - a special escaped char like \r, \n, etc. */ + /* - a one-, two-, or three-digit octal number */ + /* - none of the above in which case the backslash is ignored */ + + if ( cur == limit ) + /* error (or to be ignored?) */ + break; + + switch ( *cur ) + { + /* skip `special' escape */ + case 'n': + case 'r': + case 't': + case 'b': + case 'f': + case '\\': + case '(': + case ')': + ++cur; + break; + + default: + /* skip octal escape or ignore backslash */ + for ( i = 0; i < 3 && cur < limit; ++i ) + { + if ( !IS_OCTAL_DIGIT( *cur ) ) + break; + + ++cur; + } + } + } + else if ( c == '(' ) + embed++; + else if ( c == ')' ) + { + embed--; + if ( embed == 0 ) + { + error = PSaux_Err_Ok; + break; + } + } + } + + *acur = cur; + + return error; + } + + + /* first character must be `<' */ + + static FT_Error + skip_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Error err = PSaux_Err_Ok; + + + while ( ++cur < limit ) + { + /* All whitespace characters are ignored. */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + break; + + if ( !IS_PS_XDIGIT( *cur ) ) + break; + } + + if ( cur < limit && *cur != '>' ) + { + FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); + err = PSaux_Err_Invalid_File_Format; + } + else + cur++; + + *acur = cur; + return err; + } + + + /* first character must be the opening brace that */ + /* starts the procedure */ + + /* NB: [ and ] need not match: */ + /* `/foo {[} def' is a valid PostScript fragment, */ + /* even within a Type1 font */ + + static FT_Error + skip_procedure( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur; + FT_Int embed = 0; + FT_Error error = PSaux_Err_Ok; + + + FT_ASSERT( **acur == '{' ); + + for ( cur = *acur; cur < limit && error == PSaux_Err_Ok; ++cur ) + { + switch ( *cur ) + { + case '{': + ++embed; + break; + + case '}': + --embed; + if ( embed == 0 ) + { + ++cur; + goto end; + } + break; + + case '(': + error = skip_literal_string( &cur, limit ); + break; + + case '<': + error = skip_string( &cur, limit ); + break; + + case '%': + skip_comment( &cur, limit ); + break; + } + } + + end: + if ( embed != 0 ) + error = PSaux_Err_Invalid_File_Format; + + *acur = cur; + + return error; + } + + + /***********************************************************************/ + /* */ + /* All exported parsing routines handle leading whitespace and stop at */ + /* the first character which isn't part of the just handled token. */ + /* */ + /***********************************************************************/ + + + FT_LOCAL_DEF( void ) + ps_parser_skip_PS_token( PS_Parser parser ) + { + /* Note: PostScript allows any non-delimiting, non-whitespace */ + /* character in a name (PS Ref Manual, 3rd ed, p31). */ + /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ + + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + FT_Error error = PSaux_Err_Ok; + + + skip_spaces( &cur, limit ); /* this also skips comments */ + if ( cur >= limit ) + goto Exit; + + /* self-delimiting, single-character tokens */ + if ( *cur == '[' || *cur == ']' ) + { + cur++; + goto Exit; + } + + /* skip balanced expressions (procedures and strings) */ + + if ( *cur == '{' ) /* {...} */ + { + error = skip_procedure( &cur, limit ); + goto Exit; + } + + if ( *cur == '(' ) /* (...) */ + { + error = skip_literal_string( &cur, limit ); + goto Exit; + } + + if ( *cur == '<' ) /* <...> */ + { + if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */ + { + cur++; + cur++; + } + else + error = skip_string( &cur, limit ); + + goto Exit; + } + + if ( *cur == '>' ) + { + cur++; + if ( cur >= limit || *cur != '>' ) /* >> */ + { + FT_ERROR(( "ps_parser_skip_PS_token:" + " unexpected closing delimiter `>'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + cur++; + goto Exit; + } + + if ( *cur == '/' ) + cur++; + + /* anything else */ + while ( cur < limit ) + { + /* *cur might be invalid (e.g., ')' or '}'), but this */ + /* is handled by the test `cur == parser->cursor' below */ + if ( IS_PS_DELIM( *cur ) ) + break; + + cur++; + } + + Exit: + if ( cur == parser->cursor ) + { + FT_ERROR(( "ps_parser_skip_PS_token:" + " current token is `%c' which is self-delimiting\n" + " " + " but invalid at this point\n", + *cur )); + + error = PSaux_Err_Invalid_File_Format; + } + + parser->error = error; + parser->cursor = cur; + } + + + FT_LOCAL_DEF( void ) + ps_parser_skip_spaces( PS_Parser parser ) + { + skip_spaces( &parser->cursor, parser->limit ); + } + + + /* `token' here means either something between balanced delimiters */ + /* or the next token; the delimiters are not removed. */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ) + { + FT_Byte* cur; + FT_Byte* limit; + FT_Int embed; + + + token->type = T1_TOKEN_TYPE_NONE; + token->start = 0; + token->limit = 0; + + /* first of all, skip leading whitespace */ + ps_parser_skip_spaces( parser ); + + cur = parser->cursor; + limit = parser->limit; + + if ( cur >= limit ) + return; + + switch ( *cur ) + { + /************* check for literal string *****************/ + case '(': + token->type = T1_TOKEN_TYPE_STRING; + token->start = cur; + + if ( skip_literal_string( &cur, limit ) == PSaux_Err_Ok ) + token->limit = cur; + break; + + /************* check for programs/array *****************/ + case '{': + token->type = T1_TOKEN_TYPE_ARRAY; + token->start = cur; + + if ( skip_procedure( &cur, limit ) == PSaux_Err_Ok ) + token->limit = cur; + break; + + /************* check for table/array ********************/ + /* XXX: in theory we should also look for "<<" */ + /* since this is semantically equivalent to "["; */ + /* in practice it doesn't matter (?) */ + case '[': + token->type = T1_TOKEN_TYPE_ARRAY; + embed = 1; + token->start = cur++; + + /* we need this to catch `[ ]' */ + parser->cursor = cur; + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + while ( cur < limit && !parser->error ) + { + /* XXX: this is wrong because it does not */ + /* skip comments, procedures, and strings */ + if ( *cur == '[' ) + embed++; + else if ( *cur == ']' ) + { + embed--; + if ( embed <= 0 ) + { + token->limit = ++cur; + break; + } + } + + parser->cursor = cur; + ps_parser_skip_PS_token( parser ); + /* we need this to catch `[XXX ]' */ + ps_parser_skip_spaces ( parser ); + cur = parser->cursor; + } + break; + + /* ************ otherwise, it is any token **************/ + default: + token->start = cur; + token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY ); + ps_parser_skip_PS_token( parser ); + cur = parser->cursor; + if ( !parser->error ) + token->limit = cur; + } + + if ( !token->limit ) + { + token->start = 0; + token->type = T1_TOKEN_TYPE_NONE; + } + + parser->cursor = cur; + } + + + /* NB: `tokens' can be NULL if we only want to count */ + /* the number of array elements */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ) + { + T1_TokenRec master; + + + *pnum_tokens = -1; + + /* this also handles leading whitespace */ + ps_parser_to_token( parser, &master ); + + if ( master.type == T1_TOKEN_TYPE_ARRAY ) + { + FT_Byte* old_cursor = parser->cursor; + FT_Byte* old_limit = parser->limit; + T1_Token cur = tokens; + T1_Token limit = cur + max_tokens; + + + /* don't include outermost delimiters */ + parser->cursor = master.start + 1; + parser->limit = master.limit - 1; + + while ( parser->cursor < parser->limit ) + { + T1_TokenRec token; + + + ps_parser_to_token( parser, &token ); + if ( !token.type ) + break; + + if ( tokens != NULL && cur < limit ) + *cur = token; + + cur++; + } + + *pnum_tokens = (FT_Int)( cur - tokens ); + + parser->cursor = old_cursor; + parser->limit = old_limit; + } + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `coords' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_coords' */ + + static FT_Int + ps_tocoordarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_coords, + FT_Short* coords ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* check for the beginning of an array; otherwise, only one number */ + /* will be read */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the coordinates */ + while ( cur < limit ) + { + FT_Short dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( coords != NULL && count >= max_coords ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( coords != NULL ? &coords[count] : &dummy ) = + (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `values' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_values' */ + + static FT_Int + ps_tofixedarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* Check for the beginning of an array. Otherwise, only one number */ + /* will be read. */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the values */ + while ( cur < limit ) + { + FT_Fixed dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( values != NULL && count >= max_values ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( values != NULL ? &values[count] : &dummy ) = + PS_Conv_ToFixed( &cur, limit, power_ten ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + +#if 0 + + static FT_String* + ps_tostring( FT_Byte** cursor, + FT_Byte* limit, + FT_Memory memory ) + { + FT_Byte* cur = *cursor; + FT_PtrDist len = 0; + FT_Int count; + FT_String* result; + FT_Error error; + + + /* XXX: some stupid fonts have a `Notice' or `Copyright' string */ + /* that simply doesn't begin with an opening parenthesis, even */ + /* though they have a closing one! E.g. "amuncial.pfb" */ + /* */ + /* We must deal with these ill-fated cases there. Note that */ + /* these fonts didn't work with the old Type 1 driver as the */ + /* notice/copyright was not recognized as a valid string token */ + /* and made the old token parser commit errors. */ + + while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) ) + cur++; + if ( cur + 1 >= limit ) + return 0; + + if ( *cur == '(' ) + cur++; /* skip the opening parenthesis, if there is one */ + + *cursor = cur; + count = 0; + + /* then, count its length */ + for ( ; cur < limit; cur++ ) + { + if ( *cur == '(' ) + count++; + + else if ( *cur == ')' ) + { + count--; + if ( count < 0 ) + break; + } + } + + len = cur - *cursor; + if ( cur >= limit || FT_ALLOC( result, len + 1 ) ) + return 0; + + /* now copy the string */ + FT_MEM_COPY( result, *cursor, len ); + result[len] = '\0'; + *cursor = cur; + return result; + } + +#endif /* 0 */ + + + static int + ps_tobool( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Bool result = 0; + + + /* return 1 if we find `true', 0 otherwise */ + if ( cur + 3 < limit && + cur[0] == 't' && + cur[1] == 'r' && + cur[2] == 'u' && + cur[3] == 'e' ) + { + result = 1; + cur += 5; + } + else if ( cur + 4 < limit && + cur[0] == 'f' && + cur[1] == 'a' && + cur[2] == 'l' && + cur[3] == 's' && + cur[4] == 'e' ) + { + result = 0; + cur += 6; + } + + *acur = cur; + return result; + } + + + /* load a simple field (i.e. non-table) into the current list of objects */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec token; + FT_Byte* cur; + FT_Byte* limit; + FT_UInt count; + FT_UInt idx; + FT_Error error; + + + /* this also skips leading whitespace */ + ps_parser_to_token( parser, &token ); + if ( !token.type ) + goto Fail; + + count = 1; + idx = 0; + cur = token.start; + limit = token.limit; + + /* we must detect arrays in /FontBBox */ + if ( field->type == T1_FIELD_TYPE_BBOX ) + { + T1_TokenRec token2; + FT_Byte* old_cur = parser->cursor; + FT_Byte* old_limit = parser->limit; + + + /* don't include delimiters */ + parser->cursor = token.start + 1; + parser->limit = token.limit - 1; + + ps_parser_to_token( parser, &token2 ); + parser->cursor = old_cur; + parser->limit = old_limit; + + if ( token2.type == T1_TOKEN_TYPE_ARRAY ) + goto FieldArray; + } + else if ( token.type == T1_TOKEN_TYPE_ARRAY ) + { + FieldArray: + /* if this is an array and we have no blend, an error occurs */ + if ( max_objects == 0 ) + goto Fail; + + count = max_objects; + idx = 1; + + /* don't include delimiters */ + cur++; + limit--; + } + + for ( ; count > 0; count--, idx++ ) + { + FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; + FT_Long val; + FT_String* string; + + + skip_spaces( &cur, limit ); + + switch ( field->type ) + { + case T1_FIELD_TYPE_BOOL: + val = ps_tobool( &cur, limit ); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED: + val = PS_Conv_ToFixed( &cur, limit, 0 ); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED_1000: + val = PS_Conv_ToFixed( &cur, limit, 3 ); + goto Store_Integer; + + case T1_FIELD_TYPE_INTEGER: + val = PS_Conv_ToInt( &cur, limit ); + /* fall through */ + + Store_Integer: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)q = (FT_UShort)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)q = (FT_UInt32)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case T1_FIELD_TYPE_STRING: + case T1_FIELD_TYPE_KEY: + { + FT_Memory memory = parser->memory; + FT_UInt len = (FT_UInt)( limit - cur ); + + + if ( cur >= limit ) + break; + + /* we allow both a string or a name */ + /* for cases like /FontName (foo) def */ + if ( token.type == T1_TOKEN_TYPE_KEY ) + { + /* don't include leading `/' */ + len--; + cur++; + } + else if ( token.type == T1_TOKEN_TYPE_STRING ) + { + /* don't include delimiting parentheses */ + /* XXX we don't handle <<...>> here */ + /* XXX should we convert octal escapes? */ + /* if so, what encoding should we use? */ + cur++; + len -= 2; + } + else + { + FT_ERROR(( "ps_parser_load_field:" + " expected a name or string\n" + " " + " but found token of type %d instead\n", + token.type )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + /* for this to work (FT_String**)q must have been */ + /* initialized to NULL */ + if ( *(FT_String**)q != NULL ) + { + FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", + field->ident )); + FT_FREE( *(FT_String**)q ); + *(FT_String**)q = NULL; + } + + if ( FT_ALLOC( string, len + 1 ) ) + goto Exit; + + FT_MEM_COPY( string, cur, len ); + string[len] = 0; + + *(FT_String**)q = string; + } + break; + + case T1_FIELD_TYPE_BBOX: + { + FT_Fixed temp[4]; + FT_BBox* bbox = (FT_BBox*)q; + FT_Int result; + + + result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); + + if ( result < 0 ) + { + FT_ERROR(( "ps_parser_load_field:" + " expected four integers in bounding box\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + bbox->xMin = FT_RoundFix( temp[0] ); + bbox->yMin = FT_RoundFix( temp[1] ); + bbox->xMax = FT_RoundFix( temp[2] ); + bbox->yMax = FT_RoundFix( temp[3] ); + } + break; + + default: + /* an error occurred */ + goto Fail; + } + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + error = PSaux_Err_Ok; + + Exit: + return error; + + Fail: + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + +#define T1_MAX_TABLE_ELEMENTS 32 + + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; + T1_Token token; + FT_Int num_elements; + FT_Error error = PSaux_Err_Ok; + FT_Byte* old_cursor; + FT_Byte* old_limit; + T1_FieldRec fieldrec = *(T1_Field)field; + + + fieldrec.type = T1_FIELD_TYPE_INTEGER; + if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || + field->type == T1_FIELD_TYPE_BBOX ) + fieldrec.type = T1_FIELD_TYPE_FIXED; + + ps_parser_to_token_array( parser, elements, + T1_MAX_TABLE_ELEMENTS, &num_elements ); + if ( num_elements < 0 ) + { + error = PSaux_Err_Ignore; + goto Exit; + } + if ( (FT_UInt)num_elements > field->array_max ) + num_elements = field->array_max; + + old_cursor = parser->cursor; + old_limit = parser->limit; + + /* we store the elements count if necessary; */ + /* we further assume that `count_offset' can't be zero */ + if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 ) + *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) = + (FT_Byte)num_elements; + + /* we now load each element, adjusting the field.offset on each one */ + token = elements; + for ( ; num_elements > 0; num_elements--, token++ ) + { + parser->cursor = token->start; + parser->limit = token->limit; + ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 ); + fieldrec.offset += fieldrec.size; + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + parser->cursor = old_cursor; + parser->limit = old_limit; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Long ) + ps_parser_to_int( PS_Parser parser ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToInt( &parser->cursor, parser->limit ); + } + + + /* first character must be `<' if `delimiters' is non-zero */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ) + { + FT_Error error = PSaux_Err_Ok; + FT_Byte* cur; + + + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + if ( cur >= parser->limit ) + goto Exit; + + if ( delimiters ) + { + if ( *cur != '<' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; + } + + *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, + parser->limit, + bytes, + max_bytes ); + + if ( delimiters ) + { + if ( cur < parser->limit && *cur != '>' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); + error = PSaux_Err_Invalid_File_Format; + goto Exit; + } + + cur++; + } + + parser->cursor = cur; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ) + { + ps_parser_skip_spaces( parser ); + return ps_tocoordarray( &parser->cursor, parser->limit, + max_coords, coords ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return ps_tofixedarray( &parser->cursor, parser->limit, + max_values, values, power_ten ); + } + + +#if 0 + + FT_LOCAL_DEF( FT_String* ) + T1_ToString( PS_Parser parser ) + { + return ps_tostring( &parser->cursor, parser->limit, parser->memory ); + } + + + FT_LOCAL_DEF( FT_Bool ) + T1_ToBool( PS_Parser parser ) + { + return ps_tobool( &parser->cursor, parser->limit ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ) + { + parser->error = PSaux_Err_Ok; + parser->base = base; + parser->limit = limit; + parser->cursor = base; + parser->memory = memory; + parser->funcs = ps_parser_funcs; + } + + + FT_LOCAL_DEF( void ) + ps_parser_done( PS_Parser parser ) + { + FT_UNUSED( parser ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_builder_init */ + /* */ + /* <Description> */ + /* Initializes a given glyph builder. */ + /* */ + /* <InOut> */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting should be applied. */ + /* */ + FT_LOCAL_DEF( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->parse_state = T1_Parse_Start; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = size->internal; + builder->hints_funcs = 0; + + if ( hinting ) + builder->hints_funcs = glyph->internal->glyph_hints; + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + + builder->funcs = t1_builder_funcs; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_builder_done */ + /* */ + /* <Description> */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* <Input> */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + FT_LOCAL_DEF( void ) + t1_builder_done( T1_Builder builder ) + { + FT_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + + + point->x = FIXED_TO_INT( x ); + point->y = FIXED_TO_INT( y ); + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = t1_builder_check_points( builder, 1 ); + if ( !error ) + t1_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + if ( !builder->load_points ) + { + outline->n_contours++; + return PSaux_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = PSaux_Err_Invalid_File_Format; + + + /* test whether we are building a new contour */ + + if ( builder->parse_state == T1_Parse_Have_Path ) + error = PSaux_Err_Ok; + else if ( builder->parse_state == T1_Parse_Have_Moveto ) + { + builder->parse_state = T1_Parse_Have_Path; + error = t1_builder_add_contour( builder ); + if ( !error ) + error = t1_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + t1_builder_close_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether the first and the last point is the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ) + { + PS_Conv_EexecDecode( &buffer, + buffer + length, + buffer, + length, + &seed ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/psobjs.h b/alienblaster/project/jni/freetype/src/psaux/psobjs.h new file mode 100644 index 000000000..e380c60da --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/psobjs.h @@ -0,0 +1,212 @@ +/***************************************************************************/ +/* */ +/* psobjs.h */ +/* */ +/* Auxiliary functions for PostScript fonts (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSOBJS_H__ +#define __PSOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE + const PS_Table_FuncsRec ps_table_funcs; + + FT_CALLBACK_TABLE + const PS_Parser_FuncsRec ps_parser_funcs; + + FT_CALLBACK_TABLE + const T1_Builder_FuncsRec t1_builder_funcs; + + + FT_LOCAL( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ); + + FT_LOCAL( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ); + + FT_LOCAL( void ) + ps_table_done( PS_Table table ); + + + FT_LOCAL( void ) + ps_table_release( PS_Table table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL( void ) + ps_parser_skip_spaces( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_skip_PS_token( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ); + + FT_LOCAL( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Long ) + ps_parser_to_int( PS_Parser parser ); + + + FT_LOCAL( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + + FT_LOCAL( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ); + + + FT_LOCAL( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + + FT_LOCAL( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + + FT_LOCAL( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + FT_LOCAL( void ) + ps_parser_done( PS_Parser parser ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ); + + FT_LOCAL( void ) + t1_builder_done( T1_Builder builder ); + + FT_LOCAL( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ); + + FT_LOCAL( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + FT_LOCAL( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( FT_Error ) + t1_builder_add_contour( T1_Builder builder ); + + + FT_LOCAL( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + + FT_LOCAL( void ) + t1_builder_close_contour( T1_Builder builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + +FT_END_HEADER + +#endif /* __PSOBJS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/rules.mk b/alienblaster/project/jni/freetype/src/psaux/rules.mk new file mode 100644 index 000000000..7a1be37b6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 PSaux driver configuration rules +# + + +# Copyright 1996-2000, 2002, 2003, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# PSAUX driver directory +# +PSAUX_DIR := $(SRC_DIR)/psaux + + +# compilation flags for the driver +# +PSAUX_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR)) + + +# PSAUX driver sources (i.e., C files) +# +PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c \ + $(PSAUX_DIR)/t1decode.c \ + $(PSAUX_DIR)/t1cmap.c \ + $(PSAUX_DIR)/afmparse.c \ + $(PSAUX_DIR)/psconv.c \ + $(PSAUX_DIR)/psauxmod.c + +# PSAUX driver headers +# +PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h) \ + $(PSAUX_DIR)/psauxerr.h + + +# PSAUX driver object(s) +# +# PSAUX_DRV_OBJ_M is used during `multi' builds. +# PSAUX_DRV_OBJ_S is used during `single' builds. +# +PSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O + +# PSAUX driver source file for single build +# +PSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c + + +# PSAUX driver - single object +# +$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \ + $(FREETYPE_H) $(PSAUX_DRV_H) + $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S)) + + +# PSAUX driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H) + $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSAUX_DRV_OBJ_S) +DRV_OBJS_M += $(PSAUX_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/psaux/t1cmap.c b/alienblaster/project/jni/freetype/src/psaux/t1cmap.c new file mode 100644 index 000000000..f933e4da8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/t1cmap.c @@ -0,0 +1,341 @@ +/***************************************************************************/ +/* */ +/* t1cmap.c */ +/* */ +/* Type 1 character map support (body). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "t1cmap.h" + +#include FT_INTERNAL_DEBUG_H + +#include "psauxerr.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_cmap_std_init( T1_CMapStd cmap, + FT_Int is_expert ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + cmap->num_glyphs = face->type1.num_glyphs; + cmap->glyph_names = (const char* const*)face->type1.glyph_names; + cmap->sid_to_string = psnames->adobe_std_strings; + cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding + : psnames->adobe_std_encoding; + + FT_ASSERT( cmap->code_to_sid != NULL ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_std_done( T1_CMapStd cmap ) + { + cmap->num_glyphs = 0; + cmap->glyph_names = NULL; + cmap->sid_to_string = NULL; + cmap->code_to_sid = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_std_char_index( T1_CMapStd cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( char_code < 256 ) + { + FT_UInt code, n; + const char* glyph_name; + + + /* convert character code to Adobe SID string */ + code = cmap->code_to_sid[char_code]; + glyph_name = cmap->sid_to_string( code ); + + /* look for the corresponding glyph name */ + for ( n = 0; n < cmap->num_glyphs; n++ ) + { + const char* gname = cmap->glyph_names[n]; + + + if ( gname && gname[0] == glyph_name[0] && + ft_strcmp( gname, glyph_name ) == 0 ) + { + result = n; + break; + } + } + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_std_char_next( T1_CMapStd cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + while ( char_code < 256 ) + { + result = t1_cmap_std_char_index( cmap, char_code ); + if ( result != 0 ) + goto Exit; + + char_code++; + } + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_standard_init( T1_CMapStd cmap ) + { + t1_cmap_std_init( cmap, 0 ); + return 0; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_standard_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_standard_init, + (FT_CMap_DoneFunc) t1_cmap_std_done, + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_expert_init( T1_CMapStd cmap ) + { + t1_cmap_std_init( cmap, 1 ); + return 0; + } + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_expert_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_expert_init, + (FT_CMap_DoneFunc) t1_cmap_std_done, + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_custom_init( T1_CMapCustom cmap ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + T1_Encoding encoding = &face->type1.encoding; + + + cmap->first = encoding->code_first; + cmap->count = (FT_UInt)( encoding->code_last - cmap->first ); + cmap->indices = encoding->char_index; + + FT_ASSERT( cmap->indices != NULL ); + FT_ASSERT( encoding->code_first <= encoding->code_last ); + + return 0; + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_custom_done( T1_CMapCustom cmap ) + { + cmap->indices = NULL; + cmap->first = 0; + cmap->count = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_custom_char_index( T1_CMapCustom cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( ( char_code >= cmap->first ) && + ( char_code < ( cmap->first + cmap->count ) ) ) + result = cmap->indices[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_custom_char_next( T1_CMapCustom cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + ++char_code; + + if ( char_code < cmap->first ) + char_code = cmap->first; + + for ( ; char_code < ( cmap->first + cmap->count ); char_code++ ) + { + result = cmap->indices[char_code]; + if ( result != 0 ) + goto Exit; + } + + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_custom_class_rec = + { + sizeof ( T1_CMapCustomRec ), + + (FT_CMap_InitFunc) t1_cmap_custom_init, + (FT_CMap_DoneFunc) t1_cmap_custom_done, + (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, + (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char * ) + t1_get_glyph_name( T1_Face face, + FT_UInt idx ) + { + return face->type1.glyph_names[idx]; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_unicode_init( PS_Unicodes unicodes ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_init( memory, + unicodes, + face->type1.num_glyphs, + (PS_GetGlyphNameFunc)&t1_get_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_unicode_class_rec = + { + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) t1_cmap_unicode_init, + (FT_CMap_DoneFunc) t1_cmap_unicode_done, + (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, + (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/t1cmap.h b/alienblaster/project/jni/freetype/src/psaux/t1cmap.h new file mode 100644 index 000000000..7ae65d2fa --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/t1cmap.h @@ -0,0 +1,105 @@ +/***************************************************************************/ +/* */ +/* t1cmap.h */ +/* */ +/* Type 1 character map support (specification). */ +/* */ +/* Copyright 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1CMAP_H__ +#define __T1CMAP_H__ + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct T1_CMapStdRec_* T1_CMapStd; + + typedef struct T1_CMapStdRec_ + { + FT_CMapRec cmap; + + const FT_UShort* code_to_sid; + PS_Adobe_Std_StringsFunc sid_to_string; + + FT_UInt num_glyphs; + const char* const* glyph_names; + + } T1_CMapStdRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_standard_class_rec; + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_expert_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct T1_CMapCustomRec_* T1_CMapCustom; + + typedef struct T1_CMapCustomRec_ + { + FT_CMapRec cmap; + FT_UInt first; + FT_UInt count; + FT_UShort* indices; + + } T1_CMapCustomRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_custom_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_unicode_class_rec; + + /* */ + + +FT_END_HEADER + +#endif /* __T1CMAP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/t1decode.c b/alienblaster/project/jni/freetype/src/psaux/t1decode.c new file mode 100644 index 000000000..31554ff1b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/t1decode.c @@ -0,0 +1,1592 @@ +/***************************************************************************/ +/* */ +/* t1decode.c */ +/* */ +/* PostScript Type 1 decoding routines (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_OUTLINE_H + +#include "t1decode.h" +#include "psobjs.h" + +#include "psauxerr.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1decode + + + typedef enum T1_Operator_ + { + op_none = 0, + op_endchar, + op_hsbw, + op_seac, + op_sbw, + op_closepath, + op_hlineto, + op_hmoveto, + op_hvcurveto, + op_rlineto, + op_rmoveto, + op_rrcurveto, + op_vhcurveto, + op_vlineto, + op_vmoveto, + op_dotsection, + op_hstem, + op_hstem3, + op_vstem, + op_vstem3, + op_div, + op_callothersubr, + op_callsubr, + op_pop, + op_return, + op_setcurrentpoint, + op_unknown15, + + op_max /* never remove this one */ + + } T1_Operator; + + + static + const FT_Int t1_args_count[op_max] = + { + 0, /* none */ + 0, /* endchar */ + 2, /* hsbw */ + 5, /* seac */ + 4, /* sbw */ + 0, /* closepath */ + 1, /* hlineto */ + 1, /* hmoveto */ + 4, /* hvcurveto */ + 2, /* rlineto */ + 2, /* rmoveto */ + 6, /* rrcurveto */ + 4, /* vhcurveto */ + 1, /* vlineto */ + 1, /* vmoveto */ + 0, /* dotsection */ + 2, /* hstem */ + 6, /* hstem3 */ + 2, /* vstem */ + 6, /* vstem3 */ + 2, /* div */ + -1, /* callothersubr */ + 1, /* callsubr */ + 0, /* pop */ + 0, /* return */ + 2, /* setcurrentpoint */ + 2 /* opcode 15 (undocumented and obsolete) */ + }; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_lookup_glyph_by_stdcharcode */ + /* */ + /* <Description> */ + /* Looks up a given glyph by its StandardEncoding charcode. Used to */ + /* implement the SEAC Type 1 operator. */ + /* */ + /* <Input> */ + /* face :: The current face object. */ + /* */ + /* charcode :: The character code to look for. */ + /* */ + /* <Return> */ + /* A glyph index in the font face. Returns -1 if the corresponding */ + /* glyph wasn't found. */ + /* */ + static FT_Int + t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, + FT_Int charcode ) + { + FT_UInt n; + const FT_String* glyph_name; + FT_Service_PsCMaps psnames = decoder->psnames; + + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + glyph_name = psnames->adobe_std_strings( + psnames->adobe_std_encoding[charcode]); + + for ( n = 0; n < decoder->num_glyphs; n++ ) + { + FT_String* name = (FT_String*)decoder->glyph_names[n]; + + + if ( name && + name[0] == glyph_name[0] && + ft_strcmp( name, glyph_name ) == 0 ) + return n; + } + + return -1; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1operator_seac */ + /* */ + /* <Description> */ + /* Implements the `seac' Type 1 operator for a Type 1 decoder. */ + /* */ + /* <Input> */ + /* decoder :: The current CID decoder. */ + /* */ + /* asb :: The accent's side bearing. */ + /* */ + /* adx :: The horizontal offset of the accent. */ + /* */ + /* ady :: The vertical offset of the accent. */ + /* */ + /* bchar :: The base character's StandardEncoding charcode. */ + /* */ + /* achar :: The accent character's StandardEncoding charcode. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + t1operator_seac( T1_Decoder decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + FT_Int bchar_index, achar_index; +#if 0 + FT_Int n_base_points; + FT_Outline* base = decoder->builder.base; +#endif + FT_Vector left_bearing, advance; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + T1_Face face = (T1_Face)decoder->builder.face; +#endif + + + if ( decoder->seac ) + { + FT_ERROR(( "t1operator_seac: invalid nested seac\n" )); + return PSaux_Err_Syntax_Error; + } + + /* seac weirdness */ + adx += decoder->builder.left_bearing.x; + + /* `glyph_names' is set to 0 for CID fonts which do not */ + /* include an encoding. How can we deal with these? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( decoder->glyph_names == 0 && + !face->root.internal->incremental_interface ) +#else + if ( decoder->glyph_names == 0 ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ERROR(( "t1operator_seac:" + " glyph names table not available in this font\n" )); + return PSaux_Err_Syntax_Error; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + { + /* the caller must handle the font encoding also */ + bchar_index = bchar; + achar_index = achar; + } + else +#endif + { + bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar ); + achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "t1operator_seac:" + " invalid seac character code arguments\n" )); + return PSaux_Err_Syntax_Error; + } + + /* if we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( decoder->builder.no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb ); + subg->arg2 = (FT_Int)FIXED_TO_INT( ady ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + goto Exit; + } + + /* First load `bchar' in builder */ + /* now load the unscaled outline */ + + FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ + + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = t1_decoder_parse_glyph( decoder, bchar_index ); + decoder->seac = FALSE; + if ( error ) + goto Exit; + + /* save the left bearing and width of the base character */ + /* as they will be erased by the next load. */ + + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + + decoder->builder.left_bearing.x = 0; + decoder->builder.left_bearing.y = 0; + + decoder->builder.pos_x = adx - asb; + decoder->builder.pos_y = ady; + + /* Now load `achar' on top of */ + /* the base outline */ + + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = t1_decoder_parse_glyph( decoder, achar_index ); + decoder->seac = FALSE; + if ( error ) + goto Exit; + + /* restore the left side bearing and */ + /* advance width of the base character */ + + decoder->builder.left_bearing = left_bearing; + decoder->builder.advance = advance; + + decoder->builder.pos_x = 0; + decoder->builder.pos_y = 0; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* t1_decoder_parse_charstrings */ + /* */ + /* <Description> */ + /* Parses a given Type 1 charstrings program. */ + /* */ + /* <Input> */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* charstring_base :: The base address of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ) + { + FT_Error error; + T1_Decoder_Zone zone; + FT_Byte* ip; + FT_Byte* limit; + T1_Builder builder = &decoder->builder; + FT_Pos x, y, orig_x, orig_y; + FT_Int known_othersubr_result_cnt = 0; + FT_Int unknown_othersubr_result_cnt = 0; + FT_Bool large_int; + FT_Fixed seed; + + T1_Hints_Funcs hinter; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool bol = TRUE; +#endif + + + /* we don't want to touch the source code -- use macro trick */ +#define start_point t1_builder_start_point +#define check_points t1_builder_check_points +#define add_point t1_builder_add_point +#define add_point1 t1_builder_add_point1 +#define add_contour t1_builder_add_contour +#define close_contour t1_builder_close_contour + + + /* compute random seed from stack address of parameter */ + seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^ + (FT_PtrDist)(char*)&decoder ^ + (FT_PtrDist)(char*)&charstring_base ) & + FT_ULONG_MAX ) ; + seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; + if ( seed == 0 ) + seed = 0x7384; + + /* First of all, initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + + builder->parse_state = T1_Parse_Start; + + hinter = (T1_Hints_Funcs)builder->hints_funcs; + + /* a font that reads BuildCharArray without setting */ + /* its values first is buggy, but ... */ + FT_ASSERT( ( decoder->len_buildchar == 0 ) == + ( decoder->buildchar == NULL ) ); + + if ( decoder->len_buildchar > 0 ) + ft_memset( &decoder->buildchar[0], + 0, + sizeof( decoder->buildchar[0] ) * decoder->len_buildchar ); + + FT_TRACE4(( "\n" + "Start charstring\n" )); + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = PSaux_Err_Ok; + + x = orig_x = builder->pos_x; + y = orig_y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + large_int = FALSE; + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Int32 value = 0; + + + FT_ASSERT( known_othersubr_result_cnt == 0 || + unknown_othersubr_result_cnt == 0 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( bol ) + { + FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); + bol = FALSE; + } +#endif + + /*********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + /* */ + + /* first of all, decompress operator or value */ + switch ( *ip++ ) + { + case 1: + op = op_hstem; + break; + + case 3: + op = op_vstem; + break; + case 4: + op = op_vmoveto; + break; + case 5: + op = op_rlineto; + break; + case 6: + op = op_hlineto; + break; + case 7: + op = op_vlineto; + break; + case 8: + op = op_rrcurveto; + break; + case 9: + op = op_closepath; + break; + case 10: + op = op_callsubr; + break; + case 11: + op = op_return; + break; + + case 13: + op = op_hsbw; + break; + case 14: + op = op_endchar; + break; + + case 15: /* undocumented, obsolete operator */ + op = op_unknown15; + break; + + case 21: + op = op_rmoveto; + break; + case 22: + op = op_hmoveto; + break; + + case 30: + op = op_vhcurveto; + break; + case 31: + op = op_hvcurveto; + break; + + case 12: + if ( ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid escape (12+EOF)\n" )); + goto Syntax_Error; + } + + switch ( *ip++ ) + { + case 0: + op = op_dotsection; + break; + case 1: + op = op_vstem3; + break; + case 2: + op = op_hstem3; + break; + case 6: + op = op_seac; + break; + case 7: + op = op_sbw; + break; + case 12: + op = op_div; + break; + case 16: + op = op_callothersubr; + break; + case 17: + op = op_pop; + break; + case 33: + op = op_setcurrentpoint; + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid escape (12+%d)\n", + ip[-1] )); + goto Syntax_Error; + } + break; + + case 255: /* four bytes integer */ + if ( ip + 4 > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + value = (FT_Int32)( ( (FT_Long)ip[0] << 24 ) | + ( (FT_Long)ip[1] << 16 ) | + ( (FT_Long)ip[2] << 8 ) | + ip[3] ); + ip += 4; + + /* According to the specification, values > 32000 or < -32000 must */ + /* be followed by a `div' operator to make the result be in the */ + /* range [-32000;32000]. We expect that the second argument of */ + /* `div' is not a large number. Additionally, we don't handle */ + /* stuff like `<large1> <large2> <num> div <num> div' or */ + /* <large1> <large2> <num> div div'. This is probably not allowed */ + /* anyway. */ + if ( value > 32000 || value < -32000 ) + { + if ( large_int ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no `div' after large integer\n" )); + } + else + large_int = TRUE; + } + else + { + if ( !large_int ) + value <<= 16; + } + + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Int32)ip[-1] - 139; + else + { + if ( ++ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ( ( (FT_Int32)ip[-2] - 247 ) << 8 ) + ip[-1] + 108; + else + value = -( ( ( (FT_Int32)ip[-2] - 251 ) << 8 ) + ip[-1] + 108 ); + } + + if ( !large_int ) + value <<= 16; + } + else + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid byte (%d)\n", ip[-1] )); + goto Syntax_Error; + } + } + + if ( unknown_othersubr_result_cnt > 0 ) + { + switch ( op ) + { + case op_callsubr: + case op_return: + case op_none: + case op_pop: + break; + + default: + /* all operands have been transferred by previous pops */ + unknown_othersubr_result_cnt = 0; + break; + } + } + + if ( large_int && !( op == op_none || op == op_div ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no `div' after large integer\n" )); + + large_int = FALSE; + } + + /*********************************************************************/ + /* */ + /* Push value on stack, or process operator */ + /* */ + /* */ + if ( op == op_none ) + { + if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" )); + goto Syntax_Error; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( large_int ) + FT_TRACE4(( " %ld", value )); + else + FT_TRACE4(( " %ld", (FT_Int32)( value >> 16 ) )); +#endif + + *top++ = value; + decoder->top = top; + } + else if ( op == op_callothersubr ) /* callothersubr */ + { + FT_Int subr_no; + FT_Int arg_cnt; + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " callothersubr\n" )); + bol = TRUE; +#endif + + if ( top - decoder->stack < 2 ) + goto Stack_Underflow; + + top -= 2; + + subr_no = (FT_Int)( top[1] >> 16 ); + arg_cnt = (FT_Int)( top[0] >> 16 ); + + /***********************************************************/ + /* */ + /* remove all operands to callothersubr from the stack */ + /* */ + /* for handled othersubrs, where we know the number of */ + /* arguments, we increase the stack by the value of */ + /* known_othersubr_result_cnt */ + /* */ + /* for unhandled othersubrs the following pops adjust the */ + /* stack pointer as necessary */ + + if ( arg_cnt > top - decoder->stack ) + goto Stack_Underflow; + + top -= arg_cnt; + + known_othersubr_result_cnt = 0; + unknown_othersubr_result_cnt = 0; + + /* XXX TODO: The checks to `arg_count == <whatever>' */ + /* might not be correct; an othersubr expects a certain */ + /* number of operands on the PostScript stack (as opposed */ + /* to the T1 stack) but it doesn't have to put them there */ + /* by itself; previous othersubrs might have left the */ + /* operands there if they were not followed by an */ + /* appropriate number of pops */ + /* */ + /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */ + /* accept a font that contains charstrings like */ + /* */ + /* 100 200 2 20 callothersubr */ + /* 300 1 20 callothersubr pop */ + /* */ + /* Perhaps this is the reason why BuildCharArray exists. */ + + switch ( subr_no ) + { + case 1: /* start flex feature */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + if ( start_point( builder, x, y ) || + check_points( builder, 6 ) ) + goto Fail; + break; + + case 2: /* add flex vectors */ + { + FT_Int idx; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + /* note that we should not add a point for index 0; */ + /* this will move our current position to the flex */ + /* point without adding any point to the outline */ + idx = decoder->num_flex_vectors++; + if ( idx > 0 && idx < 7 ) + add_point( builder, + x, + y, + (FT_Byte)( idx == 3 || idx == 6 ) ); + } + break; + + case 0: /* end flex feature */ + if ( arg_cnt != 3 ) + goto Unexpected_OtherSubr; + + if ( decoder->flex_state == 0 || + decoder->num_flex_vectors != 7 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected flex end\n" )); + goto Syntax_Error; + } + + /* the two `results' are popped by the following setcurrentpoint */ + known_othersubr_result_cnt = 2; + break; + + case 3: /* change hints */ + if ( arg_cnt != 1 ) + goto Unexpected_OtherSubr; + + known_othersubr_result_cnt = 1; + + if ( hinter ) + hinter->reset( hinter->hints, builder->current->n_points ); + break; + + case 12: + case 13: + /* counter control hints, clear stack */ + top = decoder->stack; + break; + + case 14: + case 15: + case 16: + case 17: + case 18: /* multiple masters */ + { + PS_Blend blend = decoder->blend; + FT_UInt num_points, nn, mm; + FT_Long* delta; + FT_Long* values; + + + if ( !blend ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected multiple masters operator\n" )); + goto Syntax_Error; + } + + num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 ); + if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " incorrect number of multiple masters arguments\n" )); + goto Syntax_Error; + } + + /* we want to compute: */ + /* */ + /* a0*w0 + a1*w1 + ... + ak*wk */ + /* */ + /* but we only have the a0, a1-a0, a2-a0, .. ak-a0 */ + /* however, given that w0 + w1 + ... + wk == 1, we can */ + /* rewrite it easily as: */ + /* */ + /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + .. + (ak-a0)*wk */ + /* */ + /* where k == num_designs-1 */ + /* */ + /* I guess that's why it's written in this `compact' */ + /* form. */ + /* */ + delta = top + num_points; + values = top; + for ( nn = 0; nn < num_points; nn++ ) + { + FT_Long tmp = values[0]; + + + for ( mm = 1; mm < blend->num_designs; mm++ ) + tmp += FT_MulFix( *delta++, blend->weight_vector[mm] ); + + *values++ = tmp; + } + + known_othersubr_result_cnt = num_points; + break; + } + + case 19: + /* <idx> 1 19 callothersubr */ + /* => replace elements starting from index cvi( <idx> ) */ + /* of BuildCharArray with WeightVector */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = (FT_Int)( top[0] >> 16 ); + + if ( idx < 0 || + idx + blend->num_designs > decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + ft_memcpy( &decoder->buildchar[idx], + blend->weight_vector, + blend->num_designs * + sizeof( blend->weight_vector[0] ) ); + } + break; + + case 20: + /* <arg1> <arg2> 2 20 callothersubr pop */ + /* ==> push <arg1> + <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] += top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + + case 21: + /* <arg1> <arg2> 2 21 callothersubr pop */ + /* ==> push <arg1> - <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] -= top[1]; /* XXX (over|under)flow */ + + known_othersubr_result_cnt = 1; + break; + + case 22: + /* <arg1> <arg2> 2 22 callothersubr pop */ + /* ==> push <arg1> * <arg2> onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] = FT_MulFix( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 23: + /* <arg1> <arg2> 2 23 callothersubr pop */ + /* ==> push <arg1> / <arg2> onto T1 stack */ + if ( arg_cnt != 2 || top[1] == 0 ) + goto Unexpected_OtherSubr; + + top[0] = FT_DivFix( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 24: + /* <val> <idx> 2 24 callothersubr */ + /* ==> set BuildCharArray[cvi( <idx> )] = <val> */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 2 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = (FT_Int)( top[1] >> 16 ); + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + decoder->buildchar[idx] = top[0]; + } + break; + + case 25: + /* <idx> 1 25 callothersubr pop */ + /* ==> push BuildCharArray[cvi( idx )] */ + /* onto T1 stack */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || blend == NULL ) + goto Unexpected_OtherSubr; + + idx = (FT_Int)( top[0] >> 16 ); + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + top[0] = decoder->buildchar[idx]; + } + + known_othersubr_result_cnt = 1; + break; + +#if 0 + case 26: + /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */ + /* leave mark on T1 stack */ + /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */ + XXX which routine has left its mark on the (PostScript) stack?; + break; +#endif + + case 27: + /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */ + /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */ + /* otherwise push <res2> */ + if ( arg_cnt != 4 ) + goto Unexpected_OtherSubr; + + if ( top[2] > top[3] ) + top[0] = top[1]; + + known_othersubr_result_cnt = 1; + break; + + case 28: + /* 0 28 callothersubr pop */ + /* => push random value from interval [0, 1) onto stack */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + { + FT_Fixed Rand; + + + Rand = seed; + if ( Rand >= 0x8000L ) + Rand++; + + top[0] = Rand; + + seed = FT_MulFix( seed, 0x10000L - seed ); + if ( seed == 0 ) + seed += 0x2873; + } + + known_othersubr_result_cnt = 1; + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unknown othersubr [%d %d], wish me luck\n", + arg_cnt, subr_no )); + unknown_othersubr_result_cnt = arg_cnt; + break; + + Unexpected_OtherSubr: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid othersubr [%d %d]\n", arg_cnt, subr_no )); + goto Syntax_Error; + } + + top += known_othersubr_result_cnt; + + decoder->top = top; + } + else /* general operator */ + { + FT_Int num_args = t1_args_count[op]; + + + FT_ASSERT( num_args >= 0 ); + + if ( top - decoder->stack < num_args ) + goto Stack_Underflow; + + /* XXX Operators usually take their operands from the */ + /* bottom of the stack, i.e., the operands are */ + /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */ + /* only div, callsubr, and callothersubr are different. */ + /* In practice it doesn't matter (?). */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + switch ( op ) + { + case op_callsubr: + case op_div: + case op_callothersubr: + case op_pop: + case op_return: + break; + + default: + if ( top - decoder->stack != num_args ) + FT_TRACE0(( "t1_decoder_parse_charstrings:" + " too much operands on the stack" + " (seen %d, expected %d)\n", + top - decoder->stack, num_args )); + break; + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + top -= num_args; + + switch ( op ) + { + case op_endchar: + FT_TRACE4(( " endchar\n" )); + + close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* the compiler should optimize away this empty loop but ... */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( decoder->len_buildchar > 0 ) + { + FT_UInt i; + + + FT_TRACE4(( "BuildCharArray = [ " )); + + for ( i = 0; i < decoder->len_buildchar; ++i ) + FT_TRACE4(( "%d ", decoder->buildchar[ i ] )); + + FT_TRACE4(( "]\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + FT_TRACE4(( "\n" )); + + /* return now! */ + return PSaux_Err_Ok; + + case op_hsbw: + FT_TRACE4(( " hsbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x += top[0]; + builder->advance.x = top[1]; + builder->advance.y = 0; + + orig_x = x = builder->pos_x + top[0]; + orig_y = y = builder->pos_y; + + FT_UNUSED( orig_y ); + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + return PSaux_Err_Ok; + + break; + + case op_seac: + return t1operator_seac( decoder, + top[0], + top[1], + top[2], + (FT_Int)( top[3] >> 16 ), + (FT_Int)( top[4] >> 16 ) ); + + case op_sbw: + FT_TRACE4(( " sbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x += top[0]; + builder->left_bearing.y += top[1]; + builder->advance.x = top[2]; + builder->advance.y = top[3]; + + x = builder->pos_x + top[0]; + y = builder->pos_y + top[1]; + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + return PSaux_Err_Ok; + + break; + + case op_closepath: + FT_TRACE4(( " closepath" )); + + /* if there is no path, `closepath' is a no-op */ + if ( builder->parse_state == T1_Parse_Have_Path || + builder->parse_state == T1_Parse_Have_Moveto ) + close_contour( builder ); + + builder->parse_state = T1_Parse_Have_Width; + break; + + case op_hlineto: + FT_TRACE4(( " hlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + x += top[0]; + goto Add_Line; + + case op_hmoveto: + FT_TRACE4(( " hmoveto" )); + + x += top[0]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_hvcurveto: + FT_TRACE4(( " hvcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + x += top[0]; + add_point( builder, x, y, 0 ); + x += top[1]; + y += top[2]; + add_point( builder, x, y, 0 ); + y += top[3]; + add_point( builder, x, y, 1 ); + break; + + case op_rlineto: + FT_TRACE4(( " rlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + x += top[0]; + y += top[1]; + + Add_Line: + if ( add_point1( builder, x, y ) ) + goto Fail; + break; + + case op_rmoveto: + FT_TRACE4(( " rmoveto" )); + + x += top[0]; + y += top[1]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_rrcurveto: + FT_TRACE4(( " rrcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + x += top[0]; + y += top[1]; + add_point( builder, x, y, 0 ); + + x += top[2]; + y += top[3]; + add_point( builder, x, y, 0 ); + + x += top[4]; + y += top[5]; + add_point( builder, x, y, 1 ); + break; + + case op_vhcurveto: + FT_TRACE4(( " vhcurveto" )); + + if ( start_point( builder, x, y ) || + check_points( builder, 3 ) ) + goto Fail; + + y += top[0]; + add_point( builder, x, y, 0 ); + x += top[1]; + y += top[2]; + add_point( builder, x, y, 0 ); + x += top[3]; + add_point( builder, x, y, 1 ); + break; + + case op_vlineto: + FT_TRACE4(( " vlineto" )); + + if ( start_point( builder, x, y ) ) + goto Fail; + + y += top[0]; + goto Add_Line; + + case op_vmoveto: + FT_TRACE4(( " vmoveto" )); + + y += top[0]; + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_div: + FT_TRACE4(( " div" )); + + /* if `large_int' is set, we divide unscaled numbers; */ + /* otherwise, we divide numbers in 16.16 format -- */ + /* in both cases, it is the same operation */ + *top = FT_DivFix( top[0], top[1] ); + ++top; + + large_int = FALSE; + break; + + case op_callsubr: + { + FT_Int idx; + + + FT_TRACE4(( " callsubr" )); + + idx = (FT_Int)( top[0] >> 16 ); + if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + zone->base = decoder->subrs[idx]; + + if ( decoder->subrs_len ) + zone->limit = zone->base + decoder->subrs_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + zone->limit = decoder->subrs[idx + 1]; + } + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + break; + } + + case op_pop: + FT_TRACE4(( " pop" )); + + if ( known_othersubr_result_cnt > 0 ) + { + known_othersubr_result_cnt--; + /* ignore, we pushed the operands ourselves */ + break; + } + + if ( unknown_othersubr_result_cnt == 0 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no more operands for othersubr\n" )); + goto Syntax_Error; + } + + unknown_othersubr_result_cnt--; + top++; /* `push' the operand to callothersubr onto the stack */ + break; + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + + case op_dotsection: + FT_TRACE4(( " dotsection" )); + + break; + + case op_hstem: + FT_TRACE4(( " hstem" )); + + /* record horizontal hint */ + if ( hinter ) + { + /* top[0] += builder->left_bearing.y; */ + hinter->stem( hinter->hints, 1, top ); + } + break; + + case op_hstem3: + FT_TRACE4(( " hstem3" )); + + /* record horizontal counter-controlled hints */ + if ( hinter ) + hinter->stem3( hinter->hints, 1, top ); + break; + + case op_vstem: + FT_TRACE4(( " vstem" )); + + /* record vertical hint */ + if ( hinter ) + { + top[0] += orig_x; + hinter->stem( hinter->hints, 0, top ); + } + break; + + case op_vstem3: + FT_TRACE4(( " vstem3" )); + + /* record vertical counter-controlled hints */ + if ( hinter ) + { + FT_Pos dx = orig_x; + + + top[0] += dx; + top[2] += dx; + top[4] += dx; + hinter->stem3( hinter->hints, 0, top ); + } + break; + + case op_setcurrentpoint: + FT_TRACE4(( " setcurrentpoint" )); + + /* From the T1 specification, section 6.4: */ + /* */ + /* The setcurrentpoint command is used only in */ + /* conjunction with results from OtherSubrs procedures. */ + + /* known_othersubr_result_cnt != 0 is already handled */ + /* above. */ + + /* Note, however, that both Ghostscript and Adobe */ + /* Distiller handle this situation by silently ignoring */ + /* the inappropriate `setcurrentpoint' instruction. So */ + /* we do the same. */ +#if 0 + + if ( decoder->flex_state != 1 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected `setcurrentpoint'\n" )); + goto Syntax_Error; + } + else +#endif + decoder->flex_state = 0; + break; + + case op_unknown15: + FT_TRACE4(( " opcode_15" )); + /* nothing to do except to pop the two arguments */ + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unhandled opcode %d\n", op )); + goto Syntax_Error; + } + + /* XXX Operators usually clear the operand stack; */ + /* only div, callsubr, callothersubr, pop, and */ + /* return are different. */ + /* In practice it doesn't matter (?). */ + + decoder->top = top; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( "\n" )); + bol = TRUE; +#endif + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + Fail: + return error; + + Syntax_Error: + return PSaux_Err_Syntax_Error; + + Stack_Underflow: + return PSaux_Err_Stack_Underflow; + } + + + /* parse a single Type 1 glyph */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph ) + { + return decoder->parse_callback( decoder, glyph ); + } + + + /* initialize T1 decoder */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_callback ) + { + FT_MEM_ZERO( decoder, sizeof ( *decoder ) ); + + /* retrieve PSNames interface from list of current modules */ + { + FT_Service_PsCMaps psnames = 0; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + { + FT_ERROR(( "t1_decoder_init:" + " the `psnames' module is not available\n" )); + return PSaux_Err_Unimplemented_Feature; + } + + decoder->psnames = psnames; + } + + t1_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* decoder->buildchar and decoder->len_buildchar have to be */ + /* initialized by the caller since we cannot know the length */ + /* of the BuildCharArray */ + + decoder->num_glyphs = (FT_UInt)face->num_glyphs; + decoder->glyph_names = glyph_names; + decoder->hint_mode = hint_mode; + decoder->blend = blend; + decoder->parse_callback = parse_callback; + + decoder->funcs = t1_decoder_funcs; + + return PSaux_Err_Ok; + } + + + /* finalize T1 decoder */ + FT_LOCAL_DEF( void ) + t1_decoder_done( T1_Decoder decoder ) + { + t1_builder_done( &decoder->builder ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psaux/t1decode.h b/alienblaster/project/jni/freetype/src/psaux/t1decode.h new file mode 100644 index 000000000..00728db50 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psaux/t1decode.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* t1decode.h */ +/* */ +/* PostScript Type 1 decoding routines (specification). */ +/* */ +/* Copyright 2000-2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1DECODE_H__ +#define __T1DECODE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + FT_CALLBACK_TABLE + const T1_Decoder_FuncsRec t1_decoder_funcs; + + + FT_LOCAL( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph_index ); + + FT_LOCAL( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); + + FT_LOCAL( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_glyph ); + + FT_LOCAL( void ) + t1_decoder_done( T1_Decoder decoder ); + + +FT_END_HEADER + +#endif /* __T1DECODE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/Jamfile b/alienblaster/project/jni/freetype/src/pshinter/Jamfile new file mode 100644 index 000000000..779f1b0b8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/pshinter Jamfile +# +# Copyright 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) pshinter ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = pshrec pshglob pshalgo pshmod pshpic ; + } + else + { + _sources = pshinter ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/pshinter Jamfile diff --git a/alienblaster/project/jni/freetype/src/pshinter/module.mk b/alienblaster/project/jni/freetype/src/pshinter/module.mk new file mode 100644 index 000000000..ed24eb7fa --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSHinter module definition +# + + +# Copyright 1996-2001, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSHINTER_MODULE + +define PSHINTER_MODULE +$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)pshinter $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshalgo.c b/alienblaster/project/jni/freetype/src/pshinter/pshalgo.c new file mode 100644 index 000000000..417dcee54 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshalgo.c @@ -0,0 +1,2302 @@ +/***************************************************************************/ +/* */ +/* pshalgo.c */ +/* */ +/* PostScript hinting algorithm (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include "pshalgo.h" + +#include "pshnterr.h" + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pshalgo2 + + +#ifdef DEBUG_HINTER + PSH_Hint_Table ps_debug_hint_table = 0; + PSH_HintFunc ps_debug_hint_func = 0; + PSH_Glyph ps_debug_glyph = 0; +#endif + + +#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ + /* and similar glyphs */ +#define STRONGER /* slightly increase the contrast of smooth */ + /* hinting */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC HINTS RECORDINGS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* return true if two stem hints overlap */ + static FT_Int + psh_hint_overlap( PSH_Hint hint1, + PSH_Hint hint2 ) + { + return hint1->org_pos + hint1->org_len >= hint2->org_pos && + hint2->org_pos + hint2->org_len >= hint1->org_pos; + } + + + /* destroy hints table */ + static void + psh_hint_table_done( PSH_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->zones ); + table->num_zones = 0; + table->zone = 0; + + FT_FREE( table->sort ); + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + table->sort_global = 0; + } + + + /* deactivate all hints in a table */ + static void + psh_hint_table_deactivate( PSH_Hint_Table table ) + { + FT_UInt count = table->max_hints; + PSH_Hint hint = table->hints; + + + for ( ; count > 0; count--, hint++ ) + { + psh_hint_deactivate( hint ); + hint->order = -1; + } + } + + + /* internal function to record a new hint */ + static void + psh_hint_table_record( PSH_Hint_Table table, + FT_UInt idx ) + { + PSH_Hint hint = table->hints + idx; + + + if ( idx >= table->max_hints ) + { + FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx )); + return; + } + + /* ignore active hints */ + if ( psh_hint_is_active( hint ) ) + return; + + psh_hint_activate( hint ); + + /* now scan the current active hint set to check */ + /* whether `hint' overlaps with another hint */ + { + PSH_Hint* sorted = table->sort_global; + FT_UInt count = table->num_hints; + PSH_Hint hint2; + + + hint->parent = 0; + for ( ; count > 0; count--, sorted++ ) + { + hint2 = sorted[0]; + + if ( psh_hint_overlap( hint, hint2 ) ) + { + hint->parent = hint2; + break; + } + } + } + + if ( table->num_hints < table->max_hints ) + table->sort_global[table->num_hints++] = hint; + else + FT_TRACE0(( "psh_hint_table_record: too many sorted hints! BUG!\n" )); + } + + + static void + psh_hint_table_record_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit; + + + limit = hint_mask->num_bits; + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + psh_hint_table_record( table, idx ); + + mask >>= 1; + } + } + + + /* create hints table */ + static FT_Error + psh_hint_table_init( PSH_Hint_Table table, + PS_Hint_Table hints, + PS_Mask_Table hint_masks, + PS_Mask_Table counter_masks, + FT_Memory memory ) + { + FT_UInt count; + FT_Error error; + + FT_UNUSED( counter_masks ); + + + count = hints->num_hints; + + /* allocate our tables */ + if ( FT_NEW_ARRAY( table->sort, 2 * count ) || + FT_NEW_ARRAY( table->hints, count ) || + FT_NEW_ARRAY( table->zones, 2 * count + 1 ) ) + goto Exit; + + table->max_hints = count; + table->sort_global = table->sort + count; + table->num_hints = 0; + table->num_zones = 0; + table->zone = 0; + + /* initialize the `table->hints' array */ + { + PSH_Hint write = table->hints; + PS_Hint read = hints->hints; + + + for ( ; count > 0; count--, write++, read++ ) + { + write->org_pos = read->pos; + write->org_len = read->len; + write->flags = read->flags; + } + } + + /* we now need to determine the initial `parent' stems; first */ + /* activate the hints that are given by the initial hint masks */ + if ( hint_masks ) + { + PS_Mask mask = hint_masks->masks; + + + count = hint_masks->num_masks; + table->hint_masks = hint_masks; + + for ( ; count > 0; count--, mask++ ) + psh_hint_table_record_mask( table, mask ); + } + + /* finally, do a linear parse in case some hints were left alone */ + if ( table->num_hints != table->max_hints ) + { + FT_UInt idx; + + + FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" )); + + count = table->max_hints; + for ( idx = 0; idx < count; idx++ ) + psh_hint_table_record( table, idx ); + } + + Exit: + return error; + } + + + static void + psh_hint_table_activate_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit, count; + + + limit = hint_mask->num_bits; + count = 0; + + psh_hint_table_deactivate( table ); + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + { + PSH_Hint hint = &table->hints[idx]; + + + if ( !psh_hint_is_active( hint ) ) + { + FT_UInt count2; + +#if 0 + PSH_Hint* sort = table->sort; + PSH_Hint hint2; + + + for ( count2 = count; count2 > 0; count2--, sort++ ) + { + hint2 = sort[0]; + if ( psh_hint_overlap( hint, hint2 ) ) + FT_TRACE0(( "psh_hint_table_activate_mask:" + " found overlapping hints\n" )) + } +#else + count2 = 0; +#endif + + if ( count2 == 0 ) + { + psh_hint_activate( hint ); + if ( count < table->max_hints ) + table->sort[count++] = hint; + else + FT_TRACE0(( "psh_hint_tableactivate_mask:" + " too many active hints\n" )); + } + } + } + + mask >>= 1; + } + table->num_hints = count; + + /* now, sort the hints; they are guaranteed to not overlap */ + /* so we can compare their "org_pos" field directly */ + { + FT_Int i1, i2; + PSH_Hint hint1, hint2; + PSH_Hint* sort = table->sort; + + + /* a simple bubble sort will do, since in 99% of cases, the hints */ + /* will be already sorted -- and the sort will be linear */ + for ( i1 = 1; i1 < (FT_Int)count; i1++ ) + { + hint1 = sort[i1]; + for ( i2 = i1 - 1; i2 >= 0; i2-- ) + { + hint2 = sort[i2]; + + if ( hint2->org_pos < hint1->org_pos ) + break; + + sort[i2 + 1] = hint2; + sort[i2] = hint1; + } + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTS GRID-FITTING AND OPTIMIZATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 1 + static FT_Pos + psh_dimension_quantize_len( PSH_Dimension dim, + FT_Pos len, + FT_Bool do_snapping ) + { + if ( len <= 64 ) + len = 64; + else + { + FT_Pos delta = len - dim->stdw.widths[0].cur; + + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + len = dim->stdw.widths[0].cur; + if ( len < 48 ) + len = 48; + } + + if ( len < 3 * 64 ) + { + delta = ( len & 63 ); + len &= -64; + + if ( delta < 10 ) + len += delta; + + else if ( delta < 32 ) + len += 10; + + else if ( delta < 54 ) + len += 54; + + else + len += delta; + } + else + len = FT_PIX_ROUND( len ); + } + + if ( do_snapping ) + len = FT_PIX_ROUND( len ); + + return len; + } +#endif /* 0 */ + + +#ifdef DEBUG_HINTER + + static void + ps_simple_scale( PSH_Hint_Table table, + FT_Fixed scale, + FT_Fixed delta, + FT_Int dimension ) + { + PSH_Hint hint; + FT_UInt count; + + + for ( count = 0; count < table->max_hints; count++ ) + { + hint = table->hints + count; + + hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta; + hint->cur_len = FT_MulFix( hint->org_len, scale ); + + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); + } + } + +#endif /* DEBUG_HINTER */ + + + static FT_Fixed + psh_hint_snap_stem_side_delta( FT_Fixed pos, + FT_Fixed len ) + { + FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; + FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; + + + if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) ) + return delta1; + else + return delta2; + } + + + static void + psh_hint_align( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Int do_snapping; + FT_Pos fit_len; + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + /* perform stem snapping when requested - this is necessary + * for monochrome and LCD hinting modes only + */ + do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) || + ( dimension == 1 && glyph->do_vert_snapping ); + + hint->cur_len = fit_len = len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + hint->org_pos + hint->org_len, + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align( parent, globals, dimension, glyph ); + + /* keep original relation between hints, this is, use the */ + /* scaled distance between the centers of the hints to */ + /* compute the new position */ + par_org_center = parent->org_pos + ( parent->org_len >> 1 ); + par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 ); + cur_org_center = hint->org_pos + ( hint->org_len >> 1 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + hint->cur_pos = pos; + hint->cur_len = fit_len; + + /* Stem adjustment tries to snap stem widths to standard + * ones. This is important to prevent unpleasant rounding + * artefacts. + */ + if ( glyph->do_stem_adjust ) + { + if ( len <= 64 ) + { + /* the stem is less than one pixel; we will center it + * around the nearest pixel center + */ + if ( len >= 32 ) + { + /* This is a special case where we also widen the stem + * and align it to the pixel grid. + * + * stem_center = pos + (len/2) + * nearest_pixel_center = FT_ROUND(stem_center-32)+32 + * new_pos = nearest_pixel_center-32 + * = FT_ROUND(stem_center-32) + * = FT_FLOOR(stem_center-32+32) + * = FT_FLOOR(stem_center) + * new_len = 64 + */ + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); + len = 64; + } + else if ( len > 0 ) + { + /* This is a very small stem; we simply align it to the + * pixel grid, trying to find the minimal displacement. + * + * left = pos + * right = pos + len + * left_nearest_edge = ROUND(pos) + * right_nearest_edge = ROUND(right) + * + * if ( ABS(left_nearest_edge - left) <= + * ABS(right_nearest_edge - right) ) + * new_pos = left + * else + * new_pos = right + */ + FT_Pos left_nearest = FT_PIX_ROUND( pos ); + FT_Pos right_nearest = FT_PIX_ROUND( pos + len ); + FT_Pos left_disp = left_nearest - pos; + FT_Pos right_disp = right_nearest - ( pos + len ); + + + if ( left_disp < 0 ) + left_disp = -left_disp; + if ( right_disp < 0 ) + right_disp = -right_disp; + if ( left_disp <= right_disp ) + pos = left_nearest; + else + pos = right_nearest; + } + else + { + /* this is a ghost stem; we simply round it */ + pos = FT_PIX_ROUND( pos ); + } + } + else + { + len = psh_dimension_quantize_len( dim, len, 0 ); + } + } + + /* now that we have a good hinted stem width, try to position */ + /* the stem along a pixel grid integer coordinate */ + hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len ); + hint->cur_len = len; + } + } + + if ( do_snapping ) + { + pos = hint->cur_pos; + len = hint->cur_len; + + if ( len < 64 ) + len = 64; + else + len = FT_PIX_ROUND( len ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + hint->cur_pos = align.align_top - len; + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT: + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP: + /* don't touch */ + break; + + + default: + hint->cur_len = len; + if ( len & 64 ) + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; + else + pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); + + hint->cur_pos = pos - ( len >> 1 ); + hint->cur_len = len; + } + } + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + + +#if 0 /* not used for now, experimental */ + + /* + * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT) + * of stems + */ + static void + psh_hint_align_light( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Pos fit_len; + + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + fit_len = len; + + hint->cur_len = fit_len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + hint->org_pos + hint->org_len, + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align_light( parent, globals, dimension, glyph ); + + par_org_center = parent->org_pos + ( parent->org_len / 2 ); + par_cur_center = parent->cur_pos + ( parent->cur_len / 2 ); + cur_org_center = hint->org_pos + ( hint->org_len / 2 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + /* Stems less than one pixel wide are easy -- we want to + * make them as dark as possible, so they must fall within + * one pixel. If the stem is split between two pixels + * then snap the edge that is nearer to the pixel boundary + * to the pixel boundary. + */ + if ( len <= 64 ) + { + if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 ) + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + + /* Position stems other to minimize the amount of mid-grays. + * There are, in general, two positions that do this, + * illustrated as A) and B) below. + * + * + + + + + * + * A) |--------------------------------| + * B) |--------------------------------| + * C) |--------------------------------| + * + * Position A) (split the excess stem equally) should be better + * for stems of width N + f where f < 0.5. + * + * Position B) (split the deficiency equally) should be better + * for stems of width N + f where f > 0.5. + * + * It turns out though that minimizing the total number of lit + * pixels is also important, so position C), with one edge + * aligned with a pixel boundary is actually preferable + * to A). There are also more possibile positions for C) than + * for A) or B), so it involves less distortion of the overall + * character shape. + */ + else /* len > 64 */ + { + FT_Fixed frac_len = len & 63; + FT_Fixed center = pos + ( len >> 1 ); + FT_Fixed delta_a, delta_b; + + + if ( ( len / 64 ) & 1 ) + { + delta_a = FT_PIX_FLOOR( center ) + 32 - center; + delta_b = FT_PIX_ROUND( center ) - center; + } + else + { + delta_a = FT_PIX_ROUND( center ) - center; + delta_b = FT_PIX_FLOOR( center ) + 32 - center; + } + + /* We choose between B) and C) above based on the amount + * of fractinal stem width; for small amounts, choose + * C) always, for large amounts, B) always, and inbetween, + * pick whichever one involves less stem movement. + */ + if ( frac_len < 32 ) + { + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + else if ( frac_len < 48 ) + { + FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, + len ); + + if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) ) + pos += side_delta; + else + pos += delta_b; + } + else + { + pos += delta_b; + } + } + + hint->cur_pos = pos; + } + } /* switch */ + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + +#endif /* 0 */ + + + static void + psh_hint_table_align_hints( PSH_Hint_Table table, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Hint hint; + FT_UInt count; + +#ifdef DEBUG_HINTER + + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( ps_debug_no_vert_hints && dimension == 0 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + + if ( ps_debug_no_horz_hints && dimension == 1 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + +#endif /* DEBUG_HINTER*/ + + hint = table->hints; + count = table->max_hints; + + for ( ; count > 0; count--, hint++ ) + psh_hint_align( hint, globals, dimension, glyph ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** POINTS INTERPOLATION ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define PSH_ZONE_MIN -3200000L +#define PSH_ZONE_MAX +3200000L + +#define xxDEBUG_ZONES + + +#ifdef DEBUG_ZONES + +#include FT_CONFIG_STANDARD_LIBRARY_H + + static void + psh_print_zone( PSH_Zone zone ) + { + printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n", + zone->scale / 65536.0, + zone->delta / 64.0, + zone->min, + zone->max ); + } + +#else + +#define psh_print_zone( x ) do { } while ( 0 ) + +#endif /* DEBUG_ZONES */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTER GLYPH MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 1 + +#define psh_corner_is_flat ft_corner_is_flat +#define psh_corner_orientation ft_corner_orientation + +#else + + FT_LOCAL_DEF( FT_Int ) + psh_corner_is_flat( FT_Pos x_in, + FT_Pos y_in, + FT_Pos x_out, + FT_Pos y_out ) + { + FT_Pos ax = x_in; + FT_Pos ay = y_in; + + FT_Pos d_in, d_out, d_corner; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + d_in = ax + ay; + + ax = x_out; + if ( ax < 0 ) + ax = -ax; + ay = y_out; + if ( ay < 0 ) + ay = -ay; + d_out = ax + ay; + + ax = x_out + x_in; + if ( ax < 0 ) + ax = -ax; + ay = y_out + y_in; + if ( ay < 0 ) + ay = -ay; + d_corner = ax + ay; + + return ( d_in + d_out - d_corner ) < ( d_corner >> 4 ); + } + + static FT_Int + psh_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Int result; + + + /* deal with the trivial cases quickly */ + if ( in_y == 0 ) + { + if ( in_x >= 0 ) + result = out_y; + else + result = -out_y; + } + else if ( in_x == 0 ) + { + if ( in_y >= 0 ) + result = -out_x; + else + result = out_x; + } + else if ( out_y == 0 ) + { + if ( out_x >= 0 ) + result = in_y; + else + result = -in_y; + } + else if ( out_x == 0 ) + { + if ( out_y >= 0 ) + result = -in_x; + else + result = in_x; + } + else /* general case */ + { + long long delta = (long long)in_x * out_y - (long long)in_y * out_x; + + if ( delta == 0 ) + result = 0; + else + result = 1 - 2 * ( delta < 0 ); + } + + return result; + } + +#endif /* !1 */ + + +#ifdef COMPUTE_INFLEXS + + /* compute all inflex points in a given glyph */ + static void + psh_glyph_compute_inflections( PSH_Glyph glyph ) + { + FT_UInt n; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first, start, end, before, after; + FT_Pos in_x, in_y, out_x, out_y; + FT_Int orient_prev, orient_cur; + FT_Int finished = 0; + + + /* we need at least 4 points to create an inflection point */ + if ( glyph->contours[n].count < 4 ) + continue; + + /* compute first segment in contour */ + first = glyph->contours[n].start; + + start = end = first; + do + { + end = end->next; + if ( end == first ) + goto Skip; + + in_x = end->org_u - start->org_u; + in_y = end->org_v - start->org_v; + + } while ( in_x == 0 && in_y == 0 ); + + /* extend the segment start whenever possible */ + before = start; + do + { + do + { + start = before; + before = before->prev; + if ( before == first ) + goto Skip; + + out_x = start->org_u - before->org_u; + out_y = start->org_v - before->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_prev == 0 ); + + first = start; + in_x = out_x; + in_y = out_y; + + /* now, process all segments in the contour */ + do + { + /* first, extend current segment's end whenever possible */ + after = end; + do + { + do + { + end = after; + after = after->next; + if ( after == first ) + finished = 1; + + out_x = after->org_u - end->org_u; + out_y = after->org_v - end->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_cur == 0 ); + + if ( ( orient_cur ^ orient_prev ) < 0 ) + { + do + { + psh_point_set_inflex( start ); + start = start->next; + } + while ( start != end ); + + psh_point_set_inflex( start ); + } + + start = end; + end = after; + orient_prev = orient_cur; + in_x = out_x; + in_y = out_y; + + } while ( !finished ); + + Skip: + ; + } + } + +#endif /* COMPUTE_INFLEXS */ + + + static void + psh_glyph_done( PSH_Glyph glyph ) + { + FT_Memory memory = glyph->memory; + + + psh_hint_table_done( &glyph->hint_tables[1], memory ); + psh_hint_table_done( &glyph->hint_tables[0], memory ); + + FT_FREE( glyph->points ); + FT_FREE( glyph->contours ); + + glyph->num_points = 0; + glyph->num_contours = 0; + + glyph->memory = 0; + } + + + static int + psh_compute_dir( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ax, ay; + int result = PSH_DIR_NONE; + + + ax = ( dx >= 0 ) ? dx : -dx; + ay = ( dy >= 0 ) ? dy : -dy; + + if ( ay * 12 < ax ) + { + /* |dy| <<< |dx| means a near-horizontal segment */ + result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT; + } + else if ( ax * 12 < ay ) + { + /* |dx| <<< |dy| means a near-vertical segment */ + result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN; + } + + return result; + } + + + /* load outline point coordinates into hinter glyph */ + static void + psh_glyph_load_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_Vector* vec = glyph->outline->points; + PSH_Point point = glyph->points; + FT_UInt count = glyph->num_points; + + + for ( ; count > 0; count--, point++, vec++ ) + { + point->flags2 = 0; + point->hint = NULL; + if ( dimension == 0 ) + { + point->org_u = vec->x; + point->org_v = vec->y; + } + else + { + point->org_u = vec->y; + point->org_v = vec->x; + } + +#ifdef DEBUG_HINTER + point->org_x = vec->x; + point->org_y = vec->y; +#endif + + } + } + + + /* save hinted point coordinates back to outline */ + static void + psh_glyph_save_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_UInt n; + PSH_Point point = glyph->points; + FT_Vector* vec = glyph->outline->points; + char* tags = glyph->outline->tags; + + + for ( n = 0; n < glyph->num_points; n++ ) + { + if ( dimension == 0 ) + vec[n].x = point->cur_u; + else + vec[n].y = point->cur_u; + + if ( psh_point_is_strong( point ) ) + tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 ); + +#ifdef DEBUG_HINTER + + if ( dimension == 0 ) + { + point->cur_x = point->cur_u; + point->flags_x = point->flags2 | point->flags; + } + else + { + point->cur_y = point->cur_u; + point->flags_y = point->flags2 | point->flags; + } + +#endif + + point++; + } + } + + + static FT_Error + psh_glyph_init( PSH_Glyph glyph, + FT_Outline* outline, + PS_Hints ps_hints, + PSH_Globals globals ) + { + FT_Error error; + FT_Memory memory; + + + /* clear all fields */ + FT_MEM_ZERO( glyph, sizeof ( *glyph ) ); + + memory = glyph->memory = globals->memory; + + /* allocate and setup points + contours arrays */ + if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) || + FT_NEW_ARRAY( glyph->contours, outline->n_contours ) ) + goto Exit; + + glyph->num_points = outline->n_points; + glyph->num_contours = outline->n_contours; + + { + FT_UInt first = 0, next, n; + PSH_Point points = glyph->points; + PSH_Contour contour = glyph->contours; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + FT_Int count; + PSH_Point point; + + + next = outline->contours[n] + 1; + count = next - first; + + contour->start = points + first; + contour->count = (FT_UInt)count; + + if ( count > 0 ) + { + point = points + first; + + point->prev = points + next - 1; + point->contour = contour; + + for ( ; count > 1; count-- ) + { + point[0].next = point + 1; + point[1].prev = point; + point++; + point->contour = contour; + } + point->next = points + first; + } + + contour++; + first = next; + } + } + + { + PSH_Point points = glyph->points; + PSH_Point point = points; + FT_Vector* vec = outline->points; + FT_UInt n; + + + for ( n = 0; n < glyph->num_points; n++, point++ ) + { + FT_Int n_prev = (FT_Int)( point->prev - points ); + FT_Int n_next = (FT_Int)( point->next - points ); + FT_Pos dxi, dyi, dxo, dyo; + + + if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) ) + point->flags = PSH_POINT_OFF; + + dxi = vec[n].x - vec[n_prev].x; + dyi = vec[n].y - vec[n_prev].y; + + point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi ); + + dxo = vec[n_next].x - vec[n].x; + dyo = vec[n_next].y - vec[n].y; + + point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo ); + + /* detect smooth points */ + if ( point->flags & PSH_POINT_OFF ) + point->flags |= PSH_POINT_SMOOTH; + + else if ( point->dir_in == point->dir_out ) + { + if ( point->dir_out != PSH_DIR_NONE || + psh_corner_is_flat( dxi, dyi, dxo, dyo ) ) + point->flags |= PSH_POINT_SMOOTH; + } + } + } + + glyph->outline = outline; + glyph->globals = globals; + +#ifdef COMPUTE_INFLEXS + psh_glyph_load_points( glyph, 0 ); + psh_glyph_compute_inflections( glyph ); +#endif /* COMPUTE_INFLEXS */ + + /* now deal with hints tables */ + error = psh_hint_table_init( &glyph->hint_tables [0], + &ps_hints->dimension[0].hints, + &ps_hints->dimension[0].masks, + &ps_hints->dimension[0].counters, + memory ); + if ( error ) + goto Exit; + + error = psh_hint_table_init( &glyph->hint_tables [1], + &ps_hints->dimension[1].hints, + &ps_hints->dimension[1].masks, + &ps_hints->dimension[1].counters, + memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* compute all extrema in a glyph for a given dimension */ + static void + psh_glyph_compute_extrema( PSH_Glyph glyph ) + { + FT_UInt n; + + + /* first of all, compute all local extrema */ + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first = glyph->contours[n].start; + PSH_Point point, before, after; + + + if ( glyph->contours[n].count == 0 ) + continue; + + point = first; + before = point; + after = point; + + do + { + before = before->prev; + if ( before == first ) + goto Skip; + + } while ( before->org_u == point->org_u ); + + first = point = before->next; + + for (;;) + { + after = point; + do + { + after = after->next; + if ( after == first ) + goto Next; + + } while ( after->org_u == point->org_u ); + + if ( before->org_u < point->org_u ) + { + if ( after->org_u < point->org_u ) + { + /* local maximum */ + goto Extremum; + } + } + else /* before->org_u > point->org_u */ + { + if ( after->org_u > point->org_u ) + { + /* local minimum */ + Extremum: + do + { + psh_point_set_extremum( point ); + point = point->next; + + } while ( point != after ); + } + } + + before = after->prev; + point = after; + + } /* for */ + + Next: + ; + } + + /* for each extremum, determine its direction along the */ + /* orthogonal axis */ + for ( n = 0; n < glyph->num_points; n++ ) + { + PSH_Point point, before, after; + + + point = &glyph->points[n]; + before = point; + after = point; + + if ( psh_point_is_extremum( point ) ) + { + do + { + before = before->prev; + if ( before == point ) + goto Skip; + + } while ( before->org_v == point->org_v ); + + do + { + after = after->next; + if ( after == point ) + goto Skip; + + } while ( after->org_v == point->org_v ); + } + + if ( before->org_v < point->org_v && + after->org_v > point->org_v ) + { + psh_point_set_positive( point ); + } + else if ( before->org_v > point->org_v && + after->org_v < point->org_v ) + { + psh_point_set_negative( point ); + } + + Skip: + ; + } + } + + + /* major_dir is the direction for points on the bottom/left of the stem; */ + /* Points on the top/right of the stem will have a direction of */ + /* -major_dir. */ + + static void + psh_hint_table_find_strong_points( PSH_Hint_Table table, + PSH_Point point, + FT_UInt count, + FT_Int threshold, + FT_Int major_dir ) + { + PSH_Hint* sort = table->sort; + FT_UInt num_hints = table->num_hints; + + + for ( ; count > 0; count--, point++ ) + { + FT_Int point_dir = 0; + FT_Pos org_u = point->org_u; + + + if ( psh_point_is_strong( point ) ) + continue; + + if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) ) + point_dir = point->dir_in; + + else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) ) + point_dir = point->dir_out; + + if ( point_dir ) + { + if ( point_dir == major_dir ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + break; + } + } + } + else if ( point_dir == -major_dir ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + break; + } + } + } + } + +#if 1 + else if ( psh_point_is_extremum( point ) ) + { + /* treat extrema as special cases for stem edge alignment */ + FT_UInt nn, min_flag, max_flag; + + + if ( major_dir == PSH_DIR_HORIZONTAL ) + { + min_flag = PSH_POINT_POSITIVE; + max_flag = PSH_POINT_NEGATIVE; + } + else + { + min_flag = PSH_POINT_NEGATIVE; + max_flag = PSH_POINT_POSITIVE; + } + + if ( point->flags2 & min_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + else if ( point->flags2 & max_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + + if ( point->hint == NULL ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + + + if ( org_u >= hint->org_pos && + org_u <= hint->org_pos + hint->org_len ) + { + point->hint = hint; + break; + } + } + } + } + +#endif /* 1 */ + } + } + + + /* the accepted shift for strong points in fractional pixels */ +#define PSH_STRONG_THRESHOLD 32 + + /* the maximum shift value in font units */ +#define PSH_STRONG_THRESHOLD_MAXIMUM 30 + + + /* find strong points in a glyph */ + static void + psh_glyph_find_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + /* a point is `strong' if it is located on a stem edge and */ + /* has an `in' or `out' tangent parallel to the hint's direction */ + + PSH_Hint_Table table = &glyph->hint_tables[dimension]; + PS_Mask mask = table->hint_masks->masks; + FT_UInt num_masks = table->hint_masks->num_masks; + FT_UInt first = 0; + FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL + : PSH_DIR_HORIZONTAL; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Int threshold; + + + threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale ); + if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM ) + threshold = PSH_STRONG_THRESHOLD_MAXIMUM; + + /* process secondary hints to `selected' points */ + if ( num_masks > 1 && glyph->num_points > 0 ) + { + first = mask->end_point; + mask++; + for ( ; num_masks > 1; num_masks--, mask++ ) + { + FT_UInt next; + FT_Int count; + + + next = mask->end_point; + count = next - first; + if ( count > 0 ) + { + PSH_Point point = glyph->points + first; + + + psh_hint_table_activate_mask( table, mask ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + first = next; + } + } + + /* process primary hints for all points */ + if ( num_masks == 1 ) + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + psh_hint_table_activate_mask( table, table->hint_masks->masks ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + + /* now, certain points may have been attached to a hint and */ + /* not marked as strong; update their flags then */ + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + if ( point->hint && !psh_point_is_strong( point ) ) + psh_point_set_strong( point ); + } + } + + + /* find points in a glyph which are in a blue zone and have `in' or */ + /* `out' tangents parallel to the horizontal axis */ + static void + psh_glyph_find_blue_points( PSH_Blues blues, + PSH_Glyph glyph ) + { + PSH_Blue_Table table; + PSH_Blue_Zone zone; + FT_UInt glyph_count = glyph->num_points; + FT_UInt blue_count; + PSH_Point point = glyph->points; + + + for ( ; glyph_count > 0; glyph_count--, point++ ) + { + FT_Pos y; + + + /* check tangents */ + if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) && + !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) ) + continue; + + /* skip strong points */ + if ( psh_point_is_strong( point ) ) + continue; + + y = point->org_u; + + /* look up top zones */ + table = &blues->normal_top; + blue_count = table->count; + zone = table->zones; + + for ( ; blue_count > 0; blue_count--, zone++ ) + { + FT_Pos delta = y - zone->org_bottom; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y <= zone->org_top + blues->blue_fuzz ) + if ( blues->no_overshoots || delta <= blues->blue_threshold ) + { + point->cur_u = zone->cur_bottom; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + + /* look up bottom zones */ + table = &blues->normal_bottom; + blue_count = table->count; + zone = table->zones + blue_count - 1; + + for ( ; blue_count > 0; blue_count--, zone-- ) + { + FT_Pos delta = zone->org_top - y; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y >= zone->org_bottom - blues->blue_fuzz ) + if ( blues->no_overshoots || delta < blues->blue_threshold ) + { + point->cur_u = zone->cur_top; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + } + } + + + /* interpolate strong points with the help of hinted coordinates */ + static void + psh_glyph_interpolate_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + { + PSH_Hint hint = point->hint; + + + if ( hint ) + { + FT_Pos delta; + + + if ( psh_point_is_edge_min( point ) ) + point->cur_u = hint->cur_pos; + + else if ( psh_point_is_edge_max( point ) ) + point->cur_u = hint->cur_pos + hint->cur_len; + + else + { + delta = point->org_u - hint->org_pos; + + if ( delta <= 0 ) + point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); + + else if ( delta >= hint->org_len ) + point->cur_u = hint->cur_pos + hint->cur_len + + FT_MulFix( delta - hint->org_len, scale ); + + else if ( hint->org_len > 0 ) + point->cur_u = hint->cur_pos + + FT_MulDiv( delta, hint->cur_len, + hint->org_len ); + else + point->cur_u = hint->cur_pos; + } + psh_point_set_fitted( point ); + } + } + } + + +#define PSH_MAX_STRONG_INTERNAL 16 + + static void + psh_glyph_interpolate_normal_points( PSH_Glyph glyph, + FT_Int dimension ) + { + +#if 1 + /* first technique: a point is strong if it is a local extremum */ + + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Memory memory = glyph->memory; + + PSH_Point* strongs = NULL; + PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL]; + FT_UInt num_strongs = 0; + + PSH_Point points = glyph->points; + PSH_Point points_end = points + glyph->num_points; + PSH_Point point; + + + /* first count the number of strong points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + num_strongs++; + } + + if ( num_strongs == 0 ) /* nothing to do here */ + return; + + /* allocate an array to store a list of points, */ + /* stored in increasing org_u order */ + if ( num_strongs <= PSH_MAX_STRONG_INTERNAL ) + strongs = strongs_0; + else + { + FT_Error error; + + + if ( FT_NEW_ARRAY( strongs, num_strongs ) ) + return; + } + + num_strongs = 0; + for ( point = points; point < points_end; point++ ) + { + PSH_Point* insert; + + + if ( !psh_point_is_strong( point ) ) + continue; + + for ( insert = strongs + num_strongs; insert > strongs; insert-- ) + { + if ( insert[-1]->org_u <= point->org_u ) + break; + + insert[0] = insert[-1]; + } + insert[0] = point; + num_strongs++; + } + + /* now try to interpolate all normal points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + continue; + + /* sometimes, some local extrema are smooth points */ + if ( psh_point_is_smooth( point ) ) + { + if ( point->dir_in == PSH_DIR_NONE || + point->dir_in != point->dir_out ) + continue; + + if ( !psh_point_is_extremum( point ) && + !psh_point_is_inflex( point ) ) + continue; + + point->flags &= ~PSH_POINT_SMOOTH; + } + + /* find best enclosing point coordinates then interpolate */ + { + PSH_Point before, after; + FT_UInt nn; + + + for ( nn = 0; nn < num_strongs; nn++ ) + if ( strongs[nn]->org_u > point->org_u ) + break; + + if ( nn == 0 ) /* point before the first strong point */ + { + after = strongs[0]; + + point->cur_u = after->cur_u + + FT_MulFix( point->org_u - after->org_u, + scale ); + } + else + { + before = strongs[nn - 1]; + + for ( nn = num_strongs; nn > 0; nn-- ) + if ( strongs[nn - 1]->org_u < point->org_u ) + break; + + if ( nn == num_strongs ) /* point is after last strong point */ + { + before = strongs[nn - 1]; + + point->cur_u = before->cur_u + + FT_MulFix( point->org_u - before->org_u, + scale ); + } + else + { + FT_Pos u; + + + after = strongs[nn]; + + /* now interpolate point between before and after */ + u = point->org_u; + + if ( u == before->org_u ) + point->cur_u = before->cur_u; + + else if ( u == after->org_u ) + point->cur_u = after->cur_u; + + else + point->cur_u = before->cur_u + + FT_MulDiv( u - before->org_u, + after->cur_u - before->cur_u, + after->org_u - before->org_u ); + } + } + psh_point_set_fitted( point ); + } + } + + if ( strongs != strongs_0 ) + FT_FREE( strongs ); + +#endif /* 1 */ + + } + + + /* interpolate other points */ + static void + psh_glyph_interpolate_other_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + PSH_Contour contour = glyph->contours; + FT_UInt num_contours = glyph->num_contours; + + + for ( ; num_contours > 0; num_contours--, contour++ ) + { + PSH_Point start = contour->start; + PSH_Point first, next, point; + FT_UInt fit_count; + + + /* count the number of strong points in this contour */ + next = start + contour->count; + fit_count = 0; + first = 0; + + for ( point = start; point < next; point++ ) + if ( psh_point_is_fitted( point ) ) + { + if ( !first ) + first = point; + + fit_count++; + } + + /* if there are less than 2 fitted points in the contour, we */ + /* simply scale and eventually translate the contour points */ + if ( fit_count < 2 ) + { + if ( fit_count == 1 ) + delta = first->cur_u - FT_MulFix( first->org_u, scale ); + + for ( point = start; point < next; point++ ) + if ( point != first ) + point->cur_u = FT_MulFix( point->org_u, scale ) + delta; + + goto Next_Contour; + } + + /* there are more than 2 strong points in this contour; we */ + /* need to interpolate weak points between them */ + start = first; + do + { + point = first; + + /* skip consecutive fitted points */ + for (;;) + { + next = first->next; + if ( next == start ) + goto Next_Contour; + + if ( !psh_point_is_fitted( next ) ) + break; + + first = next; + } + + /* find next fitted point after unfitted one */ + for (;;) + { + next = next->next; + if ( psh_point_is_fitted( next ) ) + break; + } + + /* now interpolate between them */ + { + FT_Pos org_a, org_ab, cur_a, cur_ab; + FT_Pos org_c, org_ac, cur_c; + FT_Fixed scale_ab; + + + if ( first->org_u <= next->org_u ) + { + org_a = first->org_u; + cur_a = first->cur_u; + org_ab = next->org_u - org_a; + cur_ab = next->cur_u - cur_a; + } + else + { + org_a = next->org_u; + cur_a = next->cur_u; + org_ab = first->org_u - org_a; + cur_ab = first->cur_u - cur_a; + } + + scale_ab = 0x10000L; + if ( org_ab > 0 ) + scale_ab = FT_DivFix( cur_ab, org_ab ); + + point = first->next; + do + { + org_c = point->org_u; + org_ac = org_c - org_a; + + if ( org_ac <= 0 ) + { + /* on the left of the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale ); + } + else if ( org_ac >= org_ab ) + { + /* on the right on the interpolation zone */ + cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale ); + } + else + { + /* within the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale_ab ); + } + + point->cur_u = cur_c; + + point = point->next; + + } while ( point != next ); + } + + /* keep going until all points in the contours have been processed */ + first = next; + + } while ( first != start ); + + Next_Contour: + ; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HIGH-LEVEL INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + PSH_GlyphRec glyphrec; + PSH_Glyph glyph = &glyphrec; + FT_Error error; +#ifdef DEBUG_HINTER + FT_Memory memory; +#endif + FT_Int dimension; + + + /* something to do? */ + if ( outline->n_points == 0 || outline->n_contours == 0 ) + return PSH_Err_Ok; + +#ifdef DEBUG_HINTER + + memory = globals->memory; + + if ( ps_debug_glyph ) + { + psh_glyph_done( ps_debug_glyph ); + FT_FREE( ps_debug_glyph ); + } + + if ( FT_NEW( glyph ) ) + return error; + + ps_debug_glyph = glyph; + +#endif /* DEBUG_HINTER */ + + error = psh_glyph_init( glyph, outline, ps_hints, globals ); + if ( error ) + goto Exit; + + /* try to optimize the y_scale so that the top of non-capital letters + * is aligned on a pixel boundary whenever possible + */ + { + PSH_Dimension dim_x = &glyph->globals->dimension[0]; + PSH_Dimension dim_y = &glyph->globals->dimension[1]; + + FT_Fixed x_scale = dim_x->scale_mult; + FT_Fixed y_scale = dim_y->scale_mult; + + FT_Fixed old_x_scale = x_scale; + FT_Fixed old_y_scale = y_scale; + + FT_Fixed scaled; + FT_Fixed fitted; + + FT_Bool rescale = FALSE; + + + scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); + fitted = FT_PIX_ROUND( scaled ); + + if ( fitted != 0 && scaled != fitted ) + { + rescale = TRUE; + + y_scale = FT_MulDiv( y_scale, fitted, scaled ); + + if ( fitted < scaled ) + x_scale -= x_scale / 50; + + psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 ); + } + + glyph->do_horz_hints = 1; + glyph->do_vert_hints = 1; + + glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD ); + + glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD_V ); + + glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); + + for ( dimension = 0; dimension < 2; dimension++ ) + { + /* load outline coordinates into glyph */ + psh_glyph_load_points( glyph, dimension ); + + /* compute local extrema */ + psh_glyph_compute_extrema( glyph ); + + /* compute aligned stem/hints positions */ + psh_hint_table_align_hints( &glyph->hint_tables[dimension], + glyph->globals, + dimension, + glyph ); + + /* find strong points, align them, then interpolate others */ + psh_glyph_find_strong_points( glyph, dimension ); + if ( dimension == 1 ) + psh_glyph_find_blue_points( &globals->blues, glyph ); + psh_glyph_interpolate_strong_points( glyph, dimension ); + psh_glyph_interpolate_normal_points( glyph, dimension ); + psh_glyph_interpolate_other_points( glyph, dimension ); + + /* save hinted coordinates back to outline */ + psh_glyph_save_points( glyph, dimension ); + + if ( rescale ) + psh_globals_set_scale( glyph->globals, + old_x_scale, old_y_scale, 0, 0 ); + } + } + + Exit: + +#ifndef DEBUG_HINTER + psh_glyph_done( glyph ); +#endif + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshalgo.h b/alienblaster/project/jni/freetype/src/pshinter/pshalgo.h new file mode 100644 index 000000000..1a248a705 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshalgo.h @@ -0,0 +1,255 @@ +/***************************************************************************/ +/* */ +/* pshalgo.h */ +/* */ +/* PostScript hinting algorithm (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHALGO_H__ +#define __PSHALGO_H__ + + +#include "pshrec.h" +#include "pshglob.h" +#include FT_TRIGONOMETRY_H + + +FT_BEGIN_HEADER + + + /* handle to Hint structure */ + typedef struct PSH_HintRec_* PSH_Hint; + + /* hint bit-flags */ + typedef enum PSH_Hint_Flags_ + { + PSH_HINT_GHOST = PS_HINT_FLAG_GHOST, + PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM, + PSH_HINT_ACTIVE = 4, + PSH_HINT_FITTED = 8 + + } PSH_Hint_Flags; + + +#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 ) +#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 ) +#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 ) + +#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE +#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE +#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED + + /* hint structure */ + typedef struct PSH_HintRec_ + { + FT_Int org_pos; + FT_Int org_len; + FT_Pos cur_pos; + FT_Pos cur_len; + FT_UInt flags; + PSH_Hint parent; + FT_Int order; + + } PSH_HintRec; + + + /* this is an interpolation zone used for strong points; */ + /* weak points are interpolated according to their strong */ + /* neighbours */ + typedef struct PSH_ZoneRec_ + { + FT_Fixed scale; + FT_Fixed delta; + FT_Pos min; + FT_Pos max; + + } PSH_ZoneRec, *PSH_Zone; + + + typedef struct PSH_Hint_TableRec_ + { + FT_UInt max_hints; + FT_UInt num_hints; + PSH_Hint hints; + PSH_Hint* sort; + PSH_Hint* sort_global; + FT_UInt num_zones; + PSH_ZoneRec* zones; + PSH_Zone zone; + PS_Mask_Table hint_masks; + PS_Mask_Table counter_masks; + + } PSH_Hint_TableRec, *PSH_Hint_Table; + + + typedef struct PSH_PointRec_* PSH_Point; + typedef struct PSH_ContourRec_* PSH_Contour; + + enum + { + PSH_DIR_NONE = 4, + PSH_DIR_UP = -1, + PSH_DIR_DOWN = 1, + PSH_DIR_LEFT = -2, + PSH_DIR_RIGHT = 2 + }; + +#define PSH_DIR_HORIZONTAL 2 +#define PSH_DIR_VERTICAL 1 + +#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) ) +#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL ) +#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL ) + + + /* the following bit-flags are computed once by the glyph */ + /* analyzer, for both dimensions */ + enum + { + PSH_POINT_OFF = 1, /* point is off the curve */ + PSH_POINT_SMOOTH = 2, /* point is smooth */ + PSH_POINT_INFLEX = 4 /* point is inflection */ + }; + +#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH ) +#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF ) +#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX ) + +#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH +#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF +#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX + + /* the following bit-flags are re-computed for each dimension */ + enum + { + PSH_POINT_STRONG = 16, /* point is strong */ + PSH_POINT_FITTED = 32, /* point is already fitted */ + PSH_POINT_EXTREMUM = 64, /* point is local extremum */ + PSH_POINT_POSITIVE = 128, /* extremum has positive contour flow */ + PSH_POINT_NEGATIVE = 256, /* extremum has negative contour flow */ + PSH_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */ + PSH_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */ + }; + +#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG ) +#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED ) +#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM ) +#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE ) +#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE ) +#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN ) +#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX ) + +#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG +#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED +#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM +#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE +#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE +#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN +#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX + + + typedef struct PSH_PointRec_ + { + PSH_Point prev; + PSH_Point next; + PSH_Contour contour; + FT_UInt flags; + FT_UInt flags2; + FT_Char dir_in; + FT_Char dir_out; + FT_Angle angle_in; + FT_Angle angle_out; + PSH_Hint hint; + FT_Pos org_u; + FT_Pos org_v; + FT_Pos cur_u; +#ifdef DEBUG_HINTER + FT_Pos org_x; + FT_Pos cur_x; + FT_Pos org_y; + FT_Pos cur_y; + FT_UInt flags_x; + FT_UInt flags_y; +#endif + + } PSH_PointRec; + + +#define PSH_POINT_EQUAL_ORG( a, b ) ( (a)->org_u == (b)->org_u && \ + (a)->org_v == (b)->org_v ) + +#define PSH_POINT_ANGLE( a, b ) FT_Atan2( (b)->org_u - (a)->org_u, \ + (b)->org_v - (a)->org_v ) + + typedef struct PSH_ContourRec_ + { + PSH_Point start; + FT_UInt count; + + } PSH_ContourRec; + + + typedef struct PSH_GlyphRec_ + { + FT_UInt num_points; + FT_UInt num_contours; + + PSH_Point points; + PSH_Contour contours; + + FT_Memory memory; + FT_Outline* outline; + PSH_Globals globals; + PSH_Hint_TableRec hint_tables[2]; + + FT_Bool vertical; + FT_Int major_dir; + FT_Int minor_dir; + + FT_Bool do_horz_hints; + FT_Bool do_vert_hints; + FT_Bool do_horz_snapping; + FT_Bool do_vert_snapping; + FT_Bool do_stem_adjust; + + } PSH_GlyphRec, *PSH_Glyph; + + +#ifdef DEBUG_HINTER + extern PSH_Hint_Table ps_debug_hint_table; + + typedef void + (*PSH_HintFunc)( PSH_Hint hint, + FT_Bool vertical ); + + extern PSH_HintFunc ps_debug_hint_func; + + extern PSH_Glyph ps_debug_glyph; +#endif + + + extern FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + +FT_END_HEADER + + +#endif /* __PSHALGO_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshglob.c b/alienblaster/project/jni/freetype/src/pshinter/pshglob.c new file mode 100644 index 000000000..8a69aa1e8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshglob.c @@ -0,0 +1,750 @@ +/***************************************************************************/ +/* */ +/* pshglob.c */ +/* */ +/* PostScript hinter global hinting management (body). */ +/* Inspired by the new auto-hinter module. */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pshglob.h" + +#ifdef DEBUG_HINTER + PSH_Globals ps_debug_globals = 0; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STANDARD WIDTHS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* scale the widths/heights table */ + static void + psh_globals_scale_widths( PSH_Globals globals, + FT_UInt direction ) + { + PSH_Dimension dim = &globals->dimension[direction]; + PSH_Widths stdw = &dim->stdw; + FT_UInt count = stdw->count; + PSH_Width width = stdw->widths; + PSH_Width stand = width; /* standard width/height */ + FT_Fixed scale = dim->scale_mult; + + + if ( count > 0 ) + { + width->cur = FT_MulFix( width->org, scale ); + width->fit = FT_PIX_ROUND( width->cur ); + + width++; + count--; + + for ( ; count > 0; count--, width++ ) + { + FT_Pos w, dist; + + + w = FT_MulFix( width->org, scale ); + dist = w - stand->cur; + + if ( dist < 0 ) + dist = -dist; + + if ( dist < 128 ) + w = stand->cur; + + width->cur = w; + width->fit = FT_PIX_ROUND( w ); + } + } + } + + +#if 0 + + /* org_width is is font units, result in device pixels, 26.6 format */ + FT_LOCAL_DEF( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ) + { + FT_UInt n; + FT_Pos width = FT_MulFix( org_width, dimension->scale_mult ); + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + + + for ( n = 0; n < dimension->stdw.count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = dimension->stdw.widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + if ( width >= reference ) + { + width -= 0x21; + if ( width < reference ) + width = reference; + } + else + { + width += 0x21; + if ( width > reference ) + width = reference; + } + + return width; + } + +#endif /* 0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BLUE ZONES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_blues_set_zones_0( PSH_Blues target, + FT_Bool is_others, + FT_UInt read_count, + FT_Short* read, + PSH_Blue_Table top_table, + PSH_Blue_Table bot_table ) + { + FT_UInt count_top = top_table->count; + FT_UInt count_bot = bot_table->count; + FT_Bool first = 1; + + FT_UNUSED( target ); + + + for ( ; read_count > 1; read_count -= 2 ) + { + FT_Int reference, delta; + FT_UInt count; + PSH_Blue_Zone zones, zone; + FT_Bool top; + + + /* read blue zone entry, and select target top/bottom zone */ + top = 0; + if ( first || is_others ) + { + reference = read[1]; + delta = read[0] - reference; + + zones = bot_table->zones; + count = count_bot; + first = 0; + } + else + { + reference = read[0]; + delta = read[1] - reference; + + zones = top_table->zones; + count = count_top; + top = 1; + } + + /* insert into sorted table */ + zone = zones; + for ( ; count > 0; count--, zone++ ) + { + if ( reference < zone->org_ref ) + break; + + if ( reference == zone->org_ref ) + { + FT_Int delta0 = zone->org_delta; + + + /* we have two zones on the same reference position -- */ + /* only keep the largest one */ + if ( delta < 0 ) + { + if ( delta < delta0 ) + zone->org_delta = delta; + } + else + { + if ( delta > delta0 ) + zone->org_delta = delta; + } + goto Skip; + } + } + + for ( ; count > 0; count-- ) + zone[count] = zone[count-1]; + + zone->org_ref = reference; + zone->org_delta = delta; + + if ( top ) + count_top++; + else + count_bot++; + + Skip: + read += 2; + } + + top_table->count = count_top; + bot_table->count = count_bot; + } + + + /* Re-read blue zones from the original fonts and store them into out */ + /* private structure. This function re-orders, sanitizes and */ + /* fuzz-expands the zones as well. */ + static void + psh_blues_set_zones( PSH_Blues target, + FT_UInt count, + FT_Short* blues, + FT_UInt count_others, + FT_Short* other_blues, + FT_Int fuzz, + FT_Int family ) + { + PSH_Blue_Table top_table, bot_table; + FT_Int count_top, count_bot; + + + if ( family ) + { + top_table = &target->family_top; + bot_table = &target->family_bottom; + } + else + { + top_table = &target->normal_top; + bot_table = &target->normal_bottom; + } + + /* read the input blue zones, and build two sorted tables */ + /* (one for the top zones, the other for the bottom zones) */ + top_table->count = 0; + bot_table->count = 0; + + /* first, the blues */ + psh_blues_set_zones_0( target, 0, + count, blues, top_table, bot_table ); + psh_blues_set_zones_0( target, 1, + count_others, other_blues, top_table, bot_table ); + + count_top = top_table->count; + count_bot = bot_table->count; + + /* sanitize top table */ + if ( count_top > 0 ) + { + PSH_Blue_Zone zone = top_table->zones; + + + for ( count = count_top; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[1].org_ref - zone[0].org_ref; + if ( zone->org_delta > delta ) + zone->org_delta = delta; + } + + zone->org_bottom = zone->org_ref; + zone->org_top = zone->org_delta + zone->org_ref; + } + } + + /* sanitize bottom table */ + if ( count_bot > 0 ) + { + PSH_Blue_Zone zone = bot_table->zones; + + + for ( count = count_bot; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[0].org_ref - zone[1].org_ref; + if ( zone->org_delta < delta ) + zone->org_delta = delta; + } + + zone->org_top = zone->org_ref; + zone->org_bottom = zone->org_delta + zone->org_ref; + } + } + + /* expand top and bottom tables with blue fuzz */ + { + FT_Int dim, top, bot, delta; + PSH_Blue_Zone zone; + + + zone = top_table->zones; + count = count_top; + + for ( dim = 1; dim >= 0; dim-- ) + { + if ( count > 0 ) + { + /* expand the bottom of the lowest zone normally */ + zone->org_bottom -= fuzz; + + /* expand the top and bottom of intermediate zones; */ + /* checking that the interval is smaller than the fuzz */ + top = zone->org_top; + + for ( count--; count > 0; count-- ) + { + bot = zone[1].org_bottom; + delta = bot - top; + + if ( delta < 2 * fuzz ) + zone[0].org_top = zone[1].org_bottom = top + delta / 2; + else + { + zone[0].org_top = top + fuzz; + zone[1].org_bottom = bot - fuzz; + } + + zone++; + top = zone->org_top; + } + + /* expand the top of the highest zone normally */ + zone->org_top = top + fuzz; + } + zone = bot_table->zones; + count = count_bot; + } + } + } + + + /* reset the blues table when the device transform changes */ + static void + psh_blues_scale_zones( PSH_Blues blues, + FT_Fixed scale, + FT_Pos delta ) + { + FT_UInt count; + FT_UInt num; + PSH_Blue_Table table = 0; + + /* */ + /* Determine whether we need to suppress overshoots or */ + /* not. We simply need to compare the vertical scale */ + /* parameter to the raw bluescale value. Here is why: */ + /* */ + /* We need to suppress overshoots for all pointsizes. */ + /* At 300dpi that satisfies: */ + /* */ + /* pointsize < 240*bluescale + 0.49 */ + /* */ + /* This corresponds to: */ + /* */ + /* pixelsize < 1000*bluescale + 49/24 */ + /* */ + /* scale*EM_Size < 1000*bluescale + 49/24 */ + /* */ + /* However, for normal Type 1 fonts, EM_Size is 1000! */ + /* We thus only check: */ + /* */ + /* scale < bluescale + 49/24000 */ + /* */ + /* which we shorten to */ + /* */ + /* "scale < bluescale" */ + /* */ + /* Note that `blue_scale' is stored 1000 times its real */ + /* value, and that `scale' converts from font units to */ + /* fractional pixels. */ + /* */ + + /* 1000 / 64 = 125 / 8 */ + if ( scale >= 0x20C49BAL ) + blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); + else + blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); + + /* */ + /* The blue threshold is the font units distance under */ + /* which overshoots are suppressed due to the BlueShift */ + /* even if the scale is greater than BlueScale. */ + /* */ + /* It is the smallest distance such that */ + /* */ + /* dist <= BlueShift && dist*scale <= 0.5 pixels */ + /* */ + { + FT_Int threshold = blues->blue_shift; + + + while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) + threshold--; + + blues->blue_threshold = threshold; + } + + for ( num = 0; num < 4; num++ ) + { + PSH_Blue_Zone zone; + + + switch ( num ) + { + case 0: + table = &blues->normal_top; + break; + case 1: + table = &blues->normal_bottom; + break; + case 2: + table = &blues->family_top; + break; + default: + table = &blues->family_bottom; + break; + } + + zone = table->zones; + count = table->count; + for ( ; count > 0; count--, zone++ ) + { + zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta; + zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta; + zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta; + zone->cur_delta = FT_MulFix( zone->org_delta, scale ); + + /* round scaled reference position */ + zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); + +#if 0 + if ( zone->cur_ref > zone->cur_top ) + zone->cur_ref -= 64; + else if ( zone->cur_ref < zone->cur_bottom ) + zone->cur_ref += 64; +#endif + } + } + + /* process the families now */ + + for ( num = 0; num < 2; num++ ) + { + PSH_Blue_Zone zone1, zone2; + FT_UInt count1, count2; + PSH_Blue_Table normal, family; + + + switch ( num ) + { + case 0: + normal = &blues->normal_top; + family = &blues->family_top; + break; + + default: + normal = &blues->normal_bottom; + family = &blues->family_bottom; + } + + zone1 = normal->zones; + count1 = normal->count; + + for ( ; count1 > 0; count1--, zone1++ ) + { + /* try to find a family zone whose reference position is less */ + /* than 1 pixel far from the current zone */ + zone2 = family->zones; + count2 = family->count; + + for ( ; count2 > 0; count2--, zone2++ ) + { + FT_Pos Delta; + + + Delta = zone1->org_ref - zone2->org_ref; + if ( Delta < 0 ) + Delta = -Delta; + + if ( FT_MulFix( Delta, scale ) < 64 ) + { + zone1->cur_top = zone2->cur_top; + zone1->cur_bottom = zone2->cur_bottom; + zone1->cur_ref = zone2->cur_ref; + zone1->cur_delta = zone2->cur_delta; + break; + } + } + } + } + } + + + FT_LOCAL_DEF( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ) + { + PSH_Blue_Table table; + FT_UInt count; + FT_Pos delta; + PSH_Blue_Zone zone; + FT_Int no_shoots; + + + alignment->align = PSH_BLUE_ALIGN_NONE; + + no_shoots = blues->no_overshoots; + + /* look up stem top in top zones table */ + table = &blues->normal_top; + count = table->count; + zone = table->zones; + + for ( ; count > 0; count--, zone++ ) + { + delta = stem_top - zone->org_bottom; + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_top <= zone->org_top + blues->blue_fuzz ) + { + if ( no_shoots || delta <= blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_TOP; + alignment->align_top = zone->cur_ref; + } + break; + } + } + + /* look up stem bottom in bottom zones table */ + table = &blues->normal_bottom; + count = table->count; + zone = table->zones + count-1; + + for ( ; count > 0; count--, zone-- ) + { + delta = zone->org_top - stem_bot; + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_bot >= zone->org_bottom - blues->blue_fuzz ) + { + if ( no_shoots || delta < blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_BOT; + alignment->align_bot = zone->cur_ref; + } + break; + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_globals_destroy( PSH_Globals globals ) + { + if ( globals ) + { + FT_Memory memory; + + + memory = globals->memory; + globals->dimension[0].stdw.count = 0; + globals->dimension[1].stdw.count = 0; + + globals->blues.normal_top.count = 0; + globals->blues.normal_bottom.count = 0; + globals->blues.family_top.count = 0; + globals->blues.family_bottom.count = 0; + + FT_FREE( globals ); + +#ifdef DEBUG_HINTER + ps_debug_globals = 0; +#endif + } + } + + + static FT_Error + psh_globals_new( FT_Memory memory, + T1_Private* priv, + PSH_Globals *aglobals ) + { + PSH_Globals globals; + FT_Error error; + + + if ( !FT_NEW( globals ) ) + { + FT_UInt count; + FT_Short* read; + + + globals->memory = memory; + + /* copy standard widths */ + { + PSH_Dimension dim = &globals->dimension[1]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_width[0]; + write++; + + read = priv->snap_widths; + for ( count = priv->num_snap_widths; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_widths + 1; + } + + /* copy standard heights */ + { + PSH_Dimension dim = &globals->dimension[0]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_height[0]; + write++; + read = priv->snap_heights; + for ( count = priv->num_snap_heights; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_heights + 1; + } + + /* copy blue zones */ + psh_blues_set_zones( &globals->blues, priv->num_blue_values, + priv->blue_values, priv->num_other_blues, + priv->other_blues, priv->blue_fuzz, 0 ); + + psh_blues_set_zones( &globals->blues, priv->num_family_blues, + priv->family_blues, priv->num_family_other_blues, + priv->family_other_blues, priv->blue_fuzz, 1 ); + + globals->blues.blue_scale = priv->blue_scale; + globals->blues.blue_shift = priv->blue_shift; + globals->blues.blue_fuzz = priv->blue_fuzz; + + globals->dimension[0].scale_mult = 0; + globals->dimension[0].scale_delta = 0; + globals->dimension[1].scale_mult = 0; + globals->dimension[1].scale_delta = 0; + +#ifdef DEBUG_HINTER + ps_debug_globals = globals; +#endif + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ) + { + PSH_Dimension dim = &globals->dimension[0]; + + + dim = &globals->dimension[0]; + if ( x_scale != dim->scale_mult || + x_delta != dim->scale_delta ) + { + dim->scale_mult = x_scale; + dim->scale_delta = x_delta; + + psh_globals_scale_widths( globals, 0 ); + } + + dim = &globals->dimension[1]; + if ( y_scale != dim->scale_mult || + y_delta != dim->scale_delta ) + { + dim->scale_mult = y_scale; + dim->scale_delta = y_delta; + + psh_globals_scale_widths( globals, 1 ); + psh_blues_scale_zones( &globals->blues, y_scale, y_delta ); + } + + return 0; + } + + + FT_LOCAL_DEF( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ) + { + funcs->create = psh_globals_new; + funcs->set_scale = psh_globals_set_scale; + funcs->destroy = psh_globals_destroy; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshglob.h b/alienblaster/project/jni/freetype/src/pshinter/pshglob.h new file mode 100644 index 000000000..c51162615 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshglob.h @@ -0,0 +1,196 @@ +/***************************************************************************/ +/* */ +/* pshglob.h */ +/* */ +/* PostScript hinter global hinting management. */ +/* */ +/* Copyright 2001, 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHGLOB_H__ +#define __PSHGLOB_H__ + + +#include FT_FREETYPE_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* @constant: */ + /* PS_GLOBALS_MAX_BLUE_ZONES */ + /* */ + /* @description: */ + /* The maximum number of blue zones in a font global hints structure. */ + /* See @PS_Globals_BluesRec. */ + /* */ +#define PS_GLOBALS_MAX_BLUE_ZONES 16 + + + /*************************************************************************/ + /* */ + /* @constant: */ + /* PS_GLOBALS_MAX_STD_WIDTHS */ + /* */ + /* @description: */ + /* The maximum number of standard and snap widths in either the */ + /* horizontal or vertical direction. See @PS_Globals_WidthsRec. */ + /* */ +#define PS_GLOBALS_MAX_STD_WIDTHS 16 + + + /* standard and snap width */ + typedef struct PSH_WidthRec_ + { + FT_Int org; + FT_Pos cur; + FT_Pos fit; + + } PSH_WidthRec, *PSH_Width; + + + /* standard and snap widths table */ + typedef struct PSH_WidthsRec_ + { + FT_UInt count; + PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS]; + + } PSH_WidthsRec, *PSH_Widths; + + + typedef struct PSH_DimensionRec_ + { + PSH_WidthsRec stdw; + FT_Fixed scale_mult; + FT_Fixed scale_delta; + + } PSH_DimensionRec, *PSH_Dimension; + + + /* blue zone descriptor */ + typedef struct PSH_Blue_ZoneRec_ + { + FT_Int org_ref; + FT_Int org_delta; + FT_Int org_top; + FT_Int org_bottom; + + FT_Pos cur_ref; + FT_Pos cur_delta; + FT_Pos cur_bottom; + FT_Pos cur_top; + + } PSH_Blue_ZoneRec, *PSH_Blue_Zone; + + + typedef struct PSH_Blue_TableRec_ + { + FT_UInt count; + PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES]; + + } PSH_Blue_TableRec, *PSH_Blue_Table; + + + /* blue zones table */ + typedef struct PSH_BluesRec_ + { + PSH_Blue_TableRec normal_top; + PSH_Blue_TableRec normal_bottom; + PSH_Blue_TableRec family_top; + PSH_Blue_TableRec family_bottom; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_threshold; + FT_Int blue_fuzz; + FT_Bool no_overshoots; + + } PSH_BluesRec, *PSH_Blues; + + + /* font globals. */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PSH_GlobalsRec_ + { + FT_Memory memory; + PSH_DimensionRec dimension[2]; + PSH_BluesRec blues; + + } PSH_GlobalsRec; + + +#define PSH_BLUE_ALIGN_NONE 0 +#define PSH_BLUE_ALIGN_TOP 1 +#define PSH_BLUE_ALIGN_BOT 2 + + + typedef struct PSH_AlignmentRec_ + { + int align; + FT_Pos align_top; + FT_Pos align_bot; + + } PSH_AlignmentRec, *PSH_Alignment; + + + FT_LOCAL( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ); + + +#if 0 + /* snap a stem width to fitter coordinates. `org_width' is in font */ + /* units. The result is in device pixels (26.6 format). */ + FT_LOCAL( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ); +#endif + + FT_LOCAL( FT_Error ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + /* snap a stem to one or two blue zones */ + FT_LOCAL( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ); + /* */ + +#ifdef DEBUG_HINTER + extern PSH_Globals ps_debug_globals; +#endif + + +FT_END_HEADER + + +#endif /* __PSHGLOB_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshmod.c b/alienblaster/project/jni/freetype/src/pshinter/pshmod.c new file mode 100644 index 000000000..91da5d7e6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshmod.c @@ -0,0 +1,118 @@ +/***************************************************************************/ +/* */ +/* pshmod.c */ +/* */ +/* FreeType PostScript hinter module implementation (body). */ +/* */ +/* Copyright 2001, 2002, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include "pshrec.h" +#include "pshalgo.h" +#include "pshpic.h" + + + /* the Postscript Hinter module structure */ + typedef struct PS_Hinter_Module_Rec_ + { + FT_ModuleRec root; + PS_HintsRec ps_hints; + + PSH_Globals_FuncsRec globals_funcs; + T1_Hints_FuncsRec t1_funcs; + T2_Hints_FuncsRec t2_funcs; + + } PS_Hinter_ModuleRec, *PS_Hinter_Module; + + + /* finalize module */ + FT_CALLBACK_DEF( void ) + ps_hinter_done( PS_Hinter_Module module ) + { + module->t1_funcs.hints = NULL; + module->t2_funcs.hints = NULL; + + ps_hints_done( &module->ps_hints ); + } + + + /* initialize module, create hints recorder and the interface */ + FT_CALLBACK_DEF( FT_Error ) + ps_hinter_init( PS_Hinter_Module module ) + { + FT_Memory memory = module->root.memory; + void* ph = &module->ps_hints; + + + ps_hints_init( &module->ps_hints, memory ); + + psh_globals_funcs_init( &module->globals_funcs ); + + t1_hints_funcs_init( &module->t1_funcs ); + module->t1_funcs.hints = (T1_Hints)ph; + + t2_hints_funcs_init( &module->t2_funcs ); + module->t2_funcs.hints = (T2_Hints)ph; + + return 0; + } + + + /* returns global hints interface */ + FT_CALLBACK_DEF( PSH_Globals_Funcs ) + pshinter_get_globals_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->globals_funcs; + } + + + /* return Type 1 hints interface */ + FT_CALLBACK_DEF( T1_Hints_Funcs ) + pshinter_get_t1_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t1_funcs; + } + + + /* return Type 2 hints interface */ + FT_CALLBACK_DEF( T2_Hints_Funcs ) + pshinter_get_t2_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t2_funcs; + } + + + FT_DEFINE_PSHINTER_INTERFACE(pshinter_interface, + pshinter_get_globals_funcs, + pshinter_get_t1_funcs, + pshinter_get_t2_funcs + ) + + + FT_DEFINE_MODULE(pshinter_module_class, + + 0, + sizeof ( PS_Hinter_ModuleRec ), + "pshinter", + 0x10000L, + 0x20000L, + + &FTPSHINTER_INTERFACE_GET, /* module-specific interface */ + + (FT_Module_Constructor)ps_hinter_init, + (FT_Module_Destructor) ps_hinter_done, + (FT_Module_Requester) 0 /* no additional interface for now */ + ) + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshmod.h b/alienblaster/project/jni/freetype/src/pshinter/pshmod.h new file mode 100644 index 000000000..0ae7e96f5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshmod.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* pshmod.h */ +/* */ +/* PostScript hinter module interface (specification). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHMOD_H__ +#define __PSHMOD_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( pshinter_module_class ) + + +FT_END_HEADER + + +#endif /* __PSHMOD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshnterr.h b/alienblaster/project/jni/freetype/src/pshinter/pshnterr.h new file mode 100644 index 000000000..3c0029fbf --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshnterr.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* pshnterr.h */ +/* */ +/* PS Hinter error codes (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PSHinter error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSHNTERR_H__ +#define __PSHNTERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSH_Err_ +#define FT_ERR_BASE FT_Mod_Err_PShinter + +#include FT_ERRORS_H + +#endif /* __PSHNTERR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshpic.c b/alienblaster/project/jni/freetype/src/pshinter/pshpic.c new file mode 100644 index 000000000..51a087988 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshpic.c @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* pshpic.c */ +/* */ +/* The FreeType position independent code services for pshinter module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pshpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from pshmod.c */ + void FT_Init_Class_pshinter_interface( FT_Library, PSHinter_Interface*); + + void + pshinter_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->pshinter ) + { + FT_FREE( pic_container->pshinter ); + pic_container->pshinter = NULL; + } + } + + FT_Error + pshinter_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + PSHinterPIC* container; + FT_Memory memory = library->memory; + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->pshinter = container; + + /* add call to initialization function when you add new scripts */ + FT_Init_Class_pshinter_interface(library, &container->pshinter_interface); + +/*Exit:*/ + if(error) + pshinter_module_class_pic_free(library); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshpic.h b/alienblaster/project/jni/freetype/src/pshinter/pshpic.h new file mode 100644 index 000000000..3555d8e85 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshpic.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* pshpic.h */ +/* */ +/* The FreeType position independent code services for pshinter module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHPIC_H__ +#define __PSHPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC + +#define FTPSHINTER_INTERFACE_GET pshinter_interface + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + typedef struct PSHinterPIC_ + { + PSHinter_Interface pshinter_interface; + } PSHinterPIC; + +#define GET_PIC(lib) ((PSHinterPIC*)((lib)->pic_container.autofit)) +#define FTPSHINTER_INTERFACE_GET (GET_PIC(library)->pshinter_interface) + + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __PSHPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshrec.c b/alienblaster/project/jni/freetype/src/pshinter/pshrec.c new file mode 100644 index 000000000..0910cc5e6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshrec.c @@ -0,0 +1,1224 @@ +/***************************************************************************/ +/* */ +/* pshrec.c */ +/* */ +/* FreeType PostScript hints recorder (body). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H + +#include "pshrec.h" +#include "pshalgo.h" + +#include "pshnterr.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pshrec + +#ifdef DEBUG_HINTER + PS_Hints ps_debug_hints = 0; + int ps_debug_no_horz_hints = 0; + int ps_debug_no_vert_hints = 0; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_HINT MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy hints table */ + static void + ps_hint_table_done( PS_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + } + + + /* ensure that a table can contain "count" elements */ + static FT_Error + ps_hint_table_ensure( PS_Hint_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_hints; + FT_UInt new_max = count; + FT_Error error = PSH_Err_Ok; + + + if ( new_max > old_max ) + { + /* try to grow the table */ + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) + table->max_hints = new_max; + } + return error; + } + + + static FT_Error + ps_hint_table_alloc( PS_Hint_Table table, + FT_Memory memory, + PS_Hint *ahint ) + { + FT_Error error = PSH_Err_Ok; + FT_UInt count; + PS_Hint hint = 0; + + + count = table->num_hints; + count++; + + if ( count >= table->max_hints ) + { + error = ps_hint_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + hint = table->hints + count - 1; + hint->pos = 0; + hint->len = 0; + hint->flags = 0; + + table->num_hints = count; + + Exit: + *ahint = hint; + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_MASK MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy mask */ + static void + ps_mask_done( PS_Mask mask, + FT_Memory memory ) + { + FT_FREE( mask->bytes ); + mask->num_bits = 0; + mask->max_bits = 0; + mask->end_point = 0; + } + + + /* ensure that a mask can contain "count" bits */ + static FT_Error + ps_mask_ensure( PS_Mask mask, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = ( mask->max_bits + 7 ) >> 3; + FT_UInt new_max = ( count + 7 ) >> 3; + FT_Error error = PSH_Err_Ok; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) + mask->max_bits = new_max * 8; + } + return error; + } + + + /* test a bit value in a given mask */ + static FT_Int + ps_mask_test_bit( PS_Mask mask, + FT_Int idx ) + { + if ( (FT_UInt)idx >= mask->num_bits ) + return 0; + + return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); + } + + + /* clear a given bit */ + static void + ps_mask_clear_bit( PS_Mask mask, + FT_Int idx ) + { + FT_Byte* p; + + + if ( (FT_UInt)idx >= mask->num_bits ) + return; + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) ); + } + + + /* set a given bit, possibly grow the mask */ + static FT_Error + ps_mask_set_bit( PS_Mask mask, + FT_Int idx, + FT_Memory memory ) + { + FT_Error error = PSH_Err_Ok; + FT_Byte* p; + + + if ( idx < 0 ) + goto Exit; + + if ( (FT_UInt)idx >= mask->num_bits ) + { + error = ps_mask_ensure( mask, idx + 1, memory ); + if ( error ) + goto Exit; + + mask->num_bits = idx + 1; + } + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) ); + + Exit: + return error; + } + + + /* destroy mask table */ + static void + ps_mask_table_done( PS_Mask_Table table, + FT_Memory memory ) + { + FT_UInt count = table->max_masks; + PS_Mask mask = table->masks; + + + for ( ; count > 0; count--, mask++ ) + ps_mask_done( mask, memory ); + + FT_FREE( table->masks ); + table->num_masks = 0; + table->max_masks = 0; + } + + + /* ensure that a mask table can contain "count" masks */ + static FT_Error + ps_mask_table_ensure( PS_Mask_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_masks; + FT_UInt new_max = count; + FT_Error error = PSH_Err_Ok; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) + table->max_masks = new_max; + } + return error; + } + + + /* allocate a new mask in a table */ + static FT_Error + ps_mask_table_alloc( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_UInt count; + FT_Error error = PSH_Err_Ok; + PS_Mask mask = 0; + + + count = table->num_masks; + count++; + + if ( count > table->max_masks ) + { + error = ps_mask_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + mask = table->masks + count - 1; + mask->num_bits = 0; + mask->end_point = 0; + table->num_masks = count; + + Exit: + *amask = mask; + return error; + } + + + /* return last hint mask in a table, create one if the table is empty */ + static FT_Error + ps_mask_table_last( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_Error error = PSH_Err_Ok; + FT_UInt count; + PS_Mask mask; + + + count = table->num_masks; + if ( count == 0 ) + { + error = ps_mask_table_alloc( table, memory, &mask ); + if ( error ) + goto Exit; + } + else + mask = table->masks + count - 1; + + Exit: + *amask = mask; + return error; + } + + + /* set a new mask to a given bit range */ + static FT_Error + ps_mask_table_set_bits( PS_Mask_Table table, + const FT_Byte* source, + FT_UInt bit_pos, + FT_UInt bit_count, + FT_Memory memory ) + { + FT_Error error = PSH_Err_Ok; + PS_Mask mask; + + + error = ps_mask_table_last( table, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_ensure( mask, bit_count, memory ); + if ( error ) + goto Exit; + + mask->num_bits = bit_count; + + /* now, copy bits */ + { + FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 ); + FT_Int rmask = 0x80 >> ( bit_pos & 7 ); + FT_Byte* write = mask->bytes; + FT_Int wmask = 0x80; + FT_Int val; + + + for ( ; bit_count > 0; bit_count-- ) + { + val = write[0] & ~wmask; + + if ( read[0] & rmask ) + val |= wmask; + + write[0] = (FT_Byte)val; + + rmask >>= 1; + if ( rmask == 0 ) + { + read++; + rmask = 0x80; + } + + wmask >>= 1; + if ( wmask == 0 ) + { + write++; + wmask = 0x80; + } + } + } + + Exit: + return error; + } + + + /* test whether two masks in a table intersect */ + static FT_Int + ps_mask_table_test_intersect( PS_Mask_Table table, + FT_Int index1, + FT_Int index2 ) + { + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_Byte* p1 = mask1->bytes; + FT_Byte* p2 = mask2->bytes; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_UInt count; + + + count = ( count1 <= count2 ) ? count1 : count2; + for ( ; count >= 8; count -= 8 ) + { + if ( p1[0] & p2[0] ) + return 1; + + p1++; + p2++; + } + + if ( count == 0 ) + return 0; + + return ( p1[0] & p2[0] ) & ~( 0xFF >> count ); + } + + + /* merge two masks, used by ps_mask_table_merge_all */ + static FT_Error + ps_mask_table_merge( PS_Mask_Table table, + FT_Int index1, + FT_Int index2, + FT_Memory memory ) + { + FT_UInt temp; + FT_Error error = PSH_Err_Ok; + + + /* swap index1 and index2 so that index1 < index2 */ + if ( index1 > index2 ) + { + temp = index1; + index1 = index2; + index2 = temp; + } + + if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks ) + { + /* we need to merge the bitsets of index1 and index2 with a */ + /* simple union */ + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_Int delta; + + + if ( count2 > 0 ) + { + FT_UInt pos; + FT_Byte* read; + FT_Byte* write; + + + /* if "count2" is greater than "count1", we need to grow the */ + /* first bitset, and clear the highest bits */ + if ( count2 > count1 ) + { + error = ps_mask_ensure( mask1, count2, memory ); + if ( error ) + goto Exit; + + for ( pos = count1; pos < count2; pos++ ) + ps_mask_clear_bit( mask1, pos ); + } + + /* merge (unite) the bitsets */ + read = mask2->bytes; + write = mask1->bytes; + pos = (FT_UInt)( ( count2 + 7 ) >> 3 ); + + for ( ; pos > 0; pos-- ) + { + write[0] = (FT_Byte)( write[0] | read[0] ); + write++; + read++; + } + } + + /* Now, remove "mask2" from the list. We need to keep the masks */ + /* sorted in order of importance, so move table elements. */ + mask2->num_bits = 0; + mask2->end_point = 0; + + delta = table->num_masks - 1 - index2; /* number of masks to move */ + if ( delta > 0 ) + { + /* move to end of table for reuse */ + PS_MaskRec dummy = *mask2; + + + ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) ); + + mask2[delta] = dummy; + } + + table->num_masks--; + } + else + FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n", + index1, index2 )); + + Exit: + return error; + } + + + /* Try to merge all masks in a given table. This is used to merge */ + /* all counter masks into independent counter "paths". */ + /* */ + static FT_Error + ps_mask_table_merge_all( PS_Mask_Table table, + FT_Memory memory ) + { + FT_Int index1, index2; + FT_Error error = PSH_Err_Ok; + + + for ( index1 = table->num_masks - 1; index1 > 0; index1-- ) + { + for ( index2 = index1 - 1; index2 >= 0; index2-- ) + { + if ( ps_mask_table_test_intersect( table, index1, index2 ) ) + { + error = ps_mask_table_merge( table, index2, index1, memory ); + if ( error ) + goto Exit; + + break; + } + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_DIMENSION MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* finalize a given dimension */ + static void + ps_dimension_done( PS_Dimension dimension, + FT_Memory memory ) + { + ps_mask_table_done( &dimension->counters, memory ); + ps_mask_table_done( &dimension->masks, memory ); + ps_hint_table_done( &dimension->hints, memory ); + } + + + /* initialize a given dimension */ + static void + ps_dimension_init( PS_Dimension dimension ) + { + dimension->hints.num_hints = 0; + dimension->masks.num_masks = 0; + dimension->counters.num_masks = 0; + } + + +#if 0 + + /* set a bit at a given index in the current hint mask */ + static FT_Error + ps_dimension_set_mask_bit( PS_Dimension dim, + FT_UInt idx, + FT_Memory memory ) + { + PS_Mask mask; + FT_Error error = PSH_Err_Ok; + + + /* get last hint mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + + Exit: + return error; + } + +#endif + + /* set the end point in a mask, called from "End" & "Reset" methods */ + static void + ps_dimension_end_mask( PS_Dimension dim, + FT_UInt end_point ) + { + FT_UInt count = dim->masks.num_masks; + PS_Mask mask; + + + if ( count > 0 ) + { + mask = dim->masks.masks + count - 1; + mask->end_point = end_point; + } + } + + + /* set the end point in the current mask, then create a new empty one */ + /* (called by "Reset" method) */ + static FT_Error + ps_dimension_reset_mask( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + PS_Mask mask; + + + /* end current mask */ + ps_dimension_end_mask( dim, end_point ); + + /* allocate new one */ + return ps_mask_table_alloc( &dim->masks, memory, &mask ); + } + + + /* set a new mask, called from the "T2Stem" method */ + static FT_Error + ps_dimension_set_mask_bits( PS_Dimension dim, + const FT_Byte* source, + FT_UInt source_pos, + FT_UInt source_bits, + FT_UInt end_point, + FT_Memory memory ) + { + FT_Error error = PSH_Err_Ok; + + + /* reset current mask, if any */ + error = ps_dimension_reset_mask( dim, end_point, memory ); + if ( error ) + goto Exit; + + /* set bits in new mask */ + error = ps_mask_table_set_bits( &dim->masks, source, + source_pos, source_bits, memory ); + + Exit: + return error; + } + + + /* add a new single stem (called from "T1Stem" method) */ + static FT_Error + ps_dimension_add_t1stem( PS_Dimension dim, + FT_Int pos, + FT_Int len, + FT_Memory memory, + FT_Int *aindex ) + { + FT_Error error = PSH_Err_Ok; + FT_UInt flags = 0; + + + /* detect ghost stem */ + if ( len < 0 ) + { + flags |= PS_HINT_FLAG_GHOST; + if ( len == -21 ) + { + flags |= PS_HINT_FLAG_BOTTOM; + pos += len; + } + len = 0; + } + + if ( aindex ) + *aindex = -1; + + /* now, lookup stem in the current hints table */ + { + PS_Mask mask; + FT_UInt idx; + FT_UInt max = dim->hints.num_hints; + PS_Hint hint = dim->hints.hints; + + + for ( idx = 0; idx < max; idx++, hint++ ) + { + if ( hint->pos == pos && hint->len == len ) + break; + } + + /* we need to create a new hint in the table */ + if ( idx >= max ) + { + error = ps_hint_table_alloc( &dim->hints, memory, &hint ); + if ( error ) + goto Exit; + + hint->pos = pos; + hint->len = len; + hint->flags = flags; + } + + /* now, store the hint in the current mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + if ( error ) + goto Exit; + + if ( aindex ) + *aindex = (FT_Int)idx; + } + + Exit: + return error; + } + + + /* add a "hstem3/vstem3" counter to our dimension table */ + static FT_Error + ps_dimension_add_counter( PS_Dimension dim, + FT_Int hint1, + FT_Int hint2, + FT_Int hint3, + FT_Memory memory ) + { + FT_Error error = PSH_Err_Ok; + FT_UInt count = dim->counters.num_masks; + PS_Mask counter = dim->counters.masks; + + + /* try to find an existing counter mask that already uses */ + /* one of these stems here */ + for ( ; count > 0; count--, counter++ ) + { + if ( ps_mask_test_bit( counter, hint1 ) || + ps_mask_test_bit( counter, hint2 ) || + ps_mask_test_bit( counter, hint3 ) ) + break; + } + + /* create a new counter when needed */ + if ( count == 0 ) + { + error = ps_mask_table_alloc( &dim->counters, memory, &counter ); + if ( error ) + goto Exit; + } + + /* now, set the bits for our hints in the counter mask */ + error = ps_mask_set_bit( counter, hint1, memory ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( counter, hint2, memory ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( counter, hint3, memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* end of recording session for a given dimension */ + static FT_Error + ps_dimension_end( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + /* end hint mask table */ + ps_dimension_end_mask( dim, end_point ); + + /* merge all counter masks into independent "paths" */ + return ps_mask_table_merge_all( &dim->counters, memory ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_RECORDER MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* destroy hints */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ) + { + FT_Memory memory = hints->memory; + + + ps_dimension_done( &hints->dimension[0], memory ); + ps_dimension_done( &hints->dimension[1], memory ); + + hints->error = PSH_Err_Ok; + hints->memory = 0; + } + + + FT_LOCAL( FT_Error ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ) + { + FT_MEM_ZERO( hints, sizeof ( *hints ) ); + hints->memory = memory; + return PSH_Err_Ok; + } + + + /* initialize a hints for a new session */ + static void + ps_hints_open( PS_Hints hints, + PS_Hint_Type hint_type ) + { + switch ( hint_type ) + { + case PS_HINT_TYPE_1: + case PS_HINT_TYPE_2: + hints->error = PSH_Err_Ok; + hints->hint_type = hint_type; + + ps_dimension_init( &hints->dimension[0] ); + ps_dimension_init( &hints->dimension[1] ); + break; + + default: + hints->error = PSH_Err_Invalid_Argument; + hints->hint_type = hint_type; + + FT_TRACE0(( "ps_hints_open: invalid charstring type\n" )); + break; + } + } + + + /* add one or more stems to the current hints table */ + static void + ps_hints_stem( PS_Hints hints, + FT_Int dimension, + FT_UInt count, + FT_Long* stems ) + { + if ( !hints->error ) + { + /* limit "dimension" to 0..1 */ + if ( dimension < 0 || dimension > 1 ) + { + FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + /* record the stems in the current hints/masks table */ + switch ( hints->hint_type ) + { + case PS_HINT_TYPE_1: /* Type 1 "hstem" or "vstem" operator */ + case PS_HINT_TYPE_2: /* Type 2 "hstem" or "vstem" operator */ + { + PS_Dimension dim = &hints->dimension[dimension]; + + + for ( ; count > 0; count--, stems += 2 ) + { + FT_Error error; + FT_Memory memory = hints->memory; + + + error = ps_dimension_add_t1stem( + dim, (FT_Int)stems[0], (FT_Int)stems[1], + memory, NULL ); + if ( error ) + { + FT_ERROR(( "ps_hints_stem: could not add stem" + " (%d,%d) to hints table\n", stems[0], stems[1] )); + + hints->error = error; + return; + } + } + break; + } + + default: + FT_TRACE0(( "ps_hints_stem: called with invalid hint type (%d)\n", + hints->hint_type )); + break; + } + } + } + + + /* add one Type1 counter stem to the current hints table */ + static void + ps_hints_t1stem3( PS_Hints hints, + FT_Int dimension, + FT_Fixed* stems ) + { + FT_Error error = PSH_Err_Ok; + + + if ( !hints->error ) + { + PS_Dimension dim; + FT_Memory memory = hints->memory; + FT_Int count; + FT_Int idx[3]; + + + /* limit "dimension" to 0..1 */ + if ( dimension < 0 || dimension > 1 ) + { + FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + dim = &hints->dimension[dimension]; + + /* there must be 6 elements in the 'stem' array */ + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + /* add the three stems to our hints/masks table */ + for ( count = 0; count < 3; count++, stems += 2 ) + { + error = ps_dimension_add_t1stem( dim, + (FT_Int)FIXED_TO_INT( stems[0] ), + (FT_Int)FIXED_TO_INT( stems[1] ), + memory, &idx[count] ); + if ( error ) + goto Fail; + } + + /* now, add the hints to the counters table */ + error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2], + memory ); + if ( error ) + goto Fail; + } + else + { + FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" )); + error = PSH_Err_Invalid_Argument; + goto Fail; + } + } + + return; + + Fail: + FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" )); + hints->error = error; + } + + + /* reset hints (only with Type 1 hints) */ + static void + ps_hints_t1reset( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error = PSH_Err_Ok; + + + if ( !hints->error ) + { + FT_Memory memory = hints->memory; + + + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + error = ps_dimension_reset_mask( &hints->dimension[0], + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_reset_mask( &hints->dimension[1], + end_point, memory ); + if ( error ) + goto Fail; + } + else + { + /* invalid hint type */ + error = PSH_Err_Invalid_Argument; + goto Fail; + } + } + return; + + Fail: + hints->error = error; + } + + + /* Type2 "hintmask" operator, add a new hintmask to each direction */ + static void + ps_hints_t2mask( PS_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count; must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_TRACE0(( "ps_hints_t2mask:" + " called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, + end_point, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + static void + ps_hints_t2counter( PS_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count, must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_TRACE0(( "ps_hints_t2counter:" + " called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, + 0, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, + 0, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + /* end recording session */ + static FT_Error + ps_hints_close( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error; + + + error = hints->error; + if ( !error ) + { + FT_Memory memory = hints->memory; + PS_Dimension dim = hints->dimension; + + + error = ps_dimension_end( &dim[0], end_point, memory ); + if ( !error ) + { + error = ps_dimension_end( &dim[1], end_point, memory ); + } + } + +#ifdef DEBUG_HINTER + if ( !error ) + ps_debug_hints = hints; +#endif + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_hints_open( T1_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); + } + + static void + t1_hints_stem( T1_Hints hints, + FT_Int dimension, + FT_Fixed* coords ) + { + FT_Pos stems[2]; + + + stems[0] = FIXED_TO_INT( coords[0] ); + stems[1] = FIXED_TO_INT( coords[1] ); + + ps_hints_stem( (PS_Hints)hints, dimension, 1, stems ); + } + + + FT_LOCAL_DEF( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) + { + FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) ); + + funcs->open = (T1_Hints_OpenFunc) t1_hints_open; + funcs->close = (T1_Hints_CloseFunc) ps_hints_close; + funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; + funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; + funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; + funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 2 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t2_hints_open( T2_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 ); + } + + + static void + t2_hints_stems( T2_Hints hints, + FT_Int dimension, + FT_Int count, + FT_Fixed* coords ) + { + FT_Pos stems[32], y, n; + FT_Int total = count; + + + y = 0; + while ( total > 0 ) + { + /* determine number of stems to write */ + count = total; + if ( count > 16 ) + count = 16; + + /* compute integer stem positions in font units */ + for ( n = 0; n < count * 2; n++ ) + { + y += coords[n]; + stems[n] = FIXED_TO_INT( y ); + } + + /* compute lengths */ + for ( n = 0; n < count * 2; n += 2 ) + stems[n + 1] = stems[n + 1] - stems[n]; + + /* add them to the current dimension */ + ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); + + total -= count; + } + } + + + FT_LOCAL_DEF( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) + { + FT_MEM_ZERO( funcs, sizeof ( *funcs ) ); + + funcs->open = (T2_Hints_OpenFunc) t2_hints_open; + funcs->close = (T2_Hints_CloseFunc) ps_hints_close; + funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; + funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; + funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; + funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/pshrec.h b/alienblaster/project/jni/freetype/src/pshinter/pshrec.h new file mode 100644 index 000000000..dcb3197f9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/pshrec.h @@ -0,0 +1,176 @@ +/***************************************************************************/ +/* */ +/* pshrec.h */ +/* */ +/* Postscript (Type1/Type2) hints recorder (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /**************************************************************************/ + /* */ + /* The functions defined here are called from the Type 1, CID and CFF */ + /* font drivers to record the hints of a given character/glyph. */ + /* */ + /* The hints are recorded in a unified format, and are later processed */ + /* by the `optimizer' and `fitter' to adjust the outlines to the pixel */ + /* grid. */ + /* */ + /**************************************************************************/ + + +#ifndef __PSHREC_H__ +#define __PSHREC_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include "pshglob.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH HINTS RECORDER INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to hint record */ + typedef struct PS_HintRec_* PS_Hint; + + /* hint types */ + typedef enum PS_Hint_Type_ + { + PS_HINT_TYPE_1 = 1, + PS_HINT_TYPE_2 = 2 + + } PS_Hint_Type; + + + /* hint flags */ + typedef enum PS_Hint_Flags_ + { + PS_HINT_FLAG_GHOST = 1, + PS_HINT_FLAG_BOTTOM = 2 + + } PS_Hint_Flags; + + + /* hint descriptor */ + typedef struct PS_HintRec_ + { + FT_Int pos; + FT_Int len; + FT_UInt flags; + + } PS_HintRec; + + +#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE ) +#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST ) +#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM ) + + + /* hints table descriptor */ + typedef struct PS_Hint_TableRec_ + { + FT_UInt num_hints; + FT_UInt max_hints; + PS_Hint hints; + + } PS_Hint_TableRec, *PS_Hint_Table; + + + /* hint and counter mask descriptor */ + typedef struct PS_MaskRec_ + { + FT_UInt num_bits; + FT_UInt max_bits; + FT_Byte* bytes; + FT_UInt end_point; + + } PS_MaskRec, *PS_Mask; + + + /* masks and counters table descriptor */ + typedef struct PS_Mask_TableRec_ + { + FT_UInt num_masks; + FT_UInt max_masks; + PS_Mask masks; + + } PS_Mask_TableRec, *PS_Mask_Table; + + + /* dimension-specific hints descriptor */ + typedef struct PS_DimensionRec_ + { + PS_Hint_TableRec hints; + PS_Mask_TableRec masks; + PS_Mask_TableRec counters; + + } PS_DimensionRec, *PS_Dimension; + + + /* glyph hints descriptor */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PS_HintsRec_ + { + FT_Memory memory; + FT_Error error; + FT_UInt32 magic; + PS_Hint_Type hint_type; + PS_DimensionRec dimension[2]; + + } PS_HintsRec, *PS_Hints; + + /* */ + + /* initialize hints recorder */ + FT_LOCAL( FT_Error ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ); + + /* finalize hints recorder */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ); + + /* initialize Type1 hints recorder interface */ + FT_LOCAL( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ); + + /* initialize Type2 hints recorder interface */ + FT_LOCAL( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ); + + +#ifdef DEBUG_HINTER + extern PS_Hints ps_debug_hints; + extern int ps_debug_no_horz_hints; + extern int ps_debug_no_vert_hints; +#endif + + /* */ + + +FT_END_HEADER + + +#endif /* __PS_HINTER_RECORD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/pshinter/rules.mk b/alienblaster/project/jni/freetype/src/pshinter/rules.mk new file mode 100644 index 000000000..57773394a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/pshinter/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 PSHinter driver configuration rules +# + + +# Copyright 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# PSHINTER driver directory +# +PSHINTER_DIR := $(SRC_DIR)/pshinter + + +# compilation flags for the driver +# +PSHINTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR)) + + +# PSHINTER driver sources (i.e., C files) +# +PSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshrec.c \ + $(PSHINTER_DIR)/pshglob.c \ + $(PSHINTER_DIR)/pshmod.c \ + $(PSHINTER_DIR)/pshalgo.c + + +# PSHINTER driver headers +# +PSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \ + $(PSHINTER_DIR)/pshnterr.h + + +# PSHINTER driver object(s) +# +# PSHINTER_DRV_OBJ_M is used during `multi' builds. +# PSHINTER_DRV_OBJ_S is used during `single' builds. +# +PSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O + +# PSHINTER driver source file for single build +# +PSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c + + +# PSHINTER driver - single object +# +$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \ + $(FREETYPE_H) $(PSHINTER_DRV_H) + $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S)) + + +# PSHINTER driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H) + $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSHINTER_DRV_OBJ_S) +DRV_OBJS_M += $(PSHINTER_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/psnames/Jamfile b/alienblaster/project/jni/freetype/src/psnames/Jamfile new file mode 100644 index 000000000..06c0dda66 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/psnames Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) psnames ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = psmodule pspic ; + } + else + { + _sources = psnames ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/psnames Jamfile diff --git a/alienblaster/project/jni/freetype/src/psnames/module.mk b/alienblaster/project/jni/freetype/src/psnames/module.mk new file mode 100644 index 000000000..a6e908257 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 PSnames module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += PSNAMES_MODULE + +define PSNAMES_MODULE +$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)psnames $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/psnames/psmodule.c b/alienblaster/project/jni/freetype/src/psnames/psmodule.c new file mode 100644 index 000000000..00b363f8b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/psmodule.c @@ -0,0 +1,595 @@ +/***************************************************************************/ +/* */ +/* psmodule.c */ +/* */ +/* PSNames module implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#include "psmodule.h" +#include "pstables.h" + +#include "psnamerr.h" +#include "pspic.h" + + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + +#define VARIANT_BIT 0x80000000UL +#define BASE_GLYPH( code ) ( (FT_UInt32)( (code) & ~VARIANT_BIT ) ) + + + /* Return the Unicode value corresponding to a given glyph. Note that */ + /* we do deal with glyph variants by detecting a non-initial dot in */ + /* the name, as in `A.swash' or `e.final'; in this case, the */ + /* VARIANT_BIT is set in the return value. */ + /* */ + static FT_UInt32 + ps_unicode_value( const char* glyph_name ) + { + /* If the name begins with `uni', then the glyph name may be a */ + /* hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' && + glyph_name[1] == 'n' && + glyph_name[2] == 'i' ) + { + /* determine whether the next four characters following are */ + /* hexadecimal. */ + + /* XXX: Add code to deal with ligatures, i.e. glyph names like */ + /* `uniXXXXYYYYZZZZ'... */ + + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 3; + + + for ( count = 4; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + /* Exit if a non-uppercase hexadecimal character was found */ + /* -- this also catches character codes below `0' since such */ + /* negative numbers cast to `unsigned int' are far too big. */ + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + /* there must be exactly four hex digits */ + if ( count == 0 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return (FT_UInt32)( value | VARIANT_BIT ); + } + } + + /* If the name begins with `u', followed by four to six uppercase */ + /* hexadecimal digits, it is a hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' ) + { + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 1; + + + for ( count = 6; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + if ( count <= 2 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return (FT_UInt32)( value | VARIANT_BIT ); + } + } + + /* Look for a non-initial dot in the glyph name in order to */ + /* find variants like `A.swash', `e.final', etc. */ + { + const char* p = glyph_name; + const char* dot = NULL; + + + for ( ; *p; p++ ) + { + if ( *p == '.' && p > glyph_name ) + { + dot = p; + break; + } + } + + /* now look up the glyph in the Adobe Glyph List */ + if ( !dot ) + return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p ); + else + return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) | + VARIANT_BIT ); + } + } + + + /* ft_qsort callback to sort the unicode map */ + FT_CALLBACK_DEF( int ) + compare_uni_maps( const void* a, + const void* b ) + { + PS_UniMap* map1 = (PS_UniMap*)a; + PS_UniMap* map2 = (PS_UniMap*)b; + FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode ); + FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode ); + + + /* sort base glyphs before glyph variants */ + if ( unicode1 == unicode2 ) + { + if ( map1->unicode > map2->unicode ) + return 1; + else if ( map1->unicode < map2->unicode ) + return -1; + else + return 0; + } + else + { + if ( unicode1 > unicode2 ) + return 1; + else if ( unicode1 < unicode2 ) + return -1; + else + return 0; + } + } + + + /* support for extra glyphs not handled (well) in AGL; */ + /* we add extra mappings for them if necessary */ + +#define EXTRA_GLYPH_LIST_SIZE 10 + + static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] = + { + /* WGL 4 */ + 0x0394, + 0x03A9, + 0x2215, + 0x00AD, + 0x02C9, + 0x03BC, + 0x2219, + 0x00A0, + /* Romanian */ + 0x021A, + 0x021B + }; + + static const char ft_extra_glyph_names[] = + { + 'D','e','l','t','a',0, + 'O','m','e','g','a',0, + 'f','r','a','c','t','i','o','n',0, + 'h','y','p','h','e','n',0, + 'm','a','c','r','o','n',0, + 'm','u',0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0, + 's','p','a','c','e',0, + 'T','c','o','m','m','a','a','c','c','e','n','t',0, + 't','c','o','m','m','a','a','c','c','e','n','t',0 + }; + + static const FT_Int + ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] = + { + 0, + 6, + 12, + 21, + 28, + 35, + 38, + 53, + 59, + 72 + }; + + + static void + ps_check_extra_glyph_name( const char* gname, + FT_UInt glyph, + FT_UInt* extra_glyphs, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( ft_strcmp( ft_extra_glyph_names + + ft_extra_glyph_name_offsets[n], gname ) == 0 ) + { + if ( states[n] == 0 ) + { + /* mark this extra glyph as a candidate for the cmap */ + states[n] = 1; + extra_glyphs[n] = glyph; + } + + return; + } + } + } + + + static void + ps_check_extra_glyph_unicode( FT_UInt32 uni_char, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( uni_char == ft_extra_glyph_unicodes[n] ) + { + /* disable this extra glyph from being added to the cmap */ + states[n] = 2; + + return; + } + } + } + + + /* Build a table that maps Unicode values to glyph indices. */ + static FT_Error + ps_unicodes_init( FT_Memory memory, + PS_Unicodes table, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ) + { + FT_Error error; + + FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE]; + + + /* we first allocate the table */ + table->num_maps = 0; + table->maps = 0; + + if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) ) + { + FT_UInt n; + FT_UInt count; + PS_UniMap* map; + FT_UInt32 uni_char; + + + map = table->maps; + + for ( n = 0; n < num_glyphs; n++ ) + { + const char* gname = get_glyph_name( glyph_data, n ); + + + if ( gname ) + { + ps_check_extra_glyph_name( gname, n, + extra_glyphs, extra_glyph_list_states ); + uni_char = ps_unicode_value( gname ); + + if ( BASE_GLYPH( uni_char ) != 0 ) + { + ps_check_extra_glyph_unicode( uni_char, + extra_glyph_list_states ); + map->unicode = uni_char; + map->glyph_index = n; + map++; + } + + if ( free_glyph_name ) + free_glyph_name( glyph_data, gname ); + } + } + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( extra_glyph_list_states[n] == 1 ) + { + /* This glyph name has an additional representation. */ + /* Add it to the cmap. */ + + map->unicode = ft_extra_glyph_unicodes[n]; + map->glyph_index = extra_glyphs[n]; + map++; + } + } + + /* now compress the table a bit */ + count = (FT_UInt)( map - table->maps ); + + if ( count == 0 ) + { + FT_FREE( table->maps ); + if ( !error ) + error = PSnames_Err_Invalid_Argument; /* No unicode chars here! */ + } + else { + /* Reallocate if the number of used entries is much smaller. */ + if ( count < num_glyphs / 2 ) + { + (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count ); + error = PSnames_Err_Ok; + } + + /* Sort the table in increasing order of unicode values, */ + /* taking care of glyph variants. */ + ft_qsort( table->maps, count, sizeof ( PS_UniMap ), + compare_uni_maps ); + } + + table->num_maps = count; + } + + return error; + } + + + static FT_UInt + ps_unicodes_char_index( PS_Unicodes table, + FT_UInt32 unicode ) + { + PS_UniMap *min, *max, *mid, *result = NULL; + + + /* Perform a binary search on the table. */ + + min = table->maps; + max = min + table->num_maps - 1; + + while ( min <= max ) + { + FT_UInt32 base_glyph; + + + mid = min + ( ( max - min ) >> 1 ); + + if ( mid->unicode == unicode ) + { + result = mid; + break; + } + + base_glyph = BASE_GLYPH( mid->unicode ); + + if ( base_glyph == unicode ) + result = mid; /* remember match but continue search for base glyph */ + + if ( min == max ) + break; + + if ( base_glyph < unicode ) + min = mid + 1; + else + max = mid - 1; + } + + if ( result ) + return result->glyph_index; + else + return 0; + } + + + static FT_UInt32 + ps_unicodes_char_next( PS_Unicodes table, + FT_UInt32 *unicode ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *unicode + 1; + + + { + FT_UInt min = 0; + FT_UInt max = table->num_maps; + FT_UInt mid; + PS_UniMap* map; + FT_UInt32 base_glyph; + + + while ( min < max ) + { + mid = min + ( ( max - min ) >> 1 ); + map = table->maps + mid; + + if ( map->unicode == char_code ) + { + result = map->glyph_index; + goto Exit; + } + + base_glyph = BASE_GLYPH( map->unicode ); + + if ( base_glyph == char_code ) + result = map->glyph_index; + + if ( base_glyph < char_code ) + min = mid + 1; + else + max = mid; + } + + if ( result ) + goto Exit; /* we have a variant glyph */ + + /* we didn't find it; check whether we have a map just above it */ + char_code = 0; + + if ( min < table->num_maps ) + { + map = table->maps + min; + result = map->glyph_index; + char_code = BASE_GLYPH( map->unicode ); + } + } + + Exit: + *unicode = char_code; + return result; + } + + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + static const char* + ps_get_macintosh_name( FT_UInt name_index ) + { + if ( name_index >= FT_NUM_MAC_NAMES ) + name_index = 0; + + return ft_standard_glyph_names + ft_mac_names[name_index]; + } + + + static const char* + ps_get_standard_strings( FT_UInt sid ) + { + if ( sid >= FT_NUM_SID_NAMES ) + return 0; + + return ft_standard_glyph_names + ft_sid_names[sid]; + } + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + FT_DEFINE_SERVICE_PSCMAPSREC(pscmaps_interface, + (PS_Unicode_ValueFunc) ps_unicode_value, + (PS_Unicodes_InitFunc) ps_unicodes_init, + (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, + (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, + + (PS_Macintosh_NameFunc) ps_get_macintosh_name, + (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, + + t1_standard_encoding, + t1_expert_encoding + ) + +#else + + FT_DEFINE_SERVICE_PSCMAPSREC(pscmaps_interface, + 0, + 0, + 0, + 0, + + (PS_Macintosh_NameFunc) ps_get_macintosh_name, + (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, + + t1_standard_encoding, + t1_expert_encoding + ) + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + FT_DEFINE_SERVICEDESCREC1(pscmaps_services, + FT_SERVICE_ID_POSTSCRIPT_CMAPS, &FT_PSCMAPS_INTERFACE_GET + ) + + + + + static FT_Pointer + psnames_get_service( FT_Module module, + const char* service_id ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( FT_PSCMAPS_SERVICES_GET, service_id ); + } + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + +#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES +#define PUT_PS_NAMES_SERVICE(a) 0 +#else +#define PUT_PS_NAMES_SERVICE(a) a +#endif + + FT_DEFINE_MODULE(psnames_module_class, + + 0, /* this is not a font driver, nor a renderer */ + sizeof ( FT_ModuleRec ), + + "psnames", /* driver name */ + 0x10000L, /* driver version */ + 0x20000L, /* driver requires FreeType 2 or above */ + + PUT_PS_NAMES_SERVICE((void*)&FT_PSCMAPS_INTERFACE_GET), /* module specific interface */ + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) PUT_PS_NAMES_SERVICE(psnames_get_service) + ) + + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psnames/psmodule.h b/alienblaster/project/jni/freetype/src/psnames/psmodule.h new file mode 100644 index 000000000..28fa14807 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/psmodule.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* psmodule.h */ +/* */ +/* High-level PSNames module interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSMODULE_H__ +#define __PSMODULE_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( psnames_module_class ) + + +FT_END_HEADER + +#endif /* __PSMODULE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psnames/psnamerr.h b/alienblaster/project/jni/freetype/src/psnames/psnamerr.h new file mode 100644 index 000000000..ae1541d96 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/psnamerr.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* psnamerr.h */ +/* */ +/* PS names module error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the PS names module error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __PSNAMERR_H__ +#define __PSNAMERR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX PSnames_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSnames + +#include FT_ERRORS_H + +#endif /* __PSNAMERR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psnames/pspic.c b/alienblaster/project/jni/freetype/src/psnames/pspic.c new file mode 100644 index 000000000..ed7dadda3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/pspic.c @@ -0,0 +1,77 @@ +/***************************************************************************/ +/* */ +/* pspic.c */ +/* */ +/* The FreeType position independent code services for psnames module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pspic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from psmodule.c */ + FT_Error FT_Create_Class_pscmaps_services( FT_Library, FT_ServiceDescRec**); + void FT_Destroy_Class_pscmaps_services( FT_Library, FT_ServiceDescRec*); + void FT_Init_Class_pscmaps_interface( FT_Library, FT_Service_PsCMapsRec*); + + void + psnames_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->psnames ) + { + PSModulePIC* container = (PSModulePIC*)pic_container->psnames; + if(container->pscmaps_services) + FT_Destroy_Class_pscmaps_services(library, container->pscmaps_services); + container->pscmaps_services = NULL; + FT_FREE( container ); + pic_container->psnames = NULL; + } + } + + FT_Error + psnames_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + PSModulePIC* container; + FT_Memory memory = library->memory; + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->psnames = container; + + /* initialize pointer table - this is how the module usually expects this data */ + error = FT_Create_Class_pscmaps_services(library, &container->pscmaps_services); + if(error) + goto Exit; + FT_Init_Class_pscmaps_interface(library, &container->pscmaps_interface); + +Exit: + if(error) + psnames_module_class_pic_free(library); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psnames/pspic.h b/alienblaster/project/jni/freetype/src/psnames/pspic.h new file mode 100644 index 000000000..75a14fdcb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/pspic.h @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* pspic.h */ +/* */ +/* The FreeType position independent code services for psnames module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSPIC_H__ +#define __PSPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_PSCMAPS_SERVICES_GET pscmaps_services +#define FT_PSCMAPS_INTERFACE_GET pscmaps_interface + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + typedef struct PSModulePIC_ + { + FT_ServiceDescRec* pscmaps_services; + FT_Service_PsCMapsRec pscmaps_interface; + } PSModulePIC; + +#define GET_PIC(lib) ((PSModulePIC*)((lib)->pic_container.psnames)) +#define FT_PSCMAPS_SERVICES_GET (GET_PIC(library)->pscmaps_services) +#define FT_PSCMAPS_INTERFACE_GET (GET_PIC(library)->pscmaps_interface) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __PSPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psnames/pstables.h b/alienblaster/project/jni/freetype/src/psnames/pstables.h new file mode 100644 index 000000000..1521e9c28 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/pstables.h @@ -0,0 +1,4095 @@ +/***************************************************************************/ +/* */ +/* pstables.h */ +/* */ +/* PostScript glyph names. */ +/* */ +/* Copyright 2005, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /* This file has been generated automatically -- do not edit! */ + + + static const char ft_standard_glyph_names[3696] = + { + '.','n','u','l','l', 0, + 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0, + 'n','o','t','e','q','u','a','l', 0, + 'i','n','f','i','n','i','t','y', 0, + 'l','e','s','s','e','q','u','a','l', 0, + 'g','r','e','a','t','e','r','e','q','u','a','l', 0, + 'p','a','r','t','i','a','l','d','i','f','f', 0, + 's','u','m','m','a','t','i','o','n', 0, + 'p','r','o','d','u','c','t', 0, + 'p','i', 0, + 'i','n','t','e','g','r','a','l', 0, + 'O','m','e','g','a', 0, + 'r','a','d','i','c','a','l', 0, + 'a','p','p','r','o','x','e','q','u','a','l', 0, + 'D','e','l','t','a', 0, + 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0, + 'l','o','z','e','n','g','e', 0, + 'a','p','p','l','e', 0, + 'f','r','a','n','c', 0, + 'G','b','r','e','v','e', 0, + 'g','b','r','e','v','e', 0, + 'I','d','o','t','a','c','c','e','n','t', 0, + 'S','c','e','d','i','l','l','a', 0, + 's','c','e','d','i','l','l','a', 0, + 'C','a','c','u','t','e', 0, + 'c','a','c','u','t','e', 0, + 'C','c','a','r','o','n', 0, + 'c','c','a','r','o','n', 0, + 'd','c','r','o','a','t', 0, + '.','n','o','t','d','e','f', 0, + 's','p','a','c','e', 0, + 'e','x','c','l','a','m', 0, + 'q','u','o','t','e','d','b','l', 0, + 'n','u','m','b','e','r','s','i','g','n', 0, + 'd','o','l','l','a','r', 0, + 'p','e','r','c','e','n','t', 0, + 'a','m','p','e','r','s','a','n','d', 0, + 'q','u','o','t','e','r','i','g','h','t', 0, + 'p','a','r','e','n','l','e','f','t', 0, + 'p','a','r','e','n','r','i','g','h','t', 0, + 'a','s','t','e','r','i','s','k', 0, + 'p','l','u','s', 0, + 'c','o','m','m','a', 0, + 'h','y','p','h','e','n', 0, + 'p','e','r','i','o','d', 0, + 's','l','a','s','h', 0, + 'z','e','r','o', 0, + 'o','n','e', 0, + 't','w','o', 0, + 't','h','r','e','e', 0, + 'f','o','u','r', 0, + 'f','i','v','e', 0, + 's','i','x', 0, + 's','e','v','e','n', 0, + 'e','i','g','h','t', 0, + 'n','i','n','e', 0, + 'c','o','l','o','n', 0, + 's','e','m','i','c','o','l','o','n', 0, + 'l','e','s','s', 0, + 'e','q','u','a','l', 0, + 'g','r','e','a','t','e','r', 0, + 'q','u','e','s','t','i','o','n', 0, + 'a','t', 0, + 'A', 0, + 'B', 0, + 'C', 0, + 'D', 0, + 'E', 0, + 'F', 0, + 'G', 0, + 'H', 0, + 'I', 0, + 'J', 0, + 'K', 0, + 'L', 0, + 'M', 0, + 'N', 0, + 'O', 0, + 'P', 0, + 'Q', 0, + 'R', 0, + 'S', 0, + 'T', 0, + 'U', 0, + 'V', 0, + 'W', 0, + 'X', 0, + 'Y', 0, + 'Z', 0, + 'b','r','a','c','k','e','t','l','e','f','t', 0, + 'b','a','c','k','s','l','a','s','h', 0, + 'b','r','a','c','k','e','t','r','i','g','h','t', 0, + 'a','s','c','i','i','c','i','r','c','u','m', 0, + 'u','n','d','e','r','s','c','o','r','e', 0, + 'q','u','o','t','e','l','e','f','t', 0, + 'a', 0, + 'b', 0, + 'c', 0, + 'd', 0, + 'e', 0, + 'f', 0, + 'g', 0, + 'h', 0, + 'i', 0, + 'j', 0, + 'k', 0, + 'l', 0, + 'm', 0, + 'n', 0, + 'o', 0, + 'p', 0, + 'q', 0, + 'r', 0, + 's', 0, + 't', 0, + 'u', 0, + 'v', 0, + 'w', 0, + 'x', 0, + 'y', 0, + 'z', 0, + 'b','r','a','c','e','l','e','f','t', 0, + 'b','a','r', 0, + 'b','r','a','c','e','r','i','g','h','t', 0, + 'a','s','c','i','i','t','i','l','d','e', 0, + 'e','x','c','l','a','m','d','o','w','n', 0, + 'c','e','n','t', 0, + 's','t','e','r','l','i','n','g', 0, + 'f','r','a','c','t','i','o','n', 0, + 'y','e','n', 0, + 'f','l','o','r','i','n', 0, + 's','e','c','t','i','o','n', 0, + 'c','u','r','r','e','n','c','y', 0, + 'q','u','o','t','e','s','i','n','g','l','e', 0, + 'q','u','o','t','e','d','b','l','l','e','f','t', 0, + 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0, + 'f','i', 0, + 'f','l', 0, + 'e','n','d','a','s','h', 0, + 'd','a','g','g','e','r', 0, + 'd','a','g','g','e','r','d','b','l', 0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0, + 'p','a','r','a','g','r','a','p','h', 0, + 'b','u','l','l','e','t', 0, + 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0, + 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0, + 'e','l','l','i','p','s','i','s', 0, + 'p','e','r','t','h','o','u','s','a','n','d', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n', 0, + 'g','r','a','v','e', 0, + 'a','c','u','t','e', 0, + 'c','i','r','c','u','m','f','l','e','x', 0, + 't','i','l','d','e', 0, + 'm','a','c','r','o','n', 0, + 'b','r','e','v','e', 0, + 'd','o','t','a','c','c','e','n','t', 0, + 'd','i','e','r','e','s','i','s', 0, + 'r','i','n','g', 0, + 'c','e','d','i','l','l','a', 0, + 'h','u','n','g','a','r','u','m','l','a','u','t', 0, + 'o','g','o','n','e','k', 0, + 'c','a','r','o','n', 0, + 'e','m','d','a','s','h', 0, + 'A','E', 0, + 'o','r','d','f','e','m','i','n','i','n','e', 0, + 'L','s','l','a','s','h', 0, + 'O','s','l','a','s','h', 0, + 'O','E', 0, + 'o','r','d','m','a','s','c','u','l','i','n','e', 0, + 'a','e', 0, + 'd','o','t','l','e','s','s','i', 0, + 'l','s','l','a','s','h', 0, + 'o','s','l','a','s','h', 0, + 'o','e', 0, + 'g','e','r','m','a','n','d','b','l','s', 0, + 'o','n','e','s','u','p','e','r','i','o','r', 0, + 'l','o','g','i','c','a','l','n','o','t', 0, + 'm','u', 0, + 't','r','a','d','e','m','a','r','k', 0, + 'E','t','h', 0, + 'o','n','e','h','a','l','f', 0, + 'p','l','u','s','m','i','n','u','s', 0, + 'T','h','o','r','n', 0, + 'o','n','e','q','u','a','r','t','e','r', 0, + 'd','i','v','i','d','e', 0, + 'b','r','o','k','e','n','b','a','r', 0, + 'd','e','g','r','e','e', 0, + 't','h','o','r','n', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s', 0, + 't','w','o','s','u','p','e','r','i','o','r', 0, + 'r','e','g','i','s','t','e','r','e','d', 0, + 'm','i','n','u','s', 0, + 'e','t','h', 0, + 'm','u','l','t','i','p','l','y', 0, + 't','h','r','e','e','s','u','p','e','r','i','o','r', 0, + 'c','o','p','y','r','i','g','h','t', 0, + 'A','a','c','u','t','e', 0, + 'A','c','i','r','c','u','m','f','l','e','x', 0, + 'A','d','i','e','r','e','s','i','s', 0, + 'A','g','r','a','v','e', 0, + 'A','r','i','n','g', 0, + 'A','t','i','l','d','e', 0, + 'C','c','e','d','i','l','l','a', 0, + 'E','a','c','u','t','e', 0, + 'E','c','i','r','c','u','m','f','l','e','x', 0, + 'E','d','i','e','r','e','s','i','s', 0, + 'E','g','r','a','v','e', 0, + 'I','a','c','u','t','e', 0, + 'I','c','i','r','c','u','m','f','l','e','x', 0, + 'I','d','i','e','r','e','s','i','s', 0, + 'I','g','r','a','v','e', 0, + 'N','t','i','l','d','e', 0, + 'O','a','c','u','t','e', 0, + 'O','c','i','r','c','u','m','f','l','e','x', 0, + 'O','d','i','e','r','e','s','i','s', 0, + 'O','g','r','a','v','e', 0, + 'O','t','i','l','d','e', 0, + 'S','c','a','r','o','n', 0, + 'U','a','c','u','t','e', 0, + 'U','c','i','r','c','u','m','f','l','e','x', 0, + 'U','d','i','e','r','e','s','i','s', 0, + 'U','g','r','a','v','e', 0, + 'Y','a','c','u','t','e', 0, + 'Y','d','i','e','r','e','s','i','s', 0, + 'Z','c','a','r','o','n', 0, + 'a','a','c','u','t','e', 0, + 'a','c','i','r','c','u','m','f','l','e','x', 0, + 'a','d','i','e','r','e','s','i','s', 0, + 'a','g','r','a','v','e', 0, + 'a','r','i','n','g', 0, + 'a','t','i','l','d','e', 0, + 'c','c','e','d','i','l','l','a', 0, + 'e','a','c','u','t','e', 0, + 'e','c','i','r','c','u','m','f','l','e','x', 0, + 'e','d','i','e','r','e','s','i','s', 0, + 'e','g','r','a','v','e', 0, + 'i','a','c','u','t','e', 0, + 'i','c','i','r','c','u','m','f','l','e','x', 0, + 'i','d','i','e','r','e','s','i','s', 0, + 'i','g','r','a','v','e', 0, + 'n','t','i','l','d','e', 0, + 'o','a','c','u','t','e', 0, + 'o','c','i','r','c','u','m','f','l','e','x', 0, + 'o','d','i','e','r','e','s','i','s', 0, + 'o','g','r','a','v','e', 0, + 'o','t','i','l','d','e', 0, + 's','c','a','r','o','n', 0, + 'u','a','c','u','t','e', 0, + 'u','c','i','r','c','u','m','f','l','e','x', 0, + 'u','d','i','e','r','e','s','i','s', 0, + 'u','g','r','a','v','e', 0, + 'y','a','c','u','t','e', 0, + 'y','d','i','e','r','e','s','i','s', 0, + 'z','c','a','r','o','n', 0, + 'e','x','c','l','a','m','s','m','a','l','l', 0, + 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0, + 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0, + 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0, + 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0, + 'A','c','u','t','e','s','m','a','l','l', 0, + 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0, + 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0, + 'z','e','r','o','o','l','d','s','t','y','l','e', 0, + 'o','n','e','o','l','d','s','t','y','l','e', 0, + 't','w','o','o','l','d','s','t','y','l','e', 0, + 't','h','r','e','e','o','l','d','s','t','y','l','e', 0, + 'f','o','u','r','o','l','d','s','t','y','l','e', 0, + 'f','i','v','e','o','l','d','s','t','y','l','e', 0, + 's','i','x','o','l','d','s','t','y','l','e', 0, + 's','e','v','e','n','o','l','d','s','t','y','l','e', 0, + 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0, + 'n','i','n','e','o','l','d','s','t','y','l','e', 0, + 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0, + 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0, + 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0, + 'a','s','u','p','e','r','i','o','r', 0, + 'b','s','u','p','e','r','i','o','r', 0, + 'c','e','n','t','s','u','p','e','r','i','o','r', 0, + 'd','s','u','p','e','r','i','o','r', 0, + 'e','s','u','p','e','r','i','o','r', 0, + 'i','s','u','p','e','r','i','o','r', 0, + 'l','s','u','p','e','r','i','o','r', 0, + 'm','s','u','p','e','r','i','o','r', 0, + 'n','s','u','p','e','r','i','o','r', 0, + 'o','s','u','p','e','r','i','o','r', 0, + 'r','s','u','p','e','r','i','o','r', 0, + 's','s','u','p','e','r','i','o','r', 0, + 't','s','u','p','e','r','i','o','r', 0, + 'f','f', 0, + 'f','f','i', 0, + 'f','f','l', 0, + 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0, + 'G','r','a','v','e','s','m','a','l','l', 0, + 'A','s','m','a','l','l', 0, + 'B','s','m','a','l','l', 0, + 'C','s','m','a','l','l', 0, + 'D','s','m','a','l','l', 0, + 'E','s','m','a','l','l', 0, + 'F','s','m','a','l','l', 0, + 'G','s','m','a','l','l', 0, + 'H','s','m','a','l','l', 0, + 'I','s','m','a','l','l', 0, + 'J','s','m','a','l','l', 0, + 'K','s','m','a','l','l', 0, + 'L','s','m','a','l','l', 0, + 'M','s','m','a','l','l', 0, + 'N','s','m','a','l','l', 0, + 'O','s','m','a','l','l', 0, + 'P','s','m','a','l','l', 0, + 'Q','s','m','a','l','l', 0, + 'R','s','m','a','l','l', 0, + 'S','s','m','a','l','l', 0, + 'T','s','m','a','l','l', 0, + 'U','s','m','a','l','l', 0, + 'V','s','m','a','l','l', 0, + 'W','s','m','a','l','l', 0, + 'X','s','m','a','l','l', 0, + 'Y','s','m','a','l','l', 0, + 'Z','s','m','a','l','l', 0, + 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0, + 'o','n','e','f','i','t','t','e','d', 0, + 'r','u','p','i','a','h', 0, + 'T','i','l','d','e','s','m','a','l','l', 0, + 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0, + 'c','e','n','t','o','l','d','s','t','y','l','e', 0, + 'L','s','l','a','s','h','s','m','a','l','l', 0, + 'S','c','a','r','o','n','s','m','a','l','l', 0, + 'Z','c','a','r','o','n','s','m','a','l','l', 0, + 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'B','r','e','v','e','s','m','a','l','l', 0, + 'C','a','r','o','n','s','m','a','l','l', 0, + 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0, + 'M','a','c','r','o','n','s','m','a','l','l', 0, + 'f','i','g','u','r','e','d','a','s','h', 0, + 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0, + 'O','g','o','n','e','k','s','m','a','l','l', 0, + 'R','i','n','g','s','m','a','l','l', 0, + 'C','e','d','i','l','l','a','s','m','a','l','l', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0, + 'o','n','e','e','i','g','h','t','h', 0, + 't','h','r','e','e','e','i','g','h','t','h','s', 0, + 'f','i','v','e','e','i','g','h','t','h','s', 0, + 's','e','v','e','n','e','i','g','h','t','h','s', 0, + 'o','n','e','t','h','i','r','d', 0, + 't','w','o','t','h','i','r','d','s', 0, + 'z','e','r','o','s','u','p','e','r','i','o','r', 0, + 'f','o','u','r','s','u','p','e','r','i','o','r', 0, + 'f','i','v','e','s','u','p','e','r','i','o','r', 0, + 's','i','x','s','u','p','e','r','i','o','r', 0, + 's','e','v','e','n','s','u','p','e','r','i','o','r', 0, + 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 'n','i','n','e','s','u','p','e','r','i','o','r', 0, + 'z','e','r','o','i','n','f','e','r','i','o','r', 0, + 'o','n','e','i','n','f','e','r','i','o','r', 0, + 't','w','o','i','n','f','e','r','i','o','r', 0, + 't','h','r','e','e','i','n','f','e','r','i','o','r', 0, + 'f','o','u','r','i','n','f','e','r','i','o','r', 0, + 'f','i','v','e','i','n','f','e','r','i','o','r', 0, + 's','i','x','i','n','f','e','r','i','o','r', 0, + 's','e','v','e','n','i','n','f','e','r','i','o','r', 0, + 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'n','i','n','e','i','n','f','e','r','i','o','r', 0, + 'c','e','n','t','i','n','f','e','r','i','o','r', 0, + 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0, + 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0, + 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0, + 'A','g','r','a','v','e','s','m','a','l','l', 0, + 'A','a','c','u','t','e','s','m','a','l','l', 0, + 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'A','t','i','l','d','e','s','m','a','l','l', 0, + 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'A','r','i','n','g','s','m','a','l','l', 0, + 'A','E','s','m','a','l','l', 0, + 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0, + 'E','g','r','a','v','e','s','m','a','l','l', 0, + 'E','a','c','u','t','e','s','m','a','l','l', 0, + 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'I','g','r','a','v','e','s','m','a','l','l', 0, + 'I','a','c','u','t','e','s','m','a','l','l', 0, + 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'E','t','h','s','m','a','l','l', 0, + 'N','t','i','l','d','e','s','m','a','l','l', 0, + 'O','g','r','a','v','e','s','m','a','l','l', 0, + 'O','a','c','u','t','e','s','m','a','l','l', 0, + 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'O','t','i','l','d','e','s','m','a','l','l', 0, + 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'O','E','s','m','a','l','l', 0, + 'O','s','l','a','s','h','s','m','a','l','l', 0, + 'U','g','r','a','v','e','s','m','a','l','l', 0, + 'U','a','c','u','t','e','s','m','a','l','l', 0, + 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'Y','a','c','u','t','e','s','m','a','l','l', 0, + 'T','h','o','r','n','s','m','a','l','l', 0, + 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + '0','0','1','.','0','0','0', 0, + '0','0','1','.','0','0','1', 0, + '0','0','1','.','0','0','2', 0, + '0','0','1','.','0','0','3', 0, + 'B','l','a','c','k', 0, + 'B','o','l','d', 0, + 'B','o','o','k', 0, + 'L','i','g','h','t', 0, + 'M','e','d','i','u','m', 0, + 'R','e','g','u','l','a','r', 0, + 'R','o','m','a','n', 0, + 'S','e','m','i','b','o','l','d', 0, + }; + + +#define FT_NUM_MAC_NAMES 258 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + + static const short ft_mac_names[FT_NUM_MAC_NAMES] = + { + 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351, + 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, + 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, + 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, + 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610, + 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, + 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, + 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652, + 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776, + 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346, + 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76, + 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120, + 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916, + 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856, + 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500, + 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053, + 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229, + 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200, + 209, 218, 225, 232, 239, 246 + }; + + +#define FT_NUM_SID_NAMES 391 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + + static const short ft_sid_names[FT_NUM_SID_NAMES] = + { + 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365, + 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441, + 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502, + 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, + 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614, + 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, + 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707, + 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832, + 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985, + 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089, + 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197, + 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319, + 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443, + 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562, + 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680, + 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797, + 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973, + 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167, + 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319, + 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454, + 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552, + 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684, + 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860, + 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034, + 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220, + 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409, + 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586, + 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687 + }; + + + /* the following are indices into the SID name table */ + static const unsigned short t1_standard_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, + 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123, + 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136, + 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0, + 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0 + }; + + + /* the following are indices into the SID name table */ + static const unsigned short t1_expert_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99, + 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252, + 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262, + 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272, + 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288, + 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313, + 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319, + 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330, + 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346, + 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362, + 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378 + }; + + + /* + * This table is a compressed version of the Adobe Glyph List (AGL), + * optimized for efficient searching. It has been generated by the + * `glnames.py' python script located in the `src/tools' directory. + * + * The lookup function to get the Unicode value for a given string + * is defined below the table. + */ + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + static const unsigned char ft_adobe_glyph_list[54791L] = + { + 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23, + 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88, + 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107, + 32,222, 33, 55, 34,154, 35,218, 53, 84, 59,196, 68, 6, 75,183, + 83,178, 88,135, 93,242,101,165,109,185,111, 55,117,254,123, 73, + 130,238,138,206,145, 31,153,182,156,189,163,249,178,221,193, 17, + 197, 99,199,240,204, 27,204,155,210,100, 65,143, 0, 65, 0,140, + 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40, + 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198, + 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225, + 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225, + 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247, + 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0, + 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242, + 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119, + 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225, + 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99, + 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205, + 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230, + 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105, + 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236, + 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239, + 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247, + 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1, + 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99, + 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225, + 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1, + 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210, + 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247, + 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160, + 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0, + 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225, + 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249, + 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228, + 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2, + 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225, + 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128, + 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131, + 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250, + 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229, + 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195, + 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229, + 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2, + 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242, + 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227, + 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101, + 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128, + 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97, + 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229, + 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128, + 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237, + 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67, + 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4, + 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237, + 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242, + 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99, + 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228, + 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101, + 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3, + 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1, + 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128, + 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184, + 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238, + 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103, + 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99, + 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229, + 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227, + 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236, + 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233, + 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110, + 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236, + 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4, + 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237, + 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239, + 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225, + 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68, + 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231, + 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241, + 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27, + 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225, + 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242, + 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242, + 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229, + 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16, + 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30, + 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5, + 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240, + 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242, + 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5, + 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202, + 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128, + 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231, + 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233, + 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14, + 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227, + 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34, + 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100, + 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6, + 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6, + 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0, + 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7, + 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9, + 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243, + 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99, + 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128, + 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28, + 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2, + 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135, + 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71, + 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24, + 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101, + 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243, + 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249, + 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7, + 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243, + 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239, + 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1, + 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236, + 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243, + 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237, + 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101, + 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239, + 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233, + 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242, + 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225, + 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239, + 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22, + 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99, + 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4, + 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99, + 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233, + 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227, + 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249, + 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231, + 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233, + 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136, + 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4, + 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242, + 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33, + 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243, + 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4, + 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52, + 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238, + 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129, + 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101, + 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111, + 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239, + 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70, + 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10, + 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225, + 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225, + 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233, + 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9, + 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229, + 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227, + 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243, + 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10, + 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11, + 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10, + 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129, + 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231, + 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101, + 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239, + 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99, + 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120, + 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34, + 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1, + 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10, + 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128, + 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229, + 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243, + 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146, + 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, + 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225, + 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, + 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239, + 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246, + 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11, + 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2, + 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11, + 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12, + 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179, + 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178, + 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203, + 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225, + 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178, + 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4, + 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229, + 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228, + 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236, + 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12, + 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2, + 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236, + 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255, + 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128, + 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225, + 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116, + 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241, + 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12, + 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13, + 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193, + 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213, + 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101, + 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229, + 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239, + 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36, + 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236, + 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3, + 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8, + 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147, + 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99, + 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48, + 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236, + 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229, + 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236, + 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17, + 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128, + 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3, + 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4, + 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10, + 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25, + 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64, + 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240, + 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110, + 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236, + 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97, + 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110, + 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239, + 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108, + 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101, + 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233, + 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99, + 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236, + 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41, + 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128, + 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191, + 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236, + 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110, + 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243, + 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15, + 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16, + 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241, + 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15, + 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249, + 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245, + 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228, + 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99, + 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128, + 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249, + 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225, + 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, + 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110, + 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236, + 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1, + 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82, + 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225, + 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126, + 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233, + 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234, + 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229, + 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227, + 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242, + 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222, + 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128, + 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17, + 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17, + 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227, + 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17, + 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228, + 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236, + 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128, + 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228, + 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128, + 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242, + 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110, + 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236, + 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30, + 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17, + 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236, + 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17, + 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18, + 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2, + 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128, + 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36, + 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128, + 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229, + 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101, + 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229, + 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138, + 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45, + 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128, + 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110, + 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2, + 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226, + 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238, + 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229, + 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239, + 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110, + 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236, + 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30, + 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225, + 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128, + 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236, + 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132, + 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213, + 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236, + 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237, + 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229, + 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4, + 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19, + 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229, + 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19, + 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0, + 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245, + 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216, + 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246, + 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228, + 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3, + 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245, + 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242, + 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236, + 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244, + 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238, + 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0, + 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20, + 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85, + 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246, + 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21, + 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229, + 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239, + 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128, + 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80, + 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225, + 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101, + 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33, + 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233, + 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238, + 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162, + 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4, + 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159, + 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225, + 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111, + 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237, + 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3, + 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22, + 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247, + 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245, + 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236, + 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22, + 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229, + 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136, + 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246, + 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101, + 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101, + 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128, + 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233, + 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99, + 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107, + 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238, + 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128, + 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249, + 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112, + 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101, + 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243, + 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23, + 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97, + 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76, + 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23, + 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1, + 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227, + 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242, + 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227, + 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208, + 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238, + 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28, + 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225, + 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101, + 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237, + 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108, + 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129, + 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0, + 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27, + 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25, + 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24, + 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37, + 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37, + 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37, + 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37, + 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37, + 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37, + 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37, + 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25, + 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176, + 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176, + 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176, + 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176, + 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25, + 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183, + 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185, + 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25, + 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176, + 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176, + 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176, + 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176, + 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176, + 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25, + 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37, + 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37, + 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37, + 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32, + 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231, + 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26, + 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239, + 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128, + 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1, + 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216, + 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99, + 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200, + 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227, + 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227, + 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26, + 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26, + 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246, + 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34, + 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229, + 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128, + 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41, + 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242, + 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233, + 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163, + 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225, + 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233, + 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244, + 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84, + 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177, + 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226, + 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225, + 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233, + 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236, + 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227, + 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225, + 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108, + 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236, + 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249, + 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128, + 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180, + 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2, + 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128, + 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110, + 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236, + 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5, + 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238, + 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225, + 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28, + 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132, + 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232, + 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227, + 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233, + 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2, + 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107, + 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29, + 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31, + 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0, + 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101, + 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128, + 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245, + 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239, + 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236, + 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108, + 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225, + 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29, + 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101, + 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30, + 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128, + 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110, + 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236, + 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243, + 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30, + 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133, + 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244, + 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231, + 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101, + 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242, + 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236, + 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242, + 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128, + 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106, + 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228, + 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225, + 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243, + 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31, + 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232, + 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3, + 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243, + 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239, + 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237, + 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233, + 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242, + 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108, + 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227, + 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229, + 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101, + 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226, + 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32, + 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236, + 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101, + 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18, + 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107, + 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239, + 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108, + 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32, + 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101, + 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36, + 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170, + 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32, + 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128, + 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240, + 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134, + 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233, + 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242, + 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128, + 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105, + 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243, + 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33, + 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34, + 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96, + 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233, + 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128, + 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33, + 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225, + 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229, + 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2, + 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43, + 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107, + 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34, + 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69, + 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237, + 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227, + 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228, + 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34, + 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239, + 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, + 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233, + 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227, + 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174, + 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2, + 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227, + 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110, + 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99, + 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120, + 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227, + 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3, + 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4, + 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227, + 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233, + 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3, + 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229, + 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233, + 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128, + 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242, + 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243, + 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238, + 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225, + 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128, + 247,122,244,242,239,235,101,128, 1,181, 97,149, 0, 97, 36, 8, + 36,144, 37, 35, 37,211, 38, 55, 38, 91, 45, 10, 45, 47, 45, 74, + 46, 43, 46, 81, 47,170, 47,242, 48,197, 48,206, 49, 79, 51, 87, + 52, 77, 52,124, 53, 19, 53, 33, 97, 7, 36, 24, 36, 34, 36, 41, + 36, 48, 36, 73, 36, 89, 36,100,226,229,238,231,225,236,105,128, + 9,134,227,245,244,101,128, 0,225,228,229,246, 97,128, 9, 6, + 231,117, 2, 36, 55, 36, 64,234,225,242,225,244,105,128, 10,134, + 242,237,245,235,232,105,128, 10, 6,237,225,244,242,225,231,245, + 242,237,245,235,232,105,128, 10, 62,242,245,243,241,245,225,242, + 101,128, 51, 3,246,239,247,229,236,243,233,231,110, 3, 36,116, + 36,126, 36,133,226,229,238,231,225,236,105,128, 9,190,228,229, + 246, 97,128, 9, 62,231,245,234,225,242,225,244,105,128, 10,190, + 98, 4, 36,154, 36,195, 36,204, 36,214,226,242,229,246,233,225, + 244,233,239,110, 2, 36,169, 36,184,237,225,242,235,225,242,237, + 229,238,233,225,110,128, 5, 95,243,233,231,238,228,229,246, 97, + 128, 9,112,229,238,231,225,236,105,128, 9,133,239,240,239,237, + 239,230,111,128, 49, 26,242,229,246,101,134, 1, 3, 36,233, 36, + 241, 36,252, 37, 7, 37, 15, 37, 27,225,227,245,244,101,128, 30, + 175,227,249,242,233,236,236,233, 99,128, 4,209,228,239,244,226, + 229,236,239,119,128, 30,183,231,242,225,246,101,128, 30,177,232, + 239,239,235,225,226,239,246,101,128, 30,179,244,233,236,228,101, + 128, 30,181, 99, 4, 37, 45, 37, 52, 37,131, 37,201,225,242,239, + 110,128, 1,206,233,242, 99, 2, 37, 60, 37, 65,236,101,128, 36, + 208,245,237,230,236,229,120,133, 0,226, 37, 84, 37, 92, 37,103, + 37,111, 37,123,225,227,245,244,101,128, 30,165,228,239,244,226, + 229,236,239,119,128, 30,173,231,242,225,246,101,128, 30,167,232, + 239,239,235,225,226,239,246,101,128, 30,169,244,233,236,228,101, + 128, 30,171,245,244,101,133, 0,180, 37,147, 37,158, 37,175, 37, + 182, 37,191,226,229,236,239,247,227,237, 98,128, 3, 23, 99, 2, + 37,164, 37,169,237, 98,128, 3, 1,239,237, 98,128, 3, 1,228, + 229,246, 97,128, 9, 84,236,239,247,237,239,100,128, 2,207,244, + 239,238,229,227,237, 98,128, 3, 65,249,242,233,236,236,233, 99, + 128, 4, 48,100, 5, 37,223, 37,233, 37,247, 37,253, 38, 31,226, + 236,231,242,225,246,101,128, 2, 1,228,225,235,231,245,242,237, + 245,235,232,105,128, 10,113,229,246, 97,128, 9, 5,233,229,242, + 229,243,233,115,130, 0,228, 38, 11, 38, 22,227,249,242,233,236, + 236,233, 99,128, 4,211,237,225,227,242,239,110,128, 1,223,239, + 116, 2, 38, 38, 38, 46,226,229,236,239,119,128, 30,161,237,225, + 227,242,239,110,128, 1,225,101,131, 0,230, 38, 65, 38, 73, 38, + 82,225,227,245,244,101,128, 1,253,235,239,242,229,225,110,128, + 49, 80,237,225,227,242,239,110,128, 1,227,230,233,105, 6, 38, + 107, 38,127, 41, 64, 41, 70, 41, 85, 44,185, 48, 2, 38,113, 38, + 120,176,178,176, 56,128, 32, 21,184,185,180, 49,128, 32,164,177, + 48, 3, 38,136, 40,160, 41, 39, 48, 9, 38,156, 38,176, 38,238, + 39, 44, 39,106, 39,168, 39,230, 40, 36, 40, 98, 49, 3, 38,164, + 38,168, 38,172, 55,128, 4, 16, 56,128, 4, 17, 57,128, 4, 18, + 50, 10, 38,198, 38,202, 38,206, 38,210, 38,214, 38,218, 38,222, + 38,226, 38,230, 38,234, 48,128, 4, 19, 49,128, 4, 20, 50,128, + 4, 21, 51,128, 4, 1, 52,128, 4, 22, 53,128, 4, 23, 54,128, + 4, 24, 55,128, 4, 25, 56,128, 4, 26, 57,128, 4, 27, 51, 10, + 39, 4, 39, 8, 39, 12, 39, 16, 39, 20, 39, 24, 39, 28, 39, 32, + 39, 36, 39, 40, 48,128, 4, 28, 49,128, 4, 29, 50,128, 4, 30, + 51,128, 4, 31, 52,128, 4, 32, 53,128, 4, 33, 54,128, 4, 34, + 55,128, 4, 35, 56,128, 4, 36, 57,128, 4, 37, 52, 10, 39, 66, + 39, 70, 39, 74, 39, 78, 39, 82, 39, 86, 39, 90, 39, 94, 39, 98, + 39,102, 48,128, 4, 38, 49,128, 4, 39, 50,128, 4, 40, 51,128, + 4, 41, 52,128, 4, 42, 53,128, 4, 43, 54,128, 4, 44, 55,128, + 4, 45, 56,128, 4, 46, 57,128, 4, 47, 53, 10, 39,128, 39,132, + 39,136, 39,140, 39,144, 39,148, 39,152, 39,156, 39,160, 39,164, + 48,128, 4,144, 49,128, 4, 2, 50,128, 4, 3, 51,128, 4, 4, + 52,128, 4, 5, 53,128, 4, 6, 54,128, 4, 7, 55,128, 4, 8, + 56,128, 4, 9, 57,128, 4, 10, 54, 10, 39,190, 39,194, 39,198, + 39,202, 39,206, 39,210, 39,214, 39,218, 39,222, 39,226, 48,128, + 4, 11, 49,128, 4, 12, 50,128, 4, 14, 51,128,246,196, 52,128, + 246,197, 53,128, 4, 48, 54,128, 4, 49, 55,128, 4, 50, 56,128, + 4, 51, 57,128, 4, 52, 55, 10, 39,252, 40, 0, 40, 4, 40, 8, + 40, 12, 40, 16, 40, 20, 40, 24, 40, 28, 40, 32, 48,128, 4, 53, + 49,128, 4, 81, 50,128, 4, 54, 51,128, 4, 55, 52,128, 4, 56, + 53,128, 4, 57, 54,128, 4, 58, 55,128, 4, 59, 56,128, 4, 60, + 57,128, 4, 61, 56, 10, 40, 58, 40, 62, 40, 66, 40, 70, 40, 74, + 40, 78, 40, 82, 40, 86, 40, 90, 40, 94, 48,128, 4, 62, 49,128, + 4, 63, 50,128, 4, 64, 51,128, 4, 65, 52,128, 4, 66, 53,128, + 4, 67, 54,128, 4, 68, 55,128, 4, 69, 56,128, 4, 70, 57,128, + 4, 71, 57, 10, 40,120, 40,124, 40,128, 40,132, 40,136, 40,140, + 40,144, 40,148, 40,152, 40,156, 48,128, 4, 72, 49,128, 4, 73, + 50,128, 4, 74, 51,128, 4, 75, 52,128, 4, 76, 53,128, 4, 77, + 54,128, 4, 78, 55,128, 4, 79, 56,128, 4,145, 57,128, 4, 82, + 49, 4, 40,170, 40,232, 40,237, 41, 7, 48, 10, 40,192, 40,196, + 40,200, 40,204, 40,208, 40,212, 40,216, 40,220, 40,224, 40,228, + 48,128, 4, 83, 49,128, 4, 84, 50,128, 4, 85, 51,128, 4, 86, + 52,128, 4, 87, 53,128, 4, 88, 54,128, 4, 89, 55,128, 4, 90, + 56,128, 4, 91, 57,128, 4, 92,177, 48,128, 4, 94, 52, 4, 40, + 247, 40,251, 40,255, 41, 3, 53,128, 4, 15, 54,128, 4, 98, 55, + 128, 4,114, 56,128, 4,116, 57, 5, 41, 19, 41, 23, 41, 27, 41, + 31, 41, 35, 50,128,246,198, 51,128, 4, 95, 52,128, 4, 99, 53, + 128, 4,115, 54,128, 4,117, 56, 2, 41, 45, 41, 59, 51, 2, 41, + 51, 41, 55, 49,128,246,199, 50,128,246,200,180, 54,128, 4,217, + 178,185, 57,128, 32, 14,179, 48, 2, 41, 77, 41, 81, 48,128, 32, + 15, 49,128, 32, 13,181, 55, 7, 41,102, 41,172, 42,237, 43, 58, + 44, 15, 44,108, 44,179, 51, 2, 41,108, 41,122, 56, 2, 41,114, + 41,118, 49,128, 6,106, 56,128, 6, 12, 57, 8, 41,140, 41,144, + 41,148, 41,152, 41,156, 41,160, 41,164, 41,168, 50,128, 6, 96, + 51,128, 6, 97, 52,128, 6, 98, 53,128, 6, 99, 54,128, 6,100, + 55,128, 6,101, 56,128, 6,102, 57,128, 6,103, 52, 7, 41,188, + 41,220, 42, 26, 42, 88, 42,120, 42,176, 42,232, 48, 5, 41,200, + 41,204, 41,208, 41,212, 41,216, 48,128, 6,104, 49,128, 6,105, + 51,128, 6, 27, 55,128, 6, 31, 57,128, 6, 33, 49, 10, 41,242, + 41,246, 41,250, 41,254, 42, 2, 42, 6, 42, 10, 42, 14, 42, 18, + 42, 22, 48,128, 6, 34, 49,128, 6, 35, 50,128, 6, 36, 51,128, + 6, 37, 52,128, 6, 38, 53,128, 6, 39, 54,128, 6, 40, 55,128, + 6, 41, 56,128, 6, 42, 57,128, 6, 43, 50, 10, 42, 48, 42, 52, + 42, 56, 42, 60, 42, 64, 42, 68, 42, 72, 42, 76, 42, 80, 42, 84, + 48,128, 6, 44, 49,128, 6, 45, 50,128, 6, 46, 51,128, 6, 47, + 52,128, 6, 48, 53,128, 6, 49, 54,128, 6, 50, 55,128, 6, 51, + 56,128, 6, 52, 57,128, 6, 53, 51, 5, 42,100, 42,104, 42,108, + 42,112, 42,116, 48,128, 6, 54, 49,128, 6, 55, 50,128, 6, 56, + 51,128, 6, 57, 52,128, 6, 58, 52, 9, 42,140, 42,144, 42,148, + 42,152, 42,156, 42,160, 42,164, 42,168, 42,172, 48,128, 6, 64, + 49,128, 6, 65, 50,128, 6, 66, 51,128, 6, 67, 52,128, 6, 68, + 53,128, 6, 69, 54,128, 6, 70, 56,128, 6, 72, 57,128, 6, 73, + 53, 9, 42,196, 42,200, 42,204, 42,208, 42,212, 42,216, 42,220, + 42,224, 42,228, 48,128, 6, 74, 49,128, 6, 75, 50,128, 6, 76, + 51,128, 6, 77, 52,128, 6, 78, 53,128, 6, 79, 54,128, 6, 80, + 55,128, 6, 81, 56,128, 6, 82,183, 48,128, 6, 71, 53, 3, 42, + 245, 43, 21, 43, 53, 48, 5, 43, 1, 43, 5, 43, 9, 43, 13, 43, + 17, 53,128, 6,164, 54,128, 6,126, 55,128, 6,134, 56,128, 6, + 152, 57,128, 6,175, 49, 5, 43, 33, 43, 37, 43, 41, 43, 45, 43, + 49, 49,128, 6,121, 50,128, 6,136, 51,128, 6,145, 52,128, 6, + 186, 57,128, 6,210,179, 52,128, 6,213, 54, 7, 43, 74, 43, 79, + 43, 84, 43, 89, 43,127, 43,189, 43,251,179, 54,128, 32,170,180, + 53,128, 5,190,181, 56,128, 5,195, 54, 6, 43,103, 43,107, 43, + 111, 43,115, 43,119, 43,123, 52,128, 5,208, 53,128, 5,209, 54, + 128, 5,210, 55,128, 5,211, 56,128, 5,212, 57,128, 5,213, 55, + 10, 43,149, 43,153, 43,157, 43,161, 43,165, 43,169, 43,173, 43, + 177, 43,181, 43,185, 48,128, 5,214, 49,128, 5,215, 50,128, 5, + 216, 51,128, 5,217, 52,128, 5,218, 53,128, 5,219, 54,128, 5, + 220, 55,128, 5,221, 56,128, 5,222, 57,128, 5,223, 56, 10, 43, + 211, 43,215, 43,219, 43,223, 43,227, 43,231, 43,235, 43,239, 43, + 243, 43,247, 48,128, 5,224, 49,128, 5,225, 50,128, 5,226, 51, + 128, 5,227, 52,128, 5,228, 53,128, 5,229, 54,128, 5,230, 55, + 128, 5,231, 56,128, 5,232, 57,128, 5,233, 57, 3, 44, 3, 44, + 7, 44, 11, 48,128, 5,234, 52,128,251, 42, 53,128,251, 43, 55, + 4, 44, 25, 44, 39, 44, 59, 44, 64, 48, 2, 44, 31, 44, 35, 48, + 128,251, 75, 53,128,251, 31, 49, 3, 44, 47, 44, 51, 44, 55, 54, + 128, 5,240, 55,128, 5,241, 56,128, 5,242,178, 51,128,251, 53, + 57, 7, 44, 80, 44, 84, 44, 88, 44, 92, 44, 96, 44,100, 44,104, + 51,128, 5,180, 52,128, 5,181, 53,128, 5,182, 54,128, 5,187, + 55,128, 5,184, 56,128, 5,183, 57,128, 5,176, 56, 3, 44,116, + 44,160, 44,165, 48, 7, 44,132, 44,136, 44,140, 44,144, 44,148, + 44,152, 44,156, 48,128, 5,178, 49,128, 5,177, 50,128, 5,179, + 51,128, 5,194, 52,128, 5,193, 54,128, 5,185, 55,128, 5,188, + 179, 57,128, 5,189, 52, 2, 44,171, 44,175, 49,128, 5,191, 50, + 128, 5,192,185,178, 57,128, 2,188, 54, 3, 44,193, 44,252, 45, + 3, 49, 4, 44,203, 44,219, 44,225, 44,246, 50, 2, 44,209, 44, + 214,180, 56,128, 33, 5,184, 57,128, 33, 19,179,181, 50,128, 33, + 22,181, 55, 3, 44,234, 44,238, 44,242, 51,128, 32, 44, 52,128, + 32, 45, 53,128, 32, 46,182,182, 52,128, 32, 12,179,177,182, 55, + 128, 6,109,180,185,179, 55,128, 2,189,103, 2, 45, 16, 45, 23, + 242,225,246,101,128, 0,224,117, 2, 45, 29, 45, 38,234,225,242, + 225,244,105,128, 10,133,242,237,245,235,232,105,128, 10, 5,104, + 2, 45, 53, 45, 63,233,242,225,231,225,238, 97,128, 48, 66,239, + 239,235,225,226,239,246,101,128, 30,163,105, 7, 45, 90, 45,115, + 45,122, 45,134, 45,159, 45,175, 45,255, 98, 2, 45, 96, 45,105, + 229,238,231,225,236,105,128, 9,144,239,240,239,237,239,230,111, + 128, 49, 30,228,229,246, 97,128, 9, 16,229,227,249,242,233,236, + 236,233, 99,128, 4,213,231,117, 2, 45,141, 45,150,234,225,242, + 225,244,105,128, 10,144,242,237,245,235,232,105,128, 10, 16,237, + 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 72,110, + 5, 45,187, 45,196, 45,210, 45,226, 45,241,225,242,225,226,233, + 99,128, 6, 57,230,233,238,225,236,225,242,225,226,233, 99,128, + 254,202,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,203,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, + 204,246,229,242,244,229,228,226,242,229,246,101,128, 2, 3,246, + 239,247,229,236,243,233,231,110, 3, 46, 15, 46, 25, 46, 32,226, + 229,238,231,225,236,105,128, 9,200,228,229,246, 97,128, 9, 72, + 231,245,234,225,242,225,244,105,128, 10,200,107, 2, 46, 49, 46, + 73,225,244,225,235,225,238, 97,129, 48,162, 46, 61,232,225,236, + 230,247,233,228,244,104,128,255,113,239,242,229,225,110,128, 49, + 79,108, 3, 46, 89, 47,145, 47,154,101, 2, 46, 95, 47,140,102, + 136, 5,208, 46,115, 46,124, 46,139, 46,153, 46,242, 47, 0, 47, + 111, 47,125,225,242,225,226,233, 99,128, 6, 39,228,225,231,229, + 243,232,232,229,226,242,229,119,128,251, 48,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,142,104, 2, 46,159, 46,234,225, + 237,250, 97, 2, 46,168, 46,201,225,226,239,246,101, 2, 46,178, + 46,187,225,242,225,226,233, 99,128, 6, 35,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,132,226,229,236,239,119, 2, 46, + 211, 46,220,225,242,225,226,233, 99,128, 6, 37,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,136,229,226,242,229,119,128, + 5,208,236,225,237,229,228,232,229,226,242,229,119,128,251, 79, + 237, 97, 2, 47, 7, 47, 43,228,228,225,225,226,239,246,101, 2, + 47, 20, 47, 29,225,242,225,226,233, 99,128, 6, 34,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,130,235,243,245,242, 97, + 4, 47, 57, 47, 66, 47, 80, 47, 96,225,242,225,226,233, 99,128, + 6, 73,230,233,238,225,236,225,242,225,226,233, 99,128,254,240, + 233,238,233,244,233,225,236,225,242,225,226,233, 99,128,254,243, + 237,229,228,233,225,236,225,242,225,226,233, 99,128,254,244,240, + 225,244,225,232,232,229,226,242,229,119,128,251, 46,241,225,237, + 225,244,243,232,229,226,242,229,119,128,251, 47,240,104,128, 33, + 53,236,229,241,245,225,108,128, 34, 76,240,232, 97,129, 3,177, + 47,162,244,239,238,239,115,128, 3,172,109, 4, 47,180, 47,188, + 47,199, 47,233,225,227,242,239,110,128, 1, 1,239,238,239,243, + 240,225,227,101,128,255, 65,240,229,242,243,225,238,100,130, 0, + 38, 47,213, 47,225,237,239,238,239,243,240,225,227,101,128,255, + 6,243,237,225,236,108,128,247, 38,243,241,245,225,242,101,128, + 51,194,110, 4, 47,252, 48, 7, 48,129, 48,139,226,239,240,239, + 237,239,230,111,128, 49, 34,103, 4, 48, 17, 48, 28, 48, 42, 48, + 121,226,239,240,239,237,239,230,111,128, 49, 36,235,232,225,238, + 235,232,245,244,232,225,105,128, 14, 90,236,101,131, 34, 32, 48, + 53, 48,106, 48,113,226,242,225,227,235,229,116, 2, 48, 65, 48, + 85,236,229,230,116,129, 48, 8, 48, 74,246,229,242,244,233,227, + 225,108,128,254, 63,242,233,231,232,116,129, 48, 9, 48, 95,246, + 229,242,244,233,227,225,108,128,254, 64,236,229,230,116,128, 35, + 41,242,233,231,232,116,128, 35, 42,243,244,242,239,109,128, 33, + 43,239,244,229,236,229,233, 97,128, 3,135,117, 2, 48,145, 48, + 157,228,225,244,244,225,228,229,246, 97,128, 9, 82,243,246,225, + 242, 97, 3, 48,169, 48,179, 48,186,226,229,238,231,225,236,105, + 128, 9,130,228,229,246, 97,128, 9, 2,231,245,234,225,242,225, + 244,105,128, 10,130,239,231,239,238,229,107,128, 1, 5,112, 3, + 48,214, 48,238, 49, 12, 97, 2, 48,220, 48,232,225,244,239,243, + 241,245,225,242,101,128, 51, 0,242,229,110,128, 36,156,239,243, + 244,242,239,240,232,101, 2, 48,251, 49, 6,225,242,237,229,238, + 233,225,110,128, 5, 90,237,239,100,128, 2,188,112, 2, 49, 18, + 49, 23,236,101,128,248,255,242,111, 2, 49, 30, 49, 38,225,227, + 232,229,115,128, 34, 80,120, 2, 49, 44, 49, 64,229,241,245,225, + 108,129, 34, 72, 49, 54,239,242,233,237,225,231,101,128, 34, 82, + 233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 69,114, + 4, 49, 89, 49,116, 49,120, 49,165,225,229, 97, 2, 49, 97, 49, + 107,229,235,239,242,229,225,110,128, 49,142,235,239,242,229,225, + 110,128, 49,141, 99,128, 35, 18,105, 2, 49,126, 49,140,231,232, + 244,232,225,236,230,242,233,238,103,128, 30,154,238,103,130, 0, + 229, 49,149, 49,157,225,227,245,244,101,128, 1,251,226,229,236, + 239,119,128, 30, 1,242,239,119, 8, 49,185, 49,192, 50, 65, 50, + 131, 50,181, 50,236, 51, 3, 51, 78,226,239,244,104,128, 33,148, + 100, 3, 49,200, 49,239, 50, 30,225,243,104, 4, 49,212, 49,219, + 49,226, 49,234,228,239,247,110,128, 33,227,236,229,230,116,128, + 33,224,242,233,231,232,116,128, 33,226,245,112,128, 33,225,226, + 108, 5, 49,252, 50, 3, 50, 10, 50, 17, 50, 25,226,239,244,104, + 128, 33,212,228,239,247,110,128, 33,211,236,229,230,116,128, 33, + 208,242,233,231,232,116,128, 33,210,245,112,128, 33,209,239,247, + 110,131, 33,147, 50, 42, 50, 49, 50, 57,236,229,230,116,128, 33, + 153,242,233,231,232,116,128, 33,152,247,232,233,244,101,128, 33, + 233,104, 2, 50, 71, 50,122,229,225,100, 4, 50, 83, 50, 93, 50, + 103, 50,114,228,239,247,238,237,239,100,128, 2,197,236,229,230, + 244,237,239,100,128, 2,194,242,233,231,232,244,237,239,100,128, + 2,195,245,240,237,239,100,128, 2,196,239,242,233,250,229,120, + 128,248,231,236,229,230,116,131, 33,144, 50,144, 50,161, 50,173, + 228,226,108,129, 33,208, 50,152,243,244,242,239,235,101,128, 33, + 205,239,246,229,242,242,233,231,232,116,128, 33,198,247,232,233, + 244,101,128, 33,230,242,233,231,232,116,132, 33,146, 50,197, 50, + 209, 50,217, 50,228,228,226,236,243,244,242,239,235,101,128, 33, + 207,232,229,225,246,121,128, 39,158,239,246,229,242,236,229,230, + 116,128, 33,196,247,232,233,244,101,128, 33,232,244,225, 98, 2, + 50,244, 50,251,236,229,230,116,128, 33,228,242,233,231,232,116, + 128, 33,229,245,112,132, 33,145, 51, 16, 51, 44, 51, 62, 51, 70, + 100, 2, 51, 22, 51, 34,110,129, 33,149, 51, 28,226,243,101,128, + 33,168,239,247,238,226,225,243,101,128, 33,168,236,229,230,116, + 129, 33,150, 51, 53,239,230,228,239,247,110,128, 33,197,242,233, + 231,232,116,128, 33,151,247,232,233,244,101,128, 33,231,246,229, + 242,244,229,120,128,248,230,115, 5, 51, 99, 51,175, 51,220, 52, + 47, 52, 57, 99, 2, 51,105, 51,157,233,105, 2, 51,112, 51,135, + 227,233,242,227,245,109,129, 0, 94, 51,123,237,239,238,239,243, + 240,225,227,101,128,255, 62,244,233,236,228,101,129, 0,126, 51, + 145,237,239,238,239,243,240,225,227,101,128,255, 94,242,233,240, + 116,129, 2, 81, 51,166,244,245,242,238,229,100,128, 2, 82,237, + 225,236,108, 2, 51,184, 51,195,232,233,242,225,231,225,238, 97, + 128, 48, 65,235,225,244,225,235,225,238, 97,129, 48,161, 51,208, + 232,225,236,230,247,233,228,244,104,128,255,103,244,229,242,233, + 115, 2, 51,230, 52, 43,107,131, 0, 42, 51,240, 52, 12, 52, 35, + 97, 2, 51,246, 52, 4,236,244,239,238,229,225,242,225,226,233, + 99,128, 6,109,242,225,226,233, 99,128, 6,109,109, 2, 52, 18, + 52, 24,225,244,104,128, 34, 23,239,238,239,243,240,225,227,101, + 128,255, 10,243,237,225,236,108,128,254, 97,109,128, 32, 66,245, + 240,229,242,233,239,114,128,246,233,249,237,240,244,239,244,233, + 227,225,236,236,249,229,241,245,225,108,128, 34, 67,116,132, 0, + 64, 52, 89, 52, 96, 52,108, 52,116,233,236,228,101,128, 0,227, + 237,239,238,239,243,240,225,227,101,128,255, 32,243,237,225,236, + 108,128,254,107,245,242,238,229,100,128, 2, 80,117, 6, 52,138, + 52,163, 52,170, 52,195, 52,215, 52,231, 98, 2, 52,144, 52,153, + 229,238,231,225,236,105,128, 9,148,239,240,239,237,239,230,111, + 128, 49, 32,228,229,246, 97,128, 9, 20,231,117, 2, 52,177, 52, + 186,234,225,242,225,244,105,128, 10,148,242,237,245,235,232,105, + 128, 10, 20,236,229,238,231,244,232,237,225,242,235,226,229,238, + 231,225,236,105,128, 9,215,237,225,244,242,225,231,245,242,237, + 245,235,232,105,128, 10, 76,246,239,247,229,236,243,233,231,110, + 3, 52,247, 53, 1, 53, 8,226,229,238,231,225,236,105,128, 9, + 204,228,229,246, 97,128, 9, 76,231,245,234,225,242,225,244,105, + 128, 10,204,246,225,231,242,225,232,225,228,229,246, 97,128, 9, + 61,121, 2, 53, 39, 53, 51,226,225,242,237,229,238,233,225,110, + 128, 5, 97,233,110,130, 5,226, 53, 60, 53, 75,225,236,244,239, + 238,229,232,229,226,242,229,119,128,251, 32,232,229,226,242,229, + 119,128, 5,226, 98,144, 0, 98, 53,120, 53,255, 54, 10, 54, 19, + 54, 44, 55, 85, 55,147, 55,220, 57,146, 57,158, 57,201, 57,209, + 57,219, 59, 89, 59,113, 59,122, 97, 7, 53,136, 53,146, 53,170, + 53,177, 53,202, 53,226, 53,237,226,229,238,231,225,236,105,128, + 9,172,227,235,243,236,225,243,104,129, 0, 92, 53,158,237,239, + 238,239,243,240,225,227,101,128,255, 60,228,229,246, 97,128, 9, + 44,231,117, 2, 53,184, 53,193,234,225,242,225,244,105,128, 10, + 172,242,237,245,235,232,105,128, 10, 44,104, 2, 53,208, 53,218, + 233,242,225,231,225,238, 97,128, 48,112,244,244,232,225,105,128, + 14, 63,235,225,244,225,235,225,238, 97,128, 48,208,114,129, 0, + 124, 53,243,237,239,238,239,243,240,225,227,101,128,255, 92,226, + 239,240,239,237,239,230,111,128, 49, 5,227,233,242,227,236,101, + 128, 36,209,228,239,116, 2, 54, 27, 54, 36,225,227,227,229,238, + 116,128, 30, 3,226,229,236,239,119,128, 30, 5,101, 6, 54, 58, + 54, 79, 54,102, 54,244, 54,255, 55, 11,225,237,229,228,243,233, + 248,244,229,229,238,244,232,238,239,244,229,115,128, 38,108, 99, + 2, 54, 85, 54, 92,225,245,243,101,128, 34, 53,249,242,233,236, + 236,233, 99,128, 4, 49,104, 5, 54,114, 54,123, 54,137, 54,167, + 54,226,225,242,225,226,233, 99,128, 6, 40,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,144,105, 2, 54,143, 54,158,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,145,242,225, + 231,225,238, 97,128, 48,121,237,101, 2, 54,174, 54,187,228,233, + 225,236,225,242,225,226,233, 99,128,254,146,229,237,105, 2, 54, + 195, 54,210,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 252,159,243,239,236,225,244,229,228,225,242,225,226,233, 99,128, + 252, 8,238,239,239,238,230,233,238,225,236,225,242,225,226,233, + 99,128,252,109,235,225,244,225,235,225,238, 97,128, 48,217,238, + 225,242,237,229,238,233,225,110,128, 5, 98,116,132, 5,209, 55, + 23, 55, 43, 55, 63, 55, 72, 97,129, 3,178, 55, 29,243,249,237, + 226,239,236,231,242,229,229,107,128, 3,208,228,225,231,229,243, + 104,129,251, 49, 55, 54,232,229,226,242,229,119,128,251, 49,232, + 229,226,242,229,119,128, 5,209,242,225,230,229,232,229,226,242, + 229,119,128,251, 76,104, 2, 55, 91, 55,141, 97, 3, 55, 99, 55, + 109, 55,116,226,229,238,231,225,236,105,128, 9,173,228,229,246, + 97,128, 9, 45,231,117, 2, 55,123, 55,132,234,225,242,225,244, + 105,128, 10,173,242,237,245,235,232,105,128, 10, 45,239,239,107, + 128, 2, 83,105, 5, 55,159, 55,170, 55,181, 55,195, 55,209,232, + 233,242,225,231,225,238, 97,128, 48,115,235,225,244,225,235,225, + 238, 97,128, 48,211,236,225,226,233,225,236,227,236,233,227,107, + 128, 2,152,238,228,233,231,245,242,237,245,235,232,105,128, 10, + 2,242,245,243,241,245,225,242,101,128, 51, 49,108, 3, 55,228, + 57,129, 57,140, 97, 2, 55,234, 57,124,227,107, 6, 55,249, 56, + 2, 56, 39, 56,188, 56,243, 57, 39,227,233,242,227,236,101,128, + 37,207,100, 2, 56, 8, 56, 17,233,225,237,239,238,100,128, 37, + 198,239,247,238,240,239,233,238,244,233,238,231,244,242,233,225, + 238,231,236,101,128, 37,188,108, 2, 56, 45, 56,148,101, 2, 56, + 51, 56, 87,230,244,240,239,233,238,244,233,238,103, 2, 56, 66, + 56, 76,240,239,233,238,244,229,114,128, 37,196,244,242,233,225, + 238,231,236,101,128, 37,192,238,244,233,227,245,236,225,242,226, + 242,225,227,235,229,116, 2, 56,107, 56,127,236,229,230,116,129, + 48, 16, 56,116,246,229,242,244,233,227,225,108,128,254, 59,242, + 233,231,232,116,129, 48, 17, 56,137,246,229,242,244,233,227,225, + 108,128,254, 60,239,247,229,114, 2, 56,157, 56,172,236,229,230, + 244,244,242,233,225,238,231,236,101,128, 37,227,242,233,231,232, + 244,244,242,233,225,238,231,236,101,128, 37,226,114, 2, 56,194, + 56,205,229,227,244,225,238,231,236,101,128, 37,172,233,231,232, + 244,240,239,233,238,244,233,238,103, 2, 56,222, 56,232,240,239, + 233,238,244,229,114,128, 37,186,244,242,233,225,238,231,236,101, + 128, 37,182,115, 3, 56,251, 57, 25, 57, 33,109, 2, 57, 1, 57, + 13,225,236,236,243,241,245,225,242,101,128, 37,170,233,236,233, + 238,231,230,225,227,101,128, 38, 59,241,245,225,242,101,128, 37, + 160,244,225,114,128, 38, 5,245,240,112, 2, 57, 47, 57, 85,229, + 114, 2, 57, 54, 57, 69,236,229,230,244,244,242,233,225,238,231, + 236,101,128, 37,228,242,233,231,232,244,244,242,233,225,238,231, + 236,101,128, 37,229,239,233,238,244,233,238,103, 2, 57, 97, 57, + 113,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 180,244,242,233,225,238,231,236,101,128, 37,178,238,107,128, 36, + 35,233,238,229,226,229,236,239,119,128, 30, 7,239,227,107,128, + 37,136,237,239,238,239,243,240,225,227,101,128,255, 66,111, 3, + 57,166, 57,179, 57,190,226,225,233,237,225,233,244,232,225,105, + 128, 14, 26,232,233,242,225,231,225,238, 97,128, 48,124,235,225, + 244,225,235,225,238, 97,128, 48,220,240,225,242,229,110,128, 36, + 157,241,243,241,245,225,242,101,128, 51,195,114, 4, 57,229, 58, + 223, 59, 40, 59, 79,225, 99, 2, 57,236, 58,130,101, 3, 57,244, + 57,249, 58, 61,229,120,128,248,244,236,229,230,116,133, 0,123, + 58, 10, 58, 15, 58, 37, 58, 45, 58, 50,226,116,128,248,243,109, + 2, 58, 21, 58, 26,233,100,128,248,242,239,238,239,243,240,225, + 227,101,128,255, 91,243,237,225,236,108,128,254, 91,244,112,128, + 248,241,246,229,242,244,233,227,225,108,128,254, 55,242,233,231, + 232,116,133, 0,125, 58, 79, 58, 84, 58,106, 58,114, 58,119,226, + 116,128,248,254,109, 2, 58, 90, 58, 95,233,100,128,248,253,239, + 238,239,243,240,225,227,101,128,255, 93,243,237,225,236,108,128, + 254, 92,244,112,128,248,252,246,229,242,244,233,227,225,108,128, + 254, 56,235,229,116, 2, 58,138, 58,180,236,229,230,116,132, 0, + 91, 58,153, 58,158, 58,163, 58,175,226,116,128,248,240,229,120, + 128,248,239,237,239,238,239,243,240,225,227,101,128,255, 59,244, + 112,128,248,238,242,233,231,232,116,132, 0, 93, 58,196, 58,201, + 58,206, 58,218,226,116,128,248,251,229,120,128,248,250,237,239, + 238,239,243,240,225,227,101,128,255, 61,244,112,128,248,249,229, + 246,101,131, 2,216, 58,235, 58,246, 58,252,226,229,236,239,247, + 227,237, 98,128, 3, 46,227,237, 98,128, 3, 6,233,238,246,229, + 242,244,229,100, 3, 59, 11, 59, 22, 59, 28,226,229,236,239,247, + 227,237, 98,128, 3, 47,227,237, 98,128, 3, 17,228,239,245,226, + 236,229,227,237, 98,128, 3, 97,233,228,231,101, 2, 59, 49, 59, + 60,226,229,236,239,247,227,237, 98,128, 3, 42,233,238,246,229, + 242,244,229,228,226,229,236,239,247,227,237, 98,128, 3, 58,239, + 235,229,238,226,225,114,128, 0,166,115, 2, 59, 95, 59,103,244, + 242,239,235,101,128, 1,128,245,240,229,242,233,239,114,128,246, + 234,244,239,240,226,225,114,128, 1,131,117, 3, 59,130, 59,141, + 59,152,232,233,242,225,231,225,238, 97,128, 48,118,235,225,244, + 225,235,225,238, 97,128, 48,214,236,108, 2, 59,159, 59,189,229, + 116,130, 32, 34, 59,168, 59,178,233,238,246,229,242,243,101,128, + 37,216,239,240,229,242,225,244,239,114,128, 34, 25,243,229,249, + 101,128, 37,206, 99,143, 0, 99, 59,230, 60,179, 60,190, 60,254, + 61, 29, 61,122, 63, 33, 64, 17, 64,117, 64,166, 67,158, 67,166, + 67,176, 67,188, 67,221, 97, 9, 59,250, 60, 5, 60, 15, 60, 22, + 60, 29, 60, 54, 60, 64, 60,116, 60,125,225,242,237,229,238,233, + 225,110,128, 5,110,226,229,238,231,225,236,105,128, 9,154,227, + 245,244,101,128, 1, 7,228,229,246, 97,128, 9, 26,231,117, 2, + 60, 36, 60, 45,234,225,242,225,244,105,128, 10,154,242,237,245, + 235,232,105,128, 10, 26,236,243,241,245,225,242,101,128, 51,136, + 238,228,242,225,226,233,238,228,117, 4, 60, 82, 60, 92, 60, 98, + 60,105,226,229,238,231,225,236,105,128, 9,129,227,237, 98,128, + 3, 16,228,229,246, 97,128, 9, 1,231,245,234,225,242,225,244, + 105,128, 10,129,240,243,236,239,227,107,128, 33,234,114, 3, 60, + 133, 60,139, 60,165,229,239,102,128, 33, 5,239,110,130, 2,199, + 60,148, 60,159,226,229,236,239,247,227,237, 98,128, 3, 44,227, + 237, 98,128, 3, 12,242,233,225,231,229,242,229,244,245,242,110, + 128, 33,181,226,239,240,239,237,239,230,111,128, 49, 24, 99, 4, + 60,200, 60,207, 60,226, 60,248,225,242,239,110,128, 1, 13,229, + 228,233,236,236, 97,129, 0,231, 60,218,225,227,245,244,101,128, + 30, 9,233,242, 99, 2, 60,234, 60,239,236,101,128, 36,210,245, + 237,230,236,229,120,128, 1, 9,245,242,108,128, 2, 85,100, 2, + 61, 4, 61, 20,239,116,129, 1, 11, 61, 11,225,227,227,229,238, + 116,128, 1, 11,243,241,245,225,242,101,128, 51,197,101, 2, 61, + 35, 61, 51,228,233,236,236, 97,129, 0,184, 61, 45,227,237, 98, + 128, 3, 39,238,116,132, 0,162, 61, 64, 61, 88, 61,100, 61,111, + 105, 2, 61, 70, 61, 78,231,242,225,228,101,128, 33, 3,238,230, + 229,242,233,239,114,128,246,223,237,239,238,239,243,240,225,227, + 101,128,255,224,239,236,228,243,244,249,236,101,128,247,162,243, + 245,240,229,242,233,239,114,128,246,224,104, 5, 61,134, 61,197, + 61,208, 62,136, 62,228, 97, 4, 61,144, 61,155, 61,165, 61,172, + 225,242,237,229,238,233,225,110,128, 5,121,226,229,238,231,225, + 236,105,128, 9,155,228,229,246, 97,128, 9, 27,231,117, 2, 61, + 179, 61,188,234,225,242,225,244,105,128, 10,155,242,237,245,235, + 232,105,128, 10, 27,226,239,240,239,237,239,230,111,128, 49, 20, + 101, 6, 61,222, 61,242, 62, 10, 62, 78, 62, 90, 62,111,225,226, + 235,232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, + 4,189, 99, 2, 61,248, 62, 0,235,237,225,242,107,128, 39, 19, + 249,242,233,236,236,233, 99,128, 4, 71,100, 2, 62, 16, 62, 60, + 229,243,227,229,238,228,229,114, 2, 62, 29, 62, 49,225,226,235, + 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4, + 191,227,249,242,233,236,236,233, 99,128, 4,183,233,229,242,229, + 243,233,243,227,249,242,233,236,236,233, 99,128, 4,245,232,225, + 242,237,229,238,233,225,110,128, 5,115,235,232,225,235,225,243, + 243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,204,246, + 229,242,244,233,227,225,236,243,244,242,239,235,229,227,249,242, + 233,236,236,233, 99,128, 4,185,105,129, 3,199, 62,142,229,245, + 227,104, 4, 62,155, 62,190, 62,205, 62,214, 97, 2, 62,161, 62, + 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,119, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 23,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50,105,235,239,242, + 229,225,110,128, 49, 74,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 9,111, 2, 62,234, 63, 28,227,104, 3, 62,243, 63, + 9, 63, 19,225,110, 2, 62,250, 63, 2,231,244,232,225,105,128, + 14, 10,244,232,225,105,128, 14, 8,233,238,231,244,232,225,105, + 128, 14, 9,239,229,244,232,225,105,128, 14, 12,239,107,128, 1, + 136,105, 2, 63, 39, 63,141,229,245, 99, 5, 63, 53, 63, 88, 63, + 103, 63,112, 63,126, 97, 2, 63, 59, 63, 74,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,118,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 22,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50,104,235,239,242,229,225,110,128, 49, 72, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 8,245,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 28,242, 99, 2, + 63,148, 63,243,236,101,132, 37,203, 63,161, 63,172, 63,177, 63, + 201,237,245,236,244,233,240,236,121,128, 34,151,239,116,128, 34, + 153,112, 2, 63,183, 63,189,236,245,115,128, 34,149,239,243,244, + 225,236,237,225,242,107,128, 48, 54,247,233,244,104, 2, 63,210, + 63,226,236,229,230,244,232,225,236,230,226,236,225,227,107,128, + 37,208,242,233,231,232,244,232,225,236,230,226,236,225,227,107, + 128, 37,209,245,237,230,236,229,120,130, 2,198, 64, 0, 64, 11, + 226,229,236,239,247,227,237, 98,128, 3, 45,227,237, 98,128, 3, + 2,108, 3, 64, 25, 64, 31, 64, 85,229,225,114,128, 35, 39,233, + 227,107, 4, 64, 43, 64, 54, 64, 63, 64, 73,225,236,246,229,239, + 236,225,114,128, 1,194,228,229,238,244,225,108,128, 1,192,236, + 225,244,229,242,225,108,128, 1,193,242,229,244,242,239,230,236, + 229,120,128, 1,195,245, 98,129, 38, 99, 64, 92,243,245,233,116, + 2, 64,101, 64,109,226,236,225,227,107,128, 38, 99,247,232,233, + 244,101,128, 38,103,109, 3, 64,125, 64,139, 64,150,227,245,226, + 229,228,243,241,245,225,242,101,128, 51,164,239,238,239,243,240, + 225,227,101,128,255, 67,243,241,245,225,242,229,228,243,241,245, + 225,242,101,128, 51,160,111, 8, 64,184, 64,195, 65, 26, 65,224, + 66,253, 67, 28, 67,135, 67,144,225,242,237,229,238,233,225,110, + 128, 5,129,236,239,110,131, 0, 58, 64,207, 64,232, 64,251,237, + 239,110, 2, 64,215, 64,223,229,244,225,242,121,128, 32,161,239, + 243,240,225,227,101,128,255, 26,115, 2, 64,238, 64,244,233,231, + 110,128, 32,161,237,225,236,108,128,254, 85,244,242,233,225,238, + 231,245,236,225,114, 2, 65, 10, 65, 20,232,225,236,230,237,239, + 100,128, 2,209,237,239,100,128, 2,208,109, 2, 65, 32, 65,217, + 237, 97,134, 0, 44, 65, 49, 65,113, 65,124, 65,136, 65,166, 65, + 189, 97, 3, 65, 57, 65, 83, 65, 91,226,239,246,101, 2, 65, 66, + 65, 72,227,237, 98,128, 3, 19,242,233,231,232,244,227,237, 98, + 128, 3, 21,227,227,229,238,116,128,246,195,114, 2, 65, 97, 65, + 104,225,226,233, 99,128, 6, 12,237,229,238,233,225,110,128, 5, + 93,233,238,230,229,242,233,239,114,128,246,225,237,239,238,239, + 243,240,225,227,101,128,255, 12,242,229,246,229,242,243,229,100, + 2, 65,149, 65,160,225,226,239,246,229,227,237, 98,128, 3, 20, + 237,239,100,128, 2,189,115, 2, 65,172, 65,179,237,225,236,108, + 128,254, 80,245,240,229,242,233,239,114,128,246,226,244,245,242, + 238,229,100, 2, 65,200, 65,211,225,226,239,246,229,227,237, 98, + 128, 3, 18,237,239,100,128, 2,187,240,225,243,115,128, 38, 60, + 110, 2, 65,230, 65,239,231,242,245,229,238,116,128, 34, 69,116, + 2, 65,245, 66, 3,239,245,242,233,238,244,229,231,242,225,108, + 128, 34, 46,242,239,108,142, 35, 3, 66, 37, 66, 43, 66, 58, 66, + 73, 66,117, 66,162, 66,176, 66,181, 66,186, 66,191, 66,197, 66, + 202, 66,243, 66,248,193,195, 75,128, 0, 6, 66, 2, 66, 49, 66, + 54,197, 76,128, 0, 7, 83,128, 0, 8, 67, 2, 66, 64, 66, 69, + 193, 78,128, 0, 24, 82,128, 0, 13, 68, 3, 66, 81, 66,107, 66, + 112, 67, 4, 66, 91, 66, 95, 66, 99, 66,103, 49,128, 0, 17, 50, + 128, 0, 18, 51,128, 0, 19, 52,128, 0, 20,197, 76,128, 0,127, + 204, 69,128, 0, 16, 69, 5, 66,129, 66,133, 66,138, 66,143, 66, + 148, 77,128, 0, 25,206, 81,128, 0, 5,207, 84,128, 0, 4,211, + 67,128, 0, 27, 84, 2, 66,154, 66,158, 66,128, 0, 23, 88,128, + 0, 3, 70, 2, 66,168, 66,172, 70,128, 0, 12, 83,128, 0, 28, + 199, 83,128, 0, 29,200, 84,128, 0, 9,204, 70,128, 0, 10,206, + 193, 75,128, 0, 21,210, 83,128, 0, 30, 83, 5, 66,214, 66,218, + 66,228, 66,233, 66,238, 73,128, 0, 15, 79,129, 0, 14, 66,224, + 84,128, 0, 2,212, 88,128, 0, 1,213, 66,128, 0, 26,217, 78, + 128, 0, 22,213, 83,128, 0, 31,214, 84,128, 0, 11,240,249,242, + 233,231,232,116,129, 0,169, 67, 9,115, 2, 67, 15, 67, 21,225, + 238,115,128,248,233,229,242,233,102,128,246,217,114, 2, 67, 34, + 67,118,238,229,242,226,242,225,227,235,229,116, 2, 67, 49, 67, + 83,236,229,230,116,130, 48, 12, 67, 60, 67, 72,232,225,236,230, + 247,233,228,244,104,128,255, 98,246,229,242,244,233,227,225,108, + 128,254, 65,242,233,231,232,116,130, 48, 13, 67, 95, 67,107,232, + 225,236,230,247,233,228,244,104,128,255, 99,246,229,242,244,233, + 227,225,108,128,254, 66,240,239,242,225,244,233,239,238,243,241, + 245,225,242,101,128, 51,127,243,241,245,225,242,101,128, 51,199, + 246,229,242,235,231,243,241,245,225,242,101,128, 51,198,240,225, + 242,229,110,128, 36,158,242,245,250,229,233,242,111,128, 32,162, + 243,244,242,229,244,227,232,229,100,128, 2,151,245,114, 2, 67, + 195, 67,213,236,121, 2, 67,202, 67,208,225,238,100,128, 34,207, + 239,114,128, 34,206,242,229,238,227,121,128, 0,164,249,114, 4, + 67,232, 67,240, 67,247, 67,255,194,242,229,246,101,128,246,209, + 198,236,229,120,128,246,210,226,242,229,246,101,128,246,212,230, + 236,229,120,128,246,213,100,146, 0,100, 68, 46, 69,184, 70,208, + 71, 12, 71,188, 72,142, 72,204, 73,133, 73,146, 73,155, 73,181, + 73,206, 73,215, 75, 26, 75, 34, 75, 45, 75, 65, 75, 93, 97, 11, + 68, 70, 68, 81, 68, 91, 68,163, 68,226, 68,237, 68,248, 69, 61, + 69,123, 69,129, 69,159,225,242,237,229,238,233,225,110,128, 5, + 100,226,229,238,231,225,236,105,128, 9,166,100, 5, 68,103, 68, + 112, 68,118, 68,132, 68,148,225,242,225,226,233, 99,128, 6, 54, + 229,246, 97,128, 9, 38,230,233,238,225,236,225,242,225,226,233, + 99,128,254,190,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,191,237,229,228,233,225,236,225,242,225,226,233, 99, + 128,254,192,103, 3, 68,171, 68,188, 68,202,229,243,104,129, 5, + 188, 68,179,232,229,226,242,229,119,128, 5,188,231,229,114,129, + 32, 32, 68,196,228,226,108,128, 32, 33,117, 2, 68,208, 68,217, + 234,225,242,225,244,105,128, 10,166,242,237,245,235,232,105,128, + 10, 38,232,233,242,225,231,225,238, 97,128, 48, 96,235,225,244, + 225,235,225,238, 97,128, 48,192,108, 3, 69, 0, 69, 9, 69, 47, + 225,242,225,226,233, 99,128, 6, 47,229,116,130, 5,211, 69, 18, + 69, 38,228,225,231,229,243,104,129,251, 51, 69, 29,232,229,226, + 242,229,119,128,251, 51,232,229,226,242,229,119,128, 5,211,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,170,237,237, 97, + 3, 69, 71, 69, 80, 69, 92,225,242,225,226,233, 99,128, 6, 79, + 236,239,247,225,242,225,226,233, 99,128, 6, 79,244,225,238, 97, + 2, 69,101, 69,115,236,244,239,238,229,225,242,225,226,233, 99, + 128, 6, 76,242,225,226,233, 99,128, 6, 76,238,228, 97,128, 9, + 100,242,231, 97, 2, 69,137, 69,146,232,229,226,242,229,119,128, + 5,167,236,229,230,244,232,229,226,242,229,119,128, 5,167,243, + 233,225,240,238,229,245,237,225,244,225,227,249,242,233,236,236, + 233,227,227,237, 98,128, 4,133, 98, 3, 69,192, 70,189, 70,199, + 108, 9, 69,212, 69,220, 70, 77, 70, 85, 70,101, 70,112, 70,130, + 70,144, 70,155,199,242,225,246,101,128,246,211, 97, 2, 69,226, + 70, 27,238,231,236,229,226,242,225,227,235,229,116, 2, 69,242, + 70, 6,236,229,230,116,129, 48, 10, 69,251,246,229,242,244,233, + 227,225,108,128,254, 61,242,233,231,232,116,129, 48, 11, 70, 16, + 246,229,242,244,233,227,225,108,128,254, 62,114, 2, 70, 33, 70, + 54,227,232,233,238,246,229,242,244,229,228,226,229,236,239,247, + 227,237, 98,128, 3, 43,242,239,119, 2, 70, 62, 70, 69,236,229, + 230,116,128, 33,212,242,233,231,232,116,128, 33,210,228,225,238, + 228, 97,128, 9,101,231,242,225,246,101,129,246,214, 70, 95,227, + 237, 98,128, 3, 15,233,238,244,229,231,242,225,108,128, 34, 44, + 236,239,247,236,233,238,101,129, 32, 23, 70,124,227,237, 98,128, + 3, 51,239,246,229,242,236,233,238,229,227,237, 98,128, 3, 63, + 240,242,233,237,229,237,239,100,128, 2,186,246,229,242,244,233, + 227,225,108, 2, 70,168, 70,174,226,225,114,128, 32, 22,236,233, + 238,229,225,226,239,246,229,227,237, 98,128, 3, 14,239,240,239, + 237,239,230,111,128, 49, 9,243,241,245,225,242,101,128, 51,200, + 99, 4, 70,218, 70,225, 70,234, 71, 5,225,242,239,110,128, 1, + 15,229,228,233,236,236, 97,128, 30, 17,233,242, 99, 2, 70,242, + 70,247,236,101,128, 36,211,245,237,230,236,229,248,226,229,236, + 239,119,128, 30, 19,242,239,225,116,128, 1, 17,100, 4, 71, 22, + 71,103, 71,113, 71,164, 97, 4, 71, 32, 71, 42, 71, 49, 71, 74, + 226,229,238,231,225,236,105,128, 9,161,228,229,246, 97,128, 9, + 33,231,117, 2, 71, 56, 71, 65,234,225,242,225,244,105,128, 10, + 161,242,237,245,235,232,105,128, 10, 33,108, 2, 71, 80, 71, 89, + 225,242,225,226,233, 99,128, 6,136,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,137,228,232,225,228,229,246, 97,128, 9, + 92,232, 97, 3, 71,122, 71,132, 71,139,226,229,238,231,225,236, + 105,128, 9,162,228,229,246, 97,128, 9, 34,231,117, 2, 71,146, + 71,155,234,225,242,225,244,105,128, 10,162,242,237,245,235,232, + 105,128, 10, 34,239,116, 2, 71,171, 71,180,225,227,227,229,238, + 116,128, 30, 11,226,229,236,239,119,128, 30, 13,101, 8, 71,206, + 72, 3, 72, 10, 72, 35, 72, 45, 72, 56, 72,101, 72,137, 99, 2, + 71,212, 71,249,233,237,225,236,243,229,240,225,242,225,244,239, + 114, 2, 71,230, 71,239,225,242,225,226,233, 99,128, 6,107,240, + 229,242,243,233,225,110,128, 6,107,249,242,233,236,236,233, 99, + 128, 4, 52,231,242,229,101,128, 0,176,232,105, 2, 72, 17, 72, + 26,232,229,226,242,229,119,128, 5,173,242,225,231,225,238, 97, + 128, 48,103,233,227,239,240,244,233, 99,128, 3,239,235,225,244, + 225,235,225,238, 97,128, 48,199,108, 2, 72, 62, 72, 85,229,244, + 101, 2, 72, 70, 72, 77,236,229,230,116,128, 35, 43,242,233,231, + 232,116,128, 35, 38,244, 97,129, 3,180, 72, 92,244,245,242,238, + 229,100,128, 1,141,238,239,237,233,238,225,244,239,242,237,233, + 238,245,243,239,238,229,238,245,237,229,242,225,244,239,242,226, + 229,238,231,225,236,105,128, 9,248,250,104,128, 2,164,104, 2, + 72,148, 72,198, 97, 3, 72,156, 72,166, 72,173,226,229,238,231, + 225,236,105,128, 9,167,228,229,246, 97,128, 9, 39,231,117, 2, + 72,180, 72,189,234,225,242,225,244,105,128, 10,167,242,237,245, + 235,232,105,128, 10, 39,239,239,107,128, 2, 87,105, 6, 72,218, + 73, 11, 73, 71, 73, 82, 73, 93, 73,103, 97, 2, 72,224, 72,246, + 236,249,244,233,235,225,244,239,238,239,115,129, 3,133, 72,240, + 227,237, 98,128, 3, 68,237,239,238,100,129, 38,102, 72,255,243, + 245,233,244,247,232,233,244,101,128, 38, 98,229,242,229,243,233, + 115,133, 0,168, 73, 30, 73, 38, 73, 49, 73, 55, 73, 63,225,227, + 245,244,101,128,246,215,226,229,236,239,247,227,237, 98,128, 3, + 36,227,237, 98,128, 3, 8,231,242,225,246,101,128,246,216,244, + 239,238,239,115,128, 3,133,232,233,242,225,231,225,238, 97,128, + 48, 98,235,225,244,225,235,225,238, 97,128, 48,194,244,244,239, + 237,225,242,107,128, 48, 3,246,105, 2, 73,110, 73,121,228,101, + 129, 0,247, 73,117,115,128, 34, 35,243,233,239,238,243,236,225, + 243,104,128, 34, 21,234,229,227,249,242,233,236,236,233, 99,128, + 4, 82,235,243,232,225,228,101,128, 37,147,108, 2, 73,161, 73, + 172,233,238,229,226,229,236,239,119,128, 30, 15,243,241,245,225, + 242,101,128, 51,151,109, 2, 73,187, 73,195,225,227,242,239,110, + 128, 1, 17,239,238,239,243,240,225,227,101,128,255, 68,238,226, + 236,239,227,107,128, 37,132,111, 10, 73,237, 73,249, 74, 3, 74, + 14, 74, 25, 74, 97, 74,102, 74,113, 74,228, 74,254,227,232,225, + 228,225,244,232,225,105,128, 14, 14,228,229,235,244,232,225,105, + 128, 14, 20,232,233,242,225,231,225,238, 97,128, 48,105,235,225, + 244,225,235,225,238, 97,128, 48,201,236,236,225,114,132, 0, 36, + 74, 40, 74, 51, 74, 63, 74, 74,233,238,230,229,242,233,239,114, + 128,246,227,237,239,238,239,243,240,225,227,101,128,255, 4,239, + 236,228,243,244,249,236,101,128,247, 36,115, 2, 74, 80, 74, 87, + 237,225,236,108,128,254,105,245,240,229,242,233,239,114,128,246, + 228,238,103,128, 32,171,242,245,243,241,245,225,242,101,128, 51, + 38,116, 6, 74,127, 74,144, 74,166, 74,177, 74,209, 74,216,225, + 227,227,229,238,116,129, 2,217, 74,138,227,237, 98,128, 3, 7, + 226,229,236,239,247, 99, 2, 74,155, 74,160,237, 98,128, 3, 35, + 239,237, 98,128, 3, 35,235,225,244,225,235,225,238, 97,128, 48, + 251,236,229,243,115, 2, 74,186, 74,190,105,128, 1, 49,106,129, + 246,190, 74,196,243,244,242,239,235,229,232,239,239,107,128, 2, + 132,237,225,244,104,128, 34,197,244,229,228,227,233,242,227,236, + 101,128, 37,204,245,226,236,229,249,239,228,240,225,244,225,104, + 129,251, 31, 74,245,232,229,226,242,229,119,128,251, 31,247,238, + 244,225,227,107, 2, 75, 9, 75, 20,226,229,236,239,247,227,237, + 98,128, 3, 30,237,239,100,128, 2,213,240,225,242,229,110,128, + 36,159,243,245,240,229,242,233,239,114,128,246,235,116, 2, 75, + 51, 75, 57,225,233,108,128, 2, 86,239,240,226,225,114,128, 1, + 140,117, 2, 75, 71, 75, 82,232,233,242,225,231,225,238, 97,128, + 48,101,235,225,244,225,235,225,238, 97,128, 48,197,122,132, 1, + 243, 75,105, 75,114, 75,133, 75,170,225,236,244,239,238,101,128, + 2,163, 99, 2, 75,120, 75,127,225,242,239,110,128, 1,198,245, + 242,108,128, 2,165,101, 2, 75,139, 75,159,225,226,235,232,225, + 243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,225,227, + 249,242,233,236,236,233, 99,128, 4, 85,232,229,227,249,242,233, + 236,236,233, 99,128, 4, 95,101,151, 0,101, 75,233, 75,252, 76, + 30, 77, 4, 77, 66, 77, 99, 77,111, 77,134, 77,187, 79, 43, 79, + 101, 79,203, 80, 63, 80,198, 81, 17, 81, 48, 81,110, 81,163, 82, + 98, 82,231, 82,251, 83, 39, 83,130, 97, 2, 75,239, 75,246,227, + 245,244,101,128, 0,233,242,244,104,128, 38, 65, 98, 3, 76, 4, + 76, 13, 76, 23,229,238,231,225,236,105,128, 9,143,239,240,239, + 237,239,230,111,128, 49, 28,242,229,246,101,128, 1, 21, 99, 5, + 76, 42, 76,115, 76,129, 76,161, 76,250, 97, 2, 76, 48, 76,109, + 238,228,242, 97, 3, 76, 59, 76, 66, 76, 77,228,229,246, 97,128, + 9, 13,231,245,234,225,242,225,244,105,128, 10,141,246,239,247, + 229,236,243,233,231,110, 2, 76, 91, 76, 98,228,229,246, 97,128, + 9, 69,231,245,234,225,242,225,244,105,128, 10,197,242,239,110, + 128, 1, 27,229,228,233,236,236,225,226,242,229,246,101,128, 30, + 29,104, 2, 76,135, 76,146,225,242,237,229,238,233,225,110,128, + 5,101,249,233,247,238,225,242,237,229,238,233,225,110,128, 5, + 135,233,242, 99, 2, 76,169, 76,174,236,101,128, 36,212,245,237, + 230,236,229,120,134, 0,234, 76,195, 76,203, 76,211, 76,222, 76, + 230, 76,242,225,227,245,244,101,128, 30,191,226,229,236,239,119, + 128, 30, 25,228,239,244,226,229,236,239,119,128, 30,199,231,242, + 225,246,101,128, 30,193,232,239,239,235,225,226,239,246,101,128, + 30,195,244,233,236,228,101,128, 30,197,249,242,233,236,236,233, + 99,128, 4, 84,100, 4, 77, 14, 77, 24, 77, 30, 77, 40,226,236, + 231,242,225,246,101,128, 2, 5,229,246, 97,128, 9, 15,233,229, + 242,229,243,233,115,128, 0,235,239,116,130, 1, 23, 77, 49, 77, + 58,225,227,227,229,238,116,128, 1, 23,226,229,236,239,119,128, + 30,185,101, 2, 77, 72, 77, 83,231,245,242,237,245,235,232,105, + 128, 10, 15,237,225,244,242,225,231,245,242,237,245,235,232,105, + 128, 10, 71,230,227,249,242,233,236,236,233, 99,128, 4, 68,103, + 2, 77,117, 77,124,242,225,246,101,128, 0,232,245,234,225,242, + 225,244,105,128, 10,143,104, 4, 77,144, 77,155, 77,166, 77,176, + 225,242,237,229,238,233,225,110,128, 5,103,226,239,240,239,237, + 239,230,111,128, 49, 29,233,242,225,231,225,238, 97,128, 48, 72, + 239,239,235,225,226,239,246,101,128, 30,187,105, 4, 77,197, 77, + 208, 79, 10, 79, 25,226,239,240,239,237,239,230,111,128, 49, 31, + 231,232,116,142, 0, 56, 77,242, 77,251, 78, 5, 78, 35, 78, 42, + 78, 80, 78,105, 78,150, 78,184, 78,196, 78,207, 78,240, 78,248, + 79, 3,225,242,225,226,233, 99,128, 6,104,226,229,238,231,225, + 236,105,128, 9,238,227,233,242,227,236,101,129, 36,103, 78, 16, + 233,238,246,229,242,243,229,243,225,238,243,243,229,242,233,102, + 128, 39,145,228,229,246, 97,128, 9,110,229,229,110, 2, 78, 50, + 78, 59,227,233,242,227,236,101,128, 36,113,112, 2, 78, 65, 78, + 72,225,242,229,110,128, 36,133,229,242,233,239,100,128, 36,153, + 231,117, 2, 78, 87, 78, 96,234,225,242,225,244,105,128, 10,238, + 242,237,245,235,232,105,128, 10,110,104, 2, 78,111, 78,137, 97, + 2, 78,117, 78,128,227,235,225,242,225,226,233, 99,128, 6,104, + 238,231,250,232,239,117,128, 48, 40,238,239,244,229,226,229,225, + 237,229,100,128, 38,107,105, 2, 78,156, 78,174,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 39,238,230, + 229,242,233,239,114,128, 32,136,237,239,238,239,243,240,225,227, + 101,128,255, 24,239,236,228,243,244,249,236,101,128,247, 56,112, + 2, 78,213, 78,220,225,242,229,110,128, 36,123,229,114, 2, 78, + 227, 78,233,233,239,100,128, 36,143,243,233,225,110,128, 6,248, + 242,239,237,225,110,128, 33,119,243,245,240,229,242,233,239,114, + 128, 32,120,244,232,225,105,128, 14, 88,238,246,229,242,244,229, + 228,226,242,229,246,101,128, 2, 7,239,244,233,230,233,229,228, + 227,249,242,233,236,236,233, 99,128, 4,101,107, 2, 79, 49, 79, + 73,225,244,225,235,225,238, 97,129, 48,168, 79, 61,232,225,236, + 230,247,233,228,244,104,128,255,116,111, 2, 79, 79, 79, 94,238, + 235,225,242,231,245,242,237,245,235,232,105,128, 10,116,242,229, + 225,110,128, 49, 84,108, 3, 79,109, 79,120, 79,181,227,249,242, + 233,236,236,233, 99,128, 4, 59,101, 2, 79,126, 79,133,237,229, + 238,116,128, 34, 8,246,229,110, 3, 79,143, 79,152, 79,173,227, + 233,242,227,236,101,128, 36,106,112, 2, 79,158, 79,165,225,242, + 229,110,128, 36,126,229,242,233,239,100,128, 36,146,242,239,237, + 225,110,128, 33,122,236,233,240,243,233,115,129, 32, 38, 79,192, + 246,229,242,244,233,227,225,108,128, 34,238,109, 5, 79,215, 79, + 243, 79,254, 80, 18, 80, 29,225,227,242,239,110,130, 1, 19, 79, + 227, 79,235,225,227,245,244,101,128, 30, 23,231,242,225,246,101, + 128, 30, 21,227,249,242,233,236,236,233, 99,128, 4, 60,228,225, + 243,104,129, 32, 20, 80, 7,246,229,242,244,233,227,225,108,128, + 254, 49,239,238,239,243,240,225,227,101,128,255, 69,112, 2, 80, + 35, 80, 55,232,225,243,233,243,237,225,242,235,225,242,237,229, + 238,233,225,110,128, 5, 91,244,249,243,229,116,128, 34, 5,110, + 6, 80, 77, 80, 88, 80, 99, 80,143, 80,175, 80,190,226,239,240, + 239,237,239,230,111,128, 49, 35,227,249,242,233,236,236,233, 99, + 128, 4, 61,100, 2, 80,105, 80,124,225,243,104,129, 32, 19, 80, + 113,246,229,242,244,233,227,225,108,128,254, 50,229,243,227,229, + 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,163,103, + 130, 1, 75, 80,151, 80,162,226,239,240,239,237,239,230,111,128, + 49, 37,232,229,227,249,242,233,236,236,233, 99,128, 4,165,232, + 239,239,235,227,249,242,233,236,236,233, 99,128, 4,200,243,240, + 225,227,101,128, 32, 2,111, 3, 80,206, 80,214, 80,223,231,239, + 238,229,107,128, 1, 25,235,239,242,229,225,110,128, 49, 83,240, + 229,110,130, 2, 91, 80,233, 80,242,227,236,239,243,229,100,128, + 2,154,242,229,246,229,242,243,229,100,130, 2, 92, 81, 1, 81, + 10,227,236,239,243,229,100,128, 2, 94,232,239,239,107,128, 2, + 93,112, 2, 81, 23, 81, 30,225,242,229,110,128, 36,160,243,233, + 236,239,110,129, 3,181, 81, 40,244,239,238,239,115,128, 3,173, + 241,117, 2, 81, 55, 81, 99,225,108,130, 0, 61, 81, 64, 81, 76, + 237,239,238,239,243,240,225,227,101,128,255, 29,115, 2, 81, 82, + 81, 89,237,225,236,108,128,254,102,245,240,229,242,233,239,114, + 128, 32,124,233,246,225,236,229,238,227,101,128, 34, 97,114, 3, + 81,118, 81,129, 81,140,226,239,240,239,237,239,230,111,128, 49, + 38,227,249,242,233,236,236,233, 99,128, 4, 64,229,246,229,242, + 243,229,100,129, 2, 88, 81,152,227,249,242,233,236,236,233, 99, + 128, 4, 77,115, 6, 81,177, 81,188, 81,208, 82, 33, 82, 78, 82, + 88,227,249,242,233,236,236,233, 99,128, 4, 65,228,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,171, + 104,132, 2,131, 81,220, 81,227, 82, 2, 82, 17,227,245,242,108, + 128, 2,134,239,242,116, 2, 81,235, 81,242,228,229,246, 97,128, + 9, 14,246,239,247,229,236,243,233,231,238,228,229,246, 97,128, + 9, 70,242,229,246,229,242,243,229,228,236,239,239,112,128, 1, + 170,243,241,245,225,244,242,229,246,229,242,243,229,100,128, 2, + 133,237,225,236,108, 2, 82, 42, 82, 53,232,233,242,225,231,225, + 238, 97,128, 48, 71,235,225,244,225,235,225,238, 97,129, 48,167, + 82, 66,232,225,236,230,247,233,228,244,104,128,255,106,244,233, + 237,225,244,229,100,128, 33, 46,245,240,229,242,233,239,114,128, + 246,236,116, 5, 82,110, 82,136, 82,140, 82,157, 82,223, 97,130, + 3,183, 82,118, 82,128,242,237,229,238,233,225,110,128, 5,104, + 244,239,238,239,115,128, 3,174,104,128, 0,240,233,236,228,101, + 129, 30,189, 82,149,226,229,236,239,119,128, 30, 27,238,225,232, + 244, 97, 3, 82,169, 82,201, 82,210,230,239,245,235,104, 2, 82, + 179, 82,188,232,229,226,242,229,119,128, 5,145,236,229,230,244, + 232,229,226,242,229,119,128, 5,145,232,229,226,242,229,119,128, + 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,245, + 242,238,229,100,128, 1,221,117, 2, 82,237, 82,246,235,239,242, + 229,225,110,128, 49, 97,242,111,128, 32,172,246,239,247,229,236, + 243,233,231,110, 3, 83, 11, 83, 21, 83, 28,226,229,238,231,225, + 236,105,128, 9,199,228,229,246, 97,128, 9, 71,231,245,234,225, + 242,225,244,105,128, 10,199,120, 2, 83, 45, 83,118,227,236,225, + 109,132, 0, 33, 83, 60, 83, 71, 83, 98, 83,110,225,242,237,229, + 238,233,225,110,128, 5, 92,100, 2, 83, 77, 83, 82,226,108,128, + 32, 60,239,247,110,129, 0,161, 83, 90,243,237,225,236,108,128, + 247,161,237,239,238,239,243,240,225,227,101,128,255, 1,243,237, + 225,236,108,128,247, 33,233,243,244,229,238,244,233,225,108,128, + 34, 3,250,104,131, 2,146, 83,141, 83,160, 83,171, 99, 2, 83, + 147, 83,154,225,242,239,110,128, 1,239,245,242,108,128, 2,147, + 242,229,246,229,242,243,229,100,128, 1,185,244,225,233,108,128, + 1,186,102,140, 0,102, 83,206, 84, 32, 84, 43, 84, 52, 84, 64, + 84,167, 84,183, 86,191, 86,204, 86,230, 88,107, 88,115, 97, 4, + 83,216, 83,223, 83,234, 83,245,228,229,246, 97,128, 9, 94,231, + 245,242,237,245,235,232,105,128, 10, 94,232,242,229,238,232,229, + 233,116,128, 33, 9,244,232, 97, 3, 83,255, 84, 8, 84, 20,225, + 242,225,226,233, 99,128, 6, 78,236,239,247,225,242,225,226,233, + 99,128, 6, 78,244,225,238,225,242,225,226,233, 99,128, 6, 75, + 226,239,240,239,237,239,230,111,128, 49, 8,227,233,242,227,236, + 101,128, 36,213,228,239,244,225,227,227,229,238,116,128, 30, 31, + 101, 3, 84, 72, 84,150, 84,160,104, 4, 84, 82, 84,105, 84,119, + 84,135,225,114, 2, 84, 89, 84, 96,225,226,233, 99,128, 6, 65, + 237,229,238,233,225,110,128, 5,134,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,210,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,254,211,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,254,212,233,227,239,240,244,233, 99,128, 3,229, + 237,225,236,101,128, 38, 64,102,130,251, 0, 84,175, 84,179,105, + 128,251, 3,108,128,251, 4,105,136,251, 1, 84,203, 84,243, 84, + 254, 85, 20, 85,142, 85,159, 85,167, 85,180,230,244,229,229,110, + 2, 84,213, 84,222,227,233,242,227,236,101,128, 36,110,112, 2, + 84,228, 84,235,225,242,229,110,128, 36,130,229,242,233,239,100, + 128, 36,150,231,245,242,229,228,225,243,104,128, 32, 18,236,236, + 229,100, 2, 85, 7, 85, 13,226,239,120,128, 37,160,242,229,227, + 116,128, 37,172,238,225,108, 5, 85, 34, 85, 73, 85, 90, 85,107, + 85,123,235,225,102,130, 5,218, 85, 44, 85, 64,228,225,231,229, + 243,104,129,251, 58, 85, 55,232,229,226,242,229,119,128,251, 58, + 232,229,226,242,229,119,128, 5,218,237,229,109,129, 5,221, 85, + 81,232,229,226,242,229,119,128, 5,221,238,245,110,129, 5,223, + 85, 98,232,229,226,242,229,119,128, 5,223,240,101,129, 5,227, + 85,114,232,229,226,242,229,119,128, 5,227,244,243,225,228,105, + 129, 5,229, 85,133,232,229,226,242,229,119,128, 5,229,242,243, + 244,244,239,238,229,227,232,233,238,229,243,101,128, 2,201,243, + 232,229,249,101,128, 37,201,244,225,227,249,242,233,236,236,233, + 99,128, 4,115,246,101,142, 0, 53, 85,213, 85,222, 85,232, 86, + 6, 86, 13, 86, 23, 86, 48, 86, 75, 86,109, 86,121, 86,132, 86, + 165, 86,173, 86,184,225,242,225,226,233, 99,128, 6,101,226,229, + 238,231,225,236,105,128, 9,235,227,233,242,227,236,101,129, 36, + 100, 85,243,233,238,246,229,242,243,229,243,225,238,243,243,229, + 242,233,102,128, 39,142,228,229,246, 97,128, 9,107,229,233,231, + 232,244,232,115,128, 33, 93,231,117, 2, 86, 30, 86, 39,234,225, + 242,225,244,105,128, 10,235,242,237,245,235,232,105,128, 10,107, + 232, 97, 2, 86, 55, 86, 66,227,235,225,242,225,226,233, 99,128, + 6,101,238,231,250,232,239,117,128, 48, 37,105, 2, 86, 81, 86, + 99,228,229,239,231,242,225,240,232,233,227,240,225,242,229,110, + 128, 50, 36,238,230,229,242,233,239,114,128, 32,133,237,239,238, + 239,243,240,225,227,101,128,255, 21,239,236,228,243,244,249,236, + 101,128,247, 53,112, 2, 86,138, 86,145,225,242,229,110,128, 36, + 120,229,114, 2, 86,152, 86,158,233,239,100,128, 36,140,243,233, + 225,110,128, 6,245,242,239,237,225,110,128, 33,116,243,245,240, + 229,242,233,239,114,128, 32,117,244,232,225,105,128, 14, 85,108, + 129,251, 2, 86,197,239,242,233,110,128, 1,146,109, 2, 86,210, + 86,221,239,238,239,243,240,225,227,101,128,255, 70,243,241,245, + 225,242,101,128, 51,153,111, 4, 86,240, 87, 6, 87, 18, 87, 25, + 230, 97, 2, 86,247, 86,255,238,244,232,225,105,128, 14, 31,244, + 232,225,105,128, 14, 29,238,231,237,225,238,244,232,225,105,128, + 14, 79,242,225,236,108,128, 34, 0,245,114,142, 0, 52, 87, 58, + 87, 67, 87, 77, 87,107, 87,114, 87,139, 87,166, 87,200, 87,212, + 87,231, 87,242, 88, 19, 88, 27, 88, 38,225,242,225,226,233, 99, + 128, 6,100,226,229,238,231,225,236,105,128, 9,234,227,233,242, + 227,236,101,129, 36, 99, 87, 88,233,238,246,229,242,243,229,243, + 225,238,243,243,229,242,233,102,128, 39,141,228,229,246, 97,128, + 9,106,231,117, 2, 87,121, 87,130,234,225,242,225,244,105,128, + 10,234,242,237,245,235,232,105,128, 10,106,232, 97, 2, 87,146, + 87,157,227,235,225,242,225,226,233, 99,128, 6,100,238,231,250, + 232,239,117,128, 48, 36,105, 2, 87,172, 87,190,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 35,238,230, + 229,242,233,239,114,128, 32,132,237,239,238,239,243,240,225,227, + 101,128,255, 20,238,245,237,229,242,225,244,239,242,226,229,238, + 231,225,236,105,128, 9,247,239,236,228,243,244,249,236,101,128, + 247, 52,112, 2, 87,248, 87,255,225,242,229,110,128, 36,119,229, + 114, 2, 88, 6, 88, 12,233,239,100,128, 36,139,243,233,225,110, + 128, 6,244,242,239,237,225,110,128, 33,115,243,245,240,229,242, + 233,239,114,128, 32,116,116, 2, 88, 44, 88, 82,229,229,110, 2, + 88, 52, 88, 61,227,233,242,227,236,101,128, 36,109,112, 2, 88, + 67, 88, 74,225,242,229,110,128, 36,129,229,242,233,239,100,128, + 36,149,104, 2, 88, 88, 88, 93,225,105,128, 14, 84,244,239,238, + 229,227,232,233,238,229,243,101,128, 2,203,240,225,242,229,110, + 128, 36,161,242, 97, 2, 88,122, 88,130,227,244,233,239,110,128, + 32, 68,238, 99,128, 32,163,103,144, 0,103, 88,171, 89,117, 89, + 140, 89,201, 89,218, 90,139, 91,132, 91,217, 91,230, 92, 88, 92, + 113, 92,141, 92,163, 93,108, 93,130, 93,232, 97, 9, 88,191, 88, + 201, 88,208, 88,215, 89, 23, 89, 48, 89, 59, 89, 70, 89,104,226, + 229,238,231,225,236,105,128, 9,151,227,245,244,101,128, 1,245, + 228,229,246, 97,128, 9, 23,102, 4, 88,225, 88,234, 88,248, 89, + 8,225,242,225,226,233, 99,128, 6,175,230,233,238,225,236,225, + 242,225,226,233, 99,128,251,147,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,251,148,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,251,149,231,117, 2, 89, 30, 89, 39,234,225, + 242,225,244,105,128, 10,151,242,237,245,235,232,105,128, 10, 23, + 232,233,242,225,231,225,238, 97,128, 48, 76,235,225,244,225,235, + 225,238, 97,128, 48,172,237,237, 97,130, 3,179, 89, 80, 89, 93, + 236,225,244,233,238,243,237,225,236,108,128, 2, 99,243,245,240, + 229,242,233,239,114,128, 2,224,238,231,233,225,227,239,240,244, + 233, 99,128, 3,235, 98, 2, 89,123, 89,133,239,240,239,237,239, + 230,111,128, 49, 13,242,229,246,101,128, 1, 31, 99, 4, 89,150, + 89,157, 89,166, 89,188,225,242,239,110,128, 1,231,229,228,233, + 236,236, 97,128, 1, 35,233,242, 99, 2, 89,174, 89,179,236,101, + 128, 36,214,245,237,230,236,229,120,128, 1, 29,239,237,237,225, + 225,227,227,229,238,116,128, 1, 35,228,239,116,129, 1, 33, 89, + 209,225,227,227,229,238,116,128, 1, 33,101, 6, 89,232, 89,243, + 89,254, 90, 9, 90, 28, 90,130,227,249,242,233,236,236,233, 99, + 128, 4, 51,232,233,242,225,231,225,238, 97,128, 48, 82,235,225, + 244,225,235,225,238, 97,128, 48,178,239,237,229,244,242,233,227, + 225,236,236,249,229,241,245,225,108,128, 34, 81,114, 3, 90, 36, + 90, 85, 90, 95,229,243,104, 3, 90, 46, 90, 61, 90, 70,225,227, + 227,229,238,244,232,229,226,242,229,119,128, 5,156,232,229,226, + 242,229,119,128, 5,243,237,245,241,228,225,237,232,229,226,242, + 229,119,128, 5,157,237,225,238,228,226,236,115,128, 0,223,243, + 232,225,249,233,109, 2, 90,106, 90,121,225,227,227,229,238,244, + 232,229,226,242,229,119,128, 5,158,232,229,226,242,229,119,128, + 5,244,244,225,237,225,242,107,128, 48, 19,104, 5, 90,151, 91, + 28, 91, 91, 91,116, 91,122, 97, 4, 90,161, 90,171, 90,194, 90, + 219,226,229,238,231,225,236,105,128, 9,152,100, 2, 90,177, 90, + 188,225,242,237,229,238,233,225,110,128, 5,114,229,246, 97,128, + 9, 24,231,117, 2, 90,201, 90,210,234,225,242,225,244,105,128, + 10,152,242,237,245,235,232,105,128, 10, 24,233,110, 4, 90,230, + 90,239, 90,253, 91, 13,225,242,225,226,233, 99,128, 6, 58,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,206,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,207,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,254,208,101, 3, 91, 36, + 91, 57, 91, 74,237,233,228,228,236,229,232,239,239,235,227,249, + 242,233,236,236,233, 99,128, 4,149,243,244,242,239,235,229,227, + 249,242,233,236,236,233, 99,128, 4,147,245,240,244,245,242,238, + 227,249,242,233,236,236,233, 99,128, 4,145,232, 97, 2, 91, 98, + 91,105,228,229,246, 97,128, 9, 90,231,245,242,237,245,235,232, + 105,128, 10, 90,239,239,107,128, 2, 96,250,243,241,245,225,242, + 101,128, 51,147,105, 3, 91,140, 91,151, 91,162,232,233,242,225, + 231,225,238, 97,128, 48, 78,235,225,244,225,235,225,238, 97,128, + 48,174,109, 2, 91,168, 91,179,225,242,237,229,238,233,225,110, + 128, 5, 99,229,108,130, 5,210, 91,188, 91,208,228,225,231,229, + 243,104,129,251, 50, 91,199,232,229,226,242,229,119,128,251, 50, + 232,229,226,242,229,119,128, 5,210,234,229,227,249,242,233,236, + 236,233, 99,128, 4, 83,236,239,244,244,225,108, 2, 91,241, 92, + 2,233,238,246,229,242,244,229,228,243,244,242,239,235,101,128, + 1,190,243,244,239,112,132, 2,148, 92, 17, 92, 28, 92, 34, 92, + 66,233,238,246,229,242,244,229,100,128, 2,150,237,239,100,128, + 2,192,242,229,246,229,242,243,229,100,130, 2,149, 92, 49, 92, + 55,237,239,100,128, 2,193,243,245,240,229,242,233,239,114,128, + 2,228,243,244,242,239,235,101,129, 2,161, 92, 77,242,229,246, + 229,242,243,229,100,128, 2,162,109, 2, 92, 94, 92,102,225,227, + 242,239,110,128, 30, 33,239,238,239,243,240,225,227,101,128,255, + 71,111, 2, 92,119, 92,130,232,233,242,225,231,225,238, 97,128, + 48, 84,235,225,244,225,235,225,238, 97,128, 48,180,240, 97, 2, + 92,148, 92,154,242,229,110,128, 36,162,243,241,245,225,242,101, + 128, 51,172,114, 2, 92,169, 93, 10, 97, 2, 92,175, 92,183,228, + 233,229,238,116,128, 34, 7,246,101,134, 0, 96, 92,200, 92,211, + 92,228, 92,235, 92,244, 93, 0,226,229,236,239,247,227,237, 98, + 128, 3, 22, 99, 2, 92,217, 92,222,237, 98,128, 3, 0,239,237, + 98,128, 3, 0,228,229,246, 97,128, 9, 83,236,239,247,237,239, + 100,128, 2,206,237,239,238,239,243,240,225,227,101,128,255, 64, + 244,239,238,229,227,237, 98,128, 3, 64,229,225,244,229,114,132, + 0, 62, 93, 26, 93, 45, 93, 57, 93,100,229,241,245,225,108,129, + 34,101, 93, 36,239,242,236,229,243,115,128, 34,219,237,239,238, + 239,243,240,225,227,101,128,255, 30,111, 2, 93, 63, 93, 89,114, + 2, 93, 69, 93, 82,229,241,245,233,246,225,236,229,238,116,128, + 34,115,236,229,243,115,128, 34,119,246,229,242,229,241,245,225, + 108,128, 34,103,243,237,225,236,108,128,254,101,115, 2, 93,114, + 93,122,227,242,233,240,116,128, 2, 97,244,242,239,235,101,128, + 1,229,117, 4, 93,140, 93,151, 93,208, 93,219,232,233,242,225, + 231,225,238, 97,128, 48, 80,233,108, 2, 93,158, 93,183,236,229, + 237,239,116, 2, 93,168, 93,175,236,229,230,116,128, 0,171,242, + 233,231,232,116,128, 0,187,243,233,238,231,108, 2, 93,193, 93, + 200,236,229,230,116,128, 32, 57,242,233,231,232,116,128, 32, 58, + 235,225,244,225,235,225,238, 97,128, 48,176,242,225,237,245,243, + 241,245,225,242,101,128, 51, 24,249,243,241,245,225,242,101,128, + 51,201,104,144, 0,104, 94, 22, 96,164, 96,199, 96,236, 97, 20, + 98,164, 98,184, 99,149, 99,161, 99,173,100,241,100,249,101, 4, + 101, 13,101, 93,101, 97, 97, 13, 94, 50, 94, 89, 94, 99, 94,129, + 94,154, 94,232, 94,244, 95, 13, 95, 28, 95, 57, 95, 70, 95,128, + 95,137, 97, 2, 94, 56, 94, 75,226,235,232,225,243,233,225,238, + 227,249,242,233,236,236,233, 99,128, 4,169,236,244,239,238,229, + 225,242,225,226,233, 99,128, 6,193,226,229,238,231,225,236,105, + 128, 9,185,228,101, 2, 94,106, 94,124,243,227,229,238,228,229, + 242,227,249,242,233,236,236,233, 99,128, 4,179,246, 97,128, 9, + 57,231,117, 2, 94,136, 94,145,234,225,242,225,244,105,128, 10, + 185,242,237,245,235,232,105,128, 10, 57,104, 4, 94,164, 94,173, + 94,187, 94,217,225,242,225,226,233, 99,128, 6, 45,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,162,105, 2, 94,193, 94, + 208,238,233,244,233,225,236,225,242,225,226,233, 99,128,254,163, + 242,225,231,225,238, 97,128, 48,111,237,229,228,233,225,236,225, + 242,225,226,233, 99,128,254,164,233,244,245,243,241,245,225,242, + 101,128, 51, 42,235,225,244,225,235,225,238, 97,129, 48,207, 95, + 1,232,225,236,230,247,233,228,244,104,128,255,138,236,225,238, + 244,231,245,242,237,245,235,232,105,128, 10, 77,237,250, 97, 2, + 95, 36, 95, 45,225,242,225,226,233, 99,128, 6, 33,236,239,247, + 225,242,225,226,233, 99,128, 6, 33,238,231,245,236,230,233,236, + 236,229,114,128, 49,100,114, 2, 95, 76, 95, 92,228,243,233,231, + 238,227,249,242,233,236,236,233, 99,128, 4, 74,240,239,239,110, + 2, 95,101, 95,114,236,229,230,244,226,225,242,226,245,112,128, + 33,188,242,233,231,232,244,226,225,242,226,245,112,128, 33,192, + 243,241,245,225,242,101,128, 51,202,244,225,102, 3, 95,147, 95, + 239, 96, 74,240,225,244,225,104,134, 5,178, 95,167, 95,172, 95, + 186, 95,195, 95,210, 95,226,177, 54,128, 5,178, 50, 2, 95,178, + 95,182, 51,128, 5,178,102,128, 5,178,232,229,226,242,229,119, + 128, 5,178,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,178,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,178,247,233,228,229,232,229,226,242,229,119,128, 5,178,241, + 225,237,225,244,115,135, 5,179, 96, 6, 96, 11, 96, 16, 96, 21, + 96, 30, 96, 45, 96, 61,177, 98,128, 5,179,178, 56,128, 5,179, + 179, 52,128, 5,179,232,229,226,242,229,119,128, 5,179,238,225, + 242,242,239,247,232,229,226,242,229,119,128, 5,179,241,245,225, + 242,244,229,242,232,229,226,242,229,119,128, 5,179,247,233,228, + 229,232,229,226,242,229,119,128, 5,179,243,229,231,239,108,135, + 5,177, 96, 96, 96,101, 96,106, 96,111, 96,120, 96,135, 96,151, + 177, 55,128, 5,177,178, 52,128, 5,177,179, 48,128, 5,177,232, + 229,226,242,229,119,128, 5,177,238,225,242,242,239,247,232,229, + 226,242,229,119,128, 5,177,241,245,225,242,244,229,242,232,229, + 226,242,229,119,128, 5,177,247,233,228,229,232,229,226,242,229, + 119,128, 5,177, 98, 3, 96,172, 96,177, 96,187,225,114,128, 1, + 39,239,240,239,237,239,230,111,128, 49, 15,242,229,246,229,226, + 229,236,239,119,128, 30, 43, 99, 2, 96,205, 96,214,229,228,233, + 236,236, 97,128, 30, 41,233,242, 99, 2, 96,222, 96,227,236,101, + 128, 36,215,245,237,230,236,229,120,128, 1, 37,100, 2, 96,242, + 96,252,233,229,242,229,243,233,115,128, 30, 39,239,116, 2, 97, + 3, 97, 12,225,227,227,229,238,116,128, 30, 35,226,229,236,239, + 119,128, 30, 37,101,136, 5,212, 97, 40, 97, 73, 97, 93, 98, 66, + 98, 82, 98,127, 98,136, 98,149,225,242,116,129, 38,101, 97, 48, + 243,245,233,116, 2, 97, 57, 97, 65,226,236,225,227,107,128, 38, + 101,247,232,233,244,101,128, 38, 97,228,225,231,229,243,104,129, + 251, 52, 97, 84,232,229,226,242,229,119,128,251, 52,104, 6, 97, + 107, 97,135, 97,143, 97,193, 97,239, 98, 32, 97, 2, 97,113, 97, + 127,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,242, + 225,226,233, 99,128, 6, 71,229,226,242,229,119,128, 5,212,230, + 233,238,225,236, 97, 2, 97,154, 97,185,236,116, 2, 97,161, 97, + 173,239,238,229,225,242,225,226,233, 99,128,251,167,244,247,239, + 225,242,225,226,233, 99,128,254,234,242,225,226,233, 99,128,254, + 234,232,225,237,250,225,225,226,239,246,101, 2, 97,208, 97,222, + 230,233,238,225,236,225,242,225,226,233, 99,128,251,165,233,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,251,164,105, + 2, 97,245, 98, 23,238,233,244,233,225,236, 97, 2, 98, 1, 98, + 15,236,244,239,238,229,225,242,225,226,233, 99,128,251,168,242, + 225,226,233, 99,128,254,235,242,225,231,225,238, 97,128, 48,120, + 237,229,228,233,225,236, 97, 2, 98, 44, 98, 58,236,244,239,238, + 229,225,242,225,226,233, 99,128,251,169,242,225,226,233, 99,128, + 254,236,233,243,229,233,229,242,225,243,241,245,225,242,101,128, + 51,123,107, 2, 98, 88, 98,112,225,244,225,235,225,238, 97,129, + 48,216, 98,100,232,225,236,230,247,233,228,244,104,128,255,141, + 245,244,225,225,242,245,243,241,245,225,242,101,128, 51, 54,238, + 231,232,239,239,107,128, 2,103,242,245,244,245,243,241,245,225, + 242,101,128, 51, 57,116,129, 5,215, 98,155,232,229,226,242,229, + 119,128, 5,215,232,239,239,107,129, 2,102, 98,173,243,245,240, + 229,242,233,239,114,128, 2,177,105, 4, 98,194, 99, 23, 99, 34, + 99, 59,229,245,104, 4, 98,206, 98,241, 99, 0, 99, 9, 97, 2, + 98,212, 98,227,227,233,242,227,236,229,235,239,242,229,225,110, + 128, 50,123,240,225,242,229,238,235,239,242,229,225,110,128, 50, + 27,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,109, + 235,239,242,229,225,110,128, 49, 78,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 13,232,233,242,225,231,225,238, 97,128, + 48,114,235,225,244,225,235,225,238, 97,129, 48,210, 99, 47,232, + 225,236,230,247,233,228,244,104,128,255,139,242,233,113,134, 5, + 180, 99, 77, 99, 82, 99, 96, 99,105, 99,120, 99,136,177, 52,128, + 5,180, 50, 2, 99, 88, 99, 92, 49,128, 5,180,100,128, 5,180, + 232,229,226,242,229,119,128, 5,180,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,180,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,180,247,233,228,229,232,229,226,242, + 229,119,128, 5,180,236,233,238,229,226,229,236,239,119,128, 30, + 150,237,239,238,239,243,240,225,227,101,128,255, 72,111, 9, 99, + 193, 99,204, 99,228, 99,253,100, 85,100, 98,100,184,100,224,100, + 235,225,242,237,229,238,233,225,110,128, 5,112,232,105, 2, 99, + 211, 99,219,240,244,232,225,105,128, 14, 43,242,225,231,225,238, + 97,128, 48,123,235,225,244,225,235,225,238, 97,129, 48,219, 99, + 241,232,225,236,230,247,233,228,244,104,128,255,142,236,225,109, + 135, 5,185,100, 17,100, 22,100, 27,100, 32,100, 41,100, 56,100, + 72,177, 57,128, 5,185,178, 54,128, 5,185,179, 50,128, 5,185, + 232,229,226,242,229,119,128, 5,185,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,185,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,185,247,233,228,229,232,229,226,242, + 229,119,128, 5,185,238,239,235,232,245,235,244,232,225,105,128, + 14, 46,111, 2,100,104,100,174,107, 4,100,114,100,126,100,132, + 100,154,225,226,239,246,229,227,239,237, 98,128, 3, 9,227,237, + 98,128, 3, 9,240,225,236,225,244,225,236,233,250,229,228,226, + 229,236,239,247,227,237, 98,128, 3, 33,242,229,244,242,239,230, + 236,229,248,226,229,236,239,247,227,237, 98,128, 3, 34,238,243, + 241,245,225,242,101,128, 51, 66,114, 2,100,190,100,217,105, 2, + 100,196,100,205,227,239,240,244,233, 99,128, 3,233,250,239,238, + 244,225,236,226,225,114,128, 32, 21,238,227,237, 98,128, 3, 27, + 244,243,240,242,233,238,231,115,128, 38,104,245,243,101,128, 35, + 2,240,225,242,229,110,128, 36,163,243,245,240,229,242,233,239, + 114,128, 2,176,244,245,242,238,229,100,128, 2,101,117, 4,101, + 23,101, 34,101, 47,101, 72,232,233,242,225,231,225,238, 97,128, + 48,117,233,233,244,239,243,241,245,225,242,101,128, 51, 51,235, + 225,244,225,235,225,238, 97,129, 48,213,101, 60,232,225,236,230, + 247,233,228,244,104,128,255,140,238,231,225,242,245,237,236,225, + 245,116,129, 2,221,101, 87,227,237, 98,128, 3, 11,118,128, 1, + 149,249,240,232,229,110,132, 0, 45,101,113,101,124,101,136,101, + 159,233,238,230,229,242,233,239,114,128,246,229,237,239,238,239, + 243,240,225,227,101,128,255, 13,115, 2,101,142,101,149,237,225, + 236,108,128,254, 99,245,240,229,242,233,239,114,128,246,230,244, + 247,111,128, 32, 16,105,149, 0,105,101,211,101,234,102, 12,102, + 59,105,197,106, 61,106, 98,106,125,107, 31,107, 35,107, 73,107, + 95,107,179,108, 88,108,163,108,171,108,184,109, 15,109, 72,109, + 100,109,144,225, 99, 2,101,218,101,224,245,244,101,128, 0,237, + 249,242,233,236,236,233, 99,128, 4, 79, 98, 3,101,242,101,251, + 102, 5,229,238,231,225,236,105,128, 9,135,239,240,239,237,239, + 230,111,128, 49, 39,242,229,246,101,128, 1, 45, 99, 3,102, 20, + 102, 27,102, 49,225,242,239,110,128, 1,208,233,242, 99, 2,102, + 35,102, 40,236,101,128, 36,216,245,237,230,236,229,120,128, 0, + 238,249,242,233,236,236,233, 99,128, 4, 86,100, 4,102, 69,102, + 79,105,154,105,187,226,236,231,242,225,246,101,128, 2, 9,101, + 2,102, 85,105,149,239,231,242,225,240,104, 7,102,106,102,120, + 102,133,105, 62,105, 93,105,106,105,118,229,225,242,244,232,227, + 233,242,227,236,101,128, 50,143,230,233,242,229,227,233,242,227, + 236,101,128, 50,139,233, 99, 14,102,164,102,180,103, 23,103, 77, + 103,143,103,172,103,188,103,245,104, 38,104, 50,104, 77,104,144, + 105, 26,105, 55,225,236,236,233,225,238,227,229,240,225,242,229, + 110,128, 50, 63, 99, 4,102,190,102,201,102,215,102,222,225,236, + 236,240,225,242,229,110,128, 50, 58,229,238,244,242,229,227,233, + 242,227,236,101,128, 50,165,236,239,243,101,128, 48, 6,111, 3, + 102,230,102,245,103, 9,237,237, 97,129, 48, 1,102,238,236,229, + 230,116,128,255,100,238,231,242,225,244,245,236,225,244,233,239, + 238,240,225,242,229,110,128, 50, 55,242,242,229,227,244,227,233, + 242,227,236,101,128, 50,163,101, 3,103, 31,103, 43,103, 60,225, + 242,244,232,240,225,242,229,110,128, 50, 47,238,244,229,242,240, + 242,233,243,229,240,225,242,229,110,128, 50, 61,248,227,229,236, + 236,229,238,244,227,233,242,227,236,101,128, 50,157,102, 2,103, + 83,103, 98,229,243,244,233,246,225,236,240,225,242,229,110,128, + 50, 64,105, 2,103,104,103,133,238,225,238,227,233,225,108, 2, + 103,116,103,125,227,233,242,227,236,101,128, 50,150,240,225,242, + 229,110,128, 50, 54,242,229,240,225,242,229,110,128, 50, 43,104, + 2,103,149,103,160,225,246,229,240,225,242,229,110,128, 50, 50, + 233,231,232,227,233,242,227,236,101,128, 50,164,233,244,229,242, + 225,244,233,239,238,237,225,242,107,128, 48, 5,108, 3,103,196, + 103,222,103,234,225,226,239,114, 2,103,205,103,214,227,233,242, + 227,236,101,128, 50,152,240,225,242,229,110,128, 50, 56,229,230, + 244,227,233,242,227,236,101,128, 50,167,239,247,227,233,242,227, + 236,101,128, 50,166,109, 2,103,251,104, 27,101, 2,104, 1,104, + 16,228,233,227,233,238,229,227,233,242,227,236,101,128, 50,169, + 244,225,236,240,225,242,229,110,128, 50, 46,239,239,238,240,225, + 242,229,110,128, 50, 42,238,225,237,229,240,225,242,229,110,128, + 50, 52,112, 2,104, 56,104, 64,229,242,233,239,100,128, 48, 2, + 242,233,238,244,227,233,242,227,236,101,128, 50,158,114, 2,104, + 83,104,131,101, 3,104, 91,104,102,104,117,225,227,232,240,225, + 242,229,110,128, 50, 67,240,242,229,243,229,238,244,240,225,242, + 229,110,128, 50, 57,243,239,245,242,227,229,240,225,242,229,110, + 128, 50, 62,233,231,232,244,227,233,242,227,236,101,128, 50,168, + 115, 5,104,156,104,185,104,199,104,224,104,252,101, 2,104,162, + 104,175,227,242,229,244,227,233,242,227,236,101,128, 50,153,236, + 230,240,225,242,229,110,128, 50, 66,239,227,233,229,244,249,240, + 225,242,229,110,128, 50, 51,112, 2,104,205,104,211,225,227,101, + 128, 48, 0,229,227,233,225,236,240,225,242,229,110,128, 50, 53, + 116, 2,104,230,104,241,239,227,235,240,225,242,229,110,128, 50, + 49,245,228,249,240,225,242,229,110,128, 50, 59,117, 2,105, 2, + 105, 11,238,240,225,242,229,110,128, 50, 48,240,229,242,246,233, + 243,229,240,225,242,229,110,128, 50, 60,119, 2,105, 32,105, 44, + 225,244,229,242,240,225,242,229,110,128, 50, 44,239,239,228,240, + 225,242,229,110,128, 50, 45,250,229,242,111,128, 48, 7,109, 2, + 105, 68,105, 81,229,244,225,236,227,233,242,227,236,101,128, 50, + 142,239,239,238,227,233,242,227,236,101,128, 50,138,238,225,237, + 229,227,233,242,227,236,101,128, 50,148,243,245,238,227,233,242, + 227,236,101,128, 50,144,119, 2,105,124,105,137,225,244,229,242, + 227,233,242,227,236,101,128, 50,140,239,239,228,227,233,242,227, + 236,101,128, 50,141,246, 97,128, 9, 7,233,229,242,229,243,233, + 115,130, 0,239,105,168,105,176,225,227,245,244,101,128, 30, 47, + 227,249,242,233,236,236,233, 99,128, 4,229,239,244,226,229,236, + 239,119,128, 30,203,101, 3,105,205,105,221,105,232,226,242,229, + 246,229,227,249,242,233,236,236,233, 99,128, 4,215,227,249,242, + 233,236,236,233, 99,128, 4, 53,245,238,103, 4,105,244,106, 23, + 106, 38,106, 47, 97, 2,105,250,106, 9,227,233,242,227,236,229, + 235,239,242,229,225,110,128, 50,117,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 21,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50,103,235,239,242,229,225,110,128, 49, 71,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 7,103, 2,106, + 67,106, 74,242,225,246,101,128, 0,236,117, 2,106, 80,106, 89, + 234,225,242,225,244,105,128, 10,135,242,237,245,235,232,105,128, + 10, 7,104, 2,106,104,106,114,233,242,225,231,225,238, 97,128, + 48, 68,239,239,235,225,226,239,246,101,128, 30,201,105, 8,106, + 143,106,153,106,164,106,171,106,196,106,212,106,227,106,243,226, + 229,238,231,225,236,105,128, 9,136,227,249,242,233,236,236,233, + 99,128, 4, 56,228,229,246, 97,128, 9, 8,231,117, 2,106,178, + 106,187,234,225,242,225,244,105,128, 10,136,242,237,245,235,232, + 105,128, 10, 8,237,225,244,242,225,231,245,242,237,245,235,232, + 105,128, 10, 64,238,246,229,242,244,229,228,226,242,229,246,101, + 128, 2, 11,243,232,239,242,244,227,249,242,233,236,236,233, 99, + 128, 4, 57,246,239,247,229,236,243,233,231,110, 3,107, 3,107, + 13,107, 20,226,229,238,231,225,236,105,128, 9,192,228,229,246, + 97,128, 9, 64,231,245,234,225,242,225,244,105,128, 10,192,106, + 128, 1, 51,107, 2,107, 41,107, 65,225,244,225,235,225,238, 97, + 129, 48,164,107, 53,232,225,236,230,247,233,228,244,104,128,255, + 114,239,242,229,225,110,128, 49, 99,108, 2,107, 79,107, 84,228, + 101,128, 2,220,245,249,232,229,226,242,229,119,128, 5,172,109, + 2,107,101,107,168, 97, 3,107,109,107,129,107,154,227,242,239, + 110,129, 1, 43,107,118,227,249,242,233,236,236,233, 99,128, 4, + 227,231,229,239,242,225,240,240,242,239,248,233,237,225,244,229, + 236,249,229,241,245,225,108,128, 34, 83,244,242,225,231,245,242, + 237,245,235,232,105,128, 10, 63,239,238,239,243,240,225,227,101, + 128,255, 73,110, 5,107,191,107,201,107,210,107,222,108, 50,227, + 242,229,237,229,238,116,128, 34, 6,230,233,238,233,244,121,128, + 34, 30,233,225,242,237,229,238,233,225,110,128, 5,107,116, 2, + 107,228,108, 40,101, 2,107,234,108, 29,231,242,225,108,131, 34, + 43,107,247,108, 9,108, 14, 98, 2,107,253,108, 5,239,244,244, + 239,109,128, 35, 33,116,128, 35, 33,229,120,128,248,245,116, 2, + 108, 20,108, 25,239,112,128, 35, 32,112,128, 35, 32,242,243,229, + 227,244,233,239,110,128, 34, 41,233,243,241,245,225,242,101,128, + 51, 5,118, 3,108, 58,108, 67,108, 76,226,245,236,236,229,116, + 128, 37,216,227,233,242,227,236,101,128, 37,217,243,237,233,236, + 229,230,225,227,101,128, 38, 59,111, 3,108, 96,108,107,108,115, + 227,249,242,233,236,236,233, 99,128, 4, 81,231,239,238,229,107, + 128, 1, 47,244, 97,131, 3,185,108,126,108,147,108,155,228,233, + 229,242,229,243,233,115,129, 3,202,108,139,244,239,238,239,115, + 128, 3,144,236,225,244,233,110,128, 2,105,244,239,238,239,115, + 128, 3,175,240,225,242,229,110,128, 36,164,242,233,231,245,242, + 237,245,235,232,105,128, 10,114,115, 4,108,194,108,239,108,253, + 109, 5,237,225,236,108, 2,108,203,108,214,232,233,242,225,231, + 225,238, 97,128, 48, 67,235,225,244,225,235,225,238, 97,129, 48, + 163,108,227,232,225,236,230,247,233,228,244,104,128,255,104,243, + 232,225,242,226,229,238,231,225,236,105,128, 9,250,244,242,239, + 235,101,128, 2,104,245,240,229,242,233,239,114,128,246,237,116, + 2,109, 21,109, 55,229,242,225,244,233,239,110, 2,109, 33,109, + 44,232,233,242,225,231,225,238, 97,128, 48,157,235,225,244,225, + 235,225,238, 97,128, 48,253,233,236,228,101,129, 1, 41,109, 64, + 226,229,236,239,119,128, 30, 45,117, 2,109, 78,109, 89,226,239, + 240,239,237,239,230,111,128, 49, 41,227,249,242,233,236,236,233, + 99,128, 4, 78,246,239,247,229,236,243,233,231,110, 3,109,116, + 109,126,109,133,226,229,238,231,225,236,105,128, 9,191,228,229, + 246, 97,128, 9, 63,231,245,234,225,242,225,244,105,128, 10,191, + 250,232,233,244,243, 97, 2,109,155,109,166,227,249,242,233,236, + 236,233, 99,128, 4,117,228,226,236,231,242,225,246,229,227,249, + 242,233,236,236,233, 99,128, 4,119,106,138, 0,106,109,209,110, + 16,110, 27,110, 77,110, 93,110,206,111, 19,111, 24,111, 36,111, + 44, 97, 4,109,219,109,230,109,240,109,247,225,242,237,229,238, + 233,225,110,128, 5,113,226,229,238,231,225,236,105,128, 9,156, + 228,229,246, 97,128, 9, 28,231,117, 2,109,254,110, 7,234,225, + 242,225,244,105,128, 10,156,242,237,245,235,232,105,128, 10, 28, + 226,239,240,239,237,239,230,111,128, 49, 16, 99, 3,110, 35,110, + 42,110, 64,225,242,239,110,128, 1,240,233,242, 99, 2,110, 50, + 110, 55,236,101,128, 36,217,245,237,230,236,229,120,128, 1, 53, + 242,239,243,243,229,228,244,225,233,108,128, 2,157,228,239,244, + 236,229,243,243,243,244,242,239,235,101,128, 2, 95,101, 3,110, + 101,110,112,110,177,227,249,242,233,236,236,233, 99,128, 4, 88, + 229,109, 4,110,123,110,132,110,146,110,162,225,242,225,226,233, + 99,128, 6, 44,230,233,238,225,236,225,242,225,226,233, 99,128, + 254,158,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,159,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, + 160,104, 2,110,183,110,192,225,242,225,226,233, 99,128, 6,152, + 230,233,238,225,236,225,242,225,226,233, 99,128,251,139,104, 2, + 110,212,111, 6, 97, 3,110,220,110,230,110,237,226,229,238,231, + 225,236,105,128, 9,157,228,229,246, 97,128, 9, 29,231,117, 2, + 110,244,110,253,234,225,242,225,244,105,128, 10,157,242,237,245, + 235,232,105,128, 10, 29,229,232,225,242,237,229,238,233,225,110, + 128, 5,123,233,115,128, 48, 4,237,239,238,239,243,240,225,227, + 101,128,255, 74,240,225,242,229,110,128, 36,165,243,245,240,229, + 242,233,239,114,128, 2,178,107,146, 0,107,111, 95,113,184,113, + 195,114, 1,114, 12,114,102,114,116,115,224,116,164,116,177,116, + 203,116,252,117,134,117,156,117,169,117,192,117,234,117,244, 97, + 12,111,121,111,153,111,175,111,205,112, 63,112, 88,112,118,112, + 143,112,249,113, 7,113,130,113,159, 98, 2,111,127,111,144,225, + 243,232,235,233,242,227,249,242,233,236,236,233, 99,128, 4,161, + 229,238,231,225,236,105,128, 9,149, 99, 2,111,159,111,165,245, + 244,101,128, 30, 49,249,242,233,236,236,233, 99,128, 4, 58,228, + 101, 2,111,182,111,200,243,227,229,238,228,229,242,227,249,242, + 233,236,236,233, 99,128, 4,155,246, 97,128, 9, 21,102,135, 5, + 219,111,223,111,232,111,252,112, 10,112, 19,112, 35,112, 50,225, + 242,225,226,233, 99,128, 6, 67,228,225,231,229,243,104,129,251, + 59,111,243,232,229,226,242,229,119,128,251, 59,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,218,232,229,226,242,229,119, + 128, 5,219,233,238,233,244,233,225,236,225,242,225,226,233, 99, + 128,254,219,237,229,228,233,225,236,225,242,225,226,233, 99,128, + 254,220,242,225,230,229,232,229,226,242,229,119,128,251, 77,231, + 117, 2,112, 70,112, 79,234,225,242,225,244,105,128, 10,149,242, + 237,245,235,232,105,128, 10, 21,104, 2,112, 94,112,104,233,242, + 225,231,225,238, 97,128, 48, 75,239,239,235,227,249,242,233,236, + 236,233, 99,128, 4,196,235,225,244,225,235,225,238, 97,129, 48, + 171,112,131,232,225,236,230,247,233,228,244,104,128,255,118,112, + 2,112,149,112,170,240, 97,129, 3,186,112,156,243,249,237,226, + 239,236,231,242,229,229,107,128, 3,240,249,229,239,245,110, 3, + 112,182,112,196,112,230,237,233,229,245,237,235,239,242,229,225, + 110,128, 49,113,112, 2,112,202,112,217,232,233,229,245,240,232, + 235,239,242,229,225,110,128, 49,132,233,229,245,240,235,239,242, + 229,225,110,128, 49,120,243,243,225,238,231,240,233,229,245,240, + 235,239,242,229,225,110,128, 49,121,242,239,242,233,233,243,241, + 245,225,242,101,128, 51, 13,115, 5,113, 19,113, 63,113, 78,113, + 86,113,114,232,233,228,225,225,245,244,111, 2,113, 32,113, 41, + 225,242,225,226,233, 99,128, 6, 64,238,239,243,233,228,229,226, + 229,225,242,233,238,231,225,242,225,226,233, 99,128, 6, 64,237, + 225,236,236,235,225,244,225,235,225,238, 97,128, 48,245,241,245, + 225,242,101,128, 51,132,242, 97, 2,113, 93,113,102,225,242,225, + 226,233, 99,128, 6, 80,244,225,238,225,242,225,226,233, 99,128, + 6, 77,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, + 4,159,244,225,232,233,242,225,240,242,239,236,239,238,231,237, + 225,242,235,232,225,236,230,247,233,228,244,104,128,255,112,246, + 229,242,244,233,227,225,236,243,244,242,239,235,229,227,249,242, + 233,236,236,233, 99,128, 4,157,226,239,240,239,237,239,230,111, + 128, 49, 14, 99, 4,113,205,113,227,113,236,113,244, 97, 2,113, + 211,113,221,236,243,241,245,225,242,101,128, 51,137,242,239,110, + 128, 1,233,229,228,233,236,236, 97,128, 1, 55,233,242,227,236, + 101,128, 36,218,239,237,237,225,225,227,227,229,238,116,128, 1, + 55,228,239,244,226,229,236,239,119,128, 30, 51,101, 4,114, 22, + 114, 49,114, 74,114, 86,104, 2,114, 28,114, 39,225,242,237,229, + 238,233,225,110,128, 5,132,233,242,225,231,225,238, 97,128, 48, + 81,235,225,244,225,235,225,238, 97,129, 48,177,114, 62,232,225, + 236,230,247,233,228,244,104,128,255,121,238,225,242,237,229,238, + 233,225,110,128, 5,111,243,237,225,236,236,235,225,244,225,235, + 225,238, 97,128, 48,246,231,242,229,229,238,236,225,238,228,233, + 99,128, 1, 56,104, 6,114,130,115, 3,115, 14,115, 39,115,126, + 115,214, 97, 5,114,142,114,152,114,163,114,170,114,195,226,229, + 238,231,225,236,105,128, 9,150,227,249,242,233,236,236,233, 99, + 128, 4, 69,228,229,246, 97,128, 9, 22,231,117, 2,114,177,114, + 186,234,225,242,225,244,105,128, 10,150,242,237,245,235,232,105, + 128, 10, 22,104, 4,114,205,114,214,114,228,114,244,225,242,225, + 226,233, 99,128, 6, 46,230,233,238,225,236,225,242,225,226,233, + 99,128,254,166,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,167,237,229,228,233,225,236,225,242,225,226,233, 99, + 128,254,168,229,233,227,239,240,244,233, 99,128, 3,231,232, 97, + 2,115, 21,115, 28,228,229,246, 97,128, 9, 89,231,245,242,237, + 245,235,232,105,128, 10, 89,233,229,245,235,104, 4,115, 53,115, + 88,115,103,115,112, 97, 2,115, 59,115, 74,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,120,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 24,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50,106,235,239,242,229,225,110,128, 49, 75, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 10,111, 4, + 115,136,115,185,115,195,115,200,235,104, 4,115,147,115,156,115, + 165,115,175,225,233,244,232,225,105,128, 14, 2,239,238,244,232, + 225,105,128, 14, 5,245,225,244,244,232,225,105,128, 14, 3,247, + 225,233,244,232,225,105,128, 14, 4,237,245,244,244,232,225,105, + 128, 14, 91,239,107,128, 1,153,242,225,235,232,225,238,231,244, + 232,225,105,128, 14, 6,250,243,241,245,225,242,101,128, 51,145, + 105, 4,115,234,115,245,116, 14,116, 63,232,233,242,225,231,225, + 238, 97,128, 48, 77,235,225,244,225,235,225,238, 97,129, 48,173, + 116, 2,232,225,236,230,247,233,228,244,104,128,255,119,242,111, + 3,116, 23,116, 38,116, 54,231,245,242,225,237,245,243,241,245, + 225,242,101,128, 51, 21,237,229,229,244,239,242,245,243,241,245, + 225,242,101,128, 51, 22,243,241,245,225,242,101,128, 51, 20,249, + 229,239,107, 5,116, 78,116,113,116,128,116,137,116,151, 97, 2, + 116, 84,116, 99,227,233,242,227,236,229,235,239,242,229,225,110, + 128, 50,110,240,225,242,229,238,235,239,242,229,225,110,128, 50, + 14,227,233,242,227,236,229,235,239,242,229,225,110,128, 50, 96, + 235,239,242,229,225,110,128, 49, 49,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 0,243,233,239,243,235,239,242,229,225, + 110,128, 49, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, + 92,108, 2,116,183,116,194,233,238,229,226,229,236,239,119,128, + 30, 53,243,241,245,225,242,101,128, 51,152,109, 3,116,211,116, + 225,116,236,227,245,226,229,228,243,241,245,225,242,101,128, 51, + 166,239,238,239,243,240,225,227,101,128,255, 75,243,241,245,225, + 242,229,228,243,241,245,225,242,101,128, 51,162,111, 5,117, 8, + 117, 34,117, 72,117, 84,117, 98,104, 2,117, 14,117, 24,233,242, + 225,231,225,238, 97,128, 48, 83,237,243,241,245,225,242,101,128, + 51,192,235, 97, 2,117, 41,117, 49,233,244,232,225,105,128, 14, + 1,244,225,235,225,238, 97,129, 48,179,117, 60,232,225,236,230, + 247,233,228,244,104,128,255,122,239,240,239,243,241,245,225,242, + 101,128, 51, 30,240,240,225,227,249,242,233,236,236,233, 99,128, + 4,129,114, 2,117,104,117,124,229,225,238,243,244,225,238,228, + 225,242,228,243,249,237,226,239,108,128, 50,127,239,238,233,243, + 227,237, 98,128, 3, 67,240, 97, 2,117,141,117,147,242,229,110, + 128, 36,166,243,241,245,225,242,101,128, 51,170,243,233,227,249, + 242,233,236,236,233, 99,128, 4,111,116, 2,117,175,117,184,243, + 241,245,225,242,101,128, 51,207,245,242,238,229,100,128, 2,158, + 117, 2,117,198,117,209,232,233,242,225,231,225,238, 97,128, 48, + 79,235,225,244,225,235,225,238, 97,129, 48,175,117,222,232,225, + 236,230,247,233,228,244,104,128,255,120,246,243,241,245,225,242, + 101,128, 51,184,247,243,241,245,225,242,101,128, 51,190,108,146, + 0,108,118, 38,120, 65,120, 94,120,160,120,198,121, 94,121,103, + 121,119,121,143,121,161,122, 23,122, 64,122,199,122,207,122,240, + 122,249,123, 1,123, 63, 97, 7,118, 54,118, 64,118, 71,118, 78, + 118,103,118,119,120, 53,226,229,238,231,225,236,105,128, 9,178, + 227,245,244,101,128, 1, 58,228,229,246, 97,128, 9, 50,231,117, + 2,118, 85,118, 94,234,225,242,225,244,105,128, 10,178,242,237, + 245,235,232,105,128, 10, 50,235,235,232,225,238,231,249,225,239, + 244,232,225,105,128, 14, 69,109, 10,118,141,119, 80,119, 97,119, + 135,119,149,119,168,119,184,119,204,119,224,119,247, 97, 2,118, + 147,119, 72,236,229,102, 4,118,159,118,173,119, 9,119, 26,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,252,232,225,237, + 250, 97, 2,118,183,118,224,225,226,239,246,101, 2,118,193,118, + 207,230,233,238,225,236,225,242,225,226,233, 99,128,254,248,233, + 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,247, + 226,229,236,239,119, 2,118,234,118,248,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,250,233,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,254,249,233,243,239,236,225,244,229, + 228,225,242,225,226,233, 99,128,254,251,237,225,228,228,225,225, + 226,239,246,101, 2,119, 41,119, 55,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,246,233,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,254,245,242,225,226,233, 99,128, 6, 68, + 226,228, 97,129, 3,187,119, 88,243,244,242,239,235,101,128, 1, + 155,229,100,130, 5,220,119,106,119,126,228,225,231,229,243,104, + 129,251, 60,119,117,232,229,226,242,229,119,128,251, 60,232,229, + 226,242,229,119,128, 5,220,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,222,232,225,232,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,202,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,223,234,229,229,237,233,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,252,201,235,232,225,232, + 233,238,233,244,233,225,236,225,242,225,226,233, 99,128,252,203, + 236,225,237,232,229,232,233,243,239,236,225,244,229,228,225,242, + 225,226,233, 99,128,253,242,237,101, 2,119,254,120, 11,228,233, + 225,236,225,242,225,226,233, 99,128,254,224,229,109, 2,120, 18, + 120, 37,232,225,232,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,253,136,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,252,204,242,231,229,227,233,242,227,236,101,128, 37, + 239, 98, 3,120, 73,120, 78,120, 84,225,114,128, 1,154,229,236, + 116,128, 2,108,239,240,239,237,239,230,111,128, 49, 12, 99, 4, + 120,104,120,111,120,120,120,147,225,242,239,110,128, 1, 62,229, + 228,233,236,236, 97,128, 1, 60,233,242, 99, 2,120,128,120,133, + 236,101,128, 36,219,245,237,230,236,229,248,226,229,236,239,119, + 128, 30, 61,239,237,237,225,225,227,227,229,238,116,128, 1, 60, + 228,239,116,130, 1, 64,120,170,120,179,225,227,227,229,238,116, + 128, 1, 64,226,229,236,239,119,129, 30, 55,120,189,237,225,227, + 242,239,110,128, 30, 57,101, 3,120,206,120,244,121, 89,230,116, + 2,120,213,120,229,225,238,231,236,229,225,226,239,246,229,227, + 237, 98,128, 3, 26,244,225,227,235,226,229,236,239,247,227,237, + 98,128, 3, 24,243,115,132, 0, 60,121, 1,121, 23,121, 35,121, + 81,229,241,245,225,108,129, 34,100,121, 11,239,242,231,242,229, + 225,244,229,114,128, 34,218,237,239,238,239,243,240,225,227,101, + 128,255, 28,111, 2,121, 41,121, 70,114, 2,121, 47,121, 60,229, + 241,245,233,246,225,236,229,238,116,128, 34,114,231,242,229,225, + 244,229,114,128, 34,118,246,229,242,229,241,245,225,108,128, 34, + 102,243,237,225,236,108,128,254,100,250,104,128, 2,110,230,226, + 236,239,227,107,128, 37,140,232,239,239,235,242,229,244,242,239, + 230,236,229,120,128, 2,109,105, 2,121,125,121,130,242, 97,128, + 32,164,247,238,225,242,237,229,238,233,225,110,128, 5,108,106, + 129, 1,201,121,149,229,227,249,242,233,236,236,233, 99,128, 4, + 89,108,132,246,192,121,173,121,197,121,208,121,217, 97, 2,121, + 179,121,186,228,229,246, 97,128, 9, 51,231,245,234,225,242,225, + 244,105,128, 10,179,233,238,229,226,229,236,239,119,128, 30, 59, + 236,225,228,229,246, 97,128, 9, 52,246,239,227,225,236,233, 99, + 3,121,231,121,241,121,248,226,229,238,231,225,236,105,128, 9, + 225,228,229,246, 97,128, 9, 97,246,239,247,229,236,243,233,231, + 110, 2,122, 6,122, 16,226,229,238,231,225,236,105,128, 9,227, + 228,229,246, 97,128, 9, 99,109, 3,122, 31,122, 44,122, 55,233, + 228,228,236,229,244,233,236,228,101,128, 2,107,239,238,239,243, + 240,225,227,101,128,255, 76,243,241,245,225,242,101,128, 51,208, + 111, 6,122, 78,122, 90,122,132,122,143,122,149,122,191,227,232, + 245,236,225,244,232,225,105,128, 14, 44,231,233,227,225,108, 3, + 122,102,122,108,122,127,225,238,100,128, 34, 39,238,239,116,129, + 0,172,122,116,242,229,246,229,242,243,229,100,128, 35, 16,239, + 114,128, 34, 40,236,233,238,231,244,232,225,105,128, 14, 37,238, + 231,115,128, 1,127,247,236,233,238,101, 2,122,159,122,182, 99, + 2,122,165,122,177,229,238,244,229,242,236,233,238,101,128,254, + 78,237, 98,128, 3, 50,228,225,243,232,229,100,128,254, 77,250, + 229,238,231,101,128, 37,202,240,225,242,229,110,128, 36,167,115, + 3,122,215,122,222,122,230,236,225,243,104,128, 1, 66,241,245, + 225,242,101,128, 33, 19,245,240,229,242,233,239,114,128,246,238, + 244,243,232,225,228,101,128, 37,145,245,244,232,225,105,128, 14, + 38,246,239,227,225,236,233, 99, 3,123, 15,123, 25,123, 32,226, + 229,238,231,225,236,105,128, 9,140,228,229,246, 97,128, 9, 12, + 246,239,247,229,236,243,233,231,110, 2,123, 46,123, 56,226,229, + 238,231,225,236,105,128, 9,226,228,229,246, 97,128, 9, 98,248, + 243,241,245,225,242,101,128, 51,211,109,144, 0,109,123,109,125, + 218,125,243,126, 14,126, 39,127, 92,127,114,128,169,128,199,128, + 248,129, 99,129,121,129,146,129,155,130,182,130,210, 97, 12,123, + 135,123,145,123,209,123,216,123,241,124, 33,125,125,125,150,125, + 155,125,169,125,181,125,186,226,229,238,231,225,236,105,128, 9, + 174, 99, 2,123,151,123,203,242,239,110,132, 0,175,123,165,123, + 176,123,182,123,191,226,229,236,239,247,227,237, 98,128, 3, 49, + 227,237, 98,128, 3, 4,236,239,247,237,239,100,128, 2,205,237, + 239,238,239,243,240,225,227,101,128,255,227,245,244,101,128, 30, + 63,228,229,246, 97,128, 9, 46,231,117, 2,123,223,123,232,234, + 225,242,225,244,105,128, 10,174,242,237,245,235,232,105,128, 10, + 46,104, 2,123,247,124, 23,225,240,225,235,104, 2,124, 1,124, + 10,232,229,226,242,229,119,128, 5,164,236,229,230,244,232,229, + 226,242,229,119,128, 5,164,233,242,225,231,225,238, 97,128, 48, + 126,105, 5,124, 45,124,114,124,177,124,207,125,113,227,232,225, + 244,244,225,247, 97, 3,124, 60,124, 91,124, 98,236,239,119, 2, + 124, 68,124, 79,236,229,230,244,244,232,225,105,128,248,149,242, + 233,231,232,244,244,232,225,105,128,248,148,244,232,225,105,128, + 14, 75,245,240,240,229,242,236,229,230,244,244,232,225,105,128, + 248,147,229,107, 3,124,123,124,154,124,161,236,239,119, 2,124, + 131,124,142,236,229,230,244,244,232,225,105,128,248,140,242,233, + 231,232,244,244,232,225,105,128,248,139,244,232,225,105,128, 14, + 72,245,240,240,229,242,236,229,230,244,244,232,225,105,128,248, + 138,232,225,238,225,235,225,116, 2,124,189,124,200,236,229,230, + 244,244,232,225,105,128,248,132,244,232,225,105,128, 14, 49,116, + 3,124,215,124,243,125, 50,225,233,235,232,117, 2,124,225,124, + 236,236,229,230,244,244,232,225,105,128,248,137,244,232,225,105, + 128, 14, 71,232,111, 3,124,252,125, 27,125, 34,236,239,119, 2, + 125, 4,125, 15,236,229,230,244,244,232,225,105,128,248,143,242, + 233,231,232,244,244,232,225,105,128,248,142,244,232,225,105,128, + 14, 73,245,240,240,229,242,236,229,230,244,244,232,225,105,128, + 248,141,242,105, 3,125, 59,125, 90,125, 97,236,239,119, 2,125, + 67,125, 78,236,229,230,244,244,232,225,105,128,248,146,242,233, + 231,232,244,244,232,225,105,128,248,145,244,232,225,105,128, 14, + 74,245,240,240,229,242,236,229,230,244,244,232,225,105,128,248, + 144,249,225,237,239,235,244,232,225,105,128, 14, 70,235,225,244, + 225,235,225,238, 97,129, 48,222,125,138,232,225,236,230,247,233, + 228,244,104,128,255,143,236,101,128, 38, 66,238,243,249,239,238, + 243,241,245,225,242,101,128, 51, 71,241,225,230,232,229,226,242, + 229,119,128, 5,190,242,115,128, 38, 66,115, 2,125,192,125,210, + 239,242,225,227,233,242,227,236,229,232,229,226,242,229,119,128, + 5,175,241,245,225,242,101,128, 51,131, 98, 2,125,224,125,234, + 239,240,239,237,239,230,111,128, 49, 7,243,241,245,225,242,101, + 128, 51,212, 99, 2,125,249,126, 1,233,242,227,236,101,128, 36, + 220,245,226,229,228,243,241,245,225,242,101,128, 51,165,228,239, + 116, 2,126, 22,126, 31,225,227,227,229,238,116,128, 30, 65,226, + 229,236,239,119,128, 30, 67,101, 7,126, 55,126,182,126,193,126, + 208,126,233,127, 14,127, 26,101, 2,126, 61,126,169,109, 4,126, + 71,126, 80,126, 94,126,110,225,242,225,226,233, 99,128, 6, 69, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,226,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,227,237,101, + 2,126,117,126,130,228,233,225,236,225,242,225,226,233, 99,128, + 254,228,229,237,105, 2,126,138,126,153,238,233,244,233,225,236, + 225,242,225,226,233, 99,128,252,209,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,252, 72,244,239,242,245,243,241,245, + 225,242,101,128, 51, 77,232,233,242,225,231,225,238, 97,128, 48, + 129,233,250,233,229,242,225,243,241,245,225,242,101,128, 51,126, + 235,225,244,225,235,225,238, 97,129, 48,225,126,221,232,225,236, + 230,247,233,228,244,104,128,255,146,109,130, 5,222,126,241,127, + 5,228,225,231,229,243,104,129,251, 62,126,252,232,229,226,242, + 229,119,128,251, 62,232,229,226,242,229,119,128, 5,222,238,225, + 242,237,229,238,233,225,110,128, 5,116,242,235,232, 97, 3,127, + 37,127, 46,127, 79,232,229,226,242,229,119,128, 5,165,235,229, + 230,245,236, 97, 2,127, 57,127, 66,232,229,226,242,229,119,128, + 5,166,236,229,230,244,232,229,226,242,229,119,128, 5,166,236, + 229,230,244,232,229,226,242,229,119,128, 5,165,104, 2,127, 98, + 127,104,239,239,107,128, 2,113,250,243,241,245,225,242,101,128, + 51,146,105, 6,127,128,127,165,128, 46,128, 57,128, 82,128,139, + 228,100, 2,127,135,127,160,236,229,228,239,244,235,225,244,225, + 235,225,238,225,232,225,236,230,247,233,228,244,104,128,255,101, + 239,116,128, 0,183,229,245,109, 5,127,179,127,214,127,229,127, + 238,128, 33, 97, 2,127,185,127,200,227,233,242,227,236,229,235, + 239,242,229,225,110,128, 50,114,240,225,242,229,238,235,239,242, + 229,225,110,128, 50, 18,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,100,235,239,242,229,225,110,128, 49, 65,112, 2, + 127,244,128, 20, 97, 2,127,250,128, 8,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,112,242,229,238,235,239,242,229,225, + 110,128, 50, 4,233,229,245,240,235,239,242,229,225,110,128, 49, + 110,243,233,239,243,235,239,242,229,225,110,128, 49,111,232,233, + 242,225,231,225,238, 97,128, 48,127,235,225,244,225,235,225,238, + 97,129, 48,223,128, 70,232,225,236,230,247,233,228,244,104,128, + 255,144,238,117, 2,128, 89,128,134,115,132, 34, 18,128,101,128, + 112,128,121,128,127,226,229,236,239,247,227,237, 98,128, 3, 32, + 227,233,242,227,236,101,128, 34,150,237,239,100,128, 2,215,240, + 236,245,115,128, 34, 19,244,101,128, 32, 50,242,105, 2,128,146, + 128,160,226,225,225,242,245,243,241,245,225,242,101,128, 51, 74, + 243,241,245,225,242,101,128, 51, 73,108, 2,128,175,128,190,239, + 238,231,236,229,231,244,245,242,238,229,100,128, 2,112,243,241, + 245,225,242,101,128, 51,150,109, 3,128,207,128,221,128,232,227, + 245,226,229,228,243,241,245,225,242,101,128, 51,163,239,238,239, + 243,240,225,227,101,128,255, 77,243,241,245,225,242,229,228,243, + 241,245,225,242,101,128, 51,159,111, 5,129, 4,129, 30,129, 55, + 129, 65,129, 74,104, 2,129, 10,129, 20,233,242,225,231,225,238, + 97,128, 48,130,237,243,241,245,225,242,101,128, 51,193,235,225, + 244,225,235,225,238, 97,129, 48,226,129, 43,232,225,236,230,247, + 233,228,244,104,128,255,147,236,243,241,245,225,242,101,128, 51, + 214,237,225,244,232,225,105,128, 14, 33,246,229,242,243,243,241, + 245,225,242,101,129, 51,167,129, 89,228,243,241,245,225,242,101, + 128, 51,168,240, 97, 2,129,106,129,112,242,229,110,128, 36,168, + 243,241,245,225,242,101,128, 51,171,115, 2,129,127,129,136,243, + 241,245,225,242,101,128, 51,179,245,240,229,242,233,239,114,128, + 246,239,244,245,242,238,229,100,128, 2,111,117,141, 0,181,129, + 185,129,189,129,199,129,223,129,233,129,255,130, 10,130, 35,130, + 58,130, 68,130, 98,130,162,130,172, 49,128, 0,181,225,243,241, + 245,225,242,101,128, 51,130,227,104, 2,129,206,129,216,231,242, + 229,225,244,229,114,128, 34,107,236,229,243,115,128, 34,106,230, + 243,241,245,225,242,101,128, 51,140,103, 2,129,239,129,246,242, + 229,229,107,128, 3,188,243,241,245,225,242,101,128, 51,141,232, + 233,242,225,231,225,238, 97,128, 48,128,235,225,244,225,235,225, + 238, 97,129, 48,224,130, 23,232,225,236,230,247,233,228,244,104, + 128,255,145,108, 2,130, 41,130, 50,243,241,245,225,242,101,128, + 51,149,244,233,240,236,121,128, 0,215,237,243,241,245,225,242, + 101,128, 51,155,238,225,104, 2,130, 76,130, 85,232,229,226,242, + 229,119,128, 5,163,236,229,230,244,232,229,226,242,229,119,128, + 5,163,115, 2,130,104,130,153,233, 99, 3,130,113,130,130,130, + 141,225,236,238,239,244,101,129, 38,106,130,124,228,226,108,128, + 38,107,230,236,225,244,243,233,231,110,128, 38,109,243,232,225, + 242,240,243,233,231,110,128, 38,111,243,241,245,225,242,101,128, + 51,178,246,243,241,245,225,242,101,128, 51,182,247,243,241,245, + 225,242,101,128, 51,188,118, 2,130,188,130,201,237,229,231,225, + 243,241,245,225,242,101,128, 51,185,243,241,245,225,242,101,128, + 51,183,119, 2,130,216,130,229,237,229,231,225,243,241,245,225, + 242,101,128, 51,191,243,241,245,225,242,101,128, 51,189,110,150, + 0,110,131, 30,131,164,131,188,131,254,132, 23,132, 81,132, 91, + 132,158,132,201,134,235,134,253,135, 22,135, 53,135, 79,135,144, + 137,126,137,134,137,159,137,167,138,135,138,145,138,155, 97, 8, + 131, 48,131, 68,131, 75,131, 82,131,107,131,118,131,143,131,155, + 98, 2,131, 54,131, 63,229,238,231,225,236,105,128, 9,168,236, + 97,128, 34, 7,227,245,244,101,128, 1, 68,228,229,246, 97,128, + 9, 40,231,117, 2,131, 89,131, 98,234,225,242,225,244,105,128, + 10,168,242,237,245,235,232,105,128, 10, 40,232,233,242,225,231, + 225,238, 97,128, 48,106,235,225,244,225,235,225,238, 97,129, 48, + 202,131,131,232,225,236,230,247,233,228,244,104,128,255,133,240, + 239,243,244,242,239,240,232,101,128, 1, 73,243,241,245,225,242, + 101,128, 51,129, 98, 2,131,170,131,180,239,240,239,237,239,230, + 111,128, 49, 11,243,240,225,227,101,128, 0,160, 99, 4,131,198, + 131,205,131,214,131,241,225,242,239,110,128, 1, 72,229,228,233, + 236,236, 97,128, 1, 70,233,242, 99, 2,131,222,131,227,236,101, + 128, 36,221,245,237,230,236,229,248,226,229,236,239,119,128, 30, + 75,239,237,237,225,225,227,227,229,238,116,128, 1, 70,228,239, + 116, 2,132, 6,132, 15,225,227,227,229,238,116,128, 30, 69,226, + 229,236,239,119,128, 30, 71,101, 3,132, 31,132, 42,132, 67,232, + 233,242,225,231,225,238, 97,128, 48,109,235,225,244,225,235,225, + 238, 97,129, 48,205,132, 55,232,225,236,230,247,233,228,244,104, + 128,255,136,247,243,232,229,241,229,236,243,233,231,110,128, 32, + 170,230,243,241,245,225,242,101,128, 51,139,103, 2,132, 97,132, + 147, 97, 3,132,105,132,115,132,122,226,229,238,231,225,236,105, + 128, 9,153,228,229,246, 97,128, 9, 25,231,117, 2,132,129,132, + 138,234,225,242,225,244,105,128, 10,153,242,237,245,235,232,105, + 128, 10, 25,239,238,231,245,244,232,225,105,128, 14, 7,104, 2, + 132,164,132,174,233,242,225,231,225,238, 97,128, 48,147,239,239, + 107, 2,132,182,132,189,236,229,230,116,128, 2,114,242,229,244, + 242,239,230,236,229,120,128, 2,115,105, 4,132,211,133,124,133, + 135,133,193,229,245,110, 7,132,229,133, 8,133, 40,133, 54,133, + 63,133, 96,133,109, 97, 2,132,235,132,250,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,111,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 15,227,105, 2,133, 15,133, 27,229, + 245,227,235,239,242,229,225,110,128, 49, 53,242,227,236,229,235, + 239,242,229,225,110,128, 50, 97,232,233,229,245,232,235,239,242, + 229,225,110,128, 49, 54,235,239,242,229,225,110,128, 49, 52,240, + 97, 2,133, 70,133, 84,238,243,233,239,243,235,239,242,229,225, + 110,128, 49,104,242,229,238,235,239,242,229,225,110,128, 50, 1, + 243,233,239,243,235,239,242,229,225,110,128, 49,103,244,233,235, + 229,245,244,235,239,242,229,225,110,128, 49,102,232,233,242,225, + 231,225,238, 97,128, 48,107,107, 2,133,141,133,165,225,244,225, + 235,225,238, 97,129, 48,203,133,153,232,225,236,230,247,233,228, + 244,104,128,255,134,232,225,232,233,116, 2,133,175,133,186,236, + 229,230,244,244,232,225,105,128,248,153,244,232,225,105,128, 14, + 77,238,101,141, 0, 57,133,224,133,233,133,243,134, 17,134, 24, + 134, 49,134, 76,134,110,134,122,134,133,134,166,134,174,134,185, + 225,242,225,226,233, 99,128, 6,105,226,229,238,231,225,236,105, + 128, 9,239,227,233,242,227,236,101,129, 36,104,133,254,233,238, + 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39, + 146,228,229,246, 97,128, 9,111,231,117, 2,134, 31,134, 40,234, + 225,242,225,244,105,128, 10,239,242,237,245,235,232,105,128, 10, + 111,232, 97, 2,134, 56,134, 67,227,235,225,242,225,226,233, 99, + 128, 6,105,238,231,250,232,239,117,128, 48, 41,105, 2,134, 82, + 134,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 40,238,230,229,242,233,239,114,128, 32,137,237,239, + 238,239,243,240,225,227,101,128,255, 25,239,236,228,243,244,249, + 236,101,128,247, 57,112, 2,134,139,134,146,225,242,229,110,128, + 36,124,229,114, 2,134,153,134,159,233,239,100,128, 36,144,243, + 233,225,110,128, 6,249,242,239,237,225,110,128, 33,120,243,245, + 240,229,242,233,239,114,128, 32,121,116, 2,134,191,134,229,229, + 229,110, 2,134,199,134,208,227,233,242,227,236,101,128, 36,114, + 112, 2,134,214,134,221,225,242,229,110,128, 36,134,229,242,233, + 239,100,128, 36,154,232,225,105,128, 14, 89,106,129, 1,204,134, + 241,229,227,249,242,233,236,236,233, 99,128, 4, 90,235,225,244, + 225,235,225,238, 97,129, 48,243,135, 10,232,225,236,230,247,233, + 228,244,104,128,255,157,108, 2,135, 28,135, 42,229,231,242,233, + 231,232,244,236,239,238,103,128, 1,158,233,238,229,226,229,236, + 239,119,128, 30, 73,109, 2,135, 59,135, 70,239,238,239,243,240, + 225,227,101,128,255, 78,243,241,245,225,242,101,128, 51,154,110, + 2,135, 85,135,135, 97, 3,135, 93,135,103,135,110,226,229,238, + 231,225,236,105,128, 9,163,228,229,246, 97,128, 9, 35,231,117, + 2,135,117,135,126,234,225,242,225,244,105,128, 10,163,242,237, + 245,235,232,105,128, 10, 35,238,225,228,229,246, 97,128, 9, 41, + 111, 6,135,158,135,169,135,194,135,235,136,187,137,114,232,233, + 242,225,231,225,238, 97,128, 48,110,235,225,244,225,235,225,238, + 97,129, 48,206,135,182,232,225,236,230,247,233,228,244,104,128, + 255,137,110, 3,135,202,135,218,135,227,226,242,229,225,235,233, + 238,231,243,240,225,227,101,128, 0,160,229,238,244,232,225,105, + 128, 14, 19,245,244,232,225,105,128, 14, 25,239,110, 7,135,252, + 136, 5,136, 19,136, 53,136, 69,136,110,136,169,225,242,225,226, + 233, 99,128, 6, 70,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,230,231,232,245,238,238, 97, 2,136, 30,136, 39,225,242, + 225,226,233, 99,128, 6,186,230,233,238,225,236,225,242,225,226, + 233, 99,128,251,159,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,254,231,234,229,229,237,105, 2,136, 79,136, 94,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,252,210,243,239, + 236,225,244,229,228,225,242,225,226,233, 99,128,252, 75,237,101, + 2,136,117,136,130,228,233,225,236,225,242,225,226,233, 99,128, + 254,232,229,237,105, 2,136,138,136,153,238,233,244,233,225,236, + 225,242,225,226,233, 99,128,252,213,243,239,236,225,244,229,228, + 225,242,225,226,233, 99,128,252, 78,238,239,239,238,230,233,238, + 225,236,225,242,225,226,233, 99,128,252,141,116, 7,136,203,136, + 214,136,243,137, 22,137, 34,137, 54,137, 80,227,239,238,244,225, + 233,238,115,128, 34, 12,101, 2,136,220,136,236,236,229,237,229, + 238,116,129, 34, 9,136,231,239,102,128, 34, 9,241,245,225,108, + 128, 34, 96,231,242,229,225,244,229,114,129, 34,111,136,255,238, + 239,114, 2,137, 7,137, 15,229,241,245,225,108,128, 34,113,236, + 229,243,115,128, 34,121,233,228,229,238,244,233,227,225,108,128, + 34, 98,236,229,243,115,129, 34,110,137, 43,238,239,242,229,241, + 245,225,108,128, 34,112,112, 2,137, 60,137, 70,225,242,225,236, + 236,229,108,128, 34, 38,242,229,227,229,228,229,115,128, 34,128, + 243,117, 3,137, 89,137, 96,137,105,226,243,229,116,128, 34,132, + 227,227,229,229,228,115,128, 34,129,240,229,242,243,229,116,128, + 34,133,247,225,242,237,229,238,233,225,110,128, 5,118,240,225, + 242,229,110,128, 36,169,115, 2,137,140,137,149,243,241,245,225, + 242,101,128, 51,177,245,240,229,242,233,239,114,128, 32,127,244, + 233,236,228,101,128, 0,241,117,132, 3,189,137,179,137,190,138, + 15,138, 98,232,233,242,225,231,225,238, 97,128, 48,108,107, 2, + 137,196,137,220,225,244,225,235,225,238, 97,129, 48,204,137,208, + 232,225,236,230,247,233,228,244,104,128,255,135,244, 97, 3,137, + 229,137,239,137,246,226,229,238,231,225,236,105,128, 9,188,228, + 229,246, 97,128, 9, 60,231,117, 2,137,253,138, 6,234,225,242, + 225,244,105,128, 10,188,242,237,245,235,232,105,128, 10, 60,109, + 2,138, 21,138, 55,226,229,242,243,233,231,110,130, 0, 35,138, + 35,138, 47,237,239,238,239,243,240,225,227,101,128,255, 3,243, + 237,225,236,108,128,254, 95,229,114, 2,138, 62,138, 94,225,236, + 243,233,231,110, 2,138, 73,138, 81,231,242,229,229,107,128, 3, + 116,236,239,247,229,242,231,242,229,229,107,128, 3,117,111,128, + 33, 22,110,130, 5,224,138,106,138,126,228,225,231,229,243,104, + 129,251, 64,138,117,232,229,226,242,229,119,128,251, 64,232,229, + 226,242,229,119,128, 5,224,246,243,241,245,225,242,101,128, 51, + 181,247,243,241,245,225,242,101,128, 51,187,249, 97, 3,138,164, + 138,174,138,181,226,229,238,231,225,236,105,128, 9,158,228,229, + 246, 97,128, 9, 30,231,117, 2,138,188,138,197,234,225,242,225, + 244,105,128, 10,158,242,237,245,235,232,105,128, 10, 30,111,147, + 0,111,138,248,139, 14,139, 92,140, 6,140, 78,140, 93,140,133, + 141, 0,141, 21,141, 59,141, 70,141,248,143, 82,143,146,143,179, + 143,225,144, 98,144,145,144,157, 97, 2,138,254,139, 5,227,245, + 244,101,128, 0,243,238,231,244,232,225,105,128, 14, 45, 98, 4, + 139, 24,139, 66,139, 75,139, 85,225,242,242,229,100,130, 2,117, + 139, 36,139, 47,227,249,242,233,236,236,233, 99,128, 4,233,228, + 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, + 4,235,229,238,231,225,236,105,128, 9,147,239,240,239,237,239, + 230,111,128, 49, 27,242,229,246,101,128, 1, 79, 99, 3,139,100, + 139,173,139,252, 97, 2,139,106,139,167,238,228,242, 97, 3,139, + 117,139,124,139,135,228,229,246, 97,128, 9, 17,231,245,234,225, + 242,225,244,105,128, 10,145,246,239,247,229,236,243,233,231,110, + 2,139,149,139,156,228,229,246, 97,128, 9, 73,231,245,234,225, + 242,225,244,105,128, 10,201,242,239,110,128, 1,210,233,242, 99, + 2,139,181,139,186,236,101,128, 36,222,245,237,230,236,229,120, + 133, 0,244,139,205,139,213,139,224,139,232,139,244,225,227,245, + 244,101,128, 30,209,228,239,244,226,229,236,239,119,128, 30,217, + 231,242,225,246,101,128, 30,211,232,239,239,235,225,226,239,246, + 101,128, 30,213,244,233,236,228,101,128, 30,215,249,242,233,236, + 236,233, 99,128, 4, 62,100, 4,140, 16,140, 39,140, 45,140, 68, + 226,108, 2,140, 23,140, 31,225,227,245,244,101,128, 1, 81,231, + 242,225,246,101,128, 2, 13,229,246, 97,128, 9, 19,233,229,242, + 229,243,233,115,129, 0,246,140, 57,227,249,242,233,236,236,233, + 99,128, 4,231,239,244,226,229,236,239,119,128, 30,205,101,129, + 1, 83,140, 84,235,239,242,229,225,110,128, 49, 90,103, 3,140, + 101,140,116,140,123,239,238,229,107,129, 2,219,140,110,227,237, + 98,128, 3, 40,242,225,246,101,128, 0,242,245,234,225,242,225, + 244,105,128, 10,147,104, 4,140,143,140,154,140,164,140,242,225, + 242,237,229,238,233,225,110,128, 5,133,233,242,225,231,225,238, + 97,128, 48, 74,111, 2,140,170,140,180,239,235,225,226,239,246, + 101,128, 30,207,242,110,133, 1,161,140,195,140,203,140,214,140, + 222,140,234,225,227,245,244,101,128, 30,219,228,239,244,226,229, + 236,239,119,128, 30,227,231,242,225,246,101,128, 30,221,232,239, + 239,235,225,226,239,246,101,128, 30,223,244,233,236,228,101,128, + 30,225,245,238,231,225,242,245,237,236,225,245,116,128, 1, 81, + 105,129, 1,163,141, 6,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 15,107, 2,141, 27,141, 51,225,244,225,235,225, + 238, 97,129, 48,170,141, 39,232,225,236,230,247,233,228,244,104, + 128,255,117,239,242,229,225,110,128, 49, 87,236,229,232,229,226, + 242,229,119,128, 5,171,109, 6,141, 84,141,112,141,119,141,208, + 141,219,141,237,225,227,242,239,110,130, 1, 77,141, 96,141,104, + 225,227,245,244,101,128, 30, 83,231,242,225,246,101,128, 30, 81, + 228,229,246, 97,128, 9, 80,229,231, 97,133, 3,201,141,135,141, + 139,141,150,141,164,141,180, 49,128, 3,214,227,249,242,233,236, + 236,233, 99,128, 4, 97,236,225,244,233,238,227,236,239,243,229, + 100,128, 2,119,242,239,245,238,228,227,249,242,233,236,236,233, + 99,128, 4,123,116, 2,141,186,141,201,233,244,236,239,227,249, + 242,233,236,236,233, 99,128, 4,125,239,238,239,115,128, 3,206, + 231,245,234,225,242,225,244,105,128, 10,208,233,227,242,239,110, + 129, 3,191,141,229,244,239,238,239,115,128, 3,204,239,238,239, + 243,240,225,227,101,128,255, 79,238,101,145, 0, 49,142, 31,142, + 40,142, 50,142, 80,142,105,142,114,142,123,142,148,142,182,142, + 216,142,228,142,247,143, 2,143, 35,143, 45,143, 53,143, 64,225, + 242,225,226,233, 99,128, 6, 97,226,229,238,231,225,236,105,128, + 9,231,227,233,242,227,236,101,129, 36, 96,142, 61,233,238,246, + 229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,138, + 100, 2,142, 86,142, 92,229,246, 97,128, 9,103,239,244,229,238, + 236,229,225,228,229,114,128, 32, 36,229,233,231,232,244,104,128, + 33, 91,230,233,244,244,229,100,128,246,220,231,117, 2,142,130, + 142,139,234,225,242,225,244,105,128, 10,231,242,237,245,235,232, + 105,128, 10,103,232, 97, 3,142,157,142,168,142,173,227,235,225, + 242,225,226,233, 99,128, 6, 97,236,102,128, 0,189,238,231,250, + 232,239,117,128, 48, 33,105, 2,142,188,142,206,228,229,239,231, + 242,225,240,232,233,227,240,225,242,229,110,128, 50, 32,238,230, + 229,242,233,239,114,128, 32,129,237,239,238,239,243,240,225,227, + 101,128,255, 17,238,245,237,229,242,225,244,239,242,226,229,238, + 231,225,236,105,128, 9,244,239,236,228,243,244,249,236,101,128, + 247, 49,112, 2,143, 8,143, 15,225,242,229,110,128, 36,116,229, + 114, 2,143, 22,143, 28,233,239,100,128, 36,136,243,233,225,110, + 128, 6,241,241,245,225,242,244,229,114,128, 0,188,242,239,237, + 225,110,128, 33,112,243,245,240,229,242,233,239,114,128, 0,185, + 244,104, 2,143, 71,143, 76,225,105,128, 14, 81,233,242,100,128, + 33, 83,111, 3,143, 90,143,124,143,140,103, 2,143, 96,143,114, + 239,238,229,107,129, 1,235,143,105,237,225,227,242,239,110,128, + 1,237,245,242,237,245,235,232,105,128, 10, 19,237,225,244,242, + 225,231,245,242,237,245,235,232,105,128, 10, 75,240,229,110,128, + 2, 84,112, 3,143,154,143,161,143,172,225,242,229,110,128, 36, + 170,229,238,226,245,236,236,229,116,128, 37,230,244,233,239,110, + 128, 35, 37,114, 2,143,185,143,214,100, 2,143,191,143,202,230, + 229,237,233,238,233,238,101,128, 0,170,237,225,243,227,245,236, + 233,238,101,128, 0,186,244,232,239,231,239,238,225,108,128, 34, + 31,115, 5,143,237,144, 13,144, 30,144, 75,144, 88,232,239,242, + 116, 2,143,246,143,253,228,229,246, 97,128, 9, 18,246,239,247, + 229,236,243,233,231,238,228,229,246, 97,128, 9, 74,236,225,243, + 104,129, 0,248,144, 22,225,227,245,244,101,128, 1,255,237,225, + 236,108, 2,144, 39,144, 50,232,233,242,225,231,225,238, 97,128, + 48, 73,235,225,244,225,235,225,238, 97,129, 48,169,144, 63,232, + 225,236,230,247,233,228,244,104,128,255,107,244,242,239,235,229, + 225,227,245,244,101,128, 1,255,245,240,229,242,233,239,114,128, + 246,240,116, 2,144,104,144,115,227,249,242,233,236,236,233, 99, + 128, 4,127,233,236,228,101,130, 0,245,144,126,144,134,225,227, + 245,244,101,128, 30, 77,228,233,229,242,229,243,233,115,128, 30, + 79,245,226,239,240,239,237,239,230,111,128, 49, 33,118, 2,144, + 163,144,244,229,114, 2,144,170,144,236,236,233,238,101,131, 32, + 62,144,183,144,206,144,229, 99, 2,144,189,144,201,229,238,244, + 229,242,236,233,238,101,128,254, 74,237, 98,128, 3, 5,100, 2, + 144,212,144,220,225,243,232,229,100,128,254, 73,226,236,247,225, + 246,121,128,254, 76,247,225,246,121,128,254, 75,243,227,239,242, + 101,128, 0,175,239,247,229,236,243,233,231,110, 3,145, 3,145, + 13,145, 20,226,229,238,231,225,236,105,128, 9,203,228,229,246, + 97,128, 9, 75,231,245,234,225,242,225,244,105,128, 10,203,112, + 145, 0,112,145, 69,147,197,147,208,147,217,147,229,149,154,149, + 164,150,156,151,175,152, 9,152, 35,152,166,152,174,153, 76,153, + 134,153,162,153,172, 97, 14,145, 99,145,131,145,141,145,148,145, + 155,145,203,145,214,145,228,145,239,146, 30,146, 44,147, 56,147, + 95,147,185, 97, 2,145,105,145,117,237,240,243,243,241,245,225, + 242,101,128, 51,128,243,229,238,244,239,243,241,245,225,242,101, + 128, 51, 43,226,229,238,231,225,236,105,128, 9,170,227,245,244, + 101,128, 30, 85,228,229,246, 97,128, 9, 42,103, 2,145,161,145, + 179,101, 2,145,167,145,174,228,239,247,110,128, 33,223,245,112, + 128, 33,222,117, 2,145,185,145,194,234,225,242,225,244,105,128, + 10,170,242,237,245,235,232,105,128, 10, 42,232,233,242,225,231, + 225,238, 97,128, 48,113,233,249,225,238,238,239,233,244,232,225, + 105,128, 14, 47,235,225,244,225,235,225,238, 97,128, 48,209,108, + 2,145,245,146, 14,225,244,225,236,233,250,225,244,233,239,238, + 227,249,242,233,236,236,233,227,227,237, 98,128, 4,132,239,227, + 232,235,225,227,249,242,233,236,236,233, 99,128, 4,192,238,243, + 233,239,243,235,239,242,229,225,110,128, 49,127,114, 3,146, 52, + 146, 73,147, 45, 97, 2,146, 58,146, 66,231,242,225,240,104,128, + 0,182,236,236,229,108,128, 34, 37,229,110, 2,146, 80,146,190, + 236,229,230,116,136, 0, 40,146,103,146,118,146,123,146,128,146, + 139,146,151,146,174,146,179,225,236,244,239,238,229,225,242,225, + 226,233, 99,128,253, 62,226,116,128,248,237,229,120,128,248,236, + 233,238,230,229,242,233,239,114,128, 32,141,237,239,238,239,243, + 240,225,227,101,128,255, 8,115, 2,146,157,146,164,237,225,236, + 108,128,254, 89,245,240,229,242,233,239,114,128, 32,125,244,112, + 128,248,235,246,229,242,244,233,227,225,108,128,254, 53,242,233, + 231,232,116,136, 0, 41,146,214,146,229,146,234,146,239,146,250, + 147, 6,147, 29,147, 34,225,236,244,239,238,229,225,242,225,226, + 233, 99,128,253, 63,226,116,128,248,248,229,120,128,248,247,233, + 238,230,229,242,233,239,114,128, 32,142,237,239,238,239,243,240, + 225,227,101,128,255, 9,115, 2,147, 12,147, 19,237,225,236,108, + 128,254, 90,245,240,229,242,233,239,114,128, 32,126,244,112,128, + 248,246,246,229,242,244,233,227,225,108,128,254, 54,244,233,225, + 236,228,233,230,102,128, 34, 2,115, 3,147, 64,147, 75,147, 87, + 229,241,232,229,226,242,229,119,128, 5,192,232,244,225,232,229, + 226,242,229,119,128, 5,153,241,245,225,242,101,128, 51,169,244, + 225,104,134, 5,183,147,113,147,127,147,132,147,141,147,156,147, + 172, 49, 2,147,119,147,123, 49,128, 5,183,100,128, 5,183,178, + 97,128, 5,183,232,229,226,242,229,119,128, 5,183,238,225,242, + 242,239,247,232,229,226,242,229,119,128, 5,183,241,245,225,242, + 244,229,242,232,229,226,242,229,119,128, 5,183,247,233,228,229, + 232,229,226,242,229,119,128, 5,183,250,229,242,232,229,226,242, + 229,119,128, 5,161,226,239,240,239,237,239,230,111,128, 49, 6, + 227,233,242,227,236,101,128, 36,223,228,239,244,225,227,227,229, + 238,116,128, 30, 87,101,137, 5,228,147,251,148, 6,148, 26,148, + 38,148, 58,148,160,148,171,148,192,149,147,227,249,242,233,236, + 236,233, 99,128, 4, 63,228,225,231,229,243,104,129,251, 68,148, + 17,232,229,226,242,229,119,128,251, 68,229,250,233,243,241,245, + 225,242,101,128, 51, 59,230,233,238,225,236,228,225,231,229,243, + 232,232,229,226,242,229,119,128,251, 67,104, 5,148, 70,148, 93, + 148,101,148,115,148,145,225,114, 2,148, 77,148, 84,225,226,233, + 99,128, 6,126,237,229,238,233,225,110,128, 5,122,229,226,242, + 229,119,128, 5,228,230,233,238,225,236,225,242,225,226,233, 99, + 128,251, 87,105, 2,148,121,148,136,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,251, 88,242,225,231,225,238, 97,128, 48, + 122,237,229,228,233,225,236,225,242,225,226,233, 99,128,251, 89, + 235,225,244,225,235,225,238, 97,128, 48,218,237,233,228,228,236, + 229,232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,167, + 114, 5,148,204,148,216,149, 2,149,123,149,136,225,230,229,232, + 229,226,242,229,119,128,251, 78,227,229,238,116,131, 0, 37,148, + 229,148,238,148,250,225,242,225,226,233, 99,128, 6,106,237,239, + 238,239,243,240,225,227,101,128,255, 5,243,237,225,236,108,128, + 254,106,105, 2,149, 8,149,105,239,100,134, 0, 46,149, 25,149, + 36,149, 47,149, 59,149, 70,149, 82,225,242,237,229,238,233,225, + 110,128, 5,137,227,229,238,244,229,242,229,100,128, 0,183,232, + 225,236,230,247,233,228,244,104,128,255, 97,233,238,230,229,242, + 233,239,114,128,246,231,237,239,238,239,243,240,225,227,101,128, + 255, 14,115, 2,149, 88,149, 95,237,225,236,108,128,254, 82,245, + 240,229,242,233,239,114,128,246,232,243,240,239,237,229,238,233, + 231,242,229,229,235,227,237, 98,128, 3, 66,240,229,238,228,233, + 227,245,236,225,114,128, 34,165,244,232,239,245,243,225,238,100, + 128, 32, 48,243,229,244, 97,128, 32,167,230,243,241,245,225,242, + 101,128, 51,138,104, 3,149,172,149,222,150,103, 97, 3,149,180, + 149,190,149,197,226,229,238,231,225,236,105,128, 9,171,228,229, + 246, 97,128, 9, 43,231,117, 2,149,204,149,213,234,225,242,225, + 244,105,128, 10,171,242,237,245,235,232,105,128, 10, 43,105,133, + 3,198,149,236,149,240,150, 70,150, 78,150, 89, 49,128, 3,213, + 229,245,240,104, 4,149,253,150, 32,150, 47,150, 56, 97, 2,150, + 3,150, 18,227,233,242,227,236,229,235,239,242,229,225,110,128, + 50,122,240,225,242,229,238,235,239,242,229,225,110,128, 50, 26, + 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,108,235, + 239,242,229,225,110,128, 49, 77,240,225,242,229,238,235,239,242, + 229,225,110,128, 50, 12,236,225,244,233,110,128, 2,120,238,244, + 232,245,244,232,225,105,128, 14, 58,243,249,237,226,239,236,231, + 242,229,229,107,128, 3,213,111, 3,150,111,150,116,150,142,239, + 107,128, 1,165,240,104, 2,150,123,150,132,225,238,244,232,225, + 105,128, 14, 30,245,238,231,244,232,225,105,128, 14, 28,243,225, + 237,240,232,225,239,244,232,225,105,128, 14, 32,105,133, 3,192, + 150,170,151,126,151,137,151,148,151,162,229,245,112, 6,150,186, + 150,221,150,253,151, 25,151, 39,151, 91, 97, 2,150,192,150,207, + 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,115,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 19,227,105, 2, + 150,228,150,240,229,245,227,235,239,242,229,225,110,128, 49,118, + 242,227,236,229,235,239,242,229,225,110,128, 50,101,107, 2,151, + 3,151, 17,233,249,229,239,235,235,239,242,229,225,110,128, 49, + 114,239,242,229,225,110,128, 49, 66,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 5,243,233,239,115, 2,151, 48,151, 76, + 107, 2,151, 54,151, 68,233,249,229,239,235,235,239,242,229,225, + 110,128, 49,116,239,242,229,225,110,128, 49, 68,244,233,235,229, + 245,244,235,239,242,229,225,110,128, 49,117,116, 2,151, 97,151, + 112,232,233,229,245,244,232,235,239,242,229,225,110,128, 49,119, + 233,235,229,245,244,235,239,242,229,225,110,128, 49,115,232,233, + 242,225,231,225,238, 97,128, 48,116,235,225,244,225,235,225,238, + 97,128, 48,212,243,249,237,226,239,236,231,242,229,229,107,128, + 3,214,247,242,225,242,237,229,238,233,225,110,128, 5,131,236, + 245,115,132, 0, 43,151,189,151,200,151,209,151,242,226,229,236, + 239,247,227,237, 98,128, 3, 31,227,233,242,227,236,101,128, 34, + 149,109, 2,151,215,151,222,233,238,245,115,128, 0,177,111, 2, + 151,228,151,232,100,128, 2,214,238,239,243,240,225,227,101,128, + 255, 11,115, 2,151,248,151,255,237,225,236,108,128,254, 98,245, + 240,229,242,233,239,114,128, 32,122,109, 2,152, 15,152, 26,239, + 238,239,243,240,225,227,101,128,255, 80,243,241,245,225,242,101, + 128, 51,216,111, 5,152, 47,152, 58,152,125,152,136,152,146,232, + 233,242,225,231,225,238, 97,128, 48,125,233,238,244,233,238,231, + 233,238,228,229,120, 4,152, 78,152, 90,152,102,152,115,228,239, + 247,238,247,232,233,244,101,128, 38, 31,236,229,230,244,247,232, + 233,244,101,128, 38, 28,242,233,231,232,244,247,232,233,244,101, + 128, 38, 30,245,240,247,232,233,244,101,128, 38, 29,235,225,244, + 225,235,225,238, 97,128, 48,221,240,236,225,244,232,225,105,128, + 14, 27,243,244,225,236,237,225,242,107,129, 48, 18,152,159,230, + 225,227,101,128, 48, 32,240,225,242,229,110,128, 36,171,114, 3, + 152,182,152,208,152,233,101, 2,152,188,152,196,227,229,228,229, + 115,128, 34,122,243,227,242,233,240,244,233,239,110,128, 33, 30, + 233,237,101, 2,152,216,152,222,237,239,100,128, 2,185,242,229, + 246,229,242,243,229,100,128, 32, 53,111, 4,152,243,152,250,153, + 4,153, 17,228,245,227,116,128, 34, 15,234,229,227,244,233,246, + 101,128, 35, 5,236,239,238,231,229,228,235,225,238, 97,128, 48, + 252,112, 2,153, 23,153, 60,101, 2,153, 29,153, 36,236,236,239, + 114,128, 35, 24,242,243,117, 2,153, 44,153, 51,226,243,229,116, + 128, 34,130,240,229,242,243,229,116,128, 34,131,239,242,244,233, + 239,110,129, 34, 55,153, 71,225,108,128, 34, 29,115, 2,153, 82, + 153,125,105,130, 3,200,153, 90,153,101,227,249,242,233,236,236, + 233, 99,128, 4,113,236,233,240,238,229,245,237,225,244,225,227, + 249,242,233,236,236,233,227,227,237, 98,128, 4,134,243,241,245, + 225,242,101,128, 51,176,117, 2,153,140,153,151,232,233,242,225, + 231,225,238, 97,128, 48,119,235,225,244,225,235,225,238, 97,128, + 48,215,246,243,241,245,225,242,101,128, 51,180,247,243,241,245, + 225,242,101,128, 51,186,113,136, 0,113,153,202,154,251,155, 6, + 155, 15,155, 22,155, 34,155, 72,155, 80, 97, 4,153,212,153,235, + 154, 43,154,234,100, 2,153,218,153,224,229,246, 97,128, 9, 88, + 237,225,232,229,226,242,229,119,128, 5,168,102, 4,153,245,153, + 254,154, 12,154, 28,225,242,225,226,233, 99,128, 6, 66,230,233, + 238,225,236,225,242,225,226,233, 99,128,254,214,233,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,254,215,237,229,228,233, + 225,236,225,242,225,226,233, 99,128,254,216,237,225,244,115,136, + 5,184,154, 66,154, 86,154,100,154,105,154,110,154,119,154,134, + 154,221, 49, 3,154, 74,154, 78,154, 82, 48,128, 5,184, 97,128, + 5,184, 99,128, 5,184, 50, 2,154, 92,154, 96, 55,128, 5,184, + 57,128, 5,184,179, 51,128, 5,184,228,101,128, 5,184,232,229, + 226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229,226, + 242,229,119,128, 5,184,113, 2,154,140,154,206,225,244,225,110, + 4,154,153,154,162,154,177,154,193,232,229,226,242,229,119,128, + 5,184,238,225,242,242,239,247,232,229,226,242,229,119,128, 5, + 184,241,245,225,242,244,229,242,232,229,226,242,229,119,128, 5, + 184,247,233,228,229,232,229,226,242,229,119,128, 5,184,245,225, + 242,244,229,242,232,229,226,242,229,119,128, 5,184,247,233,228, + 229,232,229,226,242,229,119,128, 5,184,242,238,229,249,240,225, + 242,225,232,229,226,242,229,119,128, 5,159,226,239,240,239,237, + 239,230,111,128, 49, 17,227,233,242,227,236,101,128, 36,224,232, + 239,239,107,128, 2,160,237,239,238,239,243,240,225,227,101,128, + 255, 81,239,102,130, 5,231,155, 43,155, 63,228,225,231,229,243, + 104,129,251, 71,155, 54,232,229,226,242,229,119,128,251, 71,232, + 229,226,242,229,119,128, 5,231,240,225,242,229,110,128, 36,172, + 117, 4,155, 90,155,102,155,191,156, 22,225,242,244,229,242,238, + 239,244,101,128, 38,105,226,245,244,115,135, 5,187,155,123,155, + 128,155,133,155,138,155,147,155,162,155,178,177, 56,128, 5,187, + 178, 53,128, 5,187,179, 49,128, 5,187,232,229,226,242,229,119, + 128, 5,187,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,187,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,187,247,233,228,229,232,229,226,242,229,119,128, 5,187,229, + 243,244,233,239,110,133, 0, 63,155,210,155,233,155,250,156, 2, + 156, 14,225,114, 2,155,217,155,224,225,226,233, 99,128, 6, 31, + 237,229,238,233,225,110,128, 5, 94,228,239,247,110,129, 0,191, + 155,242,243,237,225,236,108,128,247,191,231,242,229,229,107,128, + 3,126,237,239,238,239,243,240,225,227,101,128,255, 31,243,237, + 225,236,108,128,247, 63,239,244,101, 4,156, 34,156,105,156,125, + 156,154,228,226,108,133, 0, 34,156, 50,156, 57,156, 64,156, 76, + 156, 97,226,225,243,101,128, 32, 30,236,229,230,116,128, 32, 28, + 237,239,238,239,243,240,225,227,101,128,255, 2,240,242,233,237, + 101,129, 48, 30,156, 86,242,229,246,229,242,243,229,100,128, 48, + 29,242,233,231,232,116,128, 32, 29,236,229,230,116,129, 32, 24, + 156,114,242,229,246,229,242,243,229,100,128, 32, 27,114, 2,156, + 131,156,141,229,246,229,242,243,229,100,128, 32, 27,233,231,232, + 116,129, 32, 25,156,150,110,128, 1, 73,243,233,238,231,108, 2, + 156,164,156,171,226,225,243,101,128, 32, 26,101,129, 0, 39,156, + 177,237,239,238,239,243,240,225,227,101,128,255, 7,114,145, 0, + 114,156,227,157,231,157,242,158, 33,158, 84,159,101,159,125,159, + 220,161,254,162, 35,162, 47,162,101,162,109,163, 15,163, 26,163, + 61,163,161, 97, 11,156,251,157, 6,157, 16,157, 23,157, 88,157, + 104,157,129,157,140,157,165,157,188,157,225,225,242,237,229,238, + 233,225,110,128, 5,124,226,229,238,231,225,236,105,128, 9,176, + 227,245,244,101,128, 1, 85,100, 4,157, 33,157, 39,157, 53,157, + 79,229,246, 97,128, 9, 48,233,227,225,108,129, 34, 26,157, 48, + 229,120,128,248,229,239,246,229,242,243,243,241,245,225,242,101, + 129, 51,174,157, 69,228,243,241,245,225,242,101,128, 51,175,243, + 241,245,225,242,101,128, 51,173,230,101,129, 5,191,157, 95,232, + 229,226,242,229,119,128, 5,191,231,117, 2,157,111,157,120,234, + 225,242,225,244,105,128, 10,176,242,237,245,235,232,105,128, 10, + 48,232,233,242,225,231,225,238, 97,128, 48,137,235,225,244,225, + 235,225,238, 97,129, 48,233,157,153,232,225,236,230,247,233,228, + 244,104,128,255,151,236,239,247,229,242,228,233,225,231,239,238, + 225,236,226,229,238,231,225,236,105,128, 9,241,109, 2,157,194, + 157,217,233,228,228,236,229,228,233,225,231,239,238,225,236,226, + 229,238,231,225,236,105,128, 9,240,243,232,239,242,110,128, 2, + 100,244,233,111,128, 34, 54,226,239,240,239,237,239,230,111,128, + 49, 22, 99, 4,157,252,158, 3,158, 12,158, 20,225,242,239,110, + 128, 1, 89,229,228,233,236,236, 97,128, 1, 87,233,242,227,236, + 101,128, 36,225,239,237,237,225,225,227,227,229,238,116,128, 1, + 87,100, 2,158, 39,158, 49,226,236,231,242,225,246,101,128, 2, + 17,239,116, 2,158, 56,158, 65,225,227,227,229,238,116,128, 30, + 89,226,229,236,239,119,129, 30, 91,158, 75,237,225,227,242,239, + 110,128, 30, 93,101, 6,158, 98,158,143,158,178,158,233,159, 2, + 159, 35,102, 2,158,104,158,117,229,242,229,238,227,229,237,225, + 242,107,128, 32, 59,236,229,248,243,117, 2,158,127,158,134,226, + 243,229,116,128, 34,134,240,229,242,243,229,116,128, 34,135,231, + 233,243,244,229,114, 2,158,154,158,159,229,100,128, 0,174,115, + 2,158,165,158,171,225,238,115,128,248,232,229,242,233,102,128, + 246,218,104, 3,158,186,158,209,158,223,225,114, 2,158,193,158, + 200,225,226,233, 99,128, 6, 49,237,229,238,233,225,110,128, 5, + 128,230,233,238,225,236,225,242,225,226,233, 99,128,254,174,233, + 242,225,231,225,238, 97,128, 48,140,235,225,244,225,235,225,238, + 97,129, 48,236,158,246,232,225,236,230,247,233,228,244,104,128, + 255,154,243,104,130, 5,232,159, 11,159, 26,228,225,231,229,243, + 232,232,229,226,242,229,119,128,251, 72,232,229,226,242,229,119, + 128, 5,232,118, 3,159, 43,159, 56,159, 88,229,242,243,229,228, + 244,233,236,228,101,128, 34, 61,233, 97, 2,159, 63,159, 72,232, + 229,226,242,229,119,128, 5,151,237,245,231,242,225,243,232,232, + 229,226,242,229,119,128, 5,151,236,239,231,233,227,225,236,238, + 239,116,128, 35, 16,230,233,243,232,232,239,239,107,129, 2,126, + 159,114,242,229,246,229,242,243,229,100,128, 2,127,104, 2,159, + 131,159,154, 97, 2,159,137,159,147,226,229,238,231,225,236,105, + 128, 9,221,228,229,246, 97,128, 9, 93,111,131, 3,193,159,164, + 159,193,159,207,239,107,129, 2,125,159,171,244,245,242,238,229, + 100,129, 2,123,159,182,243,245,240,229,242,233,239,114,128, 2, + 181,243,249,237,226,239,236,231,242,229,229,107,128, 3,241,244, + 233,227,232,239,239,235,237,239,100,128, 2,222,105, 6,159,234, + 161, 22,161, 68,161, 79,161,104,161,240,229,245,108, 9,160, 0, + 160, 35,160, 50,160, 64,160,110,160,124,160,210,160,223,161, 2, + 97, 2,160, 6,160, 21,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,113,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 17,227,233,242,227,236,229,235,239,242,229,225,110,128, + 50, 99,232,233,229,245,232,235,239,242,229,225,110,128, 49, 64, + 107, 2,160, 70,160,102,233,249,229,239,107, 2,160, 80,160, 89, + 235,239,242,229,225,110,128, 49, 58,243,233,239,243,235,239,242, + 229,225,110,128, 49,105,239,242,229,225,110,128, 49, 57,237,233, + 229,245,237,235,239,242,229,225,110,128, 49, 59,112, 3,160,132, + 160,164,160,179, 97, 2,160,138,160,152,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,108,242,229,238,235,239,242,229,225, + 110,128, 50, 3,232,233,229,245,240,232,235,239,242,229,225,110, + 128, 49, 63,233,229,245,112, 2,160,188,160,197,235,239,242,229, + 225,110,128, 49, 60,243,233,239,243,235,239,242,229,225,110,128, + 49,107,243,233,239,243,235,239,242,229,225,110,128, 49, 61,116, + 2,160,229,160,244,232,233,229,245,244,232,235,239,242,229,225, + 110,128, 49, 62,233,235,229,245,244,235,239,242,229,225,110,128, + 49,106,249,229,239,242,233,238,232,233,229,245,232,235,239,242, + 229,225,110,128, 49,109,231,232,116, 2,161, 30,161, 38,225,238, + 231,236,101,128, 34, 31,116, 2,161, 44,161, 58,225,227,235,226, + 229,236,239,247,227,237, 98,128, 3, 25,242,233,225,238,231,236, + 101,128, 34,191,232,233,242,225,231,225,238, 97,128, 48,138,235, + 225,244,225,235,225,238, 97,129, 48,234,161, 92,232,225,236,230, + 247,233,228,244,104,128,255,152,110, 2,161,110,161,226,103,131, + 2,218,161,120,161,131,161,137,226,229,236,239,247,227,237, 98, + 128, 3, 37,227,237, 98,128, 3, 10,232,225,236,102, 2,161,146, + 161,192,236,229,230,116,131, 2,191,161,159,161,170,161,181,225, + 242,237,229,238,233,225,110,128, 5, 89,226,229,236,239,247,227, + 237, 98,128, 3, 28,227,229,238,244,229,242,229,100,128, 2,211, + 242,233,231,232,116,130, 2,190,161,204,161,215,226,229,236,239, + 247,227,237, 98,128, 3, 57,227,229,238,244,229,242,229,100,128, + 2,210,246,229,242,244,229,228,226,242,229,246,101,128, 2, 19, + 244,244,239,242,245,243,241,245,225,242,101,128, 51, 81,108, 2, + 162, 4,162, 15,233,238,229,226,229,236,239,119,128, 30, 95,239, + 238,231,236,229,103,129, 2,124,162, 26,244,245,242,238,229,100, + 128, 2,122,237,239,238,239,243,240,225,227,101,128,255, 82,111, + 3,162, 55,162, 66,162, 91,232,233,242,225,231,225,238, 97,128, + 48,141,235,225,244,225,235,225,238, 97,129, 48,237,162, 79,232, + 225,236,230,247,233,228,244,104,128,255,155,242,245,225,244,232, + 225,105,128, 14, 35,240,225,242,229,110,128, 36,173,114, 3,162, + 117,162,153,162,183, 97, 3,162,125,162,135,162,142,226,229,238, + 231,225,236,105,128, 9,220,228,229,246, 97,128, 9, 49,231,245, + 242,237,245,235,232,105,128, 10, 92,229,104, 2,162,160,162,169, + 225,242,225,226,233, 99,128, 6,145,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,141,246,239,227,225,236,233, 99, 4,162, + 199,162,209,162,216,162,227,226,229,238,231,225,236,105,128, 9, + 224,228,229,246, 97,128, 9, 96,231,245,234,225,242,225,244,105, + 128, 10,224,246,239,247,229,236,243,233,231,110, 3,162,243,162, + 253,163, 4,226,229,238,231,225,236,105,128, 9,196,228,229,246, + 97,128, 9, 68,231,245,234,225,242,225,244,105,128, 10,196,243, + 245,240,229,242,233,239,114,128,246,241,116, 2,163, 32,163, 40, + 226,236,239,227,107,128, 37,144,245,242,238,229,100,129, 2,121, + 163, 50,243,245,240,229,242,233,239,114,128, 2,180,117, 4,163, + 71,163, 82,163,107,163,154,232,233,242,225,231,225,238, 97,128, + 48,139,235,225,244,225,235,225,238, 97,129, 48,235,163, 95,232, + 225,236,230,247,233,228,244,104,128,255,153,112, 2,163,113,163, + 148,229,101, 2,163,120,163,134,237,225,242,235,226,229,238,231, + 225,236,105,128, 9,242,243,233,231,238,226,229,238,231,225,236, + 105,128, 9,243,233,225,104,128,246,221,244,232,225,105,128, 14, + 36,246,239,227,225,236,233, 99, 4,163,177,163,187,163,194,163, + 205,226,229,238,231,225,236,105,128, 9,139,228,229,246, 97,128, + 9, 11,231,245,234,225,242,225,244,105,128, 10,139,246,239,247, + 229,236,243,233,231,110, 3,163,221,163,231,163,238,226,229,238, + 231,225,236,105,128, 9,195,228,229,246, 97,128, 9, 67,231,245, + 234,225,242,225,244,105,128, 10,195,115,147, 0,115,164, 35,166, + 5,166, 16,166,142,166,181,169,123,169,134,172, 21,174,159,174, + 205,174,232,175,167,175,234,177, 11,177, 21,177,207,178, 24,178, + 194,178,204, 97, 9,164, 55,164, 65,164, 86,164,158,164,183,164, + 194,164,219,164,251,165, 35,226,229,238,231,225,236,105,128, 9, + 184,227,245,244,101,129, 1, 91,164, 74,228,239,244,225,227,227, + 229,238,116,128, 30,101,100, 5,164, 98,164,107,164,113,164,127, + 164,143,225,242,225,226,233, 99,128, 6, 53,229,246, 97,128, 9, + 56,230,233,238,225,236,225,242,225,226,233, 99,128,254,186,233, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,254,187,237, + 229,228,233,225,236,225,242,225,226,233, 99,128,254,188,231,117, + 2,164,165,164,174,234,225,242,225,244,105,128, 10,184,242,237, + 245,235,232,105,128, 10, 56,232,233,242,225,231,225,238, 97,128, + 48, 85,235,225,244,225,235,225,238, 97,129, 48,181,164,207,232, + 225,236,230,247,233,228,244,104,128,255,123,236,236,225,236,236, + 225,232,239,245,225,236,225,249,232,229,247,225,243,225,236,236, + 225,237,225,242,225,226,233, 99,128,253,250,237,229,235,104,130, + 5,225,165, 6,165, 26,228,225,231,229,243,104,129,251, 65,165, + 17,232,229,226,242,229,119,128,251, 65,232,229,226,242,229,119, + 128, 5,225,242, 97, 5,165, 48,165,122,165,130,165,180,165,188, + 97, 5,165, 60,165, 68,165, 76,165,107,165,115,225,244,232,225, + 105,128, 14, 50,229,244,232,225,105,128, 14, 65,233,237,225,233, + 109, 2,165, 86,165, 97,225,236,225,233,244,232,225,105,128, 14, + 68,245,225,238,244,232,225,105,128, 14, 67,237,244,232,225,105, + 128, 14, 51,244,232,225,105,128, 14, 48,229,244,232,225,105,128, + 14, 64,105, 3,165,138,165,162,165,173,105, 2,165,144,165,155, + 236,229,230,244,244,232,225,105,128,248,134,244,232,225,105,128, + 14, 53,236,229,230,244,244,232,225,105,128,248,133,244,232,225, + 105,128, 14, 52,239,244,232,225,105,128, 14, 66,117, 3,165,196, + 165,246,165,253,101, 3,165,204,165,228,165,239,101, 2,165,210, + 165,221,236,229,230,244,244,232,225,105,128,248,136,244,232,225, + 105,128, 14, 55,236,229,230,244,244,232,225,105,128,248,135,244, + 232,225,105,128, 14, 54,244,232,225,105,128, 14, 56,245,244,232, + 225,105,128, 14, 57,226,239,240,239,237,239,230,111,128, 49, 25, + 99, 5,166, 28,166, 49,166, 58,166,107,166,129,225,242,239,110, + 129, 1, 97,166, 37,228,239,244,225,227,227,229,238,116,128, 30, + 103,229,228,233,236,236, 97,128, 1, 95,232,247, 97,131, 2, 89, + 166, 70,166, 81,166,100,227,249,242,233,236,236,233, 99,128, 4, + 217,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,219,232,239,239,107,128, 2, 90,233,242, 99, 2,166, + 115,166,120,236,101,128, 36,226,245,237,230,236,229,120,128, 1, + 93,239,237,237,225,225,227,227,229,238,116,128, 2, 25,228,239, + 116, 2,166,150,166,159,225,227,227,229,238,116,128, 30, 97,226, + 229,236,239,119,129, 30, 99,166,169,228,239,244,225,227,227,229, + 238,116,128, 30,105,101, 9,166,201,166,217,166,252,167, 61,167, + 164,167,191,167,216,168, 41,168, 68,225,231,245,236,236,226,229, + 236,239,247,227,237, 98,128, 3, 60, 99, 2,166,223,166,245,239, + 238,100,129, 32, 51,166,231,244,239,238,229,227,232,233,238,229, + 243,101,128, 2,202,244,233,239,110,128, 0,167,229,110, 4,167, + 7,167, 16,167, 30,167, 46,225,242,225,226,233, 99,128, 6, 51, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,178,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,179,237,229, + 228,233,225,236,225,242,225,226,233, 99,128,254,180,231,239,108, + 135, 5,182,167, 81,167, 95,167,100,167,109,167,124,167,140,167, + 151, 49, 2,167, 87,167, 91, 51,128, 5,182,102,128, 5,182,178, + 99,128, 5,182,232,229,226,242,229,119,128, 5,182,238,225,242, + 242,239,247,232,229,226,242,229,119,128, 5,182,241,245,225,242, + 244,229,242,232,229,226,242,229,119,128, 5,182,244,225,232,229, + 226,242,229,119,128, 5,146,247,233,228,229,232,229,226,242,229, + 119,128, 5,182,104, 2,167,170,167,181,225,242,237,229,238,233, + 225,110,128, 5,125,233,242,225,231,225,238, 97,128, 48, 91,235, + 225,244,225,235,225,238, 97,129, 48,187,167,204,232,225,236,230, + 247,233,228,244,104,128,255,126,237,105, 2,167,223,168, 10,227, + 239,236,239,110,131, 0, 59,167,237,167,246,168, 2,225,242,225, + 226,233, 99,128, 6, 27,237,239,238,239,243,240,225,227,101,128, + 255, 27,243,237,225,236,108,128,254, 84,246,239,233,227,229,228, + 237,225,242,235,235,225,238, 97,129, 48,156,168, 29,232,225,236, + 230,247,233,228,244,104,128,255,159,238,116, 2,168, 48,168, 58, + 233,243,241,245,225,242,101,128, 51, 34,239,243,241,245,225,242, + 101,128, 51, 35,246,229,110,142, 0, 55,168,102,168,111,168,121, + 168,151,168,158,168,168,168,193,168,220,168,254,169, 10,169, 21, + 169, 54,169, 62,169, 73,225,242,225,226,233, 99,128, 6,103,226, + 229,238,231,225,236,105,128, 9,237,227,233,242,227,236,101,129, + 36,102,168,132,233,238,246,229,242,243,229,243,225,238,243,243, + 229,242,233,102,128, 39,144,228,229,246, 97,128, 9,109,229,233, + 231,232,244,232,115,128, 33, 94,231,117, 2,168,175,168,184,234, + 225,242,225,244,105,128, 10,237,242,237,245,235,232,105,128, 10, + 109,232, 97, 2,168,200,168,211,227,235,225,242,225,226,233, 99, + 128, 6,103,238,231,250,232,239,117,128, 48, 39,105, 2,168,226, + 168,244,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 38,238,230,229,242,233,239,114,128, 32,135,237,239, + 238,239,243,240,225,227,101,128,255, 23,239,236,228,243,244,249, + 236,101,128,247, 55,112, 2,169, 27,169, 34,225,242,229,110,128, + 36,122,229,114, 2,169, 41,169, 47,233,239,100,128, 36,142,243, + 233,225,110,128, 6,247,242,239,237,225,110,128, 33,118,243,245, + 240,229,242,233,239,114,128, 32,119,116, 2,169, 79,169,117,229, + 229,110, 2,169, 87,169, 96,227,233,242,227,236,101,128, 36,112, + 112, 2,169,102,169,109,225,242,229,110,128, 36,132,229,242,233, + 239,100,128, 36,152,232,225,105,128, 14, 87,230,244,232,249,240, + 232,229,110,128, 0,173,104, 7,169,150,170,124,170,135,170,149, + 171, 94,171,107,172, 15, 97, 6,169,164,169,175,169,185,169,196, + 170, 83,170,108,225,242,237,229,238,233,225,110,128, 5,119,226, + 229,238,231,225,236,105,128, 9,182,227,249,242,233,236,236,233, + 99,128, 4, 72,100, 2,169,202,170, 42,228, 97, 4,169,213,169, + 222,169,253,170, 11,225,242,225,226,233, 99,128, 6, 81,228,225, + 237,237, 97, 2,169,232,169,241,225,242,225,226,233, 99,128,252, + 97,244,225,238,225,242,225,226,233, 99,128,252, 94,230,225,244, + 232,225,225,242,225,226,233, 99,128,252, 96,235,225,243,242, 97, + 2,170, 21,170, 30,225,242,225,226,233, 99,128,252, 98,244,225, + 238,225,242,225,226,233, 99,128,252, 95,101,132, 37,146,170, 54, + 170, 61,170, 69,170, 78,228,225,242,107,128, 37,147,236,233,231, + 232,116,128, 37,145,237,229,228,233,245,109,128, 37,146,246, 97, + 128, 9, 54,231,117, 2,170, 90,170, 99,234,225,242,225,244,105, + 128, 10,182,242,237,245,235,232,105,128, 10, 54,236,243,232,229, + 236,229,244,232,229,226,242,229,119,128, 5,147,226,239,240,239, + 237,239,230,111,128, 49, 21,227,232,225,227,249,242,233,236,236, + 233, 99,128, 4, 73,101, 4,170,159,170,224,170,234,170,251,229, + 110, 4,170,170,170,179,170,193,170,209,225,242,225,226,233, 99, + 128, 6, 52,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 182,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,254, + 183,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,184, + 233,227,239,240,244,233, 99,128, 3,227,241,229,108,129, 32,170, + 170,242,232,229,226,242,229,119,128, 32,170,246, 97,134, 5,176, + 171, 12,171, 27,171, 41,171, 50,171, 65,171, 81, 49, 2,171, 18, + 171, 23,177, 53,128, 5,176, 53,128, 5,176, 50, 2,171, 33,171, + 37, 50,128, 5,176,101,128, 5,176,232,229,226,242,229,119,128, + 5,176,238,225,242,242,239,247,232,229,226,242,229,119,128, 5, + 176,241,245,225,242,244,229,242,232,229,226,242,229,119,128, 5, + 176,247,233,228,229,232,229,226,242,229,119,128, 5,176,232,225, + 227,249,242,233,236,236,233, 99,128, 4,187,105, 2,171,113,171, + 124,237,225,227,239,240,244,233, 99,128, 3,237,110,131, 5,233, + 171,134,171,217,171,226,100, 2,171,140,171,206,225,231,229,243, + 104,130,251, 73,171,152,171,161,232,229,226,242,229,119,128,251, + 73,115, 2,171,167,171,187,232,233,238,228,239,116,129,251, 44, + 171,178,232,229,226,242,229,119,128,251, 44,233,238,228,239,116, + 129,251, 45,171,197,232,229,226,242,229,119,128,251, 45,239,244, + 232,229,226,242,229,119,128, 5,193,232,229,226,242,229,119,128, + 5,233,115, 2,171,232,171,252,232,233,238,228,239,116,129,251, + 42,171,243,232,229,226,242,229,119,128,251, 42,233,238,228,239, + 116,129,251, 43,172, 6,232,229,226,242,229,119,128,251, 43,239, + 239,107,128, 2,130,105, 8,172, 39,172, 83,172, 94,172,119,172, + 149,172,157,172,170,173, 85,231,237, 97,131, 3,195,172, 51,172, + 55,172, 63, 49,128, 3,194,230,233,238,225,108,128, 3,194,236, + 245,238,225,244,229,243,249,237,226,239,236,231,242,229,229,107, + 128, 3,242,232,233,242,225,231,225,238, 97,128, 48, 87,235,225, + 244,225,235,225,238, 97,129, 48,183,172,107,232,225,236,230,247, + 233,228,244,104,128,255,124,236,245,113, 2,172,127,172,136,232, + 229,226,242,229,119,128, 5,189,236,229,230,244,232,229,226,242, + 229,119,128, 5,189,237,233,236,225,114,128, 34, 60,238,228,239, + 244,232,229,226,242,229,119,128, 5,194,239,115, 6,172,185,172, + 220,172,252,173, 24,173, 38,173, 70, 97, 2,172,191,172,206,227, + 233,242,227,236,229,235,239,242,229,225,110,128, 50,116,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 20,227,105, 2,172, + 227,172,239,229,245,227,235,239,242,229,225,110,128, 49,126,242, + 227,236,229,235,239,242,229,225,110,128, 50,102,107, 2,173, 2, + 173, 16,233,249,229,239,235,235,239,242,229,225,110,128, 49,122, + 239,242,229,225,110,128, 49, 69,238,233,229,245,238,235,239,242, + 229,225,110,128, 49,123,112, 2,173, 44,173, 57,225,242,229,238, + 235,239,242,229,225,110,128, 50, 6,233,229,245,240,235,239,242, + 229,225,110,128, 49,125,244,233,235,229,245,244,235,239,242,229, + 225,110,128, 49,124,120,141, 0, 54,173,115,173,124,173,134,173, + 164,173,171,173,196,173,223,174, 1,174, 13,174, 24,174, 57,174, + 65,174, 76,225,242,225,226,233, 99,128, 6,102,226,229,238,231, + 225,236,105,128, 9,236,227,233,242,227,236,101,129, 36,101,173, + 145,233,238,246,229,242,243,229,243,225,238,243,243,229,242,233, + 102,128, 39,143,228,229,246, 97,128, 9,108,231,117, 2,173,178, + 173,187,234,225,242,225,244,105,128, 10,236,242,237,245,235,232, + 105,128, 10,108,232, 97, 2,173,203,173,214,227,235,225,242,225, + 226,233, 99,128, 6,102,238,231,250,232,239,117,128, 48, 38,105, + 2,173,229,173,247,228,229,239,231,242,225,240,232,233,227,240, + 225,242,229,110,128, 50, 37,238,230,229,242,233,239,114,128, 32, + 134,237,239,238,239,243,240,225,227,101,128,255, 22,239,236,228, + 243,244,249,236,101,128,247, 54,112, 2,174, 30,174, 37,225,242, + 229,110,128, 36,121,229,114, 2,174, 44,174, 50,233,239,100,128, + 36,141,243,233,225,110,128, 6,246,242,239,237,225,110,128, 33, + 117,243,245,240,229,242,233,239,114,128, 32,118,116, 2,174, 82, + 174,153,229,229,110, 2,174, 90,174,132, 99, 2,174, 96,174,104, + 233,242,227,236,101,128, 36,111,245,242,242,229,238,227,249,228, + 229,238,239,237,233,238,225,244,239,242,226,229,238,231,225,236, + 105,128, 9,249,112, 2,174,138,174,145,225,242,229,110,128, 36, + 131,229,242,233,239,100,128, 36,151,232,225,105,128, 14, 86,108, + 2,174,165,174,185,225,243,104,129, 0, 47,174,173,237,239,238, + 239,243,240,225,227,101,128,255, 15,239,238,103,129, 1,127,174, + 193,228,239,244,225,227,227,229,238,116,128, 30,155,109, 2,174, + 211,174,221,233,236,229,230,225,227,101,128, 38, 58,239,238,239, + 243,240,225,227,101,128,255, 83,111, 6,174,246,175, 40,175, 51, + 175, 76,175,121,175,132,102, 2,174,252,175, 10,240,225,243,245, + 241,232,229,226,242,229,119,128, 5,195,116, 2,175, 16,175, 25, + 232,249,240,232,229,110,128, 0,173,243,233,231,238,227,249,242, + 233,236,236,233, 99,128, 4, 76,232,233,242,225,231,225,238, 97, + 128, 48, 93,235,225,244,225,235,225,238, 97,129, 48,189,175, 64, + 232,225,236,230,247,233,228,244,104,128,255,127,236,233,228,245, + 115, 2,175, 86,175,103,236,239,238,231,239,246,229,242,236,225, + 249,227,237, 98,128, 3, 56,243,232,239,242,244,239,246,229,242, + 236,225,249,227,237, 98,128, 3, 55,242,245,243,233,244,232,225, + 105,128, 14, 41,115, 3,175,140,175,150,175,158,225,236,225,244, + 232,225,105,128, 14, 40,239,244,232,225,105,128, 14, 11,245,225, + 244,232,225,105,128, 14, 42,240, 97, 3,175,176,175,196,175,228, + 227,101,129, 0, 32,175,183,232,225,227,235,225,242,225,226,233, + 99,128, 0, 32,228,101,129, 38, 96,175,203,243,245,233,116, 2, + 175,212,175,220,226,236,225,227,107,128, 38, 96,247,232,233,244, + 101,128, 38,100,242,229,110,128, 36,174,241,245,225,242,101, 11, + 176, 6,176, 17,176, 31,176, 56,176, 73,176, 99,176,114,176,147, + 176,174,176,230,176,245,226,229,236,239,247,227,237, 98,128, 3, + 59, 99, 2,176, 23,176, 27, 99,128, 51,196,109,128, 51,157,228, + 233,225,231,239,238,225,236,227,242,239,243,243,232,225,244,227, + 232,230,233,236,108,128, 37,169,232,239,242,233,250,239,238,244, + 225,236,230,233,236,108,128, 37,164,107, 2,176, 79,176, 83,103, + 128, 51,143,109,129, 51,158,176, 89,227,225,240,233,244,225,108, + 128, 51,206,108, 2,176,105,176,109,110,128, 51,209,239,103,128, + 51,210,109, 4,176,124,176,128,176,133,176,137,103,128, 51,142, + 233,108,128, 51,213,109,128, 51,156,243,241,245,225,242,229,100, + 128, 51,161,239,242,244,232,239,231,239,238,225,236,227,242,239, + 243,243,232,225,244,227,232,230,233,236,108,128, 37,166,245,240, + 240,229,114, 2,176,184,176,207,236,229,230,244,244,239,236,239, + 247,229,242,242,233,231,232,244,230,233,236,108,128, 37,167,242, + 233,231,232,244,244,239,236,239,247,229,242,236,229,230,244,230, + 233,236,108,128, 37,168,246,229,242,244,233,227,225,236,230,233, + 236,108,128, 37,165,247,232,233,244,229,247,233,244,232,243,237, + 225,236,236,226,236,225,227,107,128, 37,163,242,243,241,245,225, + 242,101,128, 51,219,115, 2,177, 27,177,197, 97, 4,177, 37,177, + 47,177, 54,177, 65,226,229,238,231,225,236,105,128, 9,183,228, + 229,246, 97,128, 9, 55,231,245,234,225,242,225,244,105,128, 10, + 183,238,103, 8,177, 84,177, 98,177,112,177,126,177,141,177,155, + 177,169,177,182,227,233,229,245,227,235,239,242,229,225,110,128, + 49, 73,232,233,229,245,232,235,239,242,229,225,110,128, 49,133, + 233,229,245,238,231,235,239,242,229,225,110,128, 49,128,235,233, + 249,229,239,235,235,239,242,229,225,110,128, 49, 50,238,233,229, + 245,238,235,239,242,229,225,110,128, 49,101,240,233,229,245,240, + 235,239,242,229,225,110,128, 49, 67,243,233,239,243,235,239,242, + 229,225,110,128, 49, 70,244,233,235,229,245,244,235,239,242,229, + 225,110,128, 49, 56,245,240,229,242,233,239,114,128,246,242,116, + 2,177,213,177,236,229,242,236,233,238,103,129, 0,163,177,224, + 237,239,238,239,243,240,225,227,101,128,255,225,242,239,235,101, + 2,177,245,178, 6,236,239,238,231,239,246,229,242,236,225,249, + 227,237, 98,128, 3, 54,243,232,239,242,244,239,246,229,242,236, + 225,249,227,237, 98,128, 3, 53,117, 7,178, 40,178, 72,178, 94, + 178,105,178,146,178,156,178,160,226,243,229,116,130, 34,130,178, + 51,178, 62,238,239,244,229,241,245,225,108,128, 34,138,239,242, + 229,241,245,225,108,128, 34,134, 99, 2,178, 78,178, 86,227,229, + 229,228,115,128, 34,123,232,244,232,225,116,128, 34, 11,232,233, + 242,225,231,225,238, 97,128, 48, 89,107, 2,178,111,178,135,225, + 244,225,235,225,238, 97,129, 48,185,178,123,232,225,236,230,247, + 233,228,244,104,128,255,125,245,238,225,242,225,226,233, 99,128, + 6, 82,237,237,225,244,233,239,110,128, 34, 17,110,128, 38, 60, + 240,229,242,243,229,116,130, 34,131,178,173,178,184,238,239,244, + 229,241,245,225,108,128, 34,139,239,242,229,241,245,225,108,128, + 34,135,246,243,241,245,225,242,101,128, 51,220,249,239,245,247, + 225,229,242,225,243,241,245,225,242,101,128, 51,124,116,144, 0, + 116,179, 1,180, 10,180, 31,180,174,180,214,183, 6,186,144,187, + 219,187,231,187,243,189, 20,189, 45,189,131,190, 55,190,239,191, + 73, 97, 10,179, 23,179, 33,179, 54,179, 61,179, 86,179,164,179, + 181,179,206,179,220,179,224,226,229,238,231,225,236,105,128, 9, + 164,227,107, 2,179, 40,179, 47,228,239,247,110,128, 34,164,236, + 229,230,116,128, 34,163,228,229,246, 97,128, 9, 36,231,117, 2, + 179, 68,179, 77,234,225,242,225,244,105,128, 10,164,242,237,245, + 235,232,105,128, 10, 36,104, 4,179, 96,179,105,179,119,179,149, + 225,242,225,226,233, 99,128, 6, 55,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,194,105, 2,179,125,179,140,238,233,244, + 233,225,236,225,242,225,226,233, 99,128,254,195,242,225,231,225, + 238, 97,128, 48, 95,237,229,228,233,225,236,225,242,225,226,233, + 99,128,254,196,233,243,249,239,245,229,242,225,243,241,245,225, + 242,101,128, 51,125,235,225,244,225,235,225,238, 97,129, 48,191, + 179,194,232,225,236,230,247,233,228,244,104,128,255,128,244,247, + 229,229,236,225,242,225,226,233, 99,128, 6, 64,117,128, 3,196, + 118,130, 5,234,179,232,180, 1,228,225,231,229,115,129,251, 74, + 179,242,104,129,251, 74,179,248,232,229,226,242,229,119,128,251, + 74,232,229,226,242,229,119,128, 5,234, 98, 2,180, 16,180, 21, + 225,114,128, 1,103,239,240,239,237,239,230,111,128, 49, 10, 99, + 6,180, 45,180, 52,180, 59,180, 68,180,134,180,161,225,242,239, + 110,128, 1,101,227,245,242,108,128, 2,168,229,228,233,236,236, + 97,128, 1, 99,232,229,104, 4,180, 80,180, 89,180,103,180,119, + 225,242,225,226,233, 99,128, 6,134,230,233,238,225,236,225,242, + 225,226,233, 99,128,251,123,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,251,124,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,251,125,233,242, 99, 2,180,142,180,147,236,101, + 128, 36,227,245,237,230,236,229,248,226,229,236,239,119,128, 30, + 113,239,237,237,225,225,227,227,229,238,116,128, 1, 99,100, 2, + 180,180,180,190,233,229,242,229,243,233,115,128, 30,151,239,116, + 2,180,197,180,206,225,227,227,229,238,116,128, 30,107,226,229, + 236,239,119,128, 30,109,101, 9,180,234,180,245,181, 9,182, 19, + 182, 44,182,108,182,175,182,180,182,232,227,249,242,233,236,236, + 233, 99,128, 4, 66,228,229,243,227,229,238,228,229,242,227,249, + 242,233,236,236,233, 99,128, 4,173,104, 7,181, 25,181, 34,181, + 48,181, 88,181,118,181,159,182, 1,225,242,225,226,233, 99,128, + 6, 42,230,233,238,225,236,225,242,225,226,233, 99,128,254,150, + 232,225,232,105, 2,181, 57,181, 72,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,162,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,252, 12,105, 2,181, 94,181,109,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,151,242,225,231, + 225,238, 97,128, 48,102,234,229,229,237,105, 2,181,128,181,143, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,161,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 11,109, + 2,181,165,181,199,225,242,226,245,244, 97, 2,181,176,181,185, + 225,242,225,226,233, 99,128, 6, 41,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,148,101, 2,181,205,181,218,228,233,225, + 236,225,242,225,226,233, 99,128,254,152,229,237,105, 2,181,226, + 181,241,238,233,244,233,225,236,225,242,225,226,233, 99,128,252, + 164,243,239,236,225,244,229,228,225,242,225,226,233, 99,128,252, + 14,238,239,239,238,230,233,238,225,236,225,242,225,226,233, 99, + 128,252,115,235,225,244,225,235,225,238, 97,129, 48,198,182, 32, + 232,225,236,230,247,233,228,244,104,128,255,131,108, 2,182, 50, + 182, 69,229,240,232,239,238,101,129, 33, 33,182, 61,226,236,225, + 227,107,128, 38, 14,233,243,232, 97, 2,182, 78,182, 93,231,229, + 228,239,236,225,232,229,226,242,229,119,128, 5,160,241,229,244, + 225,238,225,232,229,226,242,229,119,128, 5,169,110, 4,182,118, + 182,127,182,146,182,167,227,233,242,227,236,101,128, 36,105,233, + 228,229,239,231,242,225,240,232,233,227,240,225,242,229,110,128, + 50, 41,112, 2,182,152,182,159,225,242,229,110,128, 36,125,229, + 242,233,239,100,128, 36,145,242,239,237,225,110,128, 33,121,243, + 104,128, 2,167,116,131, 5,216,182,190,182,210,182,219,228,225, + 231,229,243,104,129,251, 56,182,201,232,229,226,242,229,119,128, + 251, 56,232,229,226,242,229,119,128, 5,216,243,229,227,249,242, + 233,236,236,233, 99,128, 4,181,246,233,114, 2,182,240,182,249, + 232,229,226,242,229,119,128, 5,155,236,229,230,244,232,229,226, + 242,229,119,128, 5,155,104, 6,183, 20,183,172,184, 38,184,170, + 185, 77,186,134, 97, 5,183, 32,183, 42,183, 49,183, 74,183,103, + 226,229,238,231,225,236,105,128, 9,165,228,229,246, 97,128, 9, + 37,231,117, 2,183, 56,183, 65,234,225,242,225,244,105,128, 10, + 165,242,237,245,235,232,105,128, 10, 37,108, 2,183, 80,183, 89, + 225,242,225,226,233, 99,128, 6, 48,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,172,238,244,232,225,235,232,225,116, 3, + 183,118,183,149,183,156,236,239,119, 2,183,126,183,137,236,229, + 230,244,244,232,225,105,128,248,152,242,233,231,232,244,244,232, + 225,105,128,248,151,244,232,225,105,128, 14, 76,245,240,240,229, + 242,236,229,230,244,244,232,225,105,128,248,150,101, 3,183,180, + 183,244,184, 11,104, 4,183,190,183,199,183,213,183,229,225,242, + 225,226,233, 99,128, 6, 43,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,154,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,254,155,237,229,228,233,225,236,225,242,225,226,233, + 99,128,254,156,242,101, 2,183,251,184, 4,229,248,233,243,244, + 115,128, 34, 3,230,239,242,101,128, 34, 52,244, 97,130, 3,184, + 184, 20,184, 24, 49,128, 3,209,243,249,237,226,239,236,231,242, + 229,229,107,128, 3,209,105, 2,184, 44,184,130,229,245,244,104, + 4,184, 57,184, 92,184,107,184,116, 97, 2,184, 63,184, 78,227, + 233,242,227,236,229,235,239,242,229,225,110,128, 50,121,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 25,227,233,242,227, + 236,229,235,239,242,229,225,110,128, 50,107,235,239,242,229,225, + 110,128, 49, 76,240,225,242,229,238,235,239,242,229,225,110,128, + 50, 11,242,244,229,229,110, 2,184,140,184,149,227,233,242,227, + 236,101,128, 36,108,112, 2,184,155,184,162,225,242,229,110,128, + 36,128,229,242,233,239,100,128, 36,148,111, 6,184,184,184,201, + 184,206,184,220,184,225,185, 22,238,225,238,231,237,239,238,244, + 232,239,244,232,225,105,128, 14, 17,239,107,128, 1,173,240,232, + 245,244,232,225,239,244,232,225,105,128, 14, 18,242,110,128, 0, + 254,244,104, 3,184,234,185, 2,185, 12, 97, 2,184,240,184,250, + 232,225,238,244,232,225,105,128, 14, 23,238,244,232,225,105,128, + 14, 16,239,238,231,244,232,225,105,128, 14, 24,245,238,231,244, + 232,225,105,128, 14, 22,245,243,225,238,100, 2,185, 32,185, 43, + 227,249,242,233,236,236,233, 99,128, 4,130,243,243,229,240,225, + 242,225,244,239,114, 2,185, 58,185, 67,225,242,225,226,233, 99, + 128, 6,108,240,229,242,243,233,225,110,128, 6,108,242,229,101, + 144, 0, 51,185,115,185,124,185,134,185,164,185,171,185,181,185, + 206,185,233,186, 11,186, 23,186, 42,186, 53,186, 86,186,108,186, + 116,186,127,225,242,225,226,233, 99,128, 6, 99,226,229,238,231, + 225,236,105,128, 9,233,227,233,242,227,236,101,129, 36, 98,185, + 145,233,238,246,229,242,243,229,243,225,238,243,243,229,242,233, + 102,128, 39,140,228,229,246, 97,128, 9,105,229,233,231,232,244, + 232,115,128, 33, 92,231,117, 2,185,188,185,197,234,225,242,225, + 244,105,128, 10,233,242,237,245,235,232,105,128, 10,105,232, 97, + 2,185,213,185,224,227,235,225,242,225,226,233, 99,128, 6, 99, + 238,231,250,232,239,117,128, 48, 35,105, 2,185,239,186, 1,228, + 229,239,231,242,225,240,232,233,227,240,225,242,229,110,128, 50, + 34,238,230,229,242,233,239,114,128, 32,131,237,239,238,239,243, + 240,225,227,101,128,255, 19,238,245,237,229,242,225,244,239,242, + 226,229,238,231,225,236,105,128, 9,246,239,236,228,243,244,249, + 236,101,128,247, 51,112, 2,186, 59,186, 66,225,242,229,110,128, + 36,118,229,114, 2,186, 73,186, 79,233,239,100,128, 36,138,243, + 233,225,110,128, 6,243,241,245,225,242,244,229,242,115,129, 0, + 190,186, 99,229,237,228,225,243,104,128,246,222,242,239,237,225, + 110,128, 33,114,243,245,240,229,242,233,239,114,128, 0,179,244, + 232,225,105,128, 14, 83,250,243,241,245,225,242,101,128, 51,148, + 105, 7,186,160,186,171,187, 30,187,128,187,140,187,189,187,206, + 232,233,242,225,231,225,238, 97,128, 48, 97,107, 2,186,177,186, + 201,225,244,225,235,225,238, 97,129, 48,193,186,189,232,225,236, + 230,247,233,228,244,104,128,255,129,229,245,116, 4,186,213,186, + 248,187, 7,187, 16, 97, 2,186,219,186,234,227,233,242,227,236, + 229,235,239,242,229,225,110,128, 50,112,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 16,227,233,242,227,236,229,235,239, + 242,229,225,110,128, 50, 98,235,239,242,229,225,110,128, 49, 55, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 2,236,228, + 101,133, 2,220,187, 46,187, 57,187, 74,187, 86,187,114,226,229, + 236,239,247,227,237, 98,128, 3, 48, 99, 2,187, 63,187, 68,237, + 98,128, 3, 3,239,237, 98,128, 3, 3,228,239,245,226,236,229, + 227,237, 98,128, 3, 96,111, 2,187, 92,187,102,240,229,242,225, + 244,239,114,128, 34, 60,246,229,242,236,225,249,227,237, 98,128, + 3, 52,246,229,242,244,233,227,225,236,227,237, 98,128, 3, 62, + 237,229,243,227,233,242,227,236,101,128, 34,151,112, 2,187,146, + 187,176,229,232, 97, 2,187,154,187,163,232,229,226,242,229,119, + 128, 5,150,236,229,230,244,232,229,226,242,229,119,128, 5,150, + 240,233,231,245,242,237,245,235,232,105,128, 10,112,244,236,239, + 227,249,242,233,236,236,233,227,227,237, 98,128, 4,131,247,238, + 225,242,237,229,238,233,225,110,128, 5,127,236,233,238,229,226, + 229,236,239,119,128, 30,111,237,239,238,239,243,240,225,227,101, + 128,255, 84,111, 7,188, 3,188, 14,188, 25,188, 50,188,170,188, + 182,189, 10,225,242,237,229,238,233,225,110,128, 5,105,232,233, + 242,225,231,225,238, 97,128, 48,104,235,225,244,225,235,225,238, + 97,129, 48,200,188, 38,232,225,236,230,247,233,228,244,104,128, + 255,132,110, 3,188, 58,188,156,188,161,101, 4,188, 68,188,137, + 188,144,188,150,226,225,114, 4,188, 80,188,109,188,119,188,128, + 229,248,244,242, 97, 2,188, 90,188,100,232,233,231,232,237,239, + 100,128, 2,229,236,239,247,237,239,100,128, 2,233,232,233,231, + 232,237,239,100,128, 2,230,236,239,247,237,239,100,128, 2,232, + 237,233,228,237,239,100,128, 2,231,230,233,246,101,128, 1,189, + 243,233,120,128, 1,133,244,247,111,128, 1,168,239,115,128, 3, + 132,243,241,245,225,242,101,128, 51, 39,240,225,244,225,235,244, + 232,225,105,128, 14, 15,242,244,239,233,243,229,243,232,229,236, + 236,226,242,225,227,235,229,116, 2,188,205,188,235,236,229,230, + 116,130, 48, 20,188,216,188,224,243,237,225,236,108,128,254, 93, + 246,229,242,244,233,227,225,108,128,254, 57,242,233,231,232,116, + 130, 48, 21,188,247,188,255,243,237,225,236,108,128,254, 94,246, + 229,242,244,233,227,225,108,128,254, 58,244,225,239,244,232,225, + 105,128, 14, 21,240, 97, 2,189, 27,189, 39,236,225,244,225,236, + 232,239,239,107,128, 1,171,242,229,110,128, 36,175,114, 3,189, + 53,189, 84,189, 99,225,228,229,237,225,242,107,129, 33, 34,189, + 65,115, 2,189, 71,189, 77,225,238,115,128,248,234,229,242,233, + 102,128,246,219,229,244,242,239,230,236,229,248,232,239,239,107, + 128, 2,136,233,225,103, 4,189,111,189,116,189,121,189,126,228, + 110,128, 37,188,236,102,128, 37,196,242,116,128, 37,186,245,112, + 128, 37,178,115,132, 2,166,189,143,189,182,190, 32,190, 45,225, + 228,105,130, 5,230,189,153,189,173,228,225,231,229,243,104,129, + 251, 70,189,164,232,229,226,242,229,119,128,251, 70,232,229,226, + 242,229,119,128, 5,230,101, 2,189,188,189,199,227,249,242,233, + 236,236,233, 99,128, 4, 70,242,101,134, 5,181,189,216,189,230, + 189,235,189,244,190, 3,190, 19, 49, 2,189,222,189,226, 50,128, + 5,181,101,128, 5,181,178, 98,128, 5,181,232,229,226,242,229, + 119,128, 5,181,238,225,242,242,239,247,232,229,226,242,229,119, + 128, 5,181,241,245,225,242,244,229,242,232,229,226,242,229,119, + 128, 5,181,247,233,228,229,232,229,226,242,229,119,128, 5,181, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 91,245,240,229, + 242,233,239,114,128,246,243,116, 4,190, 65,190,115,190,180,190, + 231, 97, 3,190, 73,190, 83,190, 90,226,229,238,231,225,236,105, + 128, 9,159,228,229,246, 97,128, 9, 31,231,117, 2,190, 97,190, + 106,234,225,242,225,244,105,128, 10,159,242,237,245,235,232,105, + 128, 10, 31,229,104, 4,190,126,190,135,190,149,190,165,225,242, + 225,226,233, 99,128, 6,121,230,233,238,225,236,225,242,225,226, + 233, 99,128,251,103,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,251,104,237,229,228,233,225,236,225,242,225,226,233, + 99,128,251,105,232, 97, 3,190,189,190,199,190,206,226,229,238, + 231,225,236,105,128, 9,160,228,229,246, 97,128, 9, 32,231,117, + 2,190,213,190,222,234,225,242,225,244,105,128, 10,160,242,237, + 245,235,232,105,128, 10, 32,245,242,238,229,100,128, 2,135,117, + 3,190,247,191, 2,191, 27,232,233,242,225,231,225,238, 97,128, + 48,100,235,225,244,225,235,225,238, 97,129, 48,196,191, 15,232, + 225,236,230,247,233,228,244,104,128,255,130,243,237,225,236,108, + 2,191, 37,191, 48,232,233,242,225,231,225,238, 97,128, 48, 99, + 235,225,244,225,235,225,238, 97,129, 48,195,191, 61,232,225,236, + 230,247,233,228,244,104,128,255,111,119, 2,191, 79,191,184,101, + 2,191, 85,191,133,236,246,101, 3,191, 95,191,104,191,125,227, + 233,242,227,236,101,128, 36,107,112, 2,191,110,191,117,225,242, + 229,110,128, 36,127,229,242,233,239,100,128, 36,147,242,239,237, + 225,110,128, 33,123,238,244,121, 3,191,143,191,152,191,163,227, + 233,242,227,236,101,128, 36,115,232,225,238,231,250,232,239,117, + 128, 83, 68,112, 2,191,169,191,176,225,242,229,110,128, 36,135, + 229,242,233,239,100,128, 36,155,111,142, 0, 50,191,216,191,225, + 191,235,192, 9,192, 61,192, 86,192,113,192,147,192,159,192,178, + 192,189,192,222,192,230,192,254,225,242,225,226,233, 99,128, 6, + 98,226,229,238,231,225,236,105,128, 9,232,227,233,242,227,236, + 101,129, 36, 97,191,246,233,238,246,229,242,243,229,243,225,238, + 243,243,229,242,233,102,128, 39,139,100, 2,192, 15,192, 21,229, + 246, 97,128, 9,104,239,116, 2,192, 28,192, 39,229,238,236,229, + 225,228,229,114,128, 32, 37,236,229,225,228,229,114,129, 32, 37, + 192, 50,246,229,242,244,233,227,225,108,128,254, 48,231,117, 2, + 192, 68,192, 77,234,225,242,225,244,105,128, 10,232,242,237,245, + 235,232,105,128, 10,104,232, 97, 2,192, 93,192,104,227,235,225, + 242,225,226,233, 99,128, 6, 98,238,231,250,232,239,117,128, 48, + 34,105, 2,192,119,192,137,228,229,239,231,242,225,240,232,233, + 227,240,225,242,229,110,128, 50, 33,238,230,229,242,233,239,114, + 128, 32,130,237,239,238,239,243,240,225,227,101,128,255, 18,238, + 245,237,229,242,225,244,239,242,226,229,238,231,225,236,105,128, + 9,245,239,236,228,243,244,249,236,101,128,247, 50,112, 2,192, + 195,192,202,225,242,229,110,128, 36,117,229,114, 2,192,209,192, + 215,233,239,100,128, 36,137,243,233,225,110,128, 6,242,242,239, + 237,225,110,128, 33,113,115, 2,192,236,192,244,244,242,239,235, + 101,128, 1,187,245,240,229,242,233,239,114,128, 0,178,244,104, + 2,193, 5,193, 10,225,105,128, 14, 82,233,242,228,115,128, 33, + 84,117,145, 0,117,193, 55,193, 63,193,104,193,161,194, 43,194, + 80,194,203,194,219,195, 14,195, 84,195,165,195,174,196, 37,196, + 61,196,169,196,197,197, 55,225,227,245,244,101,128, 0,250, 98, + 4,193, 73,193, 78,193, 87,193, 97,225,114,128, 2,137,229,238, + 231,225,236,105,128, 9,137,239,240,239,237,239,230,111,128, 49, + 40,242,229,246,101,128, 1,109, 99, 3,193,112,193,119,193,151, + 225,242,239,110,128, 1,212,233,242, 99, 2,193,127,193,132,236, + 101,128, 36,228,245,237,230,236,229,120,129, 0,251,193,143,226, + 229,236,239,119,128, 30,119,249,242,233,236,236,233, 99,128, 4, + 67,100, 5,193,173,193,184,193,207,193,213,194, 33,225,244,244, + 225,228,229,246, 97,128, 9, 81,226,108, 2,193,191,193,199,225, + 227,245,244,101,128, 1,113,231,242,225,246,101,128, 2, 21,229, + 246, 97,128, 9, 9,233,229,242,229,243,233,115,133, 0,252,193, + 233,193,241,193,249,194, 16,194, 24,225,227,245,244,101,128, 1, + 216,226,229,236,239,119,128, 30,115, 99, 2,193,255,194, 6,225, + 242,239,110,128, 1,218,249,242,233,236,236,233, 99,128, 4,241, + 231,242,225,246,101,128, 1,220,237,225,227,242,239,110,128, 1, + 214,239,244,226,229,236,239,119,128, 30,229,103, 2,194, 49,194, + 56,242,225,246,101,128, 0,249,117, 2,194, 62,194, 71,234,225, + 242,225,244,105,128, 10,137,242,237,245,235,232,105,128, 10, 9, + 104, 3,194, 88,194, 98,194,176,233,242,225,231,225,238, 97,128, + 48, 70,111, 2,194,104,194,114,239,235,225,226,239,246,101,128, + 30,231,242,110,133, 1,176,194,129,194,137,194,148,194,156,194, + 168,225,227,245,244,101,128, 30,233,228,239,244,226,229,236,239, + 119,128, 30,241,231,242,225,246,101,128, 30,235,232,239,239,235, + 225,226,239,246,101,128, 30,237,244,233,236,228,101,128, 30,239, + 245,238,231,225,242,245,237,236,225,245,116,129, 1,113,194,192, + 227,249,242,233,236,236,233, 99,128, 4,243,233,238,246,229,242, + 244,229,228,226,242,229,246,101,128, 2, 23,107, 3,194,227,194, + 251,195, 6,225,244,225,235,225,238, 97,129, 48,166,194,239,232, + 225,236,230,247,233,228,244,104,128,255,115,227,249,242,233,236, + 236,233, 99,128, 4,121,239,242,229,225,110,128, 49, 92,109, 2, + 195, 20,195, 73, 97, 2,195, 26,195, 59,227,242,239,110,130, 1, + 107,195, 37,195, 48,227,249,242,233,236,236,233, 99,128, 4,239, + 228,233,229,242,229,243,233,115,128, 30,123,244,242,225,231,245, + 242,237,245,235,232,105,128, 10, 65,239,238,239,243,240,225,227, + 101,128,255, 85,110, 2,195, 90,195,145,228,229,242,243,227,239, + 242,101,132, 0, 95,195,109,195,115,195,127,195,138,228,226,108, + 128, 32, 23,237,239,238,239,243,240,225,227,101,128,255, 63,246, + 229,242,244,233,227,225,108,128,254, 51,247,225,246,121,128,254, + 79,105, 2,195,151,195,156,239,110,128, 34, 42,246,229,242,243, + 225,108,128, 34, 0,239,231,239,238,229,107,128, 1,115,112, 5, + 195,186,195,193,195,201,195,216,196, 11,225,242,229,110,128, 36, + 176,226,236,239,227,107,128, 37,128,240,229,242,228,239,244,232, + 229,226,242,229,119,128, 5,196,243,233,236,239,110,131, 3,197, + 195,230,195,251,196, 3,228,233,229,242,229,243,233,115,129, 3, + 203,195,243,244,239,238,239,115,128, 3,176,236,225,244,233,110, + 128, 2,138,244,239,238,239,115,128, 3,205,244,225,227,107, 2, + 196, 20,196, 31,226,229,236,239,247,227,237, 98,128, 3, 29,237, + 239,100,128, 2,212,114, 2,196, 43,196, 55,225,231,245,242,237, + 245,235,232,105,128, 10,115,233,238,103,128, 1,111,115, 3,196, + 69,196, 84,196,129,232,239,242,244,227,249,242,233,236,236,233, + 99,128, 4, 94,237,225,236,108, 2,196, 93,196,104,232,233,242, + 225,231,225,238, 97,128, 48, 69,235,225,244,225,235,225,238, 97, + 129, 48,165,196,117,232,225,236,230,247,233,228,244,104,128,255, + 105,244,242,225,233,231,232,116, 2,196,141,196,152,227,249,242, + 233,236,236,233, 99,128, 4,175,243,244,242,239,235,229,227,249, + 242,233,236,236,233, 99,128, 4,177,244,233,236,228,101,130, 1, + 105,196,181,196,189,225,227,245,244,101,128, 30,121,226,229,236, + 239,119,128, 30,117,117, 5,196,209,196,219,196,226,196,251,197, + 11,226,229,238,231,225,236,105,128, 9,138,228,229,246, 97,128, + 9, 10,231,117, 2,196,233,196,242,234,225,242,225,244,105,128, + 10,138,242,237,245,235,232,105,128, 10, 10,237,225,244,242,225, + 231,245,242,237,245,235,232,105,128, 10, 66,246,239,247,229,236, + 243,233,231,110, 3,197, 27,197, 37,197, 44,226,229,238,231,225, + 236,105,128, 9,194,228,229,246, 97,128, 9, 66,231,245,234,225, + 242,225,244,105,128, 10,194,246,239,247,229,236,243,233,231,110, + 3,197, 71,197, 81,197, 88,226,229,238,231,225,236,105,128, 9, + 193,228,229,246, 97,128, 9, 65,231,245,234,225,242,225,244,105, + 128, 10,193,118,139, 0,118,197,125,198, 17,198, 26,198, 37,198, + 222,198,229,199, 71,199, 83,199,183,199,191,199,212, 97, 4,197, + 135,197,142,197,167,197,178,228,229,246, 97,128, 9, 53,231,117, + 2,197,149,197,158,234,225,242,225,244,105,128, 10,181,242,237, + 245,235,232,105,128, 10, 53,235,225,244,225,235,225,238, 97,128, + 48,247,118,132, 5,213,197,190,197,217,197,249,198, 5,228,225, + 231,229,243,104,130,251, 53,197,203,197,208,182, 53,128,251, 53, + 232,229,226,242,229,119,128,251, 53,104, 2,197,223,197,231,229, + 226,242,229,119,128, 5,213,239,236,225,109,129,251, 75,197,240, + 232,229,226,242,229,119,128,251, 75,246,225,246,232,229,226,242, + 229,119,128, 5,240,249,239,228,232,229,226,242,229,119,128, 5, + 241,227,233,242,227,236,101,128, 36,229,228,239,244,226,229,236, + 239,119,128, 30,127,101, 6,198, 51,198, 62,198,126,198,137,198, + 143,198,210,227,249,242,233,236,236,233, 99,128, 4, 50,104, 4, + 198, 72,198, 81,198, 95,198,111,225,242,225,226,233, 99,128, 6, + 164,230,233,238,225,236,225,242,225,226,233, 99,128,251,107,233, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,251,108,237, + 229,228,233,225,236,225,242,225,226,233, 99,128,251,109,235,225, + 244,225,235,225,238, 97,128, 48,249,238,245,115,128, 38, 64,242, + 244,233,227,225,108, 2,198,154,198,160,226,225,114,128, 0,124, + 236,233,238,101, 4,198,173,198,184,198,195,198,204,225,226,239, + 246,229,227,237, 98,128, 3, 13,226,229,236,239,247,227,237, 98, + 128, 3, 41,236,239,247,237,239,100,128, 2,204,237,239,100,128, + 2,200,247,225,242,237,229,238,233,225,110,128, 5,126,232,239, + 239,107,128, 2,139,105, 3,198,237,198,248,199, 31,235,225,244, + 225,235,225,238, 97,128, 48,248,242,225,237, 97, 3,199, 3,199, + 13,199, 20,226,229,238,231,225,236,105,128, 9,205,228,229,246, + 97,128, 9, 77,231,245,234,225,242,225,244,105,128, 10,205,243, + 225,242,231, 97, 3,199, 43,199, 53,199, 60,226,229,238,231,225, + 236,105,128, 9,131,228,229,246, 97,128, 9, 3,231,245,234,225, + 242,225,244,105,128, 10,131,237,239,238,239,243,240,225,227,101, + 128,255, 86,111, 3,199, 91,199,102,199,172,225,242,237,229,238, + 233,225,110,128, 5,120,233,227,229,100, 2,199,111,199,147,233, + 244,229,242,225,244,233,239,110, 2,199,125,199,136,232,233,242, + 225,231,225,238, 97,128, 48,158,235,225,244,225,235,225,238, 97, + 128, 48,254,237,225,242,235,235,225,238, 97,129, 48,155,199,160, + 232,225,236,230,247,233,228,244,104,128,255,158,235,225,244,225, + 235,225,238, 97,128, 48,250,240,225,242,229,110,128, 36,177,116, + 2,199,197,199,204,233,236,228,101,128, 30,125,245,242,238,229, + 100,128, 2,140,117, 2,199,218,199,229,232,233,242,225,231,225, + 238, 97,128, 48,148,235,225,244,225,235,225,238, 97,128, 48,244, + 119,143, 0,119,200, 18,200,251,201, 5,201, 28,201, 68,201,135, + 201,143,203,114,203,155,203,167,203,242,203,250,204, 1,204, 12, + 204, 21, 97, 8,200, 36,200, 43,200, 53,200, 64,200,102,200,134, + 200,146,200,182,227,245,244,101,128, 30,131,229,235,239,242,229, + 225,110,128, 49, 89,232,233,242,225,231,225,238, 97,128, 48,143, + 107, 2,200, 70,200, 94,225,244,225,235,225,238, 97,129, 48,239, + 200, 82,232,225,236,230,247,233,228,244,104,128,255,156,239,242, + 229,225,110,128, 49, 88,243,237,225,236,108, 2,200,112,200,123, + 232,233,242,225,231,225,238, 97,128, 48,142,235,225,244,225,235, + 225,238, 97,128, 48,238,244,244,239,243,241,245,225,242,101,128, + 51, 87,118, 2,200,152,200,160,229,228,225,243,104,128, 48, 28, + 249,245,238,228,229,242,243,227,239,242,229,246,229,242,244,233, + 227,225,108,128,254, 52,119, 3,200,190,200,199,200,213,225,242, + 225,226,233, 99,128, 6, 72,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,238,232,225,237,250,225,225,226,239,246,101, 2, + 200,228,200,237,225,242,225,226,233, 99,128, 6, 36,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,134,226,243,241,245,225, + 242,101,128, 51,221,227,233,242, 99, 2,201, 14,201, 19,236,101, + 128, 36,230,245,237,230,236,229,120,128, 1,117,100, 2,201, 34, + 201, 44,233,229,242,229,243,233,115,128, 30,133,239,116, 2,201, + 51,201, 60,225,227,227,229,238,116,128, 30,135,226,229,236,239, + 119,128, 30,137,101, 4,201, 78,201, 89,201,101,201,125,232,233, + 242,225,231,225,238, 97,128, 48,145,233,229,242,243,244,242,225, + 243,115,128, 33, 24,107, 2,201,107,201,117,225,244,225,235,225, + 238, 97,128, 48,241,239,242,229,225,110,128, 49, 94,239,235,239, + 242,229,225,110,128, 49, 93,231,242,225,246,101,128, 30,129,232, + 233,244,101, 8,201,164,201,173,202, 1,202, 91,202,175,202,220, + 203, 16,203, 72,226,245,236,236,229,116,128, 37,230, 99, 2,201, + 179,201,199,233,242,227,236,101,129, 37,203,201,189,233,238,246, + 229,242,243,101,128, 37,217,239,242,238,229,242,226,242,225,227, + 235,229,116, 2,201,216,201,236,236,229,230,116,129, 48, 14,201, + 225,246,229,242,244,233,227,225,108,128,254, 67,242,233,231,232, + 116,129, 48, 15,201,246,246,229,242,244,233,227,225,108,128,254, + 68,100, 2,202, 7,202, 48,233,225,237,239,238,100,129, 37,199, + 202, 18,227,239,238,244,225,233,238,233,238,231,226,236,225,227, + 235,243,237,225,236,236,228,233,225,237,239,238,100,128, 37,200, + 239,247,238,240,239,233,238,244,233,238,103, 2,202, 64,202, 80, + 243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37,191, + 244,242,233,225,238,231,236,101,128, 37,189,236,101, 2,202, 98, + 202,140,230,244,240,239,233,238,244,233,238,103, 2,202,113,202, + 129,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 195,244,242,233,225,238,231,236,101,128, 37,193,238,244,233,227, + 245,236,225,242,226,242,225,227,235,229,116, 2,202,160,202,167, + 236,229,230,116,128, 48, 22,242,233,231,232,116,128, 48, 23,242, + 233,231,232,244,240,239,233,238,244,233,238,103, 2,202,193,202, + 209,243,237,225,236,236,244,242,233,225,238,231,236,101,128, 37, + 185,244,242,233,225,238,231,236,101,128, 37,183,115, 3,202,228, + 203, 2,203, 10,109, 2,202,234,202,246,225,236,236,243,241,245, + 225,242,101,128, 37,171,233,236,233,238,231,230,225,227,101,128, + 38, 58,241,245,225,242,101,128, 37,161,244,225,114,128, 38, 6, + 116, 2,203, 22,203, 33,229,236,229,240,232,239,238,101,128, 38, + 15,239,242,244,239,233,243,229,243,232,229,236,236,226,242,225, + 227,235,229,116, 2,203, 57,203, 64,236,229,230,116,128, 48, 24, + 242,233,231,232,116,128, 48, 25,245,240,240,239,233,238,244,233, + 238,103, 2,203, 87,203,103,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,181,244,242,233,225,238,231,236,101,128, + 37,179,105, 2,203,120,203,131,232,233,242,225,231,225,238, 97, + 128, 48,144,107, 2,203,137,203,147,225,244,225,235,225,238, 97, + 128, 48,240,239,242,229,225,110,128, 49, 95,237,239,238,239,243, + 240,225,227,101,128,255, 87,111, 4,203,177,203,188,203,213,203, + 231,232,233,242,225,231,225,238, 97,128, 48,146,235,225,244,225, + 235,225,238, 97,129, 48,242,203,201,232,225,236,230,247,233,228, + 244,104,128,255,102,110,129, 32,169,203,219,237,239,238,239,243, + 240,225,227,101,128,255,230,247,225,229,238,244,232,225,105,128, + 14, 39,240,225,242,229,110,128, 36,178,242,233,238,103,128, 30, + 152,243,245,240,229,242,233,239,114,128, 2,183,244,245,242,238, + 229,100,128, 2,141,249,238,110,128, 1,191,120,137, 0,120,204, + 49,204, 60,204, 71,204, 80,204,107,204,120,204,124,204,136,204, + 144,225,226,239,246,229,227,237, 98,128, 3, 61,226,239,240,239, + 237,239,230,111,128, 49, 18,227,233,242,227,236,101,128, 36,231, + 100, 2,204, 86,204, 96,233,229,242,229,243,233,115,128, 30,141, + 239,244,225,227,227,229,238,116,128, 30,139,229,232,225,242,237, + 229,238,233,225,110,128, 5,109,105,128, 3,190,237,239,238,239, + 243,240,225,227,101,128,255, 88,240,225,242,229,110,128, 36,179, + 243,245,240,229,242,233,239,114,128, 2,227,121,143, 0,121,204, + 189,205,148,205,171,205,211,207,177,207,185,207,202,208, 10,208, + 22,209, 19,209, 59,209, 71,209, 82,209,103,210, 76, 97, 11,204, + 213,204,225,204,235,204,242,204,249,205, 3,205, 28,205, 39,205, + 77,205, 90,205,136,225,228,239,243,241,245,225,242,101,128, 51, + 78,226,229,238,231,225,236,105,128, 9,175,227,245,244,101,128, + 0,253,228,229,246, 97,128, 9, 47,229,235,239,242,229,225,110, + 128, 49, 82,231,117, 2,205, 10,205, 19,234,225,242,225,244,105, + 128, 10,175,242,237,245,235,232,105,128, 10, 47,232,233,242,225, + 231,225,238, 97,128, 48,132,107, 2,205, 45,205, 69,225,244,225, + 235,225,238, 97,129, 48,228,205, 57,232,225,236,230,247,233,228, + 244,104,128,255,148,239,242,229,225,110,128, 49, 81,237,225,235, + 235,225,238,244,232,225,105,128, 14, 78,243,237,225,236,108, 2, + 205,100,205,111,232,233,242,225,231,225,238, 97,128, 48,131,235, + 225,244,225,235,225,238, 97,129, 48,227,205,124,232,225,236,230, + 247,233,228,244,104,128,255,108,244,227,249,242,233,236,236,233, + 99,128, 4, 99,227,233,242, 99, 2,205,157,205,162,236,101,128, + 36,232,245,237,230,236,229,120,128, 1,119,100, 2,205,177,205, + 187,233,229,242,229,243,233,115,128, 0,255,239,116, 2,205,194, + 205,203,225,227,227,229,238,116,128, 30,143,226,229,236,239,119, + 128, 30,245,101, 7,205,227,206,235,206,244,207, 6,207, 38,207, + 114,207,165,104, 8,205,245,205,254,206, 32,206, 46,206,119,206, + 135,206,194,206,212,225,242,225,226,233, 99,128, 6, 74,226,225, + 242,242,229,101, 2,206, 9,206, 18,225,242,225,226,233, 99,128, + 6,210,230,233,238,225,236,225,242,225,226,233, 99,128,251,175, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,242,232,225, + 237,250,225,225,226,239,246,101, 4,206, 65,206, 74,206, 88,206, + 104,225,242,225,226,233, 99,128, 6, 38,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,138,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,139,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,254,140,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,254,243,237,101, 2,206,142,206,155,228,233, + 225,236,225,242,225,226,233, 99,128,254,244,229,237,105, 2,206, + 163,206,178,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 252,221,243,239,236,225,244,229,228,225,242,225,226,233, 99,128, + 252, 88,238,239,239,238,230,233,238,225,236,225,242,225,226,233, + 99,128,252,148,244,232,242,229,229,228,239,244,243,226,229,236, + 239,247,225,242,225,226,233, 99,128, 6,209,235,239,242,229,225, + 110,128, 49, 86,110,129, 0,165,206,250,237,239,238,239,243,240, + 225,227,101,128,255,229,111, 2,207, 12,207, 21,235,239,242,229, + 225,110,128, 49, 85,242,233,238,232,233,229,245,232,235,239,242, + 229,225,110,128, 49,134,114, 3,207, 46,207, 82,207, 94,225,232, + 226,229,238,249,239,237,111, 2,207, 60,207, 69,232,229,226,242, + 229,119,128, 5,170,236,229,230,244,232,229,226,242,229,119,128, + 5,170,233,227,249,242,233,236,236,233, 99,128, 4, 75,245,228, + 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, + 4,249,243,233,229,245,238,103, 3,207,127,207,136,207,152,235, + 239,242,229,225,110,128, 49,129,240,225,238,243,233,239,243,235, + 239,242,229,225,110,128, 49,131,243,233,239,243,235,239,242,229, + 225,110,128, 49,130,244,233,246,232,229,226,242,229,119,128, 5, + 154,231,242,225,246,101,128, 30,243,232,239,239,107,129, 1,180, + 207,194,225,226,239,246,101,128, 30,247,105, 5,207,214,207,225, + 207,236,207,245,207,253,225,242,237,229,238,233,225,110,128, 5, + 117,227,249,242,233,236,236,233, 99,128, 4, 87,235,239,242,229, + 225,110,128, 49, 98,238,249,225,238,103,128, 38, 47,247,238,225, + 242,237,229,238,233,225,110,128, 5,130,237,239,238,239,243,240, + 225,227,101,128,255, 89,111, 7,208, 38,208,108,208,119,208,129, + 208,167,208,213,208,222,100,131, 5,217,208, 48,208, 68,208, 77, + 228,225,231,229,243,104,129,251, 57,208, 59,232,229,226,242,229, + 119,128,251, 57,232,229,226,242,229,119,128, 5,217,249,239,100, + 2,208, 85,208, 94,232,229,226,242,229,119,128, 5,242,240,225, + 244,225,232,232,229,226,242,229,119,128,251, 31,232,233,242,225, + 231,225,238, 97,128, 48,136,233,235,239,242,229,225,110,128, 49, + 137,107, 2,208,135,208,159,225,244,225,235,225,238, 97,129, 48, + 232,208,147,232,225,236,230,247,233,228,244,104,128,255,150,239, + 242,229,225,110,128, 49, 91,243,237,225,236,108, 2,208,177,208, + 188,232,233,242,225,231,225,238, 97,128, 48,135,235,225,244,225, + 235,225,238, 97,129, 48,231,208,201,232,225,236,230,247,233,228, + 244,104,128,255,110,244,231,242,229,229,107,128, 3,243,121, 2, + 208,228,209, 9, 97, 2,208,234,208,244,229,235,239,242,229,225, + 110,128, 49,136,107, 2,208,250,209, 2,239,242,229,225,110,128, + 49,135,244,232,225,105,128, 14, 34,233,238,231,244,232,225,105, + 128, 14, 13,112, 2,209, 25,209, 32,225,242,229,110,128, 36,180, + 239,231,229,231,242,225,237,237,229,238,105,129, 3,122,209, 48, + 231,242,229,229,235,227,237, 98,128, 3, 69,114,129, 1,166,209, + 65,233,238,103,128, 30,153,243,245,240,229,242,233,239,114,128, + 2,184,116, 2,209, 88,209, 95,233,236,228,101,128, 30,249,245, + 242,238,229,100,128, 2,142,117, 5,209,115,209,126,209,136,209, + 174,210, 50,232,233,242,225,231,225,238, 97,128, 48,134,233,235, + 239,242,229,225,110,128, 49,140,107, 2,209,142,209,166,225,244, + 225,235,225,238, 97,129, 48,230,209,154,232,225,236,230,247,233, + 228,244,104,128,255,149,239,242,229,225,110,128, 49, 96,115, 3, + 209,182,209,220,210, 5,226,233,103, 2,209,190,209,201,227,249, + 242,233,236,236,233, 99,128, 4,107,233,239,244,233,230,233,229, + 228,227,249,242,233,236,236,233, 99,128, 4,109,236,233,244,244, + 236,101, 2,209,231,209,242,227,249,242,233,236,236,233, 99,128, + 4,103,233,239,244,233,230,233,229,228,227,249,242,233,236,236, + 233, 99,128, 4,105,237,225,236,108, 2,210, 14,210, 25,232,233, + 242,225,231,225,238, 97,128, 48,133,235,225,244,225,235,225,238, + 97,129, 48,229,210, 38,232,225,236,230,247,233,228,244,104,128, + 255,109,249,101, 2,210, 57,210, 66,235,239,242,229,225,110,128, + 49,139,239,235,239,242,229,225,110,128, 49,138,249, 97, 2,210, + 83,210, 93,226,229,238,231,225,236,105,128, 9,223,228,229,246, + 97,128, 9, 95,122,142, 0,122,210,132,211,140,211,151,211,194, + 211,221,213, 0,213,108,213,150,213,162,213,174,213,202,213,210, + 213,226,213,235, 97, 10,210,154,210,165,210,172,210,179,210,190, + 211, 12,211, 42,211, 53,211, 89,211,101,225,242,237,229,238,233, + 225,110,128, 5,102,227,245,244,101,128, 1,122,228,229,246, 97, + 128, 9, 91,231,245,242,237,245,235,232,105,128, 10, 91,104, 4, + 210,200,210,209,210,223,210,253,225,242,225,226,233, 99,128, 6, + 56,230,233,238,225,236,225,242,225,226,233, 99,128,254,198,105, + 2,210,229,210,244,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,199,242,225,231,225,238, 97,128, 48, 86,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,254,200,233,110, 2,211, + 19,211, 28,225,242,225,226,233, 99,128, 6, 50,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,176,235,225,244,225,235,225, + 238, 97,128, 48,182,241,229,102, 2,211, 61,211, 75,231,225,228, + 239,236,232,229,226,242,229,119,128, 5,149,241,225,244,225,238, + 232,229,226,242,229,119,128, 5,148,242,241,225,232,229,226,242, + 229,119,128, 5,152,249,233,110,130, 5,214,211,111,211,131,228, + 225,231,229,243,104,129,251, 54,211,122,232,229,226,242,229,119, + 128,251, 54,232,229,226,242,229,119,128, 5,214,226,239,240,239, + 237,239,230,111,128, 49, 23, 99, 3,211,159,211,166,211,188,225, + 242,239,110,128, 1,126,233,242, 99, 2,211,174,211,179,236,101, + 128, 36,233,245,237,230,236,229,120,128, 30,145,245,242,108,128, + 2,145,228,239,116,130, 1,124,211,204,211,213,225,227,227,229, + 238,116,128, 1,124,226,229,236,239,119,128, 30,147,101, 6,211, + 235,211,246,212, 33,212, 44,212, 55,212,251,227,249,242,233,236, + 236,233, 99,128, 4, 55,100, 2,211,252,212, 15,229,243,227,229, + 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,153,233, + 229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, 4, + 223,232,233,242,225,231,225,238, 97,128, 48, 92,235,225,244,225, + 235,225,238, 97,128, 48,188,242,111,140, 0, 48,212, 84,212, 93, + 212,103,212,110,212,135,212,148,212,159,212,171,212,182,212,192, + 212,203,212,210,225,242,225,226,233, 99,128, 6, 96,226,229,238, + 231,225,236,105,128, 9,230,228,229,246, 97,128, 9,102,231,117, + 2,212,117,212,126,234,225,242,225,244,105,128, 10,230,242,237, + 245,235,232,105,128, 10,102,232,225,227,235,225,242,225,226,233, + 99,128, 6, 96,233,238,230,229,242,233,239,114,128, 32,128,237, + 239,238,239,243,240,225,227,101,128,255, 16,239,236,228,243,244, + 249,236,101,128,247, 48,240,229,242,243,233,225,110,128, 6,240, + 243,245,240,229,242,233,239,114,128, 32,112,244,232,225,105,128, + 14, 80,247,233,228,244,104, 3,212,222,212,231,212,243,234,239, + 233,238,229,114,128,254,255,238,239,238,234,239,233,238,229,114, + 128, 32, 12,243,240,225,227,101,128, 32, 11,244, 97,128, 3,182, + 104, 2,213, 6,213, 17,226,239,240,239,237,239,230,111,128, 49, + 19,101, 4,213, 27,213, 38,213, 54,213, 65,225,242,237,229,238, + 233,225,110,128, 5,106,226,242,229,246,229,227,249,242,233,236, + 236,233, 99,128, 4,194,227,249,242,233,236,236,233, 99,128, 4, + 54,100, 2,213, 71,213, 90,229,243,227,229,238,228,229,242,227, + 249,242,233,236,236,233, 99,128, 4,151,233,229,242,229,243,233, + 243,227,249,242,233,236,236,233, 99,128, 4,221,105, 3,213,116, + 213,127,213,138,232,233,242,225,231,225,238, 97,128, 48, 88,235, + 225,244,225,235,225,238, 97,128, 48,184,238,239,242,232,229,226, + 242,229,119,128, 5,174,236,233,238,229,226,229,236,239,119,128, + 30,149,237,239,238,239,243,240,225,227,101,128,255, 90,111, 2, + 213,180,213,191,232,233,242,225,231,225,238, 97,128, 48, 94,235, + 225,244,225,235,225,238, 97,128, 48,190,240,225,242,229,110,128, + 36,181,242,229,244,242,239,230,236,229,248,232,239,239,107,128, + 2,144,243,244,242,239,235,101,128, 1,182,117, 2,213,241,213, + 252,232,233,242,225,231,225,238, 97,128, 48, 90,235,225,244,225, + 235,225,238, 97,128, 48,186 + }; + + + /* + * This function searches the compressed table efficiently. + */ + static unsigned long + ft_get_adobe_glyph_index( const char* name, + const char* limit ) + { + int c = 0; + int count, min, max; + const unsigned char* p = ft_adobe_glyph_list; + + + if ( name == 0 || name >= limit ) + goto NotFound; + + c = *name++; + count = p[1]; + p += 2; + + min = 0; + max = count; + + while ( min < max ) + { + int mid = ( min + max ) >> 1; + const unsigned char* q = p + mid * 2; + int c2; + + + q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); + + c2 = q[0] & 127; + if ( c2 == c ) + { + p = q; + goto Found; + } + if ( c2 < c ) + min = mid + 1; + else + max = mid; + } + goto NotFound; + + Found: + for (;;) + { + /* assert (*p & 127) == c */ + + if ( name >= limit ) + { + if ( (p[0] & 128) == 0 && + (p[1] & 128) != 0 ) + return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); + + goto NotFound; + } + c = *name++; + if ( p[0] & 128 ) + { + p++; + if ( c != (p[0] & 127) ) + goto NotFound; + + continue; + } + + p++; + count = p[0] & 127; + if ( p[0] & 128 ) + p += 2; + + p++; + + for ( ; count > 0; count--, p += 2 ) + { + int offset = ( (int)p[0] << 8 ) | p[1]; + const unsigned char* q = ft_adobe_glyph_list + offset; + + if ( c == ( q[0] & 127 ) ) + { + p = q; + goto NextIter; + } + } + goto NotFound; + + NextIter: + ; + } + + NotFound: + return 0; + } + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/psnames/rules.mk b/alienblaster/project/jni/freetype/src/psnames/rules.mk new file mode 100644 index 000000000..06bd161e3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/psnames/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 PSNames driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# PSNames driver directory +# +PSNAMES_DIR := $(SRC_DIR)/psnames + + +# compilation flags for the driver +# +PSNAMES_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR)) + + +# PSNames driver sources (i.e., C files) +# +PSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c + + +# PSNames driver headers +# +PSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \ + $(PSNAMES_DIR)/pstables.h \ + $(PSNAMES_DIR)/psnamerr.h + + +# PSNames driver object(s) +# +# PSNAMES_DRV_OBJ_M is used during `multi' builds +# PSNAMES_DRV_OBJ_S is used during `single' builds +# +PSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O) +PSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O + +# PSNames driver source file for single build +# +PSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psmodule.c + + +# PSNames driver - single object +# +$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \ + $(FREETYPE_H) $(PSNAMES_DRV_H) + $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S)) + + +# PSNames driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H) + $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S) +DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/raster/Jamfile b/alienblaster/project/jni/freetype/src/raster/Jamfile new file mode 100644 index 000000000..4f60e87c7 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/raster Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) raster ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftraster ftrend1 rastpic ; + } + else + { + _sources = raster ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/raster Jamfile diff --git a/alienblaster/project/jni/freetype/src/raster/ftmisc.h b/alienblaster/project/jni/freetype/src/raster/ftmisc.h new file mode 100644 index 000000000..f04b5404b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/ftmisc.h @@ -0,0 +1,109 @@ +/***************************************************************************/ +/* */ +/* ftmisc.h */ +/* */ +/* Miscellaneous macros for stand-alone rasterizer (specification */ +/* only). */ +/* */ +/* Copyright 2005, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /***************************************************/ + /* */ + /* This file is *not* portable! You have to adapt */ + /* its definitions to your platform. */ + /* */ + /***************************************************/ + +#ifndef __FTMISC_H__ +#define __FTMISC_H__ + + /* memset */ +#include FT_CONFIG_STANDARD_LIBRARY_H + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#define FT_LOCAL_DEF( x ) static x + + /* from include/freetype2/fttypes.h */ + + typedef unsigned char FT_Byte; + typedef signed int FT_Int; + typedef unsigned int FT_UInt; + typedef signed long FT_Long; + typedef unsigned long FT_ULong; + typedef signed long FT_F26Dot6; + typedef int FT_Error; + +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /* from include/freetype2/ftsystem.h */ + + typedef struct FT_MemoryRec_* FT_Memory; + + typedef void* (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + typedef void (*FT_Free_Func)( FT_Memory memory, + void* block ); + + typedef void* (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + typedef struct FT_MemoryRec_ + { + void* user; + + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemoryRec; + + /* from src/ftcalc.c */ + +#include <inttypes.h> + + typedef int64_t FT_Int64; + + static FT_Long + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* __FTMISC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/raster/ftraster.c b/alienblaster/project/jni/freetype/src/raster/ftraster.c new file mode 100644 index 000000000..23ad59265 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/ftraster.c @@ -0,0 +1,3563 @@ +/***************************************************************************/ +/* */ +/* ftraster.c */ +/* */ +/* The FreeType glyph rasterizer (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file can be compiled without the rest of the FreeType engine, by */ + /* defining the _STANDALONE_ macro when compiling it. You also need to */ + /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir) */ + /* directory. Typically, you should do something like */ + /* */ + /* - copy `src/raster/ftraster.c' (this file) to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' */ + /* to your current directory */ + /* */ + /* - compile `ftraster' with the _STANDALONE_ macro defined, as in */ + /* */ + /* cc -c -D_STANDALONE_ ftraster.c */ + /* */ + /* The renderer can be initialized with a call to */ + /* `ft_standard_raster.raster_new'; a bitmap can be generated */ + /* with a call to `ft_standard_raster.raster_render'. */ + /* */ + /* See the comments and documentation in the file `ftimage.h' for more */ + /* details on how the raster works. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is a rewrite of the FreeType 1.x scan-line converter */ + /* */ + /*************************************************************************/ + +#ifdef _STANDALONE_ + +#define FT_CONFIG_STANDARD_LIBRARY_H <stdlib.h> + +#include <string.h> /* for memset */ + +#include "ftmisc.h" +#include "ftimage.h" + +#else /* !_STANDALONE_ */ + +#include <ft2build.h> +#include "ftraster.h" +#include FT_INTERNAL_CALC_H /* for FT_MulDiv only */ + +#include "rastpic.h" + +#endif /* !_STANDALONE_ */ + + + /*************************************************************************/ + /* */ + /* A simple technical note on how the raster works */ + /* ----------------------------------------------- */ + /* */ + /* Converting an outline into a bitmap is achieved in several steps: */ + /* */ + /* 1 - Decomposing the outline into successive `profiles'. Each */ + /* profile is simply an array of scanline intersections on a given */ + /* dimension. A profile's main attributes are */ + /* */ + /* o its scanline position boundaries, i.e. `Ymin' and `Ymax' */ + /* */ + /* o an array of intersection coordinates for each scanline */ + /* between `Ymin' and `Ymax' */ + /* */ + /* o a direction, indicating whether it was built going `up' or */ + /* `down', as this is very important for filling rules */ + /* */ + /* o its drop-out mode */ + /* */ + /* 2 - Sweeping the target map's scanlines in order to compute segment */ + /* `spans' which are then filled. Additionally, this pass */ + /* performs drop-out control. */ + /* */ + /* The outline data is parsed during step 1 only. The profiles are */ + /* built from the bottom of the render pool, used as a stack. The */ + /* following graphics shows the profile list under construction: */ + /* */ + /* __________________________________________________________ _ _ */ + /* | | | | | */ + /* | profile | coordinates for | profile | coordinates for |--> */ + /* | 1 | profile 1 | 2 | profile 2 |--> */ + /* |_________|_________________|_________|_________________|__ _ _ */ + /* */ + /* ^ ^ */ + /* | | */ + /* start of render pool top */ + /* */ + /* The top of the profile stack is kept in the `top' variable. */ + /* */ + /* As you can see, a profile record is pushed on top of the render */ + /* pool, which is then followed by its coordinates/intersections. If */ + /* a change of direction is detected in the outline, a new profile is */ + /* generated until the end of the outline. */ + /* */ + /* Note that when all profiles have been generated, the function */ + /* Finalize_Profile_Table() is used to record, for each profile, its */ + /* bottom-most scanline as well as the scanline above its upmost */ + /* boundary. These positions are called `y-turns' because they (sort */ + /* of) correspond to local extrema. They are stored in a sorted list */ + /* built from the top of the render pool as a downwards stack: */ + /* */ + /* _ _ _______________________________________ */ + /* | | */ + /* <--| sorted list of | */ + /* <--| extrema scanlines | */ + /* _ _ __________________|____________________| */ + /* */ + /* ^ ^ */ + /* | | */ + /* maxBuff sizeBuff = end of pool */ + /* */ + /* This list is later used during the sweep phase in order to */ + /* optimize performance (see technical note on the sweep below). */ + /* */ + /* Of course, the raster detects whether the two stacks collide and */ + /* handles the situation properly. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** CONFIGURATION MACROS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /* define DEBUG_RASTER if you want to compile a debugging version */ +/* #define DEBUG_RASTER */ + + /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */ + /* 5-levels anti-aliasing */ +/* #define FT_RASTER_OPTION_ANTI_ALIASING */ + + /* The size of the two-lines intermediate bitmap used */ + /* for anti-aliasing, in bytes. */ +#define RASTER_GRAY_LINES 2048 + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** OTHER MACROS (do not change) **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_raster + + +#ifdef _STANDALONE_ + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + /* Disable the tracing mechanism for simplicity -- developers can */ + /* activate it easily by redefining these two macros. */ +#ifndef FT_ERROR +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ +#endif + +#ifndef FT_TRACE +#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */ +#endif + +#define Raster_Err_None 0 +#define Raster_Err_Not_Ini -1 +#define Raster_Err_Overflow -2 +#define Raster_Err_Neg_Height -3 +#define Raster_Err_Invalid -4 +#define Raster_Err_Unsupported -5 + +#define ft_memset memset + +#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \ + raster_reset_, raster_set_mode_, \ + raster_render_, raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + +#else /* !_STANDALONE_ */ + + +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H /* for FT_TRACE() and FT_ERROR() */ + +#include "rasterrs.h" + +#define Raster_Err_None Raster_Err_Ok +#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized +#define Raster_Err_Overflow Raster_Err_Raster_Overflow +#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height +#define Raster_Err_Invalid Raster_Err_Invalid_Outline +#define Raster_Err_Unsupported Raster_Err_Cannot_Render_Glyph + + +#endif /* !_STANDALONE_ */ + + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + + /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */ + /* typically a small value and the result of a*b is known to fit into */ + /* 32 bits. */ +#define FMulDiv( a, b, c ) ( (a) * (b) / (c) ) + + /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */ + /* for clipping computations. It simply uses the FT_MulDiv() function */ + /* defined in `ftcalc.h'. */ +#define SMulDiv FT_MulDiv + + /* The rasterizer is a very general purpose component; please leave */ + /* the following redefinitions there (you never know your target */ + /* environment). */ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + +#ifndef SUCCESS +#define SUCCESS 0 +#endif + +#ifndef FAILURE +#define FAILURE 1 +#endif + + +#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */ + /* Setting this constant to more than 32 is a */ + /* pure waste of space. */ + +#define Pixel_Bits 6 /* fractional bits of *input* coordinates */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SIMPLE TYPE DECLARATIONS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + typedef int Int; + typedef unsigned int UInt; + typedef short Short; + typedef unsigned short UShort, *PUShort; + typedef long Long, *PLong; + typedef unsigned long ULong; + + typedef unsigned char Byte, *PByte; + typedef char Bool; + + + typedef union Alignment_ + { + long l; + void* p; + void (*f)(void); + + } Alignment, *PAlignment; + + + typedef struct TPoint_ + { + Long x; + Long y; + + } TPoint; + + + /* values for the `flags' bit field */ +#define Flow_Up 0x8 +#define Overshoot_Top 0x10 +#define Overshoot_Bottom 0x20 + + + /* States of each line, arc, and profile */ + typedef enum TStates_ + { + Unknown_State, + Ascending_State, + Descending_State, + Flat_State + + } TStates; + + + typedef struct TProfile_ TProfile; + typedef TProfile* PProfile; + + struct TProfile_ + { + FT_F26Dot6 X; /* current coordinate during sweep */ + PProfile link; /* link to next profile (various purposes) */ + PLong offset; /* start of profile's data in render pool */ + unsigned flags; /* Bit 0-2: drop-out mode */ + /* Bit 3: profile orientation (up/down) */ + /* Bit 4: is top profile? */ + /* Bit 5: is bottom profile? */ + long height; /* profile's height in scanlines */ + long start; /* profile's starting scanline */ + + unsigned countL; /* number of lines to step before this */ + /* profile becomes drawable */ + + PProfile next; /* next profile in same contour, used */ + /* during drop-out control */ + }; + + typedef PProfile TProfileList; + typedef PProfile* PProfileList; + + + /* Simple record used to implement a stack of bands, required */ + /* by the sub-banding mechanism */ + typedef struct TBand_ + { + Short y_min; /* band's minimum */ + Short y_max; /* band's maximum */ + + } TBand; + + +#define AlignProfileSize \ + ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) ) + + +#ifdef FT_STATIC_RASTER + + +#define RAS_ARGS /* void */ +#define RAS_ARG /* void */ + +#define RAS_VARS /* void */ +#define RAS_VAR /* void */ + +#define FT_UNUSED_RASTER do { } while ( 0 ) + + +#else /* !FT_STATIC_RASTER */ + + +#define RAS_ARGS PWorker worker, +#define RAS_ARG PWorker worker + +#define RAS_VARS worker, +#define RAS_VAR worker + +#define FT_UNUSED_RASTER FT_UNUSED( worker ) + + +#endif /* !FT_STATIC_RASTER */ + + + typedef struct TWorker_ TWorker, *PWorker; + + + /* prototypes used for sweep function dispatch */ + typedef void + Function_Sweep_Init( RAS_ARGS Short* min, + Short* max ); + + typedef void + Function_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ); + + typedef void + Function_Sweep_Step( RAS_ARG ); + + + /* NOTE: These operations are only valid on 2's complement processors */ + +#define FLOOR( x ) ( (x) & -ras.precision ) +#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision ) +#define TRUNC( x ) ( (signed long)(x) >> ras.precision_bits ) +#define FRAC( x ) ( (x) & ( ras.precision - 1 ) ) +#define SCALED( x ) ( ( (x) << ras.scale_shift ) - ras.precision_half ) + +#define IS_BOTTOM_OVERSHOOT( x ) ( CEILING( x ) - x >= ras.precision_half ) +#define IS_TOP_OVERSHOOT( x ) ( x - FLOOR( x ) >= ras.precision_half ) + + /* The most used variables are positioned at the top of the structure. */ + /* Thus, their offset can be coded with less opcodes, resulting in a */ + /* smaller executable. */ + + struct TWorker_ + { + 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 */ + + PLong buff; /* The profiles buffer */ + PLong sizeBuff; /* Render pool size */ + PLong maxBuff; /* Profiles buffer size */ + PLong top; /* Current cursor in buffer */ + + FT_Error error; + + Int numTurns; /* number of Y-turns in outline */ + + TPoint* arc; /* current Bezier arc pointer */ + + UShort bWidth; /* target bitmap width */ + PByte bTarget; /* target bitmap buffer */ + PByte gTarget; /* target pixmap buffer */ + + Long lastX, lastY; + Long minY, maxY; + + UShort num_Profs; /* current number of profiles */ + + Bool fresh; /* signals a fresh new profile which */ + /* `start' field must be completed */ + Bool joint; /* signals that the last arc ended */ + /* exactly on a scanline. Allows */ + /* removal of doublets */ + PProfile cProfile; /* current profile */ + PProfile fProfile; /* head of linked list of profiles */ + PProfile gProfile; /* contour's first profile in case */ + /* of impact */ + + TStates state; /* rendering state */ + + FT_Bitmap target; /* description of target bit/pixmap */ + FT_Outline outline; + + Long traceOfs; /* current offset in target bitmap */ + Long traceG; /* current offset in target pixmap */ + + Short traceIncr; /* sweep's increment in target bitmap */ + + Short gray_min_x; /* current min x during gray rendering */ + Short gray_max_x; /* current max x during gray rendering */ + + /* dispatch variables */ + + Function_Sweep_Init* Proc_Sweep_Init; + Function_Sweep_Span* Proc_Sweep_Span; + Function_Sweep_Span* Proc_Sweep_Drop; + Function_Sweep_Step* Proc_Sweep_Step; + + Byte dropOutControl; /* current drop_out control method */ + + Bool second_pass; /* indicates whether a horizontal pass */ + /* should be performed to control */ + /* drop-out accurately when calling */ + /* Render_Glyph. Note that there is */ + /* no horizontal pass during gray */ + /* rendering. */ + + TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */ + + TBand band_stack[16]; /* band stack used for sub-banding */ + Int band_top; /* band stack top */ + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + Byte* grays; + + Byte gray_lines[RASTER_GRAY_LINES]; + /* Intermediate table used to render the */ + /* graylevels pixmaps. */ + /* gray_lines is a buffer holding two */ + /* monochrome scanlines */ + + Short gray_width; /* width in bytes of one monochrome */ + /* intermediate scanline of gray_lines. */ + /* Each gray pixel takes 2 bits long there */ + + /* The gray_lines must hold 2 lines, thus with size */ + /* in bytes of at least `gray_width*2'. */ + +#endif /* FT_RASTER_ANTI_ALIASING */ + + }; + + + typedef struct TRaster_ + { + char* buffer; + long buffer_size; + void* memory; + PWorker worker; + Byte grays[5]; + Short gray_width; + + } TRaster, *PRaster; + +#ifdef FT_STATIC_RASTER + + static TWorker cur_ras; +#define ras cur_ras + +#else /* !FT_STATIC_RASTER */ + +#define ras (*worker) + +#endif /* !FT_STATIC_RASTER */ + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + /* A lookup table used to quickly count set bits in four gray 2x2 */ + /* cells. The values of the table have been produced with the */ + /* following code: */ + /* */ + /* for ( i = 0; i < 256; i++ ) */ + /* { */ + /* l = 0; */ + /* j = i; */ + /* */ + /* for ( c = 0; c < 4; c++ ) */ + /* { */ + /* l <<= 4; */ + /* */ + /* if ( j & 0x80 ) l++; */ + /* if ( j & 0x40 ) l++; */ + /* */ + /* j = ( j << 2 ) & 0xFF; */ + /* } */ + /* printf( "0x%04X", l ); */ + /* } */ + /* */ + + static const short count_table[256] = + { + 0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012, + 0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022, + 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112, + 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122, + 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112, + 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122, + 0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212, + 0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222, + 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012, + 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022, + 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, + 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, + 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, + 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, + 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212, + 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222, + 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012, + 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022, + 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, + 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, + 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112, + 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122, + 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212, + 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222, + 0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012, + 0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022, + 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112, + 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122, + 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112, + 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122, + 0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212, + 0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222 + }; + +#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ + + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** PROFILES COMPUTATION **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Set_High_Precision */ + /* */ + /* <Description> */ + /* Set precision variables according to param flag. */ + /* */ + /* <Input> */ + /* High :: Set to True for high precision (typically for ppem < 18), */ + /* false otherwise. */ + /* */ + static void + Set_High_Precision( RAS_ARGS Int High ) + { + if ( High ) + { + ras.precision_bits = 12; + ras.precision_step = 256; + ras.precision_jitter = 50; + } + else + { + ras.precision_bits = 6; + ras.precision_step = 32; + ras.precision_jitter = 2; + } + + FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" )); + + ras.precision = 1 << ras.precision_bits; + ras.precision_half = ras.precision / 2; + ras.precision_shift = ras.precision_bits - Pixel_Bits; + ras.precision_mask = -ras.precision; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* New_Profile */ + /* */ + /* <Description> */ + /* Create a new profile in the render pool. */ + /* */ + /* <Input> */ + /* aState :: The state/orientation of the new profile. */ + /* */ + /* overshoot :: Whether the profile's unrounded start position */ + /* differs by at least a half pixel. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow or of incoherent */ + /* profile. */ + /* */ + static Bool + New_Profile( RAS_ARGS TStates aState, + Bool overshoot ) + { + if ( !ras.fProfile ) + { + ras.cProfile = (PProfile)ras.top; + ras.fProfile = ras.cProfile; + ras.top += AlignProfileSize; + } + + if ( ras.top >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + ras.cProfile->flags = 0; + ras.cProfile->start = 0; + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + ras.cProfile->link = (PProfile)0; + ras.cProfile->next = (PProfile)0; + ras.cProfile->flags = ras.dropOutControl; + + switch ( aState ) + { + case Ascending_State: + ras.cProfile->flags |= Flow_Up; + if ( overshoot ) + ras.cProfile->flags |= Overshoot_Bottom; + + FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile )); + break; + + case Descending_State: + if ( overshoot ) + ras.cProfile->flags |= Overshoot_Top; + FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile )); + break; + + default: + FT_ERROR(( "New_Profile: invalid profile direction\n" )); + ras.error = Raster_Err_Invalid; + return FAILURE; + } + + if ( !ras.gProfile ) + ras.gProfile = ras.cProfile; + + ras.state = aState; + ras.fresh = TRUE; + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* End_Profile */ + /* */ + /* <Description> */ + /* Finalize the current profile. */ + /* */ + /* <Input> */ + /* overshoot :: Whether the profile's unrounded end position differs */ + /* by at least a half pixel. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow or incoherency. */ + /* */ + static Bool + End_Profile( RAS_ARGS Bool overshoot ) + { + Long h; + PProfile oldProfile; + + + h = (Long)( ras.top - ras.cProfile->offset ); + + if ( h < 0 ) + { + FT_ERROR(( "End_Profile: negative height encountered\n" )); + ras.error = Raster_Err_Neg_Height; + return FAILURE; + } + + if ( h > 0 ) + { + FT_TRACE6(( "Ending profile %lx, start = %ld, height = %ld\n", + (long)ras.cProfile, ras.cProfile->start, h )); + + ras.cProfile->height = h; + if ( overshoot ) + { + if ( ras.cProfile->flags & Flow_Up ) + ras.cProfile->flags |= Overshoot_Top; + else + ras.cProfile->flags |= Overshoot_Bottom; + } + + oldProfile = ras.cProfile; + ras.cProfile = (PProfile)ras.top; + + ras.top += AlignProfileSize; + + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + + oldProfile->next = ras.cProfile; + ras.num_Profs++; + } + + if ( ras.top >= ras.maxBuff ) + { + FT_TRACE1(( "overflow in End_Profile\n" )); + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Insert_Y_Turn */ + /* */ + /* <Description> */ + /* Insert a salient into the sorted list placed on top of the render */ + /* pool. */ + /* */ + /* <Input> */ + /* New y scanline position. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow. */ + /* */ + static Bool + Insert_Y_Turn( RAS_ARGS Int y ) + { + PLong y_turns; + Int y2, n; + + + n = ras.numTurns - 1; + y_turns = ras.sizeBuff - ras.numTurns; + + /* look for first y value that is <= */ + while ( n >= 0 && y < y_turns[n] ) + n--; + + /* if it is <, simply insert it, ignore if == */ + if ( n >= 0 && y > y_turns[n] ) + while ( n >= 0 ) + { + y2 = (Int)y_turns[n]; + y_turns[n] = y; + y = y2; + n--; + } + + if ( n < 0 ) + { + ras.maxBuff--; + if ( ras.maxBuff <= ras.top ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + ras.numTurns++; + ras.sizeBuff[-ras.numTurns] = y; + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Finalize_Profile_Table */ + /* */ + /* <Description> */ + /* Adjust all links in the profiles list. */ + /* */ + /* <Return> */ + /* SUCCESS on success. FAILURE in case of overflow. */ + /* */ + static Bool + Finalize_Profile_Table( RAS_ARG ) + { + Int bottom, top; + UShort n; + PProfile p; + + + n = ras.num_Profs; + p = ras.fProfile; + + if ( n > 1 && p ) + { + while ( n > 0 ) + { + if ( n > 1 ) + p->link = (PProfile)( p->offset + p->height ); + else + p->link = NULL; + + if ( p->flags & Flow_Up ) + { + bottom = (Int)p->start; + top = (Int)( p->start + p->height - 1 ); + } + else + { + bottom = (Int)( p->start - p->height + 1 ); + top = (Int)p->start; + p->start = bottom; + p->offset += p->height - 1; + } + + if ( Insert_Y_Turn( RAS_VARS bottom ) || + Insert_Y_Turn( RAS_VARS top + 1 ) ) + return FAILURE; + + p = p->link; + n--; + } + } + else + ras.fProfile = NULL; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Split_Conic */ + /* */ + /* <Description> */ + /* Subdivide one conic Bezier into two joint sub-arcs in the Bezier */ + /* stack. */ + /* */ + /* <Input> */ + /* None (subdivided Bezier is taken from the top of the stack). */ + /* */ + /* <Note> */ + /* This routine is the `beef' of this component. It is _the_ inner */ + /* loop that should be optimized to hell to get the best performance. */ + /* */ + static void + Split_Conic( TPoint* base ) + { + Long a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + + /* hand optimized. gcc doesn't seem to be too good at common */ + /* expression substitution and instruction scheduling ;-) */ + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Split_Cubic */ + /* */ + /* <Description> */ + /* Subdivide a third-order Bezier arc into two joint sub-arcs in the */ + /* Bezier stack. */ + /* */ + /* <Note> */ + /* This routine is the `beef' of the component. It is one of _the_ */ + /* inner loops that should be optimized like hell to get the best */ + /* performance. */ + /* */ + static void + Split_Cubic( TPoint* base ) + { + Long a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c + 1 ) >> 1; + base[5].x = b = ( base[3].x + d + 1 ) >> 1; + c = ( c + d + 1 ) >> 1; + base[2].x = a = ( a + c + 1 ) >> 1; + base[4].x = b = ( b + c + 1 ) >> 1; + base[3].x = ( a + b + 1 ) >> 1; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c + 1 ) >> 1; + base[5].y = b = ( base[3].y + d + 1 ) >> 1; + c = ( c + d + 1 ) >> 1; + base[2].y = a = ( a + c + 1 ) >> 1; + base[4].y = b = ( b + c + 1 ) >> 1; + base[3].y = ( a + b + 1 ) >> 1; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_Up */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an ascending line segment and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* x1 :: The x-coordinate of the segment's start point. */ + /* */ + /* y1 :: The y-coordinate of the segment's start point. */ + /* */ + /* x2 :: The x-coordinate of the segment's end point. */ + /* */ + /* y2 :: The y-coordinate of the segment's end point. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Line_Up( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Long Dx, Dy; + Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */ + Long Ix, Rx, Ax; + + PLong top; + + + Dx = x2 - x1; + Dy = y2 - y1; + + if ( Dy <= 0 || y2 < miny || y1 > maxy ) + return SUCCESS; + + if ( y1 < miny ) + { + /* Take care: miny-y1 can be a very large value; we use */ + /* a slow MulDiv function to avoid clipping bugs */ + x1 += SMulDiv( Dx, miny - y1, Dy ); + e1 = (Int)TRUNC( miny ); + f1 = 0; + } + else + { + e1 = (Int)TRUNC( y1 ); + f1 = (Int)FRAC( y1 ); + } + + if ( y2 > maxy ) + { + /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */ + e2 = (Int)TRUNC( maxy ); + f2 = 0; + } + else + { + e2 = (Int)TRUNC( y2 ); + f2 = (Int)FRAC( y2 ); + } + + if ( f1 > 0 ) + { + if ( e1 == e2 ) + return SUCCESS; + else + { + x1 += FMulDiv( Dx, ras.precision - f1, Dy ); + e1 += 1; + } + } + else + if ( ras.joint ) + { + ras.top--; + ras.joint = FALSE; + } + + ras.joint = (char)( f2 == 0 ); + + if ( ras.fresh ) + { + ras.cProfile->start = e1; + ras.fresh = FALSE; + } + + size = e2 - e1 + 1; + if ( ras.top + size >= ras.maxBuff ) + { + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + if ( Dx > 0 ) + { + Ix = ( 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; + + x1 += Ix; + Ax += Rx; + if ( Ax >= 0 ) + { + Ax -= Dy; + x1 += Dx; + } + size--; + } + + ras.top = top; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_Down */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an descending line segment and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* x1 :: The x-coordinate of the segment's start point. */ + /* */ + /* y1 :: The y-coordinate of the segment's start point. */ + /* */ + /* x2 :: The x-coordinate of the segment's end point. */ + /* */ + /* y2 :: The y-coordinate of the segment's end point. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Line_Down( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Bool result, fresh; + + + fresh = ras.fresh; + + result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + return result; + } + + + /* A function type describing the functions used to split Bezier arcs */ + typedef void (*TSplitter)( TPoint* base ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Bezier_Up */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an ascending Bezier arc and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* degree :: The degree of the Bezier arc (either 2 or 3). */ + /* */ + /* splitter :: The function to split Bezier arcs. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Bezier_Up( RAS_ARGS Int degree, + TSplitter splitter, + Long miny, + Long maxy ) + { + Long y1, y2, e, e2, e0; + Short f1; + + TPoint* arc; + TPoint* start_arc; + + PLong top; + + + arc = ras.arc; + y1 = arc[degree].y; + y2 = arc[0].y; + top = ras.top; + + if ( y2 < miny || y1 > maxy ) + goto Fin; + + e2 = FLOOR( y2 ); + + if ( e2 > maxy ) + e2 = maxy; + + e0 = miny; + + if ( y1 < miny ) + e = miny; + else + { + e = CEILING( y1 ); + f1 = (Short)( FRAC( y1 ) ); + e0 = e; + + if ( f1 == 0 ) + { + if ( ras.joint ) + { + top--; + ras.joint = FALSE; + } + + *top++ = arc[degree].x; + + e += ras.precision; + } + } + + if ( ras.fresh ) + { + ras.cProfile->start = TRUNC( e0 ); + ras.fresh = FALSE; + } + + if ( e2 < e ) + goto Fin; + + if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff ) + { + ras.top = top; + ras.error = Raster_Err_Overflow; + return FAILURE; + } + + start_arc = arc; + + while ( arc >= start_arc && e <= e2 ) + { + ras.joint = FALSE; + + y2 = arc[0].y; + + if ( y2 > e ) + { + y1 = arc[degree].y; + if ( y2 - y1 >= ras.precision_step ) + { + splitter( arc ); + arc += degree; + } + else + { + *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x, + e - y1, y2 - y1 ); + arc -= degree; + e += ras.precision; + } + } + else + { + if ( y2 == e ) + { + ras.joint = TRUE; + *top++ = arc[0].x; + + e += ras.precision; + } + arc -= degree; + } + } + + Fin: + ras.top = top; + ras.arc -= degree; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Bezier_Down */ + /* */ + /* <Description> */ + /* Compute the x-coordinates of an descending Bezier arc and store */ + /* them in the render pool. */ + /* */ + /* <Input> */ + /* degree :: The degree of the Bezier arc (either 2 or 3). */ + /* */ + /* splitter :: The function to split Bezier arcs. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Bezier_Down( RAS_ARGS Int degree, + TSplitter splitter, + Long miny, + Long maxy ) + { + TPoint* arc = ras.arc; + Bool result, fresh; + + + arc[0].y = -arc[0].y; + arc[1].y = -arc[1].y; + arc[2].y = -arc[2].y; + if ( degree > 2 ) + arc[3].y = -arc[3].y; + + fresh = ras.fresh; + + result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + arc[0].y = -arc[0].y; + return result; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Line_To */ + /* */ + /* <Description> */ + /* Inject a new line segment and adjust the Profiles list. */ + /* */ + /* <Input> */ + /* x :: The x-coordinate of the segment's end point (its start point */ + /* is stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the segment's end point (its start point */ + /* is stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Line_To( RAS_ARGS Long x, + Long y ) + { + /* First, detect a change of direction */ + + switch ( ras.state ) + { + case Unknown_State: + if ( y > ras.lastY ) + { + if ( New_Profile( RAS_VARS Ascending_State, + IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + else + { + if ( y < ras.lastY ) + if ( New_Profile( RAS_VARS Descending_State, + IS_TOP_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + case Ascending_State: + if ( y < ras.lastY ) + { + if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) || + New_Profile( RAS_VARS Descending_State, + IS_TOP_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + case Descending_State: + if ( y > ras.lastY ) + { + if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) || + New_Profile( RAS_VARS Ascending_State, + IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + default: + ; + } + + /* Then compute the lines */ + + switch ( ras.state ) + { + case Ascending_State: + if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + case Descending_State: + if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + default: + ; + } + + ras.lastX = x; + ras.lastY = y; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Conic_To */ + /* */ + /* <Description> */ + /* Inject a new conic arc and adjust the profile list. */ + /* */ + /* <Input> */ + /* cx :: The x-coordinate of the arc's new control point. */ + /* */ + /* cy :: The y-coordinate of the arc's new control point. */ + /* */ + /* x :: The x-coordinate of the arc's end point (its start point is */ + /* stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the arc's end point (its start point is */ + /* stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Conic_To( RAS_ARGS Long cx, + Long cy, + Long x, + Long y ) + { + Long y1, y2, y3, x3, ymin, ymax; + TStates state_bez; + + + ras.arc = ras.arcs; + ras.arc[2].x = ras.lastX; + ras.arc[2].y = ras.lastY; + ras.arc[1].x = cx; + ras.arc[1].y = cy; + ras.arc[0].x = x; + ras.arc[0].y = y; + + do + { + y1 = ras.arc[2].y; + y2 = ras.arc[1].y; + y3 = ras.arc[0].y; + x3 = ras.arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y3 ) + { + ymin = y1; + ymax = y3; + } + else + { + ymin = y3; + ymax = y1; + } + + if ( y2 < ymin || y2 > ymax ) + { + /* this arc has no given direction, split it! */ + Split_Conic( ras.arc ); + ras.arc += 2; + } + else if ( y1 == y3 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + ras.arc -= 2; + } + else + { + /* the arc is y-monotonous, either ascending or descending */ + /* detect a change of direction */ + state_bez = y1 < y3 ? Ascending_State : Descending_State; + if ( ras.state != state_bez ) + { + Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); + + + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VARS o ) ) + goto Fail; + + /* create a new profile */ + if ( New_Profile( RAS_VARS state_bez, o ) ) + goto Fail; + } + + /* now call the appropriate routine */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) + goto Fail; + } + + } while ( ras.arc >= ras.arcs ); + + ras.lastX = x3; + ras.lastY = y3; + + return SUCCESS; + + Fail: + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Cubic_To */ + /* */ + /* <Description> */ + /* Inject a new cubic arc and adjust the profile list. */ + /* */ + /* <Input> */ + /* cx1 :: The x-coordinate of the arc's first new control point. */ + /* */ + /* cy1 :: The y-coordinate of the arc's first new control point. */ + /* */ + /* cx2 :: The x-coordinate of the arc's second new control point. */ + /* */ + /* cy2 :: The y-coordinate of the arc's second new control point. */ + /* */ + /* x :: The x-coordinate of the arc's end point (its start point is */ + /* stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the arc's end point (its start point is */ + /* stored in `lastY'). */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Cubic_To( RAS_ARGS Long cx1, + Long cy1, + Long cx2, + Long cy2, + Long x, + Long y ) + { + Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2; + TStates state_bez; + + + ras.arc = ras.arcs; + ras.arc[3].x = ras.lastX; + ras.arc[3].y = ras.lastY; + ras.arc[2].x = cx1; + ras.arc[2].y = cy1; + ras.arc[1].x = cx2; + ras.arc[1].y = cy2; + ras.arc[0].x = x; + ras.arc[0].y = y; + + do + { + y1 = ras.arc[3].y; + y2 = ras.arc[2].y; + y3 = ras.arc[1].y; + y4 = ras.arc[0].y; + x4 = ras.arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y4 ) + { + ymin1 = y1; + ymax1 = y4; + } + else + { + ymin1 = y4; + ymax1 = y1; + } + + if ( y2 <= y3 ) + { + ymin2 = y2; + ymax2 = y3; + } + else + { + ymin2 = y3; + ymax2 = y2; + } + + if ( ymin2 < ymin1 || ymax2 > ymax1 ) + { + /* this arc has no given direction, split it! */ + Split_Cubic( ras.arc ); + ras.arc += 3; + } + else if ( y1 == y4 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + ras.arc -= 3; + } + else + { + state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State; + + /* detect a change of direction */ + if ( ras.state != state_bez ) + { + Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); + + + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VARS o ) ) + goto Fail; + + if ( New_Profile( RAS_VARS state_bez, o ) ) + goto Fail; + } + + /* compute intersections */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) + goto Fail; + } + + } while ( ras.arc >= ras.arcs ); + + ras.lastX = x4; + ras.lastY = y4; + + return SUCCESS; + + Fail: + return FAILURE; + } + + +#undef SWAP_ +#define SWAP_( x, y ) do \ + { \ + Long swap = x; \ + \ + \ + x = y; \ + y = swap; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Decompose_Curve */ + /* */ + /* <Description> */ + /* Scan the outline arrays in order to emit individual segments and */ + /* Beziers by calling Line_To() and Bezier_To(). It handles all */ + /* weird cases, like when the first point is off the curve, or when */ + /* there are simply no `on' points in the contour! */ + /* */ + /* <Input> */ + /* first :: The index of the first point in the contour. */ + /* */ + /* last :: The index of the last point in the contour. */ + /* */ + /* flipped :: If set, flip the direction of the curve. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE on error. */ + /* */ + static Bool + Decompose_Curve( RAS_ARGS UShort first, + UShort last, + int flipped ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* points; + FT_Vector* point; + FT_Vector* limit; + char* tags; + + unsigned tag; /* current point's state */ + + + points = ras.outline.points; + limit = points + last; + + v_start.x = SCALED( points[first].x ); + v_start.y = SCALED( points[first].y ); + v_last.x = SCALED( points[last].x ); + v_last.y = SCALED( points[last].y ); + + if ( flipped ) + { + SWAP_( v_start.x, v_start.y ); + SWAP_( v_last.x, v_last.y ); + } + + v_control = v_start; + + point = points + first; + tags = ras.outline.tags + first; + + /* set scan mode if necessary */ + if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE ) + ras.dropOutControl = (Byte)tags[0] >> 5; + + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + ras.lastX = v_start.x; + ras.lastY = v_start.y; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + Long x, y; + + + x = SCALED( point->x ); + y = SCALED( point->y ); + if ( flipped ) + SWAP_( x, y ); + + if ( Line_To( RAS_VARS x, y ) ) + goto Fail; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point[0].x ); + v_control.y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( v_control.x, v_control.y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector v_middle; + Long x, y; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + x = SCALED( point[0].x ); + y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x, y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) ) + goto Fail; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + x ) / 2; + v_middle.y = ( v_control.y + y ) / 2; + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_middle.x, v_middle.y ) ) + goto Fail; + + v_control.x = x; + v_control.y = y; + + goto Do_Conic; + } + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_start.x, v_start.y ) ) + goto Fail; + + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + Long x1, y1, x2, y2, x3, y3; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + x1 = SCALED( point[-2].x ); + y1 = SCALED( point[-2].y ); + x2 = SCALED( point[-1].x ); + y2 = SCALED( point[-1].y ); + x3 = SCALED( point[ 0].x ); + y3 = SCALED( point[ 0].y ); + + if ( flipped ) + { + SWAP_( x1, y1 ); + SWAP_( x2, y2 ); + SWAP_( x3, y3 ); + } + + if ( point <= limit ) + { + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) ) + goto Fail; + continue; + } + + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) ) + goto Fail; + goto Close; + } + } + } + + /* close the contour with a line segment */ + if ( Line_To( RAS_VARS v_start.x, v_start.y ) ) + goto Fail; + + Close: + return SUCCESS; + + Invalid_Outline: + ras.error = Raster_Err_Invalid; + + Fail: + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Convert_Glyph */ + /* */ + /* <Description> */ + /* Convert a glyph into a series of segments and arcs and make a */ + /* profiles list with them. */ + /* */ + /* <Input> */ + /* flipped :: If set, flip the direction of curve. */ + /* */ + /* <Return> */ + /* SUCCESS on success, FAILURE if any error was encountered during */ + /* rendering. */ + /* */ + static Bool + Convert_Glyph( RAS_ARGS int flipped ) + { + int i; + unsigned start; + + PProfile lastProfile; + + + ras.fProfile = NULL; + ras.joint = FALSE; + ras.fresh = FALSE; + + ras.maxBuff = ras.sizeBuff - AlignProfileSize; + + ras.numTurns = 0; + + ras.cProfile = (PProfile)ras.top; + ras.cProfile->offset = ras.top; + ras.num_Profs = 0; + + start = 0; + + for ( i = 0; i < ras.outline.n_contours; i++ ) + { + Bool o; + + + ras.state = Unknown_State; + ras.gProfile = NULL; + + if ( Decompose_Curve( RAS_VARS (unsigned short)start, + ras.outline.contours[i], + flipped ) ) + return FAILURE; + + start = ras.outline.contours[i] + 1; + + /* we must now check whether the extreme arcs join or not */ + if ( FRAC( ras.lastY ) == 0 && + ras.lastY >= ras.minY && + ras.lastY <= ras.maxY ) + if ( ras.gProfile && + ( ras.gProfile->flags & Flow_Up ) == + ( ras.cProfile->flags & Flow_Up ) ) + ras.top--; + /* Note that ras.gProfile can be nil if the contour was too small */ + /* to be drawn. */ + + lastProfile = ras.cProfile; + if ( ras.cProfile->flags & Flow_Up ) + o = IS_TOP_OVERSHOOT( ras.lastY ); + else + o = IS_BOTTOM_OVERSHOOT( ras.lastY ); + if ( End_Profile( RAS_VARS o ) ) + return FAILURE; + + /* close the `next profile in contour' linked list */ + if ( ras.gProfile ) + lastProfile->next = ras.gProfile; + } + + if ( Finalize_Profile_Table( RAS_VAR ) ) + return FAILURE; + + return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SCAN-LINE SWEEPS AND DRAWING **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Init_Linked */ + /* */ + /* Initializes an empty linked list. */ + /* */ + static void + Init_Linked( TProfileList* l ) + { + *l = NULL; + } + + + /*************************************************************************/ + /* */ + /* InsNew */ + /* */ + /* Inserts a new profile in a linked list. */ + /* */ + static void + InsNew( PProfileList list, + PProfile profile ) + { + PProfile *old, current; + Long x; + + + old = list; + current = *old; + x = profile->X; + + while ( current ) + { + if ( x < current->X ) + break; + old = ¤t->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 = ¤t->link; + current = *old; + } + + /* we should never get there, unless the profile was not part of */ + /* the list. */ + } + + + /*************************************************************************/ + /* */ + /* Sort */ + /* */ + /* Sorts a trace list. In 95%, the list is already sorted. We need */ + /* an algorithm which is fast in this case. Bubble sort is enough */ + /* and simple. */ + /* */ + static void + Sort( PProfileList list ) + { + PProfile *old, current, next; + + + /* First, set the new X coordinate of each profile */ + current = *list; + while ( current ) + { + current->X = *current->offset; + current->offset += current->flags & Flow_Up ? 1 : -1; + current->height--; + current = current->link; + } + + /* Then sort them */ + old = list; + current = *old; + + if ( !current ) + return; + + next = current->link; + + while ( next ) + { + if ( current->X <= next->X ) + { + old = ¤t->link; + current = *old; + + if ( !current ) + return; + } + else + { + *old = next; + current->link = next->link; + next->link = current; + + old = list; + current = *old; + } + + next = current->link; + } + } + + + /*************************************************************************/ + /* */ + /* Vertical Sweep Procedure Set */ + /* */ + /* These four routines are used during the vertical black/white sweep */ + /* phase by the generic Draw_Sweep() function. */ + /* */ + /*************************************************************************/ + + static void + Vertical_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + Long pitch = ras.target.pitch; + + FT_UNUSED( max ); + + + ras.traceIncr = (Short)-pitch; + ras.traceOfs = -*min * pitch; + if ( pitch > 0 ) + ras.traceOfs += ( ras.target.rows - 1 ) * pitch; + + ras.gray_min_x = 0; + ras.gray_max_x = 0; + } + + + static void + Vertical_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + int c1, c2; + Byte f1, f2; + Byte* target; + + FT_UNUSED( y ); + FT_UNUSED( left ); + FT_UNUSED( right ); + + + /* Drop-out control */ + + e1 = TRUNC( CEILING( x1 ) ); + + if ( x2 - x1 - ras.precision <= ras.precision_jitter ) + e2 = e1; + else + e2 = TRUNC( FLOOR( x2 ) ); + + if ( e2 >= 0 && e1 < ras.bWidth ) + { + if ( e1 < 0 ) + e1 = 0; + if ( e2 >= ras.bWidth ) + e2 = ras.bWidth - 1; + + c1 = (Short)( e1 >> 3 ); + c2 = (Short)( e2 >> 3 ); + + f1 = (Byte) ( 0xFF >> ( e1 & 7 ) ); + f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) ); + + if ( ras.gray_min_x > c1 ) + ras.gray_min_x = (short)c1; + if ( ras.gray_max_x < c2 ) + ras.gray_max_x = (short)c2; + + target = ras.bTarget + ras.traceOfs + c1; + c2 -= c1; + + if ( c2 > 0 ) + { + target[0] |= f1; + + /* memset() is slower than the following code on many platforms. */ + /* This is due to the fact that, in the vast majority of cases, */ + /* the span length in bytes is relatively small. */ + c2--; + while ( c2 > 0 ) + { + *(++target) = 0xFF; + c2--; + } + target[1] |= f2; + } + else + *target |= ( f1 & f2 ); + } + } + + + static void + Vertical_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + Short c1, f1; + + + /* Drop-out control */ + + /* e2 x2 x1 e1 */ + /* */ + /* ^ | */ + /* | | */ + /* +-------------+---------------------+------------+ */ + /* | | */ + /* | v */ + /* */ + /* pixel contour contour pixel */ + /* center center */ + + /* drop-out mode scan conversion rules (as defined in OpenType) */ + /* --------------------------------------------------------------- */ + /* 0 1, 2, 3 */ + /* 1 1, 2, 4 */ + /* 2 1, 2 */ + /* 3 same as mode 2 */ + /* 4 1, 2, 5 */ + /* 5 1, 2, 6 */ + /* 6, 7 same as mode 2 */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + + /* Drop-out Control Rules #4 and #6 */ + + /* The specification neither provides an exact definition */ + /* of a `stub' nor gives exact rules to exclude them. */ + /* */ + /* Here the constraints we use to recognize a stub. */ + /* */ + /* upper stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Right is the successor of P_Left in that contour */ + /* - y is the top of P_Left and P_Right */ + /* */ + /* lower stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Left is the successor of P_Right in that contour */ + /* - y is the bottom of P_Left */ + /* */ + /* We draw a stub if the following constraints are met. */ + /* */ + /* - for an upper or lower stub, there is top or bottom */ + /* overshoot, respectively */ + /* - the covered interval is greater or equal to a half */ + /* pixel */ + + /* upper stub test */ + if ( left->next == right && + left->height <= 0 && + !( left->flags & Overshoot_Top && + x2 - x1 >= ras.precision_half ) ) + return; + + /* lower stub test */ + if ( right->next == left && + left->start == y && + !( left->flags & Overshoot_Bottom && + x2 - x1 >= ras.precision_half ) ) + return; + + if ( dropOutControl == 1 ) + pxl = e2; + else + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + + /* check that the other pixel isn't set */ + e1 = pxl == e1 ? e2 : e1; + + e1 = TRUNC( e1 ); + + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( e1 >= 0 && e1 < ras.bWidth && + ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) ) + return; + } + else + return; + } + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && e1 < ras.bWidth ) + { + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( ras.gray_min_x > c1 ) + ras.gray_min_x = c1; + if ( ras.gray_max_x < c1 ) + ras.gray_max_x = c1; + + ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 ); + } + } + + + static void + Vertical_Sweep_Step( RAS_ARG ) + { + ras.traceOfs += ras.traceIncr; + } + + + /***********************************************************************/ + /* */ + /* Horizontal Sweep Procedure Set */ + /* */ + /* These four routines are used during the horizontal black/white */ + /* sweep phase by the generic Draw_Sweep() function. */ + /* */ + /***********************************************************************/ + + static void + Horizontal_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + /* nothing, really */ + FT_UNUSED_RASTER; + FT_UNUSED( min ); + FT_UNUSED( max ); + } + + + static void + Horizontal_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + PByte bits; + Byte f1; + + FT_UNUSED( left ); + FT_UNUSED( right ); + + + if ( x2 - x1 < ras.precision ) + { + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 == e2 ) + { + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + e1 = TRUNC( e1 ); + + if ( e1 >= 0 && e1 < ras.target.rows ) + { + PByte p; + + + p = bits - e1*ras.target.pitch; + if ( ras.target.pitch > 0 ) + p += ( ras.target.rows - 1 ) * ras.target.pitch; + + p[0] |= f1; + } + } + } + } + + + static void + Horizontal_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + PByte bits; + Byte f1; + + + /* During the horizontal sweep, we only take care of drop-outs */ + + /* e1 + <-- pixel center */ + /* | */ + /* x1 ---+--> <-- contour */ + /* | */ + /* | */ + /* x2 <--+--- <-- contour */ + /* | */ + /* | */ + /* e2 + <-- pixel center */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + /* see Vertical_Sweep_Drop for details */ + + /* rightmost stub test */ + if ( left->next == right && + left->height <= 0 && + !( left->flags & Overshoot_Top && + x2 - x1 >= ras.precision_half ) ) + return; + + /* leftmost stub test */ + if ( right->next == left && + left->start == y && + !( left->flags & Overshoot_Bottom && + x2 - x1 >= ras.precision_half ) ) + return; + + if ( dropOutControl == 1 ) + pxl = e2; + else + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + + /* check that the other pixel isn't set */ + e1 = pxl == e1 ? e2 : e1; + + e1 = TRUNC( e1 ); + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + bits -= e1 * ras.target.pitch; + if ( ras.target.pitch > 0 ) + bits += ( ras.target.rows - 1 ) * ras.target.pitch; + + if ( e1 >= 0 && + e1 < ras.target.rows && + *bits & f1 ) + return; + } + else + return; + } + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && e1 < ras.target.rows ) + { + bits -= e1 * ras.target.pitch; + if ( ras.target.pitch > 0 ) + bits += ( ras.target.rows - 1 ) * ras.target.pitch; + + bits[0] |= f1; + } + } + + + static void + Horizontal_Sweep_Step( RAS_ARG ) + { + /* Nothing, really */ + FT_UNUSED_RASTER; + } + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + + /*************************************************************************/ + /* */ + /* Vertical Gray Sweep Procedure Set */ + /* */ + /* These two routines are used during the vertical gray-levels sweep */ + /* phase by the generic Draw_Sweep() function. */ + /* */ + /* NOTES */ + /* */ + /* - The target pixmap's width *must* be a multiple of 4. */ + /* */ + /* - You have to use the function Vertical_Sweep_Span() for the gray */ + /* span call. */ + /* */ + /*************************************************************************/ + + static void + Vertical_Gray_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + Long pitch, byte_len; + + + *min = *min & -2; + *max = ( *max + 3 ) & -2; + + ras.traceOfs = 0; + pitch = ras.target.pitch; + byte_len = -pitch; + ras.traceIncr = (Short)byte_len; + ras.traceG = ( *min / 2 ) * byte_len; + + if ( pitch > 0 ) + { + ras.traceG += ( ras.target.rows - 1 ) * pitch; + byte_len = -byte_len; + } + + ras.gray_min_x = (Short)byte_len; + ras.gray_max_x = -(Short)byte_len; + } + + + static void + Vertical_Gray_Sweep_Step( RAS_ARG ) + { + Int c1, c2; + PByte pix, bit, bit2; + short* count = (short*)count_table; + Byte* grays; + + + ras.traceOfs += ras.gray_width; + + if ( ras.traceOfs > ras.gray_width ) + { + pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4; + grays = ras.grays; + + if ( ras.gray_max_x >= 0 ) + { + Long last_pixel = ras.target.width - 1; + Int last_cell = last_pixel >> 2; + Int last_bit = last_pixel & 3; + Bool over = 0; + + + if ( ras.gray_max_x >= last_cell && last_bit != 3 ) + { + ras.gray_max_x = last_cell - 1; + over = 1; + } + + if ( ras.gray_min_x < 0 ) + ras.gray_min_x = 0; + + bit = ras.bTarget + ras.gray_min_x; + bit2 = bit + ras.gray_width; + + c1 = ras.gray_max_x - ras.gray_min_x; + + while ( c1 >= 0 ) + { + c2 = count[*bit] + count[*bit2]; + + if ( c2 ) + { + pix[0] = grays[(c2 >> 12) & 0x000F]; + pix[1] = grays[(c2 >> 8 ) & 0x000F]; + pix[2] = grays[(c2 >> 4 ) & 0x000F]; + pix[3] = grays[ c2 & 0x000F]; + + *bit = 0; + *bit2 = 0; + } + + bit++; + bit2++; + pix += 4; + c1--; + } + + if ( over ) + { + c2 = count[*bit] + count[*bit2]; + if ( c2 ) + { + switch ( last_bit ) + { + case 2: + pix[2] = grays[(c2 >> 4 ) & 0x000F]; + case 1: + pix[1] = grays[(c2 >> 8 ) & 0x000F]; + default: + pix[0] = grays[(c2 >> 12) & 0x000F]; + } + + *bit = 0; + *bit2 = 0; + } + } + } + + ras.traceOfs = 0; + ras.traceG += ras.traceIncr; + + ras.gray_min_x = 32000; + ras.gray_max_x = -32000; + } + } + + + static void + Horizontal_Gray_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + /* nothing, really */ + FT_UNUSED_RASTER; + FT_UNUSED( y ); + FT_UNUSED( x1 ); + FT_UNUSED( x2 ); + FT_UNUSED( left ); + FT_UNUSED( right ); + } + + + static void + Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + PByte pixel; + Byte color; + + + /* During the horizontal sweep, we only take care of drop-outs */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + e1 = e2; + break; + + case 4: /* smart drop-outs including stubs */ + e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + /* see Vertical_Sweep_Drop for details */ + + /* rightmost stub test */ + if ( left->next == right && left->height <= 0 ) + return; + + /* leftmost stub test */ + if ( right->next == left && left->start == y ) + return; + + if ( dropOutControl == 1 ) + e1 = e2; + else + e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + + break; + + default: /* modes 2, 3, 6, 7 */ + return; /* no drop-out control */ + } + } + else + return; + } + + if ( e1 >= 0 ) + { + if ( x2 - x1 >= ras.precision_half ) + color = ras.grays[2]; + else + color = ras.grays[1]; + + e1 = TRUNC( e1 ) / 2; + if ( e1 < ras.target.rows ) + { + pixel = ras.gTarget - e1 * ras.target.pitch + y / 2; + if ( ras.target.pitch > 0 ) + pixel += ( ras.target.rows - 1 ) * ras.target.pitch; + + if ( pixel[0] == ras.grays[0] ) + pixel[0] = color; + } + } + } + + +#endif /* FT_RASTER_OPTION_ANTI_ALIASING */ + + + /*************************************************************************/ + /* */ + /* Generic Sweep Drawing routine */ + /* */ + /*************************************************************************/ + + static Bool + Draw_Sweep( RAS_ARG ) + { + Short y, y_change, y_height; + + PProfile P, Q, P_Left, P_Right; + + Short min_Y, max_Y, top, bottom, dropouts; + + Long x1, x2, xs, e1, e2; + + TProfileList waiting; + TProfileList draw_left, draw_right; + + + /* initialize empty linked lists */ + + Init_Linked( &waiting ); + + Init_Linked( &draw_left ); + Init_Linked( &draw_right ); + + /* first, compute min and max Y */ + + P = ras.fProfile; + max_Y = (Short)TRUNC( ras.minY ); + min_Y = (Short)TRUNC( ras.maxY ); + + while ( P ) + { + Q = P->link; + + bottom = (Short)P->start; + top = (Short)( P->start + P->height - 1 ); + + if ( min_Y > bottom ) + min_Y = bottom; + if ( max_Y < top ) + max_Y = top; + + P->X = 0; + InsNew( &waiting, P ); + + P = Q; + } + + /* check the Y-turns */ + if ( ras.numTurns == 0 ) + { + ras.error = Raster_Err_Invalid; + return FAILURE; + } + + /* now initialize the sweep */ + + ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y ); + + /* then compute the distance of each profile from min_Y */ + + P = waiting; + + while ( P ) + { + P->countL = (UShort)( P->start - min_Y ); + P = P->link; + } + + /* let's go */ + + y = min_Y; + y_height = 0; + + if ( ras.numTurns > 0 && + ras.sizeBuff[-ras.numTurns] == min_Y ) + ras.numTurns--; + + while ( ras.numTurns > 0 ) + { + /* check waiting list for new activations */ + + P = waiting; + + while ( P ) + { + Q = P->link; + P->countL -= y_height; + if ( P->countL == 0 ) + { + DelOld( &waiting, P ); + + if ( P->flags & Flow_Up ) + InsNew( &draw_left, P ); + else + InsNew( &draw_right, P ); + } + + P = Q; + } + + /* sort the drawing lists */ + + Sort( &draw_left ); + Sort( &draw_right ); + + y_change = (Short)ras.sizeBuff[-ras.numTurns--]; + y_height = (Short)( y_change - y ); + + while ( y < y_change ) + { + /* let's trace */ + + dropouts = 0; + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + x1 = P_Left ->X; + x2 = P_Right->X; + + if ( x1 > x2 ) + { + xs = x1; + x1 = x2; + x2 = xs; + } + + e1 = FLOOR( x1 ); + e2 = CEILING( x2 ); + + if ( x2 - x1 <= ras.precision && + e1 != x1 && e2 != x2 ) + { + if ( e1 > e2 || e2 == e1 + ras.precision ) + { + Int dropOutControl = P_Left->flags & 7; + + + if ( dropOutControl != 2 ) + { + /* a drop-out was detected */ + + P_Left ->X = x1; + P_Right->X = x2; + + /* mark profile for drop-out processing */ + P_Left->countL = 1; + dropouts++; + } + + goto Skip_To_Next; + } + } + + ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right ); + + Skip_To_Next: + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + /* handle drop-outs _after_ the span drawing -- */ + /* drop-out processing has been moved out of the loop */ + /* for performance tuning */ + if ( dropouts > 0 ) + goto Scan_DropOuts; + + Next_Line: + + ras.Proc_Sweep_Step( RAS_VAR ); + + y++; + + if ( y < y_change ) + { + Sort( &draw_left ); + Sort( &draw_right ); + } + } + + /* now finalize the profiles that need it */ + + P = draw_left; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_left, P ); + P = Q; + } + + P = draw_right; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_right, P ); + P = Q; + } + } + + /* for gray-scaling, flush the bitmap scanline cache */ + while ( y <= max_Y ) + { + ras.Proc_Sweep_Step( RAS_VAR ); + y++; + } + + return SUCCESS; + + Scan_DropOuts: + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + if ( P_Left->countL ) + { + P_Left->countL = 0; +#if 0 + dropouts--; /* -- this is useful when debugging only */ +#endif + ras.Proc_Sweep_Drop( RAS_VARS y, + P_Left->X, + P_Right->X, + P_Left, + P_Right ); + } + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + goto Next_Line; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Single_Pass */ + /* */ + /* <Description> */ + /* Perform one sweep with sub-banding. */ + /* */ + /* <Input> */ + /* flipped :: If set, flip the direction of the outline. */ + /* */ + /* <Return> */ + /* Renderer error code. */ + /* */ + static int + Render_Single_Pass( RAS_ARGS Bool flipped ) + { + Short i, j, k; + + + while ( ras.band_top >= 0 ) + { + ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision; + ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision; + + ras.top = ras.buff; + + ras.error = Raster_Err_None; + + if ( Convert_Glyph( RAS_VARS flipped ) ) + { + if ( ras.error != Raster_Err_Overflow ) + return FAILURE; + + ras.error = Raster_Err_None; + + /* sub-banding */ + +#ifdef DEBUG_RASTER + ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) ); +#endif + + i = ras.band_stack[ras.band_top].y_min; + j = ras.band_stack[ras.band_top].y_max; + + k = (Short)( ( i + j ) / 2 ); + + if ( ras.band_top >= 7 || k < i ) + { + ras.band_top = 0; + ras.error = Raster_Err_Invalid; + + return ras.error; + } + + ras.band_stack[ras.band_top + 1].y_min = k; + ras.band_stack[ras.band_top + 1].y_max = j; + + ras.band_stack[ras.band_top].y_max = (Short)( k - 1 ); + + ras.band_top++; + } + else + { + if ( ras.fProfile ) + if ( Draw_Sweep( RAS_VAR ) ) + return ras.error; + ras.band_top--; + } + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Glyph */ + /* */ + /* <Description> */ + /* Render a glyph in a bitmap. Sub-banding if needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + Render_Glyph( RAS_ARG ) + { + FT_Error error; + + + Set_High_Precision( RAS_VARS ras.outline.flags & + FT_OUTLINE_HIGH_PRECISION ); + ras.scale_shift = ras.precision_shift; + + if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) + ras.dropOutControl = 2; + else + { + if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) + ras.dropOutControl = 4; + else + ras.dropOutControl = 0; + + if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) + ras.dropOutControl += 1; + } + + ras.second_pass = (FT_Byte)( !( ras.outline.flags & + FT_OUTLINE_SINGLE_PASS ) ); + + /* Vertical Sweep */ + ras.Proc_Sweep_Init = Vertical_Sweep_Init; + ras.Proc_Sweep_Span = Vertical_Sweep_Span; + ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; + ras.Proc_Sweep_Step = Vertical_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (short)( ras.target.rows - 1 ); + + ras.bWidth = (unsigned short)ras.target.width; + ras.bTarget = (Byte*)ras.target.buffer; + + if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 ) + return error; + + /* Horizontal Sweep */ + if ( ras.second_pass && ras.dropOutControl != 2 ) + { + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (short)( ras.target.width - 1 ); + + if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 ) + return error; + } + + return Raster_Err_None; + } + + +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Render_Gray_Glyph */ + /* */ + /* <Description> */ + /* Render a glyph with grayscaling. Sub-banding if needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + Render_Gray_Glyph( RAS_ARG ) + { + Long pixel_width; + FT_Error error; + + + Set_High_Precision( RAS_VARS ras.outline.flags & + FT_OUTLINE_HIGH_PRECISION ); + ras.scale_shift = ras.precision_shift + 1; + + if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) + ras.dropOutControl = 2; + else + { + if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) + ras.dropOutControl = 4; + else + ras.dropOutControl = 0; + + if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) + ras.dropOutControl += 1; + } + + ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS ); + + /* Vertical Sweep */ + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = 2 * ras.target.rows - 1; + + ras.bWidth = ras.gray_width; + pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 ); + + if ( ras.bWidth > pixel_width ) + ras.bWidth = pixel_width; + + ras.bWidth = ras.bWidth * 8; + ras.bTarget = (Byte*)ras.gray_lines; + ras.gTarget = (Byte*)ras.target.buffer; + + ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init; + ras.Proc_Sweep_Span = Vertical_Sweep_Span; + ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; + ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step; + + error = Render_Single_Pass( RAS_VARS 0 ); + if ( error ) + return error; + + /* Horizontal Sweep */ + if ( ras.second_pass && ras.dropOutControl != 2 ) + { + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = ras.target.width * 2 - 1; + + error = Render_Single_Pass( RAS_VARS 1 ); + if ( error ) + return error; + } + + return Raster_Err_None; + } + +#else /* !FT_RASTER_OPTION_ANTI_ALIASING */ + + FT_LOCAL_DEF( FT_Error ) + Render_Gray_Glyph( RAS_ARG ) + { + FT_UNUSED_RASTER; + + return Raster_Err_Unsupported; + } + +#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */ + + + static void + ft_black_init( PRaster raster ) + { +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + FT_UInt n; + + + /* set default 5-levels gray palette */ + for ( n = 0; n < 5; n++ ) + raster->grays[n] = n * 255 / 4; + + raster->gray_width = RASTER_GRAY_LINES / 2; +#else + FT_UNUSED( raster ); +#endif + } + + + /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/ + /**** a static object. *****/ + + +#ifdef _STANDALONE_ + + + static int + ft_black_new( void* memory, + FT_Raster *araster ) + { + static TRaster the_raster; + + + *araster = (FT_Raster)&the_raster; + FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + ft_black_init( &the_raster ); + + return 0; + } + + + static void + ft_black_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + + +#else /* _STANDALONE_ */ + + + static int + ft_black_new( FT_Memory memory, + PRaster *araster ) + { + FT_Error error; + PRaster raster; + + + *araster = 0; + if ( !FT_NEW( raster ) ) + { + raster->memory = memory; + ft_black_init( raster ); + + *araster = raster; + } + + return error; + } + + + static void + ft_black_done( PRaster raster ) + { + FT_Memory memory = (FT_Memory)raster->memory; + FT_FREE( raster ); + } + + +#endif /* _STANDALONE_ */ + + + static void + ft_black_reset( PRaster raster, + char* pool_base, + long pool_size ) + { + if ( raster ) + { + if ( pool_base && pool_size >= (long)sizeof(TWorker) + 2048 ) + { + PWorker worker = (PWorker)pool_base; + + + raster->buffer = pool_base + ( (sizeof ( *worker ) + 7 ) & ~7 ); + raster->buffer_size = ( ( pool_base + pool_size ) - + (char*)raster->buffer ) / sizeof ( Long ); + raster->worker = worker; + } + else + { + raster->buffer = NULL; + raster->buffer_size = 0; + raster->worker = NULL; + } + } + } + + + static void + ft_black_set_mode( PRaster raster, + unsigned long mode, + const char* palette ) + { +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + + if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) ) + { + /* set 5-levels gray palette */ + raster->grays[0] = palette[0]; + raster->grays[1] = palette[1]; + raster->grays[2] = palette[2]; + raster->grays[3] = palette[3]; + raster->grays[4] = palette[4]; + } + +#else + + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( palette ); + +#endif + } + + + static int + ft_black_render( PRaster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + PWorker worker; + + + if ( !raster || !raster->buffer || !raster->buffer_size ) + return Raster_Err_Not_Ini; + + if ( !outline ) + return Raster_Err_Invalid; + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return Raster_Err_None; + + if ( !outline->contours || !outline->points ) + return Raster_Err_Invalid; + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return Raster_Err_Invalid; + + worker = raster->worker; + + /* this version of the raster does not support direct rendering, sorry */ + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + return Raster_Err_Unsupported; + + if ( !target_map ) + return Raster_Err_Invalid; + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return Raster_Err_None; + + if ( !target_map->buffer ) + return Raster_Err_Invalid; + + ras.outline = *outline; + ras.target = *target_map; + + worker->buff = (PLong) raster->buffer; + worker->sizeBuff = worker->buff + + raster->buffer_size / sizeof ( Long ); +#ifdef FT_RASTER_OPTION_ANTI_ALIASING + worker->grays = raster->grays; + worker->gray_width = raster->gray_width; + + FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 ); +#endif + + return ( params->flags & FT_RASTER_FLAG_AA ) + ? Render_Gray_Glyph( RAS_VAR ) + : Render_Glyph( RAS_VAR ); + } + + + FT_DEFINE_RASTER_FUNCS( ft_standard_raster, + FT_GLYPH_FORMAT_OUTLINE, + (FT_Raster_New_Func) ft_black_new, + (FT_Raster_Reset_Func) ft_black_reset, + (FT_Raster_Set_Mode_Func)ft_black_set_mode, + (FT_Raster_Render_Func) ft_black_render, + (FT_Raster_Done_Func) ft_black_done + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/raster/ftraster.h b/alienblaster/project/jni/freetype/src/raster/ftraster.h new file mode 100644 index 000000000..80fe46deb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/ftraster.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ftraster.h */ +/* */ +/* The FreeType glyph rasterizer (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used */ +/* modified and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRASTER_H__ +#define __FTRASTER_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_IMAGE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Uncomment the following line if you are using ftraster.c as a */ + /* standalone module, fully independent of FreeType. */ + /* */ +/* #define _STANDALONE_ */ + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster; + + +FT_END_HEADER + +#endif /* __FTRASTER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/raster/ftrend1.c b/alienblaster/project/jni/freetype/src/raster/ftrend1.c new file mode 100644 index 000000000..1ed8af612 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/ftrend1.c @@ -0,0 +1,291 @@ +/***************************************************************************/ +/* */ +/* ftrend1.c */ +/* */ +/* The FreeType glyph rasterizer interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftrend1.h" +#include "ftraster.h" +#include "rastpic.h" + +#include "rasterrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_raster1_init( FT_Renderer render ) + { + FT_Library library = FT_MODULE_LIBRARY( render ); + + + render->clazz->raster_class->raster_reset( render->raster, + library->raster_pool, + library->raster_pool_size ); + + return Raster_Err_Ok; + } + + + /* set render-specific mode */ + static FT_Error + ft_raster1_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + + /* transform a given glyph image */ + static FT_Error + ft_raster1_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = Raster_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = Raster_Err_Invalid_Argument; + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_raster1_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_raster1_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + FT_Outline* outline; + FT_BBox cbox; + FT_UInt width, height, pitch; + FT_Bitmap* bitmap; + FT_Memory memory; + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = Raster_Err_Invalid_Argument; + goto Exit; + } + + /* check rendering mode */ +#ifndef FT_CONFIG_OPTION_PIC + if ( mode != FT_RENDER_MODE_MONO ) + { + /* raster1 is only capable of producing monochrome bitmaps */ + if ( render->clazz == &ft_raster1_renderer_class ) + return Raster_Err_Cannot_Render_Glyph; + } + else + { + /* raster5 is only capable of producing 5-gray-levels bitmaps */ + if ( render->clazz == &ft_raster5_renderer_class ) + return Raster_Err_Cannot_Render_Glyph; + } +#else /* FT_CONFIG_OPTION_PIC */ + /* When PIC is enabled, we cannot get to the class object */ + /* so instead we check the final character in the class name */ + /* ("raster5" or "raster1"). Yes this is a hack. */ + /* The "correct" thing to do is have different render function */ + /* for each of the classes. */ + if ( mode != FT_RENDER_MODE_MONO ) + { + /* raster1 is only capable of producing monochrome bitmaps */ + if ( render->clazz->root.module_name[6] == '1' ) + return Raster_Err_Cannot_Render_Glyph; + } + else + { + /* raster5 is only capable of producing 5-gray-levels bitmaps */ + if ( render->clazz->root.module_name[6] == '5' ) + return Raster_Err_Cannot_Render_Glyph; + } +#endif /* FT_CONFIG_OPTION_PIC */ + + outline = &slot->outline; + + /* translate the outline to the new origin if needed */ + if ( origin ) + FT_Outline_Translate( outline, origin->x, origin->y ); + + /* compute the control box, and grid fit it */ + FT_Outline_Get_CBox( outline, &cbox ); + + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + + width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); + height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); + bitmap = &slot->bitmap; + memory = render->root.memory; + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + /* allocate new one, depends on pixel format */ + if ( !( mode & FT_RENDER_MODE_MONO ) ) + { + /* we pad to 32 bits, only for backwards compatibility with FT 1.x */ + pitch = FT_PAD_CEIL( width, 4 ); + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + } + else + { + pitch = ( ( width + 15 ) >> 4 ) << 1; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + } + + bitmap->width = width; + bitmap->rows = height; + bitmap->pitch = pitch; + + if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + /* translate outline to render it into the bitmap */ + FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin ); + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = 0; + + if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY ) + params.flags |= FT_RASTER_FLAG_AA; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + FT_Outline_Translate( outline, cbox.xMin, cbox.yMin ); + + if ( error ) + goto Exit; + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 ); + slot->bitmap_top = (FT_Int)( cbox.yMax >> 6 ); + + Exit: + return error; + } + + + FT_DEFINE_RENDERER(ft_raster1_renderer_class, + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "raster1", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_raster1_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_raster1_render, + (FT_Renderer_TransformFunc)ft_raster1_transform, + (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, + (FT_Renderer_SetModeFunc) ft_raster1_set_mode, + + (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET + ) + + + /* This renderer is _NOT_ part of the default modules; you will need */ + /* to register it by hand in your application. It should only be */ + /* used for backwards-compatibility with FT 1.x anyway. */ + /* */ + FT_DEFINE_RENDERER(ft_raster5_renderer_class, + + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "raster5", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_raster1_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_raster1_render, + (FT_Renderer_TransformFunc)ft_raster1_transform, + (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, + (FT_Renderer_SetModeFunc) ft_raster1_set_mode, + + (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/raster/ftrend1.h b/alienblaster/project/jni/freetype/src/raster/ftrend1.h new file mode 100644 index 000000000..4cf128622 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/ftrend1.h @@ -0,0 +1,44 @@ +/***************************************************************************/ +/* */ +/* ftrend1.h */ +/* */ +/* The FreeType glyph rasterizer interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTREND1_H__ +#define __FTREND1_H__ + + +#include <ft2build.h> +#include FT_RENDER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_RENDERER( ft_raster1_renderer_class ) + + /* this renderer is _NOT_ part of the default modules, you'll need */ + /* to register it by hand in your application. It should only be */ + /* used for backwards-compatibility with FT 1.x anyway. */ + /* */ + FT_DECLARE_RENDERER( ft_raster5_renderer_class ) + + +FT_END_HEADER + +#endif /* __FTREND1_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/raster/module.mk b/alienblaster/project/jni/freetype/src/raster/module.mk new file mode 100644 index 000000000..cbff5df96 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 renderer module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += RASTER_MODULE + +define RASTER_MODULE +$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)raster $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/raster/rasterrs.h b/alienblaster/project/jni/freetype/src/raster/rasterrs.h new file mode 100644 index 000000000..5df9a7ab1 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/rasterrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* rasterrs.h */ +/* */ +/* monochrome renderer error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the monochrome renderer error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __RASTERRS_H__ +#define __RASTERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX Raster_Err_ +#define FT_ERR_BASE FT_Mod_Err_Raster + +#include FT_ERRORS_H + +#endif /* __RASTERRS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/raster/rastpic.c b/alienblaster/project/jni/freetype/src/raster/rastpic.c new file mode 100644 index 000000000..3c264877b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/rastpic.c @@ -0,0 +1,89 @@ +/***************************************************************************/ +/* */ +/* rastpic.c */ +/* */ +/* The FreeType position independent code services for raster module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "rastpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftraster.c */ + void FT_Init_Class_ft_standard_raster(FT_Raster_Funcs*); + + void + ft_raster1_renderer_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->raster ) + { + RasterPIC* container = (RasterPIC*)pic_container->raster; + if(--container->ref_count) + return; + FT_FREE( container ); + pic_container->raster = NULL; + } + } + + + FT_Error + ft_raster1_renderer_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + RasterPIC* container; + FT_Memory memory = library->memory; + + /* since this function also serve raster5 renderer, + it implements reference counting */ + if(pic_container->raster) + { + ((RasterPIC*)pic_container->raster)->ref_count++; + return error; + } + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->raster = container; + container->ref_count = 1; + + /* initialize pointer table - this is how the module usually expects this data */ + FT_Init_Class_ft_standard_raster(&container->ft_standard_raster); +/*Exit:*/ + if(error) + ft_raster1_renderer_class_pic_free(library); + return error; + } + + /* re-route these init and free functions to the above functions */ + FT_Error ft_raster5_renderer_class_pic_init(FT_Library library) + { + return ft_raster1_renderer_class_pic_init(library); + } + void ft_raster5_renderer_class_pic_free(FT_Library library) + { + ft_raster1_renderer_class_pic_free(library); + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/raster/rastpic.h b/alienblaster/project/jni/freetype/src/raster/rastpic.h new file mode 100644 index 000000000..dcd82b8ca --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/rastpic.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* rastpic.h */ +/* */ +/* The FreeType position independent code services for raster module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __RASTPIC_H__ +#define __RASTPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_STANDARD_RASTER_GET ft_standard_raster + +#else /* FT_CONFIG_OPTION_PIC */ + + typedef struct RasterPIC_ + { + int ref_count; + FT_Raster_Funcs ft_standard_raster; + } RasterPIC; + +#define GET_PIC(lib) ((RasterPIC*)((lib)->pic_container.raster)) +#define FT_STANDARD_RASTER_GET (GET_PIC(library)->ft_standard_raster) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __RASTPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/raster/rules.mk b/alienblaster/project/jni/freetype/src/raster/rules.mk new file mode 100644 index 000000000..9703b1298 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/raster/rules.mk @@ -0,0 +1,69 @@ +# +# FreeType 2 renderer module build rules +# + + +# Copyright 1996-2000, 2001, 2003, 2008, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# raster driver directory +# +RASTER_DIR := $(SRC_DIR)/raster + +# compilation flags for the driver +# +RASTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR)) + + +# raster driver sources (i.e., C files) +# +RASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \ + $(RASTER_DIR)/ftrend1.c + + +# raster driver headers +# +RASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \ + $(RASTER_DIR)/rasterrs.h + + +# raster driver object(s) +# +# RASTER_DRV_OBJ_M is used during `multi' builds. +# RASTER_DRV_OBJ_S is used during `single' builds. +# +RASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O) +RASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O + +# raster driver source file for single build +# +RASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c + + +# raster driver - single object +# +$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \ + $(FREETYPE_H) $(RASTER_DRV_H) + $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S)) + + +# raster driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H) + $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(RASTER_DRV_OBJ_S) +DRV_OBJS_M += $(RASTER_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/sfnt/Jamfile b/alienblaster/project/jni/freetype/src/sfnt/Jamfile new file mode 100644 index 000000000..cb20b1b04 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/sfnt Jamfile +# +# Copyright 2001, 2002, 2004, 2005 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf sfntpic ; + } + else + { + _sources = sfnt ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/sfnt Jamfile diff --git a/alienblaster/project/jni/freetype/src/sfnt/module.mk b/alienblaster/project/jni/freetype/src/sfnt/module.mk new file mode 100644 index 000000000..95fd6a314 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 SFNT module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += SFNT_MODULE + +define SFNT_MODULE +$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)sfnt $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/sfnt/rules.mk b/alienblaster/project/jni/freetype/src/sfnt/rules.mk new file mode 100644 index 000000000..abda74fca --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/rules.mk @@ -0,0 +1,79 @@ +# +# FreeType 2 SFNT driver configuration rules +# + + +# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# SFNT driver directory +# +SFNT_DIR := $(SRC_DIR)/sfnt + + +# compilation flags for the driver +# +SFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR)) + + +# SFNT driver sources (i.e., C files) +# +SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c \ + $(SFNT_DIR)/ttmtx.c \ + $(SFNT_DIR)/ttcmap.c \ + $(SFNT_DIR)/ttsbit.c \ + $(SFNT_DIR)/ttpost.c \ + $(SFNT_DIR)/ttkern.c \ + $(SFNT_DIR)/ttbdf.c \ + $(SFNT_DIR)/sfobjs.c \ + $(SFNT_DIR)/sfdriver.c + +# SFNT driver headers +# +# Note that ttsbit0.c gets #included by ttsbit.c. +# +SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h) \ + $(SFNT_DIR)/sferrors.h \ + $(SFNT_DIR)/ttsbit0.c + + +# SFNT driver object(s) +# +# SFNT_DRV_OBJ_M is used during `multi' builds. +# SFNT_DRV_OBJ_S is used during `single' builds. +# +SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O) +SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O + +# SFNT driver source file for single build +# +SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c + + +# SFNT driver - single object +# +$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \ + $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S)) + + +# SFNT driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H) + $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(SFNT_DRV_OBJ_S) +DRV_OBJS_M += $(SFNT_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/sfnt/sfdriver.c b/alienblaster/project/jni/freetype/src/sfnt/sfdriver.c new file mode 100644 index 000000000..1097efb86 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/sfdriver.c @@ -0,0 +1,651 @@ +/***************************************************************************/ +/* */ +/* sfdriver.c */ +/* */ +/* High-level SFNT driver interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + +#include "sfdriver.h" +#include "ttload.h" +#include "sfobjs.h" +#include "sfntpic.h" + +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.h" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.h" +#endif + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#include FT_SERVICE_BDF_H +#endif + +#include "ttcmap.h" +#include "ttkern.h" +#include "ttmtx.h" + +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TT_CMAP_H + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_sfdriver + + + /* + * SFNT TABLE SERVICE + * + */ + + static void* + get_sfnt_table( TT_Face face, + FT_Sfnt_Tag tag ) + { + void* table; + + + switch ( tag ) + { + case ft_sfnt_head: + table = &face->header; + break; + + case ft_sfnt_hhea: + table = &face->horizontal; + break; + + case ft_sfnt_vhea: + table = face->vertical_info ? &face->vertical : 0; + break; + + case ft_sfnt_os2: + table = face->os2.version == 0xFFFFU ? 0 : &face->os2; + break; + + case ft_sfnt_post: + table = &face->postscript; + break; + + case ft_sfnt_maxp: + table = &face->max_profile; + break; + + case ft_sfnt_pclt: + table = face->pclt.Version ? &face->pclt : 0; + break; + + default: + table = 0; + } + + return table; + } + + + static FT_Error + sfnt_table_info( TT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *offset, + FT_ULong *length ) + { + if ( !tag || !offset || !length ) + return SFNT_Err_Invalid_Argument; + + if ( idx >= face->num_tables ) + return SFNT_Err_Table_Missing; + + *tag = face->dir_tables[idx].Tag; + *offset = face->dir_tables[idx].Offset; + *length = face->dir_tables[idx].Length; + + return SFNT_Err_Ok; + } + + + FT_DEFINE_SERVICE_SFNT_TABLEREC(sfnt_service_sfnt_table, + (FT_SFNT_TableLoadFunc)tt_face_load_any, + (FT_SFNT_TableGetFunc) get_sfnt_table, + (FT_SFNT_TableInfoFunc)sfnt_table_info + ) + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + sfnt_get_glyph_name( TT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_String* gname; + FT_Error error; + + + error = tt_face_get_ps_name( face, glyph_index, &gname ); + if ( !error ) + FT_STRCPYN( buffer, gname, buffer_max ); + + return error; + } + + + static FT_UInt + sfnt_get_name_index( TT_Face face, + FT_String* glyph_name ) + { + FT_Face root = &face->root; + FT_UInt i, max_gid = FT_UINT_MAX; + + + if ( root->num_glyphs < 0 ) + return 0; + else if ( ( FT_ULong ) root->num_glyphs < FT_UINT_MAX ) + max_gid = ( FT_UInt ) root->num_glyphs; + else + FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", + FT_UINT_MAX, root->num_glyphs )); + + for ( i = 0; i < max_gid; i++ ) + { + FT_String* gname; + FT_Error error = tt_face_get_ps_name( face, i, &gname ); + + + if ( error ) + continue; + + if ( !ft_strcmp( glyph_name, gname ) ) + return i; + } + + return 0; + } + + + FT_DEFINE_SERVICE_GLYPHDICTREC(sfnt_service_glyph_dict, + (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index + ) + +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + sfnt_get_ps_name( TT_Face face ) + { + FT_Int n, found_win, found_apple; + const char* result = NULL; + + + /* shouldn't happen, but just in case to avoid memory leaks */ + if ( face->postscript_name ) + return face->postscript_name; + + /* scan the name table to see whether we have a Postscript name here, */ + /* either in Macintosh or Windows platform encodings */ + found_win = -1; + found_apple = -1; + + for ( n = 0; n < face->num_names; n++ ) + { + TT_NameEntryRec* name = face->name_table.names + n; + + + if ( name->nameID == 6 && name->stringLength > 0 ) + { + if ( name->platformID == 3 && + name->encodingID == 1 && + name->languageID == 0x409 ) + found_win = n; + + if ( name->platformID == 1 && + name->encodingID == 0 && + name->languageID == 0 ) + found_apple = n; + } + } + + if ( found_win != -1 ) + { + FT_Memory memory = face->root.memory; + TT_NameEntryRec* name = face->name_table.names + found_win; + FT_UInt len = name->stringLength / 2; + FT_Error error = SFNT_Err_Ok; + + FT_UNUSED( error ); + + + if ( !FT_ALLOC( result, name->stringLength + 1 ) ) + { + FT_Stream stream = face->name_table.stream; + FT_String* r = (FT_String*)result; + FT_Byte* p = (FT_Byte*)name->string; + + + if ( FT_STREAM_SEEK( name->stringOffset ) || + FT_FRAME_ENTER( name->stringLength ) ) + { + FT_FREE( result ); + name->stringLength = 0; + name->stringOffset = 0; + FT_FREE( name->string ); + + goto Exit; + } + + p = (FT_Byte*)stream->cursor; + + for ( ; len > 0; len--, p += 2 ) + { + if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 ) + *r++ = p[1]; + } + *r = '\0'; + + FT_FRAME_EXIT(); + } + goto Exit; + } + + if ( found_apple != -1 ) + { + FT_Memory memory = face->root.memory; + TT_NameEntryRec* name = face->name_table.names + found_apple; + FT_UInt len = name->stringLength; + FT_Error error = SFNT_Err_Ok; + + FT_UNUSED( error ); + + + if ( !FT_ALLOC( result, len + 1 ) ) + { + FT_Stream stream = face->name_table.stream; + + + if ( FT_STREAM_SEEK( name->stringOffset ) || + FT_STREAM_READ( result, len ) ) + { + name->stringOffset = 0; + name->stringLength = 0; + FT_FREE( name->string ); + FT_FREE( result ); + goto Exit; + } + ((char*)result)[len] = '\0'; + } + } + + Exit: + face->postscript_name = result; + return result; + } + + FT_DEFINE_SERVICE_PSFONTNAMEREC(sfnt_service_ps_name, + (FT_PsName_GetFunc)sfnt_get_ps_name + ) + + + /* + * TT CMAP INFO + */ + FT_DEFINE_SERVICE_TTCMAPSREC(tt_service_get_cmap_info, + (TT_CMap_Info_GetFunc)tt_get_cmap_info + ) + + +#ifdef TT_CONFIG_OPTION_BDF + + static FT_Error + sfnt_get_charset_id( TT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + BDF_PropertyRec encoding, registry; + FT_Error error; + + + /* XXX: I don't know whether this is correct, since + * tt_face_find_bdf_prop only returns something correct if we have + * previously selected a size that is listed in the BDF table. + * Should we change the BDF table format to include single offsets + * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? + */ + error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); + if ( !error ) + { + error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); + if ( !error ) + { + if ( registry.type == BDF_PROPERTY_TYPE_ATOM && + encoding.type == BDF_PROPERTY_TYPE_ATOM ) + { + *acharset_encoding = encoding.u.atom; + *acharset_registry = registry.u.atom; + } + else + error = FT_Err_Invalid_Argument; + } + } + + return error; + } + + + FT_DEFINE_SERVICE_BDFRec(sfnt_service_bdf, + (FT_BDF_GetCharsetIdFunc) sfnt_get_charset_id, + (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop + ) + +#endif /* TT_CONFIG_OPTION_BDF */ + + + /* + * SERVICE LIST + */ + +#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF + FT_DEFINE_SERVICEDESCREC5(sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &FT_SFNT_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_BDF, &FT_SFNT_SERVICE_BDF_GET, + FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET + ) +#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_DEFINE_SERVICEDESCREC4(sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &FT_SFNT_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET + ) +#elif defined TT_CONFIG_OPTION_BDF + FT_DEFINE_SERVICEDESCREC4(sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_BDF, &FT_SFNT_SERVICE_BDF_GET, + FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET + ) +#else + FT_DEFINE_SERVICEDESCREC3(sfnt_services, + FT_SERVICE_ID_SFNT_TABLE, &FT_SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_TT_CMAP, &FT_TT_SERVICE_GET_CMAP_INFO_GET + ) +#endif + + + FT_CALLBACK_DEF( FT_Module_Interface ) + sfnt_get_interface( FT_Module module, + const char* module_interface ) + { + FT_UNUSED( module ); + + return ft_service_list_lookup( FT_SFNT_SERVICES_GET, module_interface ); + } + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_sfnt_header_stub( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header header ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + FT_UNUSED( face_index ); + FT_UNUSED( header ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_directory_stub( TT_Face face, + FT_Stream stream, + SFNT_Header header ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + FT_UNUSED( header ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_hdmx_stub( TT_Face face, + FT_Stream stream ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( void ) + tt_face_free_hdmx_stub( TT_Face face ) + { + FT_UNUSED( face ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_set_sbit_strike_stub( TT_Face face, + FT_UInt x_ppem, + FT_UInt y_ppem, + FT_ULong* astrike_index ) + { + /* + * We simply forge a FT_Size_Request and call the real function + * that does all the work. + * + * This stub might be called by libXfont in the X.Org Xserver, + * compiled against version 2.1.8 or newer. + */ + + FT_Size_RequestRec req; + + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = (FT_F26Dot6)x_ppem; + req.height = (FT_F26Dot6)y_ppem; + req.horiResolution = 0; + req.vertResolution = 0; + + *astrike_index = 0x7FFFFFFFUL; + + return tt_face_set_sbit_strike( face, &req, astrike_index ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_sbit_stub( TT_Face face, + FT_Stream stream ) + { + FT_UNUSED( face ); + FT_UNUSED( stream ); + + /* + * This function was originally implemented to load the sbit table. + * However, it has been replaced by `tt_face_load_eblc', and this stub + * is only there for some rogue clients which would want to call it + * directly (which doesn't make much sense). + */ + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( void ) + tt_face_free_sbit_stub( TT_Face face ) + { + /* nothing to do in this stub */ + FT_UNUSED( face ); + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_load_charmap_stub( TT_Face face, + void* cmap, + FT_Stream input ) + { + FT_UNUSED( face ); + FT_UNUSED( cmap ); + FT_UNUSED( input ); + + return FT_Err_Unimplemented_Feature; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_face_free_charmap_stub( TT_Face face, + void* cmap ) + { + FT_UNUSED( face ); + FT_UNUSED( cmap ); + + return 0; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define PUT_EMBEDDED_BITMAPS(a) a +#else +#define PUT_EMBEDDED_BITMAPS(a) 0 +#endif +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#define PUT_PS_NAMES(a) a +#else +#define PUT_PS_NAMES(a) 0 +#endif + + FT_DEFINE_SFNT_INTERFACE(sfnt_interface, + tt_face_goto_table, + + sfnt_init_face, + sfnt_load_face, + sfnt_done_face, + sfnt_get_interface, + + tt_face_load_any, + + tt_face_load_sfnt_header_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_face_load_directory_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + tt_face_load_head, + tt_face_load_hhea, + tt_face_load_cmap, + tt_face_load_maxp, + tt_face_load_os2, + tt_face_load_post, + + tt_face_load_name, + tt_face_free_name, + + tt_face_load_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_face_free_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + tt_face_load_kern, + tt_face_load_gasp, + tt_face_load_pclt, + + /* see `ttload.h' */ + PUT_EMBEDDED_BITMAPS(tt_face_load_bhed), + + tt_face_set_sbit_strike_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_face_load_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + tt_find_sbit_image, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_load_sbit_metrics, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + PUT_EMBEDDED_BITMAPS(tt_face_load_sbit_image), + + tt_face_free_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + /* see `ttpost.h' */ + PUT_PS_NAMES(tt_face_get_ps_name), + PUT_PS_NAMES(tt_face_free_ps_names), + + tt_face_load_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + tt_face_free_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + /* since version 2.1.8 */ + + tt_face_get_kerning, + + /* since version 2.2 */ + + tt_face_load_font_dir, + tt_face_load_hmtx, + + /* see `ttsbit.h' and `sfnt.h' */ + PUT_EMBEDDED_BITMAPS(tt_face_load_eblc), + PUT_EMBEDDED_BITMAPS(tt_face_free_eblc), + + PUT_EMBEDDED_BITMAPS(tt_face_set_sbit_strike), + PUT_EMBEDDED_BITMAPS(tt_face_load_strike_metrics), + + tt_face_get_metrics + ) + + + FT_DEFINE_MODULE(sfnt_module_class, + + 0, /* not a font driver or renderer */ + sizeof( FT_ModuleRec ), + + "sfnt", /* driver name */ + 0x10000L, /* driver version 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or higher */ + + (const void*)&FT_SFNT_INTERFACE_GET, /* module specific interface */ + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) sfnt_get_interface + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/sfdriver.h b/alienblaster/project/jni/freetype/src/sfnt/sfdriver.h new file mode 100644 index 000000000..5de25d51c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/sfdriver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* sfdriver.h */ +/* */ +/* High-level SFNT driver interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFDRIVER_H__ +#define __SFDRIVER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( sfnt_module_class ) + + +FT_END_HEADER + +#endif /* __SFDRIVER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/sferrors.h b/alienblaster/project/jni/freetype/src/sfnt/sferrors.h new file mode 100644 index 000000000..27f90de28 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/sferrors.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* sferrors.h */ +/* */ +/* SFNT error codes (specification only). */ +/* */ +/* Copyright 2001, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the SFNT error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __SFERRORS_H__ +#define __SFERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX SFNT_Err_ +#define FT_ERR_BASE FT_Mod_Err_SFNT + +#define FT_KEEP_ERR_PREFIX + +#include FT_ERRORS_H + +#endif /* __SFERRORS_H__ */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/sfntpic.c b/alienblaster/project/jni/freetype/src/sfnt/sfntpic.c new file mode 100644 index 000000000..fd3cf4e92 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/sfntpic.c @@ -0,0 +1,101 @@ +/***************************************************************************/ +/* */ +/* sfntpic.c */ +/* */ +/* The FreeType position independent code services for sfnt module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "sfntpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from sfdriver.c */ + FT_Error FT_Create_Class_sfnt_services( FT_Library, FT_ServiceDescRec**); + void FT_Destroy_Class_sfnt_services( FT_Library, FT_ServiceDescRec*); + void FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*); + void FT_Init_Class_sfnt_interface( FT_Library, SFNT_Interface*); + void FT_Init_Class_sfnt_service_glyph_dict( FT_Library, FT_Service_GlyphDictRec*); + void FT_Init_Class_sfnt_service_ps_name( FT_Library, FT_Service_PsFontNameRec*); + void FT_Init_Class_tt_service_get_cmap_info( FT_Library, FT_Service_TTCMapsRec*); + void FT_Init_Class_sfnt_service_sfnt_table( FT_Service_SFNT_TableRec*); + + /* forward declaration of PIC init functions from ttcmap.c */ + FT_Error FT_Create_Class_tt_cmap_classes( FT_Library, TT_CMap_Class**); + void FT_Destroy_Class_tt_cmap_classes( FT_Library, TT_CMap_Class*); + + void + sfnt_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->sfnt ) + { + sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; + if(container->sfnt_services) + FT_Destroy_Class_sfnt_services(library, container->sfnt_services); + container->sfnt_services = NULL; + if(container->tt_cmap_classes) + FT_Destroy_Class_tt_cmap_classes(library, container->tt_cmap_classes); + container->tt_cmap_classes = NULL; + FT_FREE( container ); + pic_container->sfnt = NULL; + } + } + + + FT_Error + sfnt_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + sfntModulePIC* container; + FT_Memory memory = library->memory; + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->sfnt = container; + + /* initialize pointer table - this is how the module usually expects this data */ + error = FT_Create_Class_sfnt_services(library, &container->sfnt_services); + if(error) + goto Exit; + error = FT_Create_Class_tt_cmap_classes(library, &container->tt_cmap_classes); + if(error) + goto Exit; + FT_Init_Class_sfnt_service_glyph_dict(library, &container->sfnt_service_glyph_dict); + FT_Init_Class_sfnt_service_ps_name(library, &container->sfnt_service_ps_name); + FT_Init_Class_tt_service_get_cmap_info(library, &container->tt_service_get_cmap_info); + FT_Init_Class_sfnt_service_sfnt_table(&container->sfnt_service_sfnt_table); +#ifdef TT_CONFIG_OPTION_BDF + FT_Init_Class_sfnt_service_bdf(&container->sfnt_service_bdf); +#endif + FT_Init_Class_sfnt_interface(library, &container->sfnt_interface); + +Exit: + if(error) + sfnt_module_class_pic_free(library); + return error; + } + + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/sfntpic.h b/alienblaster/project/jni/freetype/src/sfnt/sfntpic.h new file mode 100644 index 000000000..6943b4250 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/sfntpic.h @@ -0,0 +1,88 @@ +/***************************************************************************/ +/* */ +/* sfntpic.h */ +/* */ +/* The FreeType position independent code services for sfnt module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFNTPIC_H__ +#define __SFNTPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + + #ifndef FT_CONFIG_OPTION_PIC +#define FT_SFNT_SERVICES_GET sfnt_services +#define FT_SFNT_SERVICE_GLYPH_DICT_GET sfnt_service_glyph_dict +#define FT_SFNT_SERVICE_PS_NAME_GET sfnt_service_ps_name +#define FT_TT_SERVICE_GET_CMAP_INFO_GET tt_service_get_cmap_info +#define FT_SFNT_SERVICES_GET sfnt_services +#define FT_TT_CMAP_CLASSES_GET tt_cmap_classes +#define FT_SFNT_SERVICE_SFNT_TABLE_GET sfnt_service_sfnt_table +#define FT_SFNT_SERVICE_BDF_GET sfnt_service_bdf +#define FT_SFNT_INTERFACE_GET sfnt_interface + +#else /* FT_CONFIG_OPTION_PIC */ + +/* some include files required for members of sfntModulePIC */ +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TT_CMAP_H +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#include FT_SERVICE_BDF_H +#endif +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include "ttcmap.h" + +typedef struct sfntModulePIC_ + { + FT_ServiceDescRec* sfnt_services; + FT_Service_GlyphDictRec sfnt_service_glyph_dict; + FT_Service_PsFontNameRec sfnt_service_ps_name; + FT_Service_TTCMapsRec tt_service_get_cmap_info; + TT_CMap_Class* tt_cmap_classes; + FT_Service_SFNT_TableRec sfnt_service_sfnt_table; +#ifdef TT_CONFIG_OPTION_BDF + FT_Service_BDFRec sfnt_service_bdf; +#endif + SFNT_Interface sfnt_interface; + } sfntModulePIC; + +#define GET_PIC(lib) ((sfntModulePIC*)((lib)->pic_container.sfnt)) +#define FT_SFNT_SERVICES_GET (GET_PIC(library)->sfnt_services) +#define FT_SFNT_SERVICE_GLYPH_DICT_GET (GET_PIC(library)->sfnt_service_glyph_dict) +#define FT_SFNT_SERVICE_PS_NAME_GET (GET_PIC(library)->sfnt_service_ps_name) +#define FT_TT_SERVICE_GET_CMAP_INFO_GET (GET_PIC(library)->tt_service_get_cmap_info) +#define FT_SFNT_SERVICES_GET (GET_PIC(library)->sfnt_services) +#define FT_TT_CMAP_CLASSES_GET (GET_PIC(library)->tt_cmap_classes) +#define FT_SFNT_SERVICE_SFNT_TABLE_GET (GET_PIC(library)->sfnt_service_sfnt_table) +#define FT_SFNT_SERVICE_BDF_GET (GET_PIC(library)->sfnt_service_bdf) +#define FT_SFNT_INTERFACE_GET (GET_PIC(library)->sfnt_interface) + +#endif /* FT_CONFIG_OPTION_PIC */ + +/* */ + +FT_END_HEADER + +#endif /* __SFNTPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/sfobjs.c b/alienblaster/project/jni/freetype/src/sfnt/sfobjs.c new file mode 100644 index 000000000..b74b1a93a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/sfobjs.c @@ -0,0 +1,1149 @@ +/***************************************************************************/ +/* */ +/* sfobjs.c */ +/* */ +/* SFNT object management (base). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "sfobjs.h" +#include "ttload.h" +#include "ttcmap.h" +#include "ttkern.h" +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SFNT_NAMES_H +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#endif + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_sfobjs + + + + /* convert a UTF-16 name entry to ASCII */ + static FT_String* + tt_name_entry_ascii_from_utf16( TT_NameEntry entry, + FT_Memory memory ) + { + FT_String* string; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength / 2; + + if ( FT_NEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = FT_NEXT_USHORT( read ); + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[len] = 0; + + return string; + } + + + /* convert an Apple Roman or symbol name entry to ASCII */ + static FT_String* + tt_name_entry_ascii_from_other( TT_NameEntry entry, + FT_Memory memory ) + { + FT_String* string; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength; + + if ( FT_NEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = *read++; + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[len] = 0; + + return string; + } + + + typedef FT_String* (*TT_NameEntry_ConvertFunc)( TT_NameEntry entry, + FT_Memory memory ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_name */ + /* */ + /* <Description> */ + /* Returns a given ENGLISH name record in ASCII. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* nameid :: The name id of the name record to return. */ + /* */ + /* <InOut> */ + /* name :: The address of a string pointer. NULL if no name is */ + /* present. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + tt_face_get_name( TT_Face face, + FT_UShort nameid, + FT_String** name ) + { + FT_Memory memory = face->root.memory; + FT_Error error = SFNT_Err_Ok; + FT_String* result = NULL; + FT_UShort n; + TT_NameEntryRec* rec; + FT_Int found_apple = -1; + FT_Int found_apple_roman = -1; + FT_Int found_apple_english = -1; + FT_Int found_win = -1; + FT_Int found_unicode = -1; + + FT_Bool is_english = 0; + + TT_NameEntry_ConvertFunc convert; + + + FT_ASSERT( name ); + + rec = face->name_table.names; + for ( n = 0; n < face->num_names; n++, rec++ ) + { + /* According to the OpenType 1.3 specification, only Microsoft or */ + /* Apple platform IDs might be used in the `name' table. The */ + /* `Unicode' platform is reserved for the `cmap' table, and the */ + /* `Iso' one is deprecated. */ + /* */ + /* However, the Apple TrueType specification doesn't say the same */ + /* thing and goes to suggest that all Unicode `name' table entries */ + /* should be coded in UTF-16 (in big-endian format I suppose). */ + /* */ + if ( rec->nameID == nameid && rec->stringLength > 0 ) + { + switch ( rec->platformID ) + { + case TT_PLATFORM_APPLE_UNICODE: + case TT_PLATFORM_ISO: + /* there is `languageID' to check there. We should use this */ + /* field only as a last solution when nothing else is */ + /* available. */ + /* */ + found_unicode = n; + break; + + case TT_PLATFORM_MACINTOSH: + /* This is a bit special because some fonts will use either */ + /* an English language id, or a Roman encoding id, to indicate */ + /* the English version of its font name. */ + /* */ + if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) + found_apple_english = n; + else if ( rec->encodingID == TT_MAC_ID_ROMAN ) + found_apple_roman = n; + break; + + case TT_PLATFORM_MICROSOFT: + /* we only take a non-English name when there is nothing */ + /* else available in the font */ + /* */ + if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 ) + { + switch ( rec->encodingID ) + { + case TT_MS_ID_SYMBOL_CS: + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_UCS_4: + is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 ); + found_win = n; + break; + + default: + ; + } + } + break; + + default: + ; + } + } + } + + found_apple = found_apple_roman; + if ( found_apple_english >= 0 ) + found_apple = found_apple_english; + + /* some fonts contain invalid Unicode or Macintosh formatted entries; */ + /* we will thus favor names encoded in Windows formats if available */ + /* (provided it is an English name) */ + /* */ + convert = NULL; + if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) ) + { + rec = face->name_table.names + found_win; + switch ( rec->encodingID ) + { + /* all Unicode strings are encoded using UTF-16BE */ + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_SYMBOL_CS: + convert = tt_name_entry_ascii_from_utf16; + break; + + case TT_MS_ID_UCS_4: + /* Apparently, if this value is found in a name table entry, it is */ + /* documented as `full Unicode repertoire'. Experience with the */ + /* MsGothic font shipped with Windows Vista shows that this really */ + /* means UTF-16 encoded names (UCS-4 values are only used within */ + /* charmaps). */ + convert = tt_name_entry_ascii_from_utf16; + break; + + default: + ; + } + } + else if ( found_apple >= 0 ) + { + rec = face->name_table.names + found_apple; + convert = tt_name_entry_ascii_from_other; + } + else if ( found_unicode >= 0 ) + { + rec = face->name_table.names + found_unicode; + convert = tt_name_entry_ascii_from_utf16; + } + + if ( rec && convert ) + { + if ( rec->string == NULL ) + { + FT_Stream stream = face->name_table.stream; + + + if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) || + FT_STREAM_SEEK( rec->stringOffset ) || + FT_STREAM_READ( rec->string, rec->stringLength ) ) + { + FT_FREE( rec->string ); + rec->stringLength = 0; + result = NULL; + goto Exit; + } + } + + result = convert( rec, memory ); + } + + Exit: + *name = result; + return error; + } + + + static FT_Encoding + sfnt_find_encoding( int platform_id, + int encoding_id ) + { + typedef struct TEncoding_ + { + int platform_id; + int encoding_id; + FT_Encoding encoding; + + } TEncoding; + + static + const TEncoding tt_encodings[] = + { + { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN }, + + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, FT_ENCODING_GB2312 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB } + }; + + const TEncoding *cur, *limit; + + + cur = tt_encodings; + limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); + + for ( ; cur < limit; cur++ ) + { + if ( cur->platform_id == platform_id ) + { + if ( cur->encoding_id == encoding_id || + cur->encoding_id == -1 ) + return cur->encoding; + } + } + + return FT_ENCODING_NONE; + } + + + /* Fill in face->ttc_header. If the font is not a TTC, it is */ + /* synthesized into a TTC with one offset table. */ + static FT_Error + sfnt_open_font( FT_Stream stream, + TT_Face face ) + { + FT_Memory memory = stream->memory; + FT_Error error; + FT_ULong tag, offset; + + static const FT_Frame_Field ttc_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TTC_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_LONG( version ), + FT_FRAME_LONG( count ), + FT_FRAME_END + }; + + + face->ttc_header.tag = 0; + face->ttc_header.version = 0; + face->ttc_header.count = 0; + + offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( tag ) ) + return error; + + if ( tag != 0x00010000UL && + tag != TTAG_ttcf && + tag != TTAG_OTTO && + tag != TTAG_true && + tag != TTAG_typ1 && + tag != 0x00020000UL ) + return SFNT_Err_Unknown_File_Format; + + face->ttc_header.tag = TTAG_ttcf; + + if ( tag == TTAG_ttcf ) + { + FT_Int n; + + + FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); + + if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) + return error; + + /* now read the offsets of each font in the file */ + if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) + return error; + + if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) + return error; + + for ( n = 0; n < face->ttc_header.count; n++ ) + face->ttc_header.offsets[n] = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + } + else + { + FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" )); + + face->ttc_header.version = 1 << 16; + face->ttc_header.count = 1; + + if ( FT_NEW( face->ttc_header.offsets ) ) + return error; + + face->ttc_header.offsets[0] = offset; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library = face->root.driver->root.library; + SFNT_Service sfnt; + + + /* for now, parameters are unused */ + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + sfnt = (SFNT_Service)face->sfnt; + if ( !sfnt ) + { + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + return SFNT_Err_Invalid_File_Format; + + face->sfnt = sfnt; + face->goto_table = sfnt->goto_table; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); + + error = sfnt_open_font( stream, face ); + if ( error ) + return error; + + FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index )); + + if ( face_index < 0 ) + face_index = 0; + + if ( face_index >= face->ttc_header.count ) + return SFNT_Err_Invalid_Argument; + + if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) + return error; + + /* check that we have a valid TrueType file */ + error = sfnt->load_font_dir( face, stream ); + if ( error ) + return error; + + face->root.num_faces = face->ttc_header.count; + face->root.face_index = face_index; + + return error; + } + + +#define LOAD_( x ) \ + do { \ + FT_TRACE2(( "`" #x "' " )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_##x( face, stream ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : ( error == SFNT_Err_Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define LOADM_( x, vertical ) \ + do { \ + FT_TRACE2(( "`%s" #x "' ", \ + vertical ? "vertical " : "" )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_##x( face, stream, vertical ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : ( error == SFNT_Err_Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define GET_NAME( id, field ) \ + do { \ + error = tt_face_get_name( face, TT_NAME_ID_##id, field ); \ + if ( error ) \ + goto Exit; \ + } while ( 0 ) + + + FT_LOCAL_DEF( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Error psnames_error; +#endif + FT_Bool has_outline; + FT_Bool is_apple_sbit; + FT_Bool ignore_preferred_family = FALSE; + FT_Bool ignore_preferred_subfamily = FALSE; + + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_UNUSED( face_index ); + + /* Check parameters */ + + { + FT_Int i; + + + for ( i = 0; i < num_params; i++ ) + { + if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY ) + ignore_preferred_family = TRUE; + else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY ) + ignore_preferred_subfamily = TRUE; + } + } + + /* Load tables */ + + /* We now support two SFNT-based bitmapped font formats. They */ + /* are recognized easily as they do not include a `glyf' */ + /* table. */ + /* */ + /* The first format comes from Apple, and uses a table named */ + /* `bhed' instead of `head' to store the font header (using */ + /* the same format). It also doesn't include horizontal and */ + /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */ + /* missing). */ + /* */ + /* The other format comes from Microsoft, and is used with */ + /* WinCE/PocketPC. It looks like a standard TTF, except that */ + /* it doesn't contain outlines. */ + /* */ + + FT_TRACE2(( "sfnt_load_face: %08p\n\n", face )); + + /* do we have outlines in there? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 || + tt_face_lookup_table( face, TTAG_glyf ) != 0 || + tt_face_lookup_table( face, TTAG_CFF ) != 0 ); +#else + has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 || + tt_face_lookup_table( face, TTAG_CFF ) != 0 ); +#endif + + is_apple_sbit = 0; + + /* if this font doesn't contain outlines, we try to load */ + /* a `bhed' table */ + if ( !has_outline && sfnt->load_bhed ) + { + LOAD_( bhed ); + is_apple_sbit = FT_BOOL( !error ); + } + + /* load the font header (`head' table) if this isn't an Apple */ + /* sbit font file */ + if ( !is_apple_sbit ) + { + LOAD_( head ); + if ( error ) + goto Exit; + } + + if ( face->header.Units_Per_EM == 0 ) + { + error = SFNT_Err_Invalid_Table; + + goto Exit; + } + + /* the following tables are often not present in embedded TrueType */ + /* fonts within PDF documents, so don't check for them. */ + LOAD_( maxp ); + LOAD_( cmap ); + + /* the following tables are optional in PCL fonts -- */ + /* don't check for errors */ + LOAD_( name ); + LOAD_( post ); + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames_error = error; +#endif + + /* do not load the metrics headers and tables if this is an Apple */ + /* sbit font file */ + if ( !is_apple_sbit ) + { + /* load the `hhea' and `hmtx' tables */ + LOADM_( hhea, 0 ); + if ( !error ) + { + LOADM_( hmtx, 0 ); + if ( error == SFNT_Err_Table_Missing ) + { + error = SFNT_Err_Hmtx_Table_Missing; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hmtx' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = SFNT_Err_Ok; + } +#endif + } + } + else if ( error == SFNT_Err_Table_Missing ) + { + /* No `hhea' table necessary for SFNT Mac fonts. */ + if ( face->format_tag == TTAG_true ) + { + FT_TRACE2(( "This is an SFNT Mac font.\n" )); + has_outline = 0; + error = SFNT_Err_Ok; + } + else + { + error = SFNT_Err_Horiz_Header_Missing; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hhea' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = SFNT_Err_Ok; + } +#endif + + } + } + + if ( error ) + goto Exit; + + /* try to load the `vhea' and `vmtx' tables */ + LOADM_( hhea, 1 ); + if ( !error ) + { + LOADM_( hmtx, 1 ); + if ( !error ) + face->vertical_info = 1; + } + + if ( error && error != SFNT_Err_Table_Missing ) + goto Exit; + + LOAD_( os2 ); + if ( error ) + { + if ( error != SFNT_Err_Table_Missing ) + goto Exit; + + face->os2.version = 0xFFFFU; + } + } + + /* the optional tables */ + + /* embedded bitmap support */ + if ( sfnt->load_eblc ) + { + LOAD_( eblc ); + if ( error ) + { + /* a font which contains neither bitmaps nor outlines is */ + /* still valid (although rather useless in most cases); */ + /* however, you can find such stripped fonts in PDFs */ + if ( error == SFNT_Err_Table_Missing ) + error = SFNT_Err_Ok; + else + goto Exit; + } + } + + LOAD_( pclt ); + if ( error ) + { + if ( error != SFNT_Err_Table_Missing ) + goto Exit; + + face->pclt.Version = 0; + } + + /* consider the kerning and gasp tables as optional */ + LOAD_( gasp ); + LOAD_( kern ); + + face->root.num_glyphs = face->max_profile.numGlyphs; + + /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */ + /* a WWS-only font face. `WWS' stands for `weight', width', and */ + /* `slope', a term used by Microsoft's Windows Presentation */ + /* Foundation (WPF). This flag has been introduced in version */ + /* 1.5 of the OpenType specification (May 2008). */ + + face->root.family_name = NULL; + face->root.style_name = NULL; + if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 ) + { + if ( !ignore_preferred_family ) + GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + if ( !ignore_preferred_subfamily ) + GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + else + { + GET_NAME( WWS_FAMILY, &face->root.family_name ); + if ( !face->root.family_name && !ignore_preferred_family ) + GET_NAME( PREFERRED_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + GET_NAME( WWS_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name && !ignore_preferred_subfamily ) + GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + + /* now set up root fields */ + { + FT_Face root = &face->root; + FT_Long flags = root->face_flags; + + + /*********************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + if ( has_outline == TRUE ) + flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ + + /* The sfnt driver only supports bitmap fonts natively, thus we */ + /* don't set FT_FACE_FLAG_HINTER. */ + flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ + FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + if ( psnames_error == SFNT_Err_Ok && + face->postscript.FormatType != 0x00030000L ) + flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + /* fixed width font? */ + if ( face->postscript.isFixedPitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* vertical information? */ + if ( face->vertical_info ) + flags |= FT_FACE_FLAG_VERTICAL; + + /* kerning available ? */ + if ( TT_FACE_HAS_KERNING( face ) ) + flags |= FT_FACE_FLAG_KERNING; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Don't bother to load the tables unless somebody asks for them. */ + /* No need to do work which will (probably) not be used. */ + if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 && + tt_face_lookup_table( face, TTAG_fvar ) != 0 && + tt_face_lookup_table( face, TTAG_gvar ) != 0 ) + flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; +#endif + + root->face_flags = flags; + + /*********************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + + flags = 0; + if ( has_outline == TRUE && face->os2.version != 0xFFFFU ) + { + /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */ + /* indicates an oblique font face. This flag has been */ + /* introduced in version 1.5 of the OpenType specification. */ + + if ( face->os2.fsSelection & 512 ) /* bit 9 */ + flags |= FT_STYLE_FLAG_ITALIC; + else if ( face->os2.fsSelection & 1 ) /* bit 0 */ + flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->os2.fsSelection & 32 ) /* bit 5 */ + flags |= FT_STYLE_FLAG_BOLD; + } + else + { + /* this is an old Mac font, use the header field */ + + if ( face->header.Mac_Style & 1 ) + flags |= FT_STYLE_FLAG_BOLD; + + if ( face->header.Mac_Style & 2 ) + flags |= FT_STYLE_FLAG_ITALIC; + } + + root->style_flags = flags; + + /*********************************************************************/ + /* */ + /* Polish the charmaps. */ + /* */ + /* Try to set the charmap encoding according to the platform & */ + /* encoding ID of each charmap. */ + /* */ + + tt_face_build_cmaps( face ); /* ignore errors */ + + + /* set the encoding fields */ + { + FT_Int m; + + + for ( m = 0; m < root->num_charmaps; m++ ) + { + FT_CharMap charmap = root->charmaps[m]; + + + charmap->encoding = sfnt_find_encoding( charmap->platform_id, + charmap->encoding_id ); + +#if 0 + if ( root->charmap == NULL && + charmap->encoding == FT_ENCODING_UNICODE ) + { + /* set 'root->charmap' to the first Unicode encoding we find */ + root->charmap = charmap; + } +#endif + } + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* + * Now allocate the root array of FT_Bitmap_Size records and + * populate them. Unfortunately, it isn't possible to indicate bit + * depths in the FT_Bitmap_Size record. This is a design error. + */ + { + FT_UInt i, count; + + +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + count = face->sbit_num_strikes; +#else + count = (FT_UInt)face->num_sbit_strikes; +#endif + + if ( count > 0 ) + { + FT_Memory memory = face->root.stream->memory; + FT_UShort em_size = face->header.Units_Per_EM; + FT_Short avgwidth = face->os2.xAvgCharWidth; + FT_Size_Metrics metrics; + + + if ( em_size == 0 || face->os2.version == 0xFFFFU ) + { + avgwidth = 0; + em_size = 1; + } + + if ( FT_NEW_ARRAY( root->available_sizes, count ) ) + goto Exit; + + for ( i = 0; i < count; i++ ) + { + FT_Bitmap_Size* bsize = root->available_sizes + i; + + + error = sfnt->load_strike_metrics( face, i, &metrics ); + if ( error ) + goto Exit; + + bsize->height = (FT_Short)( metrics.height >> 6 ); + bsize->width = (FT_Short)( + ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); + + bsize->x_ppem = metrics.x_ppem << 6; + bsize->y_ppem = metrics.y_ppem << 6; + + /* assume 72dpi */ + bsize->size = metrics.y_ppem << 6; + } + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + root->num_fixed_sizes = (FT_Int)count; + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* a font with no bitmaps and no outlines is scalable; */ + /* it has only empty glyphs then */ + if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) ) + root->face_flags |= FT_FACE_FLAG_SCALABLE; + + + /*********************************************************************/ + /* */ + /* Set up metrics. */ + /* */ + if ( FT_IS_SCALABLE( root ) ) + { + /* XXX What about if outline header is missing */ + /* (e.g. sfnt wrapped bitmap)? */ + root->bbox.xMin = face->header.xMin; + root->bbox.yMin = face->header.yMin; + root->bbox.xMax = face->header.xMax; + root->bbox.yMax = face->header.yMax; + root->units_per_EM = face->header.Units_Per_EM; + + + /* XXX: Computing the ascender/descender/height is very different */ + /* from what the specification tells you. Apparently, we */ + /* must be careful because */ + /* */ + /* - not all fonts have an OS/2 table; in this case, we take */ + /* the values in the horizontal header. However, these */ + /* values very often are not reliable. */ + /* */ + /* - otherwise, the correct typographic values are in the */ + /* sTypoAscender, sTypoDescender & sTypoLineGap fields. */ + /* */ + /* However, certain fonts have these fields set to 0. */ + /* Rather, they have usWinAscent & usWinDescent correctly */ + /* set (but with different values). */ + /* */ + /* As an example, Arial Narrow is implemented through four */ + /* files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */ + /* */ + /* Strangely, all fonts have the same values in their */ + /* sTypoXXX fields, except ARIALNB which sets them to 0. */ + /* */ + /* On the other hand, they all have different */ + /* usWinAscent/Descent values -- as a conclusion, the OS/2 */ + /* table cannot be used to compute the text height reliably! */ + /* */ + + /* The ascender/descender/height are computed from the OS/2 table */ + /* when found. Otherwise, they're taken from the horizontal */ + /* header. */ + /* */ + + root->ascender = face->horizontal.Ascender; + root->descender = face->horizontal.Descender; + + root->height = (FT_Short)( root->ascender - root->descender + + face->horizontal.Line_Gap ); + +#if 0 + /* if the line_gap is 0, we add an extra 15% to the text height -- */ + /* this computation is based on various versions of Times New Roman */ + if ( face->horizontal.Line_Gap == 0 ) + root->height = (FT_Short)( ( root->height * 115 + 50 ) / 100 ); +#endif /* 0 */ + +#if 0 + /* some fonts have the OS/2 "sTypoAscender", "sTypoDescender" & */ + /* "sTypoLineGap" fields set to 0, like ARIALNB.TTF */ + if ( face->os2.version != 0xFFFFU && root->ascender ) + { + FT_Int height; + + + root->ascender = face->os2.sTypoAscender; + root->descender = -face->os2.sTypoDescender; + + height = root->ascender + root->descender + face->os2.sTypoLineGap; + if ( height > root->height ) + root->height = height; + } +#endif /* 0 */ + + root->max_advance_width = face->horizontal.advance_Width_Max; + root->max_advance_height = (FT_Short)( face->vertical_info + ? face->vertical.advance_Height_Max + : root->height ); + + /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */ + /* Adjust underline position from top edge to centre of */ + /* stroke to convert TrueType meaning to FreeType meaning. */ + root->underline_position = face->postscript.underlinePosition - + face->postscript.underlineThickness / 2; + root->underline_thickness = face->postscript.underlineThickness; + } + + } + + Exit: + FT_TRACE2(( "sfnt_load_face: done\n" )); + + return error; + } + + +#undef LOAD_ +#undef LOADM_ +#undef GET_NAME + + + FT_LOCAL_DEF( void ) + sfnt_done_face( TT_Face face ) + { + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = face->root.memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + { + /* destroy the postscript names table if it is loaded */ + if ( sfnt->free_psnames ) + sfnt->free_psnames( face ); + + /* destroy the embedded bitmaps table if it is loaded */ + if ( sfnt->free_eblc ) + sfnt->free_eblc( face ); + } + +#ifdef TT_CONFIG_OPTION_BDF + /* freeing the embedded BDF properties */ + tt_face_free_bdf_props( face ); +#endif + + /* freeing the kerning table */ + tt_face_done_kern( face ); + + /* freeing the collection table */ + FT_FREE( face->ttc_header.offsets ); + face->ttc_header.count = 0; + + /* freeing table directory */ + FT_FREE( face->dir_tables ); + face->num_tables = 0; + + { + FT_Stream stream = FT_FACE_STREAM( face ); + + + /* simply release the 'cmap' table frame */ + FT_FRAME_RELEASE( face->cmap_table ); + face->cmap_size = 0; + } + + /* freeing the horizontal metrics */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + { + FT_Stream stream = FT_FACE_STREAM( face ); + + + FT_FRAME_RELEASE( face->horz_metrics ); + FT_FRAME_RELEASE( face->vert_metrics ); + face->horz_metrics_size = 0; + face->vert_metrics_size = 0; + } +#else + FT_FREE( face->horizontal.long_metrics ); + FT_FREE( face->horizontal.short_metrics ); +#endif + + /* freeing the vertical ones, if any */ + if ( face->vertical_info ) + { + FT_FREE( face->vertical.long_metrics ); + FT_FREE( face->vertical.short_metrics ); + face->vertical_info = 0; + } + + /* freeing the gasp table */ + FT_FREE( face->gasp.gaspRanges ); + face->gasp.numRanges = 0; + + /* freeing the name table */ + if ( sfnt ) + sfnt->free_name( face ); + + /* freeing family and style name */ + FT_FREE( face->root.family_name ); + FT_FREE( face->root.style_name ); + + /* freeing sbit size table */ + FT_FREE( face->root.available_sizes ); + face->root.num_fixed_sizes = 0; + + FT_FREE( face->postscript_name ); + + face->sfnt = 0; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/sfobjs.h b/alienblaster/project/jni/freetype/src/sfnt/sfobjs.h new file mode 100644 index 000000000..6241c93b3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/sfobjs.h @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* sfobjs.h */ +/* */ +/* SFNT object management (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFOBJS_H__ +#define __SFOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + sfnt_done_face( TT_Face face ); + + +FT_END_HEADER + +#endif /* __SFDRIVER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttbdf.c b/alienblaster/project/jni/freetype/src/sfnt/ttbdf.c new file mode 100644 index 000000000..206cecee5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttbdf.c @@ -0,0 +1,250 @@ +/***************************************************************************/ +/* */ +/* ttbdf.c */ +/* */ +/* TrueType and OpenType embedded BDF properties (body). */ +/* */ +/* Copyright 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttbdf.h" + +#include "sferrors.h" + + +#ifdef TT_CONFIG_OPTION_BDF + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttbdf + + + FT_LOCAL_DEF( void ) + tt_face_free_bdf_props( TT_Face face ) + { + TT_BDF bdf = &face->bdf; + + + if ( bdf->loaded ) + { + FT_Stream stream = FT_FACE(face)->stream; + + + if ( bdf->table != NULL ) + FT_FRAME_RELEASE( bdf->table ); + + bdf->table_end = NULL; + bdf->strings = NULL; + bdf->strings_size = 0; + } + } + + + static FT_Error + tt_face_load_bdf_props( TT_Face face, + FT_Stream stream ) + { + TT_BDF bdf = &face->bdf; + FT_ULong length; + FT_Error error; + + + FT_ZERO( bdf ); + + error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); + if ( error || + length < 8 || + FT_FRAME_EXTRACT( length, bdf->table ) ) + { + error = FT_Err_Invalid_Table; + goto Exit; + } + + bdf->table_end = bdf->table + length; + + { + FT_Byte* p = bdf->table; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt num_strikes = FT_NEXT_USHORT( p ); + FT_ULong strings = FT_NEXT_ULONG ( p ); + FT_UInt count; + FT_Byte* strike; + + + if ( version != 0x0001 || + strings < 8 || + ( strings - 8 ) / 4 < num_strikes || + strings + 1 > length ) + { + goto BadTable; + } + + bdf->num_strikes = num_strikes; + bdf->strings = bdf->table + strings; + bdf->strings_size = length - strings; + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + count * 4; + + + for ( ; count > 0; count-- ) + { + FT_UInt num_items = FT_PEEK_USHORT( p + 2 ); + + /* + * We don't need to check the value sets themselves, since this + * is done later. + */ + strike += 10 * num_items; + + p += 4; + } + + if ( strike > bdf->strings ) + goto BadTable; + } + + bdf->loaded = 1; + + Exit: + return error; + + BadTable: + FT_FRAME_RELEASE( bdf->table ); + FT_ZERO( bdf ); + error = FT_Err_Invalid_Table; + goto Exit; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ) + { + TT_BDF bdf = &face->bdf; + FT_Size size = FT_FACE(face)->size; + FT_Error error = 0; + FT_Byte* p; + FT_UInt count; + FT_Byte* strike; + FT_Offset property_len; + + + aprop->type = BDF_PROPERTY_TYPE_NONE; + + if ( bdf->loaded == 0 ) + { + error = tt_face_load_bdf_props( face, FT_FACE( face )->stream ); + if ( error ) + goto Exit; + } + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + 4 * count; + + error = FT_Err_Invalid_Argument; + + if ( size == NULL || property_name == NULL ) + goto Exit; + + property_len = ft_strlen( property_name ); + if ( property_len == 0 ) + goto Exit; + + for ( ; count > 0; count-- ) + { + FT_UInt _ppem = FT_NEXT_USHORT( p ); + FT_UInt _count = FT_NEXT_USHORT( p ); + + if ( _ppem == size->metrics.y_ppem ) + { + count = _count; + goto FoundStrike; + } + + strike += 10 * _count; + } + goto Exit; + + FoundStrike: + p = strike; + for ( ; count > 0; count-- ) + { + FT_UInt type = FT_PEEK_USHORT( p + 4 ); + + if ( ( type & 0x10 ) != 0 ) + { + FT_UInt32 name_offset = FT_PEEK_ULONG( p ); + FT_UInt32 value = FT_PEEK_ULONG( p + 6 ); + + /* be a bit paranoid for invalid entries here */ + if ( name_offset < bdf->strings_size && + property_len < bdf->strings_size - name_offset && + ft_strncmp( property_name, + (const char*)bdf->strings + name_offset, + bdf->strings_size - name_offset ) == 0 ) + { + switch ( type & 0x0F ) + { + case 0x00: /* string */ + case 0x01: /* atoms */ + /* check that the content is really 0-terminated */ + if ( value < bdf->strings_size && + ft_memchr( bdf->strings + value, 0, bdf->strings_size ) ) + { + aprop->type = BDF_PROPERTY_TYPE_ATOM; + aprop->u.atom = (const char*)bdf->strings + value; + error = 0; + goto Exit; + } + break; + + case 0x02: + aprop->type = BDF_PROPERTY_TYPE_INTEGER; + aprop->u.integer = (FT_Int32)value; + error = 0; + goto Exit; + + case 0x03: + aprop->type = BDF_PROPERTY_TYPE_CARDINAL; + aprop->u.cardinal = value; + error = 0; + goto Exit; + + default: + ; + } + } + } + p += 10; + } + + Exit: + return error; + } + +#endif /* TT_CONFIG_OPTION_BDF */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttbdf.h b/alienblaster/project/jni/freetype/src/sfnt/ttbdf.h new file mode 100644 index 000000000..48a10d6e9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttbdf.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ttbdf.h */ +/* */ +/* TrueType and OpenType embedded BDF properties (specification). */ +/* */ +/* Copyright 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTBDF_H__ +#define __TTBDF_H__ + + +#include <ft2build.h> +#include "ttload.h" +#include FT_BDF_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + tt_face_free_bdf_props( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ); + + +FT_END_HEADER + +#endif /* __TTBDF_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttcmap.c b/alienblaster/project/jni/freetype/src/sfnt/ttcmap.c new file mode 100644 index 000000000..b283f6d16 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttcmap.c @@ -0,0 +1,3504 @@ +/***************************************************************************/ +/* */ +/* ttcmap.c */ +/* */ +/* TrueType character mapping table (cmap) support (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H + +#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */ + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_STREAM_H +#include "ttload.h" +#include "ttcmap.h" +#include "sfntpic.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttcmap + + +#define TT_PEEK_SHORT FT_PEEK_SHORT +#define TT_PEEK_USHORT FT_PEEK_USHORT +#define TT_PEEK_UINT24 FT_PEEK_UOFF3 +#define TT_PEEK_LONG FT_PEEK_LONG +#define TT_PEEK_ULONG FT_PEEK_ULONG + +#define TT_NEXT_SHORT FT_NEXT_SHORT +#define TT_NEXT_USHORT FT_NEXT_USHORT +#define TT_NEXT_UINT24 FT_NEXT_UOFF3 +#define TT_NEXT_LONG FT_NEXT_LONG +#define TT_NEXT_ULONG FT_NEXT_ULONG + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap_init( TT_CMap cmap, + FT_Byte* table ) + { + cmap->data = table; + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 0 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 0 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* glyph_ids 6 BYTE[256] array of glyph indices */ + /* 262 */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; + FT_UInt length = TT_NEXT_USHORT( p ); + + + if ( table + length > valid->limit || length < 262 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices whenever necessary */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt n, idx; + + + p = table + 6; + for ( n = 0; n < 256; n++ ) + { + idx = *p++; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap0_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + + + return char_code < 256 ? table[6 + char_code] : 0; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap0_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 charcode = *pchar_code; + FT_UInt32 result = 0; + FT_UInt gindex = 0; + + + table += 6; /* go to glyph IDs */ + while ( ++charcode < 256 ) + { + gindex = table[charcode]; + if ( gindex != 0 ) + { + result = charcode; + break; + } + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 0; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap0_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap0_char_index, + (FT_CMap_CharNextFunc) tt_cmap0_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 0, + (TT_CMap_ValidateFunc) tt_cmap0_validate, + (TT_CMap_Info_GetFunc) tt_cmap0_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 2 *****/ + /***** *****/ + /***** This is used for certain CJK encodings that encode text in a *****/ + /***** mixed 8/16 bits encoding along the following lines: *****/ + /***** *****/ + /***** * Certain byte values correspond to an 8-bit character code *****/ + /***** (typically in the range 0..127 for ASCII compatibility). *****/ + /***** *****/ + /***** * Certain byte values signal the first byte of a 2-byte *****/ + /***** character code (but these values are also valid as the *****/ + /***** second byte of a 2-byte character). *****/ + /***** *****/ + /***** The following charmap lookup and iteration functions all *****/ + /***** assume that the value "charcode" correspond to following: *****/ + /***** *****/ + /***** - For one byte characters, "charcode" is simply the *****/ + /***** character code. *****/ + /***** *****/ + /***** - For two byte characters, "charcode" is the 2-byte *****/ + /***** character code in big endian format. More exactly: *****/ + /***** *****/ + /***** (charcode >> 8) is the first byte value *****/ + /***** (charcode & 0xFF) is the second byte value *****/ + /***** *****/ + /***** Note that not all values of "charcode" are valid according *****/ + /***** to these rules, and the function moderately check the *****/ + /***** arguments. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 2 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* keys 6 USHORT[256] sub-header keys */ + /* subs 518 SUBHEAD[NSUBS] sub-headers array */ + /* glyph_ids 518+NSUB*8 USHORT[] glyph ID array */ + /* */ + /* The `keys' table is used to map charcode high-bytes to sub-headers. */ + /* The value of `NSUBS' is the number of sub-headers defined in the */ + /* table and is computed by finding the maximum of the `keys' table. */ + /* */ + /* Note that for any n, `keys[n]' is a byte offset within the `subs' */ + /* table, i.e., it is the corresponding sub-header index multiplied */ + /* by 8. */ + /* */ + /* Each sub-header has the following format: */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* first 0 USHORT first valid low-byte */ + /* count 2 USHORT number of valid low-bytes */ + /* delta 4 SHORT see below */ + /* offset 6 USHORT see below */ + /* */ + /* A sub-header defines, for each high-byte, the range of valid */ + /* low-bytes within the charmap. Note that the range defined by `first' */ + /* and `count' must be completely included in the interval [0..255] */ + /* according to the specification. */ + /* */ + /* If a character code is contained within a given sub-header, then */ + /* mapping it to a glyph index is done as follows: */ + /* */ + /* * The value of `offset' is read. This is a _byte_ distance from the */ + /* location of the `offset' field itself into a slice of the */ + /* `glyph_ids' table. Let's call it `slice' (it is a USHORT[] too). */ + /* */ + /* * The value `slice[char.lo - first]' is read. If it is 0, there is */ + /* no glyph for the charcode. Otherwise, the value of `delta' is */ + /* added to it (modulo 65536) to form a new glyph index. */ + /* */ + /* It is up to the validation routine to check that all offsets fall */ + /* within the glyph IDs table (and not within the `subs' table itself or */ + /* outside of the CMap). */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; /* skip format */ + FT_UInt length = TT_PEEK_USHORT( p ); + FT_UInt n, max_subs; + FT_Byte* keys; /* keys table */ + FT_Byte* subs; /* sub-headers */ + FT_Byte* glyph_ids; /* glyph ID array */ + + + if ( table + length > valid->limit || length < 6 + 512 ) + FT_INVALID_TOO_SHORT; + + keys = table + 6; + + /* parse keys to compute sub-headers count */ + p = keys; + max_subs = 0; + for ( n = 0; n < 256; n++ ) + { + FT_UInt idx = TT_NEXT_USHORT( p ); + + + /* value must be multiple of 8 */ + if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 ) + FT_INVALID_DATA; + + idx >>= 3; + + if ( idx > max_subs ) + max_subs = idx; + } + + FT_ASSERT( p == table + 518 ); + + subs = p; + glyph_ids = subs + (max_subs + 1) * 8; + if ( glyph_ids > valid->limit ) + FT_INVALID_TOO_SHORT; + + /* parse sub-headers */ + for ( n = 0; n <= max_subs; n++ ) + { + FT_UInt first_code, code_count, offset; + FT_Int delta; + FT_Byte* ids; + + + first_code = TT_NEXT_USHORT( p ); + code_count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT( p ); + offset = TT_NEXT_USHORT( p ); + + /* many Dynalab fonts have empty sub-headers */ + if ( code_count == 0 ) + continue; + + /* check range within 0..255 */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + if ( first_code >= 256 || first_code + code_count > 256 ) + FT_INVALID_DATA; + } + + /* check offset */ + if ( offset != 0 ) + { + ids = p - 2 + offset; + if ( ids < glyph_ids || ids + code_count*2 > table + length ) + FT_INVALID_OFFSET; + + /* check glyph IDs */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_Byte* limit = p + code_count * 2; + FT_UInt idx; + + + for ( ; p < limit; ) + { + idx = TT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = ( idx + delta ) & 0xFFFFU; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + } + + return SFNT_Err_Ok; + } + + + /* return sub header corresponding to a given character code */ + /* NULL on invalid charcode */ + static FT_Byte* + tt_cmap2_get_subheader( FT_Byte* table, + FT_UInt32 char_code ) + { + FT_Byte* result = NULL; + + + if ( char_code < 0x10000UL ) + { + FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); + FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); + FT_Byte* p = table + 6; /* keys table */ + FT_Byte* subs = table + 518; /* subheaders table */ + FT_Byte* sub; + + + if ( char_hi == 0 ) + { + /* an 8-bit character code -- we use subHeader 0 in this case */ + /* to test whether the character code is in the charmap */ + /* */ + sub = subs; /* jump to first sub-header */ + + /* check that the sub-header for this byte is 0, which */ + /* indicates that it is really a valid one-byte value */ + /* Otherwise, return 0 */ + /* */ + p += char_lo * 2; + if ( TT_PEEK_USHORT( p ) != 0 ) + goto Exit; + } + else + { + /* a 16-bit character code */ + + /* jump to key entry */ + p += char_hi * 2; + /* jump to sub-header */ + sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); + + /* check that the high byte isn't a valid one-byte value */ + if ( sub == subs ) + goto Exit; + } + result = sub; + } + Exit: + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap2_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* subheader; + + + subheader = tt_cmap2_get_subheader( table, char_code ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt idx = (FT_UInt)(char_code & 0xFF); + FT_UInt start, count; + FT_Int delta; + FT_UInt offset; + + + start = TT_NEXT_USHORT( p ); + count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT ( p ); + offset = TT_PEEK_USHORT( p ); + + idx -= start; + if ( idx < count && offset != 0 ) + { + p += offset + 2 * idx; + idx = TT_PEEK_USHORT( p ); + + if ( idx != 0 ) + result = (FT_UInt)( idx + delta ) & 0xFFFFU; + } + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap2_char_next( TT_CMap cmap, + FT_UInt32 *pcharcode ) + { + FT_Byte* table = cmap->data; + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 charcode = *pcharcode + 1; + FT_Byte* subheader; + + + while ( charcode < 0x10000UL ) + { + subheader = tt_cmap2_get_subheader( table, charcode ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_Int delta = TT_NEXT_SHORT ( p ); + FT_UInt offset = TT_PEEK_USHORT( p ); + FT_UInt char_lo = (FT_UInt)( charcode & 0xFF ); + FT_UInt pos, idx; + + + if ( offset == 0 ) + goto Next_SubHeader; + + if ( char_lo < start ) + { + char_lo = start; + pos = 0; + } + else + pos = (FT_UInt)( char_lo - start ); + + p += offset + pos * 2; + charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; + + for ( ; pos < count; pos++, charcode++ ) + { + idx = TT_NEXT_USHORT( p ); + + if ( idx != 0 ) + { + gindex = ( idx + delta ) & 0xFFFFU; + if ( gindex != 0 ) + { + result = charcode; + goto Exit; + } + } + } + } + + /* jump to next sub-header, i.e. higher byte value */ + Next_SubHeader: + charcode = FT_PAD_FLOOR( charcode, 256 ) + 256; + } + + Exit: + *pcharcode = result; + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 2; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap2_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap2_char_index, + (FT_CMap_CharNextFunc) tt_cmap2_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 2, + (TT_CMap_ValidateFunc) tt_cmap2_validate, + (TT_CMap_Info_GetFunc) tt_cmap2_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_2 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length */ + /* in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* segCountX2 6 USHORT 2*NUM_SEGS */ + /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */ + /* entrySelector 10 USHORT LOG_SEGS */ + /* rangeShift 12 USHORT segCountX2 - */ + /* searchRange */ + /* */ + /* endCount 14 USHORT[NUM_SEGS] end charcode for */ + /* each segment; last */ + /* is 0xFFFF */ + /* */ + /* pad 14+NUM_SEGS*2 USHORT padding */ + /* */ + /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */ + /* each segment */ + /* */ + /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */ + /* segment */ + /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */ + /* each segment; can be */ + /* zero */ + /* */ + /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID */ + /* ranges */ + /* */ + /* Character codes are modelled by a series of ordered (increasing) */ + /* intervals called segments. Each segment has start and end codes, */ + /* provided by the `startCount' and `endCount' arrays. Segments must */ + /* not overlap, and the last segment should always contain the value */ + /* 0xFFFF for `endCount'. */ + /* */ + /* The fields `searchRange', `entrySelector' and `rangeShift' are better */ + /* ignored (they are traces of over-engineering in the TrueType */ + /* specification). */ + /* */ + /* Each segment also has a signed `delta', as well as an optional offset */ + /* within the `glyphIds' table. */ + /* */ + /* If a segment's idOffset is 0, the glyph index corresponding to any */ + /* charcode within the segment is obtained by adding the value of */ + /* `idDelta' directly to the charcode, modulo 65536. */ + /* */ + /* Otherwise, a glyph index is taken from the glyph IDs sub-array for */ + /* the segment, and the value of `idDelta' is added to it. */ + /* */ + /* */ + /* Finally, note that a lot of fonts contain an invalid last segment, */ + /* where `start' and `end' are correctly set to 0xFFFF but both `delta' */ + /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with */ + /* OpenOffice.org). We need special code to deal with them correctly. */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + + typedef struct TT_CMap4Rec_ + { + TT_CMapRec cmap; + FT_UInt32 cur_charcode; /* current charcode */ + FT_UInt cur_gindex; /* current glyph index */ + + FT_UInt num_ranges; + FT_UInt cur_range; + FT_UInt cur_start; + FT_UInt cur_end; + FT_Int cur_delta; + FT_Byte* cur_values; + + } TT_CMap4Rec, *TT_CMap4; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_init( TT_CMap4 cmap, + FT_Byte* table ) + { + FT_Byte* p; + + + cmap->cmap.data = table; + + p = table + 6; + cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; + cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + cmap->cur_gindex = 0; + + return SFNT_Err_Ok; + } + + + static FT_Int + tt_cmap4_set_range( TT_CMap4 cmap, + FT_UInt range_index ) + { + FT_Byte* table = cmap->cmap.data; + FT_Byte* p; + FT_UInt num_ranges = cmap->num_ranges; + + + while ( range_index < num_ranges ) + { + FT_UInt offset; + + + p = table + 14 + range_index * 2; + cmap->cur_end = FT_PEEK_USHORT( p ); + + p += 2 + num_ranges * 2; + cmap->cur_start = FT_PEEK_USHORT( p ); + + p += num_ranges * 2; + cmap->cur_delta = FT_PEEK_SHORT( p ); + + p += num_ranges * 2; + offset = FT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( range_index >= num_ranges - 1 && + cmap->cur_start == 0xFFFFU && + cmap->cur_end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + cmap->cur_delta = 1; + offset = 0; + } + } + + if ( offset != 0xFFFFU ) + { + cmap->cur_values = offset ? p + offset : NULL; + cmap->cur_range = range_index; + return 0; + } + + /* we skip empty segments */ + range_index++; + } + + return -1; + } + + + /* search the index of the charcode next to cmap->cur_charcode; */ + /* caller should call tt_cmap4_set_range with proper range */ + /* before calling this function */ + /* */ + static void + tt_cmap4_next( TT_CMap4 cmap ) + { + FT_UInt charcode; + + + if ( cmap->cur_charcode >= 0xFFFFUL ) + goto Fail; + + charcode = (FT_UInt)cmap->cur_charcode + 1; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + + for ( ;; ) + { + FT_Byte* values = cmap->cur_values; + FT_UInt end = cmap->cur_end; + FT_Int delta = cmap->cur_delta; + + + if ( charcode <= end ) + { + if ( values ) + { + FT_Byte* p = values + 2 * ( charcode - cmap->cur_start ); + + + do + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex != 0 ) + { + gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU ); + if ( gindex != 0 ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } + } while ( ++charcode <= end ); + } + else + { + do + { + FT_UInt gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU ); + + + if ( gindex != 0 ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } while ( ++charcode <= end ); + } + } + + /* we need to find another range */ + if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 ) + break; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + } + + Fail: + cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + cmap->cur_gindex = 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; /* skip format */ + FT_UInt length = TT_NEXT_USHORT( p ); + FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids; + FT_UInt num_segs; + FT_Error error = SFNT_Err_Ok; + + + if ( length < 16 ) + FT_INVALID_TOO_SHORT; + + /* in certain fonts, the `length' field is invalid and goes */ + /* out of bound. We try to correct this here... */ + if ( table + length > valid->limit ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_TOO_SHORT; + + length = (FT_UInt)( valid->limit - table ); + } + + p = table + 6; + num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */ + + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check that we have an even value here */ + if ( num_segs & 1 ) + FT_INVALID_DATA; + } + + num_segs /= 2; + + if ( length < 16 + num_segs * 2 * 4 ) + FT_INVALID_TOO_SHORT; + + /* check the search parameters - even though we never use them */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check the values of `searchRange', `entrySelector', `rangeShift' */ + FT_UInt search_range = TT_NEXT_USHORT( p ); + FT_UInt entry_selector = TT_NEXT_USHORT( p ); + FT_UInt range_shift = TT_NEXT_USHORT( p ); + + + if ( ( search_range | range_shift ) & 1 ) /* must be even values */ + FT_INVALID_DATA; + + search_range /= 2; + range_shift /= 2; + + /* `search range' is the greatest power of 2 that is <= num_segs */ + + if ( search_range > num_segs || + search_range * 2 < num_segs || + search_range + range_shift != num_segs || + search_range != ( 1U << entry_selector ) ) + FT_INVALID_DATA; + } + + ends = table + 14; + starts = table + 16 + num_segs * 2; + deltas = starts + num_segs * 2; + offsets = deltas + num_segs * 2; + glyph_ids = offsets + num_segs * 2; + + /* check last segment; its end count value must be 0xFFFF */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + p = ends + ( num_segs - 1 ) * 2; + if ( TT_PEEK_USHORT( p ) != 0xFFFFU ) + FT_INVALID_DATA; + } + + { + FT_UInt start, end, offset, n; + FT_UInt last_start = 0, last_end = 0; + FT_Int delta; + FT_Byte* p_start = starts; + FT_Byte* p_end = ends; + FT_Byte* p_delta = deltas; + FT_Byte* p_offset = offsets; + + + for ( n = 0; n < num_segs; n++ ) + { + p = p_offset; + start = TT_NEXT_USHORT( p_start ); + end = TT_NEXT_USHORT( p_end ); + delta = TT_NEXT_SHORT( p_delta ); + offset = TT_NEXT_USHORT( p_offset ); + + if ( start > end ) + FT_INVALID_DATA; + + /* this test should be performed at default validation level; */ + /* unfortunately, some popular Asian fonts have overlapping */ + /* ranges in their charmaps */ + /* */ + if ( start <= last_end && n > 0 ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + else + { + /* allow overlapping segments, provided their start points */ + /* and end points, respectively, are in ascending order */ + /* */ + if ( last_start > start || last_end > end ) + error |= TT_CMAP_FLAG_UNSORTED; + else + error |= TT_CMAP_FLAG_OVERLAPPING; + } + } + + if ( offset && offset != 0xFFFFU ) + { + p += offset; /* start of glyph ID array */ + + /* check that we point within the glyph IDs table only */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > table + length ) + FT_INVALID_DATA; + } + /* Some fonts handle the last segment incorrectly. In */ + /* theory, 0xFFFF might point to an ordinary glyph -- */ + /* a cmap 4 is versatile and could be used for any */ + /* encoding, not only Unicode. However, reality shows */ + /* that far too many fonts are sloppy and incorrectly */ + /* set all fields but `start' and `end' for the last */ + /* segment if it contains only a single character. */ + /* */ + /* We thus omit the test here, delaying it to the */ + /* routines which actually access the cmap. */ + else if ( n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > valid->limit ) + FT_INVALID_DATA; + } + + /* check glyph indices within the segment range */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt i, idx; + + + for ( i = start; i < end; i++ ) + { + idx = FT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = (FT_UInt)( idx + delta ) & 0xFFFFU; + + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + else if ( offset == 0xFFFFU ) + { + /* some fonts (erroneously?) use a range offset of 0xFFFF */ + /* to mean missing glyph in cmap table */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID || + n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + FT_INVALID_DATA; + } + + last_start = start; + last_end = end; + } + } + + return error; + } + + + static FT_UInt + tt_cmap4_char_map_linear( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt i, num_segs; + FT_UInt32 charcode = *pcharcode; + FT_UInt gindex = 0; + FT_Byte* p; + + + p = cmap->data + 6; + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + + num_segs = num_segs2 >> 1; + + if ( !num_segs ) + return 0; + + if ( next ) + charcode++; + + /* linear search */ + for ( ; charcode <= 0xFFFFU; charcode++ ) + { + FT_Byte* q; + + + p = cmap->data + 14; /* ends table */ + q = cmap->data + 16 + num_segs2; /* starts table */ + + for ( i = 0; i < num_segs; i++ ) + { + end = TT_NEXT_USHORT( p ); + start = TT_NEXT_USHORT( q ); + + if ( charcode >= start && charcode <= end ) + { + p = q - 2 + num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( i >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + if ( offset == 0xFFFFU ) + continue; + + if ( offset ) + { + p += offset + ( charcode - start ) * 2; + gindex = TT_PEEK_USHORT( p ); + if ( gindex != 0 ) + gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; + } + else + gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU; + + break; + } + } + + if ( !next || gindex ) + break; + } + + if ( next && gindex ) + *pcharcode = charcode; + + return gindex; + } + + + static FT_UInt + tt_cmap4_char_map_binary( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt max, min, mid, num_segs; + FT_UInt charcode = (FT_UInt)*pcharcode; + FT_UInt gindex = 0; + FT_Byte* p; + + + p = cmap->data + 6; + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + + if ( !num_segs2 ) + return 0; + + num_segs = num_segs2 >> 1; + + /* make compiler happy */ + mid = num_segs; + end = 0xFFFFU; + + if ( next ) + charcode++; + + min = 0; + max = num_segs; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + + if ( charcode < start ) + max = mid; + else if ( charcode > end ) + min = mid + 1; + else + { + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( mid >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + /* search the first segment containing `charcode' */ + if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING ) + { + FT_UInt i; + + + /* call the current segment `max' */ + max = mid; + + if ( offset == 0xFFFFU ) + mid = max + 1; + + /* search in segments before the current segment */ + for ( i = max ; i > 0; i-- ) + { + FT_UInt prev_end; + FT_Byte* old_p; + + + old_p = p; + p = cmap->data + 14 + ( i - 1 ) * 2; + prev_end = TT_PEEK_USHORT( p ); + + if ( charcode > prev_end ) + { + p = old_p; + break; + } + + end = prev_end; + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i - 1; + } + + /* no luck */ + if ( mid == max + 1 ) + { + if ( i != max ) + { + p = cmap->data + 14 + max * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + + mid = max; + + /* search in segments after the current segment */ + for ( i = max + 1; i < num_segs; i++ ) + { + FT_UInt next_end, next_start; + + + p = cmap->data + 14 + i * 2; + next_end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + next_start = TT_PEEK_USHORT( p ); + + if ( charcode < next_start ) + break; + + end = next_end; + start = next_start; + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i; + } + i--; + + /* still no luck */ + if ( mid == max ) + { + mid = i; + + break; + } + } + + /* end, start, delta, and offset are for the i'th segment */ + if ( mid != i ) + { + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + } + else + { + if ( offset == 0xFFFFU ) + break; + } + + if ( offset ) + { + p += offset + ( charcode - start ) * 2; + gindex = TT_PEEK_USHORT( p ); + if ( gindex != 0 ) + gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU; + } + else + gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU; + + break; + } + } + + if ( next ) + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* if `charcode' is not in any segment, then `mid' is */ + /* the segment nearest to `charcode' */ + /* */ + + if ( charcode > end ) + { + mid++; + if ( mid == num_segs ) + return 0; + } + + if ( tt_cmap4_set_range( cmap4, mid ) ) + { + if ( gindex ) + *pcharcode = charcode; + } + else + { + cmap4->cur_charcode = charcode; + + if ( gindex ) + cmap4->cur_gindex = gindex; + else + { + cmap4->cur_charcode = charcode; + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + } + + if ( gindex ) + *pcharcode = cmap4->cur_charcode; + } + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap4_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + if ( char_code >= 0x10000UL ) + return 0; + + if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) + return tt_cmap4_char_map_linear( cmap, &char_code, 0 ); + else + return tt_cmap4_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap4_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt gindex; + + + if ( *pchar_code >= 0xFFFFU ) + return 0; + + if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) + gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 ); + else + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* no need to search */ + if ( *pchar_code == cmap4->cur_charcode ) + { + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + if ( gindex ) + *pchar_code = cmap4->cur_charcode; + } + else + gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 ); + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 4; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap4_class_rec, + sizeof ( TT_CMap4Rec ), + (FT_CMap_InitFunc) tt_cmap4_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap4_char_index, + (FT_CMap_CharNextFunc) tt_cmap4_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 4, + (TT_CMap_ValidateFunc) tt_cmap4_validate, + (TT_CMap_Info_GetFunc) tt_cmap4_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_4 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* first 6 USHORT first segment code */ + /* count 8 USHORT segment size in chars */ + /* glyphIds 10 USHORT[count] glyph IDs */ + /* */ + /* A very simplified segment mapping. */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length, count; + + + if ( table + 10 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; + length = TT_NEXT_USHORT( p ); + + p = table + 8; /* skip language and start index */ + count = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 10 + count * 2 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap6_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx = (FT_UInt)( char_code - start ); + + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap6_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx; + + + if ( char_code >= 0x10000UL ) + goto Exit; + + if ( char_code < start ) + char_code = start; + + idx = (FT_UInt)( char_code - start ); + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + { + result = char_code; + break; + } + char_code++; + } + + Exit: + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 6; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap6_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap6_char_index, + (FT_CMap_CharNextFunc) tt_cmap6_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 6, + (TT_CMap_ValidateFunc) tt_cmap6_validate, + (TT_CMap_Info_GetFunc) tt_cmap6_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_6 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 8 *****/ + /***** *****/ + /***** It is hard to completely understand what the OpenType spec *****/ + /***** says about this format, but here is my conclusion. *****/ + /***** *****/ + /***** The purpose of this format is to easily map UTF-16 text to *****/ + /***** glyph indices. Basically, the `char_code' must be in one of *****/ + /***** the following formats: *****/ + /***** *****/ + /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/ + /***** Area (i.e. U+D800-U+DFFF). *****/ + /***** *****/ + /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/ + /***** `char_code = (char_hi << 16) | char_lo', then both *****/ + /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/ + /***** Area. *****/ + /***** *****/ + /***** The `is32' table embedded in the charmap indicates whether a *****/ + /***** given 16-bit value is in the surrogates area or not. *****/ + /***** *****/ + /***** So, for any given `char_code', we can assert the following: *****/ + /***** *****/ + /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/ + /***** *****/ + /***** If `char_hi != 0' then we must have both *****/ + /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 8 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* is32 12 BYTE[8192] 32-bitness bitmap */ + /* count 8204 ULONG number of groups */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph ID for the group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_Byte* is32; + FT_UInt32 length; + FT_UInt32 num_groups; + + + if ( table + 16 + 8192 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 ) + FT_INVALID_TOO_SHORT; + + is32 = table + 12; + p = is32 + 8192; /* skip `is32' array */ + num_groups = TT_NEXT_ULONG( p ); + + if ( p + num_groups * 12 > valid->limit ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_UInt32 n, start, end, start_id, count, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + FT_UInt hi, lo; + + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + + count = (FT_UInt32)( end - start + 1 ); + + if ( start & ~0xFFFFU ) + { + /* start_hi != 0; check that is32[i] is 1 for each i in */ + /* the `hi' and `lo' of the range [start..end] */ + for ( ; count > 0; count--, start++ ) + { + hi = (FT_UInt)( start >> 16 ); + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + } + } + else + { + /* start_hi == 0; check that is32[i] is 0 for each i in */ + /* the range [start..end] */ + + /* end_hi cannot be != 0! */ + if ( end & ~0xFFFFU ) + FT_INVALID_DATA; + + for ( ; count > 0; count--, start++ ) + { + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 ) + FT_INVALID_DATA; + } + } + } + + last = end; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap8_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + break; + + if ( char_code <= end ) + { + result = (FT_UInt)( start_id + char_code - start ); + break; + } + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap8_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + FT_Byte* table = cmap->data; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + p = table + 8208; + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + if ( char_code <= end ) + { + gindex = (FT_UInt)( char_code - start + start_id ); + if ( gindex != 0 ) + { + result = char_code; + goto Exit; + } + } + } + + Exit: + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 8; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap8_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap8_char_index, + (FT_CMap_CharNextFunc) tt_cmap8_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 8, + (TT_CMap_ValidateFunc) tt_cmap8_validate, + (TT_CMap_Info_GetFunc) tt_cmap8_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_8 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 10 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 10 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* */ + /* start 12 ULONG first char in range */ + /* count 16 ULONG number of chars in range */ + /* glyphIds 20 USHORT[count] glyph indices covered */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_ULong length, count; + + + if ( table + 20 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + p = table + 16; + count = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + length < 20 + count * 2 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap10_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx = (FT_ULong)( char_code - start ); + + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap10_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx; + + + if ( char_code < start ) + char_code = start; + + idx = (FT_UInt32)( char_code - start ); + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + break; + char_code++; + } + + *pchar_code = char_code; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 10; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap10_class_rec, + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap10_char_index, + (FT_CMap_CharNextFunc) tt_cmap10_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 10, + (TT_CMap_ValidateFunc) tt_cmap10_validate, + (TT_CMap_Info_GetFunc) tt_cmap10_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_10 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 12 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 12 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* count 12 ULONG number of groups */ + /* 16 */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph ID for the group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + + typedef struct TT_CMap12Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap12Rec, *TT_CMap12; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_init( TT_CMap12 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 12; + cmap->num_groups = FT_PEEK_ULONG( table ); + + cmap->valid = 0; + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + length < 16 + 12 * num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, start_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return SFNT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap12_next( TT_CMap12 cmap ) + { + FT_Byte* p; + FT_ULong start, end, start_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) + goto Fail; + + char_code = cmap->cur_charcode + 1; + + n = cmap->cur_group; + + for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + { + p = cmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + for ( ; char_code <= end; char_code++ ) + { + gindex = (FT_UInt)( start_id + char_code - start ); + + if ( gindex ) + { + cmap->cur_charcode = char_code;; + cmap->cur_gindex = gindex; + cmap->cur_group = n; + + return; + } + } + } + + Fail: + cmap->valid = 0; + } + + + static FT_UInt + tt_cmap12_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code; + FT_UInt32 start, end, start_id; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + /* make compiler happy */ + mid = num_groups; + end = 0xFFFFFFFFUL; + + if ( next ) + char_code++; + + min = 0; + max = num_groups; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + start_id = TT_PEEK_ULONG( p ); + gindex = (FT_UInt)( start_id + char_code - start ); + + break; + } + } + + if ( next ) + { + TT_CMap12 cmap12 = (TT_CMap12)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + /* */ + + if ( char_code > end ) + { + mid++; + if ( mid == num_groups ) + return 0; + } + + cmap12->valid = 1; + cmap12->cur_charcode = char_code; + cmap12->cur_group = mid; + + if ( !gindex ) + { + tt_cmap12_next( cmap12 ); + + if ( cmap12->valid ) + gindex = cmap12->cur_gindex; + } + else + cmap12->cur_gindex = gindex; + + if ( gindex ) + *pchar_code = cmap12->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap12_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + return tt_cmap12_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap12_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + TT_CMap12 cmap12 = (TT_CMap12)cmap; + FT_ULong gindex; + + + if ( cmap12->cur_charcode >= 0xFFFFFFFFUL ) + return 0; + + /* no need to search */ + if ( cmap12->valid && cmap12->cur_charcode == *pchar_code ) + { + tt_cmap12_next( cmap12 ); + if ( cmap12->valid ) + { + gindex = cmap12->cur_gindex; + + /* XXX: check cur_charcode overflow is expected */ + if ( gindex ) + *pchar_code = (FT_UInt32)cmap12->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 ); + + /* XXX: check gindex overflow is expected */ + return (FT_UInt32)gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 12; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap12_class_rec, + sizeof ( TT_CMap12Rec ), + + (FT_CMap_InitFunc) tt_cmap12_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap12_char_index, + (FT_CMap_CharNextFunc) tt_cmap12_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 12, + (TT_CMap_ValidateFunc) tt_cmap12_validate, + (TT_CMap_Info_GetFunc) tt_cmap12_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_12 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 13 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 13 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* count 12 ULONG number of groups */ + /* 16 */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* glyphId 8 ULONG glyph ID for the whole group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_13 + + typedef struct TT_CMap13Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap13Rec, *TT_CMap13; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_init( TT_CMap13 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 12; + cmap->num_groups = FT_PEEK_ULONG( table ); + + cmap->valid = 0; + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + length < 16 + 12 * num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, glyph_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + glyph_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return SFNT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap13_next( TT_CMap13 cmap ) + { + FT_Byte* p; + FT_ULong start, end, glyph_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) + goto Fail; + + char_code = cmap->cur_charcode + 1; + + n = cmap->cur_group; + + for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + { + p = cmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + glyph_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + if ( char_code <= end ) + { + gindex = (FT_UInt)glyph_id; + + if ( gindex ) + { + cmap->cur_charcode = char_code;; + cmap->cur_gindex = gindex; + cmap->cur_group = n; + + return; + } + } + } + + Fail: + cmap->valid = 0; + } + + + static FT_UInt + tt_cmap13_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code; + FT_UInt32 start, end; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + /* make compiler happy */ + mid = num_groups; + end = 0xFFFFFFFFUL; + + if ( next ) + char_code++; + + min = 0; + max = num_groups; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + gindex = (FT_UInt)TT_PEEK_ULONG( p ); + + break; + } + } + + if ( next ) + { + TT_CMap13 cmap13 = (TT_CMap13)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + /* */ + + if ( char_code > end ) + { + mid++; + if ( mid == num_groups ) + return 0; + } + + cmap13->valid = 1; + cmap13->cur_charcode = char_code; + cmap13->cur_group = mid; + + if ( !gindex ) + { + tt_cmap13_next( cmap13 ); + + if ( cmap13->valid ) + gindex = cmap13->cur_gindex; + } + else + cmap13->cur_gindex = gindex; + + if ( gindex ) + *pchar_code = cmap13->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap13_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + return tt_cmap13_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap13_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + TT_CMap13 cmap13 = (TT_CMap13)cmap; + FT_UInt gindex; + + + if ( cmap13->cur_charcode >= 0xFFFFFFFFUL ) + return 0; + + /* no need to search */ + if ( cmap13->valid && cmap13->cur_charcode == *pchar_code ) + { + tt_cmap13_next( cmap13 ); + if ( cmap13->valid ) + { + gindex = cmap13->cur_gindex; + if ( gindex ) + *pchar_code = cmap13->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 ); + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 13; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return SFNT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP(tt_cmap13_class_rec, + sizeof ( TT_CMap13Rec ), + + (FT_CMap_InitFunc) tt_cmap13_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)tt_cmap13_char_index, + (FT_CMap_CharNextFunc) tt_cmap13_char_next, + + NULL, NULL, NULL, NULL, NULL + , + 13, + (TT_CMap_ValidateFunc) tt_cmap13_validate, + (TT_CMap_Info_GetFunc) tt_cmap13_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_13 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 14 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 14 */ + /* length 2 ULONG table length in bytes */ + /* numSelector 6 ULONG number of variation sel. records */ + /* */ + /* Followed by numSelector records, each of which looks like */ + /* */ + /* varSelector 0 UINT24 Unicode codepoint of sel. */ + /* defaultOff 3 ULONG offset to a default UVS table */ + /* describing any variants to be found in */ + /* the normal Unicode subtable. */ + /* nonDefOff 7 ULONG offset to a non-default UVS table */ + /* describing any variants not in the */ + /* standard cmap, with GIDs here */ + /* (either offset may be 0 NULL) */ + /* */ + /* Selectors are sorted by code point. */ + /* */ + /* A default Unicode Variation Selector (UVS) subtable is just a list of */ + /* ranges of code points which are to be found in the standard cmap. No */ + /* glyph IDs (GIDs) here. */ + /* */ + /* numRanges 0 ULONG number of ranges following */ + /* */ + /* A range looks like */ + /* */ + /* uniStart 0 UINT24 code point of the first character in */ + /* this range */ + /* additionalCnt 3 UBYTE count of additional characters in this */ + /* range (zero means a range of a single */ + /* character) */ + /* */ + /* Ranges are sorted by `uniStart'. */ + /* */ + /* A non-default Unicode Variation Selector (UVS) subtable is a list of */ + /* mappings from codepoint to GID. */ + /* */ + /* numMappings 0 ULONG number of mappings */ + /* */ + /* A range looks like */ + /* */ + /* uniStart 0 UINT24 code point of the first character in */ + /* this range */ + /* GID 3 USHORT and its GID */ + /* */ + /* Ranges are sorted by `uniStart'. */ + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + + typedef struct TT_CMap14Rec_ + { + TT_CMapRec cmap; + FT_ULong num_selectors; + + /* This array is used to store the results of various + * cmap 14 query functions. The data is overwritten + * on each call to these functions. + */ + FT_UInt32 max_results; + FT_UInt32* results; + FT_Memory memory; + + } TT_CMap14Rec, *TT_CMap14; + + + FT_CALLBACK_DEF( void ) + tt_cmap14_done( TT_CMap14 cmap ) + { + FT_Memory memory = cmap->memory; + + + cmap->max_results = 0; + if ( memory != NULL && cmap->results != NULL ) + FT_FREE( cmap->results ); + } + + + static FT_Error + tt_cmap14_ensure( TT_CMap14 cmap, + FT_UInt32 num_results, + FT_Memory memory ) + { + FT_UInt32 old_max = cmap->max_results; + FT_Error error = 0; + + + if ( num_results > cmap->max_results ) + { + cmap->memory = memory; + + if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) ) + return error; + + cmap->max_results = num_results; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_init( TT_CMap14 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 6; + cmap->num_selectors = FT_PEEK_ULONG( table ); + cmap->max_results = 0; + cmap->results = NULL; + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 2; + FT_ULong length = TT_NEXT_ULONG( p ); + FT_ULong num_selectors = TT_NEXT_ULONG( p ); + + + if ( length > (FT_ULong)( valid->limit - table ) || + length < 10 + 11 * num_selectors ) + FT_INVALID_TOO_SHORT; + + /* check selectors, they must be in increasing order */ + { + /* we start lastVarSel at 1 because a variant selector value of 0 + * isn't valid. + */ + FT_ULong n, lastVarSel = 1; + + + for ( n = 0; n < num_selectors; n++ ) + { + FT_ULong varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( defOff >= length || nondefOff >= length ) + FT_INVALID_TOO_SHORT; + + if ( varSel < lastVarSel ) + FT_INVALID_DATA; + + lastVarSel = varSel + 1; + + /* check the default table (these glyphs should be reached */ + /* through the normal Unicode cmap, no GIDs, just check order) */ + if ( defOff != 0 ) + { + FT_Byte* defp = table + defOff; + FT_ULong numRanges = TT_NEXT_ULONG( defp ); + FT_ULong i; + FT_ULong lastBase = 0; + + + if ( defp + numRanges * 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numRanges; ++i ) + { + FT_ULong base = TT_NEXT_UINT24( defp ); + FT_ULong cnt = FT_NEXT_BYTE( defp ); + + + if ( base + cnt >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( base < lastBase ) + FT_INVALID_DATA; + + lastBase = base + cnt + 1U; + } + } + + /* and the non-default table (these glyphs are specified here) */ + if ( nondefOff != 0 ) { + FT_Byte* ndp = table + nondefOff; + FT_ULong numMappings = TT_NEXT_ULONG( ndp ); + FT_ULong i, lastUni = 0; + + + if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numMappings; ++i ) + { + FT_ULong uni = TT_NEXT_UINT24( ndp ); + FT_ULong gid = TT_NEXT_USHORT( ndp ); + + + if ( uni >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( uni < lastUni ) + FT_INVALID_DATA; + + lastUni = uni + 1U; + + if ( valid->level >= FT_VALIDATE_TIGHT && + gid >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + + return SFNT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_UNUSED( cmap ); + FT_UNUSED( char_code ); + + /* This can't happen */ + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap14_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UNUSED( cmap ); + + /* This can't happen */ + *pchar_code = 0; + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_UNUSED( cmap ); + + cmap_info->format = 14; + /* subtable 14 does not define a language field */ + cmap_info->language = 0xFFFFFFFFUL; + + return SFNT_Err_Ok; + } + + + static FT_UInt + tt_cmap14_char_map_def_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numRanges = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numRanges; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 4 * mid; + FT_ULong start = TT_NEXT_UINT24( p ); + FT_UInt cnt = FT_NEXT_BYTE( p ); + + + if ( char_code < start ) + max = mid; + else if ( char_code > start+cnt ) + min = mid + 1; + else + return TRUE; + } + + return FALSE; + } + + + static FT_UInt + tt_cmap14_char_map_nondef_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numMappings = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numMappings; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 5 * mid; + FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); + + + if ( char_code < uni ) + max = mid; + else if ( char_code > uni ) + min = mid + 1; + else + return TT_PEEK_USHORT( p ); + } + + return 0; + } + + + static FT_Byte* + tt_cmap14_find_variant( FT_Byte *base, + FT_UInt32 variantCode ) + { + FT_UInt32 numVar = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numVar; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 11 * mid; + FT_ULong varSel = TT_NEXT_UINT24( p ); + + + if ( variantCode < varSel ) + max = mid; + else if ( variantCode > varSel ) + min = mid + 1; + else + return p; + } + + return NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_var_index( TT_CMap cmap, + TT_CMap ucmap, + FT_UInt32 charcode, + FT_UInt32 variantSelector) + { + FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return 0; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_PEEK_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + { + /* This is the default variant of this charcode. GID not stored */ + /* here; stored in the normal Unicode charmap instead. */ + return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode ); + } + + if ( nondefOff != 0 ) + return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charcode ); + + return 0; + } + + + FT_CALLBACK_DEF( FT_Int ) + tt_cmap14_char_var_isdefault( TT_CMap cmap, + FT_UInt32 charcode, + FT_UInt32 variantSelector ) + { + FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return -1; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + return 1; + + if ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charcode ) != 0 ) + return 0; + + return -1; + } + + + FT_CALLBACK_DEF( FT_UInt32* ) + tt_cmap14_variants( TT_CMap cmap, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14)cmap; + FT_UInt32 count = cmap14->num_selectors; + FT_Byte* p = cmap->data + 10; + FT_UInt32* result; + FT_UInt32 i; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + result = cmap14->results; + for ( i = 0; i < count; ++i ) + { + result[i] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 8; + } + result[i] = 0; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_char_variants( TT_CMap cmap, + FT_Memory memory, + FT_UInt32 charCode ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 count = cmap14->num_selectors; + FT_Byte* p = cmap->data + 10; + FT_UInt32* q; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; count > 0; --count ) + { + FT_UInt32 varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, + charCode ) ) || + ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charCode ) != 0 ) ) + { + q[0] = varSel; + q++; + } + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt + tt_cmap14_def_char_count( FT_Byte *p ) + { + FT_UInt32 numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); + FT_UInt tot = 0; + + + p += 3; /* point to the first `cnt' field */ + for ( ; numRanges > 0; numRanges-- ) + { + tot += 1 + p[0]; + p += 4; + } + + return tot; + } + + + static FT_UInt32* + tt_cmap14_get_def_chars( TT_CMap cmap, + FT_Byte* p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt cnt; + FT_UInt32* q; + + + cnt = tt_cmap14_def_char_count( p ); + numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; numRanges > 0; --numRanges ) + { + FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); + + + cnt = FT_NEXT_BYTE( p ) + 1; + do + { + q[0] = uni; + uni += 1; + q += 1; + } while ( --cnt != 0 ); + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt32* + tt_cmap14_get_nondef_chars( TT_CMap cmap, + FT_Byte *p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numMappings; + FT_UInt i; + FT_UInt32 *ret; + + + numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + for ( i = 0; i < numMappings; ++i ) + { + ret[i] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + } + ret[i] = 0; + + return ret; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_variant_chars( TT_CMap cmap, + FT_Memory memory, + FT_UInt32 variantSelector ) + { + FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, + variantSelector ); + FT_UInt32 *ret; + FT_Int i; + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return NULL; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff == 0 && nondefOff == 0 ) + return NULL; + + if ( defOff == 0 ) + return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + memory ); + else if ( nondefOff == 0 ) + return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + memory ); + else + { + /* Both a default and a non-default glyph set? That's probably not */ + /* good font design, but the spec allows for it... */ + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt32 numMappings; + FT_UInt32 duni; + FT_UInt32 dcnt; + FT_UInt32 nuni; + FT_Byte* dp; + FT_UInt di, ni, k; + + + p = cmap->data + nondefOff; + dp = cmap->data + defOff; + + numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); + dcnt = tt_cmap14_def_char_count( dp ); + numRanges = (FT_UInt32)TT_NEXT_ULONG( dp ); + + if ( numMappings == 0 ) + return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + memory ); + if ( dcnt == 0 ) + return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + memory ); + + if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + di = 1; + nuni = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + ni = 1; + i = 0; + + for ( ;; ) + { + if ( nuni > duni + dcnt ) + { + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + + ++di; + + if ( di > numRanges ) + break; + + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + } + else + { + if ( nuni < duni ) + ret[i++] = nuni; + /* If it is within the default range then ignore it -- */ + /* that should not have happened */ + ++ni; + if ( ni > numMappings ) + break; + + nuni = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + } + } + + if ( ni <= numMappings ) + { + /* If we get here then we have run out of all default ranges. */ + /* We have read one non-default mapping which we haven't stored */ + /* and there may be others that need to be read. */ + ret[i++] = nuni; + while ( ni < numMappings ) + { + ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + ++ni; + } + } + else if ( di <= numRanges ) + { + /* If we get here then we have run out of all non-default */ + /* mappings. We have read one default range which we haven't */ + /* stored and there may be others that need to be read. */ + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + + while ( di < numRanges ) + { + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + + for ( k = 0; k <= dcnt; ++k ) + ret[i++] = duni + k; + ++di; + } + } + + ret[i] = 0; + + return ret; + } + } + + + FT_DEFINE_TT_CMAP(tt_cmap14_class_rec, + sizeof ( TT_CMap14Rec ), + + (FT_CMap_InitFunc) tt_cmap14_init, + (FT_CMap_DoneFunc) tt_cmap14_done, + (FT_CMap_CharIndexFunc)tt_cmap14_char_index, + (FT_CMap_CharNextFunc) tt_cmap14_char_next, + + /* Format 14 extension functions */ + (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, + (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, + (FT_CMap_VariantListFunc) tt_cmap14_variants, + (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, + (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars + , + 14, + (TT_CMap_ValidateFunc)tt_cmap14_validate, + (TT_CMap_Info_GetFunc)tt_cmap14_get_info + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_14 */ + + +#ifndef FT_CONFIG_OPTION_PIC + + static const TT_CMap_Class tt_cmap_classes[] = + { +#define TTCMAPCITEM(a) &a, +#include "ttcmapc.h" + NULL, + }; + +#else /*FT_CONFIG_OPTION_PIC*/ + + void FT_Destroy_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class* clazz) + { + FT_Memory memory = library->memory; + if ( clazz ) + FT_FREE( clazz ); + } + + FT_Error FT_Create_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class** output_class) + { + TT_CMap_Class* clazz; + TT_CMap_ClassRec* recs; + FT_Error error; + FT_Memory memory = library->memory; + int i = 0; + +#define TTCMAPCITEM(a) i++; +#include "ttcmapc.h" + + /* allocate enough space for both the pointers +terminator and the class instances */ + if ( FT_ALLOC( clazz, sizeof(*clazz)*(i+1)+sizeof(TT_CMap_ClassRec)*i ) ) + return error; + + /* the location of the class instances follows the array of pointers */ + recs = (TT_CMap_ClassRec*) (((char*)clazz)+(sizeof(*clazz)*(i+1))); + i=0; + +#undef TTCMAPCITEM +#define TTCMAPCITEM(a) \ + FT_Init_Class_##a(&recs[i]); \ + clazz[i] = &recs[i]; \ + i++; +#include "ttcmapc.h" + + clazz[i] = NULL; + + *output_class = clazz; + return FT_Err_Ok; + } + +#endif /*FT_CONFIG_OPTION_PIC*/ + + + /* parse the `cmap' table and build the corresponding TT_CMap objects */ + /* in the current face */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_build_cmaps( TT_Face face ) + { + FT_Byte* table = face->cmap_table; + FT_Byte* limit = table + face->cmap_size; + FT_UInt volatile num_cmaps; + FT_Byte* volatile p = table; + FT_Library library = FT_FACE_LIBRARY(face); + FT_UNUSED(library); + + + if ( p + 4 > limit ) + return SFNT_Err_Invalid_Table; + + /* only recognize format 0 */ + if ( TT_NEXT_USHORT( p ) != 0 ) + { + p -= 2; + FT_ERROR(( "tt_face_build_cmaps:" + " unsupported `cmap' table format = %d\n", + TT_PEEK_USHORT( p ) )); + return SFNT_Err_Invalid_Table; + } + + num_cmaps = TT_NEXT_USHORT( p ); + + for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) + { + FT_CharMapRec charmap; + FT_UInt32 offset; + + + charmap.platform_id = TT_NEXT_USHORT( p ); + charmap.encoding_id = TT_NEXT_USHORT( p ); + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; /* will be filled later */ + offset = TT_NEXT_ULONG( p ); + + if ( offset && offset <= face->cmap_size - 2 ) + { + FT_Byte* volatile cmap = table + offset; + volatile FT_UInt format = TT_PEEK_USHORT( cmap ); + const TT_CMap_Class* volatile pclazz = FT_TT_CMAP_CLASSES_GET; + TT_CMap_Class volatile clazz; + + + for ( ; *pclazz; pclazz++ ) + { + clazz = *pclazz; + if ( clazz->format == format ) + { + volatile TT_ValidatorRec valid; + volatile FT_Error error = SFNT_Err_Ok; + + + ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, + FT_VALIDATE_DEFAULT ); + + valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs; + + if ( ft_setjmp( + *((ft_jmp_buf*)&FT_VALIDATOR( &valid )->jump_buffer) ) == 0 ) + { + /* validate this cmap sub-table */ + error = clazz->validate( cmap, FT_VALIDATOR( &valid ) ); + } + + if ( valid.validator.error == 0 ) + { + FT_CMap ttcmap; + + + /* It might make sense to store the single variation selector */ + /* cmap somewhere special. But it would have to be in the */ + /* public FT_FaceRec, and we can't change that. */ + + if ( !FT_CMap_New( (FT_CMap_Class)clazz, + cmap, &charmap, &ttcmap ) ) + { + /* it is simpler to directly set `flags' than adding */ + /* a parameter to FT_CMap_New */ + ((TT_CMap)ttcmap)->flags = (FT_Int)error; + } + } + else + { + FT_TRACE0(( "tt_face_build_cmaps:" + " broken cmap sub-table ignored\n" )); + } + break; + } + } + + if ( *pclazz == NULL ) + { + FT_TRACE0(( "tt_face_build_cmaps:" + " unsupported cmap sub-table ignored\n" )); + } + } + } + + return SFNT_Err_Ok; + } + + + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = (FT_CMap)charmap; + TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; + + + return clazz->get_cmap_info( charmap, cmap_info ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttcmap.h b/alienblaster/project/jni/freetype/src/sfnt/ttcmap.h new file mode 100644 index 000000000..15a4a21e5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttcmap.h @@ -0,0 +1,125 @@ +/***************************************************************************/ +/* */ +/* ttcmap.h */ +/* */ +/* TrueType character mapping table (cmap) support (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTCMAP_H__ +#define __TTCMAP_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_VALIDATE_H +#include FT_SERVICE_TT_CMAP_H + +FT_BEGIN_HEADER + + +#define TT_CMAP_FLAG_UNSORTED 1 +#define TT_CMAP_FLAG_OVERLAPPING 2 + + typedef struct TT_CMapRec_ + { + FT_CMapRec cmap; + FT_Byte* data; /* pointer to in-memory cmap table */ + FT_Int flags; /* for format 4 only */ + + } TT_CMapRec, *TT_CMap; + + typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; + + + typedef FT_Error + (*TT_CMap_ValidateFunc)( FT_Byte* data, + FT_Validator valid ); + + typedef struct TT_CMap_ClassRec_ + { + FT_CMap_ClassRec clazz; + FT_UInt format; + TT_CMap_ValidateFunc validate; + TT_CMap_Info_GetFunc get_cmap_info; + + } TT_CMap_ClassRec; + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_,variantchar_list_, \ + format_, validate_, get_cmap_info_) \ + FT_CALLBACK_TABLE_DEF \ + const TT_CMap_ClassRec class_ = \ + { \ + {size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_, variantchar_list_}, \ + format_, validate_, get_cmap_info_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_, \ + char_next_, char_var_index_, char_var_default_, variant_list_, \ + charvariant_list_,variantchar_list_, \ + format_, validate_, get_cmap_info_) \ + void \ + FT_Init_Class_##class_( TT_CMap_ClassRec* clazz ) \ + { \ + clazz->clazz.size = size_; \ + clazz->clazz.init = init_; \ + clazz->clazz.done = done_; \ + clazz->clazz.char_index = char_index_; \ + clazz->clazz.char_next = char_next_; \ + clazz->clazz.char_var_index = char_var_index_; \ + clazz->clazz.char_var_default = char_var_default_; \ + clazz->clazz.variant_list = variant_list_; \ + clazz->clazz.charvariant_list = charvariant_list_; \ + clazz->clazz.variantchar_list = variantchar_list_; \ + clazz->format = format_; \ + clazz->validate = validate_; \ + clazz->get_cmap_info = get_cmap_info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + typedef struct TT_ValidatorRec_ + { + FT_ValidatorRec validator; + FT_UInt num_glyphs; + + } TT_ValidatorRec, *TT_Validator; + + +#define TT_VALIDATOR( x ) ((TT_Validator)( x )) +#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs + + + FT_LOCAL( FT_Error ) + tt_face_build_cmaps( TT_Face face ); + + /* used in tt-cmaps service */ + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + +FT_END_HEADER + +#endif /* __TTCMAP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttcmapc.h b/alienblaster/project/jni/freetype/src/sfnt/ttcmapc.h new file mode 100644 index 000000000..4c9c6a56f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttcmapc.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ttcmapc.h */ +/* */ +/* TT CMAP classes definitions (specification only). */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + TTCMAPCITEM(tt_cmap0_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + TTCMAPCITEM(tt_cmap2_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + TTCMAPCITEM(tt_cmap4_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + TTCMAPCITEM(tt_cmap6_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + TTCMAPCITEM(tt_cmap8_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + TTCMAPCITEM(tt_cmap10_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + TTCMAPCITEM(tt_cmap12_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_13 + TTCMAPCITEM(tt_cmap13_class_rec) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + TTCMAPCITEM(tt_cmap14_class_rec) +#endif + + /* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttkern.c b/alienblaster/project/jni/freetype/src/sfnt/ttkern.c new file mode 100644 index 000000000..c1540802b --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttkern.c @@ -0,0 +1,306 @@ +/***************************************************************************/ +/* */ +/* ttkern.c */ +/* */ +/* Load the basic TrueType kerning table. This doesn't handle */ +/* kerning data within the GPOS table at the moment. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttkern.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttkern + + +#undef TT_KERN_INDEX +#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_size; + FT_Byte* p; + FT_Byte* p_limit; + FT_UInt nn, num_tables; + FT_UInt32 avail = 0, ordered = 0; + + + /* the kern table is optional; exit silently if it is missing */ + error = face->goto_table( face, TTAG_kern, stream, &table_size ); + if ( error ) + goto Exit; + + if ( table_size < 4 ) /* the case of a malformed table */ + { + FT_ERROR(( "tt_face_load_kern:" + " kerning table is too small - ignored\n" )); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) ) + { + FT_ERROR(( "tt_face_load_kern:" + " could not extract kerning table\n" )); + goto Exit; + } + + face->kern_table_size = table_size; + + p = face->kern_table; + p_limit = p + table_size; + + p += 2; /* skip version */ + num_tables = FT_NEXT_USHORT( p ); + + if ( num_tables > 32 ) /* we only support up to 32 sub-tables */ + num_tables = 32; + + for ( nn = 0; nn < num_tables; nn++ ) + { + FT_UInt num_pairs, length, coverage; + FT_Byte* p_next; + FT_UInt32 mask = (FT_UInt32)1UL << nn; + + + if ( p + 6 > p_limit ) + break; + + p_next = p; + + p += 2; /* skip version */ + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + + if ( length <= 6 ) + break; + + p_next += length; + + if ( p_next > p_limit ) /* handle broken table */ + p_next = p_limit; + + /* only use horizontal kerning tables */ + if ( ( coverage & ~8 ) != 0x0001 || + p + 8 > p_limit ) + goto NextTable; + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( p_next - p ) / 6 < (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( p_next - p ) / 6 ); + + avail |= mask; + + /* + * Now check whether the pairs in this table are ordered. + * We then can use binary search. + */ + if ( num_pairs > 0 ) + { + FT_ULong count; + FT_ULong old_pair; + + + old_pair = FT_NEXT_ULONG( p ); + p += 2; + + for ( count = num_pairs - 1; count > 0; count-- ) + { + FT_UInt32 cur_pair; + + + cur_pair = FT_NEXT_ULONG( p ); + if ( cur_pair <= old_pair ) + break; + + p += 2; + old_pair = cur_pair; + } + + if ( count == 0 ) + ordered |= mask; + } + + NextTable: + p = p_next; + } + + face->num_kern_tables = nn; + face->kern_avail_bits = avail; + face->kern_order_bits = ordered; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_kern( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->kern_table ); + face->kern_table_size = 0; + face->num_kern_tables = 0; + face->kern_avail_bits = 0; + face->kern_order_bits = 0; + } + + + FT_LOCAL_DEF( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ) + { + FT_Int result = 0; + FT_UInt count, mask = 1; + FT_Byte* p = face->kern_table; + FT_Byte* p_limit = p + face->kern_table_size; + + + p += 4; + mask = 0x0001; + + for ( count = face->num_kern_tables; + count > 0 && p + 6 <= p_limit; + count--, mask <<= 1 ) + { + FT_Byte* base = p; + FT_Byte* next = base; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt length = FT_NEXT_USHORT( p ); + FT_UInt coverage = FT_NEXT_USHORT( p ); + FT_UInt num_pairs; + FT_Int value = 0; + + FT_UNUSED( version ); + + + next = base + length; + + if ( next > p_limit ) /* handle broken table */ + next = p_limit; + + if ( ( face->kern_avail_bits & mask ) == 0 ) + goto NextTable; + + if ( p + 8 > next ) + goto NextTable; + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( next - p ) / 6 < (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( next - p ) / 6 ); + + switch ( coverage >> 8 ) + { + case 0: + { + FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph ); + + + if ( face->kern_order_bits & mask ) /* binary search */ + { + FT_UInt min = 0; + FT_UInt max = num_pairs; + + + while ( min < max ) + { + FT_UInt mid = ( min + max ) >> 1; + FT_Byte* q = p + 6 * mid; + FT_ULong key; + + + key = FT_NEXT_ULONG( q ); + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( q ); + goto Found; + } + if ( key < key0 ) + min = mid + 1; + else + max = mid; + } + } + else /* linear search */ + { + FT_UInt count2; + + + for ( count2 = num_pairs; count2 > 0; count2-- ) + { + FT_ULong key = FT_NEXT_ULONG( p ); + + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( p ); + goto Found; + } + p += 2; + } + } + } + break; + + /* + * We don't support format 2 because we haven't seen a single font + * using it in real life... + */ + + default: + ; + } + + goto NextTable; + + Found: + if ( coverage & 8 ) /* override or add */ + result = value; + else + result += value; + + NextTable: + p = next; + } + + return result; + } + +#undef TT_KERN_INDEX + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttkern.h b/alienblaster/project/jni/freetype/src/sfnt/ttkern.h new file mode 100644 index 000000000..df1da9b27 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttkern.h @@ -0,0 +1,52 @@ +/***************************************************************************/ +/* */ +/* ttkern.h */ +/* */ +/* Load the basic TrueType kerning table. This doesn't handle */ +/* kerning data within the GPOS table at the moment. */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTKERN_H__ +#define __TTKERN_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_done_kern( TT_Face face ); + + FT_LOCAL( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + +#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 ) + + +FT_END_HEADER + +#endif /* __TTKERN_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttload.c b/alienblaster/project/jni/freetype/src/sfnt/ttload.c new file mode 100644 index 000000000..3ad33bd6d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttload.c @@ -0,0 +1,1251 @@ +/***************************************************************************/ +/* */ +/* ttload.c */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttload.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttload + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_lookup_table */ + /* */ + /* <Description> */ + /* Looks for a TrueType table by name. */ + /* */ + /* <Input> */ + /* face :: A face object handle. */ + /* */ + /* tag :: The searched tag. */ + /* */ + /* <Return> */ + /* A pointer to the table directory entry. 0 if not found. */ + /* */ + FT_LOCAL_DEF( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ) + { + TT_Table entry; + TT_Table limit; +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool zero_length = FALSE; +#endif + + + FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", + face, + (FT_Char)( tag >> 24 ), + (FT_Char)( tag >> 16 ), + (FT_Char)( tag >> 8 ), + (FT_Char)( tag ) )); + + entry = face->dir_tables; + limit = entry + face->num_tables; + + for ( ; entry < limit; entry++ ) + { + /* For compatibility with Windows, we consider */ + /* zero-length tables the same as missing tables. */ + if ( entry->Tag == tag ) { + if ( entry->Length != 0 ) + { + FT_TRACE4(( "found table.\n" )); + return entry; + } +#ifdef FT_DEBUG_LEVEL_TRACE + zero_length = TRUE; +#endif + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( zero_length ) + FT_TRACE4(( "ignoring empty table\n" )); + else + FT_TRACE4(( "could not find table\n" )); +#endif + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_goto_table */ + /* */ + /* <Description> */ + /* Looks for a TrueType table by name, then seek a stream to it. */ + /* */ + /* <Input> */ + /* face :: A face object handle. */ + /* */ + /* tag :: The searched tag. */ + /* */ + /* stream :: The stream to seek when the table is found. */ + /* */ + /* <Output> */ + /* length :: The length of the table if found, undefined otherwise. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ) + { + TT_Table table; + FT_Error error; + + + table = tt_face_lookup_table( face, tag ); + if ( table ) + { + if ( length ) + *length = table->Length; + + if ( FT_STREAM_SEEK( table->Offset ) ) + goto Exit; + } + else + error = SFNT_Err_Table_Missing; + + Exit: + return error; + } + + + /* Here, we */ + /* */ + /* - check that `num_tables' is valid (and adjust it if necessary) */ + /* */ + /* - look for a `head' table, check its size, and parse it to check */ + /* whether its `magic' field is correctly set */ + /* */ + /* - errors (except errors returned by stream handling) */ + /* */ + /* SFNT_Err_Unknown_File_Format: */ + /* no table is defined in directory, it is not sfnt-wrapped */ + /* data */ + /* SFNT_Err_Table_Missing: */ + /* table directory is valid, but essential tables */ + /* (head/bhed/SING) are missing */ + /* */ + static FT_Error + check_table_dir( SFNT_Header sfnt, + FT_Stream stream ) + { + FT_Error error; + FT_UShort nn, valid_entries = 0; + FT_UInt has_head = 0, has_sing = 0, has_meta = 0; + FT_ULong offset = sfnt->offset + 12; + + static const FT_Frame_Field table_dir_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_TableRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG( Tag ), + FT_FRAME_ULONG( CheckSum ), + FT_FRAME_ULONG( Offset ), + FT_FRAME_ULONG( Length ), + FT_FRAME_END + }; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + for ( nn = 0; nn < sfnt->num_tables; nn++ ) + { + TT_TableRec table; + + + if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) ) + { + nn--; + FT_TRACE2(( "check_table_dir:" + " can read only %d table%s in font (instead of %d)\n", + nn, nn == 1 ? "" : "s", sfnt->num_tables )); + sfnt->num_tables = nn; + break; + } + + /* we ignore invalid tables */ + if ( table.Offset + table.Length > stream->size ) + { + FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn )); + continue; + } + else + valid_entries++; + + if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed ) + { + FT_UInt32 magic; + + +#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + if ( table.Tag == TTAG_head ) +#endif + has_head = 1; + + /* + * The table length should be 0x36, but certain font tools make it + * 0x38, so we will just check that it is greater. + * + * Note that according to the specification, the table must be + * padded to 32-bit lengths, but this doesn't apply to the value of + * its `Length' field! + * + */ + if ( table.Length < 0x36 ) + { + FT_TRACE2(( "check_table_dir: `head' table too small\n" )); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_STREAM_SEEK( table.Offset + 12 ) || + FT_READ_ULONG( magic ) ) + goto Exit; + + if ( magic != 0x5F0F3CF5UL ) + { + FT_TRACE2(( "check_table_dir:" + " no magic number found in `head' table\n")); + error = SFNT_Err_Table_Missing; + goto Exit; + } + + if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) ) + goto Exit; + } + else if ( table.Tag == TTAG_SING ) + has_sing = 1; + else if ( table.Tag == TTAG_META ) + has_meta = 1; + } + + sfnt->num_tables = valid_entries; + + if ( sfnt->num_tables == 0 ) + { + FT_TRACE2(( "check_table_dir: no tables found\n" )); + error = SFNT_Err_Unknown_File_Format; + goto Exit; + } + + /* if `sing' and `meta' tables are present, there is no `head' table */ + if ( has_head || ( has_sing && has_meta ) ) + { + error = SFNT_Err_Ok; + goto Exit; + } + else + { + FT_TRACE2(( "check_table_dir:" )); +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" )); +#else + FT_TRACE2(( " neither `head' nor `sing' table found\n" )); +#endif + error = SFNT_Err_Table_Missing; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_font_dir */ + /* */ + /* <Description> */ + /* Loads the header of a SFNT font file. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the beginning of the font directory. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ) + { + SFNT_HeaderRec sfnt; + FT_Error error; + FT_Memory memory = stream->memory; + TT_TableRec* entry; + FT_Int nn; + + static const FT_Frame_Field offset_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE SFNT_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_USHORT( num_tables ), + FT_FRAME_USHORT( search_range ), + FT_FRAME_USHORT( entry_selector ), + FT_FRAME_USHORT( range_shift ), + FT_FRAME_END + }; + + + FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face )); + + /* read the offset table */ + + sfnt.offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( sfnt.format_tag ) || + FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) ) + goto Exit; + + /* many fonts don't have these fields set correctly */ +#if 0 + if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) || + sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 ) + return SFNT_Err_Unknown_File_Format; +#endif + + /* load the table directory */ + + FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables )); + FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag )); + + /* check first */ + error = check_table_dir( &sfnt, stream ); + if ( error ) + { + FT_TRACE2(( "tt_face_load_font_dir:" + " invalid table directory for TrueType\n" )); + + goto Exit; + } + + face->num_tables = sfnt.num_tables; + face->format_tag = sfnt.format_tag; + + if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) ) + goto Exit; + + if ( FT_STREAM_SEEK( sfnt.offset + 12 ) || + FT_FRAME_ENTER( face->num_tables * 16L ) ) + goto Exit; + + entry = face->dir_tables; + + for ( nn = 0; nn < sfnt.num_tables; nn++ ) + { + entry->Tag = FT_GET_TAG4(); + entry->CheckSum = FT_GET_ULONG(); + entry->Offset = FT_GET_LONG(); + entry->Length = FT_GET_LONG(); + + /* ignore invalid tables */ + if ( entry->Offset + entry->Length > stream->size ) + continue; + else + { + FT_TRACE2(( " %c%c%c%c - %08lx - %08lx\n", + (FT_Char)( entry->Tag >> 24 ), + (FT_Char)( entry->Tag >> 16 ), + (FT_Char)( entry->Tag >> 8 ), + (FT_Char)( entry->Tag ), + entry->Offset, + entry->Length )); + entry++; + } + } + + FT_FRAME_EXIT(); + + FT_TRACE2(( "table directory loaded\n\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_any */ + /* */ + /* <Description> */ + /* Loads any font table into client memory. */ + /* */ + /* <Input> */ + /* face :: The face object to look for. */ + /* */ + /* tag :: The tag of table to load. Use the value 0 if you want */ + /* to access the whole font file, else set this parameter */ + /* to a valid TrueType table tag that you can forge with */ + /* the MAKE_TT_TAG macro. */ + /* */ + /* offset :: The starting offset in the table (or the file if */ + /* tag == 0). */ + /* */ + /* length :: The address of the decision variable: */ + /* */ + /* If length == NULL: */ + /* Loads the whole table. Returns an error if */ + /* `offset' == 0! */ + /* */ + /* If *length == 0: */ + /* Exits immediately; returning the length of the given */ + /* table or of the font file, depending on the value of */ + /* `tag'. */ + /* */ + /* If *length != 0: */ + /* Loads the next `length' bytes of table or font, */ + /* starting at offset `offset' (in table or font too). */ + /* */ + /* <Output> */ + /* buffer :: The address of target buffer. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Error error; + FT_Stream stream; + TT_Table table; + FT_ULong size; + + + if ( tag != 0 ) + { + /* look for tag in font directory */ + table = tt_face_lookup_table( face, tag ); + if ( !table ) + { + error = SFNT_Err_Table_Missing; + goto Exit; + } + + offset += table->Offset; + size = table->Length; + } + else + /* tag == 0 -- the user wants to access the font file directly */ + size = face->root.stream->size; + + if ( length && *length == 0 ) + { + *length = size; + + return SFNT_Err_Ok; + } + + if ( length ) + size = *length; + + stream = face->root.stream; + /* the `if' is syntactic sugar for picky compilers */ + if ( FT_STREAM_READ_AT( offset, buffer, size ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_generic_header */ + /* */ + /* <Description> */ + /* Loads the TrueType table `head' or `bhed'. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + tt_face_load_generic_header( TT_Face face, + FT_Stream stream, + FT_ULong tag ) + { + FT_Error error; + TT_Header* header; + + static const FT_Frame_Field header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Header + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Table_Version ), + FT_FRAME_ULONG ( Font_Revision ), + FT_FRAME_LONG ( CheckSum_Adjust ), + FT_FRAME_LONG ( Magic_Number ), + FT_FRAME_USHORT( Flags ), + FT_FRAME_USHORT( Units_Per_EM ), + FT_FRAME_LONG ( Created[0] ), + FT_FRAME_LONG ( Created[1] ), + FT_FRAME_LONG ( Modified[0] ), + FT_FRAME_LONG ( Modified[1] ), + FT_FRAME_SHORT ( xMin ), + FT_FRAME_SHORT ( yMin ), + FT_FRAME_SHORT ( xMax ), + FT_FRAME_SHORT ( yMax ), + FT_FRAME_USHORT( Mac_Style ), + FT_FRAME_USHORT( Lowest_Rec_PPEM ), + FT_FRAME_SHORT ( Font_Direction ), + FT_FRAME_SHORT ( Index_To_Loc_Format ), + FT_FRAME_SHORT ( Glyph_Data_Format ), + FT_FRAME_END + }; + + + error = face->goto_table( face, tag, stream, 0 ); + if ( error ) + goto Exit; + + header = &face->header; + + if ( FT_STREAM_READ_FIELDS( header_fields, header ) ) + goto Exit; + + FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM )); + FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_head ); + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_bhed ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_max_profile */ + /* */ + /* <Description> */ + /* Loads the maximum profile into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_MaxProfile* maxProfile = &face->max_profile; + + const FT_Frame_Field maxp_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_MaxProfile + + FT_FRAME_START( 6 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( numGlyphs ), + FT_FRAME_END + }; + + const FT_Frame_Field maxp_fields_extra[] = + { + FT_FRAME_START( 26 ), + FT_FRAME_USHORT( maxPoints ), + FT_FRAME_USHORT( maxContours ), + FT_FRAME_USHORT( maxCompositePoints ), + FT_FRAME_USHORT( maxCompositeContours ), + FT_FRAME_USHORT( maxZones ), + FT_FRAME_USHORT( maxTwilightPoints ), + FT_FRAME_USHORT( maxStorage ), + FT_FRAME_USHORT( maxFunctionDefs ), + FT_FRAME_USHORT( maxInstructionDefs ), + FT_FRAME_USHORT( maxStackElements ), + FT_FRAME_USHORT( maxSizeOfInstructions ), + FT_FRAME_USHORT( maxComponentElements ), + FT_FRAME_USHORT( maxComponentDepth ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_maxp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) ) + goto Exit; + + maxProfile->maxPoints = 0; + maxProfile->maxContours = 0; + maxProfile->maxCompositePoints = 0; + maxProfile->maxCompositeContours = 0; + maxProfile->maxZones = 0; + maxProfile->maxTwilightPoints = 0; + maxProfile->maxStorage = 0; + maxProfile->maxFunctionDefs = 0; + maxProfile->maxInstructionDefs = 0; + maxProfile->maxStackElements = 0; + maxProfile->maxSizeOfInstructions = 0; + maxProfile->maxComponentElements = 0; + maxProfile->maxComponentDepth = 0; + + if ( maxProfile->version >= 0x10000L ) + { + if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) ) + goto Exit; + + /* XXX: an adjustment that is necessary to load certain */ + /* broken fonts like `Keystrokes MT' :-( */ + /* */ + /* We allocate 64 function entries by default when */ + /* the maxFunctionDefs field is null. */ + + if ( maxProfile->maxFunctionDefs == 0 ) + maxProfile->maxFunctionDefs = 64; + + /* we add 4 phantom points later */ + if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) ) + { + FT_TRACE0(( "tt_face_load_maxp:" + " too much twilight points in `maxp' table;\n" + " " + " some glyphs might be rendered incorrectly\n" )); + + maxProfile->maxTwilightPoints = 0xFFFFU - 4; + } + } + + FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_names */ + /* */ + /* <Description> */ + /* Loads the name records. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_pos, table_len; + FT_ULong storage_start, storage_limit; + FT_UInt count; + TT_NameTable table; + + static const FT_Frame_Field name_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameTableRec + + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( format ), + FT_FRAME_USHORT( numNameRecords ), + FT_FRAME_USHORT( storageOffset ), + FT_FRAME_END + }; + + static const FT_Frame_Field name_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameEntryRec + + /* no FT_FRAME_START */ + FT_FRAME_USHORT( platformID ), + FT_FRAME_USHORT( encodingID ), + FT_FRAME_USHORT( languageID ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_USHORT( stringLength ), + FT_FRAME_USHORT( stringOffset ), + FT_FRAME_END + }; + + + table = &face->name_table; + table->stream = stream; + + error = face->goto_table( face, TTAG_name, stream, &table_len ); + if ( error ) + goto Exit; + + table_pos = FT_STREAM_POS(); + + + if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) + goto Exit; + + /* Some popular Asian fonts have an invalid `storageOffset' value */ + /* (it should be at least "6 + 12*num_names"). However, the string */ + /* offsets, computed as "storageOffset + entry->stringOffset", are */ + /* valid pointers within the name table... */ + /* */ + /* We thus can't check `storageOffset' right now. */ + /* */ + storage_start = table_pos + 6 + 12*table->numNameRecords; + storage_limit = table_pos + table_len; + + if ( storage_start > storage_limit ) + { + FT_ERROR(( "tt_face_load_name: invalid `name' table\n" )); + error = SFNT_Err_Name_Table_Missing; + goto Exit; + } + + /* Allocate the array of name records. */ + count = table->numNameRecords; + table->numNameRecords = 0; + + if ( FT_NEW_ARRAY( table->names, count ) || + FT_FRAME_ENTER( count * 12 ) ) + goto Exit; + + /* Load the name records and determine how much storage is needed */ + /* to hold the strings themselves. */ + { + TT_NameEntryRec* entry = table->names; + + + for ( ; count > 0; count-- ) + { + if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) ) + continue; + + /* check that the name is not empty */ + if ( entry->stringLength == 0 ) + continue; + + /* check that the name string is within the table */ + entry->stringOffset += table_pos + table->storageOffset; + if ( entry->stringOffset < storage_start || + entry->stringOffset + entry->stringLength > storage_limit ) + { + /* invalid entry - ignore it */ + entry->stringOffset = 0; + entry->stringLength = 0; + continue; + } + + entry++; + } + + table->numNameRecords = (FT_UInt)( entry - table->names ); + } + + FT_FRAME_EXIT(); + + /* everything went well, update face->num_names */ + face->num_names = (FT_UShort) table->numNameRecords; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_free_names */ + /* */ + /* <Description> */ + /* Frees the name records. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_free_name( TT_Face face ) + { + FT_Memory memory = face->root.driver->root.memory; + TT_NameTable table = &face->name_table; + TT_NameEntry entry = table->names; + FT_UInt count = table->numNameRecords; + + + if ( table->names ) + { + for ( ; count > 0; count--, entry++ ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + + /* free strings table */ + FT_FREE( table->names ); + } + + table->numNameRecords = 0; + table->format = 0; + table->storageOffset = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_cmap */ + /* */ + /* <Description> */ + /* Loads the cmap directory in a face object. The cmaps themselves */ + /* are loaded on demand in the `ttcmap.c' module. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + + + error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); + if ( error ) + goto Exit; + + if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) + face->cmap_size = 0; + + Exit: + return error; + } + + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_os2 */ + /* */ + /* <Description> */ + /* Loads the OS2 table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_OS2* os2; + + const FT_Frame_Field os2_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_OS2 + + FT_FRAME_START( 78 ), + FT_FRAME_USHORT( version ), + FT_FRAME_SHORT ( xAvgCharWidth ), + FT_FRAME_USHORT( usWeightClass ), + FT_FRAME_USHORT( usWidthClass ), + FT_FRAME_SHORT ( fsType ), + FT_FRAME_SHORT ( ySubscriptXSize ), + FT_FRAME_SHORT ( ySubscriptYSize ), + FT_FRAME_SHORT ( ySubscriptXOffset ), + FT_FRAME_SHORT ( ySubscriptYOffset ), + FT_FRAME_SHORT ( ySuperscriptXSize ), + FT_FRAME_SHORT ( ySuperscriptYSize ), + FT_FRAME_SHORT ( ySuperscriptXOffset ), + FT_FRAME_SHORT ( ySuperscriptYOffset ), + FT_FRAME_SHORT ( yStrikeoutSize ), + FT_FRAME_SHORT ( yStrikeoutPosition ), + FT_FRAME_SHORT ( sFamilyClass ), + FT_FRAME_BYTE ( panose[0] ), + FT_FRAME_BYTE ( panose[1] ), + FT_FRAME_BYTE ( panose[2] ), + FT_FRAME_BYTE ( panose[3] ), + FT_FRAME_BYTE ( panose[4] ), + FT_FRAME_BYTE ( panose[5] ), + FT_FRAME_BYTE ( panose[6] ), + FT_FRAME_BYTE ( panose[7] ), + FT_FRAME_BYTE ( panose[8] ), + FT_FRAME_BYTE ( panose[9] ), + FT_FRAME_ULONG ( ulUnicodeRange1 ), + FT_FRAME_ULONG ( ulUnicodeRange2 ), + FT_FRAME_ULONG ( ulUnicodeRange3 ), + FT_FRAME_ULONG ( ulUnicodeRange4 ), + FT_FRAME_BYTE ( achVendID[0] ), + FT_FRAME_BYTE ( achVendID[1] ), + FT_FRAME_BYTE ( achVendID[2] ), + FT_FRAME_BYTE ( achVendID[3] ), + + FT_FRAME_USHORT( fsSelection ), + FT_FRAME_USHORT( usFirstCharIndex ), + FT_FRAME_USHORT( usLastCharIndex ), + FT_FRAME_SHORT ( sTypoAscender ), + FT_FRAME_SHORT ( sTypoDescender ), + FT_FRAME_SHORT ( sTypoLineGap ), + FT_FRAME_USHORT( usWinAscent ), + FT_FRAME_USHORT( usWinDescent ), + FT_FRAME_END + }; + + const FT_Frame_Field os2_fields_extra[] = + { + FT_FRAME_START( 8 ), + FT_FRAME_ULONG( ulCodePageRange1 ), + FT_FRAME_ULONG( ulCodePageRange2 ), + FT_FRAME_END + }; + + const FT_Frame_Field os2_fields_extra2[] = + { + FT_FRAME_START( 10 ), + FT_FRAME_SHORT ( sxHeight ), + FT_FRAME_SHORT ( sCapHeight ), + FT_FRAME_USHORT( usDefaultChar ), + FT_FRAME_USHORT( usBreakChar ), + FT_FRAME_USHORT( usMaxContext ), + FT_FRAME_END + }; + + + /* We now support old Mac fonts where the OS/2 table doesn't */ + /* exist. Simply put, we set the `version' field to 0xFFFF */ + /* and test this value each time we need to access the table. */ + error = face->goto_table( face, TTAG_OS2, stream, 0 ); + if ( error ) + goto Exit; + + os2 = &face->os2; + + if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) ) + goto Exit; + + os2->ulCodePageRange1 = 0; + os2->ulCodePageRange2 = 0; + os2->sxHeight = 0; + os2->sCapHeight = 0; + os2->usDefaultChar = 0; + os2->usBreakChar = 0; + os2->usMaxContext = 0; + + if ( os2->version >= 0x0001 ) + { + /* only version 1 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) ) + goto Exit; + + if ( os2->version >= 0x0002 ) + { + /* only version 2 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) ) + goto Exit; + } + } + + FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender )); + FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender )); + FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent )); + FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent )); + FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_postscript */ + /* */ + /* <Description> */ + /* Loads the Postscript table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_Postscript* post = &face->postscript; + + static const FT_Frame_Field post_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Postscript + + FT_FRAME_START( 32 ), + FT_FRAME_ULONG( FormatType ), + FT_FRAME_ULONG( italicAngle ), + FT_FRAME_SHORT( underlinePosition ), + FT_FRAME_SHORT( underlineThickness ), + FT_FRAME_ULONG( isFixedPitch ), + FT_FRAME_ULONG( minMemType42 ), + FT_FRAME_ULONG( maxMemType42 ), + FT_FRAME_ULONG( minMemType1 ), + FT_FRAME_ULONG( maxMemType1 ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + return error; + + if ( FT_STREAM_READ_FIELDS( post_fields, post ) ) + return error; + + /* we don't load the glyph names, we do that in another */ + /* module (ttpost). */ + + FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType )); + FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch + ? " yes" : " no" )); + + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_pclt */ + /* */ + /* <Description> */ + /* Loads the PCL 5 Table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ) + { + static const FT_Frame_Field pclt_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_PCLT + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_ULONG ( FontNumber ), + FT_FRAME_USHORT( Pitch ), + FT_FRAME_USHORT( xHeight ), + FT_FRAME_USHORT( Style ), + FT_FRAME_USHORT( TypeFamily ), + FT_FRAME_USHORT( CapHeight ), + FT_FRAME_BYTES ( TypeFace, 16 ), + FT_FRAME_BYTES ( CharacterComplement, 8 ), + FT_FRAME_BYTES ( FileName, 6 ), + FT_FRAME_CHAR ( StrokeWeight ), + FT_FRAME_CHAR ( WidthType ), + FT_FRAME_BYTE ( SerifStyle ), + FT_FRAME_BYTE ( Reserved ), + FT_FRAME_END + }; + + FT_Error error; + TT_PCLT* pclt = &face->pclt; + + + /* optional table */ + error = face->goto_table( face, TTAG_PCLT, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_gasp */ + /* */ + /* <Description> */ + /* Loads the `gasp' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_UInt j,num_ranges; + TT_GaspRange gaspranges; + + + /* the gasp table is optional */ + error = face->goto_table( face, TTAG_gasp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_FRAME_ENTER( 4L ) ) + goto Exit; + + face->gasp.version = FT_GET_USHORT(); + face->gasp.numRanges = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + + /* only support versions 0 and 1 of the table */ + if ( face->gasp.version >= 2 ) + { + face->gasp.numRanges = 0; + error = SFNT_Err_Invalid_Table; + goto Exit; + } + + num_ranges = face->gasp.numRanges; + FT_TRACE3(( "numRanges: %u\n", num_ranges )); + + if ( FT_QNEW_ARRAY( gaspranges, num_ranges ) || + FT_FRAME_ENTER( num_ranges * 4L ) ) + goto Exit; + + face->gasp.gaspRanges = gaspranges; + + for ( j = 0; j < num_ranges; j++ ) + { + gaspranges[j].maxPPEM = FT_GET_USHORT(); + gaspranges[j].gaspFlag = FT_GET_USHORT(); + + FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n", + j, + gaspranges[j].maxPPEM, + gaspranges[j].gaspFlag )); + } + + FT_FRAME_EXIT(); + + Exit: + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttload.h b/alienblaster/project/jni/freetype/src/sfnt/ttload.h new file mode 100644 index 000000000..49a1aee16 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttload.h @@ -0,0 +1,112 @@ +/***************************************************************************/ +/* */ +/* ttload.h */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTLOAD_H__ +#define __TTLOAD_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ); + + FT_LOCAL( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_name( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ); + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + +FT_END_HEADER + +#endif /* __TTLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttmtx.c b/alienblaster/project/jni/freetype/src/sfnt/ttmtx.c new file mode 100644 index 000000000..53e6ac788 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttmtx.c @@ -0,0 +1,468 @@ +/***************************************************************************/ +/* */ +/* ttmtx.c */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (body). */ +/* */ +/* Copyright 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttmtx.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttmtx + + + /* + * Unfortunately, we can't enable our memory optimizations if + * FT_CONFIG_OPTION_OLD_INTERNALS is defined. This is because at least + * one rogue client (libXfont in the X.Org XServer) is directly accessing + * the metrics. + */ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_hmtx */ + /* */ + /* <Description> */ + /* Load the `hmtx' or `vmtx' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load `vmtx'. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + FT_ULong tag, table_size; + FT_ULong* ptable_offset; + FT_ULong* ptable_size; + + + if ( vertical ) + { + tag = TTAG_vmtx; + ptable_offset = &face->vert_metrics_offset; + ptable_size = &face->vert_metrics_size; + } + else + { + tag = TTAG_hmtx; + ptable_offset = &face->horz_metrics_offset; + ptable_size = &face->horz_metrics_size; + } + + error = face->goto_table( face, tag, stream, &table_size ); + if ( error ) + goto Fail; + + *ptable_size = table_size; + *ptable_offset = FT_STREAM_POS(); + + Fail: + return error; + } + +#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_ULong table_len; + FT_Long num_shorts, num_longs, num_shorts_checked; + + TT_LongMetrics* longs; + TT_ShortMetrics** shorts; + FT_Byte* p; + + + if ( vertical ) + { + void* lm = &face->vertical.long_metrics; + void** sm = &face->vertical.short_metrics; + + + error = face->goto_table( face, TTAG_vmtx, stream, &table_len ); + if ( error ) + goto Fail; + + num_longs = face->vertical.number_Of_VMetrics; + if ( (FT_ULong)num_longs > table_len / 4 ) + num_longs = (FT_Long)( table_len / 4 ); + + face->vertical.number_Of_VMetrics = 0; + + longs = (TT_LongMetrics*)lm; + shorts = (TT_ShortMetrics**)sm; + } + else + { + void* lm = &face->horizontal.long_metrics; + void** sm = &face->horizontal.short_metrics; + + + error = face->goto_table( face, TTAG_hmtx, stream, &table_len ); + if ( error ) + goto Fail; + + num_longs = face->horizontal.number_Of_HMetrics; + if ( (FT_ULong)num_longs > table_len / 4 ) + num_longs = (FT_Long)( table_len / 4 ); + + face->horizontal.number_Of_HMetrics = 0; + + longs = (TT_LongMetrics*)lm; + shorts = (TT_ShortMetrics**)sm; + } + + /* never trust derived values */ + + num_shorts = face->max_profile.numGlyphs - num_longs; + num_shorts_checked = ( table_len - num_longs * 4L ) / 2; + + if ( num_shorts < 0 ) + { + FT_TRACE0(( "tt_face_load_hmtx:" + " %cmtx has more metrics than glyphs.\n", + vertical ? "v" : "h" )); + + /* Adobe simply ignores this problem. So we shall do the same. */ +#if 0 + error = vertical ? SFNT_Err_Invalid_Vert_Metrics + : SFNT_Err_Invalid_Horiz_Metrics; + goto Exit; +#else + num_shorts = 0; +#endif + } + + if ( FT_QNEW_ARRAY( *longs, num_longs ) || + FT_QNEW_ARRAY( *shorts, num_shorts ) ) + goto Fail; + + if ( FT_FRAME_ENTER( table_len ) ) + goto Fail; + + p = stream->cursor; + + { + TT_LongMetrics cur = *longs; + TT_LongMetrics limit = cur + num_longs; + + + for ( ; cur < limit; cur++ ) + { + cur->advance = FT_NEXT_USHORT( p ); + cur->bearing = FT_NEXT_SHORT( p ); + } + } + + /* do we have an inconsistent number of metric values? */ + { + TT_ShortMetrics* cur = *shorts; + TT_ShortMetrics* limit = cur + + FT_MIN( num_shorts, num_shorts_checked ); + + + for ( ; cur < limit; cur++ ) + *cur = FT_NEXT_SHORT( p ); + + /* We fill up the missing left side bearings with the */ + /* last valid value. Since this will occur for buggy CJK */ + /* fonts usually only, nothing serious will happen. */ + if ( num_shorts > num_shorts_checked && num_shorts_checked > 0 ) + { + FT_Short val = (*shorts)[num_shorts_checked - 1]; + + + limit = *shorts + num_shorts; + for ( ; cur < limit; cur++ ) + *cur = val; + } + } + + FT_FRAME_EXIT(); + + if ( vertical ) + face->vertical.number_Of_VMetrics = (FT_UShort)num_longs; + else + face->horizontal.number_Of_HMetrics = (FT_UShort)num_longs; + + Fail: + return error; + } + +#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_hhea */ + /* */ + /* <Description> */ + /* Load the `hhea' or 'vhea' table into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load `vhea'. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + TT_HoriHeader* header; + + const FT_Frame_Field metrics_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_HoriHeader + + FT_FRAME_START( 36 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_SHORT ( Ascender ), + FT_FRAME_SHORT ( Descender ), + FT_FRAME_SHORT ( Line_Gap ), + FT_FRAME_USHORT( advance_Width_Max ), + FT_FRAME_SHORT ( min_Left_Side_Bearing ), + FT_FRAME_SHORT ( min_Right_Side_Bearing ), + FT_FRAME_SHORT ( xMax_Extent ), + FT_FRAME_SHORT ( caret_Slope_Rise ), + FT_FRAME_SHORT ( caret_Slope_Run ), + FT_FRAME_SHORT ( caret_Offset ), + FT_FRAME_SHORT ( Reserved[0] ), + FT_FRAME_SHORT ( Reserved[1] ), + FT_FRAME_SHORT ( Reserved[2] ), + FT_FRAME_SHORT ( Reserved[3] ), + FT_FRAME_SHORT ( metric_Data_Format ), + FT_FRAME_USHORT( number_Of_HMetrics ), + FT_FRAME_END + }; + + + if ( vertical ) + { + void *v = &face->vertical; + + + error = face->goto_table( face, TTAG_vhea, stream, 0 ); + if ( error ) + goto Fail; + + header = (TT_HoriHeader*)v; + } + else + { + error = face->goto_table( face, TTAG_hhea, stream, 0 ); + if ( error ) + goto Fail; + + header = &face->horizontal; + } + + if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) + goto Fail; + + FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); + FT_TRACE3(( "Descender: %5d\n", header->Descender )); + FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); + + header->long_metrics = NULL; + header->short_metrics = NULL; + + Fail: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_metrics */ + /* */ + /* <Description> */ + /* Returns the horizontal or vertical metrics in font units for a */ + /* given glyph. The metrics are the left side bearing (resp. top */ + /* side bearing) and advance width (resp. advance height). */ + /* */ + /* <Input> */ + /* header :: A pointer to either the horizontal or vertical metrics */ + /* structure. */ + /* */ + /* idx :: The glyph index. */ + /* */ + /* <Output> */ + /* bearing :: The bearing, either left side or top side. */ + /* */ + /* advance :: The advance width resp. advance height. */ + /* */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_LOCAL_DEF( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short *abearing, + FT_UShort *aadvance ) + { + FT_Error error; + FT_Stream stream = face->root.stream; + TT_HoriHeader* header; + FT_ULong table_pos, table_size, table_end; + FT_UShort k; + + + if ( vertical ) + { + void* v = &face->vertical; + + + header = (TT_HoriHeader*)v; + table_pos = face->vert_metrics_offset; + table_size = face->vert_metrics_size; + } + else + { + header = &face->horizontal; + table_pos = face->horz_metrics_offset; + table_size = face->horz_metrics_size; + } + + table_end = table_pos + table_size; + + k = header->number_Of_HMetrics; + + if ( k > 0 ) + { + if ( gindex < (FT_UInt)k ) + { + table_pos += 4 * gindex; + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) || + FT_READ_SHORT( *abearing ) ) + goto NoData; + } + else + { + table_pos += 4 * ( k - 1 ); + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) ) + goto NoData; + + table_pos += 4 + 2 * ( gindex - k ); + if ( table_pos + 2 > table_end ) + *abearing = 0; + else + { + if ( !FT_STREAM_SEEK( table_pos ) ) + (void)FT_READ_SHORT( *abearing ); + } + } + } + else + { + NoData: + *abearing = 0; + *aadvance = 0; + } + + return SFNT_Err_Ok; + } + +#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ) + { + void* v = &face->vertical; + void* h = &face->horizontal; + TT_HoriHeader* header = vertical ? (TT_HoriHeader*)v + : (TT_HoriHeader*)h; + TT_LongMetrics longs_m; + FT_UShort k = header->number_Of_HMetrics; + + + if ( k == 0 || + !header->long_metrics || + gindex >= (FT_UInt)face->max_profile.numGlyphs ) + { + *abearing = *aadvance = 0; + return SFNT_Err_Ok; + } + + if ( gindex < (FT_UInt)k ) + { + longs_m = (TT_LongMetrics)header->long_metrics + gindex; + *abearing = longs_m->bearing; + *aadvance = longs_m->advance; + } + else + { + *abearing = ((TT_ShortMetrics*)header->short_metrics)[gindex - k]; + *aadvance = ((TT_LongMetrics)header->long_metrics)[k - 1].advance; + } + + return SFNT_Err_Ok; + } + +#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttmtx.h b/alienblaster/project/jni/freetype/src/sfnt/ttmtx.h new file mode 100644 index 000000000..8b91a113d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttmtx.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ttmtx.h */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTMTX_H__ +#define __TTMTX_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( FT_Error ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + +FT_END_HEADER + +#endif /* __TTMTX_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttpost.c b/alienblaster/project/jni/freetype/src/sfnt/ttpost.c new file mode 100644 index 000000000..aa0bf1ec4 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttpost.c @@ -0,0 +1,521 @@ +/***************************************************************************/ +/* */ +/* ttpost.c */ +/* */ +/* Postcript name table processing for TrueType and OpenType fonts */ +/* (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* The post table is not completely loaded by the core engine. This */ + /* file loads the missing PS glyph names and implements an API to access */ + /* them. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttpost.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttpost + + + /* If this configuration macro is defined, we rely on the `PSNames' */ + /* module to grab the glyph names. */ + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) ) + + +#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* Otherwise, we ignore the `PSNames' module, and provide our own */ + /* table of Mac names. Thus, it is possible to build a version of */ + /* FreeType without the Type 1 driver & PSNames module. */ + +#define MAC_NAME( x ) ( (FT_String*)tt_post_default_names[x] ) + + /* the 258 default Mac PS glyph names */ + + static const FT_String* const tt_post_default_names[258] = + { + /* 0 */ + ".notdef", ".null", "CR", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + /* 10 */ + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + /* 20 */ + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + /* 30 */ + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + /* 40 */ + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + /* 50 */ + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + /* 60 */ + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + /* 70 */ + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + /* 80 */ + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + /* 90 */ + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + /* 100 */ + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + /* 110 */ + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + /* 120 */ + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + /* 130 */ + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + /* 140 */ + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + /* 150 */ + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + /* 160 */ + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + /* 170 */ + "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + /* 180 */ + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + /* 190 */ + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + /* 200 */ + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + /* 210 */ + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + /* 220 */ + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + /* 230 */ + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + /* 240 */ + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + /* 250 */ + "Idot", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dmacron", + }; + + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + static FT_Error + load_format_20( TT_Face face, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_Int num_glyphs; + FT_UShort num_names; + + FT_UShort* glyph_indices = 0; + FT_Char** name_strings = 0; + + + if ( FT_READ_USHORT( num_glyphs ) ) + goto Exit; + + /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ + /* than the value in the maxp table (cf. cyberbit.ttf). */ + + /* There already exist fonts which have more than 32768 glyph names */ + /* in this table, so the test for this threshold has been dropped. */ + + if ( num_glyphs > face->max_profile.numGlyphs ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + /* load the indices */ + { + FT_Int n; + + + if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * 2L ) ) + goto Fail; + + for ( n = 0; n < num_glyphs; n++ ) + glyph_indices[n] = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + } + + /* compute number of names stored in table */ + { + FT_Int n; + + + num_names = 0; + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Int idx; + + + idx = glyph_indices[n]; + if ( idx >= 258 ) + { + idx -= 257; + if ( idx > num_names ) + num_names = (FT_UShort)idx; + } + } + } + + /* now load the name strings */ + { + FT_UShort n; + + + if ( FT_NEW_ARRAY( name_strings, num_names ) ) + goto Fail; + + for ( n = 0; n < num_names; n++ ) + { + FT_UInt len; + + + if ( FT_READ_BYTE ( len ) || + FT_NEW_ARRAY( name_strings[n], len + 1 ) || + FT_STREAM_READ ( name_strings[n], len ) ) + goto Fail1; + + name_strings[n][len] = '\0'; + } + } + + /* all right, set table fields and exit successfully */ + { + TT_Post_20 table = &face->postscript_names.names.format_20; + + + table->num_glyphs = (FT_UShort)num_glyphs; + table->num_names = (FT_UShort)num_names; + table->glyph_indices = glyph_indices; + table->glyph_names = name_strings; + } + return SFNT_Err_Ok; + + Fail1: + { + FT_UShort n; + + + for ( n = 0; n < num_names; n++ ) + FT_FREE( name_strings[n] ); + } + + Fail: + FT_FREE( name_strings ); + FT_FREE( glyph_indices ); + + Exit: + return error; + } + + + static FT_Error + load_format_25( TT_Face face, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_Int num_glyphs; + FT_Char* offset_table = 0; + + + /* UNDOCUMENTED! This value appears only in the Apple TT specs. */ + if ( FT_READ_USHORT( num_glyphs ) ) + goto Exit; + + /* check the number of glyphs */ + if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_NEW_ARRAY( offset_table, num_glyphs ) || + FT_STREAM_READ( offset_table, num_glyphs ) ) + goto Fail; + + /* now check the offset table */ + { + FT_Int n; + + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Long idx = (FT_Long)n + offset_table[n]; + + + if ( idx < 0 || idx > num_glyphs ) + { + error = SFNT_Err_Invalid_File_Format; + goto Fail; + } + } + } + + /* OK, set table fields and exit successfully */ + { + TT_Post_25 table = &face->postscript_names.names.format_25; + + + table->num_glyphs = (FT_UShort)num_glyphs; + table->offsets = offset_table; + } + + return SFNT_Err_Ok; + + Fail: + FT_FREE( offset_table ); + + Exit: + return error; + } + + + static FT_Error + load_post_names( TT_Face face ) + { + FT_Stream stream; + FT_Error error; + FT_Fixed format; + + + /* get a stream for the face's resource */ + stream = face->root.stream; + + /* seek to the beginning of the PS names table */ + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + goto Exit; + + format = face->postscript.FormatType; + + /* go to beginning of subtable */ + if ( FT_STREAM_SKIP( 32 ) ) + goto Exit; + + /* now read postscript table */ + if ( format == 0x00020000L ) + error = load_format_20( face, stream ); + else if ( format == 0x00028000L ) + error = load_format_25( face, stream ); + else + error = SFNT_Err_Invalid_File_Format; + + face->postscript_names.loaded = 1; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_ps_names( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_Post_Names names = &face->postscript_names; + FT_Fixed format; + + + if ( names->loaded ) + { + format = face->postscript.FormatType; + + if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + FT_UShort n; + + + FT_FREE( table->glyph_indices ); + table->num_glyphs = 0; + + for ( n = 0; n < table->num_names; n++ ) + FT_FREE( table->glyph_names[n] ); + + FT_FREE( table->glyph_names ); + table->num_names = 0; + } + else if ( format == 0x00028000L ) + { + TT_Post_25 table = &names->names.format_25; + + + FT_FREE( table->offsets ); + table->num_glyphs = 0; + } + } + names->loaded = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_get_ps_name */ + /* */ + /* <Description> */ + /* Get the PostScript glyph name of a glyph. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face. */ + /* */ + /* idx :: The glyph index. */ + /* */ + /* <InOut> */ + /* PSname :: The address of a string pointer. Will be NULL in case */ + /* of error, otherwise it is a pointer to the glyph name. */ + /* */ + /* You must not modify the returned string! */ + /* */ + /* <Output> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ) + { + FT_Error error; + TT_Post_Names names; + FT_Fixed format; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Service_PsCMaps psnames; +#endif + + + if ( !face ) + return SFNT_Err_Invalid_Face_Handle; + + if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) + return SFNT_Err_Invalid_Glyph_Index; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames = (FT_Service_PsCMaps)face->psnames; + if ( !psnames ) + return SFNT_Err_Unimplemented_Feature; +#endif + + names = &face->postscript_names; + + /* `.notdef' by default */ + *PSname = MAC_NAME( 0 ); + + format = face->postscript.FormatType; + + if ( format == 0x00010000L ) + { + if ( idx < 258 ) /* paranoid checking */ + *PSname = MAC_NAME( idx ); + } + else if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) + { + FT_UShort name_index = table->glyph_indices[idx]; + + + if ( name_index < 258 ) + *PSname = MAC_NAME( name_index ); + else + *PSname = (FT_String*)table->glyph_names[name_index - 258]; + } + } + else if ( format == 0x00028000L ) + { + TT_Post_25 table = &names->names.format_25; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */ + { + idx += table->offsets[idx]; + *PSname = MAC_NAME( idx ); + } + } + + /* nothing to do for format == 0x00030000L */ + + End: + return SFNT_Err_Ok; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttpost.h b/alienblaster/project/jni/freetype/src/sfnt/ttpost.h new file mode 100644 index 000000000..6f06d75a7 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttpost.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ttpost.h */ +/* */ +/* Postcript name table processing for TrueType and OpenType fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTPOST_H__ +#define __TTPOST_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + FT_LOCAL( void ) + tt_face_free_ps_names( TT_Face face ); + + +FT_END_HEADER + +#endif /* __TTPOST_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttsbit.c b/alienblaster/project/jni/freetype/src/sfnt/ttsbit.c new file mode 100644 index 000000000..833bb2add --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttsbit.c @@ -0,0 +1,1507 @@ +/***************************************************************************/ +/* */ +/* ttsbit.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + + /* + * Alas, the memory-optimized sbit loader can't be used when implementing + * the `old internals' hack + */ +#ifndef FT_CONFIG_OPTION_OLD_INTERNALS + +#include "ttsbit0.c" + +#else /* FT_CONFIG_OPTION_OLD_INTERNALS */ + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttsbit.h" + +#include "sferrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttsbit + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* blit_sbit */ + /* */ + /* <Description> */ + /* Blits a bitmap from an input stream into a given target. Supports */ + /* x and y offsets as well as byte padded lines. */ + /* */ + /* <Input> */ + /* target :: The target bitmap/pixmap. */ + /* */ + /* source :: The input packed bitmap data. */ + /* */ + /* line_bits :: The number of bits per line. */ + /* */ + /* byte_padded :: A flag which is true if lines are byte-padded. */ + /* */ + /* x_offset :: The horizontal offset. */ + /* */ + /* y_offset :: The vertical offset. */ + /* */ + /* <Note> */ + /* IMPORTANT: The x and y offsets are relative to the top corner of */ + /* the target bitmap (unlike the normal TrueType */ + /* convention). A positive y offset indicates a downwards */ + /* direction! */ + /* */ + static void + blit_sbit( FT_Bitmap* target, + FT_Byte* source, + FT_Int line_bits, + FT_Bool byte_padded, + FT_Int x_offset, + FT_Int y_offset, + FT_Int source_height ) + { + FT_Byte* line_buff; + FT_Int line_incr; + FT_Int height; + + FT_UShort acc; + FT_UInt loaded; + + + /* first of all, compute starting write position */ + line_incr = target->pitch; + line_buff = target->buffer; + + if ( line_incr < 0 ) + line_buff -= line_incr * ( target->rows - 1 ); + + line_buff += ( x_offset >> 3 ) + y_offset * line_incr; + + /***********************************************************************/ + /* */ + /* We use the extra-classic `accumulator' trick to extract the bits */ + /* from the source byte stream. */ + /* */ + /* Namely, the variable `acc' is a 16-bit accumulator containing the */ + /* last `loaded' bits from the input stream. The bits are shifted to */ + /* the upmost position in `acc'. */ + /* */ + /***********************************************************************/ + + acc = 0; /* clear accumulator */ + loaded = 0; /* no bits were loaded */ + + for ( height = source_height; height > 0; height-- ) + { + FT_Byte* cur = line_buff; /* current write cursor */ + FT_Int count = line_bits; /* # of bits to extract per line */ + FT_Byte shift = (FT_Byte)( x_offset & 7 ); /* current write shift */ + FT_Byte space = (FT_Byte)( 8 - shift ); + + + /* first of all, read individual source bytes */ + if ( count >= 8 ) + { + count -= 8; + { + do + { + FT_Byte val; + + + /* ensure that there are at least 8 bits in the accumulator */ + if ( loaded < 8 ) + { + acc |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded )); + loaded += 8; + } + + /* now write one byte */ + val = (FT_Byte)( acc >> 8 ); + if ( shift ) + { + cur[0] |= (FT_Byte)( val >> shift ); + cur[1] |= (FT_Byte)( val << space ); + } + else + cur[0] |= val; + + cur++; + acc <<= 8; /* remove bits from accumulator */ + loaded -= 8; + count -= 8; + + } while ( count >= 0 ); + } + + /* restore `count' to correct value */ + count += 8; + } + + /* now write remaining bits (count < 8) */ + if ( count > 0 ) + { + FT_Byte val; + + + /* ensure that there are at least `count' bits in the accumulator */ + if ( (FT_Int)loaded < count ) + { + acc |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded )); + loaded += 8; + } + + /* now write remaining bits */ + val = (FT_Byte)( ( (FT_Byte)( acc >> 8 ) ) & ~( 0xFF >> count ) ); + cur[0] |= (FT_Byte)( val >> shift ); + + if ( count > space ) + cur[1] |= (FT_Byte)( val << space ); + + acc <<= count; + loaded -= count; + } + + /* now, skip to next line */ + if ( byte_padded ) + { + acc = 0; + loaded = 0; /* clear accumulator on byte-padded lines */ + } + + line_buff += line_incr; + } + } + + + static const FT_Frame_Field sbit_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_MetricsRec + + FT_FRAME_START( 8 ), + FT_FRAME_BYTE( height ), + FT_FRAME_BYTE( width ), + + FT_FRAME_CHAR( horiBearingX ), + FT_FRAME_CHAR( horiBearingY ), + FT_FRAME_BYTE( horiAdvance ), + + FT_FRAME_CHAR( vertBearingX ), + FT_FRAME_CHAR( vertBearingY ), + FT_FRAME_BYTE( vertAdvance ), + FT_FRAME_END + }; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Const_Metrics */ + /* */ + /* <Description> */ + /* Loads the metrics for `EBLC' index tables format 2 and 5. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Const_Metrics( TT_SBit_Range range, + FT_Stream stream ) + { + FT_Error error; + + + if ( FT_READ_ULONG( range->image_size ) ) + return error; + + return FT_STREAM_READ_FIELDS( sbit_metrics_fields, &range->metrics ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Range_Codes */ + /* */ + /* <Description> */ + /* Loads the range codes for `EBLC' index tables format 4 and 5. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* load_offsets :: A flag whether to load the glyph offset table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Range_Codes( TT_SBit_Range range, + FT_Stream stream, + FT_Bool load_offsets ) + { + FT_Error error; + FT_ULong count, n, size; + FT_Memory memory = stream->memory; + + + if ( FT_READ_ULONG( count ) ) + goto Exit; + + range->num_glyphs = count; + + /* Allocate glyph offsets table if needed */ + if ( load_offsets ) + { + if ( FT_NEW_ARRAY( range->glyph_offsets, count ) ) + goto Exit; + + size = count * 4L; + } + else + size = count * 2L; + + /* Allocate glyph codes table and access frame */ + if ( FT_NEW_ARRAY ( range->glyph_codes, count ) || + FT_FRAME_ENTER( size ) ) + goto Exit; + + for ( n = 0; n < count; n++ ) + { + range->glyph_codes[n] = FT_GET_USHORT(); + + if ( load_offsets ) + range->glyph_offsets[n] = (FT_ULong)range->image_offset + + FT_GET_USHORT(); + } + + FT_FRAME_EXIT(); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_SBit_Range */ + /* */ + /* <Description> */ + /* Loads a given `EBLC' index/range table. */ + /* */ + /* <Input> */ + /* range :: The target range. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_SBit_Range( TT_SBit_Range range, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + + switch( range->index_format ) + { + case 1: /* variable metrics with 4-byte offsets */ + case 3: /* variable metrics with 2-byte offsets */ + { + FT_ULong num_glyphs, n; + FT_Int size_elem; + FT_Bool large = FT_BOOL( range->index_format == 1 ); + + + + if ( range->last_glyph < range->first_glyph ) + { + error = SFNT_Err_Invalid_File_Format; + goto Exit; + } + + num_glyphs = range->last_glyph - range->first_glyph + 1L; + range->num_glyphs = num_glyphs; + num_glyphs++; /* XXX: BEWARE - see spec */ + + size_elem = large ? 4 : 2; + + if ( FT_NEW_ARRAY( range->glyph_offsets, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * size_elem ) ) + goto Exit; + + for ( n = 0; n < num_glyphs; n++ ) + range->glyph_offsets[n] = (FT_ULong)( range->image_offset + + ( large ? FT_GET_ULONG() + : FT_GET_USHORT() ) ); + FT_FRAME_EXIT(); + } + break; + + case 2: /* all glyphs have identical metrics */ + error = Load_SBit_Const_Metrics( range, stream ); + break; + + case 4: + error = Load_SBit_Range_Codes( range, stream, 1 ); + break; + + case 5: + error = Load_SBit_Const_Metrics( range, stream ); + if ( !error ) + error = Load_SBit_Range_Codes( range, stream, 0 ); + break; + + default: + error = SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_eblc */ + /* */ + /* <Description> */ + /* Loads the table of embedded bitmap sizes for this face. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ) + { + FT_Error error = 0; + FT_Memory memory = stream->memory; + FT_Fixed version; + FT_ULong num_strikes; + FT_ULong table_base; + + static const FT_Frame_Field sbit_line_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_LineMetricsRec + + /* no FT_FRAME_START */ + FT_FRAME_CHAR( ascender ), + FT_FRAME_CHAR( descender ), + FT_FRAME_BYTE( max_width ), + + FT_FRAME_CHAR( caret_slope_numerator ), + FT_FRAME_CHAR( caret_slope_denominator ), + FT_FRAME_CHAR( caret_offset ), + + FT_FRAME_CHAR( min_origin_SB ), + FT_FRAME_CHAR( min_advance_SB ), + FT_FRAME_CHAR( max_before_BL ), + FT_FRAME_CHAR( min_after_BL ), + FT_FRAME_CHAR( pads[0] ), + FT_FRAME_CHAR( pads[1] ), + FT_FRAME_END + }; + + static const FT_Frame_Field strike_start_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_StrikeRec + + /* no FT_FRAME_START */ + FT_FRAME_ULONG( ranges_offset ), + FT_FRAME_SKIP_LONG, + FT_FRAME_ULONG( num_ranges ), + FT_FRAME_ULONG( color_ref ), + FT_FRAME_END + }; + + static const FT_Frame_Field strike_end_fields[] = + { + /* no FT_FRAME_START */ + FT_FRAME_USHORT( start_glyph ), + FT_FRAME_USHORT( end_glyph ), + FT_FRAME_BYTE ( x_ppem ), + FT_FRAME_BYTE ( y_ppem ), + FT_FRAME_BYTE ( bit_depth ), + FT_FRAME_CHAR ( flags ), + FT_FRAME_END + }; + + + face->num_sbit_strikes = 0; + + /* this table is optional */ + error = face->goto_table( face, TTAG_EBLC, stream, 0 ); + if ( error ) + error = face->goto_table( face, TTAG_bloc, stream, 0 ); + if ( error ) + goto Exit; + + table_base = FT_STREAM_POS(); + if ( FT_FRAME_ENTER( 8L ) ) + goto Exit; + + version = FT_GET_LONG(); + num_strikes = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + /* check version number and strike count */ + if ( version != 0x00020000L || + num_strikes >= 0x10000L ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" )); + error = SFNT_Err_Invalid_File_Format; + + goto Exit; + } + + /* allocate the strikes table */ + if ( FT_NEW_ARRAY( face->sbit_strikes, num_strikes ) ) + goto Exit; + + face->num_sbit_strikes = num_strikes; + + /* now read each strike table separately */ + { + TT_SBit_Strike strike = face->sbit_strikes; + FT_ULong count = num_strikes; + + + if ( FT_FRAME_ENTER( 48L * num_strikes ) ) + goto Exit; + + while ( count > 0 ) + { + if ( FT_STREAM_READ_FIELDS( strike_start_fields, strike ) || + FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->hori ) || + FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->vert ) || + FT_STREAM_READ_FIELDS( strike_end_fields, strike ) ) + break; + + count--; + strike++; + } + + FT_FRAME_EXIT(); + } + + /* allocate the index ranges for each strike table */ + { + TT_SBit_Strike strike = face->sbit_strikes; + FT_ULong count = num_strikes; + + + while ( count > 0 ) + { + TT_SBit_Range range; + FT_ULong count2 = strike->num_ranges; + + + /* read each range */ + if ( FT_STREAM_SEEK( table_base + strike->ranges_offset ) || + FT_FRAME_ENTER( strike->num_ranges * 8L ) ) + goto Exit; + + if ( FT_NEW_ARRAY( strike->sbit_ranges, strike->num_ranges ) ) + goto Exit; + + range = strike->sbit_ranges; + while ( count2 > 0 ) + { + range->first_glyph = FT_GET_USHORT(); + range->last_glyph = FT_GET_USHORT(); + range->table_offset = table_base + strike->ranges_offset + + FT_GET_ULONG(); + count2--; + range++; + } + + FT_FRAME_EXIT(); + + /* Now, read each index table */ + count2 = strike->num_ranges; + range = strike->sbit_ranges; + while ( count2 > 0 ) + { + /* Read the header */ + if ( FT_STREAM_SEEK( range->table_offset ) || + FT_FRAME_ENTER( 8L ) ) + goto Exit; + + range->index_format = FT_GET_USHORT(); + range->image_format = FT_GET_USHORT(); + range->image_offset = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + error = Load_SBit_Range( range, stream ); + if ( error ) + goto Exit; + + count2--; + range++; + } + + count--; + strike++; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_free_eblc */ + /* */ + /* <Description> */ + /* Releases the embedded bitmap tables. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_free_eblc( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_SBit_Strike strike = face->sbit_strikes; + TT_SBit_Strike strike_limit = strike + face->num_sbit_strikes; + + + if ( strike ) + { + for ( ; strike < strike_limit; strike++ ) + { + TT_SBit_Range range = strike->sbit_ranges; + TT_SBit_Range range_limit = range + strike->num_ranges; + + + if ( range ) + { + for ( ; range < range_limit; range++ ) + { + /* release the glyph offsets and codes tables */ + /* where appropriate */ + FT_FREE( range->glyph_offsets ); + FT_FREE( range->glyph_codes ); + } + } + FT_FREE( strike->sbit_ranges ); + strike->num_ranges = 0; + } + FT_FREE( face->sbit_strikes ); + } + face->num_sbit_strikes = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ) + { + return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ) + { + TT_SBit_Strike strike; + + + if ( strike_index >= face->num_sbit_strikes ) + return SFNT_Err_Invalid_Argument; + + strike = face->sbit_strikes + strike_index; + + metrics->x_ppem = strike->x_ppem; + metrics->y_ppem = strike->y_ppem; + + metrics->ascender = strike->hori.ascender << 6; + metrics->descender = strike->hori.descender << 6; + + /* XXX: Is this correct? */ + metrics->max_advance = ( strike->hori.min_origin_SB + + strike->hori.max_width + + strike->hori.min_advance_SB ) << 6; + + metrics->height = metrics->ascender - metrics->descender; + + return SFNT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* find_sbit_range */ + /* */ + /* <Description> */ + /* Scans a given strike's ranges and return, for a given glyph */ + /* index, the corresponding sbit range, and `EBDT' offset. */ + /* */ + /* <Input> */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike :: The source/current sbit strike. */ + /* */ + /* <Output> */ + /* arange :: The sbit range containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means the glyph index was found. */ + /* */ + static FT_Error + find_sbit_range( FT_UInt glyph_index, + TT_SBit_Strike strike, + TT_SBit_Range *arange, + FT_ULong *aglyph_offset ) + { + TT_SBit_RangeRec *range, *range_limit; + + + /* check whether the glyph index is within this strike's */ + /* glyph range */ + if ( glyph_index < (FT_UInt)strike->start_glyph || + glyph_index > (FT_UInt)strike->end_glyph ) + goto Fail; + + /* scan all ranges in strike */ + range = strike->sbit_ranges; + range_limit = range + strike->num_ranges; + if ( !range ) + goto Fail; + + for ( ; range < range_limit; range++ ) + { + if ( glyph_index >= (FT_UInt)range->first_glyph && + glyph_index <= (FT_UInt)range->last_glyph ) + { + FT_UShort delta = (FT_UShort)( glyph_index - range->first_glyph ); + + + switch ( range->index_format ) + { + case 1: + case 3: + *aglyph_offset = range->glyph_offsets[delta]; + break; + + case 2: + *aglyph_offset = range->image_offset + + range->image_size * delta; + break; + + case 4: + case 5: + { + FT_ULong n; + + + for ( n = 0; n < range->num_glyphs; n++ ) + { + if ( (FT_UInt)range->glyph_codes[n] == glyph_index ) + { + if ( range->index_format == 4 ) + *aglyph_offset = range->glyph_offsets[n]; + else + *aglyph_offset = range->image_offset + + n * range->image_size; + goto Found; + } + } + } + + /* fall-through */ + default: + goto Fail; + } + + Found: + /* return successfully! */ + *arange = range; + return SFNT_Err_Ok; + } + } + + Fail: + *arange = 0; + *aglyph_offset = 0; + + return SFNT_Err_Invalid_Argument; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_find_sbit_image */ + /* */ + /* <Description> */ + /* Checks whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* <Output> */ + /* arange :: The SBit range containing the glyph index. */ + /* */ + /* astrike :: The SBit strike containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns */ + /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ + /* glyph. */ + /* */ + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ) + { + FT_Error error; + TT_SBit_Strike strike; + + + if ( !face->sbit_strikes || + ( face->num_sbit_strikes <= strike_index ) ) + goto Fail; + + strike = &face->sbit_strikes[strike_index]; + + error = find_sbit_range( glyph_index, strike, + arange, aglyph_offset ); + if ( error ) + goto Fail; + + *astrike = strike; + + return SFNT_Err_Ok; + + Fail: + /* no embedded bitmap for this glyph in face */ + *arange = 0; + *astrike = 0; + *aglyph_offset = 0; + + return SFNT_Err_Invalid_Argument; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_load_sbit_metrics */ + /* */ + /* <Description> */ + /* Gets the big metrics for a given SBit. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* <Output> */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be positioned at the glyph's offset within */ + /* the `EBDT' table before the call. */ + /* */ + /* If the image format uses variable metrics, the stream cursor is */ + /* positioned just after the metrics header in the `EBDT' table on */ + /* function exit. */ + /* */ + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ) + { + FT_Error error = SFNT_Err_Ok; + + + switch ( range->image_format ) + { + case 1: + case 2: + case 8: + /* variable small metrics */ + { + TT_SBit_SmallMetricsRec smetrics; + + static const FT_Frame_Field sbit_small_metrics_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_SBit_SmallMetricsRec + + FT_FRAME_START( 5 ), + FT_FRAME_BYTE( height ), + FT_FRAME_BYTE( width ), + FT_FRAME_CHAR( bearingX ), + FT_FRAME_CHAR( bearingY ), + FT_FRAME_BYTE( advance ), + FT_FRAME_END + }; + + + /* read small metrics */ + if ( FT_STREAM_READ_FIELDS( sbit_small_metrics_fields, &smetrics ) ) + goto Exit; + + /* convert it to a big metrics */ + metrics->height = smetrics.height; + metrics->width = smetrics.width; + metrics->horiBearingX = smetrics.bearingX; + metrics->horiBearingY = smetrics.bearingY; + metrics->horiAdvance = smetrics.advance; + + /* these metrics are made up at a higher level when */ + /* needed. */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + metrics->vertAdvance = 0; + } + break; + + case 6: + case 7: + case 9: + /* variable big metrics */ + if ( FT_STREAM_READ_FIELDS( sbit_metrics_fields, metrics ) ) + goto Exit; + break; + + case 5: + default: /* constant metrics */ + if ( range->index_format == 2 || range->index_format == 5 ) + *metrics = range->metrics; + else + return SFNT_Err_Invalid_File_Format; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* crop_bitmap */ + /* */ + /* <Description> */ + /* Crops a bitmap to its tightest bounding box, and adjusts its */ + /* metrics. */ + /* */ + /* <InOut> */ + /* map :: The bitmap. */ + /* */ + /* metrics :: The corresponding metrics structure. */ + /* */ + static void + crop_bitmap( FT_Bitmap* map, + TT_SBit_Metrics metrics ) + { + /***********************************************************************/ + /* */ + /* In this situation, some bounding boxes of embedded bitmaps are too */ + /* large. We need to crop it to a reasonable size. */ + /* */ + /* --------- */ + /* | | ----- */ + /* | *** | |***| */ + /* | * | | * | */ + /* | * | ------> | * | */ + /* | * | | * | */ + /* | * | | * | */ + /* | *** | |***| */ + /* --------- ----- */ + /* */ + /***********************************************************************/ + + FT_Int rows, count; + FT_Long line_len; + FT_Byte* line; + + + /***********************************************************************/ + /* */ + /* first of all, check the top-most lines of the bitmap, and remove */ + /* them if they're empty. */ + /* */ + { + line = (FT_Byte*)map->buffer; + rows = map->rows; + line_len = map->pitch; + + + for ( count = 0; count < rows; count++ ) + { + FT_Byte* cur = line; + FT_Byte* limit = line + line_len; + + + for ( ; cur < limit; cur++ ) + if ( cur[0] ) + goto Found_Top; + + /* the current line was empty - skip to next one */ + line = limit; + } + + Found_Top: + /* check that we have at least one filled line */ + if ( count >= rows ) + goto Empty_Bitmap; + + /* now, crop the empty upper lines */ + if ( count > 0 ) + { + line = (FT_Byte*)map->buffer; + + FT_MEM_MOVE( line, line + count * line_len, + ( rows - count ) * line_len ); + + metrics->height = (FT_Byte)( metrics->height - count ); + metrics->horiBearingY = (FT_Char)( metrics->horiBearingY - count ); + metrics->vertBearingY = (FT_Char)( metrics->vertBearingY - count ); + + map->rows -= count; + rows -= count; + } + } + + /***********************************************************************/ + /* */ + /* second, crop the lower lines */ + /* */ + { + line = (FT_Byte*)map->buffer + ( rows - 1 ) * line_len; + + for ( count = 0; count < rows; count++ ) + { + FT_Byte* cur = line; + FT_Byte* limit = line + line_len; + + + for ( ; cur < limit; cur++ ) + if ( cur[0] ) + goto Found_Bottom; + + /* the current line was empty - skip to previous one */ + line -= line_len; + } + + Found_Bottom: + if ( count > 0 ) + { + metrics->height = (FT_Byte)( metrics->height - count ); + rows -= count; + map->rows -= count; + } + } + + /***********************************************************************/ + /* */ + /* third, get rid of the space on the left side of the glyph */ + /* */ + do + { + FT_Byte* limit; + + + line = (FT_Byte*)map->buffer; + limit = line + rows * line_len; + + for ( ; line < limit; line += line_len ) + if ( line[0] & 0x80 ) + goto Found_Left; + + /* shift the whole glyph one pixel to the left */ + line = (FT_Byte*)map->buffer; + limit = line + rows * line_len; + + for ( ; line < limit; line += line_len ) + { + FT_Int n, width = map->width; + FT_Byte old; + FT_Byte* cur = line; + + + old = (FT_Byte)(cur[0] << 1); + for ( n = 8; n < width; n += 8 ) + { + FT_Byte val; + + + val = cur[1]; + cur[0] = (FT_Byte)( old | ( val >> 7 ) ); + old = (FT_Byte)( val << 1 ); + cur++; + } + cur[0] = old; + } + + map->width--; + metrics->horiBearingX++; + metrics->vertBearingX++; + metrics->width--; + + } while ( map->width > 0 ); + + Found_Left: + + /***********************************************************************/ + /* */ + /* finally, crop the bitmap width to get rid of the space on the right */ + /* side of the glyph. */ + /* */ + do + { + FT_Int right = map->width - 1; + FT_Byte* limit; + FT_Byte mask; + + + line = (FT_Byte*)map->buffer + ( right >> 3 ); + limit = line + rows * line_len; + mask = (FT_Byte)( 0x80 >> ( right & 7 ) ); + + for ( ; line < limit; line += line_len ) + if ( line[0] & mask ) + goto Found_Right; + + /* crop the whole glyph to the right */ + map->width--; + metrics->width--; + + } while ( map->width > 0 ); + + Found_Right: + /* all right, the bitmap was cropped */ + return; + + Empty_Bitmap: + map->width = 0; + map->rows = 0; + map->pitch = 0; + map->pixel_mode = FT_PIXEL_MODE_MONO; + } + + + static FT_Error + Load_SBit_Single( FT_Bitmap* map, + FT_Int x_offset, + FT_Int y_offset, + FT_Int pix_bits, + FT_UShort image_format, + TT_SBit_Metrics metrics, + FT_Stream stream ) + { + FT_Error error; + + + /* check that the source bitmap fits into the target pixmap */ + if ( x_offset < 0 || x_offset + metrics->width > map->width || + y_offset < 0 || y_offset + metrics->height > map->rows ) + { + error = SFNT_Err_Invalid_Argument; + + goto Exit; + } + + { + FT_Int glyph_width = metrics->width; + FT_Int glyph_height = metrics->height; + FT_Int glyph_size; + FT_Int line_bits = pix_bits * glyph_width; + FT_Bool pad_bytes = 0; + + + /* compute size of glyph image */ + switch ( image_format ) + { + case 1: /* byte-padded formats */ + case 6: + { + FT_Int line_length; + + + switch ( pix_bits ) + { + case 1: + line_length = ( glyph_width + 7 ) >> 3; + break; + case 2: + line_length = ( glyph_width + 3 ) >> 2; + break; + case 4: + line_length = ( glyph_width + 1 ) >> 1; + break; + default: + line_length = glyph_width; + } + + glyph_size = glyph_height * line_length; + pad_bytes = 1; + } + break; + + case 2: + case 5: + case 7: + line_bits = glyph_width * pix_bits; + glyph_size = ( glyph_height * line_bits + 7 ) >> 3; + break; + + default: /* invalid format */ + return SFNT_Err_Invalid_File_Format; + } + + /* Now read data and draw glyph into target pixmap */ + if ( FT_FRAME_ENTER( glyph_size ) ) + goto Exit; + + /* don't forget to multiply `x_offset' by `map->pix_bits' as */ + /* the sbit blitter doesn't make a difference between pixmap */ + /* depths. */ + blit_sbit( map, (FT_Byte*)stream->cursor, line_bits, pad_bytes, + x_offset * pix_bits, y_offset, metrics->height ); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + static FT_Error + Load_SBit_Image( TT_SBit_Strike strike, + TT_SBit_Range range, + FT_ULong ebdt_pos, + FT_ULong glyph_offset, + FT_GlyphSlot slot, + FT_Int x_offset, + FT_Int y_offset, + FT_Stream stream, + TT_SBit_Metrics metrics, + FT_Int depth ) + { + FT_Memory memory = stream->memory; + FT_Bitmap* map = &slot->bitmap; + FT_Error error; + + + /* place stream at beginning of glyph data and read metrics */ + if ( FT_STREAM_SEEK( ebdt_pos + glyph_offset ) ) + goto Exit; + + error = tt_load_sbit_metrics( stream, range, metrics ); + if ( error ) + goto Exit; + + /* This function is recursive. At the top-level call, we */ + /* compute the dimensions of the higher-level glyph to */ + /* allocate the final pixmap buffer. */ + if ( depth == 0 ) + { + FT_Long size; + + + map->width = metrics->width; + map->rows = metrics->height; + + switch ( strike->bit_depth ) + { + case 1: + map->pixel_mode = FT_PIXEL_MODE_MONO; + map->pitch = ( map->width + 7 ) >> 3; + break; + + case 2: + map->pixel_mode = FT_PIXEL_MODE_GRAY2; + map->pitch = ( map->width + 3 ) >> 2; + break; + + case 4: + map->pixel_mode = FT_PIXEL_MODE_GRAY4; + map->pitch = ( map->width + 1 ) >> 1; + break; + + case 8: + map->pixel_mode = FT_PIXEL_MODE_GRAY; + map->pitch = map->width; + break; + + default: + return SFNT_Err_Invalid_File_Format; + } + + size = map->rows * map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + error = ft_glyphslot_alloc_bitmap( slot, size ); + if (error) + goto Exit; + } + + switch ( range->image_format ) + { + case 1: /* single sbit image - load it */ + case 2: + case 5: + case 6: + case 7: + return Load_SBit_Single( map, x_offset, y_offset, strike->bit_depth, + range->image_format, metrics, stream ); + + case 8: /* compound format */ + if ( FT_STREAM_SKIP( 1L ) ) + { + error = SFNT_Err_Invalid_Stream_Skip; + goto Exit; + } + /* fallthrough */ + + case 9: + break; + + default: /* invalid image format */ + return SFNT_Err_Invalid_File_Format; + } + + /* All right, we have a compound format. First of all, read */ + /* the array of elements. */ + { + TT_SBit_Component components; + TT_SBit_Component comp; + FT_UShort num_components, count; + + + if ( FT_READ_USHORT( num_components ) || + FT_NEW_ARRAY( components, num_components ) ) + goto Exit; + + count = num_components; + + if ( FT_FRAME_ENTER( 4L * num_components ) ) + goto Fail_Memory; + + for ( comp = components; count > 0; count--, comp++ ) + { + comp->glyph_code = FT_GET_USHORT(); + comp->x_offset = FT_GET_CHAR(); + comp->y_offset = FT_GET_CHAR(); + } + + FT_FRAME_EXIT(); + + /* Now recursively load each element glyph */ + count = num_components; + comp = components; + for ( ; count > 0; count--, comp++ ) + { + TT_SBit_Range elem_range; + TT_SBit_MetricsRec elem_metrics; + FT_ULong elem_offset; + + + /* find the range for this element */ + error = find_sbit_range( comp->glyph_code, + strike, + &elem_range, + &elem_offset ); + if ( error ) + goto Fail_Memory; + + /* now load the element, recursively */ + error = Load_SBit_Image( strike, + elem_range, + ebdt_pos, + elem_offset, + slot, + x_offset + comp->x_offset, + y_offset + comp->y_offset, + stream, + &elem_metrics, + depth + 1 ); + if ( error ) + goto Fail_Memory; + } + + Fail_Memory: + FT_FREE( components ); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_sbit_image */ + /* */ + /* <Description> */ + /* Loads a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* glyph_index :: The current glyph index. */ + /* */ + /* load_flags :: The glyph load flags (the code checks for the flag */ + /* FT_LOAD_CROP_BITMAP). */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* map :: The target pixmap. */ + /* */ + /* metrics :: A big sbit metrics structure for the glyph image. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* <Note> */ + /* The `map.buffer' field is always freed before the glyph is loaded. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ) + { + FT_Error error; + FT_ULong ebdt_pos, glyph_offset; + + TT_SBit_Strike strike; + TT_SBit_Range range; + + + /* Check whether there is a glyph sbit for the current index */ + error = tt_find_sbit_image( face, glyph_index, strike_index, + &range, &strike, &glyph_offset ); + if ( error ) + goto Exit; + + /* now, find the location of the `EBDT' table in */ + /* the font file */ + error = face->goto_table( face, TTAG_EBDT, stream, 0 ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, 0 ); + if ( error ) + goto Exit; + + ebdt_pos = FT_STREAM_POS(); + + error = Load_SBit_Image( strike, range, ebdt_pos, glyph_offset, + face->root.glyph, 0, 0, stream, metrics, 0 ); + if ( error ) + goto Exit; + + /* setup vertical metrics if needed */ + if ( strike->flags & 1 ) + { + /* in case of a horizontal strike only */ + FT_Int advance; + + + advance = strike->hori.ascender - strike->hori.descender; + + /* some heuristic values */ + + metrics->vertBearingX = (FT_Char)(-metrics->width / 2 ); + metrics->vertBearingY = (FT_Char)( ( advance - metrics->height ) / 2 ); + metrics->vertAdvance = (FT_Char)( advance * 12 / 10 ); + } + + /* Crop the bitmap now, unless specified otherwise */ + if ( load_flags & FT_LOAD_CROP_BITMAP ) + crop_bitmap( map, metrics ); + + Exit: + return error; + } + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/sfnt/ttsbit.h b/alienblaster/project/jni/freetype/src/sfnt/ttsbit.h new file mode 100644 index 000000000..7ea2af184 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/sfnt/ttsbit.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* ttsbit.h */ +/* */ +/* TrueType and OpenType embedded bitmap support (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTSBIT_H__ +#define __TTSBIT_H__ + + +#include <ft2build.h> +#include "ttload.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_eblc( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_eblc( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + FT_LOCAL( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_LOCAL( FT_Error ) + tt_find_sbit_image( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + FT_LOCAL( FT_Error ) + tt_load_sbit_metrics( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ); + + +FT_END_HEADER + +#endif /* __TTSBIT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/smooth/Jamfile b/alienblaster/project/jni/freetype/src/smooth/Jamfile new file mode 100644 index 000000000..a8496aa2c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/smooth Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) smooth ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ftgrays ftsmooth ftspic ; + } + else + { + _sources = smooth ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/smooth Jamfile diff --git a/alienblaster/project/jni/freetype/src/smooth/ftgrays.c b/alienblaster/project/jni/freetype/src/smooth/ftgrays.c new file mode 100644 index 000000000..846e454e6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/ftgrays.c @@ -0,0 +1,2090 @@ +/***************************************************************************/ +/* */ +/* ftgrays.c */ +/* */ +/* A new `perfect' anti-aliasing renderer (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* This file can be compiled without the rest of the FreeType engine, by */ + /* defining the _STANDALONE_ macro when compiling it. You also need to */ + /* put the files `ftgrays.h' and `ftimage.h' into the current */ + /* compilation directory. Typically, you could do something like */ + /* */ + /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */ + /* same directory */ + /* */ + /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */ + /* */ + /* cc -c -D_STANDALONE_ ftgrays.c */ + /* */ + /* The renderer can be initialized with a call to */ + /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */ + /* with a call to `ft_gray_raster.raster_render'. */ + /* */ + /* See the comments and documentation in the file `ftimage.h' for more */ + /* details on how the raster works. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* This is a new anti-aliasing scan-converter for FreeType 2. The */ + /* algorithm used here is _very_ different from the one in the standard */ + /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ + /* coverage of the outline on each pixel cell. */ + /* */ + /* It is based on ideas that I initially found in Raph Levien's */ + /* excellent LibArt graphics library (see http://www.levien.com/libart */ + /* for more information, though the web pages do not tell anything */ + /* about the renderer; you'll have to dive into the source code to */ + /* understand how it works). */ + /* */ + /* Note, however, that this is a _very_ different implementation */ + /* compared to Raph's. Coverage information is stored in a very */ + /* different way, and I don't use sorted vector paths. Also, it doesn't */ + /* use floating point values. */ + /* */ + /* This renderer has the following advantages: */ + /* */ + /* - It doesn't need an intermediate bitmap. Instead, one can supply a */ + /* callback function that will be called by the renderer to draw gray */ + /* spans on any target surface. You can thus do direct composition on */ + /* any kind of bitmap, provided that you give the renderer the right */ + /* callback. */ + /* */ + /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ + /* each pixel cell. */ + /* */ + /* - It performs a single pass on the outline (the `standard' FT2 */ + /* renderer makes two passes). */ + /* */ + /* - It can easily be modified to render to _any_ number of gray levels */ + /* cheaply. */ + /* */ + /* - For small (< 20) pixel sizes, it is faster than the standard */ + /* renderer. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_smooth + + +#ifdef _STANDALONE_ + + + /* define this to dump debugging information */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + +#ifdef FT_DEBUG_LEVEL_TRACE +#include <stdio.h> +#include <stdarg.h> +#endif + +#include <string.h> +#include <setjmp.h> +#include <limits.h> +#define FT_UINT_MAX UINT_MAX + +#define ft_memset memset + +#define ft_setjmp setjmp +#define ft_longjmp longjmp +#define ft_jmp_buf jmp_buf + + +#define ErrRaster_Invalid_Mode -2 +#define ErrRaster_Invalid_Outline -1 +#define ErrRaster_Invalid_Argument -3 +#define ErrRaster_Memory_Overflow -4 + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#include "ftimage.h" +#include "ftgrays.h" + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + + /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + void + FT_Message( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + /* we don't handle tracing levels in stand-alone mode; */ +#ifndef FT_TRACE5 +#define FT_TRACE5( varformat ) FT_Message varformat +#endif +#ifndef FT_TRACE7 +#define FT_TRACE7( varformat ) FT_Message varformat +#endif +#ifndef FT_ERROR +#define FT_ERROR( varformat ) FT_Message varformat +#endif + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#define FT_DEFINE_OUTLINE_FUNCS( class_, \ + move_to_, line_to_, \ + conic_to_, cubic_to_, \ + shift_, delta_ ) \ + static const FT_Outline_Funcs class_ = \ + { \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ \ + }; + +#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \ + raster_new_, raster_reset_, \ + raster_set_mode_, raster_render_, \ + raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + +#else /* !_STANDALONE_ */ + + +#include <ft2build.h> +#include "ftgrays.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_OUTLINE_H + +#include "ftsmerrs.h" + +#include "ftspic.h" + +#define ErrRaster_Invalid_Mode Smooth_Err_Cannot_Render_Glyph +#define ErrRaster_Invalid_Outline Smooth_Err_Invalid_Outline +#define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory +#define ErrRaster_Invalid_Argument Smooth_Err_Invalid_Argument + +#endif /* !_STANDALONE_ */ + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + + /* as usual, for the speed hungry :-) */ + +#ifndef FT_STATIC_RASTER + +#define RAS_ARG PWorker worker +#define RAS_ARG_ PWorker worker, + +#define RAS_VAR worker +#define RAS_VAR_ worker, + +#else /* FT_STATIC_RASTER */ + +#define RAS_ARG /* empty */ +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ + +#endif /* FT_STATIC_RASTER */ + + + /* must be at least 6 bits! */ +#define PIXEL_BITS 8 + +#define ONE_PIXEL ( 1L << PIXEL_BITS ) +#define PIXEL_MASK ( -1L << PIXEL_BITS ) +#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) +#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS ) +#define FLOOR( x ) ( (x) & -ONE_PIXEL ) +#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) +#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) + +#if PIXEL_BITS >= 6 +#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) ) +#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) +#else +#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) +#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) ) +#endif + + + /*************************************************************************/ + /* */ + /* TYPE DEFINITIONS */ + /* */ + + /* don't change the following types to FT_Int or FT_Pos, since we might */ + /* need to define them to "float" or "double" when experimenting with */ + /* new algorithms */ + + typedef long TCoord; /* integer scanline/pixel coordinate */ + typedef long TPos; /* sub-pixel coordinate */ + + /* determine the type used to store cell areas. This normally takes at */ + /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */ + /* `long' instead of `int', otherwise bad things happen */ + +#if PIXEL_BITS <= 7 + + typedef int TArea; + +#else /* PIXEL_BITS >= 8 */ + + /* approximately determine the size of integers using an ANSI-C header */ +#if FT_UINT_MAX == 0xFFFFU + typedef long TArea; +#else + typedef int TArea; +#endif + +#endif /* PIXEL_BITS >= 8 */ + + + /* maximal number of gray spans in a call to the span callback */ +#define FT_MAX_GRAY_SPANS 32 + + + typedef struct TCell_* PCell; + + typedef struct TCell_ + { + TPos x; /* same with TWorker.ex */ + TCoord cover; /* same with TWorker.cover */ + TArea area; + PCell next; + + } TCell; + + + typedef struct TWorker_ + { + TCoord ex, ey; + TPos min_ex, max_ex; + TPos min_ey, max_ey; + TPos count_ex, count_ey; + + TArea area; + TCoord cover; + int invalid; + + PCell cells; + FT_PtrDist max_cells; + FT_PtrDist num_cells; + + TCoord cx, cy; + TPos x, y; + + TPos last_ey; + + FT_Vector bez_stack[32 * 3 + 1]; + int lev_stack[32]; + + FT_Outline outline; + FT_Bitmap target; + FT_BBox clip_box; + + FT_Span gray_spans[FT_MAX_GRAY_SPANS]; + int num_gray_spans; + + FT_Raster_Span_Func render_span; + void* render_span_data; + int span_y; + + int band_size; + int band_shoot; + int conic_level; + int cubic_level; + + ft_jmp_buf jump_buffer; + + void* buffer; + long buffer_size; + + PCell* ycells; + TPos ycount; + + } TWorker, *PWorker; + + +#ifndef FT_STATIC_RASTER +#define ras (*worker) +#else + static TWorker ras; +#endif + + + typedef struct TRaster_ + { + void* buffer; + long buffer_size; + int band_size; + void* memory; + PWorker worker; + + } TRaster, *PRaster; + + + + /*************************************************************************/ + /* */ + /* Initialize the cells table. */ + /* */ + static void + gray_init_cells( RAS_ARG_ void* buffer, + long byte_size ) + { + ras.buffer = buffer; + ras.buffer_size = byte_size; + + ras.ycells = (PCell*) buffer; + ras.cells = NULL; + ras.max_cells = 0; + ras.num_cells = 0; + ras.area = 0; + ras.cover = 0; + ras.invalid = 1; + } + + + /*************************************************************************/ + /* */ + /* Compute the outline bounding box. */ + /* */ + static void + gray_compute_cbox( RAS_ARG ) + { + FT_Outline* outline = &ras.outline; + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + if ( outline->n_points <= 0 ) + { + ras.min_ex = ras.max_ex = 0; + ras.min_ey = ras.max_ey = 0; + return; + } + + ras.min_ex = ras.max_ex = vec->x; + ras.min_ey = ras.max_ey = vec->y; + + vec++; + + for ( ; vec < limit; vec++ ) + { + TPos x = vec->x; + TPos y = vec->y; + + + if ( x < ras.min_ex ) ras.min_ex = x; + if ( x > ras.max_ex ) ras.max_ex = x; + if ( y < ras.min_ey ) ras.min_ey = y; + if ( y > ras.max_ey ) ras.max_ey = y; + } + + /* truncate the bounding box to integer pixels */ + ras.min_ex = ras.min_ex >> 6; + ras.min_ey = ras.min_ey >> 6; + ras.max_ex = ( ras.max_ex + 63 ) >> 6; + ras.max_ey = ( ras.max_ey + 63 ) >> 6; + } + + + /*************************************************************************/ + /* */ + /* Record the current cell in the table. */ + /* */ + static PCell + gray_find_cell( RAS_ARG ) + { + PCell *pcell, cell; + TPos x = ras.ex; + + + if ( x > ras.count_ex ) + x = ras.count_ex; + + pcell = &ras.ycells[ras.ey]; + for (;;) + { + cell = *pcell; + if ( cell == NULL || cell->x > x ) + break; + + if ( cell->x == x ) + goto Exit; + + pcell = &cell->next; + } + + if ( ras.num_cells >= ras.max_cells ) + ft_longjmp( ras.jump_buffer, 1 ); + + cell = ras.cells + ras.num_cells++; + cell->x = x; + cell->area = 0; + cell->cover = 0; + + cell->next = *pcell; + *pcell = cell; + + Exit: + return cell; + } + + + static void + gray_record_cell( RAS_ARG ) + { + if ( !ras.invalid && ( ras.area | ras.cover ) ) + { + PCell cell = gray_find_cell( RAS_VAR ); + + + cell->area += ras.area; + cell->cover += ras.cover; + } + } + + + /*************************************************************************/ + /* */ + /* Set the current cell to a new position. */ + /* */ + static void + gray_set_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + /* Move the cell pointer to a new position. We set the `invalid' */ + /* flag to indicate that the cell isn't part of those we're interested */ + /* in during the render phase. This means that: */ + /* */ + /* . the new vertical position must be within min_ey..max_ey-1. */ + /* . the new horizontal position must be strictly less than max_ex */ + /* */ + /* Note that if a cell is to the left of the clipping region, it is */ + /* actually set to the (min_ex-1) horizontal position. */ + + /* All cells that are on the left of the clipping region go to the */ + /* min_ex - 1 horizontal position. */ + ey -= ras.min_ey; + + if ( ex > ras.max_ex ) + ex = ras.max_ex; + + ex -= ras.min_ex; + if ( ex < 0 ) + ex = -1; + + /* are we moving to a different cell ? */ + if ( ex != ras.ex || ey != ras.ey ) + { + /* record the current one if it is valid */ + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); + + ras.area = 0; + ras.cover = 0; + } + + ras.ex = ex; + ras.ey = ey; + ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey || + ex >= ras.count_ex ); + } + + + /*************************************************************************/ + /* */ + /* Start a new contour at a given cell. */ + /* */ + static void + gray_start_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + if ( ex > ras.max_ex ) + ex = (TCoord)( ras.max_ex ); + + if ( ex < ras.min_ex ) + ex = (TCoord)( ras.min_ex - 1 ); + + ras.area = 0; + ras.cover = 0; + ras.ex = ex - ras.min_ex; + ras.ey = ey - ras.min_ey; + ras.last_ey = SUBPIXELS( ey ); + ras.invalid = 0; + + gray_set_cell( RAS_VAR_ ex, ey ); + } + + + /*************************************************************************/ + /* */ + /* Render a scanline as one or more cells. */ + /* */ + static void + gray_render_scanline( RAS_ARG_ TCoord ey, + TPos x1, + TCoord y1, + TPos x2, + TCoord y2 ) + { + TCoord ex1, ex2, fx1, fx2, delta, mod, lift, rem; + long p, first, dx; + int incr; + + + dx = x2 - x1; + + ex1 = TRUNC( x1 ); + ex2 = TRUNC( x2 ); + fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); + fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); + + /* trivial case. Happens often */ + if ( y1 == y2 ) + { + gray_set_cell( RAS_VAR_ ex2, ey ); + return; + } + + /* everything is located in a single cell. That is easy! */ + /* */ + if ( ex1 == ex2 ) + { + delta = y2 - y1; + ras.area += (TArea)(( fx1 + fx2 ) * delta); + ras.cover += delta; + return; + } + + /* ok, we'll have to render a run of adjacent cells on the same */ + /* scanline... */ + /* */ + p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 ); + first = ONE_PIXEL; + incr = 1; + + if ( dx < 0 ) + { + p = fx1 * ( y2 - y1 ); + first = 0; + incr = -1; + dx = -dx; + } + + delta = (TCoord)( p / dx ); + mod = (TCoord)( p % dx ); + if ( mod < 0 ) + { + delta--; + mod += (TCoord)dx; + } + + ras.area += (TArea)(( fx1 + first ) * delta); + ras.cover += delta; + + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + y1 += delta; + + if ( ex1 != ex2 ) + { + p = ONE_PIXEL * ( y2 - y1 + delta ); + lift = (TCoord)( p / dx ); + rem = (TCoord)( p % dx ); + if ( rem < 0 ) + { + lift--; + rem += (TCoord)dx; + } + + mod -= (int)dx; + + while ( ex1 != ex2 ) + { + delta = lift; + mod += rem; + if ( mod >= 0 ) + { + mod -= (TCoord)dx; + delta++; + } + + ras.area += (TArea)(ONE_PIXEL * delta); + ras.cover += delta; + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + } + } + + delta = y2 - y1; + ras.area += (TArea)(( fx2 + ONE_PIXEL - first ) * delta); + ras.cover += delta; + } + + + /*************************************************************************/ + /* */ + /* Render a given line as a series of scanlines. */ + /* */ + static void + gray_render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TCoord ey1, ey2, fy1, fy2, mod; + TPos dx, dy, x, x2; + long p, first; + int delta, rem, lift, incr; + + + ey1 = TRUNC( ras.last_ey ); + ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ + fy1 = (TCoord)( ras.y - ras.last_ey ); + fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) ); + + dx = to_x - ras.x; + dy = to_y - ras.y; + + /* XXX: we should do something about the trivial case where dx == 0, */ + /* as it happens very often! */ + + /* perform vertical clipping */ + { + TCoord min, max; + + + min = ey1; + max = ey2; + if ( ey1 > ey2 ) + { + min = ey2; + max = ey1; + } + if ( min >= ras.max_ey || max < ras.min_ey ) + goto End; + } + + /* everything is on a single scanline */ + if ( ey1 == ey2 ) + { + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 ); + goto End; + } + + /* vertical line - avoid calling gray_render_scanline */ + incr = 1; + + if ( dx == 0 ) + { + TCoord ex = TRUNC( ras.x ); + TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 ); + TArea area; + + + first = ONE_PIXEL; + if ( dy < 0 ) + { + first = 0; + incr = -1; + } + + delta = (int)( first - fy1 ); + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + ey1 += incr; + + gray_set_cell( RAS_VAR_ ex, ey1 ); + + delta = (int)( first + first - ONE_PIXEL ); + area = (TArea)two_fx * delta; + while ( ey1 != ey2 ) + { + ras.area += area; + ras.cover += delta; + ey1 += incr; + + gray_set_cell( RAS_VAR_ ex, ey1 ); + } + + delta = (int)( fy2 - ONE_PIXEL + first ); + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + + goto End; + } + + /* ok, we have to render several scanlines */ + p = ( ONE_PIXEL - fy1 ) * dx; + first = ONE_PIXEL; + incr = 1; + + if ( dy < 0 ) + { + p = fy1 * dx; + first = 0; + incr = -1; + dy = -dy; + } + + delta = (int)( p / dy ); + mod = (int)( p % dy ); + if ( mod < 0 ) + { + delta--; + mod += (TCoord)dy; + } + + x = ras.x + delta; + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first ); + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + + if ( ey1 != ey2 ) + { + p = ONE_PIXEL * dx; + lift = (int)( p / dy ); + rem = (int)( p % dy ); + if ( rem < 0 ) + { + lift--; + rem += (int)dy; + } + mod -= (int)dy; + + while ( ey1 != ey2 ) + { + delta = lift; + mod += rem; + if ( mod >= 0 ) + { + mod -= (int)dy; + delta++; + } + + x2 = x + delta; + gray_render_scanline( RAS_VAR_ ey1, x, + (TCoord)( ONE_PIXEL - first ), x2, + (TCoord)first ); + x = x2; + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + } + } + + gray_render_scanline( RAS_VAR_ ey1, x, + (TCoord)( ONE_PIXEL - first ), to_x, + fy2 ); + + End: + ras.x = to_x; + ras.y = to_y; + ras.last_ey = SUBPIXELS( ey2 ); + } + + + static void + gray_split_conic( FT_Vector* base ) + { + TPos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static void + gray_render_conic( RAS_ARG_ const FT_Vector* control, + const FT_Vector* to ) + { + TPos dx, dy; + int top, level; + int* levels; + FT_Vector* arc; + + + dx = DOWNSCALE( ras.x ) + to->x - ( control->x << 1 ); + if ( dx < 0 ) + dx = -dx; + dy = DOWNSCALE( ras.y ) + to->y - ( control->y << 1 ); + if ( dy < 0 ) + dy = -dy; + if ( dx < dy ) + dx = dy; + + level = 1; + dx = dx / ras.conic_level; + while ( dx > 0 ) + { + dx >>= 2; + level++; + } + + /* a shortcut to speed things up */ + if ( level <= 1 ) + { + /* we compute the mid-point directly in order to avoid */ + /* calling gray_split_conic() */ + TPos to_x, to_y, mid_x, mid_y; + + + to_x = UPSCALE( to->x ); + to_y = UPSCALE( to->y ); + mid_x = ( ras.x + to_x + 2 * UPSCALE( control->x ) ) / 4; + mid_y = ( ras.y + to_y + 2 * UPSCALE( control->y ) ) / 4; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + + return; + } + + arc = ras.bez_stack; + levels = ras.lev_stack; + top = 0; + levels[0] = level; + + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control->x ); + arc[1].y = UPSCALE( control->y ); + arc[2].x = ras.x; + arc[2].y = ras.y; + + while ( top >= 0 ) + { + level = levels[top]; + if ( level > 1 ) + { + /* check that the arc crosses the current band */ + TPos min, max, y; + + + min = max = arc[0].y; + + y = arc[1].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + + y = arc[2].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey ) + goto Draw; + + gray_split_conic( arc ); + arc += 2; + top++; + levels[top] = levels[top - 1] = level - 1; + continue; + } + + Draw: + { + TPos to_x, to_y, mid_x, mid_y; + + + to_x = arc[0].x; + to_y = arc[0].y; + mid_x = ( ras.x + to_x + 2 * arc[1].x ) / 4; + mid_y = ( ras.y + to_y + 2 * arc[1].y ) / 4; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + + top--; + arc -= 2; + } + } + + return; + } + + + static void + gray_split_cubic( FT_Vector* base ) + { + TPos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + static void + gray_render_cubic( RAS_ARG_ const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to ) + { + TPos dx, dy, da, db; + int top, level; + int* levels; + FT_Vector* arc; + + + dx = DOWNSCALE( ras.x ) + to->x - ( control1->x << 1 ); + if ( dx < 0 ) + dx = -dx; + dy = DOWNSCALE( ras.y ) + to->y - ( control1->y << 1 ); + if ( dy < 0 ) + dy = -dy; + if ( dx < dy ) + dx = dy; + da = dx; + + dx = DOWNSCALE( ras.x ) + to->x - 3 * ( control1->x + control2->x ); + if ( dx < 0 ) + dx = -dx; + dy = DOWNSCALE( ras.y ) + to->y - 3 * ( control1->x + control2->y ); + if ( dy < 0 ) + dy = -dy; + if ( dx < dy ) + dx = dy; + db = dx; + + level = 1; + da = da / ras.cubic_level; + db = db / ras.conic_level; + while ( da > 0 || db > 0 ) + { + da >>= 2; + db >>= 3; + level++; + } + + if ( level <= 1 ) + { + TPos to_x, to_y, mid_x, mid_y; + + + to_x = UPSCALE( to->x ); + to_y = UPSCALE( to->y ); + mid_x = ( ras.x + to_x + + 3 * UPSCALE( control1->x + control2->x ) ) / 8; + mid_y = ( ras.y + to_y + + 3 * UPSCALE( control1->y + control2->y ) ) / 8; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + return; + } + + arc = ras.bez_stack; + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control2->x ); + arc[1].y = UPSCALE( control2->y ); + arc[2].x = UPSCALE( control1->x ); + arc[2].y = UPSCALE( control1->y ); + arc[3].x = ras.x; + arc[3].y = ras.y; + + levels = ras.lev_stack; + top = 0; + levels[0] = level; + + while ( top >= 0 ) + { + level = levels[top]; + if ( level > 1 ) + { + /* check that the arc crosses the current band */ + TPos min, max, y; + + + min = max = arc[0].y; + y = arc[1].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + y = arc[2].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + y = arc[3].y; + if ( y < min ) min = y; + if ( y > max ) max = y; + if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < 0 ) + goto Draw; + gray_split_cubic( arc ); + arc += 3; + top ++; + levels[top] = levels[top - 1] = level - 1; + continue; + } + + Draw: + { + TPos to_x, to_y, mid_x, mid_y; + + + to_x = arc[0].x; + to_y = arc[0].y; + mid_x = ( ras.x + to_x + 3 * ( arc[1].x + arc[2].x ) ) / 8; + mid_y = ( ras.y + to_y + 3 * ( arc[1].y + arc[2].y ) ) / 8; + + gray_render_line( RAS_VAR_ mid_x, mid_y ); + gray_render_line( RAS_VAR_ to_x, to_y ); + top --; + arc -= 3; + } + } + + return; + } + + + + static int + gray_move_to( const FT_Vector* to, + PWorker worker ) + { + TPos x, y; + + + /* record current cell, if any */ + gray_record_cell( RAS_VAR ); + + /* start to a new position */ + x = UPSCALE( to->x ); + y = UPSCALE( to->y ); + + gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); + + worker->x = x; + worker->y = y; + return 0; + } + + + static int + gray_line_to( const FT_Vector* to, + PWorker worker ) + { + gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); + return 0; + } + + + static int + gray_conic_to( const FT_Vector* control, + const FT_Vector* to, + PWorker worker ) + { + gray_render_conic( RAS_VAR_ control, to ); + return 0; + } + + + static int + gray_cubic_to( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + PWorker worker ) + { + gray_render_cubic( RAS_VAR_ control1, control2, to ); + return 0; + } + + + static void + gray_render_span( int y, + int count, + const FT_Span* spans, + PWorker worker ) + { + unsigned char* p; + FT_Bitmap* map = &worker->target; + + + /* first of all, compute the scanline offset */ + p = (unsigned char*)map->buffer - y * map->pitch; + if ( map->pitch >= 0 ) + p += ( map->rows - 1 ) * map->pitch; + + for ( ; count > 0; count--, spans++ ) + { + unsigned char coverage = spans->coverage; + + + if ( coverage ) + { + /* For small-spans it is faster to do it by ourselves than + * calling `memset'. This is mainly due to the cost of the + * function call. + */ + if ( spans->len >= 8 ) + FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len ); + else + { + unsigned char* q = p + spans->x; + + + switch ( spans->len ) + { + case 7: *q++ = (unsigned char)coverage; + case 6: *q++ = (unsigned char)coverage; + case 5: *q++ = (unsigned char)coverage; + case 4: *q++ = (unsigned char)coverage; + case 3: *q++ = (unsigned char)coverage; + case 2: *q++ = (unsigned char)coverage; + case 1: *q = (unsigned char)coverage; + default: + ; + } + } + } + } + } + + + static void + gray_hline( RAS_ARG_ TCoord x, + TCoord y, + TPos area, + TCoord acount ) + { + FT_Span* span; + int count; + int coverage; + + + /* compute the coverage line's coverage, depending on the */ + /* outline fill rule */ + /* */ + /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */ + /* */ + coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) ); + /* use range 0..256 */ + if ( coverage < 0 ) + coverage = -coverage; + + if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) + { + coverage &= 511; + + if ( coverage > 256 ) + coverage = 512 - coverage; + else if ( coverage == 256 ) + coverage = 255; + } + else + { + /* normal non-zero winding rule */ + if ( coverage >= 256 ) + coverage = 255; + } + + y += (TCoord)ras.min_ey; + x += (TCoord)ras.min_ex; + + /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */ + if ( x >= 32767 ) + x = 32767; + + /* FT_Span.y is an integer, so limit our coordinates appropriately */ + if ( y >= FT_INT_MAX ) + y = FT_INT_MAX; + + if ( coverage ) + { + /* see whether we can add this span to the current list */ + count = ras.num_gray_spans; + span = ras.gray_spans + count - 1; + if ( count > 0 && + ras.span_y == y && + (int)span->x + span->len == (int)x && + span->coverage == coverage ) + { + span->len = (unsigned short)( span->len + acount ); + return; + } + + if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS ) + { + if ( ras.render_span && count > 0 ) + ras.render_span( ras.span_y, count, ras.gray_spans, + ras.render_span_data ); + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( count > 0 ) + { + int n; + + + FT_TRACE7(( "y = %3d ", ras.span_y )); + span = ras.gray_spans; + for ( n = 0; n < count; n++, span++ ) + FT_TRACE7(( "[%d..%d]:%02x ", + span->x, span->x + span->len - 1, span->coverage )); + FT_TRACE7(( "\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + ras.num_gray_spans = 0; + ras.span_y = (int)y; + + count = 0; + span = ras.gray_spans; + } + else + span++; + + /* add a gray span to the current list */ + span->x = (short)x; + span->len = (unsigned short)acount; + span->coverage = (unsigned char)coverage; + + ras.num_gray_spans++; + } + } + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* to be called while in the debugger -- */ + /* this function causes a compiler warning since it is unused otherwise */ + static void + gray_dump_cells( RAS_ARG ) + { + int yindex; + + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + { + PCell cell; + + + printf( "%3d:", yindex ); + + for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next ) + printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area ); + printf( "\n" ); + } + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + static void + gray_sweep( RAS_ARG_ const FT_Bitmap* target ) + { + int yindex; + + FT_UNUSED( target ); + + + if ( ras.num_cells == 0 ) + return; + + ras.num_gray_spans = 0; + + FT_TRACE7(( "gray_sweep: start\n" )); + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + { + PCell cell = ras.ycells[yindex]; + TCoord cover = 0; + TCoord x = 0; + + + for ( ; cell != NULL; cell = cell->next ) + { + TPos area; + + + if ( cell->x > x && cover != 0 ) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), + cell->x - x ); + + cover += cell->cover; + area = cover * ( ONE_PIXEL * 2 ) - cell->area; + + if ( area != 0 && cell->x >= 0 ) + gray_hline( RAS_VAR_ cell->x, yindex, area, 1 ); + + x = cell->x + 1; + } + + if ( cover != 0 ) + gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ), + ras.count_ex - x ); + } + + if ( ras.render_span && ras.num_gray_spans > 0 ) + ras.render_span( ras.span_y, ras.num_gray_spans, + ras.gray_spans, ras.render_span_data ); + + FT_TRACE7(( "gray_sweep: end\n" )); + } + + +#ifdef _STANDALONE_ + + /*************************************************************************/ + /* */ + /* The following function should only compile in stand-alone mode, */ + /* i.e., when building this component without the rest of FreeType. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Decompose */ + /* */ + /* <Description> */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function is also able to emit */ + /* `move to' and `close to' operations to indicate the start and end */ + /* of new contours in the outline. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* <InOut> */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + static int + FT_Outline_Decompose( const FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + int error; + + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + char tag; /* current point's state */ + + int shift; + TPos delta; + + + if ( !outline || !func_interface ) + return ErrRaster_Invalid_Argument; + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + int last; /* index of last point in contour */ + + + FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return 0; + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error )); + return error; + + Invalid_Outline: + return ErrRaster_Invalid_Outline; + } + +#endif /* _STANDALONE_ */ + + + typedef struct TBand_ + { + TPos min, max; + + } TBand; + + FT_DEFINE_OUTLINE_FUNCS(func_interface, + (FT_Outline_MoveTo_Func) gray_move_to, + (FT_Outline_LineTo_Func) gray_line_to, + (FT_Outline_ConicTo_Func)gray_conic_to, + (FT_Outline_CubicTo_Func)gray_cubic_to, + 0, + 0 + ) + + static int + gray_convert_glyph_inner( RAS_ARG ) + { + + volatile int error = 0; + +#ifdef FT_CONFIG_OPTION_PIC + FT_Outline_Funcs func_interface; + Init_Class_func_interface(&func_interface); +#endif + + if ( ft_setjmp( ras.jump_buffer ) == 0 ) + { + error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); + gray_record_cell( RAS_VAR ); + } + else + error = ErrRaster_Memory_Overflow; + + return error; + } + + + static int + gray_convert_glyph( RAS_ARG ) + { + TBand bands[40]; + TBand* volatile band; + int volatile n, num_bands; + TPos volatile min, max, max_y; + FT_BBox* clip; + + + /* Set up state in the raster object */ + gray_compute_cbox( RAS_VAR ); + + /* clip to target bitmap, exit if nothing to do */ + clip = &ras.clip_box; + + if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax || + ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax ) + return 0; + + if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin; + if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin; + + if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax; + if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax; + + ras.count_ex = ras.max_ex - ras.min_ex; + ras.count_ey = ras.max_ey - ras.min_ey; + + /* simple heuristic used to speed up the bezier decomposition -- see */ + /* the code in gray_render_conic() and gray_render_cubic() for more */ + /* details */ + ras.conic_level = 32; + ras.cubic_level = 16; + + { + int level = 0; + + + if ( ras.count_ex > 24 || ras.count_ey > 24 ) + level++; + if ( ras.count_ex > 120 || ras.count_ey > 120 ) + level++; + + ras.conic_level <<= level; + ras.cubic_level <<= level; + } + + /* set up vertical bands */ + num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size ); + if ( num_bands == 0 ) + num_bands = 1; + if ( num_bands >= 39 ) + num_bands = 39; + + ras.band_shoot = 0; + + min = ras.min_ey; + max_y = ras.max_ey; + + for ( n = 0; n < num_bands; n++, min = max ) + { + max = min + ras.band_size; + if ( n == num_bands - 1 || max > max_y ) + max = max_y; + + bands[0].min = min; + bands[0].max = max; + band = bands; + + while ( band >= bands ) + { + TPos bottom, top, middle; + int error; + + { + PCell cells_max; + int yindex; + long cell_start, cell_end, cell_mod; + + + ras.ycells = (PCell*)ras.buffer; + ras.ycount = band->max - band->min; + + cell_start = sizeof ( PCell ) * ras.ycount; + cell_mod = cell_start % sizeof ( TCell ); + if ( cell_mod > 0 ) + cell_start += sizeof ( TCell ) - cell_mod; + + cell_end = ras.buffer_size; + cell_end -= cell_end % sizeof( TCell ); + + cells_max = (PCell)( (char*)ras.buffer + cell_end ); + ras.cells = (PCell)( (char*)ras.buffer + cell_start ); + if ( ras.cells >= cells_max ) + goto ReduceBands; + + ras.max_cells = cells_max - ras.cells; + if ( ras.max_cells < 2 ) + goto ReduceBands; + + for ( yindex = 0; yindex < ras.ycount; yindex++ ) + ras.ycells[yindex] = NULL; + } + + ras.num_cells = 0; + ras.invalid = 1; + ras.min_ey = band->min; + ras.max_ey = band->max; + ras.count_ey = band->max - band->min; + + error = gray_convert_glyph_inner( RAS_VAR ); + + if ( !error ) + { + gray_sweep( RAS_VAR_ &ras.target ); + band--; + continue; + } + else if ( error != ErrRaster_Memory_Overflow ) + return 1; + + ReduceBands: + /* render pool overflow; we will reduce the render band by half */ + bottom = band->min; + top = band->max; + middle = bottom + ( ( top - bottom ) >> 1 ); + + /* This is too complex for a single scanline; there must */ + /* be some problems. */ + if ( middle == bottom ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" )); +#endif + return 1; + } + + if ( bottom-top >= ras.band_size ) + ras.band_shoot++; + + band[1].min = bottom; + band[1].max = middle; + band[0].min = middle; + band[0].max = top; + band++; + } + } + + if ( ras.band_shoot > 8 && ras.band_size > 16 ) + ras.band_size = ras.band_size / 2; + + return 0; + } + + + static int + gray_raster_render( PRaster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + PWorker worker; + + + if ( !raster || !raster->buffer || !raster->buffer_size ) + return ErrRaster_Invalid_Argument; + + if ( !outline ) + return ErrRaster_Invalid_Outline; + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return 0; + + if ( !outline->contours || !outline->points ) + return ErrRaster_Invalid_Outline; + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return ErrRaster_Invalid_Outline; + + worker = raster->worker; + + /* if direct mode is not set, we must have a target bitmap */ + if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) + { + if ( !target_map ) + return ErrRaster_Invalid_Argument; + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return 0; + + if ( !target_map->buffer ) + return ErrRaster_Invalid_Argument; + } + + /* this version does not support monochrome rendering */ + if ( !( params->flags & FT_RASTER_FLAG_AA ) ) + return ErrRaster_Invalid_Mode; + + /* compute clipping box */ + if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) + { + /* compute clip box from target pixmap */ + ras.clip_box.xMin = 0; + ras.clip_box.yMin = 0; + ras.clip_box.xMax = target_map->width; + ras.clip_box.yMax = target_map->rows; + } + else if ( params->flags & FT_RASTER_FLAG_CLIP ) + ras.clip_box = params->clip_box; + else + { + ras.clip_box.xMin = -32768L; + ras.clip_box.yMin = -32768L; + ras.clip_box.xMax = 32767L; + ras.clip_box.yMax = 32767L; + } + + gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size ); + + ras.outline = *outline; + ras.num_cells = 0; + ras.invalid = 1; + ras.band_size = raster->band_size; + ras.num_gray_spans = 0; + + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + { + ras.render_span = (FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + } + else + { + ras.target = *target_map; + ras.render_span = (FT_Raster_Span_Func)gray_render_span; + ras.render_span_data = &ras; + } + + return gray_convert_glyph( RAS_VAR ); + } + + + /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ + /**** a static object. *****/ + +#ifdef _STANDALONE_ + + static int + gray_raster_new( void* memory, + FT_Raster* araster ) + { + static TRaster the_raster; + + FT_UNUSED( memory ); + + + *araster = (FT_Raster)&the_raster; + FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) ); + + return 0; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + +#else /* _STANDALONE_ */ + + static int + gray_raster_new( FT_Memory memory, + FT_Raster* araster ) + { + FT_Error error; + PRaster raster; + + + *araster = 0; + if ( !FT_ALLOC( raster, sizeof ( TRaster ) ) ) + { + raster->memory = memory; + *araster = (FT_Raster)raster; + } + + return error; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + FT_Memory memory = (FT_Memory)((PRaster)raster)->memory; + + + FT_FREE( raster ); + } + +#endif /* _STANDALONE_ */ + + + static void + gray_raster_reset( FT_Raster raster, + char* pool_base, + long pool_size ) + { + PRaster rast = (PRaster)raster; + + + if ( raster ) + { + if ( pool_base && pool_size >= (long)sizeof ( TWorker ) + 2048 ) + { + PWorker worker = (PWorker)pool_base; + + + rast->worker = worker; + rast->buffer = pool_base + + ( ( sizeof ( TWorker ) + sizeof ( TCell ) - 1 ) & + ~( sizeof ( TCell ) - 1 ) ); + rast->buffer_size = (long)( ( pool_base + pool_size ) - + (char*)rast->buffer ) & + ~( sizeof ( TCell ) - 1 ); + rast->band_size = (int)( rast->buffer_size / + ( sizeof ( TCell ) * 8 ) ); + } + else + { + rast->buffer = NULL; + rast->buffer_size = 0; + rast->worker = NULL; + } + } + } + + + FT_DEFINE_RASTER_FUNCS(ft_grays_raster, + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Raster_New_Func) gray_raster_new, + (FT_Raster_Reset_Func) gray_raster_reset, + (FT_Raster_Set_Mode_Func)0, + (FT_Raster_Render_Func) gray_raster_render, + (FT_Raster_Done_Func) gray_raster_done + ) + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/alienblaster/project/jni/freetype/src/smooth/ftgrays.h b/alienblaster/project/jni/freetype/src/smooth/ftgrays.h new file mode 100644 index 000000000..f20f55f14 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/ftgrays.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* ftgrays.h */ +/* */ +/* FreeType smooth renderer declaration */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGRAYS_H__ +#define __FTGRAYS_H__ + +#ifdef __cplusplus + extern "C" { +#endif + + +#ifdef _STANDALONE_ +#include "ftimage.h" +#else +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */ +#include FT_IMAGE_H +#endif + + + /*************************************************************************/ + /* */ + /* To make ftgrays.h independent from configuration files we check */ + /* whether FT_EXPORT_VAR has been defined already. */ + /* */ + /* On some systems and compilers (Win32 mostly), an extra keyword is */ + /* necessary to compile the library as a DLL. */ + /* */ +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) extern x +#endif + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster; + + +#ifdef __cplusplus + } +#endif + +#endif /* __FTGRAYS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/smooth/ftsmerrs.h b/alienblaster/project/jni/freetype/src/smooth/ftsmerrs.h new file mode 100644 index 000000000..0c2a2ecd9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/ftsmerrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* ftsmerrs.h */ +/* */ +/* smooth renderer error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the smooth renderer error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __FTSMERRS_H__ +#define __FTSMERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX Smooth_Err_ +#define FT_ERR_BASE FT_Mod_Err_Smooth + +#include FT_ERRORS_H + +#endif /* __FTSMERRS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/smooth/ftsmooth.c b/alienblaster/project/jni/freetype/src/smooth/ftsmooth.c new file mode 100644 index 000000000..eed635315 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/ftsmooth.c @@ -0,0 +1,481 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.c */ +/* */ +/* Anti-aliasing renderer interface (body). */ +/* */ +/* Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftsmooth.h" +#include "ftgrays.h" +#include "ftspic.h" + +#include "ftsmerrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_smooth_init( FT_Renderer render ) + { + FT_Library library = FT_MODULE_LIBRARY( render ); + + + render->clazz->raster_class->raster_reset( render->raster, + library->raster_pool, + library->raster_pool_size ); + + return 0; + } + + + /* sets render-specific mode */ + static FT_Error + ft_smooth_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + /* transform a given glyph image */ + static FT_Error + ft_smooth_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = Smooth_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = Smooth_Err_Invalid_Argument; + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_smooth_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_MEM_ZERO( cbox, sizeof ( *cbox ) ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_smooth_render_generic( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin, + FT_Render_Mode required_mode ) + { + FT_Error error; + FT_Outline* outline = NULL; + FT_BBox cbox; + FT_UInt width, height, height_org, width_org, pitch; + FT_Bitmap* bitmap; + FT_Memory memory; + FT_Int hmul = mode == FT_RENDER_MODE_LCD; + FT_Int vmul = mode == FT_RENDER_MODE_LCD_V; + FT_Pos x_shift, y_shift, x_left, y_top; + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = Smooth_Err_Invalid_Argument; + goto Exit; + } + + /* check mode */ + if ( mode != required_mode ) + return Smooth_Err_Cannot_Render_Glyph; + + outline = &slot->outline; + + /* translate the outline to the new origin if needed */ + if ( origin ) + FT_Outline_Translate( outline, origin->x, origin->y ); + + /* compute the control box, and grid fit it */ + FT_Outline_Get_CBox( outline, &cbox ); + + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL( cbox.yMax ); + + width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 ); + height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 ); + bitmap = &slot->bitmap; + memory = render->root.memory; + + width_org = width; + height_org = height; + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + /* allocate new one */ + pitch = width; + if ( hmul ) + { + width = width * 3; + pitch = FT_PAD_CEIL( width, 4 ); + } + + if ( vmul ) + height *= 3; + + x_shift = (FT_Int) cbox.xMin; + y_shift = (FT_Int) cbox.yMin; + x_left = (FT_Int)( cbox.xMin >> 6 ); + y_top = (FT_Int)( cbox.yMax >> 6 ); + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + if ( slot->library->lcd_filter_func ) + { + FT_Int extra = slot->library->lcd_extra; + + + if ( hmul ) + { + x_shift -= 64 * ( extra >> 1 ); + width += 3 * extra; + pitch = FT_PAD_CEIL( width, 4 ); + x_left -= extra >> 1; + } + + if ( vmul ) + { + y_shift -= 64 * ( extra >> 1 ); + height += 3 * extra; + y_top += extra >> 1; + } + } + +#endif + +#if FT_UINT_MAX > 0xFFFFU + + /* Required check is ( pitch * height < FT_ULONG_MAX ), */ + /* but we care realistic cases only. Always pitch <= width. */ + if ( width > 0xFFFFU || height > 0xFFFFU ) + { + FT_ERROR(( "ft_smooth_render_generic: glyph too large: %d x %d\n", + width, height )); + return Smooth_Err_Raster_Overflow; + } + +#endif + + bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; + bitmap->num_grays = 256; + bitmap->width = width; + bitmap->rows = height; + bitmap->pitch = pitch; + + /* translate outline to render it into the bitmap */ + FT_Outline_Translate( outline, -x_shift, -y_shift ); + + if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + /* implode outline if needed */ + { + FT_Vector* points = outline->points; + FT_Vector* points_end = points + outline->n_points; + FT_Vector* vec; + + + if ( hmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->x *= 3; + + if ( vmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->y *= 3; + } + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* deflate outline if needed */ + { + FT_Vector* points = outline->points; + FT_Vector* points_end = points + outline->n_points; + FT_Vector* vec; + + + if ( hmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->x /= 3; + + if ( vmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->y /= 3; + } + + if ( slot->library->lcd_filter_func ) + slot->library->lcd_filter_func( bitmap, mode, slot->library ); + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /* render outline into bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* expand it horizontally */ + if ( hmul ) + { + FT_Byte* line = bitmap->buffer; + FT_UInt hh; + + + for ( hh = height_org; hh > 0; hh--, line += pitch ) + { + FT_UInt xx; + FT_Byte* end = line + width; + + + for ( xx = width_org; xx > 0; xx-- ) + { + FT_UInt pixel = line[xx-1]; + + + end[-3] = (FT_Byte)pixel; + end[-2] = (FT_Byte)pixel; + end[-1] = (FT_Byte)pixel; + end -= 3; + } + } + } + + /* expand it vertically */ + if ( vmul ) + { + FT_Byte* read = bitmap->buffer + ( height - height_org ) * pitch; + FT_Byte* write = bitmap->buffer; + FT_UInt hh; + + + for ( hh = height_org; hh > 0; hh-- ) + { + ft_memcpy( write, read, pitch ); + write += pitch; + + ft_memcpy( write, read, pitch ); + write += pitch; + + ft_memcpy( write, read, pitch ); + write += pitch; + read += pitch; + } + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + FT_Outline_Translate( outline, x_shift, y_shift ); + + /* + * XXX: on 16bit system, we return an error for huge bitmap + * to prevent an overflow. + */ + if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX ) + return Smooth_Err_Invalid_Pixel_Size; + + if ( error ) + goto Exit; + + slot->format = FT_GLYPH_FORMAT_BITMAP; + slot->bitmap_left = (FT_Int)x_left; + slot->bitmap_top = (FT_Int)y_top; + + Exit: + if ( outline && origin ) + FT_Outline_Translate( outline, -origin->x, -origin->y ); + + return error; + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_smooth_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + if ( mode == FT_RENDER_MODE_LIGHT ) + mode = FT_RENDER_MODE_NORMAL; + + return ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_NORMAL ); + } + + + /* convert a slot's glyph image into a horizontal LCD bitmap */ + static FT_Error + ft_smooth_render_lcd( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + + error = ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_LCD ); + if ( !error ) + slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD; + + return error; + } + + + /* convert a slot's glyph image into a vertical LCD bitmap */ + static FT_Error + ft_smooth_render_lcd_v( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error; + + error = ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_LCD_V ); + if ( !error ) + slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V; + + return error; + } + + + FT_DEFINE_RENDERER(ft_smooth_renderer_class, + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + ) + + + FT_DEFINE_RENDERER(ft_smooth_lcd_renderer_class, + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth-lcd", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render_lcd, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + ) + + FT_DEFINE_RENDERER(ft_smooth_lcdv_renderer_class, + + FT_MODULE_RENDERER, + sizeof( FT_RendererRec ), + + "smooth-lcdv", + 0x10000L, + 0x20000L, + + 0, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, + (FT_Module_Destructor) 0, + (FT_Module_Requester) 0 + , + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, + (FT_Renderer_TransformFunc)ft_smooth_transform, + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, + + (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/smooth/ftsmooth.h b/alienblaster/project/jni/freetype/src/smooth/ftsmooth.h new file mode 100644 index 000000000..3708790df --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/ftsmooth.h @@ -0,0 +1,49 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.h */ +/* */ +/* Anti-aliasing renderer interface (specification). */ +/* */ +/* Copyright 1996-2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSMOOTH_H__ +#define __FTSMOOTH_H__ + + +#include <ft2build.h> +#include FT_RENDER_H + + +FT_BEGIN_HEADER + + +#ifndef FT_CONFIG_OPTION_NO_STD_RASTER + FT_DECLARE_RENDERER( ft_std_renderer_class ) +#endif + +#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER + FT_DECLARE_RENDERER( ft_smooth_renderer_class ) + + FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class ) + + FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class ) +#endif + + + +FT_END_HEADER + +#endif /* __FTSMOOTH_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/smooth/ftspic.c b/alienblaster/project/jni/freetype/src/smooth/ftspic.c new file mode 100644 index 000000000..aa547fceb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/ftspic.c @@ -0,0 +1,97 @@ +/***************************************************************************/ +/* */ +/* ftspic.c */ +/* */ +/* The FreeType position independent code services for smooth module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "ftspic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftgrays.c */ + void FT_Init_Class_ft_grays_raster(FT_Raster_Funcs*); + + void + ft_smooth_renderer_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->smooth ) + { + SmoothPIC* container = (SmoothPIC*)pic_container->smooth; + if(--container->ref_count) + return; + FT_FREE( container ); + pic_container->smooth = NULL; + } + } + + + FT_Error + ft_smooth_renderer_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + SmoothPIC* container; + FT_Memory memory = library->memory; + + /* since this function also serve smooth_lcd and smooth_lcdv renderers, + it implements reference counting */ + if(pic_container->smooth) + { + ((SmoothPIC*)pic_container->smooth)->ref_count++; + return error; + } + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->smooth = container; + container->ref_count = 1; + + /* initialize pointer table - this is how the module usually expects this data */ + FT_Init_Class_ft_grays_raster(&container->ft_grays_raster); +/*Exit:*/ + if(error) + ft_smooth_renderer_class_pic_free(library); + return error; + } + + /* re-route these init and free functions to the above functions */ + FT_Error ft_smooth_lcd_renderer_class_pic_init(FT_Library library) + { + return ft_smooth_renderer_class_pic_init(library); + } + void ft_smooth_lcd_renderer_class_pic_free(FT_Library library) + { + ft_smooth_renderer_class_pic_free(library); + } + FT_Error ft_smooth_lcdv_renderer_class_pic_init(FT_Library library) + { + return ft_smooth_renderer_class_pic_init(library); + } + void ft_smooth_lcdv_renderer_class_pic_free(FT_Library library) + { + ft_smooth_renderer_class_pic_free(library); + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/smooth/ftspic.h b/alienblaster/project/jni/freetype/src/smooth/ftspic.h new file mode 100644 index 000000000..c7e0ce9d8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/ftspic.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* ftspic.h */ +/* */ +/* The FreeType position independent code services for smooth module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSPIC_H__ +#define __FTSPIC_H__ + + +FT_BEGIN_HEADER + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_GRAYS_RASTER_GET ft_grays_raster + +#else /* FT_CONFIG_OPTION_PIC */ + + typedef struct SmoothPIC_ + { + int ref_count; + FT_Raster_Funcs ft_grays_raster; + } SmoothPIC; + +#define GET_PIC(lib) ((SmoothPIC*)((lib)->pic_container.smooth)) +#define FT_GRAYS_RASTER_GET (GET_PIC(library)->ft_grays_raster) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __FTSPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/smooth/module.mk b/alienblaster/project/jni/freetype/src/smooth/module.mk new file mode 100644 index 000000000..47f6c0407 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/module.mk @@ -0,0 +1,27 @@ +# +# FreeType 2 smooth renderer module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += SMOOTH_RENDERER + +define SMOOTH_RENDERER +$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE) +$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE) +$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/smooth/rules.mk b/alienblaster/project/jni/freetype/src/smooth/rules.mk new file mode 100644 index 000000000..4f27f01db --- /dev/null +++ b/alienblaster/project/jni/freetype/src/smooth/rules.mk @@ -0,0 +1,69 @@ +# +# FreeType 2 smooth renderer module build rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# smooth driver directory +# +SMOOTH_DIR := $(SRC_DIR)/smooth + +# compilation flags for the driver +# +SMOOTH_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR)) + + +# smooth driver sources (i.e., C files) +# +SMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c \ + $(SMOOTH_DIR)/ftsmooth.c + + +# smooth driver headers +# +SMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h) \ + $(SMOOTH_DIR)/ftsmerrs.h + + +# smooth driver object(s) +# +# SMOOTH_DRV_OBJ_M is used during `multi' builds. +# SMOOTH_DRV_OBJ_S is used during `single' builds. +# +SMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O) +SMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O + +# smooth driver source file for single build +# +SMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c + + +# smooth driver - single object +# +$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \ + $(FREETYPE_H) $(SMOOTH_DRV_H) + $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S)) + + +# smooth driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H) + $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S) +DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/truetype/Jamfile b/alienblaster/project/jni/freetype/src/truetype/Jamfile new file mode 100644 index 000000000..a8cccfe13 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/truetype Jamfile +# +# Copyright 2001, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) truetype ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ttpic ; + } + else + { + _sources = truetype ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/truetype Jamfile diff --git a/alienblaster/project/jni/freetype/src/truetype/module.mk b/alienblaster/project/jni/freetype/src/truetype/module.mk new file mode 100644 index 000000000..baee81a77 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 TrueType module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TRUETYPE_DRIVER + +define TRUETYPE_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)truetype $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/truetype/rules.mk b/alienblaster/project/jni/freetype/src/truetype/rules.mk new file mode 100644 index 000000000..74684260e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/rules.mk @@ -0,0 +1,72 @@ +# +# FreeType 2 TrueType driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# TrueType driver directory +# +TT_DIR := $(SRC_DIR)/truetype + + +# compilation flags for the driver +# +TT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(TT_DIR)) + + +# TrueType driver sources (i.e., C files) +# +TT_DRV_SRC := $(TT_DIR)/ttobjs.c \ + $(TT_DIR)/ttpload.c \ + $(TT_DIR)/ttgload.c \ + $(TT_DIR)/ttinterp.c \ + $(TT_DIR)/ttgxvar.c \ + $(TT_DIR)/ttdriver.c + +# TrueType driver headers +# +TT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \ + $(TT_DIR)/tterrors.h + + +# TrueType driver object(s) +# +# TT_DRV_OBJ_M is used during `multi' builds +# TT_DRV_OBJ_S is used during `single' builds +# +TT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O) +TT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O + +# TrueType driver source file for single build +# +TT_DRV_SRC_S := $(TT_DIR)/truetype.c + + +# TrueType driver - single object +# +$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H) + $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S)) + + +# driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H) + $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(TT_DRV_OBJ_S) +DRV_OBJS_M += $(TT_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/truetype/ttdriver.c b/alienblaster/project/jni/freetype/src/truetype/ttdriver.c new file mode 100644 index 000000000..d723b57ae --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttdriver.c @@ -0,0 +1,487 @@ +/***************************************************************************/ +/* */ +/* ttdriver.c */ +/* */ +/* TrueType font driver implementation (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_SERVICE_XFREE86_NAME_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + +#include FT_SERVICE_TRUETYPE_ENGINE_H +#include FT_SERVICE_TRUETYPE_GLYF_H + +#include "ttdriver.h" +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + +#include "ttpic.h" + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#undef PAIR_TAG +#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \ + (FT_ULong)right ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_get_kerning */ + /* */ + /* <Description> */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* <Output> */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings, are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + static FT_Error + tt_get_kerning( FT_Face ttface, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face face = (TT_Face)ttface; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + + return 0; + } + + +#undef PAIR_TAG + + + static FT_Error + tt_get_advances( FT_Face ttface, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *advances ) + { + FT_UInt nn; + TT_Face face = (TT_Face) ttface; + FT_Bool check = FT_BOOL( + !( flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) ); + + + /* XXX: TODO: check for sbits */ + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + { + for ( nn = 0; nn < count; nn++ ) + { + FT_Short tsb; + FT_UShort ah; + + + TT_Get_VMetrics( face, start + nn, check, &tsb, &ah ); + advances[nn] = ah; + } + } + else + { + for ( nn = 0; nn < count; nn++ ) + { + FT_Short lsb; + FT_UShort aw; + + + TT_Get_HMetrics( face, start + nn, check, &lsb, &aw ); + advances[nn] = aw; + } + } + + return TT_Err_Ok; + } + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S I Z E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + tt_size_select( FT_Size size, + FT_ULong strike_index ) + { + TT_Face ttface = (TT_Face)size->face; + TT_Size ttsize = (TT_Size)size; + FT_Error error = TT_Err_Ok; + + + ttsize->strike_index = strike_index; + + if ( FT_IS_SCALABLE( size->face ) ) + { + /* use the scaled metrics, even when tt_size_reset fails */ + FT_Select_Metrics( size->face, strike_index ); + + tt_size_reset( ttsize ); + } + else + { + SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; + FT_Size_Metrics* metrics = &size->metrics; + + + error = sfnt->load_strike_metrics( ttface, strike_index, metrics ); + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_size_request( FT_Size size, + FT_Size_Request req ) + { + TT_Size ttsize = (TT_Size)size; + FT_Error error = TT_Err_Ok; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + TT_Face ttface = (TT_Face)size->face; + SFNT_Service sfnt = (SFNT_Service) ttface->sfnt; + FT_ULong strike_index; + + + error = sfnt->set_sbit_strike( ttface, req, &strike_index ); + + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + else + return tt_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + FT_Request_Metrics( size->face, req ); + + if ( FT_IS_SCALABLE( size->face ) ) + error = tt_size_reset( ttsize ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Load_Glyph */ + /* */ + /* <Description> */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* <Input> */ + /* slot :: A handle to the target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled, loaded, etc. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Load_Glyph( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ + FT_Size ttsize, /* TT_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; + TT_Size size = (TT_Size)ttsize; + FT_Face face = ttslot->face; + FT_Error error; + + + if ( !slot ) + return TT_Err_Invalid_Slot_Handle; + + if ( !size ) + return TT_Err_Invalid_Size_Handle; + + if ( !face ) + return TT_Err_Invalid_Argument; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_index >= (FT_UInt)face->num_glyphs && + !face->internal->incremental_interface ) +#else + if ( glyph_index >= (FT_UInt)face->num_glyphs ) +#endif + return TT_Err_Invalid_Argument; + + if ( load_flags & FT_LOAD_NO_HINTING ) + { + /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */ + /* are necessary to disable hinting for tricky fonts */ + + if ( FT_IS_TRICKY( face ) ) + load_flags &= ~FT_LOAD_NO_HINTING; + + if ( load_flags & FT_LOAD_NO_AUTOHINT ) + load_flags |= FT_LOAD_NO_HINTING; + } + + if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) + { + load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE; + + if ( !FT_IS_TRICKY( face ) ) + load_flags |= FT_LOAD_NO_HINTING; + } + + /* now load the glyph outline if necessary */ + error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICE_MULTIMASTERSREC(tt_service_gx_multi_masters, + (FT_Get_MM_Func) NULL, + (FT_Set_MM_Design_Func) NULL, + (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, + (FT_Get_MM_Var_Func) TT_Get_MM_Var, + (FT_Set_Var_Design_Func)TT_Set_Var_Design + ) +#endif + + static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = + { +#ifdef TT_USE_BYTECODE_INTERPRETER + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED +#else + FT_TRUETYPE_ENGINE_TYPE_PATENTED +#endif + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_TRUETYPE_ENGINE_TYPE_NONE + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + }; + + FT_DEFINE_SERVICE_TTGLYFREC(tt_service_truetype_glyf, + (TT_Glyf_GetLocationFunc)tt_face_get_location + ) + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC4(tt_services, + FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE, + FT_SERVICE_ID_MULTI_MASTERS, &FT_TT_SERVICE_GX_MULTI_MASTERS_GET, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &FT_TT_SERVICE_TRUETYPE_GLYF_GET + ) +#else + FT_DEFINE_SERVICEDESCREC3(tt_services, + FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &FT_TT_SERVICE_TRUETYPE_GLYF_GET + ) +#endif + + FT_CALLBACK_DEF( FT_Module_Interface ) + tt_get_interface( FT_Module driver, /* TT_Driver */ + const char* tt_interface ) + { + FT_Module_Interface result; + FT_Module sfntd; + SFNT_Service sfnt; + + result = ft_service_list_lookup( FT_TT_SERVICES_GET, tt_interface ); + if ( result != NULL ) + return result; + + if ( !driver ) + return NULL; + + /* only return the default interface from the SFNT module */ + sfntd = FT_Get_Module( driver->library, "sfnt" ); + if ( sfntd ) + { + sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); + if ( sfnt ) + return sfnt->get_interface( driver, tt_interface ); + } + + return 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + +#ifdef TT_USE_BYTECODE_INTERPRETER +#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER +#else +#define TT_HINTER_FLAG 0 +#endif + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define TT_SIZE_SELECT tt_size_select +#else +#define TT_SIZE_SELECT 0 +#endif + + FT_DEFINE_DRIVER(tt_driver_class, + + + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + TT_HINTER_FLAG, + + sizeof ( TT_DriverRec ), + + "truetype", /* driver name */ + 0x10000L, /* driver version == 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or above */ + + (void*)0, /* driver specific interface */ + + tt_driver_init, + tt_driver_done, + tt_get_interface, + + sizeof ( TT_FaceRec ), + sizeof ( TT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + tt_face_init, + tt_face_done, + tt_size_init, + tt_size_done, + tt_slot_init, + 0, /* FT_Slot_DoneFunc */ + + ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + Load_Glyph, + + tt_get_kerning, + 0, /* FT_Face_AttachFunc */ + tt_get_advances, + + tt_size_request, + TT_SIZE_SELECT + ) + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttdriver.h b/alienblaster/project/jni/freetype/src/truetype/ttdriver.h new file mode 100644 index 000000000..aae00f261 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttdriver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* ttdriver.h */ +/* */ +/* High-level TrueType driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTDRIVER_H__ +#define __TTDRIVER_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_DRIVER( tt_driver_class ) + + +FT_END_HEADER + +#endif /* __TTDRIVER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/tterrors.h b/alienblaster/project/jni/freetype/src/truetype/tterrors.h new file mode 100644 index 000000000..d317c70e0 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/tterrors.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* tterrors.h */ +/* */ +/* TrueType error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the TrueType error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __TTERRORS_H__ +#define __TTERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX TT_Err_ +#define FT_ERR_BASE FT_Mod_Err_TrueType + +#include FT_ERRORS_H + +#endif /* __TTERRORS_H__ */ + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttgload.c b/alienblaster/project/jni/freetype/src/truetype/ttgload.c new file mode 100644 index 000000000..57ea0baa7 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttgload.c @@ -0,0 +1,2089 @@ +/***************************************************************************/ +/* */ +/* ttgload.c */ +/* */ +/* TrueType Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ +/* 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_TAGS_H +#include FT_OUTLINE_H + +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttgload + + + /*************************************************************************/ + /* */ + /* Composite font flags. */ + /* */ +#define ARGS_ARE_WORDS 0x0001 +#define ARGS_ARE_XY_VALUES 0x0002 +#define ROUND_XY_TO_GRID 0x0004 +#define WE_HAVE_A_SCALE 0x0008 +/* reserved 0x0010 */ +#define MORE_COMPONENTS 0x0020 +#define WE_HAVE_AN_XY_SCALE 0x0040 +#define WE_HAVE_A_2X2 0x0080 +#define WE_HAVE_INSTR 0x0100 +#define USE_MY_METRICS 0x0200 +#define OVERLAP_COMPOUND 0x0400 +#define SCALED_COMPONENT_OFFSET 0x0800 +#define UNSCALED_COMPONENT_OFFSET 0x1000 + + + /*************************************************************************/ + /* */ + /* Returns the horizontal metrics in font units for a given glyph. If */ + /* `check' is true, take care of monospaced fonts by returning the */ + /* advance width maximum. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* lsb, + FT_UShort* aw ) + { + ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw ); + + if ( check && face->postscript.isFixedPitch ) + *aw = face->horizontal.advance_Width_Max; + + FT_TRACE5(( " advance width (font units): %d\n", *aw )); + FT_TRACE5(( " left side bearing (font units): %d\n", *lsb )); + } + + + /*************************************************************************/ + /* */ + /* Returns the vertical metrics in font units for a given glyph. */ + /* Greg Hitchcock from Microsoft told us that if there were no `vmtx' */ + /* table, typoAscender/Descender from the `OS/2' table would be used */ + /* instead, and if there were no `OS/2' table, use ascender/descender */ + /* from the `hhea' table. But that is not what Microsoft's rasterizer */ + /* apparently does: It uses the ppem value as the advance height, and */ + /* sets the top side bearing to be zero. */ + /* */ + /* The monospace `check' is probably not meaningful here, but we leave */ + /* it in for a consistent interface. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* tsb, + FT_UShort* ah ) + { + FT_UNUSED( check ); + + if ( face->vertical_info ) + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah ); + +#if 1 /* Empirically determined, at variance with what MS said */ + + else + { + *tsb = 0; + *ah = face->root.units_per_EM; + } + +#else /* This is what MS said to do. It isn't what they do, however. */ + + else if ( face->os2.version != 0xFFFFU ) + { + *tsb = face->os2.sTypoAscender; + *ah = face->os2.sTypoAscender - face->os2.sTypoDescender; + } + else + { + *tsb = face->horizontal.Ascender; + *ah = face->horizontal.Ascender - face->horizontal.Descender; + } + +#endif + + FT_TRACE5(( " advance height (font units): %d\n", *ah )); + FT_TRACE5(( " top side bearing (font units): %d\n", *tsb )); + } + + + static void + tt_get_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = (TT_Face)loader->face; + + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + + TT_Get_HMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &left_bearing, + &advance_width ); + TT_Get_VMetrics( face, glyph_index, + (FT_Bool)!( loader->load_flags & + FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ), + &top_bearing, + &advance_height ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* If this is an incrementally loaded font check whether there are */ + /* overriding metrics for this glyph. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + FT_Error error; + + + metrics.bearing_x = left_bearing; + metrics.bearing_y = 0; + metrics.advance = advance_width; + metrics.advance_v = 0; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + if ( error ) + goto Exit; + + left_bearing = (FT_Short)metrics.bearing_x; + advance_width = (FT_UShort)metrics.advance; + +#if 0 + + /* GWW: Do I do the same for vertical metrics? */ + metrics.bearing_x = 0; + metrics.bearing_y = top_bearing; + metrics.advance = advance_height; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, TRUE, &metrics ); + if ( error ) + goto Exit; + + top_bearing = (FT_Short)metrics.bearing_y; + advance_height = (FT_UShort)metrics.advance; + +#endif /* 0 */ + + } + + Exit: + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + } + + + /*************************************************************************/ + /* */ + /* Translates an array of coordinates. */ + /* */ + static void + translate_array( FT_UInt n, + FT_Vector* coords, + FT_Pos delta_x, + FT_Pos delta_y ) + { + FT_UInt k; + + + if ( delta_x ) + for ( k = 0; k < n; k++ ) + coords[k].x += delta_x; + + if ( delta_y ) + for ( k = 0; k < n; k++ ) + coords[k].y += delta_y; + } + + +#undef IS_HINTED +#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) + + + /*************************************************************************/ + /* */ + /* The following functions are used by default with TrueType fonts. */ + /* However, they can be replaced by alternatives if we need to support */ + /* TrueType-compressed formats (like MicroType) in the future. */ + /* */ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + TT_Access_Glyph_Frame( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ) + { + FT_Error error; + FT_Stream stream = loader->stream; + + /* for non-debug mode */ + FT_UNUSED( glyph_index ); + + + FT_TRACE5(( "Glyph %ld\n", glyph_index )); + + /* the following line sets the `error' variable through macros! */ + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) + return error; + + loader->cursor = stream->cursor; + loader->limit = stream->limit; + + return TT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + TT_Forget_Glyph_Frame( TT_Loader loader ) + { + FT_Stream stream = loader->stream; + + + FT_FRAME_EXIT(); + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Glyph_Header( TT_Loader loader ) + { + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + + + if ( p + 10 > limit ) + return TT_Err_Invalid_Outline; + + loader->n_contours = FT_NEXT_SHORT( p ); + + loader->bbox.xMin = FT_NEXT_SHORT( p ); + loader->bbox.yMin = FT_NEXT_SHORT( p ); + loader->bbox.xMax = FT_NEXT_SHORT( p ); + loader->bbox.yMax = FT_NEXT_SHORT( p ); + + FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); + FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, + loader->bbox.xMax )); + FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, + loader->bbox.yMax )); + loader->cursor = p; + + return TT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Simple_Glyph( TT_Loader load ) + { + FT_Error error; + FT_Byte* p = load->cursor; + FT_Byte* limit = load->limit; + FT_GlyphLoader gloader = load->gloader; + FT_Int n_contours = load->n_contours; + FT_Outline* outline; + TT_Face face = (TT_Face)load->face; + FT_UShort n_ins; + FT_Int n_points; + + FT_Byte *flag, *flag_limit; + FT_Byte c, count; + FT_Vector *vec, *vec_limit; + FT_Pos x; + FT_Short *cont, *cont_limit, prev_cont; + FT_Int xy_size = 0; + + + /* check that we can add the contours to the glyph */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours ); + if ( error ) + goto Fail; + + /* reading the contours' endpoints & number of points */ + cont = gloader->current.outline.contours; + cont_limit = cont + n_contours; + + /* check space for contours array + instructions count */ + if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) + goto Invalid_Outline; + + prev_cont = FT_NEXT_USHORT( p ); + + if ( n_contours > 0 ) + cont[0] = prev_cont; + + for ( cont++; cont < cont_limit; cont++ ) + { + cont[0] = FT_NEXT_USHORT( p ); + if ( cont[0] <= prev_cont ) + { + /* unordered contours: this is invalid */ + error = FT_Err_Invalid_Table; + goto Fail; + } + prev_cont = cont[0]; + } + + n_points = 0; + if ( n_contours > 0 ) + { + n_points = cont[-1] + 1; + if ( n_points < 0 ) + goto Invalid_Outline; + } + + /* note that we will add four phantom points later */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); + if ( error ) + goto Fail; + + /* we'd better check the contours table right now */ + outline = &gloader->current.outline; + + for ( cont = outline->contours + 1; cont < cont_limit; cont++ ) + if ( cont[-1] >= cont[0] ) + goto Invalid_Outline; + + /* reading the bytecode instructions */ + load->glyph->control_len = 0; + load->glyph->control_data = 0; + + if ( p + 2 > limit ) + goto Invalid_Outline; + + n_ins = FT_NEXT_USHORT( p ); + + FT_TRACE5(( " Instructions size: %u\n", n_ins )); + + if ( n_ins > face->max_profile.maxSizeOfInstructions ) + { + FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n", + n_ins )); + error = TT_Err_Too_Many_Hints; + goto Fail; + } + + if ( ( limit - p ) < n_ins ) + { + FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); + error = TT_Err_Too_Many_Hints; + goto Fail; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load->load_flags ) ) + { + load->glyph->control_len = n_ins; + load->glyph->control_data = load->exec->glyphIns; + + FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + p += n_ins; + + /* reading the point tags */ + flag = (FT_Byte*)outline->tags; + flag_limit = flag + n_points; + + FT_ASSERT( flag != NULL ); + + while ( flag < flag_limit ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + *flag++ = c = FT_NEXT_BYTE( p ); + if ( c & 8 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + count = FT_NEXT_BYTE( p ); + if ( flag + (FT_Int)count > flag_limit ) + goto Invalid_Outline; + + for ( ; count > 0; count-- ) + *flag++ = c; + } + } + + /* reading the X coordinates */ + + vec = outline->points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + if ( p + xy_size > limit ) + goto Invalid_Outline; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos y = 0; + FT_Byte f = *flag; + + + if ( f & 2 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_BYTE( p ); + if ( ( f & 16 ) == 0 ) + y = -y; + } + else if ( ( f & 16 ) == 0 ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += y; + vec->x = x; + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & ~( 2 | 16 ) ); + } + + /* reading the Y coordinates */ + + vec = gloader->current.outline.points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos y = 0; + FT_Byte f = *flag; + + + if ( f & 4 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_BYTE( p ); + if ( ( f & 32 ) == 0 ) + y = -y; + } + else if ( ( f & 32 ) == 0 ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += y; + vec->y = x; + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & FT_CURVE_TAG_ON ); + } + + outline->n_points = (FT_UShort)n_points; + outline->n_contours = (FT_Short) n_contours; + + load->cursor = p; + + Fail: + return error; + + Invalid_Outline: + error = TT_Err_Invalid_Outline; + goto Fail; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Composite_Glyph( TT_Loader loader ) + { + FT_Error error; + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + FT_GlyphLoader gloader = loader->gloader; + FT_SubGlyph subglyph; + FT_UInt num_subglyphs; + + + num_subglyphs = 0; + + do + { + FT_Fixed xx, xy, yy, yx; + FT_UInt count; + + + /* check that we can load a new subglyph */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 ); + if ( error ) + goto Fail; + + /* check space */ + if ( p + 4 > limit ) + goto Invalid_Composite; + + subglyph = gloader->current.subglyphs + num_subglyphs; + + subglyph->arg1 = subglyph->arg2 = 0; + + subglyph->flags = FT_NEXT_USHORT( p ); + subglyph->index = FT_NEXT_USHORT( p ); + + /* check space */ + count = 2; + if ( subglyph->flags & ARGS_ARE_WORDS ) + count += 2; + if ( subglyph->flags & WE_HAVE_A_SCALE ) + count += 2; + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + count += 4; + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + count += 8; + + if ( p + count > limit ) + goto Invalid_Composite; + + /* read arguments */ + if ( subglyph->flags & ARGS_ARE_WORDS ) + { + subglyph->arg1 = FT_NEXT_SHORT( p ); + subglyph->arg2 = FT_NEXT_SHORT( p ); + } + else + { + subglyph->arg1 = FT_NEXT_CHAR( p ); + subglyph->arg2 = FT_NEXT_CHAR( p ); + } + + /* read transform */ + xx = yy = 0x10000L; + xy = yx = 0; + + if ( subglyph->flags & WE_HAVE_A_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = xx; + } + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + } + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2; + } + + subglyph->transform.xx = xx; + subglyph->transform.xy = xy; + subglyph->transform.yx = yx; + subglyph->transform.yy = yy; + + num_subglyphs++; + + } while ( subglyph->flags & MORE_COMPONENTS ); + + gloader->current.num_subglyphs = num_subglyphs; + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + + + /* we must undo the FT_FRAME_ENTER in order to point */ + /* to the composite instructions, if we find some. */ + /* We will process them later. */ + /* */ + loader->ins_pos = (FT_ULong)( FT_STREAM_POS() + + p - limit ); + } + +#endif + + loader->cursor = p; + + Fail: + return error; + + Invalid_Composite: + error = TT_Err_Invalid_Composite; + goto Fail; + } + + + FT_LOCAL_DEF( void ) + TT_Init_Glyph_Loading( TT_Face face ) + { + face->access_glyph_frame = TT_Access_Glyph_Frame; + face->read_glyph_header = TT_Load_Glyph_Header; + face->read_simple_glyph = TT_Load_Simple_Glyph; + face->read_composite_glyph = TT_Load_Composite_Glyph; + face->forget_glyph_frame = TT_Forget_Glyph_Frame; + } + + + static void + tt_prepare_zone( TT_GlyphZone zone, + FT_GlyphLoad load, + FT_UInt start_point, + FT_UInt start_contour ) + { + zone->n_points = (FT_UShort)( load->outline.n_points - start_point ); + zone->n_contours = (FT_Short) ( load->outline.n_contours - + start_contour ); + zone->org = load->extra_points + start_point; + zone->cur = load->outline.points + start_point; + zone->orus = load->extra_points2 + start_point; + zone->tags = (FT_Byte*)load->outline.tags + start_point; + zone->contours = (FT_UShort*)load->outline.contours + start_contour; + zone->first_point = (FT_UShort)start_point; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Hint_Glyph */ + /* */ + /* <Description> */ + /* Hint the glyph using the zone prepared by the caller. Note that */ + /* the zone is supposed to include four phantom points. */ + /* */ + static FT_Error + TT_Hint_Glyph( TT_Loader loader, + FT_Bool is_composite ) + { + TT_GlyphZone zone = &loader->zone; + FT_Pos origin; + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_UInt n_ins; +#else + FT_UNUSED( is_composite ); +#endif + + +#ifdef TT_USE_BYTECODE_INTERPRETER + if ( loader->glyph->control_len > 0xFFFFL ) + { + FT_TRACE1(( "TT_Hint_Glyph: too long instructions " )); + FT_TRACE1(( "(0x%lx byte) is truncated\n", + loader->glyph->control_len )); + } + n_ins = (FT_UInt)( loader->glyph->control_len ); +#endif + + origin = zone->cur[zone->n_points - 4].x; + origin = FT_PIX_ROUND( origin ) - origin; + if ( origin ) + translate_array( zone->n_points, zone->cur, origin, 0 ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + /* save original point position in org */ + if ( n_ins > 0 ) + FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); + + /* Reset graphics state. */ + loader->exec->GS = ((TT_Size)loader->size)->GS; + + /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ + /* completely refer to the (already) hinted subglyphs. */ + if ( is_composite ) + { + loader->exec->metrics.x_scale = 1 << 16; + loader->exec->metrics.y_scale = 1 << 16; + + FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); + } + else + { + loader->exec->metrics.x_scale = + ((TT_Size)loader->size)->metrics.x_scale; + loader->exec->metrics.y_scale = + ((TT_Size)loader->size)->metrics.y_scale; + } +#endif + + /* round pp2 and pp4 */ + zone->cur[zone->n_points - 3].x = + FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); + zone->cur[zone->n_points - 1].y = + FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( n_ins > 0 ) + { + FT_Bool debug; + FT_Error error; + + FT_GlyphLoader gloader = loader->gloader; + FT_Outline current_outline = gloader->current.outline; + + + error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph, + loader->exec->glyphIns, n_ins ); + if ( error ) + return error; + + loader->exec->is_composite = is_composite; + loader->exec->pts = *zone; + + debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) && + ((TT_Size)loader->size)->debug ); + + error = TT_Run_Context( loader->exec, debug ); + if ( error && loader->exec->pedantic_hinting ) + return error; + + /* store drop-out mode in bits 5-7; set bit 2 also as a marker */ + current_outline.tags[0] |= + ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; + } + +#endif + + /* save glyph phantom points */ + if ( !loader->preserve_pps ) + { + loader->pp1 = zone->cur[zone->n_points - 4]; + loader->pp2 = zone->cur[zone->n_points - 3]; + loader->pp3 = zone->cur[zone->n_points - 2]; + loader->pp4 = zone->cur[zone->n_points - 1]; + } + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Process_Simple_Glyph */ + /* */ + /* <Description> */ + /* Once a simple glyph has been loaded, it needs to be processed. */ + /* Usually, this means scaling and hinting through bytecode */ + /* interpretation. */ + /* */ + static FT_Error + TT_Process_Simple_Glyph( TT_Loader loader ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Error error = TT_Err_Ok; + FT_Outline* outline; + FT_Int n_points; + + + outline = &gloader->current.outline; + n_points = outline->n_points; + + /* set phantom points */ + + outline->points[n_points ] = loader->pp1; + outline->points[n_points + 1] = loader->pp2; + outline->points[n_points + 2] = loader->pp3; + outline->points[n_points + 3] = loader->pp4; + + outline->tags[n_points ] = 0; + outline->tags[n_points + 1] = 0; + outline->tags[n_points + 2] = 0; + outline->tags[n_points + 3] = 0; + + n_points += 4; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( ((TT_Face)loader->face)->doblend ) + { + /* Deltas apply to the unscaled data. */ + FT_Vector* deltas; + FT_Memory memory = loader->face->memory; + FT_Int i; + + + error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), + loader->glyph_index, + &deltas, + n_points ); + if ( error ) + return error; + + for ( i = 0; i < n_points; ++i ) + { + outline->points[i].x += deltas[i].x; + outline->points[i].y += deltas[i].y; + } + + FT_FREE( deltas ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( IS_HINTED( loader->load_flags ) ) + { + tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 ); + + FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur, + loader->zone.n_points + 4 ); + } + + /* scale the glyph */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + FT_Vector* vec = outline->points; + FT_Vector* limit = outline->points + n_points; + FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale; + FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale; + + + for ( ; vec < limit; vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + loader->pp1 = outline->points[n_points - 4]; + loader->pp2 = outline->points[n_points - 3]; + loader->pp3 = outline->points[n_points - 2]; + loader->pp4 = outline->points[n_points - 1]; + } + + if ( IS_HINTED( loader->load_flags ) ) + { + loader->zone.n_points += 4; + + error = TT_Hint_Glyph( loader, 0 ); + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Process_Composite_Component */ + /* */ + /* <Description> */ + /* Once a composite component has been loaded, it needs to be */ + /* processed. Usually, this means transforming and translating. */ + /* */ + static FT_Error + TT_Process_Composite_Component( TT_Loader loader, + FT_SubGlyph subglyph, + FT_UInt start_point, + FT_UInt num_base_points ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Vector* base_vec = gloader->base.outline.points; + FT_UInt num_points = gloader->base.outline.n_points; + FT_Bool have_scale; + FT_Pos x, y; + + + have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | + WE_HAVE_AN_XY_SCALE | + WE_HAVE_A_2X2 ) ); + + /* perform the transform required for this subglyph */ + if ( have_scale ) + { + FT_UInt i; + + + for ( i = num_base_points; i < num_points; i++ ) + FT_Vector_Transform( base_vec + i, &subglyph->transform ); + } + + /* get offset */ + if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) + { + FT_UInt k = subglyph->arg1; + FT_UInt l = subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + /* match l-th point of the newly loaded component to the k-th point */ + /* of the previously loaded components. */ + + /* change to the point numbers used by our outline */ + k += start_point; + l += num_base_points; + if ( k >= num_base_points || + l >= num_points ) + return TT_Err_Invalid_Composite; + + p1 = gloader->base.outline.points + k; + p2 = gloader->base.outline.points + l; + + x = p1->x - p2->x; + y = p1->y - p2->y; + } + else + { + x = subglyph->arg1; + y = subglyph->arg2; + + if ( !x && !y ) + return TT_Err_Ok; + + /* Use a default value dependent on */ + /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old TT */ + /* fonts which don't set the xxx_COMPONENT_OFFSET bit. */ + + if ( have_scale && +#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) ) +#else + ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) +#endif + { + +#if 0 + + /*************************************************************************/ + /* */ + /* This algorithm is what Apple documents. But it doesn't work. */ + /* */ + int a = subglyph->transform.xx > 0 ? subglyph->transform.xx + : -subglyph->transform.xx; + int b = subglyph->transform.yx > 0 ? subglyph->transform.yx + : -subglyph->transform.yx; + int c = subglyph->transform.xy > 0 ? subglyph->transform.xy + : -subglyph->transform.xy; + int d = subglyph->transform.yy > 0 ? subglyph->transform.yy + : -subglyph->transform.yy; + int m = a > b ? a : b; + int n = c > d ? c : d; + + + if ( a - b <= 33 && a - b >= -33 ) + m *= 2; + if ( c - d <= 33 && c - d >= -33 ) + n *= 2; + x = FT_MulFix( x, m ); + y = FT_MulFix( y, n ); + +#else /* 0 */ + + /*************************************************************************/ + /* */ + /* This algorithm is a guess and works much better than the above. */ + /* */ + FT_Fixed mac_xscale = FT_SqrtFixed( + (FT_Int32)FT_MulFix( subglyph->transform.xx, + subglyph->transform.xx ) + + (FT_Int32)FT_MulFix( subglyph->transform.xy, + subglyph->transform.xy ) ); + FT_Fixed mac_yscale = FT_SqrtFixed( + (FT_Int32)FT_MulFix( subglyph->transform.yy, + subglyph->transform.yy ) + + (FT_Int32)FT_MulFix( subglyph->transform.yx, + subglyph->transform.yx ) ); + + + x = FT_MulFix( x, mac_xscale ); + y = FT_MulFix( y, mac_yscale ); + +#endif /* 0 */ + + } + + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale; + FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale; + + + x = FT_MulFix( x, x_scale ); + y = FT_MulFix( y, y_scale ); + + if ( subglyph->flags & ROUND_XY_TO_GRID ) + { + x = FT_PIX_ROUND( x ); + y = FT_PIX_ROUND( y ); + } + } + } + + if ( x || y ) + translate_array( num_points - num_base_points, + base_vec + num_base_points, + x, y ); + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Process_Composite_Glyph */ + /* */ + /* <Description> */ + /* This is slightly different from TT_Process_Simple_Glyph, in that */ + /* its sole purpose is to hint the glyph. Thus this function is */ + /* only available when bytecode interpreter is enabled. */ + /* */ + static FT_Error + TT_Process_Composite_Glyph( TT_Loader loader, + FT_UInt start_point, + FT_UInt start_contour ) + { + FT_Error error; + FT_Outline* outline; + FT_UInt i; + + + outline = &loader->gloader->base.outline; + + /* make room for phantom points */ + error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, + outline->n_points + 4, + 0 ); + if ( error ) + return error; + + outline->points[outline->n_points ] = loader->pp1; + outline->points[outline->n_points + 1] = loader->pp2; + outline->points[outline->n_points + 2] = loader->pp3; + outline->points[outline->n_points + 3] = loader->pp4; + + outline->tags[outline->n_points ] = 0; + outline->tags[outline->n_points + 1] = 0; + outline->tags[outline->n_points + 2] = 0; + outline->tags[outline->n_points + 3] = 0; + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + FT_UShort n_ins; + + + /* TT_Load_Composite_Glyph only gives us the offset of instructions */ + /* so we read them here */ + if ( FT_STREAM_SEEK( loader->ins_pos ) || + FT_READ_USHORT( n_ins ) ) + return error; + + FT_TRACE5(( " Instructions size = %d\n", n_ins )); + + /* check it */ + if ( n_ins > ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions ) + { + FT_TRACE0(( "TT_Process_Composite_Glyph: too many instructions (%d)\n", + n_ins )); + + return TT_Err_Too_Many_Hints; + } + else if ( n_ins == 0 ) + return TT_Err_Ok; + + if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) ) + return error; + + loader->glyph->control_data = loader->exec->glyphIns; + loader->glyph->control_len = n_ins; + } + +#endif + + tt_prepare_zone( &loader->zone, &loader->gloader->base, + start_point, start_contour ); + + /* Some points are likely touched during execution of */ + /* instructions on components. So let's untouch them. */ + for ( i = start_point; i < loader->zone.n_points; i++ ) + loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH; + + loader->zone.n_points += 4; + + return TT_Hint_Glyph( loader, 1 ); + } + + + /* Calculate the four phantom points. */ + /* The first two stand for horizontal origin and advance. */ + /* The last two stand for vertical origin and advance. */ +#define TT_LOADER_SET_PP( loader ) \ + do { \ + (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \ + (loader)->pp1.y = 0; \ + (loader)->pp2.x = (loader)->pp1.x + (loader)->advance; \ + (loader)->pp2.y = 0; \ + (loader)->pp3.x = 0; \ + (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax; \ + (loader)->pp4.x = 0; \ + (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* load_truetype_glyph */ + /* */ + /* <Description> */ + /* Loads a given truetype glyph. Handles composites and uses a */ + /* TT_Loader object. */ + /* */ + static FT_Error + load_truetype_glyph( TT_Loader loader, + FT_UInt glyph_index, + FT_UInt recurse_count, + FT_Bool header_only ) + { + FT_Error error = TT_Err_Ok; + FT_Fixed x_scale, y_scale; + FT_ULong offset; + TT_Face face = (TT_Face)loader->face; + FT_GlyphLoader gloader = loader->gloader; + FT_Bool opened_frame = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Vector* deltas = NULL; +#endif + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_StreamRec inc_stream; + FT_Data glyph_data; + FT_Bool glyph_data_loaded = 0; +#endif + + + /* some fonts have an incorrect value of `maxComponentDepth', */ + /* thus we allow depth 1 to catch the majority of them */ + if ( recurse_count > 1 && + recurse_count > face->max_profile.maxComponentDepth ) + { + error = TT_Err_Invalid_Composite; + goto Exit; + } + + /* check glyph index */ + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = TT_Err_Invalid_Glyph_Index; + goto Exit; + } + + loader->glyph_index = glyph_index; + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + x_scale = ((TT_Size)loader->size)->metrics.x_scale; + y_scale = ((TT_Size)loader->size)->metrics.y_scale; + } + else + { + x_scale = 0x10000L; + y_scale = 0x10000L; + } + + tt_get_metrics( loader, glyph_index ); + + /* Set `offset' to the start of the glyph relative to the start of */ + /* the `glyf' table, and `byte_len' to the length of the glyph in */ + /* bytes. */ + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* If we are loading glyph data via the incremental interface, set */ + /* the loader stream to a memory stream reading the data returned */ + /* by the interface. */ + if ( face->root.internal->incremental_interface ) + { + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &glyph_data ); + if ( error ) + goto Exit; + + glyph_data_loaded = 1; + offset = 0; + loader->byte_len = glyph_data.length; + + FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) ); + FT_Stream_OpenMemory( &inc_stream, + glyph_data.pointer, glyph_data.length ); + + loader->stream = &inc_stream; + } + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + offset = tt_face_get_location( face, glyph_index, + (FT_UInt*)&loader->byte_len ); + + if ( loader->byte_len > 0 ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* for the incremental interface, `glyf_offset' is always zero */ + if ( !loader->glyf_offset && + !face->root.internal->incremental_interface ) +#else + if ( !loader->glyf_offset ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + + error = face->access_glyph_frame( loader, glyph_index, + loader->glyf_offset + offset, + loader->byte_len ); + if ( error ) + goto Exit; + + opened_frame = 1; + + /* read glyph header first */ + error = face->read_glyph_header( loader ); + if ( error || header_only ) + goto Exit; + } + + if ( loader->byte_len == 0 || loader->n_contours == 0 ) + { + loader->bbox.xMin = 0; + loader->bbox.xMax = 0; + loader->bbox.yMin = 0; + loader->bbox.yMax = 0; + + if ( header_only ) + goto Exit; + + TT_LOADER_SET_PP( loader ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( ((TT_Face)(loader->face))->doblend ) + { + /* this must be done before scaling */ + FT_Memory memory = loader->face->memory; + + + error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), + glyph_index, &deltas, 4 ); + if ( error ) + goto Exit; + + loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y; + loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y; + loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y; + loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y; + + FT_FREE( deltas ); + } + +#endif + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + error = TT_Err_Ok; + goto Exit; + } + + TT_LOADER_SET_PP( loader ); + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* if it is a simple glyph, load it */ + + if ( loader->n_contours > 0 ) + { + error = face->read_simple_glyph( loader ); + if ( error ) + goto Exit; + + /* all data have been read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + + error = TT_Process_Simple_Glyph( loader ); + if ( error ) + goto Exit; + + FT_GlyphLoader_Add( gloader ); + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* otherwise, load a composite! */ + else if ( loader->n_contours == -1 ) + { + FT_UInt start_point; + FT_UInt start_contour; + FT_ULong ins_pos; /* position of composite instructions, if any */ + + + start_point = gloader->base.outline.n_points; + start_contour = gloader->base.outline.n_contours; + + /* for each subglyph, read composite header */ + error = face->read_composite_glyph( loader ); + if ( error ) + goto Exit; + + /* store the offset of instructions */ + ins_pos = loader->ins_pos; + + /* all data we need are read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( face->doblend ) + { + FT_Int i, limit; + FT_SubGlyph subglyph; + FT_Memory memory = face->root.memory; + + + /* this provides additional offsets */ + /* for each component's translation */ + + if ( ( error = TT_Vary_Get_Glyph_Deltas( + face, + glyph_index, + &deltas, + gloader->current.num_subglyphs + 4 )) != 0 ) + goto Exit; + + subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs; + limit = gloader->current.num_subglyphs; + + for ( i = 0; i < limit; ++i, ++subglyph ) + { + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + { + /* XXX: overflow check for subglyph->{arg1,arg2}. */ + /* deltas[i].{x,y} must be within signed 16-bit, */ + /* but the restriction of summed delta is not clear */ + subglyph->arg1 += (FT_Int16)deltas[i].x; + subglyph->arg2 += (FT_Int16)deltas[i].y; + } + } + + loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y; + loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y; + loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y; + loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y; + + FT_FREE( deltas ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */ + /* `as is' in the glyph slot (the client application will be */ + /* responsible for interpreting these data)... */ + if ( loader->load_flags & FT_LOAD_NO_RECURSE ) + { + FT_GlyphLoader_Add( gloader ); + loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + goto Exit; + } + + /*********************************************************************/ + /*********************************************************************/ + /*********************************************************************/ + + { + FT_UInt n, num_base_points; + FT_SubGlyph subglyph = 0; + + FT_UInt num_points = start_point; + FT_UInt num_subglyphs = gloader->current.num_subglyphs; + FT_UInt num_base_subgs = gloader->base.num_subglyphs; + + FT_Stream old_stream = loader->stream; + + + FT_GlyphLoader_Add( gloader ); + + /* read each subglyph independently */ + for ( n = 0; n < num_subglyphs; n++ ) + { + FT_Vector pp[4]; + + + /* Each time we call load_truetype_glyph in this loop, the */ + /* value of `gloader.base.subglyphs' can change due to table */ + /* reallocations. We thus need to recompute the subglyph */ + /* pointer on each iteration. */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + pp[0] = loader->pp1; + pp[1] = loader->pp2; + pp[2] = loader->pp3; + pp[3] = loader->pp4; + + num_base_points = gloader->base.outline.n_points; + + error = load_truetype_glyph( loader, subglyph->index, + recurse_count + 1, FALSE ); + if ( error ) + goto Exit; + + /* restore subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + if ( !( subglyph->flags & USE_MY_METRICS ) ) + { + loader->pp1 = pp[0]; + loader->pp2 = pp[1]; + loader->pp3 = pp[2]; + loader->pp4 = pp[3]; + } + + num_points = gloader->base.outline.n_points; + + if ( num_points == num_base_points ) + continue; + + /* gloader->base.outline consists of three parts: */ + /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */ + /* */ + /* (1): exists from the beginning */ + /* (2): components that have been loaded so far */ + /* (3): the newly loaded component */ + TT_Process_Composite_Component( loader, subglyph, start_point, + num_base_points ); + } + + loader->stream = old_stream; + + /* process the glyph */ + loader->ins_pos = ins_pos; + if ( IS_HINTED( loader->load_flags ) && + +#ifdef TT_USE_BYTECODE_INTERPRETER + + subglyph->flags & WE_HAVE_INSTR && + +#endif + + num_points > start_point ) + TT_Process_Composite_Glyph( loader, start_point, start_contour ); + + } + } + else + { + /* invalid composite count (negative but not -1) */ + error = TT_Err_Invalid_Outline; + goto Exit; + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + Exit: + + if ( opened_frame ) + face->forget_glyph_frame( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( glyph_data_loaded ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + +#endif + + return error; + } + + + static FT_Error + compute_glyph_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + FT_BBox bbox; + TT_Face face = (TT_Face)loader->face; + FT_Fixed y_scale; + TT_GlyphSlot glyph = loader->glyph; + TT_Size size = (TT_Size)loader->size; + + + y_scale = 0x10000L; + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + y_scale = size->root.metrics.y_scale; + + if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) + FT_Outline_Get_CBox( &glyph->outline, &bbox ); + else + bbox = loader->bbox; + + /* get the device-independent horizontal advance; it is scaled later */ + /* by the base layer. */ + { + FT_Pos advance = loader->linear; + + + /* the flag FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH was introduced to */ + /* correctly support DynaLab fonts, which have an incorrect */ + /* `advance_Width_Max' field! It is used, to my knowledge, */ + /* exclusively in the X-TrueType font server. */ + /* */ + if ( face->postscript.isFixedPitch && + ( loader->load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) == 0 ) + advance = face->horizontal.advance_Width_Max; + + /* we need to return the advance in font units in linearHoriAdvance, */ + /* it will be scaled later by the base layer. */ + glyph->linearHoriAdvance = advance; + } + + glyph->metrics.horiBearingX = bbox.xMin; + glyph->metrics.horiBearingY = bbox.yMax; + glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + + /* adjust advance width to the value contained in the hdmx table */ + if ( !face->postscript.isFixedPitch && + IS_HINTED( loader->load_flags ) ) + { + FT_Byte* widthp; + + + widthp = tt_face_get_device_metrics( face, + size->root.metrics.x_ppem, + glyph_index ); + + if ( widthp ) + glyph->metrics.horiAdvance = *widthp << 6; + } + + /* set glyph dimensions */ + glyph->metrics.width = bbox.xMax - bbox.xMin; + glyph->metrics.height = bbox.yMax - bbox.yMin; + + /* Now take care of vertical metrics. In the case where there is */ + /* no vertical information within the font (relatively common), */ + /* create some metrics manually */ + { + FT_Pos top; /* scaled vertical top side bearing */ + FT_Pos advance; /* scaled vertical advance height */ + + + /* Get the unscaled top bearing and advance height. */ + if ( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ) + { + top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax, + y_scale ); + + if ( loader->pp3.y <= loader->pp4.y ) + advance = 0; + else + advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y, + y_scale ); + } + else + { + FT_Pos height; + + + /* XXX Compute top side bearing and advance height in */ + /* Get_VMetrics instead of here. */ + + /* NOTE: The OS/2 values are the only `portable' ones, */ + /* which is why we use them, if there is an OS/2 */ + /* table in the font. Otherwise, we use the */ + /* values defined in the horizontal header. */ + + height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin, + y_scale ); + if ( face->os2.version != 0xFFFFU ) + advance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + advance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + + top = ( advance - height ) / 2; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + FT_Incremental_InterfaceRec* incr; + FT_Incremental_MetricsRec metrics; + FT_Error error; + + + incr = face->root.internal->incremental_interface; + + /* If this is an incrementally loaded font see if there are */ + /* overriding metrics for this glyph. */ + if ( incr && incr->funcs->get_glyph_metrics ) + { + metrics.bearing_x = 0; + metrics.bearing_y = top; + metrics.advance = advance; + + error = incr->funcs->get_glyph_metrics( incr->object, + glyph_index, + TRUE, + &metrics ); + if ( error ) + return error; + + top = metrics.bearing_y; + advance = metrics.advance; + } + } + + /* GWW: Do vertical metrics get loaded incrementally too? */ + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + glyph->linearVertAdvance = advance; + + /* scale the metrics */ + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + top = FT_MulFix( top, y_scale ); + advance = FT_MulFix( advance, y_scale ); + } + + /* XXX: for now, we have no better algorithm for the lsb, but it */ + /* should work fine. */ + /* */ + glyph->metrics.vertBearingX = glyph->metrics.horiBearingX - + glyph->metrics.horiAdvance / 2; + glyph->metrics.vertBearingY = top; + glyph->metrics.vertAdvance = advance; + } + + return 0; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + load_sbit_image( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face; + SFNT_Service sfnt; + FT_Stream stream; + FT_Error error; + TT_SBit_MetricsRec metrics; + + + face = (TT_Face)glyph->face; + sfnt = (SFNT_Service)face->sfnt; + stream = face->root.stream; + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_Int)load_flags, + stream, + &glyph->bitmap, + &metrics ); + if ( !error ) + { + glyph->outline.n_points = 0; + glyph->outline.n_contours = 0; + + glyph->metrics.width = (FT_Pos)metrics.width << 6; + glyph->metrics.height = (FT_Pos)metrics.height << 6; + + glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; + glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; + glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; + + glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; + glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; + glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; + + glyph->format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->bitmap_left = metrics.vertBearingX; + glyph->bitmap_top = metrics.vertBearingY; + } + else + { + glyph->bitmap_left = metrics.horiBearingX; + glyph->bitmap_top = metrics.horiBearingY; + } + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_loader_init( TT_Loader loader, + TT_Size size, + TT_GlyphSlot glyph, + FT_Int32 load_flags, + FT_Bool glyf_table_only ) + { + TT_Face face; + FT_Stream stream; + + + face = (TT_Face)glyph->face; + stream = face->root.stream; + + FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /* load execution context */ + if ( IS_HINTED( load_flags ) && !glyf_table_only ) + { + TT_ExecContext exec; + FT_Bool grayscale; + + + if ( !size->cvt_ready ) + { + FT_Error error = tt_size_ready_bytecode( size ); + if ( error ) + return error; + } + + /* query new execution context */ + exec = size->debug ? size->context + : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + grayscale = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO ); + + TT_Load_Context( exec, face, size ); + + /* a change from mono to grayscale rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( grayscale != exec->grayscale ) + { + FT_UInt i; + + + exec->grayscale = grayscale; + + for ( i = 0; i < size->cvt_size; i++ ) + size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); + tt_size_run_prep( size ); + } + + /* see whether the cvt program has disabled hinting */ + if ( exec->GS.instruct_control & 1 ) + load_flags |= FT_LOAD_NO_HINTING; + + /* load default graphics state -- if needed */ + if ( exec->GS.instruct_control & 2 ) + exec->GS = tt_default_graphics_state; + + exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); + loader->exec = exec; + loader->instructions = exec->glyphIns; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + /* seek to the beginning of the glyph table -- for Type 42 fonts */ + /* the table might be accessed from a Postscript stream or something */ + /* else... */ + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( face->root.internal->incremental_interface ) + loader->glyf_offset = 0; + else + +#endif + + { + FT_Error error = face->goto_table( face, TTAG_glyf, stream, 0 ); + + + if ( error == TT_Err_Table_Missing ) + loader->glyf_offset = 0; + else if ( error ) + { + FT_ERROR(( "tt_loader_init: could not access glyph table\n" )); + return error; + } + else + loader->glyf_offset = FT_STREAM_POS(); + } + + /* get face's glyph loader */ + if ( !glyf_table_only ) + { + FT_GlyphLoader gloader = glyph->internal->loader; + + + FT_GlyphLoader_Rewind( gloader ); + loader->gloader = gloader; + } + + loader->load_flags = load_flags; + + loader->face = (FT_Face)face; + loader->size = (FT_Size)size; + loader->glyph = (FT_GlyphSlot)glyph; + loader->stream = stream; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Load_Glyph */ + /* */ + /* <Description> */ + /* A function used to load a single glyph within a given glyph slot, */ + /* for a given size. */ + /* */ + /* <Input> */ + /* glyph :: A handle to a target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled/loaded. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face; + FT_Error error; + TT_LoaderRec loader; + + + face = (TT_Face)glyph->face; + error = TT_Err_Ok; + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size->strike_index != 0xFFFFFFFFUL && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + error = load_sbit_image( size, glyph, glyph_index, load_flags ); + if ( !error ) + { + FT_Face root = &face->root; + + + if ( FT_IS_SCALABLE( root ) ) + { + /* for the bbox we need the header only */ + (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); + (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); + glyph->linearHoriAdvance = loader.linear; + glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax - + loader.vadvance; + if ( face->postscript.isFixedPitch && + ( load_flags & FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ) == 0 ) + glyph->linearHoriAdvance = face->horizontal.advance_Width_Max; + } + + return TT_Err_Ok; + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) + return TT_Err_Invalid_Size_Handle; + + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return TT_Err_Invalid_Argument; + + error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); + if ( error ) + return error; + + glyph->format = FT_GLYPH_FORMAT_OUTLINE; + glyph->num_subglyphs = 0; + glyph->outline.flags = 0; + + /* main loading loop */ + error = load_truetype_glyph( &loader, glyph_index, 0, FALSE ); + if ( !error ) + { + if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE ) + { + glyph->num_subglyphs = loader.gloader->base.num_subglyphs; + glyph->subglyphs = loader.gloader->base.subglyphs; + } + else + { + glyph->outline = loader.gloader->base.outline; + glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; + + /* In case bit 1 of the `flags' field in the `head' table isn't */ + /* set, translate array so that (0,0) is the glyph's origin. */ + if ( ( face->header.Flags & 2 ) == 0 && loader.pp1.x ) + FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load_flags ) ) + { + if ( loader.exec->GS.scan_control ) + { + /* convert scan conversion mode to FT_OUTLINE_XXX flags */ + switch ( loader.exec->GS.scan_type ) + { + case 0: /* simple drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS; + break; + case 1: /* simple drop-outs excluding stubs */ + /* nothing; it's the default rendering mode */ + break; + case 4: /* smart drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS | + FT_OUTLINE_INCLUDE_STUBS; + break; + case 5: /* smart drop-outs excluding stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS; + break; + + default: /* no drop-out control */ + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + break; + } + } + else + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + compute_glyph_metrics( &loader, glyph_index ); + } + + /* Set the `high precision' bit flag. */ + /* This is _critical_ to get correct output for monochrome */ + /* TrueType glyphs at all sizes using the bytecode interpreter. */ + /* */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && + size->root.metrics.y_ppem < 24 ) + glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttgload.h b/alienblaster/project/jni/freetype/src/truetype/ttgload.h new file mode 100644 index 000000000..958d67d20 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttgload.h @@ -0,0 +1,63 @@ +/***************************************************************************/ +/* */ +/* ttgload.h */ +/* */ +/* TrueType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTGLOAD_H__ +#define __TTGLOAD_H__ + + +#include <ft2build.h> +#include "ttobjs.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + TT_Init_Glyph_Loading( TT_Face face ); + + FT_LOCAL( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* lsb, + FT_UShort* aw ); + + FT_LOCAL( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Bool check, + FT_Short* tsb, + FT_UShort* ah ); + + FT_LOCAL( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __TTGLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttgxvar.c b/alienblaster/project/jni/freetype/src/truetype/ttgxvar.c new file mode 100644 index 000000000..ef25aafb5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttgxvar.c @@ -0,0 +1,1544 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.c */ +/* */ +/* TrueType GX Font Variation loader */ +/* */ +/* Copyright 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at */ + /* */ + /* http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html */ + /* */ + /* The documentation for `fvar' is inconsistent. At one point it says */ + /* that `countSizePairs' should be 3, at another point 2. It should */ + /* be 2. */ + /* */ + /* The documentation for `gvar' is not intelligible; `cvar' refers you */ + /* to `gvar' and is thus also incomprehensible. */ + /* */ + /* The documentation for `avar' appears correct, but Apple has no fonts */ + /* with an `avar' table, so it is hard to test. */ + /* */ + /* Many thanks to John Jenkins (at Apple) in figuring this out. */ + /* */ + /* */ + /* Apple's `kern' table has some references to tuple indices, but as */ + /* there is no indication where these indices are defined, nor how to */ + /* interpolate the kerning values (different tuples have different */ + /* classes) this issue is ignored. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_TAGS_H +#include FT_MULTIPLE_MASTERS_H + +#include "ttpload.h" +#include "ttgxvar.h" + +#include "tterrors.h" + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + +#define FT_Stream_FTell( stream ) \ + ( (stream)->cursor - (stream)->base ) +#define FT_Stream_SeekSet( stream, off ) \ + ( (stream)->cursor = (stream)->base+(off) ) + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttgxvar + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Internal Routines *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It */ + /* indicates that there is a delta for every point without needing to */ + /* enumerate all of them. */ + /* */ +#define ALL_POINTS (FT_UShort*)( -1 ) + + +#define GX_PT_POINTS_ARE_WORDS 0x80 +#define GX_PT_POINT_RUN_COUNT_MASK 0x7F + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_readpackedpoints */ + /* */ + /* <Description> */ + /* Read a set of points to which the following deltas will apply. */ + /* Points are packed with a run length encoding. */ + /* */ + /* <Input> */ + /* stream :: The data stream. */ + /* */ + /* <Output> */ + /* point_cnt :: The number of points read. A zero value means that */ + /* all points in the glyph will be affected, without */ + /* enumerating them individually. */ + /* */ + /* <Return> */ + /* An array of FT_UShort containing the affected points or the */ + /* special value ALL_POINTS. */ + /* */ + static FT_UShort* + ft_var_readpackedpoints( FT_Stream stream, + FT_UInt *point_cnt ) + { + FT_UShort *points; + FT_Int n; + FT_Int runcnt; + FT_Int i; + FT_Int j; + FT_Int first; + FT_Memory memory = stream->memory; + FT_Error error = TT_Err_Ok; + + FT_UNUSED( error ); + + + *point_cnt = n = FT_GET_BYTE(); + if ( n == 0 ) + return ALL_POINTS; + + if ( n & GX_PT_POINTS_ARE_WORDS ) + n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 ); + + if ( FT_NEW_ARRAY( points, n ) ) + return NULL; + + i = 0; + while ( i < n ) + { + runcnt = FT_GET_BYTE(); + if ( runcnt & GX_PT_POINTS_ARE_WORDS ) + { + runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK; + first = points[i++] = FT_GET_USHORT(); + + if ( runcnt < 1 ) + goto Exit; + + /* first point not included in runcount */ + for ( j = 0; j < runcnt; ++j ) + points[i++] = (FT_UShort)( first += FT_GET_USHORT() ); + } + else + { + first = points[i++] = FT_GET_BYTE(); + + if ( runcnt < 1 ) + goto Exit; + + for ( j = 0; j < runcnt; ++j ) + points[i++] = (FT_UShort)( first += FT_GET_BYTE() ); + } + } + + Exit: + return points; + } + + + enum + { + GX_DT_DELTAS_ARE_ZERO = 0x80, + GX_DT_DELTAS_ARE_WORDS = 0x40, + GX_DT_DELTA_RUN_COUNT_MASK = 0x3F + }; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_readpackeddeltas */ + /* */ + /* <Description> */ + /* Read a set of deltas. These are packed slightly differently than */ + /* points. In particular there is no overall count. */ + /* */ + /* <Input> */ + /* stream :: The data stream. */ + /* */ + /* delta_cnt :: The number of to be read. */ + /* */ + /* <Return> */ + /* An array of FT_Short containing the deltas for the affected */ + /* points. (This only gets the deltas for one dimension. It will */ + /* generally be called twice, once for x, once for y. When used in */ + /* cvt table, it will only be called once.) */ + /* */ + static FT_Short* + ft_var_readpackeddeltas( FT_Stream stream, + FT_Offset delta_cnt ) + { + FT_Short *deltas; + FT_UInt runcnt; + FT_Offset i; + FT_UInt j; + FT_Memory memory = stream->memory; + FT_Error error = TT_Err_Ok; + + FT_UNUSED( error ); + + + if ( FT_NEW_ARRAY( deltas, delta_cnt ) ) + return NULL; + + i = 0; + while ( i < delta_cnt ) + { + runcnt = FT_GET_BYTE(); + if ( runcnt & GX_DT_DELTAS_ARE_ZERO ) + { + /* runcnt zeroes get added */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = 0; + } + else if ( runcnt & GX_DT_DELTAS_ARE_WORDS ) + { + /* runcnt shorts from the stack */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = FT_GET_SHORT(); + } + else + { + /* runcnt signed bytes from the stack */ + for ( j = 0; + j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt; + ++j ) + deltas[i++] = FT_GET_CHAR(); + } + + if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) ) + { + /* Bad format */ + FT_FREE( deltas ); + return NULL; + } + } + + return deltas; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_load_avar */ + /* */ + /* <Description> */ + /* Parse the `avar' table if present. It need not be, so we return */ + /* nothing. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* */ + static void + ft_var_load_avar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM(face); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + GX_AVarSegment segment; + FT_Error error = TT_Err_Ok; + FT_ULong version; + FT_Long axisCount; + FT_Int i, j; + FT_ULong table_len; + + FT_UNUSED( error ); + + + blend->avar_checked = TRUE; + if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 ) + return; + + if ( FT_FRAME_ENTER( table_len ) ) + return; + + version = FT_GET_LONG(); + axisCount = FT_GET_LONG(); + + if ( version != 0x00010000L || + axisCount != (FT_Long)blend->mmvar->num_axis ) + goto Exit; + + if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) ) + goto Exit; + + segment = &blend->avar_segment[0]; + for ( i = 0; i < axisCount; ++i, ++segment ) + { + segment->pairCount = FT_GET_USHORT(); + if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) ) + { + /* Failure. Free everything we have done so far. We must do */ + /* it right now since loading the `avar' table is optional. */ + + for ( j = i - 1; j >= 0; --j ) + FT_FREE( blend->avar_segment[j].correspondence ); + + FT_FREE( blend->avar_segment ); + blend->avar_segment = NULL; + goto Exit; + } + + for ( j = 0; j < segment->pairCount; ++j ) + { + segment->correspondence[j].fromCoord = + FT_GET_SHORT() << 2; /* convert to Fixed */ + segment->correspondence[j].toCoord = + FT_GET_SHORT()<<2; /* convert to Fixed */ + } + } + + Exit: + FT_FRAME_EXIT(); + } + + + typedef struct GX_GVar_Head_ + { + FT_Long version; + FT_UShort axisCount; + FT_UShort globalCoordCount; + FT_ULong offsetToCoord; + FT_UShort glyphCount; + FT_UShort flags; + FT_ULong offsetToData; + + } GX_GVar_Head; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_load_gvar */ + /* */ + /* <Description> */ + /* Parses the `gvar' table if present. If `fvar' is there, `gvar' */ + /* had better be there too. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + ft_var_load_gvar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM(face); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + FT_Error error; + FT_UInt i, j; + FT_ULong table_len; + FT_ULong gvar_start; + FT_ULong offsetToData; + GX_GVar_Head gvar_head; + + static const FT_Frame_Field gvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_GVar_Head + + FT_FRAME_START( 20 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( axisCount ), + FT_FRAME_USHORT( globalCoordCount ), + FT_FRAME_ULONG ( offsetToCoord ), + FT_FRAME_USHORT( glyphCount ), + FT_FRAME_USHORT( flags ), + FT_FRAME_ULONG ( offsetToData ), + FT_FRAME_END + }; + + if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 ) + goto Exit; + + gvar_start = FT_STREAM_POS( ); + if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) ) + goto Exit; + + blend->tuplecount = gvar_head.globalCoordCount; + blend->gv_glyphcnt = gvar_head.glyphCount; + offsetToData = gvar_start + gvar_head.offsetToData; + + if ( gvar_head.version != (FT_Long)0x00010000L || + gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis ) + { + error = TT_Err_Invalid_Table; + goto Exit; + } + + if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) ) + goto Exit; + + if ( gvar_head.flags & 1 ) + { + /* long offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) ) + goto Exit; + + for ( i = 0; i <= blend->gv_glyphcnt; ++i ) + blend->glyphoffsets[i] = offsetToData + FT_GET_LONG(); + + FT_FRAME_EXIT(); + } + else + { + /* short offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) ) + goto Exit; + + for ( i = 0; i <= blend->gv_glyphcnt; ++i ) + blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2; + /* XXX: Undocumented: `*2'! */ + + FT_FRAME_EXIT(); + } + + if ( blend->tuplecount != 0 ) + { + if ( FT_NEW_ARRAY( blend->tuplecoords, + gvar_head.axisCount * blend->tuplecount ) ) + goto Exit; + + if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || + FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) ) + goto Exit; + + for ( i = 0; i < blend->tuplecount; ++i ) + for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j ) + blend->tuplecoords[i * gvar_head.axisCount + j] = + FT_GET_SHORT() << 2; /* convert to FT_Fixed */ + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* ft_var_apply_tuple */ + /* */ + /* <Description> */ + /* Figure out whether a given tuple (design) applies to the current */ + /* blend, and if so, what is the scaling factor. */ + /* */ + /* <Input> */ + /* blend :: The current blend of the font. */ + /* */ + /* tupleIndex :: A flag saying whether this is an intermediate */ + /* tuple or not. */ + /* */ + /* tuple_coords :: The coordinates of the tuple in normalized axis */ + /* units. */ + /* */ + /* im_start_coords :: The initial coordinates where this tuple starts */ + /* to apply (for intermediate coordinates). */ + /* */ + /* im_end_coords :: The final coordinates after which this tuple no */ + /* longer applies (for intermediate coordinates). */ + /* */ + /* <Return> */ + /* An FT_Fixed value containing the scaling factor. */ + /* */ + static FT_Fixed + ft_var_apply_tuple( GX_Blend blend, + FT_UShort tupleIndex, + FT_Fixed* tuple_coords, + FT_Fixed* im_start_coords, + FT_Fixed* im_end_coords ) + { + FT_UInt i; + FT_Fixed apply; + FT_Fixed temp; + + + apply = 0x10000L; + for ( i = 0; i < blend->num_axis; ++i ) + { + if ( tuple_coords[i] == 0 ) + /* It's not clear why (for intermediate tuples) we don't need */ + /* to check against start/end -- the documentation says we don't. */ + /* Similarly, it's unclear why we don't need to scale along the */ + /* axis. */ + continue; + + else if ( blend->normalizedcoords[i] == 0 || + ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) || + ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) ) + { + apply = 0; + break; + } + + else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) + /* not an intermediate tuple */ + apply = FT_MulDiv( apply, + blend->normalizedcoords[i] > 0 + ? blend->normalizedcoords[i] + : -blend->normalizedcoords[i], + 0x10000L ); + + else if ( blend->normalizedcoords[i] <= im_start_coords[i] || + blend->normalizedcoords[i] >= im_end_coords[i] ) + { + apply = 0; + break; + } + + else if ( blend->normalizedcoords[i] < tuple_coords[i] ) + { + temp = FT_MulDiv( blend->normalizedcoords[i] - im_start_coords[i], + 0x10000L, + tuple_coords[i] - im_start_coords[i]); + apply = FT_MulDiv( apply, temp, 0x10000L ); + } + + else + { + temp = FT_MulDiv( im_end_coords[i] - blend->normalizedcoords[i], + 0x10000L, + im_end_coords[i] - tuple_coords[i] ); + apply = FT_MulDiv( apply, temp, 0x10000L ); + } + } + + return apply; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct GX_FVar_Head_ + { + FT_Long version; + FT_UShort offsetToData; + FT_UShort countSizePairs; + FT_UShort axisCount; + FT_UShort axisSize; + FT_UShort instanceCount; + FT_UShort instanceSize; + + } GX_FVar_Head; + + + typedef struct fvar_axis_ + { + FT_ULong axisTag; + FT_ULong minValue; + FT_ULong defaultValue; + FT_ULong maxValue; + FT_UShort flags; + FT_UShort nameID; + + } GX_FVar_Axis; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Get_MM_Var */ + /* */ + /* <Description> */ + /* Check that the font's `fvar' table is valid, parse it, and return */ + /* those data. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* TT_Get_MM_Var initializes the blend structure. */ + /* */ + /* <Output> */ + /* master :: The `fvar' data (must be freed by caller). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = face->root.memory; + FT_ULong table_len; + FT_Error error = TT_Err_Ok; + FT_ULong fvar_start; + FT_Int i, j; + FT_MM_Var* mmvar; + FT_Fixed* next_coords; + FT_String* next_name; + FT_Var_Axis* a; + FT_Var_Named_Style* ns; + GX_FVar_Head fvar_head; + + static const FT_Frame_Field fvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Head + + FT_FRAME_START( 16 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( offsetToData ), + FT_FRAME_USHORT( countSizePairs ), + FT_FRAME_USHORT( axisCount ), + FT_FRAME_USHORT( axisSize ), + FT_FRAME_USHORT( instanceCount ), + FT_FRAME_USHORT( instanceSize ), + FT_FRAME_END + }; + + static const FT_Frame_Field fvaraxis_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Axis + + FT_FRAME_START( 20 ), + FT_FRAME_ULONG ( axisTag ), + FT_FRAME_ULONG ( minValue ), + FT_FRAME_ULONG ( defaultValue ), + FT_FRAME_ULONG ( maxValue ), + FT_FRAME_USHORT( flags ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_END + }; + + + if ( face->blend == NULL ) + { + /* both `fvar' and `gvar' must be present */ + if ( (error = face->goto_table( face, TTAG_gvar, + stream, &table_len )) != 0 ) + goto Exit; + + if ( (error = face->goto_table( face, TTAG_fvar, + stream, &table_len )) != 0 ) + goto Exit; + + fvar_start = FT_STREAM_POS( ); + + if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) ) + goto Exit; + + if ( fvar_head.version != (FT_Long)0x00010000L || + fvar_head.countSizePairs != 2 || + fvar_head.axisSize != 20 || + fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount || + fvar_head.offsetToData + fvar_head.axisCount * 20U + + fvar_head.instanceCount * fvar_head.instanceSize > table_len ) + { + error = TT_Err_Invalid_Table; + goto Exit; + } + + if ( FT_NEW( face->blend ) ) + goto Exit; + + /* XXX: TODO - check for overflows */ + face->blend->mmvar_len = + sizeof ( FT_MM_Var ) + + fvar_head.axisCount * sizeof ( FT_Var_Axis ) + + fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) + + fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) + + 5 * fvar_head.axisCount; + + if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + goto Exit; + face->blend->mmvar = mmvar; + + mmvar->num_axis = + fvar_head.axisCount; + mmvar->num_designs = + (FT_UInt)-1; /* meaningless in this context; each glyph */ + /* may have a different number of designs */ + /* (or tuples, as called by Apple) */ + mmvar->num_namedstyles = + fvar_head.instanceCount; + mmvar->axis = + (FT_Var_Axis*)&(mmvar[1]); + mmvar->namedstyle = + (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]); + + next_coords = + (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]); + for ( i = 0; i < fvar_head.instanceCount; ++i ) + { + mmvar->namedstyle[i].coords = next_coords; + next_coords += fvar_head.axisCount; + } + + next_name = (FT_String*)next_coords; + for ( i = 0; i < fvar_head.axisCount; ++i ) + { + mmvar->axis[i].name = next_name; + next_name += 5; + } + + if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) ) + goto Exit; + + a = mmvar->axis; + for ( i = 0; i < fvar_head.axisCount; ++i ) + { + GX_FVar_Axis axis_rec; + + + if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) ) + goto Exit; + a->tag = axis_rec.axisTag; + a->minimum = axis_rec.minValue; /* A Fixed */ + a->def = axis_rec.defaultValue; /* A Fixed */ + a->maximum = axis_rec.maxValue; /* A Fixed */ + a->strid = axis_rec.nameID; + + a->name[0] = (FT_String)( a->tag >> 24 ); + a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF ); + a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF ); + a->name[3] = (FT_String)( ( a->tag ) & 0xFF ); + a->name[4] = 0; + + ++a; + } + + ns = mmvar->namedstyle; + for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns ) + { + if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) ) + goto Exit; + + ns->strid = FT_GET_USHORT(); + (void) /* flags = */ FT_GET_USHORT(); + + for ( j = 0; j < fvar_head.axisCount; ++j ) + ns->coords[j] = FT_GET_ULONG(); /* A Fixed */ + + FT_FRAME_EXIT(); + } + } + + if ( master != NULL ) + { + FT_UInt n; + + + if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + goto Exit; + FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len ); + + mmvar->axis = + (FT_Var_Axis*)&(mmvar[1]); + mmvar->namedstyle = + (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]); + next_coords = + (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]); + + for ( n = 0; n < mmvar->num_namedstyles; ++n ) + { + mmvar->namedstyle[n].coords = next_coords; + next_coords += mmvar->num_axis; + } + + a = mmvar->axis; + next_name = (FT_String*)next_coords; + for ( n = 0; n < mmvar->num_axis; ++n ) + { + a->name = next_name; + + /* standard PostScript names for some standard apple tags */ + if ( a->tag == TTAG_wght ) + a->name = (char *)"Weight"; + else if ( a->tag == TTAG_wdth ) + a->name = (char *)"Width"; + else if ( a->tag == TTAG_opsz ) + a->name = (char *)"OpticalSize"; + else if ( a->tag == TTAG_slnt ) + a->name = (char *)"Slant"; + + next_name += 5; + ++a; + } + + *master = mmvar; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Set_MM_Blend */ + /* */ + /* <Description> */ + /* Set the blend (normalized) coordinates for this instance of the */ + /* font. Check that the `gvar' table is reasonable and does some */ + /* initial preparation. */ + /* */ + /* <InOut> */ + /* face :: The font. */ + /* Initialize the blend structure with `gvar' data. */ + /* */ + /* <Input> */ + /* num_coords :: Must be the axis count of the font. */ + /* */ + /* coords :: An array of num_coords, each between [-1,1]. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = TT_Err_Ok; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i; + FT_Memory memory = face->root.memory; + + enum + { + mcvt_retain, + mcvt_modify, + mcvt_load + + } manageCvt; + + + face->doblend = FALSE; + + if ( face->blend == NULL ) + { + if ( (error = TT_Get_MM_Var( face, NULL)) != 0 ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords != mmvar->num_axis ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + for ( i = 0; i < num_coords; ++i ) + if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + if ( blend->glyphoffsets == NULL ) + if ( (error = ft_var_load_gvar( face )) != 0 ) + goto Exit; + + if ( blend->normalizedcoords == NULL ) + { + if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) ) + goto Exit; + + manageCvt = mcvt_modify; + + /* If we have not set the blend coordinates before this, then the */ + /* cvt table will still be what we read from the `cvt ' table and */ + /* we don't need to reload it. We may need to change it though... */ + } + else + { + manageCvt = mcvt_retain; + for ( i = 0; i < num_coords; ++i ) + { + if ( blend->normalizedcoords[i] != coords[i] ) + { + manageCvt = mcvt_load; + break; + } + } + + /* If we don't change the blend coords then we don't need to do */ + /* anything to the cvt table. It will be correct. Otherwise we */ + /* no longer have the original cvt (it was modified when we set */ + /* the blend last time), so we must reload and then modify it. */ + } + + blend->num_axis = num_coords; + FT_MEM_COPY( blend->normalizedcoords, + coords, + num_coords * sizeof ( FT_Fixed ) ); + + face->doblend = TRUE; + + if ( face->cvt != NULL ) + { + switch ( manageCvt ) + { + case mcvt_load: + /* The cvt table has been loaded already; every time we change the */ + /* blend we may need to reload and remodify the cvt table. */ + FT_FREE( face->cvt ); + face->cvt = NULL; + + tt_face_load_cvt( face, face->root.stream ); + break; + + case mcvt_modify: + /* The original cvt table is in memory. All we need to do is */ + /* apply the `cvar' table (if any). */ + tt_face_vary_cvt( face, face->root.stream ); + break; + + case mcvt_retain: + /* The cvt table is correct for this set of coordinates. */ + break; + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Set_Var_Design */ + /* */ + /* <Description> */ + /* Set the coordinates for the instance, measured in the user */ + /* coordinate system. Parse the `avar' table (if present) to convert */ + /* from user to normalized coordinates. */ + /* */ + /* <InOut> */ + /* face :: The font face. */ + /* Initialize the blend struct with `gvar' data. */ + /* */ + /* <Input> */ + /* num_coords :: This must be the axis count of the font. */ + /* */ + /* coords :: A coordinate array with `num_coords' elements. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = TT_Err_Ok; + FT_Fixed* normalized = NULL; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i, j; + FT_Var_Axis* a; + GX_AVarSegment av; + FT_Memory memory = face->root.memory; + + + if ( face->blend == NULL ) + { + if ( (error = TT_Get_MM_Var( face, NULL )) != 0 ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords != mmvar->num_axis ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + /* Axis normalization is a two stage process. First we normalize */ + /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ + /* Then, if there's an `avar' table, we renormalize this range. */ + + if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) + goto Exit; + + a = mmvar->axis; + for ( i = 0; i < mmvar->num_axis; ++i, ++a ) + { + if ( coords[i] > a->maximum || coords[i] < a->minimum ) + { + error = TT_Err_Invalid_Argument; + goto Exit; + } + + if ( coords[i] < a->def ) + { + normalized[i] = -FT_MulDiv( coords[i] - a->def, + 0x10000L, + a->minimum - a->def ); + } + else if ( a->maximum == a->def ) + normalized[i] = 0; + else + { + normalized[i] = FT_MulDiv( coords[i] - a->def, + 0x10000L, + a->maximum - a->def ); + } + } + + if ( !blend->avar_checked ) + ft_var_load_avar( face ); + + if ( blend->avar_segment != NULL ) + { + av = blend->avar_segment; + for ( i = 0; i < mmvar->num_axis; ++i, ++av ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; ++j ) + if ( normalized[i] < av->correspondence[j].fromCoord ) + { + normalized[i] = + FT_MulDiv( + FT_MulDiv( + normalized[i] - av->correspondence[j - 1].fromCoord, + 0x10000L, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord ), + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord, + 0x10000L ) + + av->correspondence[j - 1].toCoord; + break; + } + } + } + + error = TT_Set_MM_Blend( face, num_coords, normalized ); + + Exit: + FT_FREE( normalized ); + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GX VAR PARSING ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_vary_cvt */ + /* */ + /* <Description> */ + /* Modify the loaded cvt table according to the `cvar' table and the */ + /* font's blend. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* Most errors are ignored. It is perfectly valid not to have a */ + /* `cvar' table even if there is a `gvar' and `fvar' table. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_start; + FT_ULong table_len; + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong here; + FT_UInt i, j; + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + GX_Blend blend = face->blend; + FT_UInt point_count; + FT_UShort* localpoints; + FT_Short* deltas; + + + FT_TRACE2(( "CVAR " )); + + if ( blend == NULL ) + { + FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + if ( face->cvt == NULL ) + { + FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + error = face->goto_table( face, TTAG_cvar, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + + error = TT_Err_Ok; + goto Exit; + } + + if ( FT_FRAME_ENTER( table_len ) ) + { + error = TT_Err_Ok; + goto Exit; + } + + table_start = FT_Stream_FTell( stream ); + if ( FT_GET_LONG() != 0x00010000L ) + { + FT_TRACE2(( "bad table version\n" )); + + error = TT_Err_Ok; + goto FExit; + } + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto FExit; + + tupleCount = FT_GET_USHORT(); + offsetToData = table_start + FT_GET_USHORT(); + + /* The documentation implies there are flags packed into the */ + /* tuplecount, but John Jenkins says that shared points don't apply */ + /* to `cvar', and no other flags are defined. */ + + for ( i = 0; i < ( tupleCount & 0xFFF ); ++i ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + /* There is no provision here for a global tuple coordinate section, */ + /* so John says. There are no tuple indices, just embedded tuples. */ + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; ++j ) + tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */ + /* short frac to fixed */ + } + else + { + /* skip this tuple; it makes no sense */ + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + for ( j = 0; j < 2 * blend->num_axis; ++j ) + (void)FT_GET_SHORT(); + + offsetToData += tupleDataSize; + continue; + } + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; ++j ) + im_start_coords[j] = FT_GET_SHORT() << 2; + for ( j = 0; j < blend->num_axis; ++j ) + im_end_coords[j] = FT_GET_SHORT() << 2; + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + if ( /* tuple isn't active for our blend */ + apply == 0 || + /* global points not allowed, */ + /* if they aren't local, makes no sense */ + !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) ) + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + localpoints = ft_var_readpackedpoints( stream, &point_count ); + deltas = ft_var_readpackeddeltas( stream, + point_count == 0 ? face->cvt_size + : point_count ); + if ( localpoints == NULL || deltas == NULL ) + /* failure, ignore it */; + + else if ( localpoints == ALL_POINTS ) + { + /* this means that there are deltas for every entry in cvt */ + for ( j = 0; j < face->cvt_size; ++j ) + face->cvt[j] = (FT_Short)( face->cvt[j] + + FT_MulFix( deltas[j], apply ) ); + } + + else + { + for ( j = 0; j < point_count; ++j ) + { + int pindex = localpoints[j]; + + face->cvt[pindex] = (FT_Short)( face->cvt[pindex] + + FT_MulFix( deltas[j], apply ) ); + } + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + FExit: + FT_FRAME_EXIT(); + + Exit: + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Vary_Get_Glyph_Deltas */ + /* */ + /* <Description> */ + /* Load the appropriate deltas for the current glyph. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* glyph_index :: The index of the glyph being modified. */ + /* */ + /* n_points :: The number of the points in the glyph, including */ + /* phantom points. */ + /* */ + /* <Output> */ + /* deltas :: The array of points to change. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Vary_Get_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Vector* *deltas, + FT_UInt n_points ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + FT_Vector* delta_xy; + + FT_Error error; + FT_ULong glyph_start; + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong here; + FT_UInt i, j; + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + FT_UInt point_count, spoint_count = 0; + FT_UShort* sharedpoints = NULL; + FT_UShort* localpoints = NULL; + FT_UShort* points; + FT_Short *deltas_x, *deltas_y; + + + if ( !face->doblend || blend == NULL ) + return TT_Err_Invalid_Argument; + + /* to be freed by the caller */ + if ( FT_NEW_ARRAY( delta_xy, n_points ) ) + goto Exit; + *deltas = delta_xy; + + if ( glyph_index >= blend->gv_glyphcnt || + blend->glyphoffsets[glyph_index] == + blend->glyphoffsets[glyph_index + 1] ) + return TT_Err_Ok; /* no variation data for this glyph */ + + if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) || + FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] - + blend->glyphoffsets[glyph_index] ) ) + goto Fail1; + + glyph_start = FT_Stream_FTell( stream ); + + /* each set of glyph variation data is formatted similarly to `cvar' */ + /* (except we get shared points and global tuples) */ + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto Fail2; + + tupleCount = FT_GET_USHORT(); + offsetToData = glyph_start + FT_GET_USHORT(); + + if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) + { + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + sharedpoints = ft_var_readpackedpoints( stream, &spoint_count ); + offsetToData = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, here ); + } + + for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; ++j ) + tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */ + /* short frac to fixed */ + } + else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) + { + error = TT_Err_Invalid_Table; + goto Fail3; + } + else + { + FT_MEM_COPY( + tuple_coords, + &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis], + blend->num_axis * sizeof ( FT_Fixed ) ); + } + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; ++j ) + im_start_coords[j] = FT_GET_SHORT() << 2; + for ( j = 0; j < blend->num_axis; ++j ) + im_end_coords[j] = FT_GET_SHORT() << 2; + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + + if ( apply == 0 ) /* tuple isn't active for our blend */ + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) + { + FT_Stream_SeekSet( stream, offsetToData ); + + localpoints = ft_var_readpackedpoints( stream, &point_count ); + points = localpoints; + } + else + { + points = sharedpoints; + point_count = spoint_count; + } + + deltas_x = ft_var_readpackeddeltas( stream, + point_count == 0 ? n_points + : point_count ); + deltas_y = ft_var_readpackeddeltas( stream, + point_count == 0 ? n_points + : point_count ); + + if ( points == NULL || deltas_y == NULL || deltas_x == NULL ) + ; /* failure, ignore it */ + + else if ( points == ALL_POINTS ) + { + /* this means that there are deltas for every point in the glyph */ + for ( j = 0; j < n_points; ++j ) + { + delta_xy[j].x += FT_MulFix( deltas_x[j], apply ); + delta_xy[j].y += FT_MulFix( deltas_y[j], apply ); + } + } + + else + { + for ( j = 0; j < point_count; ++j ) + { + delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply ); + delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply ); + } + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas_x ); + FT_FREE( deltas_y ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + Fail3: + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + Fail2: + FT_FRAME_EXIT(); + + Fail1: + if ( error ) + { + FT_FREE( delta_xy ); + *deltas = NULL; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_done_blend */ + /* */ + /* <Description> */ + /* Frees the blend internal data structure. */ + /* */ + FT_LOCAL_DEF( void ) + tt_done_blend( FT_Memory memory, + GX_Blend blend ) + { + if ( blend != NULL ) + { + FT_UInt i; + + + FT_FREE( blend->normalizedcoords ); + FT_FREE( blend->mmvar ); + + if ( blend->avar_segment != NULL ) + { + for ( i = 0; i < blend->num_axis; ++i ) + FT_FREE( blend->avar_segment[i].correspondence ); + FT_FREE( blend->avar_segment ); + } + + FT_FREE( blend->tuplecoords ); + FT_FREE( blend->glyphoffsets ); + FT_FREE( blend ); + } + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttgxvar.h b/alienblaster/project/jni/freetype/src/truetype/ttgxvar.h new file mode 100644 index 000000000..82dfc4431 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttgxvar.h @@ -0,0 +1,182 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.h */ +/* */ +/* TrueType GX Font Variation loader (specification) */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTGXVAR_H__ +#define __TTGXVAR_H__ + + +#include <ft2build.h> +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* GX_AVarCorrespondenceRec */ + /* */ + /* <Description> */ + /* A data structure representing `shortFracCorrespondence' in `avar' */ + /* table according to the specifications from Apple. */ + /* */ + typedef struct GX_AVarCorrespondenceRec_ + { + FT_Fixed fromCoord; + FT_Fixed toCoord; + + } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* GX_AVarRec */ + /* */ + /* <Description> */ + /* Data from the segment field of `avar' table. */ + /* There is one of these for each axis. */ + /* */ + typedef struct GX_AVarSegmentRec_ + { + FT_UShort pairCount; + GX_AVarCorrespondence correspondence; /* array with pairCount entries */ + + } GX_AVarSegmentRec, *GX_AVarSegment; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* GX_BlendRec */ + /* */ + /* <Description> */ + /* Data for interpolating a font from a distortable font specified */ + /* by the GX *var tables ([fgca]var). */ + /* */ + /* <Fields> */ + /* num_axis :: The number of axes along which interpolation */ + /* may happen */ + /* */ + /* normalizedcoords :: A normalized value (between [-1,1]) indicating */ + /* the contribution along each axis to the final */ + /* interpolated font. */ + /* */ + typedef struct GX_BlendRec_ + { + FT_UInt num_axis; + FT_Fixed* normalizedcoords; + + FT_MM_Var* mmvar; + FT_Offset mmvar_len; + + FT_Bool avar_checked; + GX_AVarSegment avar_segment; + + FT_UInt tuplecount; /* shared tuples in `gvar' */ + FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ + + FT_UInt gv_glyphcnt; + FT_ULong* glyphoffsets; + + } GX_BlendRec; + + + /*************************************************************************/ + /* */ + /* <enum> */ + /* GX_TupleCountFlags */ + /* */ + /* <Description> */ + /* Flags used within the `TupleCount' field of the `gvar' table. */ + /* */ + typedef enum GX_TupleCountFlags_ + { + GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000, + GX_TC_RESERVED_TUPLE_FLAGS = 0x7000, + GX_TC_TUPLE_COUNT_MASK = 0x0FFF + + } GX_TupleCountFlags; + + + /*************************************************************************/ + /* */ + /* <enum> */ + /* GX_TupleIndexFlags */ + /* */ + /* <Description> */ + /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */ + /* tables. */ + /* */ + typedef enum GX_TupleIndexFlags_ + { + GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, + GX_TI_INTERMEDIATE_TUPLE = 0x4000, + GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, + GX_TI_RESERVED_TUPLE_FLAG = 0x1000, + GX_TI_TUPLE_INDEX_MASK = 0x0FFF + + } GX_TupleIndexFlags; + + +#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) +#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) +#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) +#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) + + + FT_LOCAL( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ); + + + FT_LOCAL( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + TT_Vary_Get_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Vector* *deltas, + FT_UInt n_points ); + + + FT_LOCAL( void ) + tt_done_blend( FT_Memory memory, + GX_Blend blend ); + + +FT_END_HEADER + + +#endif /* __TTGXVAR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttinterp.c b/alienblaster/project/jni/freetype/src/truetype/ttinterp.c new file mode 100644 index 000000000..13aa9a27c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttinterp.c @@ -0,0 +1,7844 @@ +/***************************************************************************/ +/* */ +/* ttinterp.c */ +/* */ +/* TrueType bytecode interpreter (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_TRIGONOMETRY_H +#include FT_SYSTEM_H + +#include "ttinterp.h" + +#include "tterrors.h" + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + +#define TT_MULFIX FT_MulFix +#define TT_MULDIV FT_MulDiv +#define TT_MULDIV_NO_ROUND FT_MulDiv_No_Round + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttinterp + + /*************************************************************************/ + /* */ + /* In order to detect infinite loops in the code, we set up a counter */ + /* within the run loop. A single stroke of interpretation is now */ + /* limited to a maximal number of opcodes defined below. */ + /* */ +#define MAX_RUNNABLE_OPCODES 1000000L + + + /*************************************************************************/ + /* */ + /* There are two kinds of implementations: */ + /* */ + /* a. static implementation */ + /* */ + /* The current execution context is a static variable, which fields */ + /* are accessed directly by the interpreter during execution. The */ + /* context is named `cur'. */ + /* */ + /* This version is non-reentrant, of course. */ + /* */ + /* b. indirect implementation */ + /* */ + /* The current execution context is passed to _each_ function as its */ + /* first argument, and each field is thus accessed indirectly. */ + /* */ + /* This version is fully re-entrant. */ + /* */ + /* The idea is that an indirect implementation may be slower to execute */ + /* on low-end processors that are used in some systems (like 386s or */ + /* even 486s). */ + /* */ + /* As a consequence, the indirect implementation is now the default, as */ + /* its performance costs can be considered negligible in our context. */ + /* Note, however, that we kept the same source with macros because: */ + /* */ + /* - The code is kept very close in design to the Pascal code used for */ + /* development. */ + /* */ + /* - It's much more readable that way! */ + /* */ + /* - It's still open to experimentation and tuning. */ + /* */ + /*************************************************************************/ + + +#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ + +#define CUR (*exc) /* see ttobjs.h */ + + /*************************************************************************/ + /* */ + /* This macro is used whenever `exec' is unused in a function, to avoid */ + /* stupid warnings from pedantic compilers. */ + /* */ +#define FT_UNUSED_EXEC FT_UNUSED( exc ) + +#else /* static implementation */ + +#define CUR cur + +#define FT_UNUSED_EXEC int __dummy = __dummy + + static + TT_ExecContextRec cur; /* static exec. context variable */ + + /* apparently, we have a _lot_ of direct indexing when accessing */ + /* the static `cur', which makes the code bigger (due to all the */ + /* four bytes addresses). */ + +#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* The instruction argument stack. */ + /* */ +#define INS_ARG EXEC_OP_ FT_Long* args /* see ttobjs.h for EXEC_OP_ */ + + + /*************************************************************************/ + /* */ + /* This macro is used whenever `args' is unused in a function, to avoid */ + /* stupid warnings from pedantic compilers. */ + /* */ +#define FT_UNUSED_ARG FT_UNUSED_EXEC; FT_UNUSED( args ) + + + /*************************************************************************/ + /* */ + /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to */ + /* increase readability of the code. */ + /* */ + /*************************************************************************/ + + +#define SKIP_Code() \ + SkipCode( EXEC_ARG ) + +#define GET_ShortIns() \ + GetShortIns( EXEC_ARG ) + +#define NORMalize( x, y, v ) \ + Normalize( EXEC_ARG_ x, y, v ) + +#define SET_SuperRound( scale, flags ) \ + SetSuperRound( EXEC_ARG_ scale, flags ) + +#define ROUND_None( d, c ) \ + Round_None( EXEC_ARG_ d, c ) + +#define INS_Goto_CodeRange( range, ip ) \ + Ins_Goto_CodeRange( EXEC_ARG_ range, ip ) + +#define CUR_Func_move( z, p, d ) \ + CUR.func_move( EXEC_ARG_ z, p, d ) + +#define CUR_Func_move_orig( z, p, d ) \ + CUR.func_move_orig( EXEC_ARG_ z, p, d ) + +#define CUR_Func_round( d, c ) \ + CUR.func_round( EXEC_ARG_ d, c ) + +#define CUR_Func_read_cvt( index ) \ + CUR.func_read_cvt( EXEC_ARG_ index ) + +#define CUR_Func_write_cvt( index, val ) \ + CUR.func_write_cvt( EXEC_ARG_ index, val ) + +#define CUR_Func_move_cvt( index, val ) \ + CUR.func_move_cvt( EXEC_ARG_ index, val ) + +#define CURRENT_Ratio() \ + Current_Ratio( EXEC_ARG ) + +#define CURRENT_Ppem() \ + Current_Ppem( EXEC_ARG ) + +#define CUR_Ppem() \ + Cur_PPEM( EXEC_ARG ) + +#define INS_SxVTL( a, b, c, d ) \ + Ins_SxVTL( EXEC_ARG_ a, b, c, d ) + +#define COMPUTE_Funcs() \ + Compute_Funcs( EXEC_ARG ) + +#define COMPUTE_Round( a ) \ + Compute_Round( EXEC_ARG_ a ) + +#define COMPUTE_Point_Displacement( a, b, c, d ) \ + Compute_Point_Displacement( EXEC_ARG_ a, b, c, d ) + +#define MOVE_Zp2_Point( a, b, c, t ) \ + Move_Zp2_Point( EXEC_ARG_ a, b, c, t ) + + +#define CUR_Func_project( v1, v2 ) \ + CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) + +#define CUR_Func_dualproj( v1, v2 ) \ + CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y ) + +#define CUR_fast_project( v ) \ + CUR.func_project( EXEC_ARG_ (v)->x, (v)->y ) + +#define CUR_fast_dualproj( v ) \ + CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y ) + + + /*************************************************************************/ + /* */ + /* Instruction dispatch function, as used by the interpreter. */ + /* */ + typedef void (*TInstruction_Function)( INS_ARG ); + + + /*************************************************************************/ + /* */ + /* A simple bounds-checking macro. */ + /* */ +#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) + +#undef SUCCESS +#define SUCCESS 0 + +#undef FAILURE +#define FAILURE 1 + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define GUESS_VECTOR( V ) \ + if ( CUR.face->unpatented_hinting ) \ + { \ + CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \ + CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \ + } +#else +#define GUESS_VECTOR( V ) +#endif + + /*************************************************************************/ + /* */ + /* CODERANGE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Goto_CodeRange */ + /* */ + /* <Description> */ + /* Switches to a new code range (updates the code related elements in */ + /* `exec', and `IP'). */ + /* */ + /* <Input> */ + /* range :: The new execution code range. */ + /* */ + /* IP :: The new IP in the new code range. */ + /* */ + /* <InOut> */ + /* exec :: The target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ) + { + TT_CodeRange* coderange; + + + FT_ASSERT( range >= 1 && range <= 3 ); + + coderange = &exec->codeRangeTable[range - 1]; + + FT_ASSERT( coderange->base != NULL ); + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for IP <= Size instead of IP < Size. */ + /* */ + FT_ASSERT( (FT_ULong)IP <= coderange->size ); + + exec->code = coderange->base; + exec->codeSize = coderange->size; + exec->IP = IP; + exec->curRange = range; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Set_CodeRange */ + /* */ + /* <Description> */ + /* Sets a code range. */ + /* */ + /* <Input> */ + /* range :: The code range index. */ + /* */ + /* base :: The new code base. */ + /* */ + /* length :: The range size in bytes. */ + /* */ + /* <InOut> */ + /* exec :: The target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = (FT_Byte*)base; + exec->codeRangeTable[range - 1].size = length; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Clear_CodeRange */ + /* */ + /* <Description> */ + /* Clears a code range. */ + /* */ + /* <Input> */ + /* range :: The code range index. */ + /* */ + /* <InOut> */ + /* exec :: The target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Does not set the Error variable. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = NULL; + exec->codeRangeTable[range - 1].size = 0; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* EXECUTION CONTEXT ROUTINES */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Done_Context */ + /* */ + /* <Description> */ + /* Destroys a given context. */ + /* */ + /* <Input> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Done_Context( TT_ExecContext exec ) + { + FT_Memory memory = exec->memory; + + + /* points zone */ + exec->maxPoints = 0; + exec->maxContours = 0; + + /* free stack */ + FT_FREE( exec->stack ); + exec->stackSize = 0; + + /* free call stack */ + FT_FREE( exec->callStack ); + exec->callSize = 0; + exec->callTop = 0; + + /* free glyph code range */ + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + + exec->size = NULL; + exec->face = NULL; + + FT_FREE( exec ); + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Init_Context */ + /* */ + /* <Description> */ + /* Initializes a context object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* <InOut> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Init_Context( TT_ExecContext exec, + FT_Memory memory ) + { + FT_Error error; + + + FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec )); + + exec->memory = memory; + exec->callSize = 32; + + if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) ) + goto Fail_Memory; + + /* all values in the context are set to 0 already, but this is */ + /* here as a remainder */ + exec->maxPoints = 0; + exec->maxContours = 0; + + exec->stackSize = 0; + exec->glyphSize = 0; + + exec->stack = NULL; + exec->glyphIns = NULL; + + exec->face = NULL; + exec->size = NULL; + + return TT_Err_Ok; + + Fail_Memory: + FT_ERROR(( "Init_Context: not enough memory for 0x%08lx\n", + (FT_Long)exec )); + TT_Done_Context( exec ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Update_Max */ + /* */ + /* <Description> */ + /* Checks the size of a buffer and reallocates it if necessary. */ + /* */ + /* <Input> */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* multiplier :: The size in bytes of each element in the buffer. */ + /* */ + /* new_max :: The new capacity (size) of the buffer. */ + /* */ + /* <InOut> */ + /* size :: The address of the buffer's current size expressed */ + /* in elements. */ + /* */ + /* buff :: The address of the buffer base pointer. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Update_Max( FT_Memory memory, + FT_ULong* size, + FT_Long multiplier, + void* _pbuff, + FT_ULong new_max ) + { + FT_Error error; + void** pbuff = (void**)_pbuff; + + + if ( *size < new_max ) + { + if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) ) + return error; + *size = new_max; + } + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Load_Context */ + /* */ + /* <Description> */ + /* Prepare an execution context for glyph hinting. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* size :: A handle to the source size object. */ + /* */ + /* <InOut> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ) + { + FT_Int i; + FT_ULong tmp; + TT_MaxProfile* maxp; + FT_Error error; + + + exec->face = face; + maxp = &face->max_profile; + exec->size = size; + + if ( size ) + { + exec->numFDefs = size->num_function_defs; + exec->maxFDefs = size->max_function_defs; + exec->numIDefs = size->num_instruction_defs; + exec->maxIDefs = size->max_instruction_defs; + exec->FDefs = size->function_defs; + exec->IDefs = size->instruction_defs; + exec->tt_metrics = size->ttmetrics; + exec->metrics = size->metrics; + + exec->maxFunc = size->max_func; + exec->maxIns = size->max_ins; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + exec->codeRangeTable[i] = size->codeRangeTable[i]; + + /* set graphics state */ + exec->GS = size->GS; + + exec->cvtSize = size->cvt_size; + exec->cvt = size->cvt; + + exec->storeSize = size->storage_size; + exec->storage = size->storage; + + exec->twilight = size->twilight; + } + + /* XXX: We reserve a little more elements on the stack to deal safely */ + /* with broken fonts like arialbs, courbs, timesbs, etc. */ + tmp = exec->stackSize; + error = Update_Max( exec->memory, + &tmp, + sizeof ( FT_F26Dot6 ), + (void*)&exec->stack, + maxp->maxStackElements + 32 ); + exec->stackSize = (FT_UInt)tmp; + if ( error ) + return error; + + tmp = exec->glyphSize; + error = Update_Max( exec->memory, + &tmp, + sizeof ( FT_Byte ), + (void*)&exec->glyphIns, + maxp->maxSizeOfInstructions ); + exec->glyphSize = (FT_UShort)tmp; + if ( error ) + return error; + + exec->pts.n_points = 0; + exec->pts.n_contours = 0; + + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + exec->zp0 = exec->pts; + + exec->instruction_trap = FALSE; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Save_Context */ + /* */ + /* <Description> */ + /* Saves the code ranges in a `size' object. */ + /* */ + /* <Input> */ + /* exec :: A handle to the source execution context. */ + /* */ + /* <InOut> */ + /* size :: A handle to the target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Save_Context( TT_ExecContext exec, + TT_Size size ) + { + FT_Int i; + + + /* XXXX: Will probably disappear soon with all the code range */ + /* management, which is now rather obsolete. */ + /* */ + size->num_function_defs = exec->numFDefs; + size->num_instruction_defs = exec->numIDefs; + + size->max_func = exec->maxFunc; + size->max_ins = exec->maxIns; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + size->codeRangeTable[i] = exec->codeRangeTable[i]; + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_Run_Context */ + /* */ + /* <Description> */ + /* Executes one or more instructions in the execution context. */ + /* */ + /* <Input> */ + /* debug :: A Boolean flag. If set, the function sets some internal */ + /* variables and returns immediately, otherwise TT_RunIns() */ + /* is called. */ + /* */ + /* This is commented out currently. */ + /* */ + /* <Input> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* <Return> */ + /* TrueType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Run_Context( TT_ExecContext exec, + FT_Bool debug ) + { + FT_Error error; + + + if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) ) + != TT_Err_Ok ) + return error; + + exec->zp0 = exec->pts; + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + + exec->GS.gep0 = 1; + exec->GS.gep1 = 1; + exec->GS.gep2 = 1; + + exec->GS.projVector.x = 0x4000; + exec->GS.projVector.y = 0x0000; + + exec->GS.freeVector = exec->GS.projVector; + exec->GS.dualVector = exec->GS.projVector; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + exec->GS.both_x_axis = TRUE; +#endif + + exec->GS.round_state = 1; + exec->GS.loop = 1; + + /* some glyphs leave something on the stack. so we clean it */ + /* before a new execution. */ + exec->top = 0; + exec->callTop = 0; + +#if 1 + FT_UNUSED( debug ); + + return exec->face->interpreter( exec ); +#else + if ( !debug ) + return TT_RunIns( exec ); + else + return TT_Err_Ok; +#endif + } + + + /* The default value for `scan_control' is documented as FALSE in the */ + /* TrueType specification. This is confusing since it implies a */ + /* Boolean value. However, this is not the case, thus both the */ + /* default values of our `scan_type' and `scan_control' fields (which */ + /* the documentation's `scan_control' variable is split into) are */ + /* zero. */ + + const TT_GraphicsState tt_default_graphics_state = + { + 0, 0, 0, + { 0x4000, 0 }, + { 0x4000, 0 }, + { 0x4000, 0 }, + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + TRUE, +#endif + + 1, 64, 1, + TRUE, 68, 0, 0, 9, 3, + 0, FALSE, 0, 1, 1, 1 + }; + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( TT_ExecContext ) + TT_New_Context( TT_Driver driver ) + { + TT_ExecContext exec; + FT_Memory memory; + + + memory = driver->root.root.memory; + exec = driver->context; + + if ( !driver->context ) + { + FT_Error error; + + + /* allocate object */ + if ( FT_NEW( exec ) ) + goto Fail; + + /* initialize it; in case of error this deallocates `exec' too */ + error = Init_Context( exec, memory ); + if ( error ) + goto Fail; + + /* store it into the driver */ + driver->context = exec; + } + + return driver->context; + + Fail: + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Before an opcode is executed, the interpreter verifies that there are */ + /* enough arguments on the stack, with the help of the `Pop_Push_Count' */ + /* table. */ + /* */ + /* For each opcode, the first column gives the number of arguments that */ + /* are popped from the stack; the second one gives the number of those */ + /* that are pushed in result. */ + /* */ + /* Opcodes which have a varying number of parameters in the data stream */ + /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */ + /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */ + /* to zero. */ + /* */ + /*************************************************************************/ + + +#undef PACK +#define PACK( x, y ) ( ( x << 4 ) | y ) + + + static + const FT_Byte Pop_Push_Count[256] = + { + /* opcodes are gathered in groups of 16 */ + /* please keep the spaces as they are */ + + /* SVTCA y */ PACK( 0, 0 ), + /* SVTCA x */ PACK( 0, 0 ), + /* SPvTCA y */ PACK( 0, 0 ), + /* SPvTCA x */ PACK( 0, 0 ), + /* SFvTCA y */ PACK( 0, 0 ), + /* SFvTCA x */ PACK( 0, 0 ), + /* SPvTL // */ PACK( 2, 0 ), + /* SPvTL + */ PACK( 2, 0 ), + /* SFvTL // */ PACK( 2, 0 ), + /* SFvTL + */ PACK( 2, 0 ), + /* SPvFS */ PACK( 2, 0 ), + /* SFvFS */ PACK( 2, 0 ), + /* GPV */ PACK( 0, 2 ), + /* GFV */ PACK( 0, 2 ), + /* SFvTPv */ PACK( 0, 0 ), + /* ISECT */ PACK( 5, 0 ), + + /* SRP0 */ PACK( 1, 0 ), + /* SRP1 */ PACK( 1, 0 ), + /* SRP2 */ PACK( 1, 0 ), + /* SZP0 */ PACK( 1, 0 ), + /* SZP1 */ PACK( 1, 0 ), + /* SZP2 */ PACK( 1, 0 ), + /* SZPS */ PACK( 1, 0 ), + /* SLOOP */ PACK( 1, 0 ), + /* RTG */ PACK( 0, 0 ), + /* RTHG */ PACK( 0, 0 ), + /* SMD */ PACK( 1, 0 ), + /* ELSE */ PACK( 0, 0 ), + /* JMPR */ PACK( 1, 0 ), + /* SCvTCi */ PACK( 1, 0 ), + /* SSwCi */ PACK( 1, 0 ), + /* SSW */ PACK( 1, 0 ), + + /* DUP */ PACK( 1, 2 ), + /* POP */ PACK( 1, 0 ), + /* CLEAR */ PACK( 0, 0 ), + /* SWAP */ PACK( 2, 2 ), + /* DEPTH */ PACK( 0, 1 ), + /* CINDEX */ PACK( 1, 1 ), + /* MINDEX */ PACK( 1, 0 ), + /* AlignPTS */ PACK( 2, 0 ), + /* INS_$28 */ PACK( 0, 0 ), + /* UTP */ PACK( 1, 0 ), + /* LOOPCALL */ PACK( 2, 0 ), + /* CALL */ PACK( 1, 0 ), + /* FDEF */ PACK( 1, 0 ), + /* ENDF */ PACK( 0, 0 ), + /* MDAP[0] */ PACK( 1, 0 ), + /* MDAP[1] */ PACK( 1, 0 ), + + /* IUP[0] */ PACK( 0, 0 ), + /* IUP[1] */ PACK( 0, 0 ), + /* SHP[0] */ PACK( 0, 0 ), + /* SHP[1] */ PACK( 0, 0 ), + /* SHC[0] */ PACK( 1, 0 ), + /* SHC[1] */ PACK( 1, 0 ), + /* SHZ[0] */ PACK( 1, 0 ), + /* SHZ[1] */ PACK( 1, 0 ), + /* SHPIX */ PACK( 1, 0 ), + /* IP */ PACK( 0, 0 ), + /* MSIRP[0] */ PACK( 2, 0 ), + /* MSIRP[1] */ PACK( 2, 0 ), + /* AlignRP */ PACK( 0, 0 ), + /* RTDG */ PACK( 0, 0 ), + /* MIAP[0] */ PACK( 2, 0 ), + /* MIAP[1] */ PACK( 2, 0 ), + + /* NPushB */ PACK( 0, 0 ), + /* NPushW */ PACK( 0, 0 ), + /* WS */ PACK( 2, 0 ), + /* RS */ PACK( 1, 1 ), + /* WCvtP */ PACK( 2, 0 ), + /* RCvt */ PACK( 1, 1 ), + /* GC[0] */ PACK( 1, 1 ), + /* GC[1] */ PACK( 1, 1 ), + /* SCFS */ PACK( 2, 0 ), + /* MD[0] */ PACK( 2, 1 ), + /* MD[1] */ PACK( 2, 1 ), + /* MPPEM */ PACK( 0, 1 ), + /* MPS */ PACK( 0, 1 ), + /* FlipON */ PACK( 0, 0 ), + /* FlipOFF */ PACK( 0, 0 ), + /* DEBUG */ PACK( 1, 0 ), + + /* LT */ PACK( 2, 1 ), + /* LTEQ */ PACK( 2, 1 ), + /* GT */ PACK( 2, 1 ), + /* GTEQ */ PACK( 2, 1 ), + /* EQ */ PACK( 2, 1 ), + /* NEQ */ PACK( 2, 1 ), + /* ODD */ PACK( 1, 1 ), + /* EVEN */ PACK( 1, 1 ), + /* IF */ PACK( 1, 0 ), + /* EIF */ PACK( 0, 0 ), + /* AND */ PACK( 2, 1 ), + /* OR */ PACK( 2, 1 ), + /* NOT */ PACK( 1, 1 ), + /* DeltaP1 */ PACK( 1, 0 ), + /* SDB */ PACK( 1, 0 ), + /* SDS */ PACK( 1, 0 ), + + /* ADD */ PACK( 2, 1 ), + /* SUB */ PACK( 2, 1 ), + /* DIV */ PACK( 2, 1 ), + /* MUL */ PACK( 2, 1 ), + /* ABS */ PACK( 1, 1 ), + /* NEG */ PACK( 1, 1 ), + /* FLOOR */ PACK( 1, 1 ), + /* CEILING */ PACK( 1, 1 ), + /* ROUND[0] */ PACK( 1, 1 ), + /* ROUND[1] */ PACK( 1, 1 ), + /* ROUND[2] */ PACK( 1, 1 ), + /* ROUND[3] */ PACK( 1, 1 ), + /* NROUND[0] */ PACK( 1, 1 ), + /* NROUND[1] */ PACK( 1, 1 ), + /* NROUND[2] */ PACK( 1, 1 ), + /* NROUND[3] */ PACK( 1, 1 ), + + /* WCvtF */ PACK( 2, 0 ), + /* DeltaP2 */ PACK( 1, 0 ), + /* DeltaP3 */ PACK( 1, 0 ), + /* DeltaCn[0] */ PACK( 1, 0 ), + /* DeltaCn[1] */ PACK( 1, 0 ), + /* DeltaCn[2] */ PACK( 1, 0 ), + /* SROUND */ PACK( 1, 0 ), + /* S45Round */ PACK( 1, 0 ), + /* JROT */ PACK( 2, 0 ), + /* JROF */ PACK( 2, 0 ), + /* ROFF */ PACK( 0, 0 ), + /* INS_$7B */ PACK( 0, 0 ), + /* RUTG */ PACK( 0, 0 ), + /* RDTG */ PACK( 0, 0 ), + /* SANGW */ PACK( 1, 0 ), + /* AA */ PACK( 1, 0 ), + + /* FlipPT */ PACK( 0, 0 ), + /* FlipRgON */ PACK( 2, 0 ), + /* FlipRgOFF */ PACK( 2, 0 ), + /* INS_$83 */ PACK( 0, 0 ), + /* INS_$84 */ PACK( 0, 0 ), + /* ScanCTRL */ PACK( 1, 0 ), + /* 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 FT_Char opcode_length[256] = + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }; + +#undef PACK + +#if 1 + + static FT_Int32 + TT_MulFix14( FT_Int32 a, + FT_Int b ) + { + FT_Int32 sign; + FT_UInt32 ah, al, mid, lo, hi; + + + sign = a ^ b; + + if ( a < 0 ) + a = -a; + if ( b < 0 ) + b = -b; + + ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU ); + al = (FT_UInt32)( a & 0xFFFFU ); + + lo = al * b; + mid = ah * b; + hi = mid >> 16; + mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */ + lo += mid; + if ( lo < mid ) + hi += 1; + + mid = ( lo >> 14 ) | ( hi << 18 ); + + return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid; + } + +#else + + /* compute (a*b)/2^14 with maximal accuracy and rounding */ + static FT_Int32 + TT_MulFix14( FT_Int32 a, + FT_Int b ) + { + FT_Int32 m, s, hi; + FT_UInt32 l, lo; + + + /* compute ax*bx as 64-bit value */ + l = (FT_UInt32)( ( a & 0xFFFFU ) * b ); + m = ( a >> 16 ) * b; + + lo = l + (FT_UInt32)( m << 16 ); + hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l ); + + /* divide the result by 2^14 with rounding */ + s = hi >> 31; + l = lo + (FT_UInt32)s; + hi += s + ( l < lo ); + lo = l; + + l = lo + 0x2000U; + hi += l < lo; + + return ( hi << 18 ) | ( l >> 14 ); + } +#endif + + + /* compute (ax*bx+ay*by)/2^14 with maximal accuracy and rounding */ + static FT_Int32 + TT_DotFix14( FT_Int32 ax, + FT_Int32 ay, + FT_Int bx, + FT_Int by ) + { + FT_Int32 m, s, hi1, hi2, hi; + FT_UInt32 l, lo1, lo2, lo; + + + /* compute ax*bx as 64-bit value */ + l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx ); + m = ( ax >> 16 ) * bx; + + lo1 = l + (FT_UInt32)( m << 16 ); + hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l ); + + /* compute ay*by as 64-bit value */ + l = (FT_UInt32)( ( ay & 0xFFFFU ) * by ); + m = ( ay >> 16 ) * by; + + lo2 = l + (FT_UInt32)( m << 16 ); + hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l ); + + /* add them */ + lo = lo1 + lo2; + hi = hi1 + hi2 + ( lo < lo1 ); + + /* divide the result by 2^14 with rounding */ + s = hi >> 31; + l = lo + (FT_UInt32)s; + hi += s + ( l < lo ); + lo = l; + + l = lo + 0x2000U; + hi += ( l < lo ); + + return ( hi << 18 ) | ( l >> 14 ); + } + + + /* return length of given vector */ + +#if 0 + + static FT_Int32 + TT_VecLen( FT_Int32 x, + FT_Int32 y ) + { + FT_Int32 m, hi1, hi2, hi; + FT_UInt32 l, lo1, lo2, lo; + + + /* compute x*x as 64-bit value */ + lo = (FT_UInt32)( x & 0xFFFFU ); + hi = x >> 16; + + l = lo * lo; + m = hi * lo; + hi = hi * hi; + + lo1 = l + (FT_UInt32)( m << 17 ); + hi1 = hi + ( m >> 15 ) + ( lo1 < l ); + + /* compute y*y as 64-bit value */ + lo = (FT_UInt32)( y & 0xFFFFU ); + hi = y >> 16; + + l = lo * lo; + m = hi * lo; + hi = hi * hi; + + lo2 = l + (FT_UInt32)( m << 17 ); + hi2 = hi + ( m >> 15 ) + ( lo2 < l ); + + /* add them to get 'x*x+y*y' as 64-bit value */ + lo = lo1 + lo2; + hi = hi1 + hi2 + ( lo < lo1 ); + + /* compute the square root of this value */ + { + FT_UInt32 root, rem, test_div; + FT_Int count; + + + root = 0; + + { + rem = 0; + count = 32; + do + { + rem = ( rem << 2 ) | ( (FT_UInt32)hi >> 30 ); + hi = ( hi << 2 ) | ( lo >> 30 ); + lo <<= 2; + root <<= 1; + test_div = ( root << 1 ) + 1; + + if ( rem >= test_div ) + { + rem -= test_div; + root += 1; + } + } while ( --count ); + } + + return (FT_Int32)root; + } + } + +#else + + /* this version uses FT_Vector_Length which computes the same value */ + /* much, much faster.. */ + /* */ + static FT_F26Dot6 + TT_VecLen( FT_F26Dot6 X, + FT_F26Dot6 Y ) + { + FT_Vector v; + + + v.x = X; + v.y = Y; + + return FT_Vector_Length( &v ); + } + +#endif + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Current_Ratio */ + /* */ + /* <Description> */ + /* Returns the current aspect ratio scaling factor depending on the */ + /* projection vector's state and device resolutions. */ + /* */ + /* <Return> */ + /* The aspect ratio in 16.16 format, always <= 1.0 . */ + /* */ + static FT_Long + Current_Ratio( EXEC_OP ) + { + if ( !CUR.tt_metrics.ratio ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; + else + CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; + } + else +#endif + { + if ( CUR.GS.projVector.y == 0 ) + CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio; + + else if ( CUR.GS.projVector.x == 0 ) + CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio; + + else + { + FT_Long x, y; + + + x = TT_MULDIV( CUR.GS.projVector.x, + CUR.tt_metrics.x_ratio, 0x4000 ); + y = TT_MULDIV( CUR.GS.projVector.y, + CUR.tt_metrics.y_ratio, 0x4000 ); + CUR.tt_metrics.ratio = TT_VecLen( x, y ); + } + } + } + return CUR.tt_metrics.ratio; + } + + + static FT_Long + Current_Ppem( EXEC_OP ) + { + return TT_MULFIX( CUR.tt_metrics.ppem, CURRENT_Ratio() ); + } + + + /*************************************************************************/ + /* */ + /* Functions related to the control value table (CVT). */ + /* */ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT( EXEC_OP_ FT_ULong idx ) + { + return CUR.cvt[idx]; + } + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT_Stretched( EXEC_OP_ FT_ULong idx ) + { + return TT_MULFIX( CUR.cvt[idx], CURRENT_Ratio() ); + } + + + FT_CALLBACK_DEF( void ) + Write_CVT( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] = value; + } + + + FT_CALLBACK_DEF( void ) + Write_CVT_Stretched( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() ); + } + + + FT_CALLBACK_DEF( void ) + Move_CVT( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] += value; + } + + + FT_CALLBACK_DEF( void ) + Move_CVT_Stretched( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ) + { + CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* GetShortIns */ + /* */ + /* <Description> */ + /* Returns a short integer taken from the instruction stream at */ + /* address IP. */ + /* */ + /* <Return> */ + /* Short read at code[IP]. */ + /* */ + /* <Note> */ + /* This one could become a macro. */ + /* */ + static FT_Short + GetShortIns( EXEC_OP ) + { + /* Reading a byte stream so there is no endianess (DaveP) */ + CUR.IP += 2; + return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) + + CUR.code[CUR.IP - 1] ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Ins_Goto_CodeRange */ + /* */ + /* <Description> */ + /* Goes to a certain code range in the instruction stream. */ + /* */ + /* <Input> */ + /* aRange :: The index of the code range. */ + /* */ + /* aIP :: The new IP address in the code range. */ + /* */ + /* <Return> */ + /* SUCCESS or FAILURE. */ + /* */ + static FT_Bool + Ins_Goto_CodeRange( EXEC_OP_ FT_Int aRange, + FT_ULong aIP ) + { + TT_CodeRange* range; + + + if ( aRange < 1 || aRange > 3 ) + { + CUR.error = TT_Err_Bad_Argument; + return FAILURE; + } + + range = &CUR.codeRangeTable[aRange - 1]; + + if ( range->base == NULL ) /* invalid coderange */ + { + CUR.error = TT_Err_Invalid_CodeRange; + return FAILURE; + } + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for AIP <= Size, instead of AIP < Size. */ + + if ( aIP > range->size ) + { + CUR.error = TT_Err_Code_Overflow; + return FAILURE; + } + + CUR.code = range->base; + CUR.codeSize = range->size; + CUR.IP = aIP; + CUR.curRange = aRange; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Direct_Move */ + /* */ + /* <Description> */ + /* Moves a point by a given distance along the freedom vector. The */ + /* point will be `touched'. */ + /* */ + /* <Input> */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* <InOut> */ + /* zone :: The affected glyph zone. */ + /* */ + static void + Direct_Move( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + v = CUR.GS.freeVector.x; + + if ( v != 0 ) + { + zone->cur[point].x += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + v = CUR.GS.freeVector.y; + + if ( v != 0 ) + { + zone->cur[point].y += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Direct_Move_Orig */ + /* */ + /* <Description> */ + /* Moves the *original* position of a point by a given distance along */ + /* the freedom vector. Obviously, the point will not be `touched'. */ + /* */ + /* <Input> */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* <InOut> */ + /* zone :: The affected glyph zone. */ + /* */ + static void + Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + v = CUR.GS.freeVector.x; + + if ( v != 0 ) + zone->org[point].x += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + + v = CUR.GS.freeVector.y; + + if ( v != 0 ) + zone->org[point].y += TT_MULDIV( distance, + v * 0x10000L, + CUR.F_dot_P ); + } + + + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_X( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->cur[point].x += distance; + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + + static void + Direct_Move_Y( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->cur[point].y += distance; + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + + + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move_Orig() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->org[point].x += distance; + } + + + static void + Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED_EXEC; + + zone->org[point].y += distance; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_None */ + /* */ + /* <Description> */ + /* Does not round, but adds engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance (not) to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* The compensated distance. */ + /* */ + /* <Note> */ + /* The TrueType specification says very few about the relationship */ + /* between rounding and engine compensation. However, it seems from */ + /* the description of super round that we should add the compensation */ + /* before rounding. */ + /* */ + static FT_F26Dot6 + Round_None( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation; + if ( distance && val < 0 ) + val = 0; + } + else { + val = distance - compensation; + if ( val > 0 ) + val = 0; + } + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_To_Grid */ + /* */ + /* <Description> */ + /* Rounds value to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 32; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = -FT_PIX_ROUND( compensation - distance ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_To_Half_Grid */ + /* */ + /* <Description> */ + /* Rounds value to half grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = FT_PIX_FLOOR( distance + compensation ) + 32; + if ( distance && val < 0 ) + val = 0; + } + else + { + val = -( FT_PIX_FLOOR( compensation - distance ) + 32 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_Down_To_Grid */ + /* */ + /* <Description> */ + /* Rounds value down to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = -( ( compensation - distance ) & -64 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_Up_To_Grid */ + /* */ + /* <Description> */ + /* Rounds value up to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 63; + if ( distance && val > 0 ) + val &= ~63; + else + val = 0; + } + else + { + val = - FT_PIX_CEIL( compensation - distance ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_To_Double_Grid */ + /* */ + /* <Description> */ + /* Rounds value to double grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED_EXEC; + + + if ( distance >= 0 ) + { + val = distance + compensation + 16; + if ( distance && val > 0 ) + val &= ~31; + else + val = 0; + } + else + { + val = -FT_PAD_ROUND( compensation - distance, 32 ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_Super */ + /* */ + /* <Description> */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + /* <Note> */ + /* The TrueType specification says very few about the relationship */ + /* between rounding and engine compensation. However, it seems from */ + /* the description of super round that we should add the compensation */ + /* before rounding. */ + /* */ + static FT_F26Dot6 + Round_Super( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ( distance - CUR.phase + CUR.threshold + compensation ) & + -CUR.period; + if ( distance && val < 0 ) + val = 0; + val += CUR.phase; + } + else + { + val = -( ( CUR.threshold - CUR.phase - distance + compensation ) & + -CUR.period ); + if ( val > 0 ) + val = 0; + val -= CUR.phase; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Round_Super_45 */ + /* */ + /* <Description> */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* <Input> */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* <Return> */ + /* Rounded distance. */ + /* */ + /* <Note> */ + /* There is a separate function for Round_Super_45() as we may need */ + /* greater precision. */ + /* */ + static FT_F26Dot6 + Round_Super_45( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ( ( distance - CUR.phase + CUR.threshold + compensation ) / + CUR.period ) * CUR.period; + if ( distance && val < 0 ) + val = 0; + val += CUR.phase; + } + else + { + val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) / + CUR.period ) * CUR.period ); + if ( val > 0 ) + val = 0; + val -= CUR.phase; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Compute_Round */ + /* */ + /* <Description> */ + /* Sets the rounding mode. */ + /* */ + /* <Input> */ + /* round_mode :: The rounding mode to be used. */ + /* */ + static void + Compute_Round( EXEC_OP_ FT_Byte round_mode ) + { + switch ( round_mode ) + { + case TT_Round_Off: + CUR.func_round = (TT_Round_Func)Round_None; + break; + + case TT_Round_To_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Grid; + break; + + case TT_Round_Up_To_Grid: + CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; + break; + + case TT_Round_Down_To_Grid: + CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; + break; + + case TT_Round_To_Half_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; + break; + + case TT_Round_To_Double_Grid: + CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; + break; + + case TT_Round_Super: + CUR.func_round = (TT_Round_Func)Round_Super; + break; + + case TT_Round_Super_45: + CUR.func_round = (TT_Round_Func)Round_Super_45; + break; + } + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* SetSuperRound */ + /* */ + /* <Description> */ + /* Sets Super Round parameters. */ + /* */ + /* <Input> */ + /* GridPeriod :: Grid period */ + /* selector :: SROUND opcode */ + /* */ + static void + SetSuperRound( EXEC_OP_ FT_F26Dot6 GridPeriod, + FT_Long selector ) + { + switch ( (FT_Int)( selector & 0xC0 ) ) + { + case 0: + CUR.period = GridPeriod / 2; + break; + + case 0x40: + CUR.period = GridPeriod; + break; + + case 0x80: + CUR.period = GridPeriod * 2; + break; + + /* This opcode is reserved, but... */ + + case 0xC0: + CUR.period = GridPeriod; + break; + } + + switch ( (FT_Int)( selector & 0x30 ) ) + { + case 0: + CUR.phase = 0; + break; + + case 0x10: + CUR.phase = CUR.period / 4; + break; + + case 0x20: + CUR.phase = CUR.period / 2; + break; + + case 0x30: + CUR.phase = CUR.period * 3 / 4; + break; + } + + if ( ( selector & 0x0F ) == 0 ) + CUR.threshold = CUR.period - 1; + else + CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8; + + CUR.period /= 256; + CUR.phase /= 256; + CUR.threshold /= 256; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Project */ + /* */ + /* <Description> */ + /* Computes the projection of vector given by (v2-v1) along the */ + /* current projection vector. */ + /* */ + /* <Input> */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* <Return> */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_ASSERT( !CUR.face->unpatented_hinting ); +#endif + + return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy, + CUR.GS.projVector.x, + CUR.GS.projVector.y ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Dual_Project */ + /* */ + /* <Description> */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* current dual vector. */ + /* */ + /* <Input> */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* <Return> */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Dual_Project( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy, + CUR.GS.dualVector.x, + CUR.GS.dualVector.y ); + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Project_x */ + /* */ + /* <Description> */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* horizontal axis. */ + /* */ + /* <Input> */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* <Return> */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project_x( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED_EXEC; + FT_UNUSED( dy ); + + return dx; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Project_y */ + /* */ + /* <Description> */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* vertical axis. */ + /* */ + /* <Input> */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* <Return> */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project_y( EXEC_OP_ FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED_EXEC; + FT_UNUSED( dx ); + + return dy; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Compute_Funcs */ + /* */ + /* <Description> */ + /* Computes the projection and movement function pointers according */ + /* to the current graphics state. */ + /* */ + static void + Compute_Funcs( EXEC_OP ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + /* If both vectors point rightwards along the x axis, set */ + /* `both-x-axis' true, otherwise set it false. The x values only */ + /* need be tested because the vector has been normalised to a unit */ + /* vector of length 0x4000 = unity. */ + CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 && + CUR.GS.freeVector.x == 0x4000 ); + + /* Throw away projection and freedom vector information */ + /* because the patents don't allow them to be stored. */ + /* The relevant US Patents are 5155805 and 5325479. */ + CUR.GS.projVector.x = 0; + CUR.GS.projVector.y = 0; + CUR.GS.freeVector.x = 0; + CUR.GS.freeVector.y = 0; + + if ( CUR.GS.both_x_axis ) + { + CUR.func_project = Project_x; + CUR.func_move = Direct_Move_X; + CUR.func_move_orig = Direct_Move_Orig_X; + } + else + { + CUR.func_project = Project_y; + CUR.func_move = Direct_Move_Y; + CUR.func_move_orig = Direct_Move_Orig_Y; + } + + if ( CUR.GS.dualVector.x == 0x4000 ) + CUR.func_dualproj = Project_x; + else + { + if ( CUR.GS.dualVector.y == 0x4000 ) + CUR.func_dualproj = Project_y; + else + CUR.func_dualproj = Dual_Project; + } + + /* Force recalculation of cached aspect ratio */ + CUR.tt_metrics.ratio = 0; + + return; + } +#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */ + + if ( CUR.GS.freeVector.x == 0x4000 ) + CUR.F_dot_P = CUR.GS.projVector.x * 0x10000L; + else + { + if ( CUR.GS.freeVector.y == 0x4000 ) + CUR.F_dot_P = CUR.GS.projVector.y * 0x10000L; + else + CUR.F_dot_P = (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x * 4 + + (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y * 4; + } + + if ( CUR.GS.projVector.x == 0x4000 ) + CUR.func_project = (TT_Project_Func)Project_x; + else + { + if ( CUR.GS.projVector.y == 0x4000 ) + CUR.func_project = (TT_Project_Func)Project_y; + else + CUR.func_project = (TT_Project_Func)Project; + } + + if ( CUR.GS.dualVector.x == 0x4000 ) + CUR.func_dualproj = (TT_Project_Func)Project_x; + else + { + if ( CUR.GS.dualVector.y == 0x4000 ) + CUR.func_dualproj = (TT_Project_Func)Project_y; + else + CUR.func_dualproj = (TT_Project_Func)Dual_Project; + } + + CUR.func_move = (TT_Move_Func)Direct_Move; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig; + + if ( CUR.F_dot_P == 0x40000000L ) + { + if ( CUR.GS.freeVector.x == 0x4000 ) + { + CUR.func_move = (TT_Move_Func)Direct_Move_X; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; + } + else + { + if ( CUR.GS.freeVector.y == 0x4000 ) + { + CUR.func_move = (TT_Move_Func)Direct_Move_Y; + CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; + } + } + } + + /* at small sizes, F_dot_P can become too small, resulting */ + /* in overflows and `spikes' in a number of glyphs like `w'. */ + + if ( FT_ABS( CUR.F_dot_P ) < 0x4000000L ) + CUR.F_dot_P = 0x40000000L; + + /* Disable cached aspect ratio */ + CUR.tt_metrics.ratio = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Normalize */ + /* */ + /* <Description> */ + /* Norms a vector. */ + /* */ + /* <Input> */ + /* Vx :: The horizontal input vector coordinate. */ + /* Vy :: The vertical input vector coordinate. */ + /* */ + /* <Output> */ + /* R :: The normed unit vector. */ + /* */ + /* <Return> */ + /* Returns FAILURE if a vector parameter is zero. */ + /* */ + /* <Note> */ + /* In case Vx and Vy are both zero, Normalize() returns SUCCESS, and */ + /* R is undefined. */ + /* */ + + + static FT_Bool + Normalize( EXEC_OP_ FT_F26Dot6 Vx, + FT_F26Dot6 Vy, + FT_UnitVector* R ) + { + FT_F26Dot6 W; + FT_Bool S1, S2; + + FT_UNUSED_EXEC; + + + if ( FT_ABS( Vx ) < 0x10000L && FT_ABS( Vy ) < 0x10000L ) + { + Vx *= 0x100; + Vy *= 0x100; + + W = TT_VecLen( Vx, Vy ); + + if ( W == 0 ) + { + /* XXX: UNDOCUMENTED! It seems that it is possible to try */ + /* to normalize the vector (0,0). Return immediately. */ + return SUCCESS; + } + + R->x = (FT_F2Dot14)FT_MulDiv( Vx, 0x4000L, W ); + R->y = (FT_F2Dot14)FT_MulDiv( Vy, 0x4000L, W ); + + return SUCCESS; + } + + W = TT_VecLen( Vx, Vy ); + + Vx = FT_MulDiv( Vx, 0x4000L, W ); + Vy = FT_MulDiv( Vy, 0x4000L, W ); + + W = Vx * Vx + Vy * Vy; + + /* Now, we want that Sqrt( W ) = 0x4000 */ + /* Or 0x10000000 <= W < 0x10004000 */ + + if ( Vx < 0 ) + { + Vx = -Vx; + S1 = TRUE; + } + else + S1 = FALSE; + + if ( Vy < 0 ) + { + Vy = -Vy; + S2 = TRUE; + } + else + S2 = FALSE; + + while ( W < 0x10000000L ) + { + /* We need to increase W by a minimal amount */ + if ( Vx < Vy ) + Vx++; + else + Vy++; + + W = Vx * Vx + Vy * Vy; + } + + while ( W >= 0x10004000L ) + { + /* We need to decrease W by a minimal amount */ + if ( Vx < Vy ) + Vx--; + else + Vy--; + + W = Vx * Vx + Vy * Vy; + } + + /* Note that in various cases, we can only */ + /* compute a Sqrt(W) of 0x3FFF, eg. Vx = Vy */ + + if ( S1 ) + Vx = -Vx; + + if ( S2 ) + Vy = -Vy; + + R->x = (FT_F2Dot14)Vx; /* Type conversion */ + R->y = (FT_F2Dot14)Vy; /* Type conversion */ + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* Here we start with the implementation of the various opcodes. */ + /* */ + /*************************************************************************/ + + + static FT_Bool + Ins_SxVTL( EXEC_OP_ FT_UShort aIdx1, + FT_UShort aIdx2, + FT_Int aOpc, + FT_UnitVector* Vec ) + { + FT_Long A, B, C; + FT_Vector* p1; + FT_Vector* p2; + + + if ( BOUNDS( aIdx1, CUR.zp2.n_points ) || + BOUNDS( aIdx2, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return FAILURE; + } + + p1 = CUR.zp1.cur + aIdx2; + p2 = CUR.zp2.cur + aIdx1; + + A = p1->x - p2->x; + B = p1->y - p2->y; + + if ( ( aOpc & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, Vec ); + + return SUCCESS; + } + + + /* When not using the big switch statements, the interpreter uses a */ + /* call table defined later below in this source. Each opcode must */ + /* thus have a corresponding function, even trivial ones. */ + /* */ + /* They are all defined there. */ + +#define DO_SVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.freeVector.x = A; \ + CUR.GS.projVector.x = A; \ + CUR.GS.dualVector.x = A; \ + \ + CUR.GS.freeVector.y = B; \ + CUR.GS.projVector.y = B; \ + CUR.GS.dualVector.y = B; \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SPVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.projVector.x = A; \ + CUR.GS.dualVector.x = A; \ + \ + CUR.GS.projVector.y = B; \ + CUR.GS.dualVector.y = B; \ + \ + GUESS_VECTOR( freeVector ); \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTCA \ + { \ + FT_Short A, B; \ + \ + \ + A = (FT_Short)( CUR.opcode & 1 ) << 14; \ + B = A ^ (FT_Short)0x4000; \ + \ + CUR.GS.freeVector.x = A; \ + CUR.GS.freeVector.y = B; \ + \ + GUESS_VECTOR( projVector ); \ + \ + COMPUTE_Funcs(); \ + } + + +#define DO_SPVTL \ + if ( INS_SxVTL( (FT_UShort)args[1], \ + (FT_UShort)args[0], \ + CUR.opcode, \ + &CUR.GS.projVector ) == SUCCESS ) \ + { \ + CUR.GS.dualVector = CUR.GS.projVector; \ + GUESS_VECTOR( freeVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTL \ + if ( INS_SxVTL( (FT_UShort)args[1], \ + (FT_UShort)args[0], \ + CUR.opcode, \ + &CUR.GS.freeVector ) == SUCCESS ) \ + { \ + GUESS_VECTOR( projVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVTPV \ + GUESS_VECTOR( projVector ); \ + CUR.GS.freeVector = CUR.GS.projVector; \ + COMPUTE_Funcs(); + + +#define DO_SPVFS \ + { \ + FT_Short S; \ + FT_Long X, Y; \ + \ + \ + /* Only use low 16bits, then sign extend */ \ + S = (FT_Short)args[1]; \ + Y = (FT_Long)S; \ + S = (FT_Short)args[0]; \ + X = (FT_Long)S; \ + \ + NORMalize( X, Y, &CUR.GS.projVector ); \ + \ + CUR.GS.dualVector = CUR.GS.projVector; \ + GUESS_VECTOR( freeVector ); \ + COMPUTE_Funcs(); \ + } + + +#define DO_SFVFS \ + { \ + FT_Short S; \ + FT_Long X, Y; \ + \ + \ + /* Only use low 16bits, then sign extend */ \ + S = (FT_Short)args[1]; \ + Y = (FT_Long)S; \ + S = (FT_Short)args[0]; \ + X = S; \ + \ + NORMalize( X, Y, &CUR.GS.freeVector ); \ + GUESS_VECTOR( projVector ); \ + COMPUTE_Funcs(); \ + } + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define DO_GPV \ + if ( CUR.face->unpatented_hinting ) \ + { \ + args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ + args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ + } \ + else \ + { \ + args[0] = CUR.GS.projVector.x; \ + args[1] = CUR.GS.projVector.y; \ + } +#else +#define DO_GPV \ + args[0] = CUR.GS.projVector.x; \ + args[1] = CUR.GS.projVector.y; +#endif + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#define DO_GFV \ + if ( CUR.face->unpatented_hinting ) \ + { \ + args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \ + args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \ + } \ + else \ + { \ + args[0] = CUR.GS.freeVector.x; \ + args[1] = CUR.GS.freeVector.y; \ + } +#else +#define DO_GFV \ + args[0] = CUR.GS.freeVector.x; \ + args[1] = CUR.GS.freeVector.y; +#endif + + +#define DO_SRP0 \ + CUR.GS.rp0 = (FT_UShort)args[0]; + + +#define DO_SRP1 \ + CUR.GS.rp1 = (FT_UShort)args[0]; + + +#define DO_SRP2 \ + CUR.GS.rp2 = (FT_UShort)args[0]; + + +#define DO_RTHG \ + CUR.GS.round_state = TT_Round_To_Half_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Half_Grid; + + +#define DO_RTG \ + CUR.GS.round_state = TT_Round_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Grid; + + +#define DO_RTDG \ + CUR.GS.round_state = TT_Round_To_Double_Grid; \ + CUR.func_round = (TT_Round_Func)Round_To_Double_Grid; + + +#define DO_RUTG \ + CUR.GS.round_state = TT_Round_Up_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_Up_To_Grid; + + +#define DO_RDTG \ + CUR.GS.round_state = TT_Round_Down_To_Grid; \ + CUR.func_round = (TT_Round_Func)Round_Down_To_Grid; + + +#define DO_ROFF \ + CUR.GS.round_state = TT_Round_Off; \ + CUR.func_round = (TT_Round_Func)Round_None; + + +#define DO_SROUND \ + SET_SuperRound( 0x4000, args[0] ); \ + CUR.GS.round_state = TT_Round_Super; \ + CUR.func_round = (TT_Round_Func)Round_Super; + + +#define DO_S45ROUND \ + SET_SuperRound( 0x2D41, args[0] ); \ + CUR.GS.round_state = TT_Round_Super_45; \ + CUR.func_round = (TT_Round_Func)Round_Super_45; + + +#define DO_SLOOP \ + if ( args[0] < 0 ) \ + CUR.error = TT_Err_Bad_Argument; \ + else \ + CUR.GS.loop = args[0]; + + +#define DO_SMD \ + CUR.GS.minimum_distance = args[0]; + + +#define DO_SCVTCI \ + CUR.GS.control_value_cutin = (FT_F26Dot6)args[0]; + + +#define DO_SSWCI \ + CUR.GS.single_width_cutin = (FT_F26Dot6)args[0]; + + + /* XXX: UNDOCUMENTED! or bug in the Windows engine? */ + /* */ + /* It seems that the value that is read here is */ + /* expressed in 16.16 format rather than in font */ + /* units. */ + /* */ +#define DO_SSW \ + CUR.GS.single_width_value = (FT_F26Dot6)( args[0] >> 10 ); + + +#define DO_FLIPON \ + CUR.GS.auto_flip = TRUE; + + +#define DO_FLIPOFF \ + CUR.GS.auto_flip = FALSE; + + +#define DO_SDB \ + CUR.GS.delta_base = (FT_Short)args[0]; + + +#define DO_SDS \ + CUR.GS.delta_shift = (FT_Short)args[0]; + + +#define DO_MD /* nothing */ + + +#define DO_MPPEM \ + args[0] = CURRENT_Ppem(); + + + /* Note: The pointSize should be irrelevant in a given font program; */ + /* we thus decide to return only the ppem. */ +#if 0 + +#define DO_MPS \ + args[0] = CUR.metrics.pointSize; + +#else + +#define DO_MPS \ + args[0] = CURRENT_Ppem(); + +#endif /* 0 */ + + +#define DO_DUP \ + args[1] = args[0]; + + +#define DO_CLEAR \ + CUR.new_top = 0; + + +#define DO_SWAP \ + { \ + FT_Long L; \ + \ + \ + L = args[0]; \ + args[0] = args[1]; \ + args[1] = L; \ + } + + +#define DO_DEPTH \ + args[0] = CUR.top; + + +#define DO_CINDEX \ + { \ + FT_Long L; \ + \ + \ + L = args[0]; \ + \ + if ( L <= 0 || L > CUR.args ) \ + CUR.error = TT_Err_Invalid_Reference; \ + else \ + args[0] = CUR.stack[CUR.args - L]; \ + } + + +#define DO_JROT \ + if ( args[1] != 0 ) \ + { \ + CUR.IP += args[0]; \ + CUR.step_ins = FALSE; \ + } + + +#define DO_JMPR \ + CUR.IP += args[0]; \ + CUR.step_ins = FALSE; + + +#define DO_JROF \ + if ( args[1] == 0 ) \ + { \ + CUR.IP += 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_NO_ROUND( args[0], 64L, args[1] ); + + +#define DO_MUL \ + args[0] = TT_MULDIV( args[0], args[1], 64L ); + + +#define DO_ABS \ + args[0] = FT_ABS( args[0] ); + + +#define DO_NEG \ + args[0] = -args[0]; + + +#define DO_FLOOR \ + args[0] = FT_PIX_FLOOR( args[0] ); + + +#define DO_CEILING \ + args[0] = FT_PIX_CEIL( args[0] ); + + +#define DO_RS \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.storeSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + else \ + args[0] = 0; \ + } \ + else \ + args[0] = CUR.storage[I]; \ + } + + +#define DO_WS \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.storeSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR.storage[I] = args[1]; \ + } + + +#define DO_RCVT \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + else \ + args[0] = 0; \ + } \ + else \ + args[0] = CUR_Func_read_cvt( I ); \ + } + + +#define DO_WCVTP \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR_Func_write_cvt( I, args[1] ); \ + } + + +#define DO_WCVTF \ + { \ + FT_ULong I = (FT_ULong)args[0]; \ + \ + \ + if ( BOUNDS( I, CUR.cvtSize ) ) \ + { \ + if ( CUR.pedantic_hinting ) \ + { \ + ARRAY_BOUND_ERROR; \ + } \ + } \ + else \ + CUR.cvt[I] = TT_MULFIX( args[1], CUR.tt_metrics.scale ); \ + } + + +#define DO_DEBUG \ + CUR.error = TT_Err_Debug_OpCode; + + +#define DO_ROUND \ + args[0] = CUR_Func_round( \ + args[0], \ + CUR.tt_metrics.compensations[CUR.opcode - 0x68] ); + + +#define DO_NROUND \ + args[0] = ROUND_None( args[0], \ + CUR.tt_metrics.compensations[CUR.opcode - 0x6C] ); + + +#define DO_MAX \ + if ( args[1] > args[0] ) \ + args[0] = args[1]; + + +#define DO_MIN \ + if ( args[1] < args[0] ) \ + args[0] = args[1]; + + +#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH + + +#undef ARRAY_BOUND_ERROR +#define ARRAY_BOUND_ERROR \ + { \ + CUR.error = TT_Err_Invalid_Reference; \ + return; \ + } + + + /*************************************************************************/ + /* */ + /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */ + /* Opcode range: 0x00-0x01 */ + /* Stack: --> */ + /* */ + static void + Ins_SVTCA( INS_ARG ) + { + DO_SVTCA + } + + + /*************************************************************************/ + /* */ + /* SPVTCA[a]: Set PVector to Coordinate Axis */ + /* Opcode range: 0x02-0x03 */ + /* Stack: --> */ + /* */ + static void + Ins_SPVTCA( INS_ARG ) + { + DO_SPVTCA + } + + + /*************************************************************************/ + /* */ + /* SFVTCA[a]: Set FVector to Coordinate Axis */ + /* Opcode range: 0x04-0x05 */ + /* Stack: --> */ + /* */ + static void + Ins_SFVTCA( INS_ARG ) + { + DO_SFVTCA + } + + + /*************************************************************************/ + /* */ + /* SPVTL[a]: Set PVector To Line */ + /* Opcode range: 0x06-0x07 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SPVTL( INS_ARG ) + { + DO_SPVTL + } + + + /*************************************************************************/ + /* */ + /* SFVTL[a]: Set FVector To Line */ + /* Opcode range: 0x08-0x09 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SFVTL( INS_ARG ) + { + DO_SFVTL + } + + + /*************************************************************************/ + /* */ + /* SFVTPV[]: Set FVector To PVector */ + /* Opcode range: 0x0E */ + /* Stack: --> */ + /* */ + static void + Ins_SFVTPV( INS_ARG ) + { + DO_SFVTPV + } + + + /*************************************************************************/ + /* */ + /* SPVFS[]: Set PVector From Stack */ + /* Opcode range: 0x0A */ + /* Stack: f2.14 f2.14 --> */ + /* */ + static void + Ins_SPVFS( INS_ARG ) + { + DO_SPVFS + } + + + /*************************************************************************/ + /* */ + /* SFVFS[]: Set FVector From Stack */ + /* Opcode range: 0x0B */ + /* Stack: f2.14 f2.14 --> */ + /* */ + static void + Ins_SFVFS( INS_ARG ) + { + DO_SFVFS + } + + + /*************************************************************************/ + /* */ + /* GPV[]: Get Projection Vector */ + /* Opcode range: 0x0C */ + /* Stack: ef2.14 --> ef2.14 */ + /* */ + static void + Ins_GPV( INS_ARG ) + { + DO_GPV + } + + + /*************************************************************************/ + /* GFV[]: Get Freedom Vector */ + /* Opcode range: 0x0D */ + /* Stack: ef2.14 --> ef2.14 */ + /* */ + static void + Ins_GFV( INS_ARG ) + { + DO_GFV + } + + + /*************************************************************************/ + /* */ + /* SRP0[]: Set Reference Point 0 */ + /* Opcode range: 0x10 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP0( INS_ARG ) + { + DO_SRP0 + } + + + /*************************************************************************/ + /* */ + /* SRP1[]: Set Reference Point 1 */ + /* Opcode range: 0x11 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP1( INS_ARG ) + { + DO_SRP1 + } + + + /*************************************************************************/ + /* */ + /* SRP2[]: Set Reference Point 2 */ + /* Opcode range: 0x12 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP2( INS_ARG ) + { + DO_SRP2 + } + + + /*************************************************************************/ + /* */ + /* RTHG[]: Round To Half Grid */ + /* Opcode range: 0x19 */ + /* Stack: --> */ + /* */ + static void + Ins_RTHG( INS_ARG ) + { + DO_RTHG + } + + + /*************************************************************************/ + /* */ + /* RTG[]: Round To Grid */ + /* Opcode range: 0x18 */ + /* Stack: --> */ + /* */ + static void + Ins_RTG( INS_ARG ) + { + DO_RTG + } + + + /*************************************************************************/ + /* RTDG[]: Round To Double Grid */ + /* Opcode range: 0x3D */ + /* Stack: --> */ + /* */ + static void + Ins_RTDG( INS_ARG ) + { + DO_RTDG + } + + + /*************************************************************************/ + /* RUTG[]: Round Up To Grid */ + /* Opcode range: 0x7C */ + /* Stack: --> */ + /* */ + static void + Ins_RUTG( INS_ARG ) + { + DO_RUTG + } + + + /*************************************************************************/ + /* */ + /* RDTG[]: Round Down To Grid */ + /* Opcode range: 0x7D */ + /* Stack: --> */ + /* */ + static void + Ins_RDTG( INS_ARG ) + { + DO_RDTG + } + + + /*************************************************************************/ + /* */ + /* ROFF[]: Round OFF */ + /* Opcode range: 0x7A */ + /* Stack: --> */ + /* */ + static void + Ins_ROFF( INS_ARG ) + { + DO_ROFF + } + + + /*************************************************************************/ + /* */ + /* SROUND[]: Super ROUND */ + /* Opcode range: 0x76 */ + /* Stack: Eint8 --> */ + /* */ + static void + Ins_SROUND( INS_ARG ) + { + DO_SROUND + } + + + /*************************************************************************/ + /* */ + /* S45ROUND[]: Super ROUND 45 degrees */ + /* Opcode range: 0x77 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_S45ROUND( INS_ARG ) + { + DO_S45ROUND + } + + + /*************************************************************************/ + /* */ + /* SLOOP[]: Set LOOP variable */ + /* Opcode range: 0x17 */ + /* Stack: int32? --> */ + /* */ + static void + Ins_SLOOP( INS_ARG ) + { + DO_SLOOP + } + + + /*************************************************************************/ + /* */ + /* SMD[]: Set Minimum Distance */ + /* Opcode range: 0x1A */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SMD( INS_ARG ) + { + DO_SMD + } + + + /*************************************************************************/ + /* */ + /* SCVTCI[]: Set Control Value Table Cut In */ + /* Opcode range: 0x1D */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SCVTCI( INS_ARG ) + { + DO_SCVTCI + } + + + /*************************************************************************/ + /* */ + /* SSWCI[]: Set Single Width Cut In */ + /* Opcode range: 0x1E */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SSWCI( INS_ARG ) + { + DO_SSWCI + } + + + /*************************************************************************/ + /* */ + /* SSW[]: Set Single Width */ + /* Opcode range: 0x1F */ + /* Stack: int32? --> */ + /* */ + static void + Ins_SSW( INS_ARG ) + { + DO_SSW + } + + + /*************************************************************************/ + /* */ + /* FLIPON[]: Set auto-FLIP to ON */ + /* Opcode range: 0x4D */ + /* Stack: --> */ + /* */ + static void + Ins_FLIPON( INS_ARG ) + { + DO_FLIPON + } + + + /*************************************************************************/ + /* */ + /* FLIPOFF[]: Set auto-FLIP to OFF */ + /* Opcode range: 0x4E */ + /* Stack: --> */ + /* */ + static void + Ins_FLIPOFF( INS_ARG ) + { + DO_FLIPOFF + } + + + /*************************************************************************/ + /* */ + /* SANGW[]: Set ANGle Weight */ + /* Opcode range: 0x7E */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SANGW( INS_ARG ) + { + /* instruction not supported anymore */ + } + + + /*************************************************************************/ + /* */ + /* SDB[]: Set Delta Base */ + /* Opcode range: 0x5E */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SDB( INS_ARG ) + { + DO_SDB + } + + + /*************************************************************************/ + /* */ + /* SDS[]: Set Delta Shift */ + /* Opcode range: 0x5F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SDS( INS_ARG ) + { + DO_SDS + } + + + /*************************************************************************/ + /* */ + /* MPPEM[]: Measure Pixel Per EM */ + /* Opcode range: 0x4B */ + /* Stack: --> Euint16 */ + /* */ + static void + Ins_MPPEM( INS_ARG ) + { + DO_MPPEM + } + + + /*************************************************************************/ + /* */ + /* MPS[]: Measure Point Size */ + /* Opcode range: 0x4C */ + /* Stack: --> Euint16 */ + /* */ + static void + Ins_MPS( INS_ARG ) + { + DO_MPS + } + + + /*************************************************************************/ + /* */ + /* DUP[]: DUPlicate the top stack's element */ + /* Opcode range: 0x20 */ + /* Stack: StkElt --> StkElt StkElt */ + /* */ + static void + Ins_DUP( INS_ARG ) + { + DO_DUP + } + + + /*************************************************************************/ + /* */ + /* POP[]: POP the stack's top element */ + /* Opcode range: 0x21 */ + /* Stack: StkElt --> */ + /* */ + static void + Ins_POP( INS_ARG ) + { + /* nothing to do */ + } + + + /*************************************************************************/ + /* */ + /* CLEAR[]: CLEAR the entire stack */ + /* Opcode range: 0x22 */ + /* Stack: StkElt... --> */ + /* */ + static void + Ins_CLEAR( INS_ARG ) + { + DO_CLEAR + } + + + /*************************************************************************/ + /* */ + /* SWAP[]: SWAP the stack's top two elements */ + /* Opcode range: 0x23 */ + /* Stack: 2 * StkElt --> 2 * StkElt */ + /* */ + static void + Ins_SWAP( INS_ARG ) + { + DO_SWAP + } + + + /*************************************************************************/ + /* */ + /* DEPTH[]: return the stack DEPTH */ + /* Opcode range: 0x24 */ + /* Stack: --> uint32 */ + /* */ + static void + Ins_DEPTH( INS_ARG ) + { + DO_DEPTH + } + + + /*************************************************************************/ + /* */ + /* CINDEX[]: Copy INDEXed element */ + /* Opcode range: 0x25 */ + /* Stack: int32 --> StkElt */ + /* */ + static void + Ins_CINDEX( INS_ARG ) + { + DO_CINDEX + } + + + /*************************************************************************/ + /* */ + /* EIF[]: End IF */ + /* Opcode range: 0x59 */ + /* Stack: --> */ + /* */ + static void + Ins_EIF( INS_ARG ) + { + /* nothing to do */ + } + + + /*************************************************************************/ + /* */ + /* JROT[]: Jump Relative On True */ + /* Opcode range: 0x78 */ + /* Stack: StkElt int32 --> */ + /* */ + static void + Ins_JROT( INS_ARG ) + { + DO_JROT + } + + + /*************************************************************************/ + /* */ + /* JMPR[]: JuMP Relative */ + /* Opcode range: 0x1C */ + /* Stack: int32 --> */ + /* */ + static void + Ins_JMPR( INS_ARG ) + { + DO_JMPR + } + + + /*************************************************************************/ + /* */ + /* JROF[]: Jump Relative On False */ + /* Opcode range: 0x79 */ + /* Stack: StkElt int32 --> */ + /* */ + static void + Ins_JROF( INS_ARG ) + { + DO_JROF + } + + + /*************************************************************************/ + /* */ + /* LT[]: Less Than */ + /* Opcode range: 0x50 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_LT( INS_ARG ) + { + DO_LT + } + + + /*************************************************************************/ + /* */ + /* LTEQ[]: Less Than or EQual */ + /* Opcode range: 0x51 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_LTEQ( INS_ARG ) + { + DO_LTEQ + } + + + /*************************************************************************/ + /* */ + /* GT[]: Greater Than */ + /* Opcode range: 0x52 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_GT( INS_ARG ) + { + DO_GT + } + + + /*************************************************************************/ + /* */ + /* GTEQ[]: Greater Than or EQual */ + /* Opcode range: 0x53 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_GTEQ( INS_ARG ) + { + DO_GTEQ + } + + + /*************************************************************************/ + /* */ + /* EQ[]: EQual */ + /* Opcode range: 0x54 */ + /* Stack: StkElt StkElt --> bool */ + /* */ + static void + Ins_EQ( INS_ARG ) + { + DO_EQ + } + + + /*************************************************************************/ + /* */ + /* NEQ[]: Not EQual */ + /* Opcode range: 0x55 */ + /* Stack: StkElt StkElt --> bool */ + /* */ + static void + Ins_NEQ( INS_ARG ) + { + DO_NEQ + } + + + /*************************************************************************/ + /* */ + /* ODD[]: Is ODD */ + /* Opcode range: 0x56 */ + /* Stack: f26.6 --> bool */ + /* */ + static void + Ins_ODD( INS_ARG ) + { + DO_ODD + } + + + /*************************************************************************/ + /* */ + /* EVEN[]: Is EVEN */ + /* Opcode range: 0x57 */ + /* Stack: f26.6 --> bool */ + /* */ + static void + Ins_EVEN( INS_ARG ) + { + DO_EVEN + } + + + /*************************************************************************/ + /* */ + /* AND[]: logical AND */ + /* Opcode range: 0x5A */ + /* Stack: uint32 uint32 --> uint32 */ + /* */ + static void + Ins_AND( INS_ARG ) + { + DO_AND + } + + + /*************************************************************************/ + /* */ + /* OR[]: logical OR */ + /* Opcode range: 0x5B */ + /* Stack: uint32 uint32 --> uint32 */ + /* */ + static void + Ins_OR( INS_ARG ) + { + DO_OR + } + + + /*************************************************************************/ + /* */ + /* NOT[]: logical NOT */ + /* Opcode range: 0x5C */ + /* Stack: StkElt --> uint32 */ + /* */ + static void + Ins_NOT( INS_ARG ) + { + DO_NOT + } + + + /*************************************************************************/ + /* */ + /* ADD[]: ADD */ + /* Opcode range: 0x60 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_ADD( INS_ARG ) + { + DO_ADD + } + + + /*************************************************************************/ + /* */ + /* SUB[]: SUBtract */ + /* Opcode range: 0x61 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_SUB( INS_ARG ) + { + DO_SUB + } + + + /*************************************************************************/ + /* */ + /* DIV[]: DIVide */ + /* Opcode range: 0x62 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_DIV( INS_ARG ) + { + DO_DIV + } + + + /*************************************************************************/ + /* */ + /* MUL[]: MULtiply */ + /* Opcode range: 0x63 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_MUL( INS_ARG ) + { + DO_MUL + } + + + /*************************************************************************/ + /* */ + /* ABS[]: ABSolute value */ + /* Opcode range: 0x64 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_ABS( INS_ARG ) + { + DO_ABS + } + + + /*************************************************************************/ + /* */ + /* NEG[]: NEGate */ + /* Opcode range: 0x65 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_NEG( INS_ARG ) + { + DO_NEG + } + + + /*************************************************************************/ + /* */ + /* FLOOR[]: FLOOR */ + /* Opcode range: 0x66 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_FLOOR( INS_ARG ) + { + DO_FLOOR + } + + + /*************************************************************************/ + /* */ + /* CEILING[]: CEILING */ + /* Opcode range: 0x67 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_CEILING( INS_ARG ) + { + DO_CEILING + } + + + /*************************************************************************/ + /* */ + /* RS[]: Read Store */ + /* Opcode range: 0x43 */ + /* Stack: uint32 --> uint32 */ + /* */ + static void + Ins_RS( INS_ARG ) + { + DO_RS + } + + + /*************************************************************************/ + /* */ + /* WS[]: Write Store */ + /* Opcode range: 0x42 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_WS( INS_ARG ) + { + DO_WS + } + + + /*************************************************************************/ + /* */ + /* WCVTP[]: Write CVT in Pixel units */ + /* Opcode range: 0x44 */ + /* Stack: f26.6 uint32 --> */ + /* */ + static void + Ins_WCVTP( INS_ARG ) + { + DO_WCVTP + } + + + /*************************************************************************/ + /* */ + /* WCVTF[]: Write CVT in Funits */ + /* Opcode range: 0x70 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_WCVTF( INS_ARG ) + { + DO_WCVTF + } + + + /*************************************************************************/ + /* */ + /* RCVT[]: Read CVT */ + /* Opcode range: 0x45 */ + /* Stack: uint32 --> f26.6 */ + /* */ + static void + Ins_RCVT( INS_ARG ) + { + DO_RCVT + } + + + /*************************************************************************/ + /* */ + /* AA[]: Adjust Angle */ + /* Opcode range: 0x7F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_AA( INS_ARG ) + { + /* intentionally no longer supported */ + } + + + /*************************************************************************/ + /* */ + /* DEBUG[]: DEBUG. Unsupported. */ + /* Opcode range: 0x4F */ + /* Stack: uint32 --> */ + /* */ + /* Note: The original instruction pops a value from the stack. */ + /* */ + static void + Ins_DEBUG( INS_ARG ) + { + DO_DEBUG + } + + + /*************************************************************************/ + /* */ + /* ROUND[ab]: ROUND value */ + /* Opcode range: 0x68-0x6B */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_ROUND( INS_ARG ) + { + DO_ROUND + } + + + /*************************************************************************/ + /* */ + /* NROUND[ab]: No ROUNDing of value */ + /* Opcode range: 0x6C-0x6F */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_NROUND( INS_ARG ) + { + DO_NROUND + } + + + /*************************************************************************/ + /* */ + /* MAX[]: MAXimum */ + /* Opcode range: 0x68 */ + /* Stack: int32? int32? --> int32 */ + /* */ + static void + Ins_MAX( INS_ARG ) + { + DO_MAX + } + + + /*************************************************************************/ + /* */ + /* MIN[]: MINimum */ + /* Opcode range: 0x69 */ + /* Stack: int32? int32? --> int32 */ + /* */ + static void + Ins_MIN( INS_ARG ) + { + DO_MIN + } + + +#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + + /*************************************************************************/ + /* */ + /* The following functions are called as is within the switch statement. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* MINDEX[]: Move INDEXed element */ + /* Opcode range: 0x26 */ + /* Stack: int32? --> StkElt */ + /* */ + static void + Ins_MINDEX( INS_ARG ) + { + FT_Long L, K; + + + L = args[0]; + + if ( L <= 0 || L > CUR.args ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + K = CUR.stack[CUR.args - L]; + + FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ], + &CUR.stack[CUR.args - L + 1], + ( L - 1 ) ); + + CUR.stack[CUR.args - 1] = K; + } + + + /*************************************************************************/ + /* */ + /* ROLL[]: ROLL top three elements */ + /* Opcode range: 0x8A */ + /* Stack: 3 * StkElt --> 3 * StkElt */ + /* */ + static void + Ins_ROLL( INS_ARG ) + { + FT_Long A, B, C; + + FT_UNUSED_EXEC; + + + A = args[2]; + B = args[1]; + C = args[0]; + + args[2] = C; + args[1] = A; + args[0] = B; + } + + + /*************************************************************************/ + /* */ + /* MANAGING THE FLOW OF CONTROL */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + static FT_Bool + SkipCode( EXEC_OP ) + { + CUR.IP += CUR.length; + + if ( CUR.IP < CUR.codeSize ) + { + CUR.opcode = CUR.code[CUR.IP]; + + CUR.length = opcode_length[CUR.opcode]; + if ( CUR.length < 0 ) + { + if ( CUR.IP + 1 > CUR.codeSize ) + goto Fail_Overflow; + CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; + } + + if ( CUR.IP + CUR.length <= CUR.codeSize ) + return SUCCESS; + } + + Fail_Overflow: + CUR.error = TT_Err_Code_Overflow; + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* IF[]: IF test */ + /* Opcode range: 0x58 */ + /* Stack: StkElt --> */ + /* */ + static void + Ins_IF( INS_ARG ) + { + FT_Int nIfs; + FT_Bool Out; + + + if ( args[0] != 0 ) + return; + + nIfs = 1; + Out = 0; + + do + { + if ( SKIP_Code() == FAILURE ) + return; + + switch ( CUR.opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x1B: /* ELSE */ + Out = FT_BOOL( nIfs == 1 ); + break; + + case 0x59: /* EIF */ + nIfs--; + Out = FT_BOOL( nIfs == 0 ); + break; + } + } while ( Out == 0 ); + } + + + /*************************************************************************/ + /* */ + /* ELSE[]: ELSE */ + /* Opcode range: 0x1B */ + /* Stack: --> */ + /* */ + static void + Ins_ELSE( INS_ARG ) + { + FT_Int nIfs; + + FT_UNUSED_ARG; + + + nIfs = 1; + + do + { + if ( SKIP_Code() == FAILURE ) + return; + + switch ( CUR.opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x59: /* EIF */ + nIfs--; + break; + } + } while ( nIfs != 0 ); + } + + + /*************************************************************************/ + /* */ + /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* FDEF[]: Function DEFinition */ + /* Opcode range: 0x2C */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_FDEF( INS_ARG ) + { + FT_ULong n; + TT_DefRecord* rec; + TT_DefRecord* limit; + + + /* some font programs are broken enough to redefine functions! */ + /* We will then parse the current table. */ + + rec = CUR.FDefs; + limit = rec + CUR.numFDefs; + n = args[0]; + + for ( ; rec < limit; rec++ ) + { + if ( rec->opc == n ) + break; + } + + if ( rec == limit ) + { + /* check that there is enough room for new functions */ + if ( CUR.numFDefs >= CUR.maxFDefs ) + { + CUR.error = TT_Err_Too_Many_Function_Defs; + return; + } + CUR.numFDefs++; + } + + /* Although FDEF takes unsigned 32-bit integer, */ + /* func # must be within unsigned 16-bit integer */ + if ( n > 0xFFFFU ) + { + CUR.error = TT_Err_Too_Many_Function_Defs; + return; + } + + rec->range = CUR.curRange; + rec->opc = (FT_UInt16)n; + rec->start = CUR.IP + 1; + rec->active = TRUE; + + if ( n > CUR.maxFunc ) + CUR.maxFunc = (FT_UInt16)n; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFS & FDEFs. */ + + while ( SKIP_Code() == SUCCESS ) + { + switch ( CUR.opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + CUR.error = TT_Err_Nested_DEFS; + return; + + case 0x2D: /* ENDF */ + return; + } + } + } + + + /*************************************************************************/ + /* */ + /* ENDF[]: END Function definition */ + /* Opcode range: 0x2D */ + /* Stack: --> */ + /* */ + static void + Ins_ENDF( INS_ARG ) + { + TT_CallRec* pRec; + + FT_UNUSED_ARG; + + + if ( CUR.callTop <= 0 ) /* We encountered an ENDF without a call */ + { + CUR.error = TT_Err_ENDF_In_Exec_Stream; + return; + } + + CUR.callTop--; + + pRec = &CUR.callStack[CUR.callTop]; + + pRec->Cur_Count--; + + CUR.step_ins = FALSE; + + if ( pRec->Cur_Count > 0 ) + { + CUR.callTop++; + CUR.IP = pRec->Cur_Restart; + } + else + /* Loop through the current function */ + INS_Goto_CodeRange( pRec->Caller_Range, + pRec->Caller_IP ); + + /* Exit the current call frame. */ + + /* NOTE: If the last instruction of a program is a */ + /* CALL or LOOPCALL, the return address is */ + /* always out of the code range. This is a */ + /* valid address, and it is why we do not test */ + /* the result of Ins_Goto_CodeRange() here! */ + } + + + /*************************************************************************/ + /* */ + /* CALL[]: CALL function */ + /* Opcode range: 0x2B */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_CALL( INS_ARG ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + + F = args[0]; + if ( BOUNDS( F, CUR.maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* CUR.maxFunc+1 == CUR.numFDefs */ + /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = CUR.FDefs + F; + if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = CUR.FDefs; + limit = def + CUR.numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + + /* check the call stack */ + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + pCrec = CUR.callStack + CUR.callTop; + + pCrec->Caller_Range = CUR.curRange; + pCrec->Caller_IP = CUR.IP + 1; + pCrec->Cur_Count = 1; + pCrec->Cur_Restart = def->start; + + CUR.callTop++; + + INS_Goto_CodeRange( def->range, + def->start ); + + CUR.step_ins = FALSE; + return; + + Fail: + CUR.error = TT_Err_Invalid_Reference; + } + + + /*************************************************************************/ + /* */ + /* LOOPCALL[]: LOOP and CALL function */ + /* Opcode range: 0x2A */ + /* Stack: uint32? Eint16? --> */ + /* */ + static void + Ins_LOOPCALL( INS_ARG ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + F = args[1]; + if ( BOUNDS( F, CUR.maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* CUR.maxFunc+1 == CUR.numFDefs */ + /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = CUR.FDefs + F; + if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = CUR.FDefs; + limit = def + CUR.numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + + /* check stack */ + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + if ( args[0] > 0 ) + { + pCrec = CUR.callStack + CUR.callTop; + + pCrec->Caller_Range = CUR.curRange; + pCrec->Caller_IP = CUR.IP + 1; + pCrec->Cur_Count = (FT_Int)args[0]; + pCrec->Cur_Restart = def->start; + + CUR.callTop++; + + INS_Goto_CodeRange( def->range, def->start ); + + CUR.step_ins = FALSE; + } + return; + + Fail: + CUR.error = TT_Err_Invalid_Reference; + } + + + /*************************************************************************/ + /* */ + /* IDEF[]: Instruction DEFinition */ + /* Opcode range: 0x89 */ + /* Stack: Eint8 --> */ + /* */ + static void + Ins_IDEF( INS_ARG ) + { + TT_DefRecord* def; + TT_DefRecord* limit; + + + /* First of all, look for the same function in our table */ + + def = CUR.IDefs; + limit = def + CUR.numIDefs; + + for ( ; def < limit; def++ ) + if ( def->opc == (FT_ULong)args[0] ) + break; + + if ( def == limit ) + { + /* check that there is enough room for a new instruction */ + if ( CUR.numIDefs >= CUR.maxIDefs ) + { + CUR.error = TT_Err_Too_Many_Instruction_Defs; + return; + } + CUR.numIDefs++; + } + + /* opcode must be unsigned 8-bit integer */ + if ( 0 > args[0] || args[0] > 0x00FF ) + { + CUR.error = TT_Err_Too_Many_Instruction_Defs; + return; + } + + def->opc = (FT_Byte)args[0]; + def->start = CUR.IP+1; + def->range = CUR.curRange; + def->active = TRUE; + + if ( (FT_ULong)args[0] > CUR.maxIns ) + CUR.maxIns = (FT_Byte)args[0]; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFs & FDEFs. */ + + while ( SKIP_Code() == SUCCESS ) + { + switch ( CUR.opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + CUR.error = TT_Err_Nested_DEFS; + return; + case 0x2D: /* ENDF */ + return; + } + } + } + + + /*************************************************************************/ + /* */ + /* PUSHING DATA ONTO THE INTERPRETER STACK */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* NPUSHB[]: PUSH N Bytes */ + /* Opcode range: 0x40 */ + /* Stack: --> uint32... */ + /* */ + static void + Ins_NPUSHB( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)CUR.code[CUR.IP + 1]; + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = CUR.code[CUR.IP + K + 1]; + + CUR.new_top += L; + } + + + /*************************************************************************/ + /* */ + /* NPUSHW[]: PUSH N Words */ + /* Opcode range: 0x41 */ + /* Stack: --> int32... */ + /* */ + static void + Ins_NPUSHW( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)CUR.code[CUR.IP + 1]; + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + CUR.IP += 2; + + for ( K = 0; K < L; K++ ) + args[K] = GET_ShortIns(); + + CUR.step_ins = FALSE; + CUR.new_top += L; + } + + + /*************************************************************************/ + /* */ + /* PUSHB[abc]: PUSH Bytes */ + /* Opcode range: 0xB0-0xB7 */ + /* Stack: --> uint32... */ + /* */ + static void + Ins_PUSHB( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)( CUR.opcode - 0xB0 + 1 ); + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = CUR.code[CUR.IP + K]; + } + + + /*************************************************************************/ + /* */ + /* PUSHW[abc]: PUSH Words */ + /* Opcode range: 0xB8-0xBF */ + /* Stack: --> int32... */ + /* */ + static void + Ins_PUSHW( INS_ARG ) + { + FT_UShort L, K; + + + L = (FT_UShort)( CUR.opcode - 0xB8 + 1 ); + + if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + CUR.IP++; + + for ( K = 0; K < L; K++ ) + args[K] = GET_ShortIns(); + + CUR.step_ins = FALSE; + } + + + /*************************************************************************/ + /* */ + /* MANAGING THE GRAPHICS STATE */ + /* */ + /* Instructions appear in the specs' order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* GC[a]: Get Coordinate projected onto */ + /* Opcode range: 0x46-0x47 */ + /* Stack: uint32 --> f26.6 */ + /* */ + /* BULLSHIT: Measures from the original glyph must be taken along the */ + /* dual projection vector! */ + /* */ + static void + Ins_GC( INS_ARG ) + { + FT_ULong L; + FT_F26Dot6 R; + + + L = (FT_ULong)args[0]; + + if ( BOUNDS( L, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + else + R = 0; + } + else + { + if ( CUR.opcode & 1 ) + R = CUR_fast_dualproj( &CUR.zp2.org[L] ); + else + R = CUR_fast_project( &CUR.zp2.cur[L] ); + } + + args[0] = R; + } + + + /*************************************************************************/ + /* */ + /* SCFS[]: Set Coordinate From Stack */ + /* Opcode range: 0x48 */ + /* Stack: f26.6 uint32 --> */ + /* */ + /* Formula: */ + /* */ + /* OA := OA + ( value - OA.p )/( f.p ) * f */ + /* */ + static void + Ins_SCFS( INS_ARG ) + { + FT_Long K; + FT_UShort L; + + + L = (FT_UShort)args[0]; + + if ( BOUNDS( L, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + K = CUR_fast_project( &CUR.zp2.cur[L] ); + + CUR_Func_move( &CUR.zp2, L, args[1] - K ); + + /* 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 */ + /* Opcode range: 0x49-0x4A */ + /* 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 ) + { + FT_UShort K, L; + FT_F26Dot6 D; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if( BOUNDS( L, CUR.zp0.n_points ) || + BOUNDS( K, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + D = 0; + } + else + { + if ( CUR.opcode & 1 ) + D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K ); + else + { + FT_Vector* vec1 = CUR.zp0.orus + L; + FT_Vector* vec2 = CUR.zp1.orus + K; + + + if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) + { + /* this should be faster */ + D = CUR_Func_dualproj( vec1, vec2 ); + D = TT_MULFIX( D, CUR.metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale ); + vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale ); + + D = CUR_fast_dualproj( &vec ); + } + } + } + + args[0] = D; + } + + + /*************************************************************************/ + /* */ + /* SDPVTL[a]: Set Dual PVector to Line */ + /* Opcode range: 0x86-0x87 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SDPVTL( INS_ARG ) + { + FT_Long A, B, C; + FT_UShort p1, p2; /* was FT_Int in pas type ERROR */ + + + p1 = (FT_UShort)args[1]; + p2 = (FT_UShort)args[0]; + + if ( BOUNDS( p2, CUR.zp1.n_points ) || + BOUNDS( p1, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + { + FT_Vector* v1 = CUR.zp1.org + p2; + FT_Vector* v2 = CUR.zp2.org + p1; + + + A = v1->x - v2->x; + B = v1->y - v2->y; + } + + if ( ( CUR.opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, &CUR.GS.dualVector ); + + { + FT_Vector* v1 = CUR.zp1.cur + p2; + FT_Vector* v2 = CUR.zp2.cur + p1; + + + A = v1->x - v2->x; + B = v1->y - v2->y; + } + + if ( ( CUR.opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = -C; + } + + NORMalize( A, B, &CUR.GS.projVector ); + + GUESS_VECTOR( freeVector ); + + COMPUTE_Funcs(); + } + + + /*************************************************************************/ + /* */ + /* SZP0[]: Set Zone Pointer 0 */ + /* Opcode range: 0x13 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP0( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp0 = CUR.twilight; + break; + + case 1: + CUR.zp0 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep0 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZP1[]: Set Zone Pointer 1 */ + /* Opcode range: 0x14 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP1( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp1 = CUR.twilight; + break; + + case 1: + CUR.zp1 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep1 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZP2[]: Set Zone Pointer 2 */ + /* Opcode range: 0x15 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP2( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp2 = CUR.twilight; + break; + + case 1: + CUR.zp2 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.GS.gep2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZPS[]: Set Zone PointerS */ + /* Opcode range: 0x16 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZPS( INS_ARG ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + CUR.zp0 = CUR.twilight; + break; + + case 1: + CUR.zp0 = CUR.pts; + break; + + default: + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + CUR.zp1 = CUR.zp0; + CUR.zp2 = CUR.zp0; + + CUR.GS.gep0 = (FT_UShort)args[0]; + CUR.GS.gep1 = (FT_UShort)args[0]; + CUR.GS.gep2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* INSTCTRL[]: INSTruction ConTRoL */ + /* Opcode range: 0x8e */ + /* Stack: int32 int32 --> */ + /* */ + static void + Ins_INSTCTRL( INS_ARG ) + { + FT_Long K, L; + + + K = args[1]; + L = args[0]; + + if ( K < 1 || K > 2 ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( L != 0 ) + L = K; + + CUR.GS.instruct_control = FT_BOOL( + ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L ); + } + + + /*************************************************************************/ + /* */ + /* SCANCTRL[]: SCAN ConTRoL */ + /* Opcode range: 0x85 */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_SCANCTRL( INS_ARG ) + { + FT_Int A; + + + /* Get Threshold */ + A = (FT_Int)( args[0] & 0xFF ); + + if ( A == 0xFF ) + { + CUR.GS.scan_control = TRUE; + return; + } + else if ( A == 0 ) + { + CUR.GS.scan_control = FALSE; + return; + } + + if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched ) + CUR.GS.scan_control = TRUE; + + if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A ) + CUR.GS.scan_control = FALSE; + + if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated ) + CUR.GS.scan_control = FALSE; + + if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched ) + CUR.GS.scan_control = FALSE; + } + + + /*************************************************************************/ + /* */ + /* SCANTYPE[]: SCAN TYPE */ + /* Opcode range: 0x8D */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_SCANTYPE( INS_ARG ) + { + if ( args[0] >= 0 ) + CUR.GS.scan_type = (FT_Int)args[0]; + } + + + /*************************************************************************/ + /* */ + /* MANAGING OUTLINES */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* FLIPPT[]: FLIP PoinT */ + /* Opcode range: 0x80 */ + /* Stack: uint32... --> */ + /* */ + static void + Ins_FLIPPT( INS_ARG ) + { + FT_UShort point; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + CUR.pts.tags[point] ^= FT_CURVE_TAG_ON; + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* FLIPRGON[]: FLIP RanGe ON */ + /* Opcode range: 0x81 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_FLIPRGON( INS_ARG ) + { + FT_UShort I, K, L; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, CUR.pts.n_points ) || + BOUNDS( L, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + for ( I = L; I <= K; I++ ) + CUR.pts.tags[I] |= FT_CURVE_TAG_ON; + } + + + /*************************************************************************/ + /* */ + /* FLIPRGOFF: FLIP RanGe OFF */ + /* Opcode range: 0x82 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_FLIPRGOFF( INS_ARG ) + { + FT_UShort I, K, L; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, CUR.pts.n_points ) || + BOUNDS( L, CUR.pts.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + for ( I = L; I <= K; I++ ) + CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON; + } + + + static FT_Bool + Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6* x, + FT_F26Dot6* y, + TT_GlyphZone zone, + FT_UShort* refp ) + { + TT_GlyphZoneRec zp; + FT_UShort p; + FT_F26Dot6 d; + + + if ( CUR.opcode & 1 ) + { + zp = CUR.zp0; + p = CUR.GS.rp1; + } + else + { + zp = CUR.zp1; + p = CUR.GS.rp2; + } + + if ( BOUNDS( p, zp.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + *refp = 0; + return FAILURE; + } + + *zone = zp; + *refp = p; + + d = CUR_Func_project( zp.cur + p, zp.org + p ); + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + *x = d; + *y = 0; + } + else + { + *x = 0; + *y = d; + } + } + else +#endif + { + *x = TT_MULDIV( d, + (FT_Long)CUR.GS.freeVector.x * 0x10000L, + CUR.F_dot_P ); + *y = TT_MULDIV( d, + (FT_Long)CUR.GS.freeVector.y * 0x10000L, + CUR.F_dot_P ); + } + + return SUCCESS; + } + + + static void + Move_Zp2_Point( EXEC_OP_ FT_UShort point, + FT_F26Dot6 dx, + FT_F26Dot6 dy, + FT_Bool touch ) + { +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + CUR.zp2.cur[point].x += dx; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + else + { + CUR.zp2.cur[point].y += dy; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + return; + } +#endif + + if ( CUR.GS.freeVector.x != 0 ) + { + CUR.zp2.cur[point].x += dx; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + if ( CUR.GS.freeVector.y != 0 ) + { + CUR.zp2.cur[point].y += dy; + if ( touch ) + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /*************************************************************************/ + /* */ + /* SHP[a]: SHift Point by the last point */ + /* Opcode range: 0x32-0x33 */ + /* Stack: uint32... --> */ + /* */ + static void + Ins_SHP( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + + FT_F26Dot6 dx, + dy; + FT_UShort point; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) + return; + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + /* XXX: 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 */ + /* Opcode range: 0x34-35 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SHC( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; + + FT_Short contour; + FT_UShort first_point, last_point, i; + + + contour = (FT_UShort)args[0]; + + if ( BOUNDS( contour, CUR.pts.n_contours ) ) + { + if ( CUR.pedantic_hinting ) + 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 = (FT_UShort)( CUR.pts.contours[contour - 1] + 1 - + CUR.pts.first_point ); + + last_point = (FT_UShort)( CUR.pts.contours[contour] - + CUR.pts.first_point ); + + /* XXX: this is probably wrong... at least it prevents memory */ + /* corruption when zp2 is the twilight zone */ + if ( BOUNDS( last_point, CUR.zp2.n_points ) ) + { + if ( CUR.zp2.n_points > 0 ) + last_point = (FT_UShort)(CUR.zp2.n_points - 1); + else + last_point = 0; + } + + /* XXX: UNDOCUMENTED! SHC touches the points */ + for ( i = first_point; i <= last_point; i++ ) + { + if ( zp.cur != CUR.zp2.cur || refp != i ) + MOVE_Zp2_Point( i, dx, dy, TRUE ); + } + } + + + /*************************************************************************/ + /* */ + /* SHZ[a]: SHift Zone */ + /* Opcode range: 0x36-37 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SHZ( INS_ARG ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; + + FT_UShort last_point, i; + + + if ( BOUNDS( args[0], 2 ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) ) + return; + + /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */ + /* Twilight zone has no contours, so use `n_points'. */ + /* Normal zone's `n_points' includes phantoms, so must */ + /* use end of last contour. */ + if ( CUR.GS.gep2 == 0 && CUR.zp2.n_points > 0 ) + last_point = (FT_UShort)( CUR.zp2.n_points - 1 ); + else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) + last_point = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] ); + else + last_point = 0; + + /* XXX: 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 */ + /* Opcode range: 0x38 */ + /* Stack: f26.6 uint32... --> */ + /* */ + static void + Ins_SHPIX( INS_ARG ) + { + FT_F26Dot6 dx, dy; + FT_UShort point; + + + if ( CUR.top < CUR.GS.loop + 1 ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + if ( CUR.face->unpatented_hinting ) + { + if ( CUR.GS.both_x_axis ) + { + dx = TT_MulFix14( (FT_UInt32)args[0], 0x4000 ); + dy = 0; + } + else + { + dx = 0; + dy = TT_MulFix14( (FT_UInt32)args[0], 0x4000 ); + } + } + else +#endif + { + dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x ); + dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y ); + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + MOVE_Zp2_Point( point, dx, dy, TRUE ); + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* MSIRP[a]: Move Stack Indirect Relative Position */ + /* Opcode range: 0x3A-0x3B */ + /* Stack: f26.6 uint32 --> */ + /* */ + static void + Ins_MSIRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: UNDOCUMENTED! behaviour */ + if ( CUR.GS.gep1 == 0 ) /* if the point that is to be moved */ + /* is in twilight zone */ + { + CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0]; + CUR_Func_move_orig( &CUR.zp1, point, args[1] ); + CUR.zp1.cur[point] = CUR.zp1.org[point]; + } + + distance = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, args[1] - distance ); + + CUR.GS.rp1 = CUR.GS.rp0; + CUR.GS.rp2 = point; + + if ( ( CUR.opcode & 1 ) != 0 ) + CUR.GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MDAP[a]: Move Direct Absolute Point */ + /* Opcode range: 0x2E-0x2F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_MDAP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 cur_dist, + distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: Is there some undocumented feature while in the */ + /* twilight zone? ? */ + if ( ( CUR.opcode & 1 ) != 0 ) + { + cur_dist = CUR_fast_project( &CUR.zp0.cur[point] ); + distance = CUR_Func_round( cur_dist, + CUR.tt_metrics.compensations[0] ) - cur_dist; + } + else + distance = 0; + + CUR_Func_move( &CUR.zp0, point, distance ); + + CUR.GS.rp0 = point; + CUR.GS.rp1 = point; + } + + + /*************************************************************************/ + /* */ + /* MIAP[a]: Move Indirect Absolute Point */ + /* Opcode range: 0x3E-0x3F */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_MIAP( INS_ARG ) + { + FT_ULong cvtEntry; + FT_UShort point; + FT_F26Dot6 distance, + org_dist; + + + cvtEntry = (FT_ULong)args[1]; + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) || + BOUNDS( cvtEntry, CUR.cvtSize ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: UNDOCUMENTED! */ + /* */ + /* The behaviour of an MIAP instruction is quite */ + /* different when used in the twilight zone. */ + /* */ + /* First, no control value cut-in test is performed */ + /* as it would fail anyway. Second, the original */ + /* point, i.e. (org_x,org_y) of zp0.point, is set */ + /* to the absolute, unrounded distance found in */ + /* the CVT. */ + /* */ + /* This is used in the CVT programs of the Microsoft */ + /* fonts Arial, Times, etc., in order to re-adjust */ + /* some key font heights. It allows the use of the */ + /* IP instruction in the twilight zone, which */ + /* otherwise would be `illegal' according to the */ + /* specification. */ + /* */ + /* We implement it with a special sequence for the */ + /* twilight zone. This is a bad hack, but it seems */ + /* to work. */ + + distance = CUR_Func_read_cvt( cvtEntry ); + + if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */ + { + CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance, CUR.GS.freeVector.x ); + CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance, CUR.GS.freeVector.y ), + CUR.zp0.cur[point] = CUR.zp0.org[point]; + } + + org_dist = CUR_fast_project( &CUR.zp0.cur[point] ); + + if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cutin flag */ + { + if ( FT_ABS( distance - org_dist ) > CUR.GS.control_value_cutin ) + distance = org_dist; + + distance = CUR_Func_round( distance, CUR.tt_metrics.compensations[0] ); + } + + CUR_Func_move( &CUR.zp0, point, distance - org_dist ); + + CUR.GS.rp0 = point; + CUR.GS.rp1 = point; + } + + + /*************************************************************************/ + /* */ + /* MDRP[abcde]: Move Direct Relative Point */ + /* Opcode range: 0xC0-0xDF */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_MDRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 org_dist, distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* XXX: Is there some undocumented feature while in the */ + /* twilight zone? */ + + /* XXX: UNDOCUMENTED: twilight zone special case */ + + if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 ) + { + FT_Vector* vec1 = &CUR.zp1.org[point]; + FT_Vector* vec2 = &CUR.zp0.org[CUR.GS.rp0]; + + + org_dist = CUR_Func_dualproj( vec1, vec2 ); + } + else + { + FT_Vector* vec1 = &CUR.zp1.orus[point]; + FT_Vector* vec2 = &CUR.zp0.orus[CUR.GS.rp0]; + + + if ( CUR.metrics.x_scale == CUR.metrics.y_scale ) + { + /* this should be faster */ + org_dist = CUR_Func_dualproj( vec1, vec2 ); + org_dist = TT_MULFIX( org_dist, CUR.metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale ); + vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale ); + + org_dist = CUR_fast_dualproj( &vec ); + } + } + + /* single width cut-in test */ + + if ( FT_ABS( org_dist - CUR.GS.single_width_value ) < + CUR.GS.single_width_cutin ) + { + if ( org_dist >= 0 ) + org_dist = CUR.GS.single_width_value; + else + org_dist = -CUR.GS.single_width_value; + } + + /* round flag */ + + if ( ( CUR.opcode & 4 ) != 0 ) + distance = CUR_Func_round( + org_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + else + distance = ROUND_None( + org_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + + /* minimum distance flag */ + + if ( ( CUR.opcode & 8 ) != 0 ) + { + if ( org_dist >= 0 ) + { + if ( distance < CUR.GS.minimum_distance ) + distance = CUR.GS.minimum_distance; + } + else + { + if ( distance > -CUR.GS.minimum_distance ) + distance = -CUR.GS.minimum_distance; + } + } + + /* now move the point */ + + org_dist = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, distance - org_dist ); + + CUR.GS.rp1 = CUR.GS.rp0; + CUR.GS.rp2 = point; + + if ( ( CUR.opcode & 16 ) != 0 ) + CUR.GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MIRP[abcde]: Move Indirect Relative Point */ + /* Opcode range: 0xE0-0xFF */ + /* Stack: int32? uint32 --> */ + /* */ + static void + Ins_MIRP( INS_ARG ) + { + FT_UShort point; + FT_ULong cvtEntry; + + FT_F26Dot6 cvt_dist, + distance, + cur_dist, + org_dist; + + + point = (FT_UShort)args[0]; + cvtEntry = (FT_ULong)( args[1] + 1 ); + + /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ + + if ( BOUNDS( point, CUR.zp1.n_points ) || + BOUNDS( cvtEntry, CUR.cvtSize + 1 ) || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + 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 ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) < + CUR.GS.single_width_cutin ) + { + if ( cvt_dist >= 0 ) + cvt_dist = CUR.GS.single_width_value; + else + cvt_dist = -CUR.GS.single_width_value; + } + + /* XXX: UNDOCUMENTED! -- twilight zone */ + + if ( CUR.GS.gep1 == 0 ) + { + CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x + + TT_MulFix14( (FT_UInt32)cvt_dist, + CUR.GS.freeVector.x ); + + CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y + + TT_MulFix14( (FT_UInt32)cvt_dist, + CUR.GS.freeVector.y ); + + CUR.zp1.cur[point] = CUR.zp0.cur[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 ( FT_ABS( cvt_dist - org_dist ) >= CUR.GS.control_value_cutin ) + cvt_dist = org_dist; + + distance = CUR_Func_round( + cvt_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + } + else + distance = ROUND_None( + cvt_dist, + CUR.tt_metrics.compensations[CUR.opcode & 3] ); + + /* minimum distance test */ + + if ( ( CUR.opcode & 8 ) != 0 ) + { + if ( org_dist >= 0 ) + { + if ( distance < CUR.GS.minimum_distance ) + distance = CUR.GS.minimum_distance; + } + else + { + if ( distance > -CUR.GS.minimum_distance ) + distance = -CUR.GS.minimum_distance; + } + } + + CUR_Func_move( &CUR.zp1, point, distance - cur_dist ); + + CUR.GS.rp1 = CUR.GS.rp0; + + if ( ( CUR.opcode & 16 ) != 0 ) + CUR.GS.rp0 = point; + + /* XXX: UNDOCUMENTED! */ + CUR.GS.rp2 = point; + } + + + /*************************************************************************/ + /* */ + /* ALIGNRP[]: ALIGN Relative Point */ + /* Opcode range: 0x3C */ + /* Stack: uint32 uint32... --> */ + /* */ + static void + Ins_ALIGNRP( INS_ARG ) + { + FT_UShort point; + FT_F26Dot6 distance; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop || + BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + while ( CUR.GS.loop > 0 ) + { + CUR.args--; + + point = (FT_UShort)CUR.stack[CUR.args]; + + if ( BOUNDS( point, CUR.zp1.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + { + distance = CUR_Func_project( CUR.zp1.cur + point, + CUR.zp0.cur + CUR.GS.rp0 ); + + CUR_Func_move( &CUR.zp1, point, -distance ); + } + + CUR.GS.loop--; + } + + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* ISECT[]: moves point to InterSECTion */ + /* Opcode range: 0x0F */ + /* Stack: 5 * uint32 --> */ + /* */ + static void + Ins_ISECT( INS_ARG ) + { + FT_UShort point, + a0, a1, + b0, b1; + + FT_F26Dot6 discriminant; + + FT_F26Dot6 dx, dy, + dax, day, + dbx, dby; + + FT_F26Dot6 val; + + FT_Vector R; + + + point = (FT_UShort)args[0]; + + a0 = (FT_UShort)args[1]; + a1 = (FT_UShort)args[2]; + b0 = (FT_UShort)args[3]; + b1 = (FT_UShort)args[4]; + + if ( BOUNDS( b0, CUR.zp0.n_points ) || + BOUNDS( b1, CUR.zp0.n_points ) || + BOUNDS( a0, CUR.zp1.n_points ) || + BOUNDS( a1, CUR.zp1.n_points ) || + BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x; + dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y; + + dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x; + day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y; + + dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x; + dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y; + + CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH; + + discriminant = TT_MULDIV( dax, -dby, 0x40 ) + + TT_MULDIV( day, dbx, 0x40 ); + + if ( FT_ABS( discriminant ) >= 0x40 ) + { + val = TT_MULDIV( dx, -dby, 0x40 ) + TT_MULDIV( dy, dbx, 0x40 ); + + R.x = TT_MULDIV( val, dax, discriminant ); + R.y = TT_MULDIV( val, day, discriminant ); + + CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x; + CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y; + } + else + { + /* else, take the middle of the middles of A and B */ + + CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x + + CUR.zp1.cur[a1].x + + CUR.zp0.cur[b0].x + + CUR.zp0.cur[b1].x ) / 4; + CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y + + CUR.zp1.cur[a1].y + + CUR.zp0.cur[b0].y + + CUR.zp0.cur[b1].y ) / 4; + } + } + + + /*************************************************************************/ + /* */ + /* ALIGNPTS[]: ALIGN PoinTS */ + /* Opcode range: 0x27 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_ALIGNPTS( INS_ARG ) + { + FT_UShort p1, p2; + FT_F26Dot6 distance; + + + p1 = (FT_UShort)args[0]; + p2 = (FT_UShort)args[1]; + + if ( BOUNDS( args[0], CUR.zp1.n_points ) || + BOUNDS( args[1], CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + distance = CUR_Func_project( CUR.zp0.cur + p2, + CUR.zp1.cur + p1 ) / 2; + + CUR_Func_move( &CUR.zp1, p1, distance ); + CUR_Func_move( &CUR.zp0, p2, -distance ); + } + + + /*************************************************************************/ + /* */ + /* IP[]: Interpolate Point */ + /* Opcode range: 0x39 */ + /* Stack: uint32... --> */ + /* */ + + /* SOMETIMES, DUMBER CODE IS BETTER CODE */ + + static void + Ins_IP( INS_ARG ) + { + FT_F26Dot6 old_range, cur_range; + FT_Vector* orus_base; + FT_Vector* cur_base; + FT_Int twilight; + + FT_UNUSED_ARG; + + + if ( CUR.top < CUR.GS.loop ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + + /* + * We need to deal in a special way with the twilight zone. + * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0), + * for every n. + */ + twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0; + + if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + if ( twilight ) + orus_base = &CUR.zp0.org[CUR.GS.rp1]; + else + orus_base = &CUR.zp0.orus[CUR.GS.rp1]; + + cur_base = &CUR.zp0.cur[CUR.GS.rp1]; + + /* XXX: There are some glyphs in some braindead but popular */ + /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ + /* calling IP[] with bad values of rp[12]. */ + /* Do something sane when this odd thing happens. */ + if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) || + BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) ) + { + old_range = 0; + cur_range = 0; + } + else + { + if ( twilight ) + old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2], + orus_base ); + else + old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2], + orus_base ); + + cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base ); + } + + for ( ; CUR.GS.loop > 0; --CUR.GS.loop ) + { + FT_UInt point = (FT_UInt)CUR.stack[--CUR.args]; + FT_F26Dot6 org_dist, cur_dist, new_dist; + + + /* check point bounds */ + if ( BOUNDS( point, CUR.zp2.n_points ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + continue; + } + + if ( twilight ) + org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base ); + else + org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base ); + + cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base ); + + if ( org_dist ) + new_dist = ( old_range != 0 ) + ? TT_MULDIV( org_dist, cur_range, old_range ) + : cur_dist; + else + new_dist = 0; + + CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist ); + } + CUR.GS.loop = 1; + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* UTP[a]: UnTouch Point */ + /* Opcode range: 0x29 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_UTP( INS_ARG ) + { + FT_UShort point; + FT_Byte mask; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, CUR.zp0.n_points ) ) + { + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + return; + } + + mask = 0xFF; + + if ( CUR.GS.freeVector.x != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_X; + + if ( CUR.GS.freeVector.y != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_Y; + + CUR.zp0.tags[point] &= mask; + } + + + /* Local variables for Ins_IUP: */ + typedef struct IUP_WorkerRec_ + { + FT_Vector* orgs; /* original and current coordinate */ + FT_Vector* curs; /* arrays */ + FT_Vector* orus; + FT_UInt max_points; + + } IUP_WorkerRec, *IUP_Worker; + + + static void + _iup_worker_shift( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt p ) + { + FT_UInt i; + FT_F26Dot6 dx; + + + dx = worker->curs[p].x - worker->orgs[p].x; + if ( dx != 0 ) + { + for ( i = p1; i < p; i++ ) + worker->curs[i].x += dx; + + for ( i = p + 1; i <= p2; i++ ) + worker->curs[i].x += dx; + } + } + + + static void + _iup_worker_interpolate( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt ref1, + FT_UInt ref2 ) + { + FT_UInt i; + FT_F26Dot6 orus1, orus2, org1, org2, delta1, delta2; + + + if ( p1 > p2 ) + return; + + if ( BOUNDS( ref1, worker->max_points ) || + BOUNDS( ref2, worker->max_points ) ) + return; + + orus1 = worker->orus[ref1].x; + orus2 = worker->orus[ref2].x; + + if ( orus1 > orus2 ) + { + FT_F26Dot6 tmp_o; + FT_UInt tmp_r; + + + tmp_o = orus1; + orus1 = orus2; + orus2 = tmp_o; + + tmp_r = ref1; + ref1 = ref2; + ref2 = tmp_r; + } + + org1 = worker->orgs[ref1].x; + org2 = worker->orgs[ref2].x; + delta1 = worker->curs[ref1].x - org1; + delta2 = worker->curs[ref2].x - org2; + + if ( orus1 == orus2 ) + { + /* simple shift of untouched points */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x += delta1; + else + x += delta2; + + worker->curs[i].x = x; + } + } + else + { + FT_Fixed scale = 0; + FT_Bool scale_valid = 0; + + + /* interpolation */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x += delta1; + + else if ( x >= org2 ) + x += delta2; + + else + { + if ( !scale_valid ) + { + scale_valid = 1; + scale = TT_MULDIV( org2 + delta2 - ( org1 + delta1 ), + 0x10000L, orus2 - orus1 ); + } + + x = ( org1 + delta1 ) + + TT_MULFIX( worker->orus[i].x - orus1, scale ); + } + worker->curs[i].x = x; + } + } + } + + + /*************************************************************************/ + /* */ + /* IUP[a]: Interpolate Untouched Points */ + /* Opcode range: 0x30-0x31 */ + /* Stack: --> */ + /* */ + static void + Ins_IUP( INS_ARG ) + { + IUP_WorkerRec V; + FT_Byte mask; + + FT_UInt first_point; /* first point of contour */ + FT_UInt end_point; /* end point (last+1) of contour */ + + FT_UInt first_touched; /* first touched point in contour */ + FT_UInt cur_touched; /* current touched point in contour */ + + FT_UInt point; /* current point */ + FT_Short contour; /* current contour */ + + FT_UNUSED_ARG; + + + /* ignore empty outlines */ + if ( CUR.pts.n_contours == 0 ) + return; + + if ( CUR.opcode & 1 ) + { + mask = FT_CURVE_TAG_TOUCH_X; + V.orgs = CUR.pts.org; + V.curs = CUR.pts.cur; + V.orus = CUR.pts.orus; + } + else + { + mask = FT_CURVE_TAG_TOUCH_Y; + V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 ); + V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 ); + V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 ); + } + V.max_points = CUR.pts.n_points; + + contour = 0; + point = 0; + + do + { + end_point = CUR.pts.contours[contour] - CUR.pts.first_point; + first_point = point; + + if ( CUR.pts.n_points <= end_point ) + end_point = CUR.pts.n_points; + + while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 ) + point++; + + if ( point <= end_point ) + { + first_touched = point; + cur_touched = point; + + point++; + + while ( point <= end_point ) + { + if ( ( CUR.pts.tags[point] & mask ) != 0 ) + { + if ( point > 0 ) + _iup_worker_interpolate( &V, + cur_touched + 1, + point - 1, + cur_touched, + point ); + cur_touched = point; + } + + point++; + } + + if ( cur_touched == first_touched ) + _iup_worker_shift( &V, first_point, end_point, cur_touched ); + else + { + _iup_worker_interpolate( &V, + (FT_UShort)( cur_touched + 1 ), + end_point, + cur_touched, + first_touched ); + + if ( first_touched > 0 ) + _iup_worker_interpolate( &V, + first_point, + first_touched - 1, + cur_touched, + first_touched ); + } + } + contour++; + } while ( contour < CUR.pts.n_contours ); + } + + + /*************************************************************************/ + /* */ + /* DELTAPn[]: DELTA exceptions P1, P2, P3 */ + /* Opcode range: 0x5D,0x71,0x72 */ + /* Stack: uint32 (2 * uint32)... --> */ + /* */ + static void + Ins_DELTAP( INS_ARG ) + { + FT_ULong k, nump; + FT_UShort A; + FT_ULong C; + FT_Long B; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Delta hinting is covered by US Patent 5159668. */ + if ( CUR.face->unpatented_hinting ) + { + FT_Long n = args[0] * 2; + + + if ( CUR.args < n ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= n; + CUR.new_top = CUR.args; + return; + } +#endif + + nump = (FT_ULong)args[0]; /* some points theoretically may occur more + than once, thus UShort isn't enough */ + + for ( k = 1; k <= nump; k++ ) + { + if ( CUR.args < 2 ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= 2; + + A = (FT_UShort)CUR.stack[CUR.args + 1]; + B = CUR.stack[CUR.args]; + + /* XXX: Because some popular fonts contain some invalid DeltaP */ + /* instructions, we simply ignore them when the stacked */ + /* point reference is off limit, rather than returning an */ + /* error. As a delta instruction doesn't change a glyph */ + /* in great ways, this shouldn't be a problem. */ + + if ( !BOUNDS( A, CUR.zp0.n_points ) ) + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( CUR.opcode ) + { + case 0x5D: + break; + + case 0x71: + C += 16; + break; + + case 0x72: + C += 32; + break; + } + + C += CUR.GS.delta_base; + + if ( CURRENT_Ppem() == (FT_Long)C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B = B * 64 / ( 1L << CUR.GS.delta_shift ); + + CUR_Func_move( &CUR.zp0, A, B ); + } + } + else + if ( CUR.pedantic_hinting ) + CUR.error = TT_Err_Invalid_Reference; + } + + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* DELTACn[]: DELTA exceptions C1, C2, C3 */ + /* Opcode range: 0x73,0x74,0x75 */ + /* Stack: uint32 (2 * uint32)... --> */ + /* */ + static void + Ins_DELTAC( INS_ARG ) + { + FT_ULong nump, k; + FT_ULong A, C; + FT_Long B; + + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Delta hinting is covered by US Patent 5159668. */ + if ( CUR.face->unpatented_hinting ) + { + FT_Long n = args[0] * 2; + + + if ( CUR.args < n ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= n; + CUR.new_top = CUR.args; + return; + } +#endif + + nump = (FT_ULong)args[0]; + + for ( k = 1; k <= nump; k++ ) + { + if ( CUR.args < 2 ) + { + CUR.error = TT_Err_Too_Few_Arguments; + return; + } + + CUR.args -= 2; + + A = (FT_ULong)CUR.stack[CUR.args + 1]; + B = CUR.stack[CUR.args]; + + if ( BOUNDS( A, CUR.cvtSize ) ) + { + if ( CUR.pedantic_hinting ) + { + CUR.error = TT_Err_Invalid_Reference; + return; + } + } + else + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( CUR.opcode ) + { + case 0x73: + break; + + case 0x74: + C += 16; + break; + + case 0x75: + C += 32; + break; + } + + C += CUR.GS.delta_base; + + if ( CURRENT_Ppem() == (FT_Long)C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B = B * 64 / ( 1L << CUR.GS.delta_shift ); + + CUR_Func_move_cvt( A, B ); + } + } + } + + CUR.new_top = CUR.args; + } + + + /*************************************************************************/ + /* */ + /* MISC. INSTRUCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* GETINFO[]: GET INFOrmation */ + /* Opcode range: 0x88 */ + /* Stack: uint32 --> uint32 */ + /* */ + static void + Ins_GETINFO( INS_ARG ) + { + FT_Long K; + + + K = 0; + + /* We return MS rasterizer version 1.7 for the font scaler. */ + if ( ( args[0] & 1 ) != 0 ) + K = 35; + + /* Has the glyph been rotated? */ + if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated ) + K |= 0x80; + + /* Has the glyph been stretched? */ + if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched ) + K |= 1 << 8; + + /* Are we hinting for grayscale? */ + if ( ( args[0] & 32 ) != 0 && CUR.grayscale ) + K |= 1 << 12; + + args[0] = K; + } + + + static void + Ins_UNKNOWN( INS_ARG ) + { + TT_DefRecord* def = CUR.IDefs; + TT_DefRecord* limit = def + CUR.numIDefs; + + FT_UNUSED_ARG; + + + for ( ; def < limit; def++ ) + { + if ( (FT_Byte)def->opc == CUR.opcode && def->active ) + { + TT_CallRec* call; + + + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Stack_Overflow; + return; + } + + call = CUR.callStack + CUR.callTop++; + + call->Caller_Range = CUR.curRange; + call->Caller_IP = CUR.IP+1; + call->Cur_Count = 1; + call->Cur_Restart = def->start; + + INS_Goto_CodeRange( def->range, def->start ); + + CUR.step_ins = FALSE; + return; + } + } + + CUR.error = TT_Err_Invalid_Opcode; + } + + +#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + static + TInstruction_Function Instruct_Dispatch[256] = + { + /* Opcodes are gathered in groups of 16. */ + /* Please keep the spaces as they are. */ + + /* SVTCA y */ Ins_SVTCA, + /* SVTCA x */ Ins_SVTCA, + /* SPvTCA y */ Ins_SPVTCA, + /* SPvTCA x */ Ins_SPVTCA, + /* SFvTCA y */ Ins_SFVTCA, + /* SFvTCA x */ Ins_SFVTCA, + /* SPvTL // */ Ins_SPVTL, + /* SPvTL + */ Ins_SPVTL, + /* SFvTL // */ Ins_SFVTL, + /* SFvTL + */ Ins_SFVTL, + /* SPvFS */ Ins_SPVFS, + /* SFvFS */ Ins_SFVFS, + /* GPV */ Ins_GPV, + /* GFV */ Ins_GFV, + /* SFvTPv */ Ins_SFVTPV, + /* ISECT */ Ins_ISECT, + + /* SRP0 */ Ins_SRP0, + /* SRP1 */ Ins_SRP1, + /* SRP2 */ Ins_SRP2, + /* SZP0 */ Ins_SZP0, + /* SZP1 */ Ins_SZP1, + /* SZP2 */ Ins_SZP2, + /* SZPS */ Ins_SZPS, + /* SLOOP */ Ins_SLOOP, + /* RTG */ Ins_RTG, + /* RTHG */ Ins_RTHG, + /* SMD */ Ins_SMD, + /* ELSE */ Ins_ELSE, + /* JMPR */ Ins_JMPR, + /* SCvTCi */ Ins_SCVTCI, + /* SSwCi */ Ins_SSWCI, + /* SSW */ Ins_SSW, + + /* DUP */ Ins_DUP, + /* POP */ Ins_POP, + /* CLEAR */ Ins_CLEAR, + /* SWAP */ Ins_SWAP, + /* DEPTH */ Ins_DEPTH, + /* CINDEX */ Ins_CINDEX, + /* MINDEX */ Ins_MINDEX, + /* AlignPTS */ Ins_ALIGNPTS, + /* INS_0x28 */ Ins_UNKNOWN, + /* UTP */ Ins_UTP, + /* LOOPCALL */ Ins_LOOPCALL, + /* CALL */ Ins_CALL, + /* FDEF */ Ins_FDEF, + /* ENDF */ Ins_ENDF, + /* MDAP[0] */ Ins_MDAP, + /* MDAP[1] */ Ins_MDAP, + + /* IUP[0] */ Ins_IUP, + /* IUP[1] */ Ins_IUP, + /* SHP[0] */ Ins_SHP, + /* SHP[1] */ Ins_SHP, + /* SHC[0] */ Ins_SHC, + /* SHC[1] */ Ins_SHC, + /* SHZ[0] */ Ins_SHZ, + /* SHZ[1] */ Ins_SHZ, + /* SHPIX */ Ins_SHPIX, + /* IP */ Ins_IP, + /* MSIRP[0] */ Ins_MSIRP, + /* MSIRP[1] */ Ins_MSIRP, + /* AlignRP */ Ins_ALIGNRP, + /* RTDG */ Ins_RTDG, + /* MIAP[0] */ Ins_MIAP, + /* MIAP[1] */ Ins_MIAP, + + /* NPushB */ Ins_NPUSHB, + /* NPushW */ Ins_NPUSHW, + /* WS */ Ins_WS, + /* RS */ Ins_RS, + /* WCvtP */ Ins_WCVTP, + /* RCvt */ Ins_RCVT, + /* GC[0] */ Ins_GC, + /* GC[1] */ Ins_GC, + /* SCFS */ Ins_SCFS, + /* MD[0] */ Ins_MD, + /* MD[1] */ Ins_MD, + /* MPPEM */ Ins_MPPEM, + /* MPS */ Ins_MPS, + /* FlipON */ Ins_FLIPON, + /* FlipOFF */ Ins_FLIPOFF, + /* DEBUG */ Ins_DEBUG, + + /* LT */ Ins_LT, + /* LTEQ */ Ins_LTEQ, + /* GT */ Ins_GT, + /* GTEQ */ Ins_GTEQ, + /* EQ */ Ins_EQ, + /* NEQ */ Ins_NEQ, + /* ODD */ Ins_ODD, + /* EVEN */ Ins_EVEN, + /* IF */ Ins_IF, + /* EIF */ Ins_EIF, + /* AND */ Ins_AND, + /* OR */ Ins_OR, + /* NOT */ Ins_NOT, + /* DeltaP1 */ Ins_DELTAP, + /* SDB */ Ins_SDB, + /* SDS */ Ins_SDS, + + /* ADD */ Ins_ADD, + /* SUB */ Ins_SUB, + /* DIV */ Ins_DIV, + /* MUL */ Ins_MUL, + /* ABS */ Ins_ABS, + /* NEG */ Ins_NEG, + /* FLOOR */ Ins_FLOOR, + /* CEILING */ Ins_CEILING, + /* ROUND[0] */ Ins_ROUND, + /* ROUND[1] */ Ins_ROUND, + /* ROUND[2] */ Ins_ROUND, + /* ROUND[3] */ Ins_ROUND, + /* NROUND[0] */ Ins_NROUND, + /* NROUND[1] */ Ins_NROUND, + /* NROUND[2] */ Ins_NROUND, + /* NROUND[3] */ Ins_NROUND, + + /* WCvtF */ Ins_WCVTF, + /* DeltaP2 */ Ins_DELTAP, + /* DeltaP3 */ Ins_DELTAP, + /* DeltaCn[0] */ Ins_DELTAC, + /* DeltaCn[1] */ Ins_DELTAC, + /* DeltaCn[2] */ Ins_DELTAC, + /* SROUND */ Ins_SROUND, + /* S45Round */ Ins_S45ROUND, + /* JROT */ Ins_JROT, + /* JROF */ Ins_JROF, + /* ROFF */ Ins_ROFF, + /* INS_0x7B */ Ins_UNKNOWN, + /* RUTG */ Ins_RUTG, + /* RDTG */ Ins_RDTG, + /* SANGW */ Ins_SANGW, + /* AA */ Ins_AA, + + /* FlipPT */ Ins_FLIPPT, + /* FlipRgON */ Ins_FLIPRGON, + /* FlipRgOFF */ Ins_FLIPRGOFF, + /* INS_0x83 */ Ins_UNKNOWN, + /* INS_0x84 */ Ins_UNKNOWN, + /* ScanCTRL */ Ins_SCANCTRL, + /* SDPVTL[0] */ Ins_SDPVTL, + /* SDPVTL[1] */ Ins_SDPVTL, + /* GetINFO */ Ins_GETINFO, + /* IDEF */ Ins_IDEF, + /* ROLL */ Ins_ROLL, + /* MAX */ Ins_MAX, + /* MIN */ Ins_MIN, + /* ScanTYPE */ Ins_SCANTYPE, + /* InstCTRL */ Ins_INSTCTRL, + /* INS_0x8F */ Ins_UNKNOWN, + + /* INS_0x90 */ Ins_UNKNOWN, + /* INS_0x91 */ Ins_UNKNOWN, + /* INS_0x92 */ Ins_UNKNOWN, + /* INS_0x93 */ Ins_UNKNOWN, + /* INS_0x94 */ Ins_UNKNOWN, + /* INS_0x95 */ Ins_UNKNOWN, + /* INS_0x96 */ Ins_UNKNOWN, + /* INS_0x97 */ Ins_UNKNOWN, + /* INS_0x98 */ Ins_UNKNOWN, + /* INS_0x99 */ Ins_UNKNOWN, + /* INS_0x9A */ Ins_UNKNOWN, + /* INS_0x9B */ Ins_UNKNOWN, + /* INS_0x9C */ Ins_UNKNOWN, + /* INS_0x9D */ Ins_UNKNOWN, + /* INS_0x9E */ Ins_UNKNOWN, + /* INS_0x9F */ Ins_UNKNOWN, + + /* INS_0xA0 */ Ins_UNKNOWN, + /* INS_0xA1 */ Ins_UNKNOWN, + /* INS_0xA2 */ Ins_UNKNOWN, + /* INS_0xA3 */ Ins_UNKNOWN, + /* INS_0xA4 */ Ins_UNKNOWN, + /* INS_0xA5 */ Ins_UNKNOWN, + /* INS_0xA6 */ Ins_UNKNOWN, + /* INS_0xA7 */ Ins_UNKNOWN, + /* INS_0xA8 */ Ins_UNKNOWN, + /* INS_0xA9 */ Ins_UNKNOWN, + /* INS_0xAA */ Ins_UNKNOWN, + /* INS_0xAB */ Ins_UNKNOWN, + /* INS_0xAC */ Ins_UNKNOWN, + /* INS_0xAD */ Ins_UNKNOWN, + /* INS_0xAE */ Ins_UNKNOWN, + /* INS_0xAF */ Ins_UNKNOWN, + + /* PushB[0] */ Ins_PUSHB, + /* PushB[1] */ Ins_PUSHB, + /* PushB[2] */ Ins_PUSHB, + /* PushB[3] */ Ins_PUSHB, + /* PushB[4] */ Ins_PUSHB, + /* PushB[5] */ Ins_PUSHB, + /* PushB[6] */ Ins_PUSHB, + /* PushB[7] */ Ins_PUSHB, + /* PushW[0] */ Ins_PUSHW, + /* PushW[1] */ Ins_PUSHW, + /* PushW[2] */ Ins_PUSHW, + /* PushW[3] */ Ins_PUSHW, + /* PushW[4] */ Ins_PUSHW, + /* PushW[5] */ Ins_PUSHW, + /* PushW[6] */ Ins_PUSHW, + /* PushW[7] */ Ins_PUSHW, + + /* MDRP[00] */ Ins_MDRP, + /* MDRP[01] */ Ins_MDRP, + /* MDRP[02] */ Ins_MDRP, + /* MDRP[03] */ Ins_MDRP, + /* MDRP[04] */ Ins_MDRP, + /* MDRP[05] */ Ins_MDRP, + /* MDRP[06] */ Ins_MDRP, + /* MDRP[07] */ Ins_MDRP, + /* MDRP[08] */ Ins_MDRP, + /* MDRP[09] */ Ins_MDRP, + /* MDRP[10] */ Ins_MDRP, + /* MDRP[11] */ Ins_MDRP, + /* MDRP[12] */ Ins_MDRP, + /* MDRP[13] */ Ins_MDRP, + /* MDRP[14] */ Ins_MDRP, + /* MDRP[15] */ Ins_MDRP, + + /* MDRP[16] */ Ins_MDRP, + /* MDRP[17] */ Ins_MDRP, + /* MDRP[18] */ Ins_MDRP, + /* MDRP[19] */ Ins_MDRP, + /* MDRP[20] */ Ins_MDRP, + /* MDRP[21] */ Ins_MDRP, + /* MDRP[22] */ Ins_MDRP, + /* MDRP[23] */ Ins_MDRP, + /* MDRP[24] */ Ins_MDRP, + /* MDRP[25] */ Ins_MDRP, + /* MDRP[26] */ Ins_MDRP, + /* MDRP[27] */ Ins_MDRP, + /* MDRP[28] */ Ins_MDRP, + /* MDRP[29] */ Ins_MDRP, + /* MDRP[30] */ Ins_MDRP, + /* MDRP[31] */ Ins_MDRP, + + /* MIRP[00] */ Ins_MIRP, + /* MIRP[01] */ Ins_MIRP, + /* MIRP[02] */ Ins_MIRP, + /* MIRP[03] */ Ins_MIRP, + /* MIRP[04] */ Ins_MIRP, + /* MIRP[05] */ Ins_MIRP, + /* MIRP[06] */ Ins_MIRP, + /* MIRP[07] */ Ins_MIRP, + /* MIRP[08] */ Ins_MIRP, + /* MIRP[09] */ Ins_MIRP, + /* MIRP[10] */ Ins_MIRP, + /* MIRP[11] */ Ins_MIRP, + /* MIRP[12] */ Ins_MIRP, + /* MIRP[13] */ Ins_MIRP, + /* MIRP[14] */ Ins_MIRP, + /* MIRP[15] */ Ins_MIRP, + + /* MIRP[16] */ Ins_MIRP, + /* MIRP[17] */ Ins_MIRP, + /* MIRP[18] */ Ins_MIRP, + /* MIRP[19] */ Ins_MIRP, + /* MIRP[20] */ Ins_MIRP, + /* MIRP[21] */ Ins_MIRP, + /* MIRP[22] */ Ins_MIRP, + /* MIRP[23] */ Ins_MIRP, + /* MIRP[24] */ Ins_MIRP, + /* MIRP[25] */ Ins_MIRP, + /* MIRP[26] */ Ins_MIRP, + /* MIRP[27] */ Ins_MIRP, + /* MIRP[28] */ Ins_MIRP, + /* MIRP[29] */ Ins_MIRP, + /* MIRP[30] */ Ins_MIRP, + /* MIRP[31] */ Ins_MIRP + }; + + +#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + + /*************************************************************************/ + /* */ + /* RUN */ + /* */ + /* This function executes a run of opcodes. It will exit in the */ + /* following cases: */ + /* */ + /* - Errors (in which case it returns FALSE). */ + /* */ + /* - Reaching the end of the main code range (returns TRUE). */ + /* Reaching the end of a code range within a function call is an */ + /* error. */ + /* */ + /* - After executing one single opcode, if the flag `Instruction_Trap' */ + /* is set to TRUE (returns TRUE). */ + /* */ + /* On exit with TRUE, test IP < CodeSize to know whether it comes from */ + /* an instruction trap or a normal termination. */ + /* */ + /* */ + /* Note: The documented DEBUG opcode pops a value from the stack. This */ + /* behaviour is unsupported; here a DEBUG opcode is always an */ + /* error. */ + /* */ + /* */ + /* THIS IS THE INTERPRETER'S MAIN LOOP. */ + /* */ + /* Instructions appear in the specification's order. */ + /* */ + /*************************************************************************/ + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( FT_Error ) + TT_RunIns( TT_ExecContext exc ) + { + FT_Long ins_counter = 0; /* executed instructions counter */ + + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + cur = *exc; +#endif + + /* set CVT functions */ + CUR.tt_metrics.ratio = 0; + if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem ) + { + /* non-square pixels, use the stretched routines */ + CUR.func_read_cvt = Read_CVT_Stretched; + CUR.func_write_cvt = Write_CVT_Stretched; + CUR.func_move_cvt = Move_CVT_Stretched; + } + else + { + /* square pixels, use normal routines */ + CUR.func_read_cvt = Read_CVT; + CUR.func_write_cvt = Write_CVT; + CUR.func_move_cvt = Move_CVT; + } + + COMPUTE_Funcs(); + COMPUTE_Round( (FT_Byte)exc->GS.round_state ); + + do + { + CUR.opcode = CUR.code[CUR.IP]; + + if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 ) + { + if ( CUR.IP + 1 > CUR.codeSize ) + goto LErrorCodeOverflow_; + + CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1]; + } + + if ( CUR.IP + CUR.length > CUR.codeSize ) + goto LErrorCodeOverflow_; + + /* First, let's check for empty stack and overflow */ + CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 ); + + /* `args' is the top of the stack once arguments have been popped. */ + /* One can also interpret it as the index of the last argument. */ + if ( CUR.args < 0 ) + { + 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 + + { + FT_Long* args = CUR.stack + CUR.args; + FT_Byte opcode = CUR.opcode; + + +#undef ARRAY_BOUND_ERROR +#define ARRAY_BOUND_ERROR goto Set_Invalid_Ref + + + switch ( opcode ) + { + case 0x00: /* SVTCA y */ + case 0x01: /* SVTCA x */ + case 0x02: /* SPvTCA y */ + case 0x03: /* SPvTCA x */ + case 0x04: /* SFvTCA y */ + case 0x05: /* SFvTCA x */ + { + FT_Short AA, BB; + + + AA = (FT_Short)( ( opcode & 1 ) << 14 ); + BB = (FT_Short)( AA ^ 0x4000 ); + + if ( opcode < 4 ) + { + CUR.GS.projVector.x = AA; + CUR.GS.projVector.y = BB; + + CUR.GS.dualVector.x = AA; + CUR.GS.dualVector.y = BB; + } + else + { + GUESS_VECTOR( projVector ); + } + + if ( ( opcode & 2 ) == 0 ) + { + CUR.GS.freeVector.x = AA; + CUR.GS.freeVector.y = BB; + } + else + { + GUESS_VECTOR( freeVector ); + } + + COMPUTE_Funcs(); + } + break; + + case 0x06: /* SPvTL // */ + case 0x07: /* SPvTL + */ + DO_SPVTL + break; + + case 0x08: /* SFvTL // */ + case 0x09: /* SFvTL + */ + DO_SFVTL + break; + + case 0x0A: /* SPvFS */ + DO_SPVFS + break; + + case 0x0B: /* SFvFS */ + DO_SFVFS + break; + + case 0x0C: /* GPV */ + DO_GPV + break; + + case 0x0D: /* GFV */ + DO_GFV + break; + + case 0x0E: /* SFvTPv */ + DO_SFVTPV + break; + + case 0x0F: /* ISECT */ + Ins_ISECT( EXEC_ARG_ args ); + break; + + case 0x10: /* SRP0 */ + DO_SRP0 + break; + + case 0x11: /* SRP1 */ + DO_SRP1 + break; + + case 0x12: /* SRP2 */ + DO_SRP2 + break; + + case 0x13: /* SZP0 */ + Ins_SZP0( EXEC_ARG_ args ); + break; + + case 0x14: /* SZP1 */ + Ins_SZP1( EXEC_ARG_ args ); + break; + + case 0x15: /* SZP2 */ + Ins_SZP2( EXEC_ARG_ args ); + break; + + case 0x16: /* SZPS */ + Ins_SZPS( EXEC_ARG_ args ); + break; + + case 0x17: /* SLOOP */ + DO_SLOOP + break; + + case 0x18: /* RTG */ + DO_RTG + break; + + case 0x19: /* RTHG */ + DO_RTHG + break; + + case 0x1A: /* SMD */ + DO_SMD + break; + + case 0x1B: /* ELSE */ + Ins_ELSE( EXEC_ARG_ args ); + break; + + case 0x1C: /* JMPR */ + DO_JMPR + break; + + case 0x1D: /* SCVTCI */ + DO_SCVTCI + break; + + case 0x1E: /* SSWCI */ + DO_SSWCI + break; + + case 0x1F: /* SSW */ + DO_SSW + break; + + case 0x20: /* DUP */ + DO_DUP + break; + + case 0x21: /* POP */ + /* nothing :-) */ + break; + + case 0x22: /* CLEAR */ + DO_CLEAR + break; + + case 0x23: /* SWAP */ + DO_SWAP + break; + + case 0x24: /* DEPTH */ + DO_DEPTH + break; + + case 0x25: /* CINDEX */ + DO_CINDEX + break; + + case 0x26: /* MINDEX */ + Ins_MINDEX( EXEC_ARG_ args ); + break; + + case 0x27: /* ALIGNPTS */ + Ins_ALIGNPTS( EXEC_ARG_ args ); + break; + + case 0x28: /* ???? */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x29: /* UTP */ + Ins_UTP( EXEC_ARG_ args ); + break; + + case 0x2A: /* LOOPCALL */ + Ins_LOOPCALL( EXEC_ARG_ args ); + break; + + case 0x2B: /* CALL */ + Ins_CALL( EXEC_ARG_ args ); + break; + + case 0x2C: /* FDEF */ + Ins_FDEF( EXEC_ARG_ args ); + break; + + case 0x2D: /* ENDF */ + Ins_ENDF( EXEC_ARG_ args ); + break; + + case 0x2E: /* MDAP */ + case 0x2F: /* MDAP */ + Ins_MDAP( EXEC_ARG_ args ); + break; + + + case 0x30: /* IUP */ + case 0x31: /* IUP */ + Ins_IUP( EXEC_ARG_ args ); + break; + + case 0x32: /* SHP */ + case 0x33: /* SHP */ + Ins_SHP( EXEC_ARG_ args ); + break; + + case 0x34: /* SHC */ + case 0x35: /* SHC */ + Ins_SHC( EXEC_ARG_ args ); + break; + + case 0x36: /* SHZ */ + case 0x37: /* SHZ */ + Ins_SHZ( EXEC_ARG_ args ); + break; + + case 0x38: /* SHPIX */ + Ins_SHPIX( EXEC_ARG_ args ); + break; + + case 0x39: /* IP */ + Ins_IP( EXEC_ARG_ args ); + break; + + case 0x3A: /* MSIRP */ + case 0x3B: /* MSIRP */ + Ins_MSIRP( EXEC_ARG_ args ); + break; + + case 0x3C: /* AlignRP */ + Ins_ALIGNRP( EXEC_ARG_ args ); + break; + + case 0x3D: /* RTDG */ + DO_RTDG + break; + + case 0x3E: /* MIAP */ + case 0x3F: /* MIAP */ + Ins_MIAP( EXEC_ARG_ args ); + break; + + case 0x40: /* NPUSHB */ + Ins_NPUSHB( EXEC_ARG_ args ); + break; + + case 0x41: /* NPUSHW */ + Ins_NPUSHW( EXEC_ARG_ args ); + break; + + case 0x42: /* WS */ + DO_WS + break; + + Set_Invalid_Ref: + CUR.error = TT_Err_Invalid_Reference; + break; + + case 0x43: /* RS */ + DO_RS + break; + + case 0x44: /* WCVTP */ + DO_WCVTP + break; + + case 0x45: /* RCVT */ + DO_RCVT + break; + + case 0x46: /* GC */ + case 0x47: /* GC */ + Ins_GC( EXEC_ARG_ args ); + break; + + case 0x48: /* SCFS */ + Ins_SCFS( EXEC_ARG_ args ); + break; + + case 0x49: /* MD */ + case 0x4A: /* MD */ + Ins_MD( EXEC_ARG_ args ); + break; + + case 0x4B: /* MPPEM */ + DO_MPPEM + break; + + case 0x4C: /* MPS */ + DO_MPS + break; + + case 0x4D: /* FLIPON */ + DO_FLIPON + break; + + case 0x4E: /* FLIPOFF */ + DO_FLIPOFF + break; + + case 0x4F: /* DEBUG */ + DO_DEBUG + break; + + case 0x50: /* LT */ + DO_LT + break; + + case 0x51: /* LTEQ */ + DO_LTEQ + break; + + case 0x52: /* GT */ + DO_GT + break; + + case 0x53: /* GTEQ */ + DO_GTEQ + break; + + case 0x54: /* EQ */ + DO_EQ + break; + + case 0x55: /* NEQ */ + DO_NEQ + break; + + case 0x56: /* ODD */ + DO_ODD + break; + + case 0x57: /* EVEN */ + DO_EVEN + break; + + case 0x58: /* IF */ + Ins_IF( EXEC_ARG_ args ); + break; + + case 0x59: /* EIF */ + /* do nothing */ + break; + + case 0x5A: /* AND */ + DO_AND + break; + + case 0x5B: /* OR */ + DO_OR + break; + + case 0x5C: /* NOT */ + DO_NOT + break; + + case 0x5D: /* DELTAP1 */ + Ins_DELTAP( EXEC_ARG_ args ); + break; + + case 0x5E: /* SDB */ + DO_SDB + break; + + case 0x5F: /* SDS */ + DO_SDS + break; + + case 0x60: /* ADD */ + DO_ADD + break; + + case 0x61: /* SUB */ + DO_SUB + break; + + case 0x62: /* DIV */ + DO_DIV + break; + + case 0x63: /* MUL */ + DO_MUL + break; + + case 0x64: /* ABS */ + DO_ABS + break; + + case 0x65: /* NEG */ + DO_NEG + break; + + case 0x66: /* FLOOR */ + DO_FLOOR + break; + + case 0x67: /* CEILING */ + DO_CEILING + break; + + case 0x68: /* ROUND */ + case 0x69: /* ROUND */ + case 0x6A: /* ROUND */ + case 0x6B: /* ROUND */ + DO_ROUND + break; + + case 0x6C: /* NROUND */ + case 0x6D: /* NROUND */ + case 0x6E: /* NRRUND */ + case 0x6F: /* NROUND */ + DO_NROUND + break; + + case 0x70: /* WCVTF */ + DO_WCVTF + break; + + case 0x71: /* DELTAP2 */ + case 0x72: /* DELTAP3 */ + Ins_DELTAP( EXEC_ARG_ args ); + break; + + case 0x73: /* DELTAC0 */ + case 0x74: /* DELTAC1 */ + case 0x75: /* DELTAC2 */ + Ins_DELTAC( EXEC_ARG_ args ); + break; + + case 0x76: /* SROUND */ + DO_SROUND + break; + + case 0x77: /* S45Round */ + DO_S45ROUND + break; + + case 0x78: /* JROT */ + DO_JROT + break; + + case 0x79: /* JROF */ + DO_JROF + break; + + case 0x7A: /* ROFF */ + DO_ROFF + break; + + case 0x7B: /* ???? */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x7C: /* RUTG */ + DO_RUTG + break; + + case 0x7D: /* RDTG */ + DO_RDTG + break; + + case 0x7E: /* SANGW */ + case 0x7F: /* AA */ + /* nothing - obsolete */ + break; + + case 0x80: /* FLIPPT */ + Ins_FLIPPT( EXEC_ARG_ args ); + break; + + case 0x81: /* FLIPRGON */ + Ins_FLIPRGON( EXEC_ARG_ args ); + break; + + case 0x82: /* FLIPRGOFF */ + Ins_FLIPRGOFF( EXEC_ARG_ args ); + break; + + case 0x83: /* UNKNOWN */ + case 0x84: /* UNKNOWN */ + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + case 0x85: /* SCANCTRL */ + Ins_SCANCTRL( EXEC_ARG_ args ); + break; + + case 0x86: /* SDPVTL */ + case 0x87: /* SDPVTL */ + Ins_SDPVTL( EXEC_ARG_ args ); + break; + + case 0x88: /* GETINFO */ + Ins_GETINFO( EXEC_ARG_ args ); + break; + + case 0x89: /* IDEF */ + Ins_IDEF( EXEC_ARG_ args ); + break; + + case 0x8A: /* ROLL */ + Ins_ROLL( EXEC_ARG_ args ); + break; + + case 0x8B: /* MAX */ + DO_MAX + break; + + case 0x8C: /* MIN */ + DO_MIN + break; + + case 0x8D: /* SCANTYPE */ + Ins_SCANTYPE( EXEC_ARG_ args ); + break; + + case 0x8E: /* INSTCTRL */ + Ins_INSTCTRL( EXEC_ARG_ args ); + break; + + case 0x8F: + Ins_UNKNOWN( EXEC_ARG_ args ); + break; + + default: + if ( opcode >= 0xE0 ) + Ins_MIRP( EXEC_ARG_ args ); + else if ( opcode >= 0xC0 ) + Ins_MDRP( EXEC_ARG_ args ); + else if ( opcode >= 0xB8 ) + Ins_PUSHW( EXEC_ARG_ args ); + else if ( opcode >= 0xB0 ) + Ins_PUSHB( EXEC_ARG_ args ); + else + Ins_UNKNOWN( EXEC_ARG_ args ); + } + + } + +#else + + Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] ); + +#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */ + + if ( CUR.error != TT_Err_Ok ) + { + switch ( CUR.error ) + { + case TT_Err_Invalid_Opcode: /* looking for redefined instructions */ + { + TT_DefRecord* def = CUR.IDefs; + TT_DefRecord* limit = def + CUR.numIDefs; + + + for ( ; def < limit; def++ ) + { + if ( def->active && CUR.opcode == (FT_Byte)def->opc ) + { + TT_CallRec* callrec; + + + if ( CUR.callTop >= CUR.callSize ) + { + CUR.error = TT_Err_Invalid_Reference; + goto LErrorLabel_; + } + + callrec = &CUR.callStack[CUR.callTop]; + + callrec->Caller_Range = CUR.curRange; + callrec->Caller_IP = CUR.IP + 1; + callrec->Cur_Count = 1; + callrec->Cur_Restart = def->start; + + if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE ) + goto LErrorLabel_; + + goto LSuiteLabel_; + } + } + } + + CUR.error = TT_Err_Invalid_Opcode; + goto LErrorLabel_; + +#if 0 + break; /* Unreachable code warning suppression. */ + /* Leave to remind in case a later change the editor */ + /* to consider break; */ +#endif + + default: + goto LErrorLabel_; + +#if 0 + break; +#endif + } + } + + CUR.top = CUR.new_top; + + if ( CUR.step_ins ) + CUR.IP += CUR.length; + + /* increment instruction counter and check if we didn't */ + /* run this program for too long (e.g. infinite loops). */ + if ( ++ins_counter > MAX_RUNNABLE_OPCODES ) + return TT_Err_Execution_Too_Long; + + LSuiteLabel_: + if ( CUR.IP >= CUR.codeSize ) + { + if ( CUR.callTop > 0 ) + { + CUR.error = TT_Err_Code_Overflow; + goto LErrorLabel_; + } + else + goto LNo_Error_; + } + } while ( !CUR.instruction_trap ); + + LNo_Error_: + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + *exc = cur; +#endif + + return TT_Err_Ok; + + LErrorCodeOverflow_: + CUR.error = TT_Err_Code_Overflow; + + LErrorLabel_: + +#ifdef TT_CONFIG_OPTION_STATIC_RASTER + *exc = cur; +#endif + + return CUR.error; + } + + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttinterp.h b/alienblaster/project/jni/freetype/src/truetype/ttinterp.h new file mode 100644 index 000000000..07a8972cb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttinterp.h @@ -0,0 +1,311 @@ +/***************************************************************************/ +/* */ +/* ttinterp.h */ +/* */ +/* TrueType bytecode interpreter (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTINTERP_H__ +#define __TTINTERP_H__ + +#include <ft2build.h> +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + +#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */ + +#define EXEC_OP_ TT_ExecContext exc, +#define EXEC_OP TT_ExecContext exc +#define EXEC_ARG_ exc, +#define EXEC_ARG exc + +#else /* static implementation */ + +#define EXEC_OP_ /* void */ +#define EXEC_OP /* void */ +#define EXEC_ARG_ /* void */ +#define EXEC_ARG /* void */ + +#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* Rounding mode constants. */ + /* */ +#define TT_Round_Off 5 +#define TT_Round_To_Half_Grid 0 +#define TT_Round_To_Grid 1 +#define TT_Round_To_Double_Grid 2 +#define TT_Round_Up_To_Grid 4 +#define TT_Round_Down_To_Grid 3 +#define TT_Round_Super 6 +#define TT_Round_Super_45 7 + + + /*************************************************************************/ + /* */ + /* Function types used by the interpreter, depending on various modes */ + /* (e.g. the rounding mode, whether to render a vertical or horizontal */ + /* line etc). */ + /* */ + /*************************************************************************/ + + /* Rounding function */ + typedef FT_F26Dot6 + (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6 distance, + FT_F26Dot6 compensation ); + + /* Point displacement along the freedom vector routine */ + typedef void + (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ); + + /* Distance projection along one of the projection vectors */ + typedef FT_F26Dot6 + (*TT_Project_Func)( EXEC_OP_ FT_Pos dx, + FT_Pos dy ); + + /* reading a cvt value. Take care of non-square pixels if necessary */ + typedef FT_F26Dot6 + (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong idx ); + + /* setting or moving a cvt value. Take care of non-square pixels */ + /* if necessary */ + typedef void + (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong idx, + FT_F26Dot6 value ); + + + /*************************************************************************/ + /* */ + /* This structure defines a call record, used to manage function calls. */ + /* */ + typedef struct TT_CallRec_ + { + FT_Int Caller_Range; + FT_Long Caller_IP; + FT_Long Cur_Count; + FT_Long Cur_Restart; + + } TT_CallRec, *TT_CallStack; + + + /*************************************************************************/ + /* */ + /* The main structure for the interpreter which collects all necessary */ + /* variables and states. */ + /* */ + typedef struct TT_ExecContextRec_ + { + TT_Face face; + TT_Size size; + FT_Memory memory; + + /* instructions state */ + + FT_Error error; /* last execution error */ + + FT_Long top; /* top of exec. stack */ + + FT_UInt stackSize; /* size of exec. stack */ + FT_Long* stack; /* current exec. stack */ + + FT_Long args; + FT_UInt new_top; /* new top after exec. */ + + TT_GlyphZoneRec zp0, /* zone records */ + zp1, + zp2, + pts, + twilight; + + FT_Size_Metrics metrics; + TT_Size_Metrics tt_metrics; /* size metrics */ + + TT_GraphicsState GS; /* current graphics state */ + + FT_Int curRange; /* current code range number */ + FT_Byte* code; /* current code range */ + FT_Long IP; /* current instruction pointer */ + FT_Long codeSize; /* size of current range */ + + FT_Byte opcode; /* current opcode */ + FT_Int length; /* length of current opcode */ + + FT_Bool step_ins; /* true if the interpreter must */ + /* increment IP after ins. exec */ + FT_Long cvtSize; + FT_Long* cvt; + + FT_UInt glyphSize; /* glyph instructions buffer size */ + FT_Byte* glyphIns; /* glyph instructions buffer */ + + FT_UInt numFDefs; /* number of function defs */ + FT_UInt maxFDefs; /* maximum number of function defs */ + TT_DefArray FDefs; /* table of FDefs entries */ + + FT_UInt numIDefs; /* number of instruction defs */ + FT_UInt maxIDefs; /* maximum number of ins defs */ + TT_DefArray IDefs; /* table of IDefs entries */ + + FT_UInt maxFunc; /* maximum function index */ + FT_UInt maxIns; /* maximum instruction index */ + + FT_Int callTop, /* top of call stack during execution */ + callSize; /* size of call stack */ + TT_CallStack callStack; /* call stack */ + + FT_UShort maxPoints; /* capacity of this context's `pts' */ + FT_Short maxContours; /* record, expressed in points and */ + /* contours. */ + + TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */ + /* useful for the debugger */ + + FT_UShort storeSize; /* size of current storage */ + FT_Long* storage; /* storage area */ + + FT_F26Dot6 period; /* values used for the */ + FT_F26Dot6 phase; /* `SuperRounding' */ + FT_F26Dot6 threshold; + +#if 0 + /* this seems to be unused */ + FT_Int cur_ppem; /* ppem along the current proj vector */ +#endif + + FT_Bool instruction_trap; /* If `True', the interpreter will */ + /* exit after each instruction */ + + TT_GraphicsState default_GS; /* graphics state resulting from */ + /* the prep program */ + FT_Bool is_composite; /* true if the glyph is composite */ + FT_Bool pedantic_hinting; /* true if pedantic interpretation */ + + /* latest interpreter additions */ + + FT_Long F_dot_P; /* dot product of freedom and projection */ + /* vectors */ + TT_Round_Func func_round; /* current rounding function */ + + TT_Project_Func func_project, /* current projection function */ + func_dualproj, /* current dual proj. function */ + func_freeProj; /* current freedom proj. func */ + + TT_Move_Func func_move; /* current point move function */ + TT_Move_Func func_move_orig; /* move original position function */ + + TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ + TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ + TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ + + FT_Bool grayscale; /* are we hinting for grayscale? */ + + } TT_ExecContextRec; + + + extern const TT_GraphicsState tt_default_graphics_state; + + + FT_LOCAL( FT_Error ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ); + + FT_LOCAL( FT_Error ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ); + + FT_LOCAL( FT_Error ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_New_Context */ + /* */ + /* <Description> */ + /* Queries the face context for a given font. Note that there is */ + /* now a _single_ execution context in the TrueType driver which is */ + /* shared among faces. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* A handle to the execution context. Initialized for `face'. */ + /* */ + /* <Note> */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_EXPORT( TT_ExecContext ) + TT_New_Context( TT_Driver driver ); + + FT_LOCAL( FT_Error ) + TT_Done_Context( TT_ExecContext exec ); + + FT_LOCAL( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ); + + FT_LOCAL( FT_Error ) + TT_Save_Context( TT_ExecContext exec, + TT_Size ins ); + + FT_LOCAL( FT_Error ) + TT_Run_Context( TT_ExecContext exec, + FT_Bool debug ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* TT_RunIns */ + /* */ + /* <Description> */ + /* Executes one or more instruction in the execution context. This */ + /* is the main function of the TrueType opcode interpreter. */ + /* */ + /* <Input> */ + /* exec :: A handle to the target execution context. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only the object manager and debugger should call this function. */ + /* */ + /* This function is publicly exported because it is directly */ + /* invoked by the TrueType debugger. */ + /* */ + FT_EXPORT( FT_Error ) + TT_RunIns( TT_ExecContext exec ); + + +FT_END_HEADER + +#endif /* __TTINTERP_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttobjs.c b/alienblaster/project/jni/freetype/src/truetype/ttobjs.c new file mode 100644 index 000000000..11d662d2d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttobjs.c @@ -0,0 +1,951 @@ +/***************************************************************************/ +/* */ +/* ttobjs.c */ +/* */ +/* Objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_SFNT_H + +#include "ttgload.h" +#include "ttpload.h" + +#include "tterrors.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING +#include FT_TRUETYPE_UNPATENTED_H +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttobjs + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* GLYPH ZONE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_glyphzone_done */ + /* */ + /* <Description> */ + /* Deallocate a glyph zone. */ + /* */ + /* <Input> */ + /* zone :: A pointer to the target glyph zone. */ + /* */ + FT_LOCAL_DEF( void ) + tt_glyphzone_done( TT_GlyphZone zone ) + { + FT_Memory memory = zone->memory; + + + if ( memory ) + { + FT_FREE( zone->contours ); + FT_FREE( zone->tags ); + FT_FREE( zone->cur ); + FT_FREE( zone->org ); + FT_FREE( zone->orus ); + + zone->max_points = zone->n_points = 0; + zone->max_contours = zone->n_contours = 0; + zone->memory = NULL; + } + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_glyphzone_new */ + /* */ + /* <Description> */ + /* Allocate a new glyph zone. */ + /* */ + /* <Input> */ + /* memory :: A handle to the current memory object. */ + /* */ + /* maxPoints :: The capacity of glyph zone in points. */ + /* */ + /* maxContours :: The capacity of glyph zone in contours. */ + /* */ + /* <Output> */ + /* zone :: A pointer to the target glyph zone record. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ) + { + FT_Error error; + + + FT_MEM_ZERO( zone, sizeof ( *zone ) ); + zone->memory = memory; + + if ( FT_NEW_ARRAY( zone->org, maxPoints ) || + FT_NEW_ARRAY( zone->cur, maxPoints ) || + FT_NEW_ARRAY( zone->orus, maxPoints ) || + FT_NEW_ARRAY( zone->tags, maxPoints ) || + FT_NEW_ARRAY( zone->contours, maxContours ) ) + { + tt_glyphzone_done( zone ); + } + else + { + zone->max_points = maxPoints; + zone->max_contours = maxContours; + } + + return error; + } +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* Compare the face with a list of well-known `tricky' fonts. */ + /* This list shall be expanded as we find more of them. */ + + static FT_Bool + tt_check_trickyness( FT_String* name ) + { +#define TRICK_NAMES_MAX_CHARACTERS 16 +#define TRICK_NAMES_COUNT 7 + static const char trick_names[TRICK_NAMES_COUNT][TRICK_NAMES_MAX_CHARACTERS+1] = + { + "DFKaiSho-SB", /* dfkaisb.ttf */ + "DFKaiShu", + "DFKai-SB", /* kaiu.ttf */ + "HuaTianSongTi?", /* htst3.ttf */ + "MingLiU", /* mingliu.ttf & mingliu.ttc */ + "PMingLiU", /* mingliu.ttc */ + "MingLi43", /* mingli.ttf */ + }; + int nn; + + + if ( !name ) + return FALSE; + + /* Note that we only check the face name at the moment; it might */ + /* be worth to do more checks for a few special cases. */ + for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) + if ( ft_strstr( name, trick_names[nn] ) ) + return TRUE; + + return FALSE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_init */ + /* */ + /* <Description> */ + /* Initialize a given TrueType face object. */ + /* */ + /* <Input> */ + /* stream :: The source font stream. */ + /* */ + /* face_index :: The index of the font face in the resource. */ + /* */ + /* num_params :: Number of additional generic parameters. Ignored. */ + /* */ + /* params :: Additional generic parameters. Ignored. */ + /* */ + /* <InOut> */ + /* face :: The newly built face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library; + SFNT_Service sfnt; + TT_Face face = (TT_Face)ttface; + + + library = ttface->driver->root.library; + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + goto Bad_Format; + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check that we have a valid TrueType file */ + error = sfnt->init_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + + /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ + /* The 0x00020000 tag is completely undocumented; some fonts from */ + /* Arphic made for Chinese Windows 3.1 have this. */ + if ( face->format_tag != 0x00010000L && /* MS fonts */ + face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ + face->format_tag != TTAG_true ) /* Mac fonts */ + { + FT_TRACE2(( "[not a valid TTF font]\n" )); + goto Bad_Format; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + ttface->face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* If we are performing a simple font format check, exit immediately. */ + if ( face_index < 0 ) + return TT_Err_Ok; + + /* Load font directory */ + error = sfnt->load_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + + if ( tt_check_trickyness( ttface->family_name ) ) + ttface->face_flags |= FT_FACE_FLAG_TRICKY; + + error = tt_face_load_hdmx( face, stream ); + if ( error ) + goto Exit; + + if ( FT_IS_SCALABLE( ttface ) ) + { + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( !ttface->internal->incremental_interface ) + error = tt_face_load_loca( face, stream ); + if ( !error ) + error = tt_face_load_cvt( face, stream ); + if ( !error ) + error = tt_face_load_fpgm( face, stream ); + if ( !error ) + error = tt_face_load_prep( face, stream ); + +#else + + if ( !error ) + error = tt_face_load_loca( face, stream ); + if ( !error ) + error = tt_face_load_cvt( face, stream ); + if ( !error ) + error = tt_face_load_fpgm( face, stream ); + if ( !error ) + error = tt_face_load_prep( face, stream ); + +#endif + + } + +#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \ + !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER ) + + { + FT_Bool unpatented_hinting; + int i; + + + /* Determine whether unpatented hinting is to be used for this face. */ + unpatented_hinting = FT_BOOL + ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL ); + + for ( i = 0; i < num_params && !face->unpatented_hinting; i++ ) + if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING ) + unpatented_hinting = TRUE; + + if ( !unpatented_hinting ) + ttface->internal->ignore_unpatented_hinter = TRUE; + } + +#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING && + !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + /* initialize standard glyph loading routines */ + TT_Init_Glyph_Loading( face ); + + Exit: + return error; + + Bad_Format: + error = TT_Err_Unknown_File_Format; + goto Exit; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_done */ + /* */ + /* <Description> */ + /* Finalize a given face object. */ + /* */ + /* <Input> */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_done( FT_Face ttface ) /* TT_Face */ + { + TT_Face face = (TT_Face)ttface; + FT_Memory memory; + FT_Stream stream; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = ttface->memory; + stream = ttface->stream; + sfnt = (SFNT_Service)face->sfnt; + + /* for `extended TrueType formats' (i.e. compressed versions) */ + if ( face->extra.finalizer ) + face->extra.finalizer( face->extra.data ); + + if ( sfnt ) + sfnt->done_face( face ); + + /* freeing the locations table */ + tt_face_done_loca( face ); + + tt_face_free_hdmx( face ); + + /* freeing the CVT */ + FT_FREE( face->cvt ); + face->cvt_size = 0; + + /* freeing the programs */ + FT_FRAME_RELEASE( face->font_program ); + FT_FRAME_RELEASE( face->cvt_program ); + face->font_program_size = 0; + face->cvt_program_size = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + tt_done_blend( memory, face->blend ); + face->blend = NULL; +#endif + } + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_run_fpgm */ + /* */ + /* <Description> */ + /* Run the font program. */ + /* */ + /* <Input> */ + /* size :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_fpgm( TT_Size size ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + /* debugging instances have their own context */ + if ( size->debug ) + exec = size->context; + else + exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + TT_Load_Context( exec, face, size ); + + exec->callTop = 0; + exec->top = 0; + + exec->period = 64; + exec->phase = 0; + exec->threshold = 0; + + exec->instruction_trap = FALSE; + exec->F_dot_P = 0x10000L; + + { + FT_Size_Metrics* metrics = &exec->metrics; + TT_Size_Metrics* tt_metrics = &exec->tt_metrics; + + + metrics->x_ppem = 0; + metrics->y_ppem = 0; + metrics->x_scale = 0; + metrics->y_scale = 0; + + tt_metrics->ppem = 0; + tt_metrics->scale = 0; + tt_metrics->ratio = 0x10000L; + } + + /* allow font program execution */ + TT_Set_CodeRange( exec, + tt_coderange_font, + face->font_program, + face->font_program_size ); + + /* disable CVT and glyph programs coderange */ + TT_Clear_CodeRange( exec, tt_coderange_cvt ); + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->font_program_size > 0 ) + { + error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); + + if ( !error ) + error = face->interpreter( exec ); + } + else + error = TT_Err_Ok; + + if ( !error ) + TT_Save_Context( exec, size ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_run_prep */ + /* */ + /* <Description> */ + /* Run the control value program. */ + /* */ + /* <Input> */ + /* size :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_prep( TT_Size size ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + /* debugging instances have their own context */ + if ( size->debug ) + exec = size->context; + else + exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context; + + if ( !exec ) + return TT_Err_Could_Not_Find_Context; + + TT_Load_Context( exec, face, size ); + + exec->callTop = 0; + exec->top = 0; + + exec->instruction_trap = FALSE; + + TT_Set_CodeRange( exec, + tt_coderange_cvt, + face->cvt_program, + face->cvt_program_size ); + + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->cvt_program_size > 0 ) + { + error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); + + if ( !error && !size->debug ) + error = face->interpreter( exec ); + } + else + error = TT_Err_Ok; + + /* save as default graphics state */ + size->GS = exec->GS; + + TT_Save_Context( exec, size ); + + return error; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + static void + tt_size_done_bytecode( FT_Size ftsize ) + { + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + + + if ( size->debug ) + { + /* the debug context must be deleted by the debugger itself */ + size->context = NULL; + size->debug = FALSE; + } + + FT_FREE( size->cvt ); + size->cvt_size = 0; + + /* free storage area */ + FT_FREE( size->storage ); + size->storage_size = 0; + + /* twilight zone */ + tt_glyphzone_done( &size->twilight ); + + FT_FREE( size->function_defs ); + FT_FREE( size->instruction_defs ); + + size->num_function_defs = 0; + size->max_function_defs = 0; + size->num_instruction_defs = 0; + size->max_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->bytecode_ready = 0; + size->cvt_ready = 0; + } + + + /* Initialize bytecode-related fields in the size object. */ + /* We do this only if bytecode interpretation is really needed. */ + static FT_Error + tt_size_init_bytecode( FT_Size ftsize ) + { + FT_Error error; + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + FT_Int i; + + FT_UShort n_twilight; + TT_MaxProfile* maxp = &face->max_profile; + + + size->bytecode_ready = 1; + size->cvt_ready = 0; + + size->max_function_defs = maxp->maxFunctionDefs; + size->max_instruction_defs = maxp->maxInstructionDefs; + + size->num_function_defs = 0; + size->num_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->cvt_size = face->cvt_size; + size->storage_size = maxp->maxStorage; + + /* Set default metrics */ + { + TT_Size_Metrics* metrics = &size->ttmetrics; + + + metrics->rotated = FALSE; + metrics->stretched = FALSE; + + /* set default compensation (all 0) */ + for ( i = 0; i < 4; i++ ) + metrics->compensations[i] = 0; + } + + /* allocate function defs, instruction defs, cvt, and storage area */ + if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || + FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || + FT_NEW_ARRAY( size->cvt, size->cvt_size ) || + FT_NEW_ARRAY( size->storage, size->storage_size ) ) + goto Exit; + + /* reserve twilight zone */ + n_twilight = maxp->maxTwilightPoints; + + /* there are 4 phantom points (do we need this?) */ + n_twilight += 4; + + error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); + if ( error ) + goto Exit; + + size->twilight.n_points = n_twilight; + + size->GS = tt_default_graphics_state; + + /* set `face->interpreter' according to the debug hook present */ + { + FT_Library library = face->root.driver->root.library; + + + face->interpreter = (TT_Interpreter) + library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; + if ( !face->interpreter ) + face->interpreter = (TT_Interpreter)TT_RunIns; + } + + /* Fine, now run the font program! */ + error = tt_size_run_fpgm( size ); + + Exit: + if ( error ) + tt_size_done_bytecode( ftsize ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_size_ready_bytecode( TT_Size size ) + { + FT_Error error = TT_Err_Ok; + + + if ( !size->bytecode_ready ) + { + error = tt_size_init_bytecode( (FT_Size)size ); + if ( error ) + goto Exit; + } + + /* rescale CVT when needed */ + if ( !size->cvt_ready ) + { + FT_UInt i; + TT_Face face = (TT_Face)size->root.face; + + + /* Scale the cvt values to the new ppem. */ + /* We use by default the y ppem to scale the CVT. */ + for ( i = 0; i < size->cvt_size; i++ ) + size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); + + /* all twilight points are originally zero */ + for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) + { + size->twilight.org[i].x = 0; + size->twilight.org[i].y = 0; + size->twilight.cur[i].x = 0; + size->twilight.cur[i].y = 0; + } + + /* clear storage area */ + for ( i = 0; i < (FT_UInt)size->storage_size; i++ ) + size->storage[i] = 0; + + size->GS = tt_default_graphics_state; + + error = tt_size_run_prep( size ); + if ( !error ) + size->cvt_ready = 1; + } + + Exit: + return error; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_init */ + /* */ + /* <Description> */ + /* Initialize a new TrueType size object. */ + /* */ + /* <InOut> */ + /* size :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_init( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + FT_Error error = TT_Err_Ok; + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->bytecode_ready = 0; + size->cvt_ready = 0; +#endif + + size->ttmetrics.valid = FALSE; + size->strike_index = 0xFFFFFFFFUL; + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_done */ + /* */ + /* <Description> */ + /* The TrueType size object finalizer. */ + /* */ + /* <Input> */ + /* size :: A handle to the target size object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_size_done( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + if ( size->bytecode_ready ) + tt_size_done_bytecode( ttsize ); +#endif + + size->ttmetrics.valid = FALSE; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_size_reset */ + /* */ + /* <Description> */ + /* Reset a TrueType size when resolutions and character dimensions */ + /* have been changed. */ + /* */ + /* <Input> */ + /* size :: A handle to the target size object. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_reset( TT_Size size ) + { + TT_Face face; + FT_Error error = TT_Err_Ok; + FT_Size_Metrics* metrics; + + + size->ttmetrics.valid = FALSE; + + face = (TT_Face)size->root.face; + + metrics = &size->metrics; + + /* copy the result from base layer */ + *metrics = size->root.metrics; + + if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 ) + return TT_Err_Invalid_PPem; + + /* This bit flag, if set, indicates that the ppems must be */ + /* rounded to integers. Nearly all TrueType fonts have this bit */ + /* set, as hinting won't work really well otherwise. */ + /* */ + if ( face->header.Flags & 8 ) + { + metrics->x_scale = FT_DivFix( metrics->x_ppem << 6, + face->root.units_per_EM ); + metrics->y_scale = FT_DivFix( metrics->y_ppem << 6, + face->root.units_per_EM ); + + metrics->ascender = + FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) ); + metrics->descender = + FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) ); + metrics->height = + FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) ); + metrics->max_advance = + FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width, + metrics->x_scale ) ); + } + + /* compute new transformation */ + if ( metrics->x_ppem >= metrics->y_ppem ) + { + size->ttmetrics.scale = metrics->x_scale; + size->ttmetrics.ppem = metrics->x_ppem; + size->ttmetrics.x_ratio = 0x10000L; + size->ttmetrics.y_ratio = FT_MulDiv( metrics->y_ppem, + 0x10000L, + metrics->x_ppem ); + } + else + { + size->ttmetrics.scale = metrics->y_scale; + size->ttmetrics.ppem = metrics->y_ppem; + size->ttmetrics.x_ratio = FT_MulDiv( metrics->x_ppem, + 0x10000L, + metrics->y_ppem ); + size->ttmetrics.y_ratio = 0x10000L; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->cvt_ready = 0; +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + if ( !error ) + size->ttmetrics.valid = TRUE; + + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_driver_init */ + /* */ + /* <Description> */ + /* Initialize a given TrueType driver object. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target driver object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ + { + +#ifdef TT_USE_BYTECODE_INTERPRETER + + TT_Driver driver = (TT_Driver)ttdriver; + + + if ( !TT_New_Context( driver ) ) + return TT_Err_Could_Not_Find_Context; + +#else + + FT_UNUSED( ttdriver ); + +#endif + + return TT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_driver_done */ + /* */ + /* <Description> */ + /* Finalize a given TrueType driver. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target TrueType driver. */ + /* */ + FT_LOCAL_DEF( void ) + tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ + { +#ifdef TT_USE_BYTECODE_INTERPRETER + TT_Driver driver = (TT_Driver)ttdriver; + + + /* destroy the execution context */ + if ( driver->context ) + { + TT_Done_Context( driver->context ); + driver->context = NULL; + } +#else + FT_UNUSED( ttdriver ); +#endif + + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_slot_init */ + /* */ + /* <Description> */ + /* Initialize a new slot object. */ + /* */ + /* <InOut> */ + /* slot :: A handle to the slot object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ) + { + return FT_GlyphLoader_CreateExtra( slot->internal->loader ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttobjs.h b/alienblaster/project/jni/freetype/src/truetype/ttobjs.h new file mode 100644 index 000000000..30c8669cb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttobjs.h @@ -0,0 +1,431 @@ +/***************************************************************************/ +/* */ +/* ttobjs.h */ +/* */ +/* Objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTOBJS_H__ +#define __TTOBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_Driver */ + /* */ + /* <Description> */ + /* A handle to a TrueType driver object. */ + /* */ + typedef struct TT_DriverRec_* TT_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_Instance */ + /* */ + /* <Description> */ + /* A handle to a TrueType size object. */ + /* */ + typedef struct TT_SizeRec_* TT_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a TrueType glyph slot object. */ + /* */ + /* <Note> */ + /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ + /* specific about the TrueType glyph slot. */ + /* */ + typedef FT_GlyphSlot TT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GraphicsState */ + /* */ + /* <Description> */ + /* The TrueType graphics state used during bytecode interpretation. */ + /* */ + typedef struct TT_GraphicsState_ + { + FT_UShort rp0; + FT_UShort rp1; + FT_UShort rp2; + + FT_UnitVector dualVector; + FT_UnitVector projVector; + FT_UnitVector freeVector; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + FT_Bool both_x_axis; +#endif + + FT_Long loop; + FT_F26Dot6 minimum_distance; + FT_Int round_state; + + FT_Bool auto_flip; + FT_F26Dot6 control_value_cutin; + FT_F26Dot6 single_width_cutin; + FT_F26Dot6 single_width_value; + FT_Short delta_base; + FT_Short delta_shift; + + FT_Byte instruct_control; + /* According to Greg Hitchcock from Microsoft, the `scan_control' */ + /* variable as documented in the TrueType specification is a 32-bit */ + /* integer; the high-word part holds the SCANTYPE value, the low-word */ + /* part the SCANCTRL value. We separate it into two fields. */ + FT_Bool scan_control; + FT_Int scan_type; + + FT_UShort gep0; + FT_UShort gep1; + FT_UShort gep2; + + } TT_GraphicsState; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( void ) + tt_glyphzone_done( TT_GlyphZone zone ); + + FT_LOCAL( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + + /*************************************************************************/ + /* */ + /* EXECUTION SUBTABLES */ + /* */ + /* These sub-tables relate to instruction execution. */ + /* */ + /*************************************************************************/ + + +#define TT_MAX_CODE_RANGES 3 + + + /*************************************************************************/ + /* */ + /* There can only be 3 active code ranges at once: */ + /* - the Font Program */ + /* - the CVT Program */ + /* - a glyph's instructions set */ + /* */ + typedef enum TT_CodeRange_Tag_ + { + tt_coderange_none = 0, + tt_coderange_font, + tt_coderange_cvt, + tt_coderange_glyph + + } TT_CodeRange_Tag; + + + typedef struct TT_CodeRange_ + { + FT_Byte* base; + FT_ULong size; + + } TT_CodeRange; + + typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; + + + /*************************************************************************/ + /* */ + /* Defines a function/instruction definition record. */ + /* */ + typedef struct TT_DefRecord_ + { + FT_Int range; /* in which code range is it located? */ + FT_Long start; /* where does it start? */ + FT_UInt opc; /* function #, or instruction code */ + FT_Bool active; /* is it active? */ + + } TT_DefRecord, *TT_DefArray; + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct TT_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } TT_Transform; + + + /*************************************************************************/ + /* */ + /* A note regarding non-squared pixels: */ + /* */ + /* (This text will probably go into some docs at some time; for now, it */ + /* is kept here to explain some definitions in the TT_Size_Metrics */ + /* record). */ + /* */ + /* The CVT is a one-dimensional array containing values that control */ + /* certain important characteristics in a font, like the height of all */ + /* capitals, all lowercase letter, default spacing or stem width/height. */ + /* */ + /* These values are found in FUnits in the font file, and must be scaled */ + /* to pixel coordinates before being used by the CVT and glyph programs. */ + /* Unfortunately, when using distinct x and y resolutions (or distinct x */ + /* and y pointsizes), there are two possible scalings. */ + /* */ + /* A first try was to implement a `lazy' scheme where all values were */ + /* scaled when first used. However, while some values are always used */ + /* in the same direction, some others are used under many different */ + /* circumstances and orientations. */ + /* */ + /* I have found a simpler way to do the same, and it even seems to work */ + /* in most of the cases: */ + /* */ + /* - All CVT values are scaled to the maximum ppem size. */ + /* */ + /* - When performing a read or write in the CVT, a ratio factor is used */ + /* to perform adequate scaling. Example: */ + /* */ + /* x_ppem = 14 */ + /* y_ppem = 10 */ + /* */ + /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */ + /* entries are scaled to it. */ + /* */ + /* x_ratio = 1.0 */ + /* y_ratio = y_ppem/ppem (< 1.0) */ + /* */ + /* We compute the current ratio like: */ + /* */ + /* - If projVector is horizontal, */ + /* ratio = x_ratio = 1.0 */ + /* */ + /* - if projVector is vertical, */ + /* ratio = y_ratio */ + /* */ + /* - else, */ + /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */ + /* */ + /* Reading a cvt value returns */ + /* ratio * cvt[index] */ + /* */ + /* Writing a cvt value in pixels: */ + /* cvt[index] / ratio */ + /* */ + /* The current ppem is simply */ + /* ratio * ppem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Metrics used by the TrueType size and context objects. */ + /* */ + typedef struct TT_Size_Metrics_ + { + /* for non-square pixels */ + FT_Long x_ratio; + FT_Long y_ratio; + + FT_UShort ppem; /* maximum ppem size */ + FT_Long ratio; /* current ratio */ + FT_Fixed scale; + + FT_F26Dot6 compensations[4]; /* device-specific compensations */ + + FT_Bool valid; + + FT_Bool rotated; /* `is the glyph rotated?'-flag */ + FT_Bool stretched; /* `is the glyph stretched?'-flag */ + + } TT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* TrueType size class. */ + /* */ + typedef struct TT_SizeRec_ + { + FT_SizeRec root; + + /* we have our own copy of metrics so that we can modify */ + /* it without affecting auto-hinting (when used) */ + FT_Size_Metrics metrics; + + TT_Size_Metrics ttmetrics; + + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_UInt num_function_defs; /* number of function definitions */ + FT_UInt max_function_defs; + TT_DefArray function_defs; /* table of function definitions */ + + FT_UInt num_instruction_defs; /* number of ins. definitions */ + FT_UInt max_instruction_defs; + TT_DefArray instruction_defs; /* table of ins. definitions */ + + FT_UInt max_func; + FT_UInt max_ins; + + TT_CodeRangeTable codeRangeTable; + + TT_GraphicsState GS; + + FT_ULong cvt_size; /* the scaled control value table */ + FT_Long* cvt; + + FT_UShort storage_size; /* The storage area is now part of */ + FT_Long* storage; /* the instance */ + + TT_GlyphZoneRec twilight; /* The instance's twilight zone */ + + /* debugging variables */ + + /* When using the debugger, we must keep the */ + /* execution context tied to the instance */ + /* object rather than asking it on demand. */ + + FT_Bool debug; + TT_ExecContext context; + + FT_Bool bytecode_ready; + FT_Bool cvt_ready; + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + } TT_SizeRec; + + + /*************************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct TT_DriverRec_ + { + FT_DriverRec root; + TT_ExecContext context; /* execution context */ + TT_GlyphZoneRec zone; /* glyph loader points zone */ + + void* extension_component; + + } TT_DriverRec; + + + /* Note: All of the functions below (except tt_size_reset()) are used */ + /* as function pointers in a FT_Driver_ClassRec. Therefore their */ + /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ + /* TT_Size, etc., so that the compiler can confirm that the types and */ + /* number of parameters are correct. In all cases the FT_xxx types are */ + /* cast to their TT_xxx counterparts inside the functions since FreeType */ + /* will always use the TT driver to create them. */ + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + tt_face_done( FT_Face ttface ); /* TT_Face */ + + + /*************************************************************************/ + /* */ + /* Size functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_size_init( FT_Size ttsize ); /* TT_Size */ + + FT_LOCAL( void ) + tt_size_done( FT_Size ttsize ); /* TT_Size */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( FT_Error ) + tt_size_run_fpgm( TT_Size size ); + + FT_LOCAL( FT_Error ) + tt_size_run_prep( TT_Size size ); + + FT_LOCAL( FT_Error ) + tt_size_ready_bytecode( TT_Size size ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + FT_LOCAL( FT_Error ) + tt_size_reset( TT_Size size ); + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ + + FT_LOCAL( void ) + tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ + + + /*************************************************************************/ + /* */ + /* Slot functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ); + + +FT_END_HEADER + +#endif /* __TTOBJS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttpic.c b/alienblaster/project/jni/freetype/src/truetype/ttpic.c new file mode 100644 index 000000000..27ec4a1d5 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttpic.c @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* ttpic.c */ +/* */ +/* The FreeType position independent code services for truetype module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "ttpic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ttdriver.c */ + FT_Error FT_Create_Class_tt_services( FT_Library, FT_ServiceDescRec**); + void FT_Destroy_Class_tt_services( FT_Library, FT_ServiceDescRec*); + void FT_Init_Class_tt_service_gx_multi_masters(FT_Service_MultiMastersRec*); + void FT_Init_Class_tt_service_truetype_glyf(FT_Service_TTGlyfRec*); + + void + tt_driver_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + if ( pic_container->truetype ) + { + TTModulePIC* container = (TTModulePIC*)pic_container->truetype; + if(container->tt_services) + FT_Destroy_Class_tt_services(library, container->tt_services); + container->tt_services = NULL; + FT_FREE( container ); + pic_container->truetype = NULL; + } + } + + FT_Error + tt_driver_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + TTModulePIC* container; + FT_Memory memory = library->memory; + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof(*container) ); + pic_container->truetype = container; + + /* initialize pointer table - this is how the module usually expects this data */ + error = FT_Create_Class_tt_services(library, &container->tt_services); + if(error) + goto Exit; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Init_Class_tt_service_gx_multi_masters(&container->tt_service_gx_multi_masters); +#endif + FT_Init_Class_tt_service_truetype_glyf(&container->tt_service_truetype_glyf); +Exit: + if(error) + tt_driver_class_pic_free(library); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttpic.h b/alienblaster/project/jni/freetype/src/truetype/ttpic.h new file mode 100644 index 000000000..84de0fee9 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttpic.h @@ -0,0 +1,59 @@ +/***************************************************************************/ +/* */ +/* ttpic.h */ +/* */ +/* The FreeType position independent code services for truetype module. */ +/* */ +/* Copyright 2009 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTPIC_H__ +#define __TTPIC_H__ + + +FT_BEGIN_HEADER + +#ifndef FT_CONFIG_OPTION_PIC +#define FT_TT_SERVICES_GET tt_services +#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters +#define FT_TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_TRUETYPE_GLYF_H + + typedef struct TTModulePIC_ + { + FT_ServiceDescRec* tt_services; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Service_MultiMastersRec tt_service_gx_multi_masters; +#endif + FT_Service_TTGlyfRec tt_service_truetype_glyf; + } TTModulePIC; + +#define GET_PIC(lib) ((TTModulePIC*)((lib)->pic_container.truetype)) +#define FT_TT_SERVICES_GET (GET_PIC(library)->tt_services) +#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET (GET_PIC(library)->tt_service_gx_multi_masters) +#define FT_TT_SERVICE_TRUETYPE_GLYF_GET (GET_PIC(library)->tt_service_truetype_glyf) + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* __TTPIC_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttpload.c b/alienblaster/project/jni/freetype/src/truetype/ttpload.c new file mode 100644 index 000000000..a311b03c0 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttpload.c @@ -0,0 +1,572 @@ +/***************************************************************************/ +/* */ +/* ttpload.c */ +/* */ +/* TrueType-specific tables loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_ttpload + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_loca */ + /* */ + /* <Description> */ + /* Load the locations table. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_len; + FT_Int shift; + + + /* we need the size of the `glyf' table for malformed `loca' tables */ + error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len ); + + /* it is possible that a font doesn't have a glyf table at all */ + /* or its size is zero */ + if ( error == TT_Err_Table_Missing ) + face->glyf_len = 0; + else if ( error ) + goto Exit; + + FT_TRACE2(( "Locations " )); + error = face->goto_table( face, TTAG_loca, stream, &table_len ); + if ( error ) + { + error = TT_Err_Locations_Missing; + goto Exit; + } + + if ( face->header.Index_To_Loc_Format != 0 ) + { + shift = 2; + + if ( table_len >= 0x40000L ) + { + FT_TRACE2(( "table too large\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + face->num_locations = table_len >> shift; + } + else + { + shift = 1; + + if ( table_len >= 0x20000L ) + { + FT_TRACE2(( "table too large\n" )); + error = TT_Err_Invalid_Table; + goto Exit; + } + face->num_locations = table_len >> shift; + } + + if ( face->num_locations != (FT_ULong)face->root.num_glyphs ) + { + FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n", + face->num_locations, face->root.num_glyphs )); + + /* we only handle the case where `maxp' gives a larger value */ + if ( face->num_locations < (FT_ULong)face->root.num_glyphs ) + { + FT_Long new_loca_len = (FT_Long)face->root.num_glyphs << shift; + + TT_Table entry = face->dir_tables; + TT_Table limit = entry + face->num_tables; + + FT_Long pos = FT_Stream_Pos( stream ); + FT_Long dist = 0x7FFFFFFFL; + + + /* compute the distance to next table in font file */ + for ( ; entry < limit; entry++ ) + { + FT_Long diff = entry->Offset - pos; + + + if ( diff > 0 && diff < dist ) + dist = diff; + } + + if ( new_loca_len <= dist ) + { + face->num_locations = face->root.num_glyphs; + table_len = new_loca_len; + + FT_TRACE2(( "adjusting num_locations to %d\n", + face->num_locations )); + } + } + } + + /* + * Extract the frame. We don't need to decompress it since + * we are able to parse it directly. + */ + if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) ) + goto Exit; + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ) + { + FT_ULong pos1, pos2; + FT_Byte* p; + FT_Byte* p_limit; + + + pos1 = pos2 = 0; + + if ( gindex < face->num_locations ) + { + if ( face->header.Index_To_Loc_Format != 0 ) + { + p = face->glyph_locations + gindex * 4; + p_limit = face->glyph_locations + face->num_locations * 4; + + pos1 = FT_NEXT_ULONG( p ); + pos2 = pos1; + + if ( p + 4 <= p_limit ) + pos2 = FT_NEXT_ULONG( p ); + } + else + { + p = face->glyph_locations + gindex * 2; + p_limit = face->glyph_locations + face->num_locations * 2; + + pos1 = FT_NEXT_USHORT( p ); + pos2 = pos1; + + if ( p + 2 <= p_limit ) + pos2 = FT_NEXT_USHORT( p ); + + pos1 <<= 1; + pos2 <<= 1; + } + } + + /* The `loca' table must be ordered; it refers to the length of */ + /* an entry as the difference between the current and the next */ + /* position. However, there do exist (malformed) fonts which */ + /* don't obey this rule, so we are only able to provide an */ + /* upper bound for the size. */ + /* */ + /* We get (intentionally) a wrong, non-zero result in case the */ + /* `glyf' table is missing. */ + if ( pos2 >= pos1 ) + *asize = (FT_UInt)( pos2 - pos1 ); + else + *asize = (FT_UInt)( face->glyf_len - pos1 ); + + return pos1; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_loca( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->glyph_locations ); + face->num_locations = 0; + } + + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_cvt */ + /* */ + /* <Description> */ + /* Load the control value table into a face object. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_len; + + + FT_TRACE2(( "CVT " )); + + error = face->goto_table( face, TTAG_cvt, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + + face->cvt_size = 0; + face->cvt = NULL; + error = TT_Err_Ok; + + goto Exit; + } + + face->cvt_size = table_len / 2; + + if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) ) + goto Exit; + + if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) + goto Exit; + + { + FT_Short* cur = face->cvt; + FT_Short* limit = cur + face->cvt_size; + + + for ( ; cur < limit; cur++ ) + *cur = FT_GET_SHORT(); + } + + FT_FRAME_EXIT(); + FT_TRACE2(( "loaded\n" )); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( face->doblend ) + error = tt_face_vary_cvt( face, stream ); +#endif + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_fpgm */ + /* */ + /* <Description> */ + /* Load the font program. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Font program " )); + + /* The font program is optional */ + error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); + if ( error ) + { + face->font_program = NULL; + face->font_program_size = 0; + error = TT_Err_Ok; + + FT_TRACE2(( "is missing\n" )); + } + else + { + face->font_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_prep */ + /* */ + /* <Description> */ + /* Load the cvt program. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Prep program " )); + + error = face->goto_table( face, TTAG_prep, stream, &table_len ); + if ( error ) + { + face->cvt_program = NULL; + face->cvt_program_size = 0; + error = TT_Err_Ok; + + FT_TRACE2(( "is missing\n" )); + } + else + { + face->cvt_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return TT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* tt_face_load_hdmx */ + /* */ + /* <Description> */ + /* Load the `hdmx' table into the face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt version, nn, num_records; + FT_ULong table_size, record_size; + FT_Byte* p; + FT_Byte* limit; + + + /* this table is optional */ + error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); + if ( error || table_size < 8 ) + return TT_Err_Ok; + + if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) + goto Exit; + + p = face->hdmx_table; + limit = p + table_size; + + version = FT_NEXT_USHORT( p ); + num_records = FT_NEXT_USHORT( p ); + record_size = FT_NEXT_ULONG( p ); + + /* The maximum number of bytes in an hdmx device record is the */ + /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is */ + /* the reason why `record_size' is a long (which we read as */ + /* unsigned long for convenience). In practice, two bytes */ + /* sufficient to hold the size value. */ + /* */ + /* There are at least two fonts, HANNOM-A and HANNOM-B version */ + /* 2.0 (2005), which get this wrong: The upper two bytes of */ + /* the size value are set to 0xFF instead of 0x00. We catch */ + /* and fix this. */ + + if ( record_size >= 0xFFFF0000UL ) + record_size &= 0xFFFFU; + + /* The limit for `num_records' is a heuristic value. */ + + if ( version != 0 || num_records > 255 || record_size > 0x10001L ) + { + error = TT_Err_Invalid_File_Format; + goto Fail; + } + + if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) ) + goto Fail; + + for ( nn = 0; nn < num_records; nn++ ) + { + if ( p + record_size > limit ) + break; + + face->hdmx_record_sizes[nn] = p[0]; + p += record_size; + } + + face->hdmx_record_count = nn; + face->hdmx_table_size = table_size; + face->hdmx_record_size = record_size; + + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->hdmx_table ); + face->hdmx_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_hdmx( TT_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + + + FT_FREE( face->hdmx_record_sizes ); + FT_FRAME_RELEASE( face->hdmx_table ); + } + + + /*************************************************************************/ + /* */ + /* Return the advance width table for a given pixel size if it is found */ + /* in the font's `hdmx' table (if any). */ + /* */ + FT_LOCAL_DEF( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ) + { + FT_UInt nn; + FT_Byte* result = NULL; + FT_ULong record_size = face->hdmx_record_size; + FT_Byte* record = face->hdmx_table + 8; + + + for ( nn = 0; nn < face->hdmx_record_count; nn++ ) + if ( face->hdmx_record_sizes[nn] == ppem ) + { + gindex += 2; + if ( gindex < record_size ) + result = record + nn * record_size + gindex; + break; + } + + return result; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/truetype/ttpload.h b/alienblaster/project/jni/freetype/src/truetype/ttpload.h new file mode 100644 index 000000000..f61ac079c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/truetype/ttpload.h @@ -0,0 +1,75 @@ +/***************************************************************************/ +/* */ +/* ttpload.h */ +/* */ +/* TrueType-specific tables loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTPLOAD_H__ +#define __TTPLOAD_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ); + + FT_LOCAL( void ) + tt_face_done_loca( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( void ) + tt_face_free_hdmx( TT_Face face ); + + + FT_LOCAL( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ); + +FT_END_HEADER + +#endif /* __TTPLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/Jamfile b/alienblaster/project/jni/freetype/src/type1/Jamfile new file mode 100644 index 000000000..8e366baae --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/type1 Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) type1 ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = t1afm t1driver t1objs t1load t1gload t1parse ; + } + else + { + _sources = type1 ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/type1 Jamfile diff --git a/alienblaster/project/jni/freetype/src/type1/module.mk b/alienblaster/project/jni/freetype/src/type1/module.mk new file mode 100644 index 000000000..ade0210d7 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Type1 module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE1_DRIVER + +define TYPE1_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)type1 $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/type1/rules.mk b/alienblaster/project/jni/freetype/src/type1/rules.mk new file mode 100644 index 000000000..15087b030 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/rules.mk @@ -0,0 +1,73 @@ +# +# FreeType 2 Type1 driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Type1 driver directory +# +T1_DIR := $(SRC_DIR)/type1 + + +# compilation flags for the driver +# +T1_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T1_DIR)) + + +# Type1 driver sources (i.e., C files) +# +T1_DRV_SRC := $(T1_DIR)/t1parse.c \ + $(T1_DIR)/t1load.c \ + $(T1_DIR)/t1driver.c \ + $(T1_DIR)/t1afm.c \ + $(T1_DIR)/t1gload.c \ + $(T1_DIR)/t1objs.c + +# Type1 driver headers +# +T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \ + $(T1_DIR)/t1tokens.h \ + $(T1_DIR)/t1errors.h + + +# Type1 driver object(s) +# +# T1_DRV_OBJ_M is used during `multi' builds +# T1_DRV_OBJ_S is used during `single' builds +# +T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O) +T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O + +# Type1 driver source file for single build +# +T1_DRV_SRC_S := $(T1_DIR)/type1.c + + +# Type1 driver - single object +# +$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H) + $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S)) + + +# Type1 driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H) + $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(T1_DRV_OBJ_S) +DRV_OBJS_M += $(T1_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/type1/t1afm.c b/alienblaster/project/jni/freetype/src/type1/t1afm.c new file mode 100644 index 000000000..ef343901a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1afm.c @@ -0,0 +1,396 @@ +/***************************************************************************/ +/* */ +/* t1afm.c */ +/* */ +/* AFM support for Type 1 fonts (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "t1afm.h" +#include "t1errors.h" +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1afm + + + FT_LOCAL_DEF( void ) + T1_Done_Metrics( FT_Memory memory, + AFM_FontInfo fi ) + { + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi ); + } + + + /* read a glyph name and return the equivalent glyph index */ + static FT_Int + t1_get_index( const char* name, + FT_Offset len, + void* user_data ) + { + T1_Font type1 = (T1_Font)user_data; + FT_Int n; + + + /* PS string/name length must be < 16-bit */ + if ( len > 0xFFFFU ) + return 0; + + for ( n = 0; n < type1->num_glyphs; n++ ) + { + char* gname = (char*)type1->glyph_names[n]; + + + if ( gname && gname[0] == name[0] && + ft_strlen( gname ) == len && + ft_strncmp( gname, name, len ) == 0 ) + return n; + } + + return 0; + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) + + + /* compare two kerning pairs */ + FT_CALLBACK_DEF( int ) + compare_kern_pairs( const void* a, + const void* b ) + { + AFM_KernPair pair1 = (AFM_KernPair)a; + AFM_KernPair pair2 = (AFM_KernPair)b; + + FT_ULong index1 = KERN_INDEX( pair1->index1, pair1->index2 ); + FT_ULong index2 = KERN_INDEX( pair2->index1, pair2->index2 ); + + + if ( index1 > index2 ) + return 1; + else if ( index1 < index2 ) + return -1; + else + return 0; + } + + + /* parse a PFM file -- for now, only read the kerning pairs */ + static FT_Error + T1_Read_PFM( FT_Face t1_face, + FT_Stream stream, + AFM_FontInfo fi ) + { + FT_Error error = T1_Err_Ok; + FT_Memory memory = stream->memory; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* p; + AFM_KernPair kp; + FT_Int width_table_length; + FT_CharMap oldcharmap; + FT_CharMap charmap; + FT_Int n; + + + start = (FT_Byte*)stream->cursor; + limit = (FT_Byte*)stream->limit; + p = start; + + /* Figure out how long the width table is. */ + /* This info is a little-endian short at offset 99. */ + p = start + 99; + if ( p + 2 > limit ) + { + error = T1_Err_Unknown_File_Format; + goto Exit; + } + width_table_length = FT_PEEK_USHORT_LE( p ); + + p += 18 + width_table_length; + if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 ) + /* extension table is probably optional */ + goto Exit; + + /* Kerning offset is 14 bytes from start of extensions table. */ + p += 14; + p = start + FT_PEEK_ULONG_LE( p ); + + if ( p == start ) + /* zero offset means no table */ + goto Exit; + + if ( p + 2 > limit ) + { + error = T1_Err_Unknown_File_Format; + goto Exit; + } + + fi->NumKernPair = FT_PEEK_USHORT_LE( p ); + p += 2; + if ( p + 4 * fi->NumKernPair > limit ) + { + error = T1_Err_Unknown_File_Format; + goto Exit; + } + + /* Actually, kerning pairs are simply optional! */ + if ( fi->NumKernPair == 0 ) + goto Exit; + + /* allocate the pairs */ + if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) + goto Exit; + + /* now, read each kern pair */ + kp = fi->KernPairs; + limit = p + 4 * fi->NumKernPair; + + /* PFM kerning data are stored by encoding rather than glyph index, */ + /* so find the PostScript charmap of this font and install it */ + /* temporarily. If we find no PostScript charmap, then just use */ + /* the default and hope it is the right one. */ + oldcharmap = t1_face->charmap; + charmap = NULL; + + for ( n = 0; n < t1_face->num_charmaps; n++ ) + { + charmap = t1_face->charmaps[n]; + /* check against PostScript pseudo platform */ + if ( charmap->platform_id == 7 ) + { + error = FT_Set_Charmap( t1_face, charmap ); + if ( error ) + goto Exit; + break; + } + } + + /* Kerning info is stored as: */ + /* */ + /* encoding of first glyph (1 byte) */ + /* encoding of second glyph (1 byte) */ + /* offset (little-endian short) */ + for ( ; p < limit ; p += 4 ) + { + kp->index1 = FT_Get_Char_Index( t1_face, p[0] ); + kp->index2 = FT_Get_Char_Index( t1_face, p[1] ); + + kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2); + kp->y = 0; + + kp++; + } + + if ( oldcharmap != NULL ) + error = FT_Set_Charmap( t1_face, oldcharmap ); + if ( error ) + goto Exit; + + /* now, sort the kern pairs according to their glyph indices */ + ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ), + compare_kern_pairs ); + + Exit: + if ( error ) + { + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + } + + return error; + } + + + /* parse a metrics file -- either AFM or PFM depending on what */ + /* it turns out to be */ + FT_LOCAL_DEF( FT_Error ) + T1_Read_Metrics( FT_Face t1_face, + FT_Stream stream ) + { + PSAux_Service psaux; + FT_Memory memory = stream->memory; + AFM_ParserRec parser; + AFM_FontInfo fi; + FT_Error error = T1_Err_Unknown_File_Format; + T1_Font t1_font = &( (T1_Face)t1_face )->type1; + + + if ( FT_NEW( fi ) || + FT_FRAME_ENTER( stream->size ) ) + goto Exit; + + fi->FontBBox = t1_font->font_bbox; + fi->Ascender = t1_font->font_bbox.yMax; + fi->Descender = t1_font->font_bbox.yMin; + + psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux; + if ( psaux && psaux->afm_parser_funcs ) + { + error = psaux->afm_parser_funcs->init( &parser, + stream->memory, + stream->cursor, + stream->limit ); + + if ( !error ) + { + parser.FontInfo = fi; + parser.get_index = t1_get_index; + parser.user_data = t1_font; + + error = psaux->afm_parser_funcs->parse( &parser ); + psaux->afm_parser_funcs->done( &parser ); + } + } + + if ( error == T1_Err_Unknown_File_Format ) + { + FT_Byte* start = stream->cursor; + + + /* MS Windows allows versions up to 0x3FF without complaining */ + if ( stream->size > 6 && + start[1] < 4 && + FT_PEEK_ULONG_LE( start + 2 ) == stream->size ) + error = T1_Read_PFM( t1_face, stream, fi ); + } + + if ( !error ) + { + t1_font->font_bbox = fi->FontBBox; + + t1_face->bbox.xMin = fi->FontBBox.xMin >> 16; + t1_face->bbox.yMin = fi->FontBBox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16; + t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16; + + /* no `U' suffix here to 0x8000! */ + t1_face->ascender = (FT_Short)( ( fi->Ascender + 0x8000 ) >> 16 ); + t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 ); + + if ( fi->NumKernPair ) + { + t1_face->face_flags |= FT_FACE_FLAG_KERNING; + ( (T1_Face)t1_face )->afm_data = fi; + fi = NULL; + } + } + + FT_FRAME_EXIT(); + + Exit: + if ( fi != NULL ) + T1_Done_Metrics( memory, fi ); + + return error; + } + + + /* find the kerning for a given glyph pair */ + FT_LOCAL_DEF( void ) + T1_Get_Kerning( AFM_FontInfo fi, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ) + { + AFM_KernPair min, mid, max; + FT_ULong idx = KERN_INDEX( glyph1, glyph2 ); + + + /* simple binary search */ + min = fi->KernPairs; + max = min + fi->NumKernPair - 1; + + while ( min <= max ) + { + FT_ULong midi; + + + mid = min + ( max - min ) / 2; + midi = KERN_INDEX( mid->index1, mid->index2 ); + + if ( midi == idx ) + { + kerning->x = mid->x; + kerning->y = mid->y; + + return; + } + + if ( midi < idx ) + min = mid + 1; + else + max = mid - 1; + } + + kerning->x = 0; + kerning->y = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Track_Kerning( FT_Face face, + FT_Fixed ptsize, + FT_Int degree, + FT_Fixed* kerning ) + { + AFM_FontInfo fi = (AFM_FontInfo)( (T1_Face)face )->afm_data; + FT_Int i; + + + if ( !fi ) + return T1_Err_Invalid_Argument; + + for ( i = 0; i < fi->NumTrackKern; i++ ) + { + AFM_TrackKern tk = fi->TrackKerns + i; + + + if ( tk->degree != degree ) + continue; + + if ( ptsize < tk->min_ptsize ) + *kerning = tk->min_kern; + else if ( ptsize > tk->max_ptsize ) + *kerning = tk->max_kern; + else + { + *kerning = FT_MulDiv( ptsize - tk->min_ptsize, + tk->max_kern - tk->min_kern, + tk->max_ptsize - tk->min_ptsize ) + + tk->min_kern; + } + } + + return T1_Err_Ok; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1afm.h b/alienblaster/project/jni/freetype/src/type1/t1afm.h new file mode 100644 index 000000000..8eb1764de --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1afm.h @@ -0,0 +1,54 @@ +/***************************************************************************/ +/* */ +/* t1afm.h */ +/* */ +/* AFM support for Type 1 fonts (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1AFM_H__ +#define __T1AFM_H__ + +#include <ft2build.h> +#include "t1objs.h" +#include FT_INTERNAL_TYPE1_TYPES_H + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + T1_Read_Metrics( FT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + T1_Done_Metrics( FT_Memory memory, + AFM_FontInfo fi ); + + FT_LOCAL( void ) + T1_Get_Kerning( AFM_FontInfo fi, + FT_UInt glyph1, + FT_UInt glyph2, + FT_Vector* kerning ); + + FT_LOCAL( FT_Error ) + T1_Get_Track_Kerning( FT_Face face, + FT_Fixed ptsize, + FT_Int degree, + FT_Fixed* kerning ); + +FT_END_HEADER + +#endif /* __T1AFM_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1driver.c b/alienblaster/project/jni/freetype/src/type1/t1driver.c new file mode 100644 index 000000000..8c398eee2 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1driver.c @@ -0,0 +1,331 @@ +/***************************************************************************/ +/* */ +/* t1driver.c */ +/* */ +/* Type 1 driver interface (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "t1driver.h" +#include "t1gload.h" +#include "t1load.h" + +#include "t1errors.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.h" +#endif + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H + +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_KERNING_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1driver + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + t1_get_glyph_name( T1_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); + + return T1_Err_Ok; + } + + + static FT_UInt + t1_get_name_index( T1_Face face, + FT_String* glyph_name ) + { + FT_Int i; + FT_String* gname; + + + for ( i = 0; i < face->type1.num_glyphs; i++ ) + { + gname = face->type1.glyph_names[i]; + + if ( !ft_strcmp( glyph_name, gname ) ) + return (FT_UInt)i; + } + + return 0; + } + + + static const FT_Service_GlyphDictRec t1_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) t1_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)t1_get_name_index + }; + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + t1_get_ps_name( T1_Face face ) + { + return (const char*) face->type1.font_name; + } + + + static const FT_Service_PsFontNameRec t1_service_ps_name = + { + (FT_PsName_GetFunc)t1_get_ps_name + }; + + + /* + * MULTIPLE MASTERS SERVICE + * + */ + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + static const FT_Service_MultiMastersRec t1_service_multi_masters = + { + (FT_Get_MM_Func) T1_Get_Multi_Master, + (FT_Set_MM_Design_Func) T1_Set_MM_Design, + (FT_Set_MM_Blend_Func) T1_Set_MM_Blend, + (FT_Get_MM_Var_Func) T1_Get_MM_Var, + (FT_Set_Var_Design_Func)T1_Set_Var_Design + }; +#endif + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + t1_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((T1_Face)face)->type1.font_info; + + return T1_Err_Ok; + } + + + static FT_Error + t1_ps_get_font_extra( FT_Face face, + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ((T1_Face)face)->type1.font_extra; + + return T1_Err_Ok; + } + + + static FT_Int + t1_ps_has_glyph_names( FT_Face face ) + { + FT_UNUSED( face ); + + return 1; + } + + + static FT_Error + t1_ps_get_font_private( FT_Face face, + PS_PrivateRec* afont_private ) + { + *afont_private = ((T1_Face)face)->type1.private_dict; + + return T1_Err_Ok; + } + + + static const FT_Service_PsInfoRec t1_service_ps_info = + { + (PS_GetFontInfoFunc) t1_ps_get_font_info, + (PS_GetFontExtraFunc) t1_ps_get_font_extra, + (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names, + (PS_GetFontPrivateFunc)t1_ps_get_font_private, + }; + + +#ifndef T1_CONFIG_OPTION_NO_AFM + static const FT_Service_KerningRec t1_service_kerning = + { + T1_Get_Track_Kerning, + }; +#endif + + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec t1_services[] = + { + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name }, + { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_1 }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info }, + +#ifndef T1_CONFIG_OPTION_NO_AFM + { FT_SERVICE_ID_KERNING, &t1_service_kerning }, +#endif + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters }, +#endif + { NULL, NULL } + }; + + + static FT_Module_Interface + Get_Interface( FT_Driver driver, + const FT_String* t1_interface ) + { + FT_UNUSED( driver ); + + return ft_service_list_lookup( t1_services, t1_interface ); + } + + +#ifndef T1_CONFIG_OPTION_NO_AFM + + /*************************************************************************/ + /* */ + /* <Function> */ + /* Get_Kerning */ + /* */ + /* <Description> */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* <Output> */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + static FT_Error + Get_Kerning( T1_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + kerning->x = 0; + kerning->y = 0; + + if ( face->afm_data ) + T1_Get_Kerning( (AFM_FontInfo)face->afm_data, + left_glyph, + right_glyph, + kerning ); + + return T1_Err_Ok; + } + + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec t1_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER, + + sizeof( FT_DriverRec ), + + "type1", + 0x10000L, + 0x20000L, + + 0, /* format interface */ + + (FT_Module_Constructor)T1_Driver_Init, + (FT_Module_Destructor) T1_Driver_Done, + (FT_Module_Requester) Get_Interface, + }, + + sizeof( T1_FaceRec ), + sizeof( T1_SizeRec ), + sizeof( T1_GlyphSlotRec ), + + (FT_Face_InitFunc) T1_Face_Init, + (FT_Face_DoneFunc) T1_Face_Done, + (FT_Size_InitFunc) T1_Size_Init, + (FT_Size_DoneFunc) T1_Size_Done, + (FT_Slot_InitFunc) T1_GlyphSlot_Init, + (FT_Slot_DoneFunc) T1_GlyphSlot_Done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + (FT_Slot_LoadFunc) T1_Load_Glyph, + +#ifdef T1_CONFIG_OPTION_NO_AFM + (FT_Face_GetKerningFunc) 0, + (FT_Face_AttachFunc) 0, +#else + (FT_Face_GetKerningFunc) Get_Kerning, + (FT_Face_AttachFunc) T1_Read_Metrics, +#endif + (FT_Face_GetAdvancesFunc) T1_Get_Advances, + (FT_Size_RequestFunc) T1_Size_Request, + (FT_Size_SelectFunc) 0 + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1driver.h b/alienblaster/project/jni/freetype/src/type1/t1driver.h new file mode 100644 index 000000000..9fecbeb0f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1driver.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* t1driver.h */ +/* */ +/* High-level Type 1 driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1DRIVER_H__ +#define __T1DRIVER_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) t1_driver_class; + + +FT_END_HEADER + +#endif /* __T1DRIVER_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1errors.h b/alienblaster/project/jni/freetype/src/type1/t1errors.h new file mode 100644 index 000000000..81221c343 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1errors.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* t1errors.h */ +/* */ +/* Type 1 error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Type 1 error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __T1ERRORS_H__ +#define __T1ERRORS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX T1_Err_ +#define FT_ERR_BASE FT_Mod_Err_Type1 + +#include FT_ERRORS_H + +#endif /* __T1ERRORS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1gload.c b/alienblaster/project/jni/freetype/src/type1/t1gload.c new file mode 100644 index 000000000..f3fad4f5d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1gload.c @@ -0,0 +1,515 @@ +/***************************************************************************/ +/* */ +/* t1gload.c */ +/* */ +/* Type 1 Glyph Loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include "t1gload.h" +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_OUTLINE_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "t1errors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1gload + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL_DEF( FT_Error ) + T1_Parse_Glyph_And_Get_Char_String( T1_Decoder decoder, + FT_UInt glyph_index, + FT_Data* char_string ) + { + T1_Face face = (T1_Face)decoder->builder.face; + T1_Font type1 = &face->type1; + FT_Error error = T1_Err_Ok; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec *inc = + face->root.internal->incremental_interface; +#endif + + + decoder->font_matrix = type1->font_matrix; + decoder->font_offset = type1->font_offset; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( inc ) + error = inc->funcs->get_glyph_data( inc->object, + glyph_index, char_string ); + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* For ordinary fonts get the character data stored in the face record. */ + { + char_string->pointer = type1->charstrings[glyph_index]; + char_string->length = (FT_Int)type1->charstrings_len[glyph_index]; + } + + if ( !error ) + error = decoder->funcs.parse_charstrings( + decoder, (FT_Byte*)char_string->pointer, + char_string->length ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && inc && inc->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x ); + metrics.bearing_y = 0; + metrics.advance = FIXED_TO_INT( decoder->builder.advance.x ); + metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y ); + + error = inc->funcs->get_glyph_metrics( inc->object, + glyph_index, FALSE, &metrics ); + + decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x ); + decoder->builder.advance.x = INT_TO_FIXED( metrics.advance ); + decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v ); + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + T1_Parse_Glyph( T1_Decoder decoder, + FT_UInt glyph_index ) + { + FT_Data glyph_data; + FT_Error error = T1_Parse_Glyph_And_Get_Char_String( + decoder, glyph_index, &glyph_data ); + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( !error ) + { + T1_Face face = (T1_Face)decoder->builder.face; + + + if ( face->root.internal->incremental_interface ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Compute_Max_Advance( T1_Face face, + FT_Pos* max_advance ) + { + FT_Error error; + T1_DecoderRec decoder; + FT_Int glyph_index; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + *max_advance = 0; + + /* initialize load decoder */ + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + (FT_Byte**)type1->glyph_names, + face->blend, + 0, + FT_RENDER_MODE_NORMAL, + T1_Parse_Glyph ); + if ( error ) + return error; + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + *max_advance = 0; + + /* for each glyph, parse the glyph charstring and extract */ + /* the advance width */ + for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ ) + { + /* now get load the unscaled outline */ + error = T1_Parse_Glyph( &decoder, glyph_index ); + if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance ) + *max_advance = decoder.builder.advance.x; + + /* ignore the error if one occurred - skip to next glyph */ + } + + psaux->t1_decoder_funcs->done( &decoder ); + + return T1_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Advances( T1_Face face, + FT_UInt first, + FT_UInt count, + FT_ULong load_flags, + FT_Fixed* advances ) + { + T1_DecoderRec decoder; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + FT_UInt nn; + FT_Error error; + + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + for ( nn = 0; nn < count; nn++ ) + advances[nn] = 0; + + return T1_Err_Ok; + } + + error = psaux->t1_decoder_funcs->init( &decoder, + (FT_Face)face, + 0, /* size */ + 0, /* glyph slot */ + (FT_Byte**)type1->glyph_names, + face->blend, + 0, + FT_RENDER_MODE_NORMAL, + T1_Parse_Glyph ); + if ( error ) + return error; + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + for ( nn = 0; nn < count; nn++ ) + { + error = T1_Parse_Glyph( &decoder, first + nn ); + if ( !error ) + advances[nn] = FIXED_TO_INT( decoder.builder.advance.x ); + else + advances[nn] = 0; + } + + return T1_Err_Ok; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Load_Glyph( T1_GlyphSlot glyph, + T1_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + T1_DecoderRec decoder; + T1_Face face = (T1_Face)glyph->root.face; + FT_Bool hinting; + T1_Font type1 = &face->type1; + PSAux_Service psaux = (PSAux_Service)face->psaux; + const T1_Decoder_Funcs decoder_funcs = psaux->t1_decoder_funcs; + + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_Data glyph_data; + FT_Bool must_finish_decoder = FALSE; +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Bool glyph_data_loaded = 0; +#endif + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_index >= (FT_UInt)face->root.num_glyphs && + !face->root.internal->incremental_interface ) +#else + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + error = T1_Err_Invalid_Argument; + goto Exit; + } + + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + if ( size ) + { + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; + } + else + { + glyph->x_scale = 0x10000L; + glyph->y_scale = 0x10000L; + } + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + error = decoder_funcs->init( &decoder, + (FT_Face)face, + (FT_Size)size, + (FT_GlyphSlot)glyph, + (FT_Byte**)type1->glyph_names, + face->blend, + FT_BOOL( hinting ), + FT_LOAD_TARGET_MODE( load_flags ), + T1_Parse_Glyph ); + if ( error ) + goto Exit; + + must_finish_decoder = TRUE; + + decoder.builder.no_recurse = FT_BOOL( + ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ); + + decoder.num_subrs = type1->num_subrs; + decoder.subrs = type1->subrs; + decoder.subrs_len = type1->subrs_len; + + decoder.buildchar = face->buildchar; + decoder.len_buildchar = face->len_buildchar; + + /* now load the unscaled outline */ + error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index, + &glyph_data ); + if ( error ) + goto Exit; +#ifdef FT_CONFIG_OPTION_INCREMENTAL + glyph_data_loaded = 1; +#endif + + font_matrix = decoder.font_matrix; + font_offset = decoder.font_offset; + + /* save new glyph tables */ + decoder_funcs->done( &decoder ); + + must_finish_decoder = FALSE; + + /* now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax */ + if ( !error ) + { + glyph->root.outline.flags &= FT_OUTLINE_OWNER; + glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* for composite glyphs, return only left side bearing and */ + /* advance width */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = glyph->root.internal; + + + glyph->root.metrics.horiBearingX = + FIXED_TO_INT( decoder.builder.left_bearing.x ); + glyph->root.metrics.horiAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &glyph->root.metrics; + FT_Vector advance; + + + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + glyph->root.linearHoriAdvance = + FIXED_TO_INT( decoder.builder.advance.x ); + glyph->root.internal->glyph_transformed = 0; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + /* make up vertical ones */ + metrics->vertAdvance = ( face->type1.font_bbox.yMax - + face->type1.font_bbox.yMin ) >> 16; + glyph->root.linearVertAdvance = metrics->vertAdvance; + } + else + { + metrics->vertAdvance = + FIXED_TO_INT( decoder.builder.advance.y ); + glyph->root.linearVertAdvance = + FIXED_TO_INT( decoder.builder.advance.y ); + } + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; + +#if 1 + /* apply the font matrix, if any */ + if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx || + font_matrix.xy != 0 || font_matrix.yx != 0 ) + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + if ( font_offset.x || font_offset.y ) + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, + font_offset.y ); + + advance.x = metrics->horiAdvance; + advance.y = 0; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->horiAdvance = advance.x + font_offset.x; + advance.x = 0; + advance.y = metrics->vertAdvance; + FT_Vector_Transform( &advance, &font_matrix ); + metrics->vertAdvance = advance.y + font_offset.y; +#endif + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = decoder.builder.base; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points, if we are not hinting */ + if ( !hinting || ! decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + /* make up vertical ones */ + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + + /* Set control data to the glyph charstrings. Note that this is */ + /* _not_ zero-terminated. */ + glyph->root.control_data = (FT_Byte*)glyph_data.pointer; + glyph->root.control_len = glyph_data.length; + } + + + Exit: + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_data_loaded && face->root.internal->incremental_interface ) + { + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + + /* Set the control data to null - it is no longer available if */ + /* loaded incrementally. */ + glyph->root.control_data = 0; + glyph->root.control_len = 0; + } +#endif + + if ( must_finish_decoder ) + decoder_funcs->done( &decoder ); + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1gload.h b/alienblaster/project/jni/freetype/src/type1/t1gload.h new file mode 100644 index 000000000..100df06e8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1gload.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* t1gload.h */ +/* */ +/* Type 1 Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1GLOAD_H__ +#define __T1GLOAD_H__ + + +#include <ft2build.h> +#include "t1objs.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + T1_Compute_Max_Advance( T1_Face face, + FT_Pos* max_advance ); + + FT_LOCAL( FT_Error ) + T1_Get_Advances( T1_Face face, + FT_UInt first, + FT_UInt count, + FT_ULong load_flags, + FT_Fixed* advances ); + + FT_LOCAL( FT_Error ) + T1_Load_Glyph( T1_GlyphSlot glyph, + T1_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* __T1GLOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1load.c b/alienblaster/project/jni/freetype/src/type1/t1load.c new file mode 100644 index 000000000..d867e942c --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1load.c @@ -0,0 +1,2231 @@ +/***************************************************************************/ +/* */ +/* t1load.c */ +/* */ +/* Type 1 font loader (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is the new and improved Type 1 data loader for FreeType 2. The */ + /* old loader has several problems: it is slow, complex, difficult to */ + /* maintain, and contains incredible hacks to make it accept some */ + /* ill-formed Type 1 fonts without hiccup-ing. Moreover, about 5% of */ + /* the Type 1 fonts on my machine still aren't loaded correctly by it. */ + /* */ + /* This version is much simpler, much faster and also easier to read and */ + /* maintain by a great order of magnitude. The idea behind it is to */ + /* _not_ try to read the Type 1 token stream with a state machine (i.e. */ + /* a Postscript-like interpreter) but rather to perform simple pattern */ + /* matching. */ + /* */ + /* Indeed, nearly all data definitions follow a simple pattern like */ + /* */ + /* ... /Field <data> ... */ + /* */ + /* where <data> can be a number, a boolean, a string, or an array of */ + /* numbers. There are a few exceptions, namely the encoding, font name, */ + /* charstrings, and subrs; they are handled with a special pattern */ + /* matching routine. */ + /* */ + /* All other common cases are handled very simply. The matching rules */ + /* are defined in the file `t1tokens.h' through the use of several */ + /* macros calls PARSE_XXX. This file is included twice here; the first */ + /* time to generate parsing callback functions, the second time to */ + /* generate a table of keywords (with pointers to the associated */ + /* callback functions). */ + /* */ + /* The function `parse_dict' simply scans *linearly* a given dictionary */ + /* (either the top-level or private one) and calls the appropriate */ + /* callback when it encounters an immediate keyword. */ + /* */ + /* This is by far the fastest way one can find to parse and read all */ + /* data. */ + /* */ + /* This led to tremendous code size reduction. Note that later, the */ + /* glyph loader will also be _greatly_ simplified, and the automatic */ + /* hinter will replace the clumsy `t1hinter'. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_CALC_H + +#include "t1load.h" +#include "t1errors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1load + + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MULTIPLE MASTERS SUPPORT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + t1_allocate_blend( T1_Face face, + FT_UInt num_designs, + FT_UInt num_axis ) + { + PS_Blend blend; + FT_Memory memory = face->root.memory; + FT_Error error = T1_Err_Ok; + + + blend = face->blend; + if ( !blend ) + { + if ( FT_NEW( blend ) ) + goto Exit; + + blend->num_default_design_vector = 0; + + face->blend = blend; + } + + /* allocate design data if needed */ + if ( num_designs > 0 ) + { + if ( blend->num_designs == 0 ) + { + FT_UInt nn; + + + /* allocate the blend `private' and `font_info' dictionaries */ + if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs ) || + FT_NEW_ARRAY( blend->privates[1], num_designs ) || + FT_NEW_ARRAY( blend->bboxes[1], num_designs ) || + FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) ) + goto Exit; + + blend->default_weight_vector = blend->weight_vector + num_designs; + + blend->font_infos[0] = &face->type1.font_info; + blend->privates [0] = &face->type1.private_dict; + blend->bboxes [0] = &face->type1.font_bbox; + + for ( nn = 2; nn <= num_designs; nn++ ) + { + blend->privates[nn] = blend->privates [nn - 1] + 1; + blend->font_infos[nn] = blend->font_infos[nn - 1] + 1; + blend->bboxes[nn] = blend->bboxes [nn - 1] + 1; + } + + blend->num_designs = num_designs; + } + else if ( blend->num_designs != num_designs ) + goto Fail; + } + + /* allocate axis data if needed */ + if ( num_axis > 0 ) + { + if ( blend->num_axis != 0 && blend->num_axis != num_axis ) + goto Fail; + + blend->num_axis = num_axis; + } + + /* allocate the blend design pos table if needed */ + num_designs = blend->num_designs; + num_axis = blend->num_axis; + if ( num_designs && num_axis && blend->design_pos[0] == 0 ) + { + FT_UInt n; + + + if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) ) + goto Exit; + + for ( n = 1; n < num_designs; n++ ) + blend->design_pos[n] = blend->design_pos[0] + num_axis * n; + } + + Exit: + return error; + + Fail: + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Multi_Master( T1_Face face, + FT_Multi_Master* master ) + { + PS_Blend blend = face->blend; + FT_UInt n; + FT_Error error; + + + error = T1_Err_Invalid_Argument; + + if ( blend ) + { + master->num_axis = blend->num_axis; + master->num_designs = blend->num_designs; + + for ( n = 0; n < blend->num_axis; n++ ) + { + FT_MM_Axis* axis = master->axis + n; + PS_DesignMap map = blend->design_map + n; + + + axis->name = blend->axis_names[n]; + axis->minimum = map->design_points[0]; + axis->maximum = map->design_points[map->num_points - 1]; + } + + error = T1_Err_Ok; + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* Given a normalized (blend) coordinate, figure out the design */ + /* coordinate appropriate for that value. */ + /* */ + FT_LOCAL_DEF( FT_Fixed ) + mm_axis_unmap( PS_DesignMap axismap, + FT_Fixed ncv ) + { + int j; + + + if ( ncv <= axismap->blend_points[0] ) + return INT_TO_FIXED( axismap->design_points[0] ); + + for ( j = 1; j < axismap->num_points; ++j ) + { + if ( ncv <= axismap->blend_points[j] ) + { + FT_Fixed t = FT_MulDiv( ncv - axismap->blend_points[j - 1], + 0x10000L, + axismap->blend_points[j] - + axismap->blend_points[j - 1] ); + + return INT_TO_FIXED( axismap->design_points[j - 1] ) + + FT_MulDiv( t, + axismap->design_points[j] - + axismap->design_points[j - 1], + 1L ); + } + } + + return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] ); + } + + + /*************************************************************************/ + /* */ + /* Given a vector of weights, one for each design, figure out the */ + /* normalized axis coordinates which gave rise to those weights. */ + /* */ + FT_LOCAL_DEF( void ) + mm_weights_unmap( FT_Fixed* weights, + FT_Fixed* axiscoords, + FT_UInt axis_count ) + { + FT_ASSERT( axis_count <= T1_MAX_MM_AXIS ); + + if ( axis_count == 1 ) + axiscoords[0] = weights[1]; + + else if ( axis_count == 2 ) + { + axiscoords[0] = weights[3] + weights[1]; + axiscoords[1] = weights[3] + weights[2]; + } + + else if ( axis_count == 3 ) + { + axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1]; + axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2]; + axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4]; + } + + else + { + axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] + + weights[7] + weights[5] + weights[3] + weights[1]; + axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] + + weights[7] + weights[6] + weights[3] + weights[2]; + axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] + + weights[7] + weights[6] + weights[5] + weights[4]; + axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] + + weights[11] + weights[10] + weights[9] + weights[8]; + } + } + + + /*************************************************************************/ + /* */ + /* Just a wrapper around T1_Get_Multi_Master to support the different */ + /* arguments needed by the GX var distortable fonts. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_Var( T1_Face face, + FT_MM_Var* *master ) + { + FT_Memory memory = face->root.memory; + FT_MM_Var *mmvar; + FT_Multi_Master mmaster; + FT_Error error; + FT_UInt i; + FT_Fixed axiscoords[T1_MAX_MM_AXIS]; + PS_Blend blend = face->blend; + + + error = T1_Get_Multi_Master( face, &mmaster ); + if ( error ) + goto Exit; + if ( FT_ALLOC( mmvar, + sizeof ( FT_MM_Var ) + + mmaster.num_axis * sizeof ( FT_Var_Axis ) ) ) + goto Exit; + + mmvar->num_axis = mmaster.num_axis; + mmvar->num_designs = mmaster.num_designs; + mmvar->num_namedstyles = (FT_UInt)-1; /* Does not apply */ + mmvar->axis = (FT_Var_Axis*)&mmvar[1]; + /* Point to axes after MM_Var struct */ + mmvar->namedstyle = NULL; + + for ( i = 0 ; i < mmaster.num_axis; ++i ) + { + mmvar->axis[i].name = mmaster.axis[i].name; + mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum); + mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum); + mmvar->axis[i].def = ( mmvar->axis[i].minimum + + mmvar->axis[i].maximum ) / 2; + /* Does not apply. But this value is in range */ + mmvar->axis[i].strid = (FT_UInt)-1; /* Does not apply */ + mmvar->axis[i].tag = (FT_ULong)-1; /* Does not apply */ + + if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' ); + else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' ); + else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 ) + mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' ); + } + + if ( blend->num_designs == ( 1U << blend->num_axis ) ) + { + mm_weights_unmap( blend->default_weight_vector, + axiscoords, + blend->num_axis ); + + for ( i = 0; i < mmaster.num_axis; ++i ) + mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i], + axiscoords[i] ); + } + + *master = mmvar; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Set_MM_Blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + PS_Blend blend = face->blend; + FT_Error error; + FT_UInt n, m; + + + error = T1_Err_Invalid_Argument; + + if ( blend && blend->num_axis == num_coords ) + { + /* recompute the weight vector from the blend coordinates */ + error = T1_Err_Ok; + + for ( n = 0; n < blend->num_designs; n++ ) + { + FT_Fixed result = 0x10000L; /* 1.0 fixed */ + + + for ( m = 0; m < blend->num_axis; m++ ) + { + FT_Fixed factor; + + + /* get current blend axis position */ + factor = coords[m]; + if ( factor < 0 ) factor = 0; + if ( factor > 0x10000L ) factor = 0x10000L; + + if ( ( n & ( 1 << m ) ) == 0 ) + factor = 0x10000L - factor; + + result = FT_MulFix( result, factor ); + } + blend->weight_vector[n] = result; + } + + error = T1_Err_Ok; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Set_MM_Design( T1_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + PS_Blend blend = face->blend; + FT_Error error; + FT_UInt n, p; + + + error = T1_Err_Invalid_Argument; + if ( blend && blend->num_axis == num_coords ) + { + /* compute the blend coordinates through the blend design map */ + FT_Fixed final_blends[T1_MAX_MM_DESIGNS]; + + + for ( n = 0; n < blend->num_axis; n++ ) + { + FT_Long design = coords[n]; + FT_Fixed the_blend; + PS_DesignMap map = blend->design_map + n; + FT_Long* designs = map->design_points; + FT_Fixed* blends = map->blend_points; + FT_Int before = -1, after = -1; + + + for ( p = 0; p < (FT_UInt)map->num_points; p++ ) + { + FT_Long p_design = designs[p]; + + + /* exact match? */ + if ( design == p_design ) + { + the_blend = blends[p]; + goto Found; + } + + if ( design < p_design ) + { + after = p; + break; + } + + before = p; + } + + /* now interpolate if necessary */ + if ( before < 0 ) + the_blend = blends[0]; + + else if ( after < 0 ) + the_blend = blends[map->num_points - 1]; + + else + the_blend = FT_MulDiv( design - designs[before], + blends [after] - blends [before], + designs[after] - designs[before] ); + + Found: + final_blends[n] = the_blend; + } + + error = T1_Set_MM_Blend( face, num_coords, final_blends ); + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* Just a wrapper around T1_Set_MM_Design to support the different */ + /* arguments needed by the GX var distortable fonts. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Set_Var_Design( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Long lcoords[4]; /* maximum axis count is 4 */ + FT_UInt i; + FT_Error error; + + + error = T1_Err_Invalid_Argument; + if ( num_coords <= 4 && num_coords > 0 ) + { + for ( i = 0; i < num_coords; ++i ) + lcoords[i] = FIXED_TO_INT( coords[i] ); + error = T1_Set_MM_Design( face, num_coords, lcoords ); + } + + return error; + } + + + FT_LOCAL_DEF( void ) + T1_Done_Blend( T1_Face face ) + { + FT_Memory memory = face->root.memory; + PS_Blend blend = face->blend; + + + if ( blend ) + { + FT_UInt num_designs = blend->num_designs; + FT_UInt num_axis = blend->num_axis; + FT_UInt n; + + + /* release design pos table */ + FT_FREE( blend->design_pos[0] ); + for ( n = 1; n < num_designs; n++ ) + blend->design_pos[n] = 0; + + /* release blend `private' and `font info' dictionaries */ + FT_FREE( blend->privates[1] ); + FT_FREE( blend->font_infos[1] ); + FT_FREE( blend->bboxes[1] ); + + for ( n = 0; n < num_designs; n++ ) + { + blend->privates [n] = 0; + blend->font_infos[n] = 0; + blend->bboxes [n] = 0; + } + + /* release weight vectors */ + FT_FREE( blend->weight_vector ); + blend->default_weight_vector = 0; + + /* release axis names */ + for ( n = 0; n < num_axis; n++ ) + FT_FREE( blend->axis_names[n] ); + + /* release design map */ + for ( n = 0; n < num_axis; n++ ) + { + PS_DesignMap dmap = blend->design_map + n; + + + FT_FREE( dmap->design_points ); + dmap->num_points = 0; + } + + FT_FREE( face->blend ); + } + } + + + static void + parse_blend_axis_types( T1_Face face, + T1_Loader loader ) + { + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + FT_Int n, num_axis; + FT_Error error = T1_Err_Ok; + PS_Blend blend; + FT_Memory memory; + + + /* take an array of objects */ + T1_ToTokenArray( &loader->parser, axis_tokens, + T1_MAX_MM_AXIS, &num_axis ); + if ( num_axis < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n", + num_axis )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + /* allocate blend if necessary */ + error = t1_allocate_blend( face, 0, (FT_UInt)num_axis ); + if ( error ) + goto Exit; + + blend = face->blend; + memory = face->root.memory; + + /* each token is an immediate containing the name of the axis */ + for ( n = 0; n < num_axis; n++ ) + { + T1_Token token = axis_tokens + n; + FT_Byte* name; + FT_PtrDist len; + + + /* skip first slash, if any */ + if ( token->start[0] == '/' ) + token->start++; + + len = token->limit - token->start; + if ( len == 0 ) + { + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + if ( FT_ALLOC( blend->axis_names[n], len + 1 ) ) + goto Exit; + + name = (FT_Byte*)blend->axis_names[n]; + FT_MEM_COPY( name, token->start, len ); + name[len] = 0; + } + + Exit: + loader->parser.root.error = error; + } + + + static void + parse_blend_design_positions( T1_Face face, + T1_Loader loader ) + { + T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; + FT_Int num_designs; + FT_Int num_axis; + T1_Parser parser = &loader->parser; + + FT_Error error = T1_Err_Ok; + PS_Blend blend; + + + /* get the array of design tokens -- compute number of designs */ + T1_ToTokenArray( parser, design_tokens, + T1_MAX_MM_DESIGNS, &num_designs ); + if ( num_designs < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) + { + FT_ERROR(( "parse_blend_design_positions:" + " incorrect number of designs: %d\n", + num_designs )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + { + FT_Byte* old_cursor = parser->root.cursor; + FT_Byte* old_limit = parser->root.limit; + FT_Int n; + + + blend = face->blend; + num_axis = 0; /* make compiler happy */ + + for ( n = 0; n < num_designs; n++ ) + { + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + T1_Token token; + FT_Int axis, n_axis; + + + /* read axis/coordinates tokens */ + token = design_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; + T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis ); + + if ( n == 0 ) + { + if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_design_positions:" + " invalid number of axes: %d\n", + n_axis )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + num_axis = n_axis; + error = t1_allocate_blend( face, num_designs, num_axis ); + if ( error ) + goto Exit; + blend = face->blend; + } + else if ( n_axis != num_axis ) + { + FT_ERROR(( "parse_blend_design_positions: incorrect table\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + /* now read each axis token into the design position */ + for ( axis = 0; axis < n_axis; axis++ ) + { + T1_Token token2 = axis_tokens + axis; + + + parser->root.cursor = token2->start; + parser->root.limit = token2->limit; + blend->design_pos[n][axis] = T1_ToFixed( parser, 0 ); + } + } + + loader->parser.root.cursor = old_cursor; + loader->parser.root.limit = old_limit; + } + + Exit: + loader->parser.root.error = error; + } + + + static void + parse_blend_design_map( T1_Face face, + T1_Loader loader ) + { + FT_Error error = T1_Err_Ok; + T1_Parser parser = &loader->parser; + PS_Blend blend; + T1_TokenRec axis_tokens[T1_MAX_MM_AXIS]; + FT_Int n, num_axis; + FT_Byte* old_cursor; + FT_Byte* old_limit; + FT_Memory memory = face->root.memory; + + + T1_ToTokenArray( parser, axis_tokens, + T1_MAX_MM_AXIS, &num_axis ); + if ( num_axis < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS ) + { + FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n", + num_axis )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + old_cursor = parser->root.cursor; + old_limit = parser->root.limit; + + error = t1_allocate_blend( face, 0, num_axis ); + if ( error ) + goto Exit; + blend = face->blend; + + /* now read each axis design map */ + for ( n = 0; n < num_axis; n++ ) + { + PS_DesignMap map = blend->design_map + n; + T1_Token axis_token; + T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS]; + FT_Int p, num_points; + + + axis_token = axis_tokens + n; + + parser->root.cursor = axis_token->start; + parser->root.limit = axis_token->limit; + T1_ToTokenArray( parser, point_tokens, + T1_MAX_MM_MAP_POINTS, &num_points ); + + if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS ) + { + FT_ERROR(( "parse_blend_design_map: incorrect table\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + /* allocate design map data */ + if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) ) + goto Exit; + map->blend_points = map->design_points + num_points; + map->num_points = (FT_Byte)num_points; + + for ( p = 0; p < num_points; p++ ) + { + T1_Token point_token; + + + point_token = point_tokens + p; + + /* don't include delimiting brackets */ + parser->root.cursor = point_token->start + 1; + parser->root.limit = point_token->limit - 1; + + map->design_points[p] = T1_ToInt( parser ); + map->blend_points [p] = T1_ToFixed( parser, 0 ); + } + } + + parser->root.cursor = old_cursor; + parser->root.limit = old_limit; + + Exit: + parser->root.error = error; + } + + + static void + parse_weight_vector( T1_Face face, + T1_Loader loader ) + { + T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS]; + FT_Int num_designs; + FT_Error error = T1_Err_Ok; + T1_Parser parser = &loader->parser; + PS_Blend blend = face->blend; + T1_Token token; + FT_Int n; + FT_Byte* old_cursor; + FT_Byte* old_limit; + + + T1_ToTokenArray( parser, design_tokens, + T1_MAX_MM_DESIGNS, &num_designs ); + if ( num_designs < 0 ) + { + error = T1_Err_Ignore; + goto Exit; + } + if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS ) + { + FT_ERROR(( "parse_weight_vector:" + " incorrect number of designs: %d\n", + num_designs )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + if ( !blend || !blend->num_designs ) + { + error = t1_allocate_blend( face, num_designs, 0 ); + if ( error ) + goto Exit; + blend = face->blend; + } + else if ( blend->num_designs != (FT_UInt)num_designs ) + { + FT_ERROR(( "parse_weight_vector:" + " /BlendDesignPosition and /WeightVector have\n" + " " + " different number of elements\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + old_cursor = parser->root.cursor; + old_limit = parser->root.limit; + + for ( n = 0; n < num_designs; n++ ) + { + token = design_tokens + n; + parser->root.cursor = token->start; + parser->root.limit = token->limit; + + blend->default_weight_vector[n] = + blend->weight_vector[n] = T1_ToFixed( parser, 0 ); + } + + parser->root.cursor = old_cursor; + parser->root.limit = old_limit; + + Exit: + parser->root.error = error; + } + + + /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */ + /* we're only interested in the number of array elements */ + static void + parse_buildchar( T1_Face face, + T1_Loader loader ) + { + face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 ); + + return; + } + + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 SYMBOL PARSING *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + t1_load_keyword( T1_Face face, + T1_Loader loader, + const T1_Field field ) + { + FT_Error error; + void* dummy_object; + void** objects; + FT_UInt max_objects; + PS_Blend blend = face->blend; + + + /* if the keyword has a dedicated callback, call it */ + if ( field->type == T1_FIELD_TYPE_CALLBACK ) + { + field->reader( (FT_Face)face, loader ); + error = loader->parser.root.error; + goto Exit; + } + + /* now, the keyword is either a simple field, or a table of fields; */ + /* we are now going to take care of it */ + switch ( field->location ) + { + case T1_FIELD_LOCATION_FONT_INFO: + dummy_object = &face->type1.font_info; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->font_infos; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_FONT_EXTRA: + dummy_object = &face->type1.font_extra; + objects = &dummy_object; + max_objects = 0; + break; + + case T1_FIELD_LOCATION_PRIVATE: + dummy_object = &face->type1.private_dict; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->privates; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_BBOX: + dummy_object = &face->type1.font_bbox; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->bboxes; + max_objects = blend->num_designs; + } + break; + + case T1_FIELD_LOCATION_LOADER: + dummy_object = loader; + objects = &dummy_object; + max_objects = 0; + break; + + case T1_FIELD_LOCATION_FACE: + dummy_object = face; + objects = &dummy_object; + max_objects = 0; + break; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + case T1_FIELD_LOCATION_BLEND: + dummy_object = face->blend; + objects = &dummy_object; + max_objects = 0; + break; +#endif + + default: + dummy_object = &face->type1; + objects = &dummy_object; + max_objects = 0; + } + + if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || + field->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = T1_Load_Field_Table( &loader->parser, field, + objects, max_objects, 0 ); + else + error = T1_Load_Field( &loader->parser, field, + objects, max_objects, 0 ); + + Exit: + return error; + } + + + static void + parse_private( T1_Face face, + T1_Loader loader ) + { + FT_UNUSED( face ); + + loader->keywords_encountered |= T1_PRIVATE; + } + + + static int + read_binary_data( T1_Parser parser, + FT_Long* size, + FT_Byte** base ) + { + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + + /* the binary data has one of the following formats */ + /* */ + /* `size' [white*] RD white ....... ND */ + /* `size' [white*] -| white ....... |- */ + /* */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + + if ( cur < limit && ft_isdigit( *cur ) ) + { + *size = T1_ToInt( parser ); + + T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */ + + /* there is only one whitespace char after the */ + /* `RD' or `-|' token */ + *base = parser->root.cursor + 1; + + parser->root.cursor += *size + 1; + return !parser->root.error; + } + + FT_ERROR(( "read_binary_data: invalid size field\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return 0; + } + + + /* We now define the routines to handle the `/Encoding', `/Subrs', */ + /* and `/CharStrings' dictionaries. */ + + static void + parse_font_matrix( T1_Face face, + T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + FT_Matrix* matrix = &face->type1.font_matrix; + FT_Vector* offset = &face->type1.font_offset; + FT_Face root = (FT_Face)&face->root; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + FT_Int result; + + + result = T1_ToFixedArray( parser, 6, temp, 3 ); + + if ( result < 0 ) + { + parser->root.error = T1_Err_Invalid_File_Format; + return; + } + + temp_scale = FT_ABS( temp[3] ); + + if ( temp_scale == 0 ) + { + FT_ERROR(( "parse_font_matrix: invalid font matrix\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return; + } + + /* Set Units per EM based on FontMatrix values. We set the value to */ + /* 1000 / temp_scale, because temp_scale was already multiplied by */ + /* 1000 (in t1_tofixed, from psobjs.c). */ + + root->units_per_EM = (FT_UShort)( FT_DivFix( 1000 * 0x10000L, + temp_scale ) >> 16 ); + + /* we need to scale the values by 1.0/temp_scale */ + if ( temp_scale != 0x10000L ) + { + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = 0x10000L; + } + + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + /* note that the offsets must be expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + + static void + parse_encoding( T1_Face face, + T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + if ( cur >= limit ) + { + FT_ERROR(( "parse_encoding: out of bounds\n" )); + parser->root.error = T1_Err_Invalid_File_Format; + return; + } + + /* if we have a number or `[', the encoding is an array, */ + /* and we must load it now */ + if ( ft_isdigit( *cur ) || *cur == '[' ) + { + T1_Encoding encode = &face->type1.encoding; + FT_Int count, n; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Bool only_immediates = 0; + + + /* read the number of entries in the encoding; should be 256 */ + if ( *cur == '[' ) + { + count = 256; + only_immediates = 1; + parser->root.cursor++; + } + else + count = (FT_Int)T1_ToInt( parser ); + + T1_Skip_Spaces( parser ); + if ( parser->root.cursor >= limit ) + return; + + /* we use a T1_Table to store our charnames */ + loader->num_chars = encode->num_chars = count; + if ( FT_NEW_ARRAY( encode->char_index, count ) || + FT_NEW_ARRAY( encode->char_name, count ) || + FT_SET_ERROR( psaux->ps_table_funcs->init( + char_table, count, memory ) ) ) + { + parser->root.error = error; + return; + } + + /* We need to `zero' out encoding_table.elements */ + for ( n = 0; n < count; n++ ) + { + char* notdef = (char *)".notdef"; + + + T1_Add_Table( char_table, n, notdef, 8 ); + } + + /* Now we need to read records of the form */ + /* */ + /* ... charcode /charname ... */ + /* */ + /* for each entry in our table. */ + /* */ + /* We simply look for a number followed by an immediate */ + /* name. Note that this ignores correctly the sequence */ + /* that is often seen in type1 fonts: */ + /* */ + /* 0 1 255 { 1 index exch /.notdef put } for dup */ + /* */ + /* used to clean the encoding array before anything else. */ + /* */ + /* Alternatively, if the array is directly given as */ + /* */ + /* /Encoding [ ... ] */ + /* */ + /* we only read immediates. */ + + n = 0; + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + cur = parser->root.cursor; + + /* we stop when we encounter a `def' or `]' */ + if ( *cur == 'd' && cur + 3 < limit ) + { + if ( cur[1] == 'e' && + cur[2] == 'f' && + IS_PS_DELIM( cur[3] ) ) + { + FT_TRACE6(( "encoding end\n" )); + cur += 3; + break; + } + } + if ( *cur == ']' ) + { + FT_TRACE6(( "encoding end\n" )); + cur++; + break; + } + + /* check whether we've found an entry */ + if ( ft_isdigit( *cur ) || only_immediates ) + { + FT_Int charcode; + + + if ( only_immediates ) + charcode = n; + else + { + charcode = (FT_Int)T1_ToInt( parser ); + T1_Skip_Spaces( parser ); + } + + cur = parser->root.cursor; + + if ( *cur == '/' && cur + 2 < limit && n < count ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + + len = parser->root.cursor - cur; + + parser->root.error = T1_Add_Table( char_table, charcode, + cur, len + 1 ); + if ( parser->root.error ) + return; + char_table->elements[charcode][len] = '\0'; + + n++; + } + else if ( only_immediates ) + { + /* Since the current position is not updated for */ + /* immediates-only mode we would get an infinite loop if */ + /* we don't do anything here. */ + /* */ + /* This encoding array is not valid according to the type1 */ + /* specification (it might be an encoding for a CID type1 */ + /* font, however), so we conclude that this font is NOT a */ + /* type1 font. */ + parser->root.error = FT_Err_Unknown_File_Format; + return; + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + } + + T1_Skip_Spaces( parser ); + } + + face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; + parser->root.cursor = cur; + } + + /* Otherwise, we should have either `StandardEncoding', */ + /* `ExpertEncoding', or `ISOLatin1Encoding' */ + else + { + if ( cur + 17 < limit && + ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; + + else if ( cur + 15 < limit && + ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; + + else if ( cur + 18 < limit && + ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; + + else + parser->root.error = T1_Err_Ignore; + } + } + + + static void + parse_subrs( T1_Face face, + T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + PS_Table table = &loader->subrs; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Int num_subrs; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + T1_Skip_Spaces( parser ); + + /* test for empty array */ + if ( parser->root.cursor < parser->root.limit && + *parser->root.cursor == '[' ) + { + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + if ( parser->root.cursor >= parser->root.limit || + *parser->root.cursor != ']' ) + parser->root.error = T1_Err_Invalid_File_Format; + return; + } + + num_subrs = (FT_Int)T1_ToInt( parser ); + + /* position the parser right before the `dup' of the first subr */ + T1_Skip_PS_Token( parser ); /* `array' */ + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + + /* initialize subrs array -- with synthetic fonts it is possible */ + /* we get here twice */ + if ( !loader->num_subrs ) + { + error = psaux->ps_table_funcs->init( table, num_subrs, memory ); + if ( error ) + goto Fail; + } + + /* the format is simple: */ + /* */ + /* `index' + binary data */ + /* */ + for (;;) + { + FT_Long idx, size; + FT_Byte* base; + + + /* If the next token isn't `dup' we are done. */ + if ( ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 ) + break; + + T1_Skip_PS_Token( parser ); /* `dup' */ + + idx = T1_ToInt( parser ); + + if ( !read_binary_data( parser, &size, &base ) ) + return; + + /* The binary string is followed by one token, e.g. `NP' */ + /* (bound to `noaccess put') or by two separate tokens: */ + /* `noaccess' & `put'. We position the parser right */ + /* before the next `dup', if any. */ + T1_Skip_PS_Token( parser ); /* `NP' or `|' or `noaccess' */ + if ( parser->root.error ) + return; + T1_Skip_Spaces ( parser ); + + if ( ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 ) + { + T1_Skip_PS_Token( parser ); /* skip `put' */ + T1_Skip_Spaces ( parser ); + } + + /* with synthetic fonts it is possible we get here twice */ + if ( loader->num_subrs ) + continue; + + /* some fonts use a value of -1 for lenIV to indicate that */ + /* the charstrings are unencoded */ + /* */ + /* thanks to Tom Kacvinsky for pointing this out */ + /* */ + if ( face->type1.private_dict.lenIV >= 0 ) + { + FT_Byte* temp; + + + /* some fonts define empty subr records -- this is not totally */ + /* compliant to the specification (which says they should at */ + /* least contain a `return'), but we support them anyway */ + if ( size < face->type1.private_dict.lenIV ) + { + error = T1_Err_Invalid_File_Format; + goto Fail; + } + + /* t1_decrypt() shouldn't write to base -- make temporary copy */ + if ( FT_ALLOC( temp, size ) ) + goto Fail; + FT_MEM_COPY( temp, base, size ); + psaux->t1_decrypt( temp, size, 4330 ); + size -= face->type1.private_dict.lenIV; + error = T1_Add_Table( table, (FT_Int)idx, + temp + face->type1.private_dict.lenIV, size ); + FT_FREE( temp ); + } + else + error = T1_Add_Table( table, (FT_Int)idx, base, size ); + if ( error ) + goto Fail; + } + + if ( !loader->num_subrs ) + loader->num_subrs = num_subrs; + + return; + + Fail: + parser->root.error = error; + } + + +#define TABLE_EXTEND 5 + + + static void + parse_charstrings( T1_Face face, + T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + PS_Table code_table = &loader->charstrings; + PS_Table name_table = &loader->glyph_names; + PS_Table swap_table = &loader->swap_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_Int n, num_glyphs; + FT_UInt notdef_index = 0; + FT_Byte notdef_found = 0; + + + num_glyphs = (FT_Int)T1_ToInt( parser ); + /* some fonts like Optima-Oblique not only define the /CharStrings */ + /* array but access it also */ + if ( num_glyphs == 0 || parser->root.error ) + return; + + /* initialize tables, leaving space for addition of .notdef, */ + /* if necessary, and a few other glyphs to handle buggy */ + /* fonts which have more glyphs than specified. */ + + /* for some non-standard fonts like `Optima' which provides */ + /* different outlines depending on the resolution it is */ + /* possible to get here twice */ + if ( !loader->num_glyphs ) + { + error = psaux->ps_table_funcs->init( + code_table, num_glyphs + 1 + TABLE_EXTEND, memory ); + if ( error ) + goto Fail; + + error = psaux->ps_table_funcs->init( + name_table, num_glyphs + 1 + TABLE_EXTEND, memory ); + if ( error ) + goto Fail; + + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + if ( error ) + goto Fail; + } + + n = 0; + + for (;;) + { + FT_Long size; + FT_Byte* base; + + + /* the format is simple: */ + /* `/glyphname' + binary data */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + if ( cur >= limit ) + break; + + /* we stop when we find a `def' or `end' keyword */ + if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) ) + { + if ( cur[0] == 'd' && + cur[1] == 'e' && + cur[2] == 'f' ) + { + /* There are fonts which have this: */ + /* */ + /* /CharStrings 118 dict def */ + /* Private begin */ + /* CharStrings begin */ + /* ... */ + /* */ + /* To catch this we ignore `def' if */ + /* no charstring has actually been */ + /* seen. */ + if ( n ) + break; + } + + if ( cur[0] == 'e' && + cur[1] == 'n' && + cur[2] == 'd' ) + break; + } + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + + if ( *cur == '/' ) + { + FT_PtrDist len; + + + if ( cur + 1 >= limit ) + { + error = T1_Err_Invalid_File_Format; + goto Fail; + } + + cur++; /* skip `/' */ + len = parser->root.cursor - cur; + + if ( !read_binary_data( parser, &size, &base ) ) + return; + + /* for some non-standard fonts like `Optima' which provides */ + /* different outlines depending on the resolution it is */ + /* possible to get here twice */ + if ( loader->num_glyphs ) + continue; + + error = T1_Add_Table( name_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + /* add a trailing zero to the name table */ + name_table->elements[n][len] = '\0'; + + /* record index of /.notdef */ + if ( *cur == '.' && + ft_strcmp( ".notdef", + (const char*)(name_table->elements[n]) ) == 0 ) + { + notdef_index = n; + notdef_found = 1; + } + + if ( face->type1.private_dict.lenIV >= 0 && + n < num_glyphs + TABLE_EXTEND ) + { + FT_Byte* temp; + + + if ( size <= face->type1.private_dict.lenIV ) + { + error = T1_Err_Invalid_File_Format; + goto Fail; + } + + /* t1_decrypt() shouldn't write to base -- make temporary copy */ + if ( FT_ALLOC( temp, size ) ) + goto Fail; + FT_MEM_COPY( temp, base, size ); + psaux->t1_decrypt( temp, size, 4330 ); + size -= face->type1.private_dict.lenIV; + error = T1_Add_Table( code_table, n, + temp + face->type1.private_dict.lenIV, size ); + FT_FREE( temp ); + } + else + error = T1_Add_Table( code_table, n, base, size ); + if ( error ) + goto Fail; + + n++; + } + } + + loader->num_glyphs = n; + + /* if /.notdef is found but does not occupy index 0, do our magic. */ + if ( notdef_found && + ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) ) + { + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index */ + /* name and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ + + /* Index 0 name */ + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index 0 code */ + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index notdef_index name */ + error = T1_Add_Table( swap_table, 2, + name_table->elements[notdef_index], + name_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + /* Index notdef_index code */ + error = T1_Add_Table( swap_table, 3, + code_table->elements[notdef_index], + code_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, notdef_index, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, notdef_index, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + swap_table->elements[2], + swap_table->lengths [2] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + swap_table->elements[3], + swap_table->lengths [3] ); + if ( error ) + goto Fail; + + } + else if ( !notdef_found ) + { + /* notdef_index is already 0, or /.notdef is undefined in */ + /* charstrings dictionary. Worry about /.notdef undefined. */ + /* We take index 0 and add it to the end of the table(s) */ + /* and add our own /.notdef glyph to index 0. */ + + /* 0 333 hsbw endchar */ + FT_Byte notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E }; + char* notdef_name = (char *)".notdef"; + + + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, notdef_name, 8 ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, notdef_glyph, 5 ); + + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, n, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, n, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + /* we added a glyph. */ + loader->num_glyphs += 1; + } + + return; + + Fail: + parser->root.error = error; + } + + + /*************************************************************************/ + /* */ + /* Define the token field static variables. This is a set of */ + /* T1_FieldRec variables. */ + /* */ + /*************************************************************************/ + + + static + const T1_FieldRec t1_keywords[] = + { + +#include "t1tokens.h" + + /* now add the special functions... */ + T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "Encoding", parse_encoding, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "Subrs", parse_subrs, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_CALLBACK( "CharStrings", parse_charstrings, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_CALLBACK( "Private", parse_private, + T1_FIELD_DICT_FONTDICT ) + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar, + T1_FIELD_DICT_PRIVATE ) +#endif + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + +#define T1_FIELD_COUNT \ + ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) ) + + + static FT_Error + parse_dict( T1_Face face, + T1_Loader loader, + FT_Byte* base, + FT_Long size ) + { + T1_Parser parser = &loader->parser; + FT_Byte *limit, *start_binary = NULL; + FT_Bool have_integer = 0; + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = T1_Err_Ok; + + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + FT_Byte* cur; + + + cur = parser->root.cursor; + + /* look for `eexec' */ + if ( IS_PS_TOKEN( cur, limit, "eexec" ) ) + break; + + /* look for `closefile' which ends the eexec section */ + else if ( IS_PS_TOKEN( cur, limit, "closefile" ) ) + break; + + /* in a synthetic font the base font starts after a */ + /* `FontDictionary' token that is placed after a Private dict */ + else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) ) + { + if ( loader->keywords_encountered & T1_PRIVATE ) + loader->keywords_encountered |= + T1_FONTDIR_AFTER_PRIVATE; + parser->root.cursor += 13; + } + + /* check whether we have an integer */ + else if ( ft_isdigit( *cur ) ) + { + start_binary = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + have_integer = 1; + } + + /* in valid Type 1 fonts we don't see `RD' or `-|' directly */ + /* since those tokens are handled by parse_subrs and */ + /* parse_charstrings */ + else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' && + have_integer ) + { + FT_Long s; + FT_Byte* b; + + + parser->root.cursor = start_binary; + if ( !read_binary_data( parser, &s, &b ) ) + return T1_Err_Invalid_File_Format; + have_integer = 0; + } + + else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' && + have_integer ) + { + FT_Long s; + FT_Byte* b; + + + parser->root.cursor = start_binary; + if ( !read_binary_data( parser, &s, &b ) ) + return T1_Err_Invalid_File_Format; + have_integer = 0; + } + + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) + { + /* now compare the immediate name to the keyword table */ + T1_Field keyword = (T1_Field)t1_keywords; + + + for (;;) + { + FT_Byte* name; + + + name = (FT_Byte*)keyword->ident; + if ( !name ) + break; + + if ( cur[0] == name[0] && + len == (FT_PtrDist)ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) + { + /* We found it -- run the parsing callback! */ + /* We record every instance of every field */ + /* (until we reach the base font of a */ + /* synthetic font) to deal adequately with */ + /* multiple master fonts; this is also */ + /* necessary because later PostScript */ + /* definitions override earlier ones. */ + + /* Once we encounter `FontDirectory' after */ + /* `/Private', we know that this is a synthetic */ + /* font; except for `/CharStrings' we are not */ + /* interested in anything that follows this */ + /* `FontDirectory'. */ + + /* MM fonts have more than one /Private token at */ + /* the top level; let's hope that all the junk */ + /* that follows the first /Private token is not */ + /* interesting to us. */ + + /* According to Adobe Tech Note #5175 (CID-Keyed */ + /* Font Installation for ATM Software) a `begin' */ + /* must be followed by exactly one `end', and */ + /* `begin' -- `end' pairs must be accurately */ + /* paired. We could use this to distinguish */ + /* between the global Private and the Private */ + /* dict that is a member of the Blend dict. */ + + const FT_UInt dict = + ( loader->keywords_encountered & T1_PRIVATE ) + ? T1_FIELD_DICT_PRIVATE + : T1_FIELD_DICT_FONTDICT; + + if ( !( dict & keyword->dict ) ) + { + FT_TRACE1(( "parse_dict: found %s but ignoring it " + "since it is in the wrong dictionary\n", + keyword->ident )); + break; + } + + if ( !( loader->keywords_encountered & + T1_FONTDIR_AFTER_PRIVATE ) || + ft_strcmp( (const char*)name, "CharStrings" ) == 0 ) + { + parser->root.error = t1_load_keyword( face, + loader, + keyword ); + if ( parser->root.error != T1_Err_Ok ) + { + if ( FT_ERROR_BASE( parser->root.error ) == FT_Err_Ignore ) + parser->root.error = T1_Err_Ok; + else + return parser->root.error; + } + } + break; + } + + keyword++; + } + } + + have_integer = 0; + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + have_integer = 0; + } + + T1_Skip_Spaces( parser ); + } + + Exit: + return parser->root.error; + } + + + static void + t1_init_loader( T1_Loader loader, + T1_Face face ) + { + FT_UNUSED( face ); + + FT_MEM_ZERO( loader, sizeof ( *loader ) ); + loader->num_glyphs = 0; + loader->num_chars = 0; + + /* initialize the tables -- simply set their `init' field to 0 */ + loader->encoding_table.init = 0; + loader->charstrings.init = 0; + loader->glyph_names.init = 0; + loader->subrs.init = 0; + loader->swap_table.init = 0; + loader->fontdata = 0; + loader->keywords_encountered = 0; + } + + + static void + t1_done_loader( T1_Loader loader ) + { + T1_Parser parser = &loader->parser; + + + /* finalize tables */ + T1_Release_Table( &loader->encoding_table ); + T1_Release_Table( &loader->charstrings ); + T1_Release_Table( &loader->glyph_names ); + T1_Release_Table( &loader->swap_table ); + T1_Release_Table( &loader->subrs ); + + /* finalize parser */ + T1_Finalize_Parser( parser ); + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Open_Face( T1_Face face ) + { + T1_LoaderRec loader; + T1_Parser parser; + T1_Font type1 = &face->type1; + PS_Private priv = &type1->private_dict; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + t1_init_loader( &loader, face ); + + /* default values */ + face->ndv_idx = -1; + face->cdv_idx = -1; + face->len_buildchar = 0; + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = 4; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + parser = &loader.parser; + error = T1_New_Parser( parser, + face->root.stream, + face->root.memory, + psaux ); + if ( error ) + goto Exit; + + error = parse_dict( face, &loader, + parser->base_dict, parser->base_len ); + if ( error ) + goto Exit; + + error = T1_Get_Private_Dict( parser, psaux ); + if ( error ) + goto Exit; + + error = parse_dict( face, &loader, + parser->private_dict, parser->private_len ); + if ( error ) + goto Exit; + + /* ensure even-ness of `num_blue_values' */ + priv->num_blue_values &= ~1; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + if ( face->blend && + face->blend->num_default_design_vector != 0 && + face->blend->num_default_design_vector != face->blend->num_axis ) + { + /* we don't use it currently so just warn, reset, and ignore */ + FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries " + "while there are %u axes.\n", + face->blend->num_default_design_vector, + face->blend->num_axis )); + + face->blend->num_default_design_vector = 0; + } + + /* the following can happen for MM instances; we then treat the */ + /* font as a normal PS font */ + if ( face->blend && + ( !face->blend->num_designs || !face->blend->num_axis ) ) + T1_Done_Blend( face ); + + /* another safety check */ + if ( face->blend ) + { + FT_UInt i; + + + for ( i = 0; i < face->blend->num_axis; i++ ) + if ( !face->blend->design_map[i].num_points ) + { + T1_Done_Blend( face ); + break; + } + } + + if ( face->blend ) + { + if ( face->len_buildchar > 0 ) + { + FT_Memory memory = face->root.memory; + + + if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) ) + { + FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" )); + face->len_buildchar = 0; + goto Exit; + } + } + } + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + /* now, propagate the subrs, charstrings, and glyphnames tables */ + /* to the Type1 data */ + type1->num_glyphs = loader.num_glyphs; + + if ( loader.subrs.init ) + { + loader.subrs.init = 0; + type1->num_subrs = loader.num_subrs; + type1->subrs_block = loader.subrs.block; + type1->subrs = loader.subrs.elements; + type1->subrs_len = loader.subrs.lengths; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( !face->root.internal->incremental_interface ) +#endif + if ( !loader.charstrings.init ) + { + FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face\n" )); + error = T1_Err_Invalid_File_Format; + } + + loader.charstrings.init = 0; + type1->charstrings_block = loader.charstrings.block; + type1->charstrings = loader.charstrings.elements; + type1->charstrings_len = loader.charstrings.lengths; + + /* we copy the glyph names `block' and `elements' fields; */ + /* the `lengths' field must be released later */ + type1->glyph_names_block = loader.glyph_names.block; + type1->glyph_names = (FT_String**)loader.glyph_names.elements; + loader.glyph_names.block = 0; + loader.glyph_names.elements = 0; + + /* we must now build type1.encoding when we have a custom array */ + if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) + { + FT_Int charcode, idx, min_char, max_char; + FT_Byte* char_name; + FT_Byte* glyph_name; + + + /* OK, we do the following: for each element in the encoding */ + /* table, look up the index of the glyph having the same name */ + /* the index is then stored in type1.encoding.char_index, and */ + /* a the name to type1.encoding.char_name */ + + min_char = 0; + max_char = 0; + + charcode = 0; + for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) + { + type1->encoding.char_index[charcode] = 0; + type1->encoding.char_name [charcode] = (char *)".notdef"; + + char_name = loader.encoding_table.elements[charcode]; + if ( char_name ) + for ( idx = 0; idx < type1->num_glyphs; idx++ ) + { + glyph_name = (FT_Byte*)type1->glyph_names[idx]; + if ( ft_strcmp( (const char*)char_name, + (const char*)glyph_name ) == 0 ) + { + type1->encoding.char_index[charcode] = (FT_UShort)idx; + type1->encoding.char_name [charcode] = (char*)glyph_name; + + /* Change min/max encoded char only if glyph name is */ + /* not /.notdef */ + if ( ft_strcmp( (const char*)".notdef", + (const char*)glyph_name ) != 0 ) + { + if ( charcode < min_char ) + min_char = charcode; + if ( charcode >= max_char ) + max_char = charcode + 1; + } + break; + } + } + } + + type1->encoding.code_first = min_char; + type1->encoding.code_last = max_char; + type1->encoding.num_chars = loader.num_chars; + } + + Exit: + t1_done_loader( &loader ); + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1load.h b/alienblaster/project/jni/freetype/src/type1/t1load.h new file mode 100644 index 000000000..546fc3353 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1load.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* t1load.h */ +/* */ +/* Type 1 font loader (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1LOAD_H__ +#define __T1LOAD_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_MULTIPLE_MASTERS_H + +#include "t1parse.h" + + +FT_BEGIN_HEADER + + + typedef struct T1_Loader_ + { + T1_ParserRec parser; /* parser used to read the stream */ + + FT_Int num_chars; /* number of characters in encoding */ + PS_TableRec encoding_table; /* PS_Table used to store the */ + /* encoding character names */ + + FT_Int num_glyphs; + PS_TableRec glyph_names; + PS_TableRec charstrings; + PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ + + FT_Int num_subrs; + PS_TableRec subrs; + FT_Bool fontdata; + + FT_UInt keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */ + + } T1_LoaderRec, *T1_Loader; + + + /* treatment of some keywords differs depending on whether */ + /* they precede or follow certain other keywords */ + +#define T1_PRIVATE ( 1 << 0 ) +#define T1_FONTDIR_AFTER_PRIVATE ( 1 << 1 ) + + + FT_LOCAL( FT_Error ) + T1_Open_Face( T1_Face face ); + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + + FT_LOCAL( FT_Error ) + T1_Get_Multi_Master( T1_Face face, + FT_Multi_Master* master ); + + FT_LOCAL_DEF( FT_Error ) + T1_Get_MM_Var( T1_Face face, + FT_MM_Var* *master ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_Blend( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + T1_Set_MM_Design( T1_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + FT_LOCAL_DEF( FT_Error ) + T1_Set_Var_Design( T1_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( void ) + T1_Done_Blend( T1_Face face ); + +#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +FT_END_HEADER + +#endif /* __T1LOAD_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1objs.c b/alienblaster/project/jni/freetype/src/type1/t1objs.c new file mode 100644 index 000000000..b1de68719 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1objs.c @@ -0,0 +1,594 @@ +/***************************************************************************/ +/* */ +/* t1objs.c */ +/* */ +/* Type 1 objects manager (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_IDS_H + +#include "t1gload.h" +#include "t1load.h" + +#include "t1errors.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "t1afm.h" +#endif + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1objs + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /* note that we store the global hints in the size's "internal" root */ + /* field */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + T1_Size_Get_Globals_Funcs( T1_Size size ) + { + T1_Face face = (T1_Face)size->root.face; + PSHinter_Service pshinter = (PSHinter_Service)face->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0 ; + } + + + FT_LOCAL_DEF( void ) + T1_Size_Done( T1_Size size ) + { + if ( size->root.internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = T1_Size_Get_Globals_Funcs( size ); + if ( funcs ) + funcs->destroy( (PSH_Globals)size->root.internal ); + + size->root.internal = 0; + } + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Size_Init( T1_Size size ) + { + FT_Error error = T1_Err_Ok; + PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); + + + if ( funcs ) + { + PSH_Globals globals; + T1_Face face = (T1_Face)size->root.face; + + + error = funcs->create( size->root.face->memory, + &face->type1.private_dict, &globals ); + if ( !error ) + size->root.internal = (FT_Size_Internal)(void*)globals; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Size_Request( T1_Size size, + FT_Size_Request req ) + { + PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size ); + + + FT_Request_Metrics( size->root.face, req ); + + if ( funcs ) + funcs->set_scale( (PSH_Globals)size->root.internal, + size->root.metrics.x_scale, + size->root.metrics.y_scale, + 0, 0 ); + + return T1_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + T1_GlyphSlot_Done( T1_GlyphSlot slot ) + { + slot->root.internal->glyph_hints = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_GlyphSlot_Init( T1_GlyphSlot slot ) + { + T1_Face face; + PSHinter_Service pshinter; + + + face = (T1_Face)slot->root.face; + pshinter = (PSHinter_Service)face->pshinter; + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->root.face->driver->root.library, "pshinter" ); + if (module) + { + T1_Hints_Funcs funcs; + + funcs = pshinter->get_t1_funcs( module ); + slot->root.internal->glyph_hints = (void*)funcs; + } + } + return 0; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* T1_Face_Done */ + /* */ + /* <Description> */ + /* The face object destructor. */ + /* */ + /* <Input> */ + /* face :: A typeless pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + T1_Face_Done( T1_Face face ) + { + FT_Memory memory; + T1_Font type1; + + + if ( !face ) + return; + + memory = face->root.memory; + type1 = &face->type1; + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + /* release multiple masters information */ + FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) ); + + if ( face->buildchar ) + { + FT_FREE( face->buildchar ); + + face->buildchar = NULL; + face->len_buildchar = 0; + } + + T1_Done_Blend( face ); + face->blend = 0; +#endif + + /* release font info strings */ + { + PS_FontInfo info = &type1->font_info; + + + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + } + + /* release top dictionary */ + FT_FREE( type1->charstrings_len ); + FT_FREE( type1->charstrings ); + FT_FREE( type1->glyph_names ); + + FT_FREE( type1->subrs ); + FT_FREE( type1->subrs_len ); + + FT_FREE( type1->subrs_block ); + FT_FREE( type1->charstrings_block ); + FT_FREE( type1->glyph_names_block ); + + FT_FREE( type1->encoding.char_index ); + FT_FREE( type1->encoding.char_name ); + FT_FREE( type1->font_name ); + +#ifndef T1_CONFIG_OPTION_NO_AFM + /* release afm data if present */ + if ( face->afm_data ) + T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data ); +#endif + + /* release unicode map, if any */ +#if 0 + FT_FREE( face->unicode_map_rec.maps ); + face->unicode_map_rec.num_maps = 0; + face->unicode_map = NULL; +#endif + + face->root.family_name = NULL; + face->root.style_name = NULL; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* T1_Face_Init */ + /* */ + /* <Description> */ + /* The face object constructor. */ + /* */ + /* <Input> */ + /* stream :: input stream where to load font data. */ + /* */ + /* face_index :: The index of the font face in the resource. */ + /* */ + /* num_params :: Number of additional generic parameters. Ignored. */ + /* */ + /* params :: Additional generic parameters. Ignored. */ + /* */ + /* <InOut> */ + /* face :: The face record to build. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Face_Init( FT_Stream stream, + T1_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( stream ); + + + face->root.num_faces = 1; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + face->psnames = psnames; + + face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "psaux" ); + psaux = (PSAux_Service)face->psaux; + + face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "pshinter" ); + + /* open the tokenizer; this will also check the font format */ + error = T1_Open_Face( face ); + if ( error ) + goto Exit; + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + if ( face_index > 0 ) + { + FT_ERROR(( "T1_Face_Init: invalid face index\n" )); + error = T1_Err_Invalid_Argument; + goto Exit; + } + + /* now load the font program into the face object */ + + /* initialize the face object fields */ + + /* set up root face fields */ + { + FT_Face root = (FT_Face)&face->root; + + + root->num_glyphs = type1->num_glyphs; + root->face_index = 0; + + root->face_flags = FT_FACE_FLAG_SCALABLE | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_GLYPH_NAMES | + FT_FACE_FLAG_HINTER; + + if ( info->is_fixed_pitch ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( face->blend ) + root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; + + /* XXX: TODO -- add kerning with .afm support */ + + + /* The following code to extract the family and the style is very */ + /* simplistic and might get some things wrong. For a full-featured */ + /* algorithm you might have a look at the whitepaper given at */ + /* */ + /* http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */ + + /* get style name -- be careful, some broken fonts only */ + /* have a `/FontName' dictionary entry! */ + root->family_name = info->family_name; + root->style_name = NULL; + + if ( root->family_name ) + { + char* full = info->full_name; + char* family = root->family_name; + + + if ( full ) + { + FT_Bool the_same = TRUE; + + + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + the_same = FALSE; + + if ( !*family ) + root->style_name = full; + break; + } + } + } + + if ( the_same ) + root->style_name = (char *)"Regular"; + } + } + else + { + /* do we have a `/FontName'? */ + if ( type1->font_name ) + root->family_name = type1->font_name; + } + + if ( !root->style_name ) + { + if ( info->weight ) + root->style_name = info->weight; + else + /* assume `Regular' style because we don't know better */ + root->style_name = (char *)"Regular"; + } + + /* compute style flags */ + root->style_flags = 0; + if ( info->italic_angle ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + if ( info->weight ) + { + if ( !ft_strcmp( info->weight, "Bold" ) || + !ft_strcmp( info->weight, "Black" ) ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + } + + /* no embedded bitmap support */ + root->num_fixed_sizes = 0; + root->available_sizes = 0; + + root->bbox.xMin = type1->font_bbox.xMin >> 16; + root->bbox.yMin = type1->font_bbox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16; + root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16; + + /* Set units_per_EM if we didn't set it in parse_font_matrix. */ + if ( !root->units_per_EM ) + root->units_per_EM = 1000; + + root->ascender = (FT_Short)( root->bbox.yMax ); + root->descender = (FT_Short)( root->bbox.yMin ); + + root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 ); + if ( root->height < root->ascender - root->descender ) + root->height = (FT_Short)( root->ascender - root->descender ); + + /* now compute the maximum advance width */ + root->max_advance_width = + (FT_Short)( root->bbox.xMax ); + { + FT_Pos max_advance; + + + error = T1_Compute_Max_Advance( face, &max_advance ); + + /* in case of error, keep the standard width */ + if ( !error ) + root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance ); + else + error = T1_Err_Ok; /* clear error */ + } + + root->max_advance_height = root->height; + + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; + } + + { + FT_Face root = &face->root; + + + if ( psnames && psaux ) + { + FT_CharMapRec charmap; + T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; + FT_CMap_Class clazz; + + + charmap.face = root; + + /* first of all, try to synthesize a Unicode charmap */ + charmap.platform_id = 3; + charmap.encoding_id = 1; + charmap.encoding = FT_ENCODING_UNICODE; + + FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + + /* now, generate an Adobe Standard encoding when appropriate */ + charmap.platform_id = 7; + clazz = NULL; + + switch ( type1->encoding_type ) + { + case T1_ENCODING_TYPE_STANDARD: + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.encoding_id = TT_ADOBE_ID_STANDARD; + clazz = cmap_classes->standard; + break; + + case T1_ENCODING_TYPE_EXPERT: + charmap.encoding = FT_ENCODING_ADOBE_EXPERT; + charmap.encoding_id = TT_ADOBE_ID_EXPERT; + clazz = cmap_classes->expert; + break; + + case T1_ENCODING_TYPE_ARRAY: + charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; + charmap.encoding_id = TT_ADOBE_ID_CUSTOM; + clazz = cmap_classes->custom; + break; + + case T1_ENCODING_TYPE_ISOLATIN1: + charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; + charmap.encoding_id = TT_ADOBE_ID_LATIN_1; + clazz = cmap_classes->unicode; + break; + + default: + ; + } + + if ( clazz ) + FT_CMap_New( clazz, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if (root->num_charmaps) + root->charmap = root->charmaps[0]; +#endif + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* T1_Driver_Init */ + /* */ + /* <Description> */ + /* Initializes a given Type 1 driver object. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target driver object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T1_Driver_Init( T1_Driver driver ) + { + FT_UNUSED( driver ); + + return T1_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* T1_Driver_Done */ + /* */ + /* <Description> */ + /* Finalizes a given Type 1 driver. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target Type 1 driver. */ + /* */ + FT_LOCAL_DEF( void ) + T1_Driver_Done( T1_Driver driver ) + { + FT_UNUSED( driver ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1objs.h b/alienblaster/project/jni/freetype/src/type1/t1objs.h new file mode 100644 index 000000000..e5e90293d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1objs.h @@ -0,0 +1,171 @@ +/***************************************************************************/ +/* */ +/* t1objs.h */ +/* */ +/* Type 1 objects manager (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1OBJS_H__ +#define __T1OBJS_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + /* The following structures must be defined by the hinter */ + typedef struct T1_Size_Hints_ T1_Size_Hints; + typedef struct T1_Glyph_Hints_ T1_Glyph_Hints; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* T1_Driver */ + /* */ + /* <Description> */ + /* A handle to a Type 1 driver object. */ + /* */ + typedef struct T1_DriverRec_ *T1_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* T1_Size */ + /* */ + /* <Description> */ + /* A handle to a Type 1 size object. */ + /* */ + typedef struct T1_SizeRec_* T1_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* T1_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a Type 1 glyph slot object. */ + /* */ + typedef struct T1_GlyphSlotRec_* T1_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* T1_CharMap */ + /* */ + /* <Description> */ + /* A handle to a Type 1 character mapping object. */ + /* */ + /* <Note> */ + /* The Type 1 format doesn't use a charmap but an encoding table. */ + /* The driver is responsible for making up charmap objects */ + /* corresponding to these tables. */ + /* */ + typedef struct T1_CharMapRec_* T1_CharMap; + + + /*************************************************************************/ + /* */ + /* HERE BEGINS THE TYPE1 SPECIFIC STUFF */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* T1_SizeRec */ + /* */ + /* <Description> */ + /* Type 1 size record. */ + /* */ + typedef struct T1_SizeRec_ + { + FT_SizeRec root; + + } T1_SizeRec; + + + FT_LOCAL( void ) + T1_Size_Done( T1_Size size ); + + FT_LOCAL( FT_Error ) + T1_Size_Request( T1_Size size, + FT_Size_Request req ); + + FT_LOCAL( FT_Error ) + T1_Size_Init( T1_Size size ); + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* T1_GlyphSlotRec */ + /* */ + /* <Description> */ + /* Type 1 glyph slot record. */ + /* */ + typedef struct T1_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + + FT_Bool hint; + FT_Bool scaled; + + FT_Int max_points; + FT_Int max_contours; + + FT_Fixed x_scale; + FT_Fixed y_scale; + + } T1_GlyphSlotRec; + + + FT_LOCAL( FT_Error ) + T1_Face_Init( FT_Stream stream, + T1_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + T1_Face_Done( T1_Face face ); + + FT_LOCAL( FT_Error ) + T1_GlyphSlot_Init( T1_GlyphSlot slot ); + + FT_LOCAL( void ) + T1_GlyphSlot_Done( T1_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + T1_Driver_Init( T1_Driver driver ); + + FT_LOCAL( void ) + T1_Driver_Done( T1_Driver driver ); + + +FT_END_HEADER + +#endif /* __T1OBJS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1parse.c b/alienblaster/project/jni/freetype/src/type1/t1parse.c new file mode 100644 index 000000000..2a762279f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1parse.c @@ -0,0 +1,486 @@ +/***************************************************************************/ +/* */ +/* t1parse.c */ +/* */ +/* Type 1 parser (body). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The Type 1 parser is in charge of the following: */ + /* */ + /* - provide an implementation of a growing sequence of objects called */ + /* a `T1_Table' (used to build various tables needed by the loader). */ + /* */ + /* - opening .pfb and .pfa files to extract their top-level and private */ + /* dictionaries. */ + /* */ + /* - read numbers, arrays & strings from any dictionary. */ + /* */ + /* See `t1load.c' to see how data is loaded from the font file. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "t1parse.h" + +#include "t1errors.h" + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t1parse + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INPUT STREAM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* see Adobe Technical Note 5040.Download_Fonts.pdf */ + + static FT_Error + read_pfb_tag( FT_Stream stream, + FT_UShort *atag, + FT_ULong *asize ) + { + FT_Error error; + FT_UShort tag; + FT_ULong size; + + + *atag = 0; + *asize = 0; + + if ( !FT_READ_USHORT( tag ) ) + { + if ( tag == 0x8001U || tag == 0x8002U ) + { + if ( !FT_READ_ULONG_LE( size ) ) + *asize = size; + } + + *atag = tag; + } + + return error; + } + + + static FT_Error + check_type1_format( FT_Stream stream, + const char* header_string, + size_t header_length ) + { + FT_Error error; + FT_UShort tag; + FT_ULong dummy; + + + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + error = read_pfb_tag( stream, &tag, &dummy ); + if ( error ) + goto Exit; + + /* We assume that the first segment in a PFB is always encoded as */ + /* text. This might be wrong (and the specification doesn't insist */ + /* on that), but we have never seen a counterexample. */ + if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) ) + goto Exit; + + if ( !FT_FRAME_ENTER( header_length ) ) + { + error = T1_Err_Ok; + + if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 ) + error = T1_Err_Unknown_File_Format; + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T1_New_Parser( T1_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error; + FT_UShort tag; + FT_ULong size; + + + psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); + + parser->stream = stream; + parser->base_len = 0; + parser->base_dict = 0; + parser->private_len = 0; + parser->private_dict = 0; + parser->in_pfb = 0; + parser->in_memory = 0; + parser->single_block = 0; + + /* check the header format */ + error = check_type1_format( stream, "%!PS-AdobeFont", 14 ); + if ( error ) + { + if ( error != T1_Err_Unknown_File_Format ) + goto Exit; + + error = check_type1_format( stream, "%!FontType", 10 ); + if ( error ) + { + FT_TRACE2(( "[not a Type1 font]\n" )); + goto Exit; + } + } + + /******************************************************************/ + /* */ + /* Here a short summary of what is going on: */ + /* */ + /* When creating a new Type 1 parser, we try to locate and load */ + /* the base dictionary if this is possible (i.e., for PFB */ + /* files). Otherwise, we load the whole font into memory. */ + /* */ + /* When `loading' the base dictionary, we only setup pointers */ + /* in the case of a memory-based stream. Otherwise, we */ + /* allocate and load the base dictionary in it. */ + /* */ + /* parser->in_pfb is set if we are in a binary (`.pfb') font. */ + /* parser->in_memory is set if we have a memory stream. */ + /* */ + + /* try to compute the size of the base dictionary; */ + /* look for a Postscript binary file tag, i.e., 0x8001 */ + if ( FT_STREAM_SEEK( 0L ) ) + goto Exit; + + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Exit; + + if ( tag != 0x8001U ) + { + /* assume that this is a PFA file for now; an error will */ + /* be produced later when more things are checked */ + if ( FT_STREAM_SEEK( 0L ) ) + goto Exit; + size = stream->size; + } + else + parser->in_pfb = 1; + + /* now, try to load `size' bytes of the `base' dictionary we */ + /* found previously */ + + /* if it is a memory-based resource, set up pointers */ + if ( !stream->read ) + { + parser->base_dict = (FT_Byte*)stream->base + stream->pos; + parser->base_len = size; + parser->in_memory = 1; + + /* check that the `size' field is valid */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + else + { + /* read segment in memory -- this is clumsy, but so does the format */ + if ( FT_ALLOC( parser->base_dict, size ) || + FT_STREAM_READ( parser->base_dict, size ) ) + goto Exit; + parser->base_len = size; + } + + parser->root.base = parser->base_dict; + parser->root.cursor = parser->base_dict; + parser->root.limit = parser->root.cursor + parser->base_len; + + Exit: + if ( error && !parser->in_memory ) + FT_FREE( parser->base_dict ); + + return error; + } + + + FT_LOCAL_DEF( void ) + T1_Finalize_Parser( T1_Parser parser ) + { + FT_Memory memory = parser->root.memory; + + + /* always free the private dictionary */ + FT_FREE( parser->private_dict ); + + /* free the base dictionary only when we have a disk stream */ + if ( !parser->in_memory ) + FT_FREE( parser->base_dict ); + + parser->root.funcs.done( &parser->root ); + } + + + FT_LOCAL_DEF( FT_Error ) + T1_Get_Private_Dict( T1_Parser parser, + PSAux_Service psaux ) + { + FT_Stream stream = parser->stream; + FT_Memory memory = parser->root.memory; + FT_Error error = T1_Err_Ok; + FT_ULong size; + + + if ( parser->in_pfb ) + { + /* in the case of the PFB format, the private dictionary can be */ + /* made of several segments. We thus first read the number of */ + /* segments to compute the total size of the private dictionary */ + /* then re-read them into memory. */ + FT_Long start_pos = FT_STREAM_POS(); + FT_UShort tag; + + + parser->private_len = 0; + for (;;) + { + error = read_pfb_tag( stream, &tag, &size ); + if ( error ) + goto Fail; + + if ( tag != 0x8002U ) + break; + + parser->private_len += size; + + if ( FT_STREAM_SKIP( size ) ) + goto Fail; + } + + /* Check that we have a private dictionary there */ + /* and allocate private dictionary buffer */ + if ( parser->private_len == 0 ) + { + FT_ERROR(( "T1_Get_Private_Dict:" + " invalid private dictionary section\n" )); + error = T1_Err_Invalid_File_Format; + goto Fail; + } + + if ( FT_STREAM_SEEK( start_pos ) || + FT_ALLOC( parser->private_dict, parser->private_len ) ) + goto Fail; + + parser->private_len = 0; + for (;;) + { + error = read_pfb_tag( stream, &tag, &size ); + if ( error || tag != 0x8002U ) + { + error = T1_Err_Ok; + break; + } + + if ( FT_STREAM_READ( parser->private_dict + parser->private_len, + size ) ) + goto Fail; + + parser->private_len += size; + } + } + else + { + /* We have already `loaded' the whole PFA font file into memory; */ + /* if this is a memory resource, allocate a new block to hold */ + /* the private dict. Otherwise, simply overwrite into the base */ + /* dictionary block in the heap. */ + + /* first of all, look at the `eexec' keyword */ + FT_Byte* cur = parser->base_dict; + FT_Byte* limit = cur + parser->base_len; + FT_Byte c; + + + Again: + for (;;) + { + c = cur[0]; + if ( c == 'e' && cur + 9 < limit ) /* 9 = 5 letters for `eexec' + */ + /* newline + 4 chars */ + { + if ( cur[1] == 'e' && + cur[2] == 'x' && + cur[3] == 'e' && + cur[4] == 'c' ) + break; + } + cur++; + if ( cur >= limit ) + { + FT_ERROR(( "T1_Get_Private_Dict:" + " could not find `eexec' keyword\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + } + + /* check whether `eexec' was real -- it could be in a comment */ + /* or string (as e.g. in u003043t.gsf from ghostscript) */ + + parser->root.cursor = parser->base_dict; + parser->root.limit = cur + 9; + + cur = parser->root.cursor; + limit = parser->root.limit; + + while ( cur < limit ) + { + if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 ) + goto Found; + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + break; + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } + + /* we haven't found the correct `eexec'; go back and continue */ + /* searching */ + + cur = limit; + limit = parser->base_dict + parser->base_len; + goto Again; + + /* now determine where to write the _encrypted_ binary private */ + /* dictionary. We overwrite the base dictionary for disk-based */ + /* resources and allocate a new block otherwise */ + + Found: + parser->root.limit = parser->base_dict + parser->base_len; + + T1_Skip_PS_Token( parser ); + cur = parser->root.cursor; + + /* according to the Type1 spec, the first cipher byte must not be */ + /* an ASCII whitespace character code (blank, tab, carriage return */ + /* or line feed). We have seen Type 1 fonts with two line feed */ + /* characters... So skip now all whitespace character codes. */ + while ( cur < limit && + ( *cur == ' ' || + *cur == '\t' || + *cur == '\r' || + *cur == '\n' ) ) + ++cur; + if ( cur >= limit ) + { + FT_ERROR(( "T1_Get_Private_Dict:" + " `eexec' not properly terminated\n" )); + error = T1_Err_Invalid_File_Format; + goto Exit; + } + + size = parser->base_len - ( cur - parser->base_dict ); + + if ( parser->in_memory ) + { + /* note that we allocate one more byte to put a terminating `0' */ + if ( FT_ALLOC( parser->private_dict, size + 1 ) ) + goto Fail; + parser->private_len = size; + } + else + { + parser->single_block = 1; + parser->private_dict = parser->base_dict; + parser->private_len = size; + parser->base_dict = 0; + parser->base_len = 0; + } + + /* now determine whether the private dictionary is encoded in binary */ + /* or hexadecimal ASCII format -- decode it accordingly */ + + /* we need to access the next 4 bytes (after the final \r following */ + /* the `eexec' keyword); if they all are hexadecimal digits, then */ + /* we have a case of ASCII storage */ + + if ( ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) && + ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) ) + { + /* ASCII hexadecimal encoding */ + FT_Long len; + + + parser->root.cursor = cur; + (void)psaux->ps_parser_funcs->to_bytes( &parser->root, + parser->private_dict, + parser->private_len, + &len, + 0 ); + parser->private_len = len; + + /* put a safeguard */ + parser->private_dict[len] = '\0'; + } + else + /* binary encoding -- copy the private dict */ + FT_MEM_MOVE( parser->private_dict, cur, size ); + } + + /* we now decrypt the encoded binary private dictionary */ + psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U ); + + /* replace the four random bytes at the beginning with whitespace */ + parser->private_dict[0] = ' '; + parser->private_dict[1] = ' '; + parser->private_dict[2] = ' '; + parser->private_dict[3] = ' '; + + parser->root.base = parser->private_dict; + parser->root.cursor = parser->private_dict; + parser->root.limit = parser->root.cursor + parser->private_len; + + Fail: + Exit: + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1parse.h b/alienblaster/project/jni/freetype/src/type1/t1parse.h new file mode 100644 index 000000000..fb1c8a883 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1parse.h @@ -0,0 +1,135 @@ +/***************************************************************************/ +/* */ +/* t1parse.h */ +/* */ +/* Type 1 parser (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2008 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1PARSE_H__ +#define __T1PARSE_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_STREAM_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_ParserRec */ + /* */ + /* <Description> */ + /* A PS_ParserRec is an object used to parse a Type 1 fonts very */ + /* quickly. */ + /* */ + /* <Fields> */ + /* root :: The root parser. */ + /* */ + /* stream :: The current input stream. */ + /* */ + /* base_dict :: A pointer to the top-level dictionary. */ + /* */ + /* base_len :: The length in bytes of the top dictionary. */ + /* */ + /* private_dict :: A pointer to the private dictionary. */ + /* */ + /* private_len :: The length in bytes of the private dictionary. */ + /* */ + /* in_pfb :: A boolean. Indicates that we are handling a PFB */ + /* file. */ + /* */ + /* in_memory :: A boolean. Indicates a memory-based stream. */ + /* */ + /* single_block :: A boolean. Indicates that the private dictionary */ + /* is stored in lieu of the base dictionary. */ + /* */ + typedef struct T1_ParserRec_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* base_dict; + FT_ULong base_len; + + FT_Byte* private_dict; + FT_ULong private_len; + + FT_Bool in_pfb; + FT_Bool in_memory; + FT_Bool single_block; + + } T1_ParserRec, *T1_Parser; + + +#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) +#define T1_Done_Table( p ) \ + do \ + { \ + if ( (p)->funcs.done ) \ + (p)->funcs.done( p ); \ + } while ( 0 ) +#define T1_Release_Table( p ) \ + do \ + { \ + if ( (p)->funcs.release ) \ + (p)->funcs.release( p ); \ + } while ( 0 ) + + +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t ) + +#define T1_ToCoordArray( p, m, c ) \ + (p)->root.funcs.to_coord_array( &(p)->root, m, c ) +#define T1_ToFixedArray( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define T1_ToToken( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) +#define T1_ToTokenArray( p, t, m, c ) \ + (p)->root.funcs.to_token_array( &(p)->root, t, m, c ) + +#define T1_Load_Field( p, f, o, m, pf ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) + +#define T1_Load_Field_Table( p, f, o, m, pf ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) + + + FT_LOCAL( FT_Error ) + T1_New_Parser( T1_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( FT_Error ) + T1_Get_Private_Dict( T1_Parser parser, + PSAux_Service psaux ); + + FT_LOCAL( void ) + T1_Finalize_Parser( T1_Parser parser ); + + +FT_END_HEADER + +#endif /* __T1PARSE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type1/t1tokens.h b/alienblaster/project/jni/freetype/src/type1/t1tokens.h new file mode 100644 index 000000000..2d692f0e6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type1/t1tokens.h @@ -0,0 +1,143 @@ +/***************************************************************************/ +/* */ +/* t1tokens.h */ +/* */ +/* Type 1 tokenizer (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontInfoRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "Notice", notice, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "FullName", full_name, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "FamilyName", family_name, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_STRING( "Weight", weight, + T1_FIELD_DICT_FONTDICT ) + + /* we use pointers to detect modifications made by synthetic fonts */ + T1_FIELD_NUM ( "ItalicAngle", italic_angle, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, + T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, + T1_FIELD_DICT_FONTDICT ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, + T1_FIELD_DICT_FONTDICT ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_PrivateRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_PRIVATE + + T1_FIELD_NUM ( "UniqueID", unique_id, + T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "lenIV", lenIV, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "LanguageGroup", language_group, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "password", password, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_FIXED_1000( "BlueScale", blue_scale, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "BlueShift", blue_shift, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, + T1_FIELD_DICT_PRIVATE ) + + T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor, + T1_FIELD_DICT_PRIVATE ) + T1_FIELD_BOOL ( "ForceBold", force_bold, + T1_FIELD_DICT_PRIVATE ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_KEY ( "FontName", font_name, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "PaintType", paint_type, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_NUM ( "FontType", font_type, T1_FIELD_DICT_FONTDICT ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT ) + + +#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FaceRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FACE + + T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE ) + T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_BlendRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BLEND + + T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector, + T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT ) + + +#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type42/Jamfile b/alienblaster/project/jni/freetype/src/type42/Jamfile new file mode 100644 index 000000000..00371d54f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/Jamfile @@ -0,0 +1,29 @@ +# FreeType 2 src/type42 Jamfile +# +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) type42 ; + +{ + local _sources ; + + if $(FT2_MULTI) + { + _sources = t42objs t42parse t42drivr ; + } + else + { + _sources = type42 ; + } + + Library $(FT2_LIB) : $(_sources).c ; +} + +# end of src/type42 Jamfile diff --git a/alienblaster/project/jni/freetype/src/type42/module.mk b/alienblaster/project/jni/freetype/src/type42/module.mk new file mode 100644 index 000000000..b3f10a8d3 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Type42 module definition +# + + +# Copyright 2002, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += TYPE42_DRIVER + +define TYPE42_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, t42_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)type42 $(ECHO_DRIVER_DESC)Type 42 font files with no known extension$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/type42/rules.mk b/alienblaster/project/jni/freetype/src/type42/rules.mk new file mode 100644 index 000000000..eac1081eb --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/rules.mk @@ -0,0 +1,70 @@ +# +# FreeType 2 Type42 driver configuration rules +# + + +# Copyright 2002, 2003, 2008 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Type42 driver directory +# +T42_DIR := $(SRC_DIR)/type42 + + +# compilation flags for the driver +# +T42_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T42_DIR)) + + +# Type42 driver source +# +T42_DRV_SRC := $(T42_DIR)/t42objs.c \ + $(T42_DIR)/t42parse.c \ + $(T42_DIR)/t42drivr.c + +# Type42 driver headers +# +T42_DRV_H := $(T42_DRV_SRC:%.c=%.h) \ + $(T42_DIR)/t42error.h \ + $(T42_DIR)/t42types.h + + +# Type42 driver object(s) +# +# T42_DRV_OBJ_M is used during `multi' builds +# T42_DRV_OBJ_S is used during `single' builds +# +T42_DRV_OBJ_M := $(T42_DRV_SRC:$(T42_DIR)/%.c=$(OBJ_DIR)/%.$O) +T42_DRV_OBJ_S := $(OBJ_DIR)/type42.$O + +# Type42 driver source file for single build +# +T42_DRV_SRC_S := $(T42_DIR)/type42.c + + +# Type42 driver - single object +# +$(T42_DRV_OBJ_S): $(T42_DRV_SRC_S) $(T42_DRV_SRC) $(FREETYPE_H) $(T42_DRV_H) + $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T42_DRV_SRC_S)) + + +# Type42 driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(T42_DIR)/%.c $(FREETYPE_H) $(T42_DRV_H) + $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(T42_DRV_OBJ_S) +DRV_OBJS_M += $(T42_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/type42/t42drivr.c b/alienblaster/project/jni/freetype/src/type42/t42drivr.c new file mode 100644 index 000000000..820c67961 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/t42drivr.c @@ -0,0 +1,246 @@ +/***************************************************************************/ +/* */ +/* t42drivr.c */ +/* */ +/* High-level Type 42 driver interface (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2007, 2009 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This driver implements Type42 fonts as described in the */ + /* Technical Note #5012 from Adobe, with these limitations: */ + /* */ + /* 1) CID Fonts are not currently supported. */ + /* 2) Incremental fonts making use of the GlyphDirectory keyword */ + /* will be loaded, but the rendering will be using the TrueType */ + /* tables. */ + /* 3) As for Type1 fonts, CDevProc is not supported. */ + /* 4) The Metrics dictionary is not supported. */ + /* 5) AFM metrics are not supported. */ + /* */ + /* In other words, this driver supports Type42 fonts derived from */ + /* TrueType fonts in a non-CID manner, as done by usual conversion */ + /* programs. */ + /* */ + /*************************************************************************/ + + +#include "t42drivr.h" +#include "t42objs.h" +#include "t42error.h" +#include FT_INTERNAL_DEBUG_H + +#include FT_SERVICE_XFREE86_NAME_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_POSTSCRIPT_INFO_H + +#undef FT_COMPONENT +#define FT_COMPONENT trace_t42 + + + /* + * + * GLYPH DICT SERVICE + * + */ + + static FT_Error + t42_get_glyph_name( T42_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max ); + + return T42_Err_Ok; + } + + + static FT_UInt + t42_get_name_index( T42_Face face, + FT_String* glyph_name ) + { + FT_Int i; + FT_String* gname; + + + for ( i = 0; i < face->type1.num_glyphs; i++ ) + { + gname = face->type1.glyph_names[i]; + + if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) ) + return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] ); + } + + return 0; + } + + + static const FT_Service_GlyphDictRec t42_service_glyph_dict = + { + (FT_GlyphDict_GetNameFunc) t42_get_glyph_name, + (FT_GlyphDict_NameIndexFunc)t42_get_name_index + }; + + + /* + * + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + t42_get_ps_font_name( T42_Face face ) + { + return (const char*)face->type1.font_name; + } + + + static const FT_Service_PsFontNameRec t42_service_ps_font_name = + { + (FT_PsName_GetFunc)t42_get_ps_font_name + }; + + + /* + * + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Error + t42_ps_get_font_info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + *afont_info = ((T42_Face)face)->type1.font_info; + + return T42_Err_Ok; + } + + + static FT_Error + t42_ps_get_font_extra( FT_Face face, + PS_FontExtraRec* afont_extra ) + { + *afont_extra = ((T42_Face)face)->type1.font_extra; + + return T42_Err_Ok; + } + + + static FT_Int + t42_ps_has_glyph_names( FT_Face face ) + { + FT_UNUSED( face ); + + return 1; + } + + + static FT_Error + t42_ps_get_font_private( FT_Face face, + PS_PrivateRec* afont_private ) + { + *afont_private = ((T42_Face)face)->type1.private_dict; + + return T42_Err_Ok; + } + + + static const FT_Service_PsInfoRec t42_service_ps_info = + { + (PS_GetFontInfoFunc) t42_ps_get_font_info, + (PS_GetFontExtraFunc) t42_ps_get_font_extra, + (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names, + (PS_GetFontPrivateFunc)t42_ps_get_font_private + }; + + + /* + * + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec t42_services[] = + { + { FT_SERVICE_ID_GLYPH_DICT, &t42_service_glyph_dict }, + { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name }, + { FT_SERVICE_ID_POSTSCRIPT_INFO, &t42_service_ps_info }, + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_42 }, + { NULL, NULL } + }; + + + static FT_Module_Interface + T42_Get_Interface( FT_Driver driver, + const FT_String* t42_interface ) + { + FT_UNUSED( driver ); + + return ft_service_list_lookup( t42_services, t42_interface ); + } + + + const FT_Driver_ClassRec t42_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_MODULE_DRIVER_HAS_HINTER, +#else + 0, +#endif + + sizeof ( T42_DriverRec ), + + "type42", + 0x10000L, + 0x20000L, + + 0, /* format interface */ + + (FT_Module_Constructor)T42_Driver_Init, + (FT_Module_Destructor) T42_Driver_Done, + (FT_Module_Requester) T42_Get_Interface, + }, + + sizeof ( T42_FaceRec ), + sizeof ( T42_SizeRec ), + sizeof ( T42_GlyphSlotRec ), + + (FT_Face_InitFunc) T42_Face_Init, + (FT_Face_DoneFunc) T42_Face_Done, + (FT_Size_InitFunc) T42_Size_Init, + (FT_Size_DoneFunc) T42_Size_Done, + (FT_Slot_InitFunc) T42_GlyphSlot_Init, + (FT_Slot_DoneFunc) T42_GlyphSlot_Done, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + (FT_Slot_LoadFunc) T42_GlyphSlot_Load, + + (FT_Face_GetKerningFunc) 0, + (FT_Face_AttachFunc) 0, + + (FT_Face_GetAdvancesFunc) 0, + (FT_Size_RequestFunc) T42_Size_Request, + (FT_Size_SelectFunc) T42_Size_Select + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type42/t42drivr.h b/alienblaster/project/jni/freetype/src/type42/t42drivr.h new file mode 100644 index 000000000..4717e4613 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/t42drivr.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* t42drivr.h */ +/* */ +/* High-level Type 42 driver interface (specification). */ +/* */ +/* Copyright 2002 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42DRIVR_H__ +#define __T42DRIVR_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) t42_driver_class; + + +FT_END_HEADER + + +#endif /* __T42DRIVR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type42/t42error.h b/alienblaster/project/jni/freetype/src/type42/t42error.h new file mode 100644 index 000000000..b23091001 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/t42error.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* t42error.h */ +/* */ +/* Type 42 error codes (specification only). */ +/* */ +/* Copyright 2002, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Type 42 error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef __T42ERROR_H__ +#define __T42ERROR_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX T42_Err_ +#define FT_ERR_BASE FT_Mod_Err_Type42 + +#include FT_ERRORS_H + +#endif /* __T42ERROR_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type42/t42objs.c b/alienblaster/project/jni/freetype/src/type42/t42objs.c new file mode 100644 index 000000000..9081ffc6d --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/t42objs.c @@ -0,0 +1,648 @@ +/***************************************************************************/ +/* */ +/* t42objs.c */ +/* */ +/* Type 42 objects manager (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 */ +/* by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "t42objs.h" +#include "t42parse.h" +#include "t42error.h" +#include FT_INTERNAL_DEBUG_H +#include FT_LIST_H + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_t42 + + + static FT_Error + T42_Open_Face( T42_Face face ) + { + T42_LoaderRec loader; + T42_Parser parser; + T1_Font type1 = &face->type1; + FT_Memory memory = face->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + t42_loader_init( &loader, face ); + + parser = &loader.parser; + + if ( FT_ALLOC( face->ttf_data, 12 ) ) + goto Exit; + + error = t42_parser_init( parser, + face->root.stream, + memory, + psaux); + if ( error ) + goto Exit; + + error = t42_parse_dict( face, &loader, + parser->base_dict, parser->base_len ); + if ( error ) + goto Exit; + + if ( type1->font_type != 42 ) + { + error = T42_Err_Unknown_File_Format; + goto Exit; + } + + /* now, propagate the charstrings and glyphnames tables */ + /* to the Type1 data */ + type1->num_glyphs = loader.num_glyphs; + + if ( !loader.charstrings.init ) + { + FT_ERROR(( "T42_Open_Face: no charstrings array in face\n" )); + error = T42_Err_Invalid_File_Format; + } + + loader.charstrings.init = 0; + type1->charstrings_block = loader.charstrings.block; + type1->charstrings = loader.charstrings.elements; + type1->charstrings_len = loader.charstrings.lengths; + + /* we copy the glyph names `block' and `elements' fields; */ + /* the `lengths' field must be released later */ + type1->glyph_names_block = loader.glyph_names.block; + type1->glyph_names = (FT_String**)loader.glyph_names.elements; + loader.glyph_names.block = 0; + loader.glyph_names.elements = 0; + + /* we must now build type1.encoding when we have a custom array */ + if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY ) + { + FT_Int charcode, idx, min_char, max_char; + FT_Byte* char_name; + FT_Byte* glyph_name; + + + /* OK, we do the following: for each element in the encoding */ + /* table, look up the index of the glyph having the same name */ + /* as defined in the CharStrings array. */ + /* The index is then stored in type1.encoding.char_index, and */ + /* the name in type1.encoding.char_name */ + + min_char = 0; + max_char = 0; + + charcode = 0; + for ( ; charcode < loader.encoding_table.max_elems; charcode++ ) + { + type1->encoding.char_index[charcode] = 0; + type1->encoding.char_name [charcode] = (char *)".notdef"; + + char_name = loader.encoding_table.elements[charcode]; + if ( char_name ) + for ( idx = 0; idx < type1->num_glyphs; idx++ ) + { + glyph_name = (FT_Byte*)type1->glyph_names[idx]; + if ( ft_strcmp( (const char*)char_name, + (const char*)glyph_name ) == 0 ) + { + type1->encoding.char_index[charcode] = (FT_UShort)idx; + type1->encoding.char_name [charcode] = (char*)glyph_name; + + /* Change min/max encoded char only if glyph name is */ + /* not /.notdef */ + if ( ft_strcmp( (const char*)".notdef", + (const char*)glyph_name ) != 0 ) + { + if ( charcode < min_char ) + min_char = charcode; + if ( charcode >= max_char ) + max_char = charcode + 1; + } + break; + } + } + } + + type1->encoding.code_first = min_char; + type1->encoding.code_last = max_char; + type1->encoding.num_chars = loader.num_chars; + } + + Exit: + t42_loader_done( &loader ); + return error; + } + + + /***************** Driver Functions *************/ + + + FT_LOCAL_DEF( FT_Error ) + T42_Face_Init( FT_Stream stream, + T42_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + FT_Face root = (FT_Face)&face->root; + T1_Font type1 = &face->type1; + PS_FontInfo info = &type1->font_info; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + FT_UNUSED( face_index ); + FT_UNUSED( stream ); + + + face->ttf_face = NULL; + face->root.num_faces = 1; + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + face->psnames = psnames; + + face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ), + "psaux" ); + psaux = (PSAux_Service)face->psaux; + + /* open the tokenizer, this will also check the font format */ + error = T42_Open_Face( face ); + if ( error ) + goto Exit; + + /* if we just wanted to check the format, leave successfully now */ + if ( face_index < 0 ) + goto Exit; + + /* check the face index */ + if ( face_index > 0 ) + { + FT_ERROR(( "T42_Face_Init: invalid face index\n" )); + error = T42_Err_Invalid_Argument; + goto Exit; + } + + /* Now load the font program into the face object */ + + /* Init the face object fields */ + /* Now set up root face fields */ + + root->num_glyphs = type1->num_glyphs; + root->num_charmaps = 0; + root->face_index = 0; + + root->face_flags = FT_FACE_FLAG_SCALABLE | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_GLYPH_NAMES; + + if ( info->is_fixed_pitch ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* We only set this flag if we have the patented bytecode interpreter. */ + /* There are no known `tricky' Type42 fonts that could be loaded with */ + /* the unpatented interpreter. */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + root->face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* XXX: TODO -- add kerning with .afm support */ + + /* get style name -- be careful, some broken fonts only */ + /* have a `/FontName' dictionary entry! */ + root->family_name = info->family_name; + /* assume "Regular" style if we don't know better */ + root->style_name = (char *)"Regular"; + if ( root->family_name ) + { + char* full = info->full_name; + char* family = root->family_name; + + + if ( full ) + { + while ( *full ) + { + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + if ( !*family ) + root->style_name = full; + break; + } + } + } + } + } + else + { + /* do we have a `/FontName'? */ + if ( type1->font_name ) + root->family_name = type1->font_name; + } + + /* no embedded bitmap support */ + root->num_fixed_sizes = 0; + root->available_sizes = 0; + + /* Load the TTF font embedded in the T42 font */ + { + FT_Open_Args args; + + + args.flags = FT_OPEN_MEMORY; + args.memory_base = face->ttf_data; + args.memory_size = face->ttf_size; + + if ( num_params ) + { + args.flags |= FT_OPEN_PARAMS; + args.num_params = num_params; + args.params = params; + } + + error = FT_Open_Face( FT_FACE_LIBRARY( face ), + &args, 0, &face->ttf_face ); + } + + if ( error ) + goto Exit; + + FT_Done_Size( face->ttf_face->size ); + + /* Ignore info in FontInfo dictionary and use the info from the */ + /* loaded TTF font. The PostScript interpreter also ignores it. */ + root->bbox = face->ttf_face->bbox; + root->units_per_EM = face->ttf_face->units_per_EM; + + root->ascender = face->ttf_face->ascender; + root->descender = face->ttf_face->descender; + root->height = face->ttf_face->height; + + root->max_advance_width = face->ttf_face->max_advance_width; + root->max_advance_height = face->ttf_face->max_advance_height; + + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; + + /* compute style flags */ + root->style_flags = 0; + if ( info->italic_angle ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->ttf_face->style_flags & FT_STYLE_FLAG_BOLD ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + + if ( face->ttf_face->face_flags & FT_FACE_FLAG_VERTICAL ) + root->face_flags |= FT_FACE_FLAG_VERTICAL; + + { + if ( psnames && psaux ) + { + FT_CharMapRec charmap; + T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes; + FT_CMap_Class clazz; + + + charmap.face = root; + + /* first of all, try to synthesize a Unicode charmap */ + charmap.platform_id = 3; + charmap.encoding_id = 1; + charmap.encoding = FT_ENCODING_UNICODE; + + FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL ); + + /* now, generate an Adobe Standard encoding when appropriate */ + charmap.platform_id = 7; + clazz = NULL; + + switch ( type1->encoding_type ) + { + case T1_ENCODING_TYPE_STANDARD: + charmap.encoding = FT_ENCODING_ADOBE_STANDARD; + charmap.encoding_id = 0; + clazz = cmap_classes->standard; + break; + + case T1_ENCODING_TYPE_EXPERT: + charmap.encoding = FT_ENCODING_ADOBE_EXPERT; + charmap.encoding_id = 1; + clazz = cmap_classes->expert; + break; + + case T1_ENCODING_TYPE_ARRAY: + charmap.encoding = FT_ENCODING_ADOBE_CUSTOM; + charmap.encoding_id = 2; + clazz = cmap_classes->custom; + break; + + case T1_ENCODING_TYPE_ISOLATIN1: + charmap.encoding = FT_ENCODING_ADOBE_LATIN_1; + charmap.encoding_id = 3; + clazz = cmap_classes->unicode; + break; + + default: + ; + } + + if ( clazz ) + FT_CMap_New( clazz, NULL, &charmap, NULL ); + +#if 0 + /* Select default charmap */ + if ( root->num_charmaps ) + root->charmap = root->charmaps[0]; +#endif + } + } + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + T42_Face_Done( T42_Face face ) + { + T1_Font type1; + PS_FontInfo info; + FT_Memory memory; + + + if ( !face ) + return; + + type1 = &face->type1; + info = &type1->font_info; + memory = face->root.memory; + + /* delete internal ttf face prior to freeing face->ttf_data */ + if ( face->ttf_face ) + FT_Done_Face( face->ttf_face ); + + /* release font info strings */ + FT_FREE( info->version ); + FT_FREE( info->notice ); + FT_FREE( info->full_name ); + FT_FREE( info->family_name ); + FT_FREE( info->weight ); + + /* release top dictionary */ + FT_FREE( type1->charstrings_len ); + FT_FREE( type1->charstrings ); + FT_FREE( type1->glyph_names ); + + FT_FREE( type1->charstrings_block ); + FT_FREE( type1->glyph_names_block ); + + FT_FREE( type1->encoding.char_index ); + FT_FREE( type1->encoding.char_name ); + FT_FREE( type1->font_name ); + + FT_FREE( face->ttf_data ); + +#if 0 + /* release afm data if present */ + if ( face->afm_data ) + T1_Done_AFM( memory, (T1_AFM*)face->afm_data ); +#endif + + /* release unicode map, if any */ + FT_FREE( face->unicode_map.maps ); + face->unicode_map.num_maps = 0; + + face->root.family_name = 0; + face->root.style_name = 0; + } + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* T42_Driver_Init */ + /* */ + /* <Description> */ + /* Initializes a given Type 42 driver object. */ + /* */ + /* <Input> */ + /* driver :: A handle to the target driver object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + T42_Driver_Init( T42_Driver driver ) + { + FT_Module ttmodule; + + + ttmodule = FT_Get_Module( FT_MODULE(driver)->library, "truetype" ); + driver->ttclazz = (FT_Driver_Class)ttmodule->clazz; + + return T42_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + T42_Driver_Done( T42_Driver driver ) + { + FT_UNUSED( driver ); + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Init( T42_Size size ) + { + FT_Face face = size->root.face; + T42_Face t42face = (T42_Face)face; + FT_Size ttsize; + FT_Error error = T42_Err_Ok; + + + error = FT_New_Size( t42face->ttf_face, &ttsize ); + size->ttsize = ttsize; + + FT_Activate_Size( ttsize ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Request( T42_Size size, + FT_Size_Request req ) + { + T42_Face face = (T42_Face)size->root.face; + FT_Error error; + + + FT_Activate_Size( size->ttsize ); + + error = FT_Request_Size( face->ttf_face, req ); + if ( !error ) + ( (FT_Size)size )->metrics = face->ttf_face->size->metrics; + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_Size_Select( T42_Size size, + FT_ULong strike_index ) + { + T42_Face face = (T42_Face)size->root.face; + FT_Error error; + + + FT_Activate_Size( size->ttsize ); + + error = FT_Select_Size( face->ttf_face, (FT_Int)strike_index ); + if ( !error ) + ( (FT_Size)size )->metrics = face->ttf_face->size->metrics; + + return error; + + } + + + FT_LOCAL_DEF( void ) + T42_Size_Done( T42_Size size ) + { + FT_Face face = size->root.face; + T42_Face t42face = (T42_Face)face; + FT_ListNode node; + + + node = FT_List_Find( &t42face->ttf_face->sizes_list, size->ttsize ); + if ( node ) + { + FT_Done_Size( size->ttsize ); + size->ttsize = NULL; + } + } + + + FT_LOCAL_DEF( FT_Error ) + T42_GlyphSlot_Init( T42_GlyphSlot slot ) + { + FT_Face face = slot->root.face; + T42_Face t42face = (T42_Face)face; + FT_GlyphSlot ttslot; + FT_Error error = T42_Err_Ok; + + + if ( face->glyph == NULL ) + { + /* First glyph slot for this face */ + slot->ttslot = t42face->ttf_face->glyph; + } + else + { + error = FT_New_GlyphSlot( t42face->ttf_face, &ttslot ); + slot->ttslot = ttslot; + } + + return error; + } + + + FT_LOCAL_DEF( void ) + T42_GlyphSlot_Done( T42_GlyphSlot slot ) + { + FT_Done_GlyphSlot( slot->ttslot ); + } + + + static void + t42_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* clear all public fields in the glyph slot */ + FT_ZERO( &slot->metrics ); + FT_ZERO( &slot->outline ); + FT_ZERO( &slot->bitmap ); + + slot->bitmap_left = 0; + slot->bitmap_top = 0; + slot->num_subglyphs = 0; + slot->subglyphs = 0; + slot->control_data = 0; + slot->control_len = 0; + slot->other = 0; + slot->format = FT_GLYPH_FORMAT_NONE; + + slot->linearHoriAdvance = 0; + slot->linearVertAdvance = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + T42_GlyphSlot_Load( FT_GlyphSlot glyph, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + T42_GlyphSlot t42slot = (T42_GlyphSlot)glyph; + T42_Size t42size = (T42_Size)size; + FT_Driver_Class ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz; + + + t42_glyphslot_clear( t42slot->ttslot ); + error = ttclazz->load_glyph( t42slot->ttslot, + t42size->ttsize, + glyph_index, + load_flags | FT_LOAD_NO_BITMAP ); + + if ( !error ) + { + glyph->metrics = t42slot->ttslot->metrics; + + glyph->linearHoriAdvance = t42slot->ttslot->linearHoriAdvance; + glyph->linearVertAdvance = t42slot->ttslot->linearVertAdvance; + + glyph->format = t42slot->ttslot->format; + glyph->outline = t42slot->ttslot->outline; + + glyph->bitmap = t42slot->ttslot->bitmap; + glyph->bitmap_left = t42slot->ttslot->bitmap_left; + glyph->bitmap_top = t42slot->ttslot->bitmap_top; + + glyph->num_subglyphs = t42slot->ttslot->num_subglyphs; + glyph->subglyphs = t42slot->ttslot->subglyphs; + + glyph->control_data = t42slot->ttslot->control_data; + glyph->control_len = t42slot->ttslot->control_len; + } + + return error; + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type42/t42objs.h b/alienblaster/project/jni/freetype/src/type42/t42objs.h new file mode 100644 index 000000000..289dedcc6 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/t42objs.h @@ -0,0 +1,124 @@ +/***************************************************************************/ +/* */ +/* t42objs.h */ +/* */ +/* Type 42 objects manager (specification). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42OBJS_H__ +#define __T42OBJS_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include "t42types.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DRIVER_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /* Type42 size */ + typedef struct T42_SizeRec_ + { + FT_SizeRec root; + FT_Size ttsize; + + } T42_SizeRec, *T42_Size; + + + /* Type42 slot */ + typedef struct T42_GlyphSlotRec_ + { + FT_GlyphSlotRec root; + FT_GlyphSlot ttslot; + + } T42_GlyphSlotRec, *T42_GlyphSlot; + + + /* Type 42 driver */ + typedef struct T42_DriverRec_ + { + FT_DriverRec root; + FT_Driver_Class ttclazz; + void* extension_component; + + } T42_DriverRec, *T42_Driver; + + + /* */ + + + FT_LOCAL( FT_Error ) + T42_Face_Init( FT_Stream stream, + T42_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + FT_LOCAL( void ) + T42_Face_Done( T42_Face face ); + + + FT_LOCAL( FT_Error ) + T42_Size_Init( T42_Size size ); + + + FT_LOCAL( FT_Error ) + T42_Size_Request( T42_Size size, + FT_Size_Request req ); + + + FT_LOCAL( FT_Error ) + T42_Size_Select( T42_Size size, + FT_ULong strike_index ); + + + FT_LOCAL( void ) + T42_Size_Done( T42_Size size ); + + + FT_LOCAL( FT_Error ) + T42_GlyphSlot_Init( T42_GlyphSlot slot ); + + + FT_LOCAL( FT_Error ) + T42_GlyphSlot_Load( FT_GlyphSlot glyph, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + FT_LOCAL( void ) + T42_GlyphSlot_Done( T42_GlyphSlot slot ); + + + FT_LOCAL( FT_Error ) + T42_Driver_Init( T42_Driver driver ); + + FT_LOCAL( void ) + T42_Driver_Done( T42_Driver driver ); + + /* */ + +FT_END_HEADER + + +#endif /* __T42OBJS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type42/t42parse.c b/alienblaster/project/jni/freetype/src/type42/t42parse.c new file mode 100644 index 000000000..13bda64c8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/t42parse.c @@ -0,0 +1,1178 @@ +/***************************************************************************/ +/* */ +/* t42parse.c */ +/* */ +/* Type 42 font parser (body). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by */ +/* Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include "t42parse.h" +#include "t42error.h" +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_t42 + + + static void + t42_parse_font_matrix( T42_Face face, + T42_Loader loader ); + static void + t42_parse_encoding( T42_Face face, + T42_Loader loader ); + + static void + t42_parse_charstrings( T42_Face face, + T42_Loader loader ); + + static void + t42_parse_sfnts( T42_Face face, + T42_Loader loader ); + + + /* as Type42 fonts have no Private dict, */ + /* we set the last argument of T1_FIELD_XXX to 0 */ + static const + T1_FieldRec t42_keywords[] = { + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontInfo +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_INFO + + T1_FIELD_STRING( "version", version, 0 ) + T1_FIELD_STRING( "Notice", notice, 0 ) + T1_FIELD_STRING( "FullName", full_name, 0 ) + T1_FIELD_STRING( "FamilyName", family_name, 0 ) + T1_FIELD_STRING( "Weight", weight, 0 ) + T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 ) + T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 ) + T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 ) + T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE PS_FontExtraRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA + + T1_FIELD_NUM ( "FSType", fs_type, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE T1_FontRec +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_FONT_DICT + + T1_FIELD_KEY ( "FontName", font_name, 0 ) + T1_FIELD_NUM ( "PaintType", paint_type, 0 ) + T1_FIELD_NUM ( "FontType", font_type, 0 ) + T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 ) + +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX("FontBBox", xMin, 0 ) + + T1_FIELD_CALLBACK( "FontMatrix", t42_parse_font_matrix, 0 ) + T1_FIELD_CALLBACK( "Encoding", t42_parse_encoding, 0 ) + T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings, 0 ) + T1_FIELD_CALLBACK( "sfnts", t42_parse_sfnts, 0 ) + + { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 } + }; + + +#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l ) +#define T1_Done_Table( p ) \ + do \ + { \ + if ( (p)->funcs.done ) \ + (p)->funcs.done( p ); \ + } while ( 0 ) +#define T1_Release_Table( p ) \ + do \ + { \ + if ( (p)->funcs.release ) \ + (p)->funcs.release( p ); \ + } while ( 0 ) + +#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root ) +#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root ) + +#define T1_ToInt( p ) \ + (p)->root.funcs.to_int( &(p)->root ) +#define T1_ToBytes( p, b, m, n, d ) \ + (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d ) + +#define T1_ToFixedArray( p, m, f, t ) \ + (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t ) +#define T1_ToToken( p, t ) \ + (p)->root.funcs.to_token( &(p)->root, t ) + +#define T1_Load_Field( p, f, o, m, pf ) \ + (p)->root.funcs.load_field( &(p)->root, f, o, m, pf ) +#define T1_Load_Field_Table( p, f, o, m, pf ) \ + (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf ) + + + /********************* Parsing Functions ******************/ + + FT_LOCAL_DEF( FT_Error ) + t42_parser_init( T42_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ) + { + FT_Error error = T42_Err_Ok; + FT_Long size; + + + psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory ); + + parser->stream = stream; + parser->base_len = 0; + parser->base_dict = 0; + parser->in_memory = 0; + + /*******************************************************************/ + /* */ + /* Here a short summary of what is going on: */ + /* */ + /* When creating a new Type 42 parser, we try to locate and load */ + /* the base dictionary, loading the whole font into memory. */ + /* */ + /* When `loading' the base dictionary, we only set up pointers */ + /* in the case of a memory-based stream. Otherwise, we allocate */ + /* and load the base dictionary in it. */ + /* */ + /* parser->in_memory is set if we have a memory stream. */ + /* */ + + if ( FT_STREAM_SEEK( 0L ) || + FT_FRAME_ENTER( 17 ) ) + goto Exit; + + if ( ft_memcmp( stream->cursor, "%!PS-TrueTypeFont", 17 ) != 0 ) + { + FT_TRACE2(( "not a Type42 font\n" )); + error = T42_Err_Unknown_File_Format; + } + + FT_FRAME_EXIT(); + + if ( error || FT_STREAM_SEEK( 0 ) ) + goto Exit; + + size = stream->size; + + /* now, try to load `size' bytes of the `base' dictionary we */ + /* found previously */ + + /* if it is a memory-based resource, set up pointers */ + if ( !stream->read ) + { + parser->base_dict = (FT_Byte*)stream->base + stream->pos; + parser->base_len = size; + parser->in_memory = 1; + + /* check that the `size' field is valid */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + else + { + /* read segment in memory */ + if ( FT_ALLOC( parser->base_dict, size ) || + FT_STREAM_READ( parser->base_dict, size ) ) + goto Exit; + + parser->base_len = size; + } + + parser->root.base = parser->base_dict; + parser->root.cursor = parser->base_dict; + parser->root.limit = parser->root.cursor + parser->base_len; + + Exit: + if ( error && !parser->in_memory ) + FT_FREE( parser->base_dict ); + + return error; + } + + + FT_LOCAL_DEF( void ) + t42_parser_done( T42_Parser parser ) + { + FT_Memory memory = parser->root.memory; + + + /* free the base dictionary only when we have a disk stream */ + if ( !parser->in_memory ) + FT_FREE( parser->base_dict ); + + parser->root.funcs.done( &parser->root ); + } + + + static int + t42_is_space( FT_Byte c ) + { + return ( c == ' ' || c == '\t' || + c == '\r' || c == '\n' || c == '\f' || + c == '\0' ); + } + + + static void + t42_parse_font_matrix( T42_Face face, + T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + FT_Matrix* matrix = &face->type1.font_matrix; + FT_Vector* offset = &face->type1.font_offset; + FT_Face root = (FT_Face)&face->root; + FT_Fixed temp[6]; + FT_Fixed temp_scale; + + + (void)T1_ToFixedArray( parser, 6, temp, 3 ); + + temp_scale = FT_ABS( temp[3] ); + + /* Set Units per EM based on FontMatrix values. We set the value to */ + /* 1000 / temp_scale, because temp_scale was already multiplied by */ + /* 1000 (in t1_tofixed, from psobjs.c). */ + + root->units_per_EM = (FT_UShort)( FT_DivFix( 1000 * 0x10000L, + temp_scale ) >> 16 ); + + /* we need to scale the values by 1.0/temp_scale */ + if ( temp_scale != 0x10000L ) { + temp[0] = FT_DivFix( temp[0], temp_scale ); + temp[1] = FT_DivFix( temp[1], temp_scale ); + temp[2] = FT_DivFix( temp[2], temp_scale ); + temp[4] = FT_DivFix( temp[4], temp_scale ); + temp[5] = FT_DivFix( temp[5], temp_scale ); + temp[3] = 0x10000L; + } + + matrix->xx = temp[0]; + matrix->yx = temp[1]; + matrix->xy = temp[2]; + matrix->yy = temp[3]; + + /* note that the offsets must be expressed in integer font units */ + offset->x = temp[4] >> 16; + offset->y = temp[5] >> 16; + } + + + static void + t42_parse_encoding( T42_Face face, + T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + if ( cur >= limit ) + { + FT_ERROR(( "t42_parse_encoding: out of bounds\n" )); + parser->root.error = T42_Err_Invalid_File_Format; + return; + } + + /* if we have a number or `[', the encoding is an array, */ + /* and we must load it now */ + if ( ft_isdigit( *cur ) || *cur == '[' ) + { + T1_Encoding encode = &face->type1.encoding; + FT_UInt count, n; + PS_Table char_table = &loader->encoding_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + FT_Bool only_immediates = 0; + + + /* read the number of entries in the encoding; should be 256 */ + if ( *cur == '[' ) + { + count = 256; + only_immediates = 1; + parser->root.cursor++; + } + else + count = (FT_UInt)T1_ToInt( parser ); + + T1_Skip_Spaces( parser ); + if ( parser->root.cursor >= limit ) + return; + + /* we use a T1_Table to store our charnames */ + loader->num_chars = encode->num_chars = count; + if ( FT_NEW_ARRAY( encode->char_index, count ) || + FT_NEW_ARRAY( encode->char_name, count ) || + FT_SET_ERROR( psaux->ps_table_funcs->init( + char_table, count, memory ) ) ) + { + parser->root.error = error; + return; + } + + /* We need to `zero' out encoding_table.elements */ + for ( n = 0; n < count; n++ ) + { + char* notdef = (char *)".notdef"; + + + T1_Add_Table( char_table, n, notdef, 8 ); + } + + /* Now we need to read records of the form */ + /* */ + /* ... charcode /charname ... */ + /* */ + /* for each entry in our table. */ + /* */ + /* We simply look for a number followed by an immediate */ + /* name. Note that this ignores correctly the sequence */ + /* that is often seen in type42 fonts: */ + /* */ + /* 0 1 255 { 1 index exch /.notdef put } for dup */ + /* */ + /* used to clean the encoding array before anything else. */ + /* */ + /* Alternatively, if the array is directly given as */ + /* */ + /* /Encoding [ ... ] */ + /* */ + /* we only read immediates. */ + + n = 0; + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + cur = parser->root.cursor; + + /* we stop when we encounter `def' or `]' */ + if ( *cur == 'd' && cur + 3 < limit ) + { + if ( cur[1] == 'e' && + cur[2] == 'f' && + t42_is_space( cur[3] ) ) + { + FT_TRACE6(( "encoding end\n" )); + cur += 3; + break; + } + } + if ( *cur == ']' ) + { + FT_TRACE6(( "encoding end\n" )); + cur++; + break; + } + + /* check whether we have found an entry */ + if ( ft_isdigit( *cur ) || only_immediates ) + { + FT_Int charcode; + + + if ( only_immediates ) + charcode = n; + else + { + charcode = (FT_Int)T1_ToInt( parser ); + T1_Skip_Spaces( parser ); + } + + cur = parser->root.cursor; + + if ( *cur == '/' && cur + 2 < limit && n < count ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + + len = parser->root.cursor - cur; + + parser->root.error = T1_Add_Table( char_table, charcode, + cur, len + 1 ); + if ( parser->root.error ) + return; + char_table->elements[charcode][len] = '\0'; + + n++; + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + } + + T1_Skip_Spaces( parser ); + } + + face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY; + parser->root.cursor = cur; + } + + /* Otherwise, we should have either `StandardEncoding', */ + /* `ExpertEncoding', or `ISOLatin1Encoding' */ + else + { + if ( cur + 17 < limit && + ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD; + + else if ( cur + 15 < limit && + ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT; + + else if ( cur + 18 < limit && + ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 ) + face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1; + + else + { + FT_ERROR(( "t42_parse_encoding: invalid token\n" )); + parser->root.error = T42_Err_Invalid_File_Format; + } + } + } + + + typedef enum T42_Load_Status_ + { + BEFORE_START, + BEFORE_TABLE_DIR, + OTHER_TABLES + + } T42_Load_Status; + + + static void + t42_parse_sfnts( T42_Face face, + T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + FT_Memory memory = parser->root.memory; + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_Error error; + FT_Int num_tables = 0; + FT_ULong count, ttf_size = 0; + + FT_Long n, string_size, old_string_size, real_size; + FT_Byte* string_buf = NULL; + FT_Bool allocated = 0; + + T42_Load_Status status; + + + /* The format is */ + /* */ + /* /sfnts [ <hexstring> <hexstring> ... ] def */ + /* */ + /* or */ + /* */ + /* /sfnts [ */ + /* <num_bin_bytes> RD <binary data> */ + /* <num_bin_bytes> RD <binary data> */ + /* ... */ + /* ] def */ + /* */ + /* with exactly one space after the `RD' token. */ + + T1_Skip_Spaces( parser ); + + if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' ) + { + FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + T1_Skip_Spaces( parser ); + status = BEFORE_START; + string_size = 0; + old_string_size = 0; + count = 0; + + while ( parser->root.cursor < limit ) + { + cur = parser->root.cursor; + + if ( *cur == ']' ) + { + parser->root.cursor++; + goto Exit; + } + + else if ( *cur == '<' ) + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + /* don't include delimiters */ + string_size = (FT_Long)( ( parser->root.cursor - cur - 2 + 1 ) / 2 ); + if ( FT_REALLOC( string_buf, old_string_size, string_size ) ) + goto Fail; + + allocated = 1; + + parser->root.cursor = cur; + (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 ); + old_string_size = string_size; + string_size = real_size; + } + + else if ( ft_isdigit( *cur ) ) + { + if ( allocated ) + { + FT_ERROR(( "t42_parse_sfnts: " + "can't handle mixed binary and hex strings\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + string_size = T1_ToInt( parser ); + + T1_Skip_PS_Token( parser ); /* `RD' */ + if ( parser->root.error ) + return; + + string_buf = parser->root.cursor + 1; /* one space after `RD' */ + + parser->root.cursor += string_size + 1; + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_sfnts: too many binary data\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + } + + if ( !string_buf ) + { + FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + /* A string can have a trailing zero byte for padding. Ignore it. */ + if ( string_buf[string_size - 1] == 0 && ( string_size % 2 == 1 ) ) + string_size--; + + if ( !string_size ) + { + FT_ERROR(( "t42_parse_sfnts: invalid string\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + for ( n = 0; n < string_size; n++ ) + { + switch ( status ) + { + case BEFORE_START: + /* load offset table, 12 bytes */ + if ( count < 12 ) + { + face->ttf_data[count++] = string_buf[n]; + continue; + } + else + { + num_tables = 16 * face->ttf_data[4] + face->ttf_data[5]; + status = BEFORE_TABLE_DIR; + ttf_size = 12 + 16 * num_tables; + + if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) ) + goto Fail; + } + /* fall through */ + + case BEFORE_TABLE_DIR: + /* the offset table is read; read the table directory */ + if ( count < ttf_size ) + { + face->ttf_data[count++] = string_buf[n]; + continue; + } + else + { + int i; + FT_ULong len; + + + for ( i = 0; i < num_tables; i++ ) + { + FT_Byte* p = face->ttf_data + 12 + 16 * i + 12; + + + len = FT_PEEK_ULONG( p ); + + /* Pad to a 4-byte boundary length */ + ttf_size += ( len + 3 ) & ~3; + } + + status = OTHER_TABLES; + face->ttf_size = ttf_size; + + /* there are no more than 256 tables, so no size check here */ + if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables, + ttf_size + 1 ) ) + goto Fail; + } + /* fall through */ + + case OTHER_TABLES: + /* all other tables are just copied */ + if ( count >= ttf_size ) + { + FT_ERROR(( "t42_parse_sfnts: too many binary data\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + face->ttf_data[count++] = string_buf[n]; + } + } + + T1_Skip_Spaces( parser ); + } + + /* if control reaches this point, the format was not valid */ + error = T42_Err_Invalid_File_Format; + + Fail: + parser->root.error = error; + + Exit: + if ( allocated ) + FT_FREE( string_buf ); + } + + + static void + t42_parse_charstrings( T42_Face face, + T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + PS_Table code_table = &loader->charstrings; + PS_Table name_table = &loader->glyph_names; + PS_Table swap_table = &loader->swap_table; + FT_Memory memory = parser->root.memory; + FT_Error error; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + FT_Byte* cur; + FT_Byte* limit = parser->root.limit; + FT_UInt n; + FT_UInt notdef_index = 0; + FT_Byte notdef_found = 0; + + + T1_Skip_Spaces( parser ); + + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + if ( ft_isdigit( *parser->root.cursor ) ) + { + loader->num_glyphs = (FT_UInt)T1_ToInt( parser ); + if ( parser->root.error ) + return; + } + else if ( *parser->root.cursor == '<' ) + { + /* We have `<< ... >>'. Count the number of `/' in the dictionary */ + /* to get its size. */ + FT_UInt count = 0; + + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + cur = parser->root.cursor; + + while ( parser->root.cursor < limit ) + { + if ( *parser->root.cursor == '/' ) + count++; + else if ( *parser->root.cursor == '>' ) + { + loader->num_glyphs = count; + parser->root.cursor = cur; /* rewind */ + break; + } + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + T1_Skip_Spaces( parser ); + } + } + else + { + FT_ERROR(( "t42_parse_charstrings: invalid token\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + /* initialize tables */ + + error = psaux->ps_table_funcs->init( code_table, + loader->num_glyphs, + memory ); + if ( error ) + goto Fail; + + error = psaux->ps_table_funcs->init( name_table, + loader->num_glyphs, + memory ); + if ( error ) + goto Fail; + + /* Initialize table for swapping index notdef_index and */ + /* index 0 names and codes (if necessary). */ + + error = psaux->ps_table_funcs->init( swap_table, 4, memory ); + if ( error ) + goto Fail; + + n = 0; + + for (;;) + { + /* The format is simple: */ + /* `/glyphname' + index [+ def] */ + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + if ( cur >= limit ) + break; + + /* We stop when we find an `end' keyword or '>' */ + if ( *cur == 'e' && + cur + 3 < limit && + cur[1] == 'n' && + cur[2] == 'd' && + t42_is_space( cur[3] ) ) + break; + if ( *cur == '>' ) + break; + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + return; + + if ( *cur == '/' ) + { + FT_PtrDist len; + + + if ( cur + 1 >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + cur++; /* skip `/' */ + len = parser->root.cursor - cur; + + error = T1_Add_Table( name_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + /* add a trailing zero to the name table */ + name_table->elements[n][len] = '\0'; + + /* record index of /.notdef */ + if ( *cur == '.' && + ft_strcmp( ".notdef", + (const char*)(name_table->elements[n]) ) == 0 ) + { + notdef_index = n; + notdef_found = 1; + } + + T1_Skip_Spaces( parser ); + + cur = parser->root.cursor; + + (void)T1_ToInt( parser ); + if ( parser->root.cursor >= limit ) + { + FT_ERROR(( "t42_parse_charstrings: out of bounds\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + len = parser->root.cursor - cur; + + error = T1_Add_Table( code_table, n, cur, len + 1 ); + if ( error ) + goto Fail; + + code_table->elements[n][len] = '\0'; + + n++; + if ( n >= loader->num_glyphs ) + break; + } + } + + loader->num_glyphs = n; + + if ( !notdef_found ) + { + FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph\n" )); + error = T42_Err_Invalid_File_Format; + goto Fail; + } + + /* if /.notdef does not occupy index 0, do our magic. */ + if ( ft_strcmp( (const char*)".notdef", + (const char*)name_table->elements[0] ) ) + { + /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */ + /* name and code entries to swap_table. Then place notdef_index */ + /* name and code entries into swap_table. Then swap name and code */ + /* entries at indices notdef_index and 0 using values stored in */ + /* swap_table. */ + + /* Index 0 name */ + error = T1_Add_Table( swap_table, 0, + name_table->elements[0], + name_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index 0 code */ + error = T1_Add_Table( swap_table, 1, + code_table->elements[0], + code_table->lengths [0] ); + if ( error ) + goto Fail; + + /* Index notdef_index name */ + error = T1_Add_Table( swap_table, 2, + name_table->elements[notdef_index], + name_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + /* Index notdef_index code */ + error = T1_Add_Table( swap_table, 3, + code_table->elements[notdef_index], + code_table->lengths [notdef_index] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, notdef_index, + swap_table->elements[0], + swap_table->lengths [0] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, notdef_index, + swap_table->elements[1], + swap_table->lengths [1] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( name_table, 0, + swap_table->elements[2], + swap_table->lengths [2] ); + if ( error ) + goto Fail; + + error = T1_Add_Table( code_table, 0, + swap_table->elements[3], + swap_table->lengths [3] ); + if ( error ) + goto Fail; + + } + + return; + + Fail: + parser->root.error = error; + } + + + static FT_Error + t42_load_keyword( T42_Face face, + T42_Loader loader, + T1_Field field ) + { + FT_Error error; + void* dummy_object; + void** objects; + FT_UInt max_objects = 0; + + + /* if the keyword has a dedicated callback, call it */ + if ( field->type == T1_FIELD_TYPE_CALLBACK ) + { + field->reader( (FT_Face)face, loader ); + error = loader->parser.root.error; + goto Exit; + } + + /* now the keyword is either a simple field or a table of fields; */ + /* we are now going to take care of it */ + + switch ( field->location ) + { + case T1_FIELD_LOCATION_FONT_INFO: + dummy_object = &face->type1.font_info; + break; + + case T1_FIELD_LOCATION_FONT_EXTRA: + dummy_object = &face->type1.font_extra; + break; + + case T1_FIELD_LOCATION_BBOX: + dummy_object = &face->type1.font_bbox; + break; + + default: + dummy_object = &face->type1; + } + + objects = &dummy_object; + + if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY || + field->type == T1_FIELD_TYPE_FIXED_ARRAY ) + error = T1_Load_Field_Table( &loader->parser, field, + objects, max_objects, 0 ); + else + error = T1_Load_Field( &loader->parser, field, + objects, max_objects, 0 ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + t42_parse_dict( T42_Face face, + T42_Loader loader, + FT_Byte* base, + FT_Long size ) + { + T42_Parser parser = &loader->parser; + FT_Byte* limit; + FT_Int n_keywords = (FT_Int)( sizeof ( t42_keywords ) / + sizeof ( t42_keywords[0] ) ); + + + parser->root.cursor = base; + parser->root.limit = base + size; + parser->root.error = T42_Err_Ok; + + limit = parser->root.limit; + + T1_Skip_Spaces( parser ); + + while ( parser->root.cursor < limit ) + { + FT_Byte* cur; + + + cur = parser->root.cursor; + + /* look for `FontDirectory' which causes problems for some fonts */ + if ( *cur == 'F' && cur + 25 < limit && + ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 ) + { + FT_Byte* cur2; + + + /* skip the `FontDirectory' keyword */ + T1_Skip_PS_Token( parser ); + T1_Skip_Spaces ( parser ); + cur = cur2 = parser->root.cursor; + + /* look up the `known' keyword */ + while ( cur < limit ) + { + if ( *cur == 'k' && cur + 5 < limit && + ft_strncmp( (char*)cur, "known", 5 ) == 0 ) + break; + + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + T1_Skip_Spaces ( parser ); + cur = parser->root.cursor; + } + + if ( cur < limit ) + { + T1_TokenRec token; + + + /* skip the `known' keyword and the token following it */ + T1_Skip_PS_Token( parser ); + T1_ToToken( parser, &token ); + + /* if the last token was an array, skip it! */ + if ( token.type == T1_TOKEN_TYPE_ARRAY ) + cur2 = parser->root.cursor; + } + parser->root.cursor = cur2; + } + + /* look for immediates */ + else if ( *cur == '/' && cur + 2 < limit ) + { + FT_PtrDist len; + + + cur++; + + parser->root.cursor = cur; + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + + len = parser->root.cursor - cur; + + if ( len > 0 && len < 22 && parser->root.cursor < limit ) + { + int i; + + + /* now compare the immediate name to the keyword table */ + + /* loop through all known keywords */ + for ( i = 0; i < n_keywords; i++ ) + { + T1_Field keyword = (T1_Field)&t42_keywords[i]; + FT_Byte *name = (FT_Byte*)keyword->ident; + + + if ( !name ) + continue; + + if ( cur[0] == name[0] && + len == (FT_PtrDist)ft_strlen( (const char *)name ) && + ft_memcmp( cur, name, len ) == 0 ) + { + /* we found it -- run the parsing callback! */ + parser->root.error = t42_load_keyword( face, + loader, + keyword ); + if ( parser->root.error ) + return parser->root.error; + break; + } + } + } + } + else + { + T1_Skip_PS_Token( parser ); + if ( parser->root.error ) + goto Exit; + } + + T1_Skip_Spaces( parser ); + } + + Exit: + return parser->root.error; + } + + + FT_LOCAL_DEF( void ) + t42_loader_init( T42_Loader loader, + T42_Face face ) + { + FT_UNUSED( face ); + + FT_MEM_ZERO( loader, sizeof ( *loader ) ); + loader->num_glyphs = 0; + loader->num_chars = 0; + + /* initialize the tables -- simply set their `init' field to 0 */ + loader->encoding_table.init = 0; + loader->charstrings.init = 0; + loader->glyph_names.init = 0; + } + + + FT_LOCAL_DEF( void ) + t42_loader_done( T42_Loader loader ) + { + T42_Parser parser = &loader->parser; + + + /* finalize tables */ + T1_Release_Table( &loader->encoding_table ); + T1_Release_Table( &loader->charstrings ); + T1_Release_Table( &loader->glyph_names ); + T1_Release_Table( &loader->swap_table ); + + /* finalize parser */ + t42_parser_done( parser ); + } + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type42/t42parse.h b/alienblaster/project/jni/freetype/src/type42/t42parse.h new file mode 100644 index 000000000..f77ec4af4 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/t42parse.h @@ -0,0 +1,90 @@ +/***************************************************************************/ +/* */ +/* t42parse.h */ +/* */ +/* Type 42 font parser (specification). */ +/* */ +/* Copyright 2002, 2003 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42PARSE_H__ +#define __T42PARSE_H__ + + +#include "t42objs.h" +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + typedef struct T42_ParserRec_ + { + PS_ParserRec root; + FT_Stream stream; + + FT_Byte* base_dict; + FT_Long base_len; + + FT_Bool in_memory; + + } T42_ParserRec, *T42_Parser; + + + typedef struct T42_Loader_ + { + T42_ParserRec parser; /* parser used to read the stream */ + + FT_UInt num_chars; /* number of characters in encoding */ + PS_TableRec encoding_table; /* PS_Table used to store the */ + /* encoding character names */ + + FT_UInt num_glyphs; + PS_TableRec glyph_names; + PS_TableRec charstrings; + PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */ + + } T42_LoaderRec, *T42_Loader; + + + FT_LOCAL( FT_Error ) + t42_parser_init( T42_Parser parser, + FT_Stream stream, + FT_Memory memory, + PSAux_Service psaux ); + + FT_LOCAL( void ) + t42_parser_done( T42_Parser parser ); + + + FT_LOCAL( FT_Error ) + t42_parse_dict( T42_Face face, + T42_Loader loader, + FT_Byte* base, + FT_Long size ); + + + FT_LOCAL( void ) + t42_loader_init( T42_Loader loader, + T42_Face face ); + + FT_LOCAL( void ) + t42_loader_done( T42_Loader loader ); + + + /* */ + +FT_END_HEADER + + +#endif /* __T42PARSE_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/type42/t42types.h b/alienblaster/project/jni/freetype/src/type42/t42types.h new file mode 100644 index 000000000..c7c2db490 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/type42/t42types.h @@ -0,0 +1,56 @@ +/***************************************************************************/ +/* */ +/* t42types.h */ +/* */ +/* Type 42 font data types (specification only). */ +/* */ +/* Copyright 2002, 2003, 2006, 2008 by Roberto Alameda. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __T42TYPES_H__ +#define __T42TYPES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + typedef struct T42_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; +#if 0 + const void* afm_data; +#endif + FT_Byte* ttf_data; + FT_ULong ttf_size; + FT_Face ttf_face; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + PS_UnicodesRec unicode_map; + + } T42_FaceRec, *T42_Face; + + +FT_END_HEADER + +#endif /* __T42TYPES_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/winfonts/Jamfile b/alienblaster/project/jni/freetype/src/winfonts/Jamfile new file mode 100644 index 000000000..71cf5678e --- /dev/null +++ b/alienblaster/project/jni/freetype/src/winfonts/Jamfile @@ -0,0 +1,16 @@ +# FreeType 2 src/winfonts Jamfile +# +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +SubDir FT2_TOP $(FT2_SRC_DIR) winfonts ; + +Library $(FT2_LIB) : winfnt.c ; + +# end of src/winfonts Jamfile diff --git a/alienblaster/project/jni/freetype/src/winfonts/fnterrs.h b/alienblaster/project/jni/freetype/src/winfonts/fnterrs.h new file mode 100644 index 000000000..ea8090971 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/winfonts/fnterrs.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* fnterrs.h */ +/* */ +/* Win FNT/FON error codes (specification only). */ +/* */ +/* Copyright 2001 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the Windows FNT/FON error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef __FNTERRS_H__ +#define __FNTERRS_H__ + +#include FT_MODULE_ERRORS_H + +#undef __FTERRORS_H__ + +#define FT_ERR_PREFIX FNT_Err_ +#define FT_ERR_BASE FT_Mod_Err_Winfonts + +#include FT_ERRORS_H + +#endif /* __FNTERRS_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/winfonts/module.mk b/alienblaster/project/jni/freetype/src/winfonts/module.mk new file mode 100644 index 000000000..b44d7f057 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/winfonts/module.mk @@ -0,0 +1,23 @@ +# +# FreeType 2 Windows FNT/FON module definition +# + + +# Copyright 1996-2000, 2006 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +FTMODULE_H_COMMANDS += WINDOWS_DRIVER + +define WINDOWS_DRIVER +$(OPEN_DRIVER) FT_Driver_ClassRec, winfnt_driver_class $(CLOSE_DRIVER) +$(ECHO_DRIVER)winfnt $(ECHO_DRIVER_DESC)Windows bitmap fonts with extension *.fnt or *.fon$(ECHO_DRIVER_DONE) +endef + +# EOF diff --git a/alienblaster/project/jni/freetype/src/winfonts/rules.mk b/alienblaster/project/jni/freetype/src/winfonts/rules.mk new file mode 100644 index 000000000..71a7df2d8 --- /dev/null +++ b/alienblaster/project/jni/freetype/src/winfonts/rules.mk @@ -0,0 +1,65 @@ +# +# FreeType 2 Windows FNT/FON driver configuration rules +# + + +# Copyright 1996-2000, 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +# Windows driver directory +# +FNT_DIR := $(SRC_DIR)/winfonts + + +FNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(FNT_DIR)) + + +# Windows driver sources (i.e., C files) +# +FNT_DRV_SRC := $(FNT_DIR)/winfnt.c + +# Windows driver headers +# +FNT_DRV_H := $(FNT_DRV_SRC:%.c=%.h) \ + $(FNT_DIR)/fnterrs.h + + +# Windows driver object(s) +# +# FNT_DRV_OBJ_M is used during `multi' builds +# FNT_DRV_OBJ_S is used during `single' builds +# +FNT_DRV_OBJ_M := $(FNT_DRV_SRC:$(FNT_DIR)/%.c=$(OBJ_DIR)/%.$O) +FNT_DRV_OBJ_S := $(OBJ_DIR)/winfnt.$O + +# Windows driver source file for single build +# +FNT_DRV_SRC_S := $(FNT_DIR)/winfnt.c + + +# Windows driver - single object +# +$(FNT_DRV_OBJ_S): $(FNT_DRV_SRC_S) $(FNT_DRV_SRC) $(FREETYPE_H) $(FNT_DRV_H) + $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(FNT_DRV_SRC_S)) + + +# Windows driver - multiple objects +# +$(OBJ_DIR)/%.$O: $(FNT_DIR)/%.c $(FREETYPE_H) $(FNT_DRV_H) + $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<) + + +# update main driver object lists +# +DRV_OBJS_S += $(FNT_DRV_OBJ_S) +DRV_OBJS_M += $(FNT_DRV_OBJ_M) + + +# EOF diff --git a/alienblaster/project/jni/freetype/src/winfonts/winfnt.c b/alienblaster/project/jni/freetype/src/winfonts/winfnt.c new file mode 100644 index 000000000..6b3a4e17f --- /dev/null +++ b/alienblaster/project/jni/freetype/src/winfonts/winfnt.c @@ -0,0 +1,1135 @@ +/***************************************************************************/ +/* */ +/* winfnt.c */ +/* */ +/* FreeType font driver for Windows FNT/FON files */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* Copyright 2003 Huw D M Davies for Codeweavers */ +/* Copyright 2007 Dmitry Timoshkov for Codeweavers */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#include <ft2build.h> +#include FT_WINFONTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_OBJECTS_H + +#include "winfnt.h" +#include "fnterrs.h" +#include FT_SERVICE_WINFNT_H +#include FT_SERVICE_XFREE86_NAME_H + + /*************************************************************************/ + /* */ + /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ + /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ + /* messages during execution. */ + /* */ +#undef FT_COMPONENT +#define FT_COMPONENT trace_winfnt + + + static const FT_Frame_Field winmz_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinMZ_HeaderRec + + FT_FRAME_START( 64 ), + FT_FRAME_USHORT_LE ( magic ), + FT_FRAME_SKIP_BYTES( 29 * 2 ), + FT_FRAME_ULONG_LE ( lfanew ), + FT_FRAME_END + }; + + static const FT_Frame_Field winne_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinNE_HeaderRec + + FT_FRAME_START( 40 ), + FT_FRAME_USHORT_LE ( magic ), + FT_FRAME_SKIP_BYTES( 34 ), + FT_FRAME_USHORT_LE ( resource_tab_offset ), + FT_FRAME_USHORT_LE ( rname_tab_offset ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe32_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE32_HeaderRec + + FT_FRAME_START( 248 ), + FT_FRAME_ULONG_LE ( magic ), /* PE00 */ + FT_FRAME_USHORT_LE ( machine ), /* 0x014c - i386 */ + FT_FRAME_USHORT_LE ( number_of_sections ), + FT_FRAME_SKIP_BYTES( 12 ), + FT_FRAME_USHORT_LE ( size_of_optional_header ), + FT_FRAME_SKIP_BYTES( 2 ), + FT_FRAME_USHORT_LE ( magic32 ), /* 0x10b */ + FT_FRAME_SKIP_BYTES( 110 ), + FT_FRAME_ULONG_LE ( rsrc_virtual_address ), + FT_FRAME_ULONG_LE ( rsrc_size ), + FT_FRAME_SKIP_BYTES( 104 ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe32_section_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE32_SectionRec + + FT_FRAME_START( 40 ), + FT_FRAME_BYTES ( name, 8 ), + FT_FRAME_SKIP_BYTES( 4 ), + FT_FRAME_ULONG_LE ( virtual_address ), + FT_FRAME_ULONG_LE ( size_of_raw_data ), + FT_FRAME_ULONG_LE ( pointer_to_raw_data ), + FT_FRAME_SKIP_BYTES( 16 ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_dir_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDirRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE ( characteristics ), + FT_FRAME_ULONG_LE ( time_date_stamp ), + FT_FRAME_USHORT_LE( major_version ), + FT_FRAME_USHORT_LE( minor_version ), + FT_FRAME_USHORT_LE( number_of_named_entries ), + FT_FRAME_USHORT_LE( number_of_id_entries ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_dir_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDirEntryRec + + FT_FRAME_START( 8 ), + FT_FRAME_ULONG_LE( name ), + FT_FRAME_ULONG_LE( offset ), + FT_FRAME_END + }; + + static const FT_Frame_Field winpe_rsrc_data_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WinPE_RsrcDataEntryRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG_LE( offset_to_data ), + FT_FRAME_ULONG_LE( size ), + FT_FRAME_ULONG_LE( code_page ), + FT_FRAME_ULONG_LE( reserved ), + FT_FRAME_END + }; + + static const FT_Frame_Field winfnt_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_WinFNT_HeaderRec + + FT_FRAME_START( 148 ), + FT_FRAME_USHORT_LE( version ), + FT_FRAME_ULONG_LE ( file_size ), + FT_FRAME_BYTES ( copyright, 60 ), + FT_FRAME_USHORT_LE( file_type ), + FT_FRAME_USHORT_LE( nominal_point_size ), + FT_FRAME_USHORT_LE( vertical_resolution ), + FT_FRAME_USHORT_LE( horizontal_resolution ), + FT_FRAME_USHORT_LE( ascent ), + FT_FRAME_USHORT_LE( internal_leading ), + FT_FRAME_USHORT_LE( external_leading ), + FT_FRAME_BYTE ( italic ), + FT_FRAME_BYTE ( underline ), + FT_FRAME_BYTE ( strike_out ), + FT_FRAME_USHORT_LE( weight ), + FT_FRAME_BYTE ( charset ), + FT_FRAME_USHORT_LE( pixel_width ), + FT_FRAME_USHORT_LE( pixel_height ), + FT_FRAME_BYTE ( pitch_and_family ), + FT_FRAME_USHORT_LE( avg_width ), + FT_FRAME_USHORT_LE( max_width ), + FT_FRAME_BYTE ( first_char ), + FT_FRAME_BYTE ( last_char ), + FT_FRAME_BYTE ( default_char ), + FT_FRAME_BYTE ( break_char ), + FT_FRAME_USHORT_LE( bytes_per_row ), + FT_FRAME_ULONG_LE ( device_offset ), + FT_FRAME_ULONG_LE ( face_name_offset ), + FT_FRAME_ULONG_LE ( bits_pointer ), + FT_FRAME_ULONG_LE ( bits_offset ), + FT_FRAME_BYTE ( reserved ), + FT_FRAME_ULONG_LE ( flags ), + FT_FRAME_USHORT_LE( A_space ), + FT_FRAME_USHORT_LE( B_space ), + FT_FRAME_USHORT_LE( C_space ), + FT_FRAME_ULONG_LE ( color_table_offset ), + FT_FRAME_BYTES ( reserved1, 16 ), + FT_FRAME_END + }; + + + static void + fnt_font_done( FNT_Face face ) + { + FT_Memory memory = FT_FACE( face )->memory; + FT_Stream stream = FT_FACE( face )->stream; + FNT_Font font = face->font; + + + if ( !font ) + return; + + if ( font->fnt_frame ) + FT_FRAME_RELEASE( font->fnt_frame ); + FT_FREE( font->family_name ); + + FT_FREE( font ); + face->font = 0; + } + + + static FT_Error + fnt_font_load( FNT_Font font, + FT_Stream stream ) + { + FT_Error error; + FT_WinFNT_Header header = &font->header; + FT_Bool new_format; + FT_UInt size; + + + /* first of all, read the FNT header */ + if ( FT_STREAM_SEEK( font->offset ) || + FT_STREAM_READ_FIELDS( winfnt_header_fields, header ) ) + goto Exit; + + /* check header */ + if ( header->version != 0x200 && + header->version != 0x300 ) + { + FT_TRACE2(( "[not a valid FNT file]\n" )); + error = FNT_Err_Unknown_File_Format; + goto Exit; + } + + new_format = FT_BOOL( font->header.version == 0x300 ); + size = new_format ? 148 : 118; + + if ( header->file_size < size ) + { + FT_TRACE2(( "[not a valid FNT file]\n" )); + error = FNT_Err_Unknown_File_Format; + goto Exit; + } + + /* Version 2 doesn't have these fields */ + if ( header->version == 0x200 ) + { + header->flags = 0; + header->A_space = 0; + header->B_space = 0; + header->C_space = 0; + + header->color_table_offset = 0; + } + + if ( header->file_type & 1 ) + { + FT_TRACE2(( "[can't handle vector FNT fonts]\n" )); + error = FNT_Err_Unknown_File_Format; + goto Exit; + } + + /* this is a FNT file/table; extract its frame */ + if ( FT_STREAM_SEEK( font->offset ) || + FT_FRAME_EXTRACT( header->file_size, font->fnt_frame ) ) + goto Exit; + + Exit: + return error; + } + + + static FT_Error + fnt_face_get_dll_font( FNT_Face face, + FT_Int face_index ) + { + FT_Error error; + FT_Stream stream = FT_FACE( face )->stream; + FT_Memory memory = FT_FACE( face )->memory; + WinMZ_HeaderRec mz_header; + + + face->font = 0; + + /* does it begin with an MZ header? */ + if ( FT_STREAM_SEEK( 0 ) || + FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) ) + goto Exit; + + error = FNT_Err_Unknown_File_Format; + if ( mz_header.magic == WINFNT_MZ_MAGIC ) + { + /* yes, now look for an NE header in the file */ + WinNE_HeaderRec ne_header; + + + FT_TRACE2(( "MZ signature found\n" )); + + if ( FT_STREAM_SEEK( mz_header.lfanew ) || + FT_STREAM_READ_FIELDS( winne_header_fields, &ne_header ) ) + goto Exit; + + error = FNT_Err_Unknown_File_Format; + if ( ne_header.magic == WINFNT_NE_MAGIC ) + { + /* good, now look into the resource table for each FNT resource */ + FT_ULong res_offset = mz_header.lfanew + + ne_header.resource_tab_offset; + FT_UShort size_shift; + FT_UShort font_count = 0; + FT_ULong font_offset = 0; + + + FT_TRACE2(( "NE signature found\n" )); + + if ( FT_STREAM_SEEK( res_offset ) || + FT_FRAME_ENTER( ne_header.rname_tab_offset - + ne_header.resource_tab_offset ) ) + goto Exit; + + size_shift = FT_GET_USHORT_LE(); + + for (;;) + { + FT_UShort type_id, count; + + + type_id = FT_GET_USHORT_LE(); + if ( !type_id ) + break; + + count = FT_GET_USHORT_LE(); + + if ( type_id == 0x8008U ) + { + font_count = count; + font_offset = (FT_ULong)( FT_STREAM_POS() + 4 + + ( stream->cursor - stream->limit ) ); + break; + } + + stream->cursor += 4 + count * 12; + } + + FT_FRAME_EXIT(); + + if ( !font_count || !font_offset ) + { + FT_TRACE2(( "this file doesn't contain any FNT resources\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + /* loading `winfnt_header_fields' needs at least 118 bytes; */ + /* use this as a rough measure to check the expected font size */ + if ( font_count * 118UL > stream->size ) + { + FT_TRACE2(( "invalid number of faces\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + face->root.num_faces = font_count; + + if ( face_index >= font_count ) + { + error = FNT_Err_Invalid_Argument; + goto Exit; + } + else if ( face_index < 0 ) + goto Exit; + + if ( FT_NEW( face->font ) ) + goto Exit; + + if ( FT_STREAM_SEEK( font_offset + face_index * 12 ) || + FT_FRAME_ENTER( 12 ) ) + goto Fail; + + face->font->offset = (FT_ULong)FT_GET_USHORT_LE() << size_shift; + face->font->fnt_size = (FT_ULong)FT_GET_USHORT_LE() << size_shift; + + stream->cursor += 8; + + FT_FRAME_EXIT(); + + error = fnt_font_load( face->font, stream ); + } + else if ( ne_header.magic == WINFNT_PE_MAGIC ) + { + WinPE32_HeaderRec pe32_header; + WinPE32_SectionRec pe32_section; + WinPE_RsrcDirRec root_dir, name_dir, lang_dir; + WinPE_RsrcDirEntryRec dir_entry1, dir_entry2, dir_entry3; + WinPE_RsrcDataEntryRec data_entry; + + FT_Long root_dir_offset, name_dir_offset, lang_dir_offset; + FT_UShort i, j, k; + + + FT_TRACE2(( "PE signature found\n" )); + + if ( FT_STREAM_SEEK( mz_header.lfanew ) || + FT_STREAM_READ_FIELDS( winpe32_header_fields, &pe32_header ) ) + goto Exit; + + FT_TRACE2(( "magic %04lx, machine %02x, number_of_sections %u, " + "size_of_optional_header %02x\n" + "magic32 %02x, rsrc_virtual_address %04lx, " + "rsrc_size %04lx\n", + pe32_header.magic, pe32_header.machine, + pe32_header.number_of_sections, + pe32_header.size_of_optional_header, + pe32_header.magic32, pe32_header.rsrc_virtual_address, + pe32_header.rsrc_size )); + + if ( pe32_header.magic != WINFNT_PE_MAGIC /* check full signature */ || + pe32_header.machine != 0x014c /* i386 */ || + pe32_header.size_of_optional_header != 0xe0 /* FIXME */ || + pe32_header.magic32 != 0x10b ) + { + FT_TRACE2(( "this file has an invalid PE header\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + face->root.num_faces = 0; + + for ( i = 0; i < pe32_header.number_of_sections; i++ ) + { + if ( FT_STREAM_READ_FIELDS( winpe32_section_fields, + &pe32_section ) ) + goto Exit; + + FT_TRACE2(( "name %.8s, va %04lx, size %04lx, offset %04lx\n", + pe32_section.name, pe32_section.virtual_address, + pe32_section.size_of_raw_data, + pe32_section.pointer_to_raw_data )); + + if ( pe32_header.rsrc_virtual_address == + pe32_section.virtual_address ) + goto Found_rsrc_section; + } + + FT_TRACE2(( "this file doesn't contain any resources\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + + Found_rsrc_section: + FT_TRACE2(( "found resources section %.8s\n", pe32_section.name )); + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &root_dir ) ) + goto Exit; + + root_dir_offset = pe32_section.pointer_to_raw_data; + + for ( i = 0; i < root_dir.number_of_named_entries + + root_dir.number_of_id_entries; i++ ) + { + if ( FT_STREAM_SEEK( root_dir_offset + 16 + i * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry1 ) ) + goto Exit; + + if ( !(dir_entry1.offset & 0x80000000UL ) /* DataIsDirectory */ ) + { + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + dir_entry1.offset &= ~0x80000000UL; + + name_dir_offset = pe32_section.pointer_to_raw_data + + dir_entry1.offset; + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data + + dir_entry1.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &name_dir ) ) + goto Exit; + + for ( j = 0; j < name_dir.number_of_named_entries + + name_dir.number_of_id_entries; j++ ) + { + if ( FT_STREAM_SEEK( name_dir_offset + 16 + j * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry2 ) ) + goto Exit; + + if ( !(dir_entry2.offset & 0x80000000UL ) /* DataIsDirectory */ ) + { + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + dir_entry2.offset &= ~0x80000000UL; + + lang_dir_offset = pe32_section.pointer_to_raw_data + + dir_entry2.offset; + + if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data + + dir_entry2.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &lang_dir ) ) + goto Exit; + + for ( k = 0; k < lang_dir.number_of_named_entries + + lang_dir.number_of_id_entries; k++ ) + { + if ( FT_STREAM_SEEK( lang_dir_offset + 16 + k * 8 ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields, + &dir_entry3 ) ) + goto Exit; + + if ( dir_entry2.offset & 0x80000000UL /* DataIsDirectory */ ) + { + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( dir_entry1.name == 8 /* RT_FONT */ ) + { + if ( FT_STREAM_SEEK( root_dir_offset + dir_entry3.offset ) || + FT_STREAM_READ_FIELDS( winpe_rsrc_data_entry_fields, + &data_entry ) ) + goto Exit; + + FT_TRACE2(( "found font #%lu, offset %04lx, " + "size %04lx, cp %lu\n", + dir_entry2.name, + pe32_section.pointer_to_raw_data + + data_entry.offset_to_data - + pe32_section.virtual_address, + data_entry.size, data_entry.code_page )); + + if ( face_index == face->root.num_faces ) + { + if ( FT_NEW( face->font ) ) + goto Exit; + + face->font->offset = pe32_section.pointer_to_raw_data + + data_entry.offset_to_data - + pe32_section.virtual_address; + face->font->fnt_size = data_entry.size; + + error = fnt_font_load( face->font, stream ); + if ( error ) + { + FT_TRACE2(( "font #%lu load error %d\n", + dir_entry2.name, error )); + goto Fail; + } + else + FT_TRACE2(( "font #%lu successfully loaded\n", + dir_entry2.name )); + } + + face->root.num_faces++; + } + } + } + } + } + + if ( !face->root.num_faces ) + { + FT_TRACE2(( "this file doesn't contain any RT_FONT resources\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + if ( face_index >= face->root.num_faces ) + { + error = FNT_Err_Invalid_Argument; + goto Exit; + } + } + + Fail: + if ( error ) + fnt_font_done( face ); + + Exit: + return error; + } + + + typedef struct FNT_CMapRec_ + { + FT_CMapRec cmap; + FT_UInt32 first; + FT_UInt32 count; + + } FNT_CMapRec, *FNT_CMap; + + + static FT_Error + fnt_cmap_init( FNT_CMap cmap ) + { + FNT_Face face = (FNT_Face)FT_CMAP_FACE( cmap ); + FNT_Font font = face->font; + + + cmap->first = (FT_UInt32) font->header.first_char; + cmap->count = (FT_UInt32)( font->header.last_char - cmap->first + 1 ); + + return 0; + } + + + static FT_UInt + fnt_cmap_char_index( FNT_CMap cmap, + FT_UInt32 char_code ) + { + FT_UInt gindex = 0; + + + char_code -= cmap->first; + if ( char_code < cmap->count ) + /* we artificially increase the glyph index; */ + /* FNT_Load_Glyph reverts to the right one */ + gindex = (FT_UInt)( char_code + 1 ); + return gindex; + } + + + static FT_UInt32 + fnt_cmap_char_next( FNT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + if ( char_code <= cmap->first ) + { + result = cmap->first; + gindex = 1; + } + else + { + char_code -= cmap->first; + if ( char_code < cmap->count ) + { + result = cmap->first + char_code; + gindex = (FT_UInt)( char_code + 1 ); + } + } + + *pchar_code = result; + return gindex; + } + + + static const FT_CMap_ClassRec fnt_cmap_class_rec = + { + sizeof ( FNT_CMapRec ), + + (FT_CMap_InitFunc) fnt_cmap_init, + (FT_CMap_DoneFunc) NULL, + (FT_CMap_CharIndexFunc)fnt_cmap_char_index, + (FT_CMap_CharNextFunc) fnt_cmap_char_next, + + NULL, NULL, NULL, NULL, NULL + }; + + static FT_CMap_Class const fnt_cmap_class = &fnt_cmap_class_rec; + + + static void + FNT_Face_Done( FNT_Face face ) + { + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + fnt_font_done( face ); + + FT_FREE( face->root.available_sizes ); + face->root.num_fixed_sizes = 0; + } + + + static FT_Error + FNT_Face_Init( FT_Stream stream, + FNT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Memory memory = FT_FACE_MEMORY( face ); + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + /* try to load font from a DLL */ + error = fnt_face_get_dll_font( face, face_index ); + if ( !error && face_index < 0 ) + goto Exit; + + if ( error == FNT_Err_Unknown_File_Format ) + { + /* this didn't work; try to load a single FNT font */ + FNT_Font font; + + if ( FT_NEW( face->font ) ) + goto Exit; + + face->root.num_faces = 1; + + font = face->font; + font->offset = 0; + font->fnt_size = stream->size; + + error = fnt_font_load( font, stream ); + + if ( !error ) + { + if ( face_index > 0 ) + error = FNT_Err_Invalid_Argument; + else if ( face_index < 0 ) + goto Exit; + } + } + + if ( error ) + goto Fail; + + /* we now need to fill the root FT_Face fields */ + /* with relevant information */ + { + FT_Face root = FT_FACE( face ); + FNT_Font font = face->font; + FT_PtrDist family_size; + + + root->face_index = face_index; + + root->face_flags = FT_FACE_FLAG_FIXED_SIZES | + FT_FACE_FLAG_HORIZONTAL; + + if ( font->header.avg_width == font->header.max_width ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + + if ( font->header.italic ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + + if ( font->header.weight >= 800 ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + + /* set up the `fixed_sizes' array */ + if ( FT_NEW_ARRAY( root->available_sizes, 1 ) ) + goto Fail; + + root->num_fixed_sizes = 1; + + { + FT_Bitmap_Size* bsize = root->available_sizes; + FT_UShort x_res, y_res; + + + bsize->width = font->header.avg_width; + bsize->height = (FT_Short)( + font->header.pixel_height + font->header.external_leading ); + bsize->size = font->header.nominal_point_size << 6; + + x_res = font->header.horizontal_resolution; + if ( !x_res ) + x_res = 72; + + y_res = font->header.vertical_resolution; + if ( !y_res ) + y_res = 72; + + bsize->y_ppem = FT_MulDiv( bsize->size, y_res, 72 ); + bsize->y_ppem = FT_PIX_ROUND( bsize->y_ppem ); + + /* + * this reads: + * + * the nominal height is larger than the bbox's height + * + * => nominal_point_size contains incorrect value; + * use pixel_height as the nominal height + */ + if ( bsize->y_ppem > ( font->header.pixel_height << 6 ) ) + { + FT_TRACE2(( "use pixel_height as the nominal height\n" )); + + bsize->y_ppem = font->header.pixel_height << 6; + bsize->size = FT_MulDiv( bsize->y_ppem, 72, y_res ); + } + + bsize->x_ppem = FT_MulDiv( bsize->size, x_res, 72 ); + bsize->x_ppem = FT_PIX_ROUND( bsize->x_ppem ); + } + + { + FT_CharMapRec charmap; + + + charmap.encoding = FT_ENCODING_NONE; + charmap.platform_id = 0; + charmap.encoding_id = 0; + charmap.face = root; + + if ( font->header.charset == FT_WinFNT_ID_MAC ) + { + charmap.encoding = FT_ENCODING_APPLE_ROMAN; + charmap.platform_id = 1; +/* charmap.encoding_id = 0; */ + } + + error = FT_CMap_New( fnt_cmap_class, + NULL, + &charmap, + NULL ); + if ( error ) + goto Fail; + + /* Select default charmap */ + if ( root->num_charmaps ) + root->charmap = root->charmaps[0]; + } + + /* setup remaining flags */ + + /* reserve one slot for the .notdef glyph at index 0 */ + root->num_glyphs = font->header.last_char - + font->header.first_char + 1 + 1; + + if ( font->header.face_name_offset >= font->header.file_size ) + { + FT_TRACE2(( "invalid family name offset\n" )); + error = FNT_Err_Invalid_File_Format; + goto Fail; + } + family_size = font->header.file_size - font->header.face_name_offset; + /* Some broken fonts don't delimit the face name with a final */ + /* NULL byte -- the frame is erroneously one byte too small. */ + /* We thus allocate one more byte, setting it explicitly to */ + /* zero. */ + if ( FT_ALLOC( font->family_name, family_size + 1 ) ) + goto Fail; + + FT_MEM_COPY( font->family_name, + font->fnt_frame + font->header.face_name_offset, + family_size ); + + font->family_name[family_size] = '\0'; + + if ( FT_REALLOC( font->family_name, + family_size, + ft_strlen( font->family_name ) + 1 ) ) + goto Fail; + + root->family_name = font->family_name; + root->style_name = (char *)"Regular"; + + if ( root->style_flags & FT_STYLE_FLAG_BOLD ) + { + if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Bold Italic"; + else + root->style_name = (char *)"Bold"; + } + else if ( root->style_flags & FT_STYLE_FLAG_ITALIC ) + root->style_name = (char *)"Italic"; + } + goto Exit; + + Fail: + FNT_Face_Done( face ); + + Exit: + return error; + } + + + static FT_Error + FNT_Size_Select( FT_Size size ) + { + FNT_Face face = (FNT_Face)size->face; + FT_WinFNT_Header header = &face->font->header; + + + FT_Select_Metrics( size->face, 0 ); + + size->metrics.ascender = header->ascent * 64; + size->metrics.descender = -( header->pixel_height - + header->ascent ) * 64; + size->metrics.max_advance = header->max_width * 64; + + return FNT_Err_Ok; + } + + + static FT_Error + FNT_Size_Request( FT_Size size, + FT_Size_Request req ) + { + FNT_Face face = (FNT_Face)size->face; + FT_WinFNT_Header header = &face->font->header; + FT_Bitmap_Size* bsize = size->face->available_sizes; + FT_Error error = FNT_Err_Invalid_Pixel_Size; + FT_Long height; + + + height = FT_REQUEST_HEIGHT( req ); + height = ( height + 32 ) >> 6; + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) ) + error = FNT_Err_Ok; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + if ( height == header->pixel_height ) + error = FNT_Err_Ok; + break; + + default: + error = FNT_Err_Unimplemented_Feature; + break; + } + + if ( error ) + return error; + else + return FNT_Size_Select( size ); + } + + + static FT_Error + FNT_Load_Glyph( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FNT_Face face = (FNT_Face)FT_SIZE_FACE( size ); + FNT_Font font = face->font; + FT_Error error = FNT_Err_Ok; + FT_Byte* p; + FT_Int len; + FT_Bitmap* bitmap = &slot->bitmap; + FT_ULong offset; + FT_Bool new_format; + + FT_UNUSED( load_flags ); + + + if ( !face || !font || + glyph_index >= (FT_UInt)( FT_FACE( face )->num_glyphs ) ) + { + error = FNT_Err_Invalid_Argument; + goto Exit; + } + + if ( glyph_index > 0 ) + glyph_index--; /* revert to real index */ + else + glyph_index = font->header.default_char; /* the .notdef glyph */ + + new_format = FT_BOOL( font->header.version == 0x300 ); + len = new_format ? 6 : 4; + + /* jump to glyph entry */ + p = font->fnt_frame + ( new_format ? 148 : 118 ) + len * glyph_index; + + bitmap->width = FT_NEXT_SHORT_LE( p ); + + if ( new_format ) + offset = FT_NEXT_ULONG_LE( p ); + else + offset = FT_NEXT_USHORT_LE( p ); + + if ( offset >= font->header.file_size ) + { + FT_TRACE2(( "invalid FNT offset\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + /* jump to glyph data */ + p = font->fnt_frame + /* font->header.bits_offset */ + offset; + + /* allocate and build bitmap */ + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + FT_Int pitch = ( bitmap->width + 7 ) >> 3; + FT_Byte* column; + FT_Byte* write; + + + bitmap->pitch = pitch; + bitmap->rows = font->header.pixel_height; + bitmap->pixel_mode = FT_PIXEL_MODE_MONO; + + if ( offset + pitch * bitmap->rows >= font->header.file_size ) + { + FT_TRACE2(( "invalid bitmap width\n" )); + error = FNT_Err_Invalid_File_Format; + goto Exit; + } + + /* note: since glyphs are stored in columns and not in rows we */ + /* can't use ft_glyphslot_set_bitmap */ + if ( FT_ALLOC_MULT( bitmap->buffer, pitch, bitmap->rows ) ) + goto Exit; + + column = (FT_Byte*)bitmap->buffer; + + for ( ; pitch > 0; pitch--, column++ ) + { + FT_Byte* limit = p + bitmap->rows; + + + for ( write = column; p < limit; p++, write += bitmap->pitch ) + *write = *p; + } + } + + slot->internal->flags = FT_GLYPH_OWN_BITMAP; + slot->bitmap_left = 0; + slot->bitmap_top = font->header.ascent; + slot->format = FT_GLYPH_FORMAT_BITMAP; + + /* now set up metrics */ + slot->metrics.width = bitmap->width << 6; + slot->metrics.height = bitmap->rows << 6; + slot->metrics.horiAdvance = bitmap->width << 6; + slot->metrics.horiBearingX = 0; + slot->metrics.horiBearingY = slot->bitmap_top << 6; + + ft_synthesize_vertical_metrics( &slot->metrics, + bitmap->rows << 6 ); + + Exit: + return error; + } + + + static FT_Error + winfnt_get_header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ) + { + FNT_Font font = ((FNT_Face)face)->font; + + + *aheader = font->header; + + return 0; + } + + + static const FT_Service_WinFntRec winfnt_service_rec = + { + winfnt_get_header + }; + + /* + * SERVICE LIST + * + */ + + static const FT_ServiceDescRec winfnt_services[] = + { + { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_WINFNT }, + { FT_SERVICE_ID_WINFNT, &winfnt_service_rec }, + { NULL, NULL } + }; + + + static FT_Module_Interface + winfnt_get_service( FT_Driver driver, + const FT_String* service_id ) + { + FT_UNUSED( driver ); + + return ft_service_list_lookup( winfnt_services, service_id ); + } + + + + + FT_CALLBACK_TABLE_DEF + const FT_Driver_ClassRec winfnt_driver_class = + { + { + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_NO_OUTLINES, + sizeof ( FT_DriverRec ), + + "winfonts", + 0x10000L, + 0x20000L, + + 0, + + (FT_Module_Constructor)0, + (FT_Module_Destructor) 0, + (FT_Module_Requester) winfnt_get_service + }, + + sizeof( FNT_FaceRec ), + sizeof( FT_SizeRec ), + sizeof( FT_GlyphSlotRec ), + + (FT_Face_InitFunc) FNT_Face_Init, + (FT_Face_DoneFunc) FNT_Face_Done, + (FT_Size_InitFunc) 0, + (FT_Size_DoneFunc) 0, + (FT_Slot_InitFunc) 0, + (FT_Slot_DoneFunc) 0, + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + ft_stub_set_char_sizes, + ft_stub_set_pixel_sizes, +#endif + (FT_Slot_LoadFunc) FNT_Load_Glyph, + + (FT_Face_GetKerningFunc) 0, + (FT_Face_AttachFunc) 0, + (FT_Face_GetAdvancesFunc) 0, + + (FT_Size_RequestFunc) FNT_Size_Request, + (FT_Size_SelectFunc) FNT_Size_Select + }; + + +/* END */ diff --git a/alienblaster/project/jni/freetype/src/winfonts/winfnt.h b/alienblaster/project/jni/freetype/src/winfonts/winfnt.h new file mode 100644 index 000000000..70a90861a --- /dev/null +++ b/alienblaster/project/jni/freetype/src/winfonts/winfnt.h @@ -0,0 +1,171 @@ +/***************************************************************************/ +/* */ +/* winfnt.h */ +/* */ +/* FreeType font driver for Windows FNT/FON files */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* Copyright 2007 Dmitry Timoshkov for Codeweavers */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + + +#ifndef __WINFNT_H__ +#define __WINFNT_H__ + + +#include <ft2build.h> +#include FT_WINFONTS_H +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + typedef struct WinMZ_HeaderRec_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort lfanew; + + } WinMZ_HeaderRec; + + + typedef struct WinNE_HeaderRec_ + { + FT_UShort magic; + /* skipped content */ + FT_UShort resource_tab_offset; + FT_UShort rname_tab_offset; + + } WinNE_HeaderRec; + + + typedef struct WinPE32_HeaderRec_ + { + FT_ULong magic; + FT_UShort machine; + FT_UShort number_of_sections; + /* skipped content */ + FT_UShort size_of_optional_header; + /* skipped content */ + FT_UShort magic32; + /* skipped content */ + FT_ULong rsrc_virtual_address; + FT_ULong rsrc_size; + /* skipped content */ + + } WinPE32_HeaderRec; + + + typedef struct WinPE32_SectionRec_ + { + FT_Byte name[8]; + /* skipped content */ + FT_ULong virtual_address; + FT_ULong size_of_raw_data; + FT_ULong pointer_to_raw_data; + /* skipped content */ + + } WinPE32_SectionRec; + + + typedef struct WinPE_RsrcDirRec_ + { + FT_ULong characteristics; + FT_ULong time_date_stamp; + FT_UShort major_version; + FT_UShort minor_version; + FT_UShort number_of_named_entries; + FT_UShort number_of_id_entries; + + } WinPE_RsrcDirRec; + + + typedef struct WinPE_RsrcDirEntryRec_ + { + FT_ULong name; + FT_ULong offset; + + } WinPE_RsrcDirEntryRec; + + + typedef struct WinPE_RsrcDataEntryRec_ + { + FT_ULong offset_to_data; + FT_ULong size; + FT_ULong code_page; + FT_ULong reserved; + + } WinPE_RsrcDataEntryRec; + + + typedef struct WinNameInfoRec_ + { + FT_UShort offset; + FT_UShort length; + FT_UShort flags; + FT_UShort id; + FT_UShort handle; + FT_UShort usage; + + } WinNameInfoRec; + + + typedef struct WinResourceInfoRec_ + { + FT_UShort type_id; + FT_UShort count; + + } WinResourceInfoRec; + + +#define WINFNT_MZ_MAGIC 0x5A4D +#define WINFNT_NE_MAGIC 0x454E +#define WINFNT_PE_MAGIC 0x4550 + + + typedef struct FNT_FontRec_ + { + FT_ULong offset; + + FT_WinFNT_HeaderRec header; + + FT_Byte* fnt_frame; + FT_ULong fnt_size; + FT_String* family_name; + + } FNT_FontRec, *FNT_Font; + + + typedef struct FNT_FaceRec_ + { + FT_FaceRec root; + FNT_Font font; + + FT_CharMap charmap_handle; + FT_CharMapRec charmap; /* a single charmap per face */ + + } FNT_FaceRec, *FNT_Face; + + + FT_EXPORT_VAR( const FT_Driver_ClassRec ) winfnt_driver_class; + + +FT_END_HEADER + + +#endif /* __WINFNT_H__ */ + + +/* END */ diff --git a/alienblaster/project/jni/freetype/version.sed b/alienblaster/project/jni/freetype/version.sed new file mode 100644 index 000000000..c281ff506 --- /dev/null +++ b/alienblaster/project/jni/freetype/version.sed @@ -0,0 +1,5 @@ +#! /usr/bin/sed -nf + +s/^#define *FREETYPE_MAJOR *\([^ ][^ ]*\).*$/freetype_major="\1" ;/p +s/^#define *FREETYPE_MINOR *\([^ ][^ ]*\).*$/freetype_minor=".\1" ;/p +s/^#define *FREETYPE_PATCH *\([^ ][^ ]*\).*$/freetype_patch=".\1" ;/p diff --git a/alienblaster/project/jni/freetype/vms_make.com b/alienblaster/project/jni/freetype/vms_make.com new file mode 100644 index 000000000..1aa83e7e3 --- /dev/null +++ b/alienblaster/project/jni/freetype/vms_make.com @@ -0,0 +1,1286 @@ +$! make Freetype2 under OpenVMS +$! +$! Copyright 2003, 2004, 2006, 2007 by +$! David Turner, Robert Wilhelm, and Werner Lemberg. +$! +$! This file is part of the FreeType project, and may only be used, modified, +$! and distributed under the terms of the FreeType project license, +$! LICENSE.TXT. By continuing to use, modify, or distribute this file you +$! indicate that you have read the license and understand and accept it +$! fully. +$! +$! +$! External libraries (like Freetype, XPM, etc.) are supported via the +$! config file VMSLIB.DAT. Please check the sample file, which is part of this +$! distribution, for the information you need to provide +$! +$! This procedure currently does support the following commandline options +$! in arbitrary order +$! +$! * DEBUG - Compile modules with /noopt/debug and link shareable image +$! with /debug +$! * LOPTS - Options to be passed to the link command +$! * CCOPT - Options to be passed to the C compiler +$! +$! In case of problems with the install you might contact me at +$! zinser@zinser.no-ip.info(preferred) or +$! zinser@sysdev.deutsche-boerse.com (work) +$! +$! Make procedure history for Freetype2 +$! +$!------------------------------------------------------------------------------ +$! Version history +$! 0.01 20040401 First version to receive a number +$! 0.02 20041030 Add error handling, Freetype 2.1.9 +$! +$ on error then goto err_exit +$ true = 1 +$ false = 0 +$ tmpnam = "temp_" + f$getjpi("","pid") +$ tt = tmpnam + ".txt" +$ tc = tmpnam + ".c" +$ th = tmpnam + ".h" +$ its_decc = false +$ its_vaxc = false +$ its_gnuc = false +$! +$! Setup variables holding "config" information +$! +$ Make = "" +$ ccopt = "/name=as_is/float=ieee" +$ lopts = "" +$ dnsrl = "" +$ aconf_in_file = "config.hin" +$ name = "Freetype2" +$ mapfile = name + ".map" +$ optfile = name + ".opt" +$ s_case = false +$ liblist = "" +$! +$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") +$ mydef = F$parse(whoami,,,"DEVICE") +$ mydir = f$parse(whoami,,,"DIRECTORY") - "][" +$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") +$! +$! Check for MMK/MMS +$! +$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" +$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" +$! +$! Which command parameters were given +$! +$ gosub check_opts +$! +$! Create option file +$! +$ open/write optf 'optfile' +$! +$! Pull in external libraries +$! +$ create libs.opt +$ open/write libsf libs.opt +$ gosub check_create_vmslib +$! +$! Create objects +$! +$ if libdefs .nes. "" +$ then +$ ccopt = ccopt + "/define=(" + f$extract(0,f$length(libdefs)-1,libdefs) + ")" +$ endif +$! +$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - + then s_case = true +$ gosub crea_mms +$! +$ 'Make' /macro=(comp_flags="''ccopt'") +$ purge/nolog [...]descrip.mms +$! +$! Add them to options +$! +$FLOOP: +$ file = f$edit(f$search("[...]*.obj"),"UPCASE") +$ if (file .nes. "") +$ then +$ if f$locate("DEMOS",file) .eqs. f$length(file) then write optf file +$ goto floop +$ endif +$! +$ close optf +$! +$! +$! Alpha gets a shareable image +$! +$ If f$getsyi("HW_MODEL") .gt. 1024 +$ Then +$ write sys$output "Creating freetype2shr.exe" +$ call anal_obj_axp 'optfile' _link.opt +$ open/append optf 'optfile' +$ if s_case then WRITE optf "case_sensitive=YES" +$ close optf +$ LINK_/NODEB/SHARE=[.lib]freetype2shr.exe - + 'optfile'/opt,libs.opt/opt,_link.opt/opt +$ endif +$! +$ exit +$! +$ +$ERR_LIB: +$ write sys$output "Error reading config file vmslib.dat" +$ goto err_exit +$FT2_ERR: +$ write sys$output "Could not locate Freetype 2 include files" +$ goto err_exit +$ERR_EXIT: +$ set message/facil/ident/sever/text +$ close/nolog optf +$ close/nolog out +$ close/nolog libdata +$ close/nolog in +$ close/nolog atmp +$ close/nolog xtmp +$ write sys$output "Exiting..." +$ exit 2 +$! +$!------------------------------------------------------------------------------ +$! +$! If MMS/MMK are available dump out the descrip.mms if required +$! +$CREA_MMS: +$ write sys$output "Creating descrip.mms files ..." +$ write sys$output "... Main directory" +$ create descrip.mms +$ open/append out descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 build system -- top-level Makefile for OpenVMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +$ EOD +$ write out "CFLAGS = ", ccopt +$ copy sys$input: out +$ deck + + +all : + define freetype [--.include.freetype] + define psaux [-.psaux] + define autofit [-.autofit] + define autohint [-.autohint] + define base [-.base] + define cache [-.cache] + define cff [-.cff] + define cid [-.cid] + define pcf [-.pcf] + define psnames [-.psnames] + define raster [-.raster] + define sfnt [-.sfnt] + define smooth [-.smooth] + define truetype [-.truetype] + define type1 [-.type1] + define winfonts [-.winfonts] + if f$search("lib.dir") .eqs. "" then create/directory [.lib] + set default [.builds.vms] + $(MMS)$(MMSQUALIFIERS) +# set default [--.src.autofit] +# $(MMS)$(MMSQUALIFIERS) + set default [--.src.autohint] + $(MMS)$(MMSQUALIFIERS) + set default [-.base] + $(MMS)$(MMSQUALIFIERS) + set default [-.bdf] + $(MMS)$(MMSQUALIFIERS) + set default [-.cache] + $(MMS)$(MMSQUALIFIERS) + set default [-.cff] + $(MMS)$(MMSQUALIFIERS) + set default [-.cid] + $(MMS)$(MMSQUALIFIERS) + set default [-.gzip] + $(MMS)$(MMSQUALIFIERS) + set default [-.lzw] + $(MMS)$(MMSQUALIFIERS) + set default [-.otvalid] + $(MMS)$(MMSQUALIFIERS) + set default [-.pcf] + $(MMS)$(MMSQUALIFIERS) + set default [-.pfr] + $(MMS)$(MMSQUALIFIERS) + set default [-.psaux] + $(MMS)$(MMSQUALIFIERS) + set default [-.pshinter] + $(MMS)$(MMSQUALIFIERS) + set default [-.psnames] + $(MMS)$(MMSQUALIFIERS) + set default [-.raster] + $(MMS)$(MMSQUALIFIERS) + set default [-.sfnt] + $(MMS)$(MMSQUALIFIERS) + set default [-.smooth] + $(MMS)$(MMSQUALIFIERS) + set default [-.truetype] + $(MMS)$(MMSQUALIFIERS) + set default [-.type1] + $(MMS)$(MMSQUALIFIERS) + set default [-.type42] + $(MMS)$(MMSQUALIFIERS) + set default [-.winfonts] + $(MMS)$(MMSQUALIFIERS) + set default [--] + +# EOF +$ eod +$ close out +$ write sys$output "... [.builds.vms] directory" +$ create [.builds.vms]descrip.mms +$ open/append out [.builds.vms]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 system rules for VMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([],[--.include],[--.src.base]) + +OBJS=ftsystem.obj + +all : $(OBJS) + library/create [--.lib]freetype.olb $(OBJS) + +ftsystem.obj : ftsystem.c ftconfig.h + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.autofit] directory" +$ create [.src.autofit]descrip.mms +$ open/append out [.src.autofit]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 auto-fit module compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.autofit]) + +OBJS=afangles.obj,afhints.obj,aflatin.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.autohint] directory" +$ create [.src.autohint]descrip.mms +$ open/append out [.src.autohint]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 auto-hinter module compilation rules for VMS +# + + +# Copyright 2001, 2002 Catharon Productions Inc. +# +# This file is part of the Catharon Typography Project and shall only +# be used, modified, and distributed under the terms of the Catharon +# Open Source License that should come with this file under the name +# `CatharonLicense.txt'. By continuing to use, modify, or distribute +# this file you indicate that you have read the license and +# understand and accept it fully. +# +# Note that this license is compatible with the FreeType license. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/incl=([--.include],[--.src.autohint]) + +OBJS=autohint.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.base] directory" +$ create [.src.base]descrip.mms +$ open/append out [.src.base]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 base layer compilation rules for VMS +# + + +# Copyright 2001, 2003 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.builds.vms],[--.include],[--.src.base]) + +OBJS=ftbase.obj,ftinit.obj,ftglyph.obj,ftdebug.obj,ftbdf.obj,ftmm.obj,\ + fttype1.obj,ftxf86.obj,ftpfr.obj,ftstroke.obj,ftwinfnt.obj,ftbbox.obj,\ + ftbitmap.obj ftlcdfil.obj ftgasp.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.bdf] directory" +$ create [.src.bdf]descrip.mms +$ open/append out [.src.bdf]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 BDF driver compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.bdf]) + +OBJS=bdf.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.cache] directory" +$ create [.src.cache]descrip.mms +$ open/append out [.src.cache]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 Cache compilation rules for VMS +# + + +# Copyright 2001, 2002, 2003, 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cache]) + +OBJS=ftcache.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +ftcache.obj : ftcache.c ftcbasic.c ftccache.c ftccmap.c ftcglyph.c ftcimage.c \ + ftcmanag.c ftcmru.c ftcsbits.c + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.cff] directory" +$ create [.src.cff]descrip.mms +$ open/append out [.src.cff]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 OpenType/CFF driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cff]) + +OBJS=cff.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.cid] directory" +$ create [.src.cid]descrip.mms +$ open/append out [.src.cid]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 CID driver compilation rules for VMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cid]) + +OBJS=type1cid.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.gzip] directory" +$ create [.src.gzip]descrip.mms +$ open/append out [.src.gzip]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 GZip support compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +$EOD +$ if libincs .nes. "" then write out "LIBINCS = ", libincs - ",", "," +$ write out "COMP_FLAGS = ", ccopt +$ copy sys$input: out +$ deck + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=($(LIBINCS)[--.include],[--.src.gzip]) + +OBJS=ftgzip.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.lzw] directory" +$ create [.src.lzw]descrip.mms +$ open/append out [.src.lzw]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 LZW support compilation rules for VMS +# + + +# Copyright 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. +$EOD +$ if libincs .nes. "" then write out "LIBINCS = ", libincs - ",", "," +$ write out "COMP_FLAGS = ", ccopt +$ copy sys$input: out +$ deck + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=($(LIBINCS)[--.include],[--.src.lzw]) + +OBJS=ftlzw.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.otlayout] directory" +$ create [.src.otlayout]descrip.mms +$ open/append out [.src.otlayout]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 OT layout compilation rules for VMS +# + + +# Copyright 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otlayout]) + +OBJS=otlbase.obj,otlcommn.obj,otlgdef.obj,otlgpos.obj,otlgsub.obj,\ + otljstf.obj,otlparse.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.otvalid] directory" +$ create [.src.otvalid]descrip.mms +$ open/append out [.src.otvalid]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 OpenType validation module compilation rules for VMS +# + + +# Copyright 2004 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otvalid]) + +OBJS=otvalid.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.pcf] directory" +$ create [.src.pcf]descrip.mms +$ open/append out [.src.pcf]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 pcf driver compilation rules for VMS +# + + +# Copyright (C) 2001, 2002 by +# Francesco Zappa Nardelli +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pcf]) + +OBJS=pcf.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.pfr] directory" +$ create [.src.pfr]descrip.mms +$ open/append out [.src.pfr]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 PFR driver compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pfr]) + +OBJS=pfr.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.psaux] directory" +$ create [.src.psaux]descrip.mms +$ open/append out [.src.psaux]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 PSaux driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psaux]) + +OBJS=psaux.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.pshinter] directory" +$ create [.src.pshinter]descrip.mms +$ open/append out [.src.pshinter]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 PSHinter driver compilation rules for OpenVMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) + +OBJS=pshinter.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.psnames] directory" +$ create [.src.psnames]descrip.mms +$ open/append out [.src.psnames]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 PSNames driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames]) + +OBJS=psnames.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.raster] directory" +$ create [.src.raster]descrip.mms +$ open/append out [.src.raster]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 renderer module compilation rules for VMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.raster]) + +OBJS=raster.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.sfnt] directory" +$ create [.src.sfnt]descrip.mms +$ open/append out [.src.sfnt]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 SFNT driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.sfnt]) + +OBJS=sfnt.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.smooth] directory" +$ create [.src.smooth]descrip.mms +$ open/append out [.src.smooth]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 smooth renderer module compilation rules for VMS +# + + +# Copyright 2001 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.smooth]) + +OBJS=smooth.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.truetype] directory" +$ create [.src.truetype]descrip.mms +$ open/append out [.src.truetype]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 TrueType driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.truetype]) + +OBJS=truetype.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.type1] directory" +$ create [.src.type1]descrip.mms +$ open/append out [.src.type1]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 Type1 driver compilation rules for VMS +# + + +# Copyright 1996-2000, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type1]) + +OBJS=type1.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +type1.obj : type1.c t1parse.c t1load.c t1objs.c t1driver.c t1gload.c t1afm.c + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.type42] directory" +$ create [.src.type42]descrip.mms +$ open/append out [.src.type42]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 Type 42 driver compilation rules for VMS +# + + +# Copyright 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type42]) + +OBJS=type42.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ write sys$output "... [.src.winfonts] directory" +$ create [.src.winfonts]descrip.mms +$ open/append out [.src.winfonts]descrip.mms +$ copy sys$input: out +$ deck +# +# FreeType 2 Windows FNT/FON driver compilation rules for VMS +# + + +# Copyright 2001, 2002 by +# David Turner, Robert Wilhelm, and Werner Lemberg. +# +# This file is part of the FreeType project, and may only be used, modified, +# and distributed under the terms of the FreeType project license, +# LICENSE.TXT. By continuing to use, modify, or distribute this file you +# indicate that you have read the license and understand and accept it +# fully. + + +CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.winfonts]) + +OBJS=winfnt.obj + +all : $(OBJS) + library [--.lib]freetype.olb $(OBJS) + +# EOF +$ eod +$ close out +$ return +$!------------------------------------------------------------------------------ +$! +$! Check command line options and set symbols accordingly +$! +$ CHECK_OPTS: +$ i = 1 +$ OPT_LOOP: +$ if i .lt. 9 +$ then +$ cparm = f$edit(p'i',"upcase") +$ if cparm .eqs. "DEBUG" +$ then +$ ccopt = ccopt + "/noopt/deb" +$ lopts = lopts + "/deb" +$ endif +$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ ccopt = ccopt + f$extract(start,len,cparm) +$ endif +$ if cparm .eqs. "LINK" then linkonly = true +$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ lopts = lopts + f$extract(start,len,cparm) +$ endif +$ if f$locate("CC=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ cc_com = f$extract(start,len,cparm) + if (cc_com .nes. "DECC") .and. - + (cc_com .nes. "VAXC") .and. - + (cc_com .nes. "GNUC") +$ then +$ write sys$output "Unsupported compiler choice ''cc_com' ignored" +$ write sys$output "Use DECC, VAXC, or GNUC instead" +$ else +$ if cc_com .eqs. "DECC" then its_decc = true +$ if cc_com .eqs. "VAXC" then its_vaxc = true +$ if cc_com .eqs. "GNUC" then its_gnuc = true +$ endif +$ endif +$ if f$locate("MAKE=",cparm) .lt. f$length(cparm) +$ then +$ start = f$locate("=",cparm) + 1 +$ len = f$length(cparm) - start +$ mmks = f$extract(start,len,cparm) +$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") +$ then +$ make = mmks +$ else +$ write sys$output "Unsupported make choice ''mmks' ignored" +$ write sys$output "Use MMK or MMS instead" +$ endif +$ endif +$ i = i + 1 +$ goto opt_loop +$ endif +$ return +$!------------------------------------------------------------------------------ +$! +$! Take care of driver file with information about external libraries +$! +$! Version history +$! 0.01 20040220 First version to receive a number +$! 0.02 20040229 Echo current procedure name; use general error exit handler +$! Remove xpm hack -> Replaced by more general dnsrl handling +$CHECK_CREATE_VMSLIB: +$! +$ if f$search("VMSLIB.DAT") .eqs. "" +$ then +$ type/out=vmslib.dat sys$input +! +! This is a simple driver file with information used by vms_make.com to +! check if external libraries (like t1lib and freetype) are available on +! the system. +! +! Layout of the file: +! +! - Lines starting with ! are treated as comments +! - Elements in a data line are separated by # signs +! - The elements need to be listed in the following order +! 1.) Name of the Library (only used for informative messages +! from vms_make.com) +! 2.) Location where the object library can be found +! 3.) Location where the include files for the library can be found +! 4.) Include file used to verify library location +! 5.) CPP define to pass to the build to indicate availability of +! the library +! +! Example: The following lines show how definitions +! might look like. They are site specific and the locations of the +! library and include files need almost certainly to be changed. +! +! Location: All of the libaries can be found at the following addresses +! +! ZLIB: http://zinser.no-ip.info/vms/sw/zlib.htmlx +! +ZLIB # sys$library:libz.olb # sys$library: # zlib.h # FT_CONFIG_OPTION_SYSTEM_ZLIB +$ write sys$output "New driver file vmslib.dat created." +$ write sys$output "Please customize libary locations for your site" +$ write sys$output "and afterwards re-execute ''myproc'" +$ goto err_exit +$ endif +$! +$! Init symbols used to hold CPP definitions and include path +$! +$ libdefs = "" +$ libincs = "" +$! +$! Open data file with location of libraries +$! +$ open/read/end=end_lib/err=err_lib libdata VMSLIB.DAT +$LIB_LOOP: +$ read/end=end_lib libdata libline +$ libline = f$edit(libline, "UNCOMMENT,COLLAPSE") +$ if libline .eqs. "" then goto LIB_LOOP ! Comment line +$ libname = f$edit(f$element(0,"#",libline),"UPCASE") +$ write sys$output "Processing ''libname' setup ..." +$ libloc = f$element(1,"#",libline) +$ libsrc = f$element(2,"#",libline) +$ testinc = f$element(3,"#",libline) +$ cppdef = f$element(4,"#",libline) +$ old_cpp = f$locate("=1",cppdef) +$ if old_cpp.lt.f$length(cppdef) then cppdef = f$extract(0,old_cpp,cppdef) +$ if f$search("''libloc'").eqs. "" +$ then +$ write sys$output "Can not find library ''libloc' - Skipping ''libname'" +$ goto LIB_LOOP +$ endif +$ libsrc_elem = 0 +$ libsrc_found = false +$LIBSRC_LOOP: +$ libsrcdir = f$element(libsrc_elem,",",libsrc) +$ if (libsrcdir .eqs. ",") then goto END_LIBSRC +$ if f$search("''libsrcdir'''testinc'") .nes. "" then libsrc_found = true +$ libsrc_elem = libsrc_elem + 1 +$ goto LIBSRC_LOOP +$END_LIBSRC: +$ if .not. libsrc_found +$ then +$ write sys$output "Can not find includes at ''libsrc' - Skipping ''libname'" +$ goto LIB_LOOP +$ endif +$ if (cppdef .nes. "") then libdefs = libdefs + cppdef + "," +$ libincs = libincs + "," + libsrc +$ lqual = "/lib" +$ libtype = f$edit(f$parse(libloc,,,"TYPE"),"UPCASE") +$ if f$locate("EXE",libtype) .lt. f$length(libtype) then lqual = "/share" +$ write optf libloc , lqual +$ if (f$trnlnm("topt") .nes. "") then write topt libloc , lqual +$! +$! Nasty hack to get the freetype includes to work +$! +$ ft2def = false +$ if ((libname .eqs. "FREETYPE") .and. - + (f$locate("FREETYPE2",cppdef) .lt. f$length(cppdef))) +$ then +$ if ((f$search("freetype:freetype.h") .nes. "") .and. - + (f$search("freetype:[internal]ftobjs.h") .nes. "")) +$ then +$ write sys$output "Will use local definition of freetype logical" +$ else +$ ft2elem = 0 +$FT2_LOOP: +$ ft2srcdir = f$element(ft2elem,",",libsrc) +$ if f$search("''ft2srcdir'''testinc'") .nes. "" +$ then +$ if f$search("''ft2srcdir'internal.dir") .nes. "" +$ then +$ ft2dev = f$parse("''ft2srcdir'",,,"device","no_conceal") +$ ft2dir = f$parse("''ft2srcdir'",,,"directory","no_conceal") +$ ft2conc = f$locate("][",ft2dir) +$ ft2len = f$length(ft2dir) +$ if ft2conc .lt. ft2len +$ then +$ ft2dir = f$extract(0,ft2conc,ft2dir) + - + f$extract(ft2conc+2,ft2len-2,ft2dir) +$ endif +$ ft2dir = ft2dir - "]" + ".]" +$ define freetype 'ft2dev''ft2dir','ft2srcdir' +$ ft2def = true +$ else +$ goto ft2_err +$ endif +$ else +$ ft2elem = ft2elem + 1 +$ goto ft2_loop +$ endif +$ endif +$ endif +$ goto LIB_LOOP +$END_LIB: +$ close libdata +$ return +$!------------------------------------------------------------------------------ +$! +$! Analyze Object files for OpenVMS AXP to extract Procedure and Data +$! information to build a symbol vector for a shareable image +$! All the "brains" of this logic was suggested by Hartmut Becker +$! (Hartmut.Becker@compaq.com). All the bugs were introduced by me +$! (zinser@decus.de), so if you do have problem reports please do not +$! bother Hartmut/HP, but get in touch with me +$! +$! Version history +$! 0.01 20040006 Skip over shareable images in option file +$! +$ ANAL_OBJ_AXP: Subroutine +$ V = 'F$Verify(0) +$ SAY := "WRITE_ SYS$OUTPUT" +$ +$ IF F$SEARCH("''P1'") .EQS. "" +$ THEN +$ SAY "ANAL_OBJ_AXP-E-NOSUCHFILE: Error, inputfile ''p1' not available" +$ goto exit_aa +$ ENDIF +$ IF "''P2'" .EQS. "" +$ THEN +$ SAY "ANAL_OBJ_AXP: Error, no output file provided" +$ goto exit_aa +$ ENDIF +$ +$ open/read in 'p1 +$ create a.tmp +$ open/append atmp a.tmp +$ loop: +$ read/end=end_loop in line +$ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line) +$ then +$ write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'" +$ goto loop +$ endif +$ if f$locate("/LIB",f$edit(line,"upcase")) .lt. f$length(line) +$ then +$ write libsf line +$ write sys$output "ANAL_SKP_LIB-i-skiplib, ''line'" +$ goto loop +$ endif +$ f= f$search(line) +$ if f .eqs. "" +$ then +$ write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'" +$ goto loop +$ endif +$ def/user sys$output nl: +$ def/user sys$error nl: +$ anal/obj/gsd 'f /out=x.tmp +$ open/read xtmp x.tmp +$ XLOOP: +$ read/end=end_xloop xtmp xline +$ xline = f$edit(xline,"compress") +$ write atmp xline +$ goto xloop +$ END_XLOOP: +$ close xtmp +$ goto loop +$ end_loop: +$ close in +$ close atmp +$ if f$search("a.tmp") .eqs. "" - + then $ exit +$ ! all global definitions +$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp +$ ! all procedures +$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp +$ search c.tmp "symbol:"/out=d.tmp +$ def/user sys$output nl: +$ edito/edt/command=sys$input d.tmp +sub/symbol: "/symbol_vector=(/whole +sub/"/=PROCEDURE)/whole +exit +$ ! all data +$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp +$ search e.tmp "symbol:"/out=f.tmp +$ def/user sys$output nl: +$ edito/edt/command=sys$input f.tmp +sub/symbol: "/symbol_vector=(/whole +sub/"/=DATA)/whole +exit +$ sort/nodupl d.tmp,f.tmp 'p2' +$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;* +$ if f$search("x.tmp") .nes. "" - + then $ delete x.tmp;* +$! +$ close libsf +$ EXIT_AA: +$ if V then set verify +$ endsubroutine diff --git a/alienblaster/project/jni/sdl_ttf/Android.mk b/alienblaster/project/jni/sdl_ttf/Android.mk new file mode 100644 index 000000000..887433f88 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/Android.mk @@ -0,0 +1,19 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := sdl_ttf + +LOCAL_CFLAGS := -I$(LOCAL_PATH) -I$(LOCAL_PATH)/../sdl/include -I$(LOCAL_PATH)/../freetype/include + +LOCAL_CPP_EXTENSION := .cpp + +# Note this simple makefile var substitution, you can find even simpler examples in different Android projects +LOCAL_SRC_FILES := SDL_ttf.c + +LOCAL_SHARED_LIBRARIES := sdl +LOCAL_STATIC_LIBRARIES := freetype +LOCAL_LDLIBS := -lz + +include $(BUILD_SHARED_LIBRARY) + diff --git a/alienblaster/project/jni/sdl_ttf/CHANGES b/alienblaster/project/jni/sdl_ttf/CHANGES new file mode 100644 index 000000000..5647a05f8 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/CHANGES @@ -0,0 +1,122 @@ +2.0.9: +Kanou Hiroki - Sat Jul 14 23:15:40 PDT 2007 + * Fixed rendering of fonts with 2 bit and 4 bit embedded graymaps +Sam Lantinga - Wed Jun 13 00:32:29 PDT 2007 + * Fixed bug in solid bold glyph rendering (thanks Roy!) +Ryan Gordon - Tue Feb 13 10:19:00 2007 UTC + * Updated to build with the latest version of FreeType +Sam Lantinga - Mon Jun 5 16:22:51 2006 UTC + * Fixed crash when passing NULL to TTF_CloseFont() + +2.0.8: +Stepan Roh - 2005-10-02 09:46 + * Fixed line spacing by using font ascender and descender +Sam Lantinga - Sun Apr 30 01:48:40 PDT 2006 + * Added gcc-fat.sh for generating Universal binaries on Mac OS X + * Updated libtool support to version 1.5.22 + +2.0.7: +Philippe Plantier - Sat, 30 Oct 2004 22:46:47 +0200 + * Fixed memory corruption problems with some italic fonts +Sam Lantinga - Wed Nov 19 00:23:44 PST 2003 + * Updated libtool support for new mingw32 DLL build process +Sam Lantinga - Sun Sep 7 20:58:38 PDT 2003 + * Fixed glyph metrics for bold style fonts +Bursig Rafal - Wed Aug 6 15:02:59 PDT 2003 + * Fixed compilation with newer versions of FreeType +Kyle Davenport - Sat, 19 Apr 2003 17:13:31 -0500 + * Added .la files to the development RPM, fixing RPM build on RedHat 8 +Bryan Kadzban - Mon, 24 Mar 2003 21:31:48 -0500 + * Fixed crash when opening a font file that doesn't exist + +2.0.6: +Sam Lantinga - Mon Feb 10 05:44:26 PST 2003 + * Fixed UNICODE endian issues, added TTF_ByteSwappedUNICODE() +Jason Dorje Short - Thu, 30 Jan 2003 18:47:01 -0500 + * Added iconv() support to showfont to test UNICODE endian issues +Sam Lantinga - Sun Dec 1 18:34:40 PST 2002 + * Fixed memory corruption problem with small point sizes +Wesley Leong - Mon, 18 Nov 2002 11:30:15 -0800 + * Added initial .fon support to SDL_ttf + * Fixed wrapping bug with negative horizontal bearing + * Fixed TTF_RenderGlyph_Solid() to use the bitmap instead of pixmap +Sam Lantinga - Sun Oct 20 20:57:09 PDT 2002 + * Added shared library support for MacOS X +Pete Shinners - Tue Sep 3 10:17:45 PDT 2002 + * Added TTF_WasInit() to see if the library has been initialized +Sam Lantinga - Sat Aug 24 22:08:26 PDT 2002 + * Added a version number so runtime version checking is possible +Sam Lantinga - Sat Aug 24 22:06:22 PDT 2002 + * Added the ability to load a font from an SDL_RWops stream + +2.0.5: +Sam Lantinga - Sat Apr 13 07:49:47 PDT 2002 + * Updated autogen.sh for new versions of automake + * Specify the SDL API calling convention (C by default) +Jered Wierzbicki Fri Jan 18 13:45:10 PST 2002 + * Fixed a potential malloc of zero bytes in the font code. + +2.0.4: +Sam Lantinga - Wed Nov 21 23:08:01 PST 2001 + * Added 'glfont', a program to demonstrate using SDL_ttf with OpenGL +akira yamada - Thu Nov 1 08:17:26 PST 2001 + * Added support for selecting individual font faces +Thomas Krennwallner - Tue, 24 Jul 2001 19:16:37 + * Added support for foreground/background color in showfont +Mattias Engdegård, Thomas Krennwallner - Mon, 23 Jul 2001 04:47:54 + * Fixed endian bug in blended font rendering + +2.0.3: +Sam Lantinga - Tue May 22 17:48:10 PDT 2001 + * Updated for FreeType 2.0 + +1.2.2: +Sam Lantinga - Tue Sep 26 15:04:04 PDT 2000 + * Added TTF_RenderGlyph_* functions to render a single glyph +Michael Vance - Tue Sep 12 12:20:03 PDT 2000 + * Added TTF_GetGlyphMetrics() to retrieve the glyph bounding box +Sam Lantinga - Tue Sep 12 07:15:34 PDT 2000 + * Fixed the alpha blending for SDL 1.1.5 +Michael Vance - Mon Sep 11 15:45:05 PDT 2000 + * Added TTF_FontAscent() for completeness +Ray Kelm - Fri, 04 Aug 2000 20:58:00 -0400 + * Added support for cross-compiling Windows DLL from Linux + +1.2.1: +Sam Lantinga - Wed May 10 19:54:56 PDT 2000 + * Fixed bounding box width computation +Sam Lantinga - Wed May 10 19:52:39 PDT 2000 + * Fixed compile problem with Visual C++ + * Don't allocate memory for zero sized glyphs (like space) +Sam Lantinga - Sat May 6 13:39:15 PDT 2000 + * Fixed bolding of large fonts + +1.2.0: +Sam Lantinga - Fri May 5 11:08:24 PDT 2000 + * Added support for font styles (bold, italic, underline) + New functions: TTF_GetFontStyle(), TTF_SetFontStyle() + +1.1.1: +Sam Lantinga - Thu May 4 02:19:36 PDT 2000 + * Improved the quality of the alpha blended text rendering +Sam Lantinga - Thu May 4 01:11:00 PDT 2000 + * Added font glyph caching, speeded up text rendering + * Added font attribute information. + New functions: TTF_FontDescent(), TTF_FontLineSkip() + +1.1.0: +Sam Lantinga - Tue Apr 25 22:36:41 PDT 2000 + * Added two new styles of font rendering: + solid colorkey (no dither) and alpha blended dithering + New functions: TTF_RenderText_Solid(), TTF_RenderText_Blended() + +1.0.2: +Sam Lantinga - Sun Apr 23 18:01:44 PDT 2000 + * TTF_OpenFont() takes a const char * argument, instead of char * + +1.0.1: +Sam Lantinga - Wed Jan 19 22:10:52 PST 2000 + * Added CHANGES + * Added rpm spec file contributed by Hakan Tandogan + * Removed freetype.h header dependency from public headers + * Added /usr/include/freetype/ directory detection to configure.in diff --git a/alienblaster/project/jni/sdl_ttf/COPYING b/alienblaster/project/jni/sdl_ttf/COPYING new file mode 100644 index 000000000..2cba2ac74 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/COPYING @@ -0,0 +1,458 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/alienblaster/project/jni/sdl_ttf/MPWmake.sea.bin b/alienblaster/project/jni/sdl_ttf/MPWmake.sea.bin new file mode 100644 index 0000000000000000000000000000000000000000..e2bca672ca7c96e71df3627e0a3bbba0a2be6f28 GIT binary patch literal 21632 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 literal 0 HcmV?d00001 diff --git a/alienblaster/project/jni/sdl_ttf/Makefile.am b/alienblaster/project/jni/sdl_ttf/Makefile.am new file mode 100644 index 000000000..da736f859 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/Makefile.am @@ -0,0 +1,51 @@ +# Makefile.am for the SDL truetype font loading library and viewer + +lib_LTLIBRARIES = libSDL_ttf.la + +libSDL_ttfincludedir = $(includedir)/SDL +libSDL_ttfinclude_HEADERS = \ + SDL_ttf.h + +libSDL_ttf_la_SOURCES = \ + SDL_ttf.c + +EXTRA_DIST = \ + CHANGES \ + version.rc \ + VisualC.zip \ + Xcode.tar.gz \ + MPWmake.sea.bin \ + Watcom-Win32.zip \ + SDL_ttf.spec \ + SDL_ttf.spec.in \ + gcc-fat.sh \ + autogen.sh + +if USE_VERSION_RC +libSDL_ttf_la_LDFLAGS = \ + -no-undefined \ + -release $(LT_RELEASE) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) -Wl,version.o +libSDL_ttf_la_DEPENDENCIES = version.o +else +libSDL_ttf_la_LDFLAGS = \ + -no-undefined \ + -release $(LT_RELEASE) \ + -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) +endif + +%.o : %.rc + $(WINDRES) $< $@ + +noinst_PROGRAMS = showfont glfont + +showfont_LDADD = libSDL_ttf.la +glfont_LDADD = libSDL_ttf.la @GL_LIBS@ @MATHLIB@ + +# Rule to build tar-gzipped distribution package +$(PACKAGE)-$(VERSION).tar.gz: distcheck + +# Rule to build RPM distribution package +rpm: $(PACKAGE)-$(VERSION).tar.gz + rpmbuild -ta $(PACKAGE)-$(VERSION).tar.gz + diff --git a/alienblaster/project/jni/sdl_ttf/Makefile.in b/alienblaster/project/jni/sdl_ttf/Makefile.in new file mode 100644 index 000000000..70829e4e3 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/Makefile.in @@ -0,0 +1,696 @@ +# Makefile.in generated by automake 1.9.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile.am for the SDL truetype font loading library and viewer + + + +SOURCES = $(libSDL_ttf_la_SOURCES) glfont.c showfont.c + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = showfont$(EXEEXT) glfont$(EXEEXT) +DIST_COMMON = README $(am__configure_deps) \ + $(libSDL_ttfinclude_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/SDL_ttf.spec.in \ + $(top_srcdir)/configure COPYING config.guess config.sub \ + depcomp install-sh ltmain.sh missing +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude/libtool.m4 \ + $(top_srcdir)/acinclude/sdl.m4 $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno configure.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = SDL_ttf.spec +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(libSDL_ttfincludedir)" +libLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(lib_LTLIBRARIES) +libSDL_ttf_la_LIBADD = +am_libSDL_ttf_la_OBJECTS = SDL_ttf.lo +libSDL_ttf_la_OBJECTS = $(am_libSDL_ttf_la_OBJECTS) +PROGRAMS = $(noinst_PROGRAMS) +glfont_SOURCES = glfont.c +glfont_OBJECTS = glfont.$(OBJEXT) +glfont_DEPENDENCIES = libSDL_ttf.la +showfont_SOURCES = showfont.c +showfont_OBJECTS = showfont.$(OBJEXT) +showfont_DEPENDENCIES = libSDL_ttf.la +DEFAULT_INCLUDES = -I. -I$(srcdir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libSDL_ttf_la_SOURCES) glfont.c showfont.c +DIST_SOURCES = $(libSDL_ttf_la_SOURCES) glfont.c showfont.c +libSDL_ttfincludeHEADERS_INSTALL = $(INSTALL_HEADER) +HEADERS = $(libSDL_ttfinclude_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BINARY_AGE = @BINARY_AGE@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FREETYPE_CONFIG = @FREETYPE_CONFIG@ +GL_LIBS = @GL_LIBS@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTERFACE_AGE = @INTERFACE_AGE@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_AGE = @LT_AGE@ +LT_CURRENT = @LT_CURRENT@ +LT_RELEASE = @LT_RELEASE@ +LT_REVISION = @LT_REVISION@ +MAJOR_VERSION = @MAJOR_VERSION@ +MAKEINFO = @MAKEINFO@ +MATHLIB = @MATHLIB@ +MICRO_VERSION = @MICRO_VERSION@ +MINOR_VERSION = @MINOR_VERSION@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_VERSION_RC_FALSE = @USE_VERSION_RC_FALSE@ +USE_VERSION_RC_TRUE = @USE_VERSION_RC_TRUE@ +VERSION = @VERSION@ +WINDRES = @WINDRES@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_AS = @ac_ct_AS@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DLLTOOL = @ac_ct_DLLTOOL@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_OBJDUMP = @ac_ct_OBJDUMP@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +lib_LTLIBRARIES = libSDL_ttf.la +libSDL_ttfincludedir = $(includedir)/SDL +libSDL_ttfinclude_HEADERS = \ + SDL_ttf.h + +libSDL_ttf_la_SOURCES = \ + SDL_ttf.c + +EXTRA_DIST = \ + CHANGES \ + version.rc \ + VisualC.zip \ + Xcode.tar.gz \ + MPWmake.sea.bin \ + Watcom-Win32.zip \ + SDL_ttf.spec \ + SDL_ttf.spec.in \ + gcc-fat.sh \ + autogen.sh + +@USE_VERSION_RC_FALSE@libSDL_ttf_la_LDFLAGS = \ +@USE_VERSION_RC_FALSE@ -no-undefined \ +@USE_VERSION_RC_FALSE@ -release $(LT_RELEASE) \ +@USE_VERSION_RC_FALSE@ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) + +@USE_VERSION_RC_TRUE@libSDL_ttf_la_LDFLAGS = \ +@USE_VERSION_RC_TRUE@ -no-undefined \ +@USE_VERSION_RC_TRUE@ -release $(LT_RELEASE) \ +@USE_VERSION_RC_TRUE@ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) -Wl,version.o + +@USE_VERSION_RC_TRUE@libSDL_ttf_la_DEPENDENCIES = version.o +showfont_LDADD = libSDL_ttf.la +glfont_LDADD = libSDL_ttf.la @GL_LIBS@ @MATHLIB@ +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ + cd $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +SDL_ttf.spec: $(top_builddir)/config.status $(srcdir)/SDL_ttf.spec.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libSDL_ttf.la: $(libSDL_ttf_la_OBJECTS) $(libSDL_ttf_la_DEPENDENCIES) + $(LINK) -rpath $(libdir) $(libSDL_ttf_la_LDFLAGS) $(libSDL_ttf_la_OBJECTS) $(libSDL_ttf_la_LIBADD) $(LIBS) + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +glfont$(EXEEXT): $(glfont_OBJECTS) $(glfont_DEPENDENCIES) + @rm -f glfont$(EXEEXT) + $(LINK) $(glfont_LDFLAGS) $(glfont_OBJECTS) $(glfont_LDADD) $(LIBS) +showfont$(EXEEXT): $(showfont_OBJECTS) $(showfont_DEPENDENCIES) + @rm -f showfont$(EXEEXT) + $(LINK) $(showfont_LDFLAGS) $(showfont_OBJECTS) $(showfont_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SDL_ttf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glfont.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/showfont.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +install-libSDL_ttfincludeHEADERS: $(libSDL_ttfinclude_HEADERS) + @$(NORMAL_INSTALL) + test -z "$(libSDL_ttfincludedir)" || $(mkdir_p) "$(DESTDIR)$(libSDL_ttfincludedir)" + @list='$(libSDL_ttfinclude_HEADERS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(libSDL_ttfincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(libSDL_ttfincludedir)/$$f'"; \ + $(libSDL_ttfincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(libSDL_ttfincludedir)/$$f"; \ + done + +uninstall-libSDL_ttfincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libSDL_ttfinclude_HEADERS)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(libSDL_ttfincludedir)/$$f'"; \ + rm -f "$(DESTDIR)$(libSDL_ttfincludedir)/$$f"; \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + mkdir $(distdir) + $(mkdir_p) $(distdir)/. $(distdir)/acinclude + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libSDL_ttfincludedir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-libSDL_ttfincludeHEADERS + +install-exec-am: install-libLTLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \ + uninstall-libSDL_ttfincludeHEADERS + +.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ + clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS ctags dist dist-all dist-bzip2 dist-gzip \ + dist-shar dist-tarZ dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-libSDL_ttfincludeHEADERS install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-libLTLIBRARIES uninstall-libSDL_ttfincludeHEADERS + + +%.o : %.rc + $(WINDRES) $< $@ + +# Rule to build tar-gzipped distribution package +$(PACKAGE)-$(VERSION).tar.gz: distcheck + +# Rule to build RPM distribution package +rpm: $(PACKAGE)-$(VERSION).tar.gz + rpmbuild -ta $(PACKAGE)-$(VERSION).tar.gz +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/alienblaster/project/jni/sdl_ttf/README b/alienblaster/project/jni/sdl_ttf/README new file mode 100644 index 000000000..e522c4414 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/README @@ -0,0 +1,24 @@ + +This library is a wrapper around the excellent FreeType 2.0 library, +available at: + http://www.freetype.org/ + +This library allows you to use TrueType fonts to render text in SDL +applications. + +To make the library, first install the FreeType library, then type +'./configure' then 'make' to build the SDL truetype library and the +showfont and glfont example applications. + +Be careful when including fonts with your application, as many of them +are copyrighted. The Microsoft fonts, for example, are not freely +redistributable and even the free "web" fonts they provide are only +redistributable in their special executable installer form (May 1998). +There are plenty of freeware and shareware fonts available on the Internet +though, and may suit your purposes. + +This library is available under the GNU Library General Public License, +see the file "COPYING" for details. + +Enjoy! + -Sam Lantinga <slouken@libsdl.org> (6/20/2001) diff --git a/alienblaster/project/jni/sdl_ttf/SDL_ttf.c b/alienblaster/project/jni/sdl_ttf/SDL_ttf.c new file mode 100644 index 000000000..6ed397400 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/SDL_ttf.c @@ -0,0 +1,1814 @@ +/* + SDL_ttf: A companion library to SDL for working with TrueType (tm) fonts + Copyright (C) 1997-2004 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* $Id: SDL_ttf.c 3284 2007-07-15 06:18:29Z slouken $ */ + +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifdef HAVE_ALLOCA_H +#include <alloca.h> +#endif + +#ifdef HAVE_ALLOCA +#define ALLOCA(n) ((void*)alloca(n)) +#define FREEA(p) +#else +#define ALLOCA(n) malloc(n) +#define FREEA(p) free(p) +#endif + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_TRUETYPE_IDS_H + +#include "SDL.h" +#include "SDL_endian.h" +#include "SDL_ttf.h" + +/* FIXME: Right now we assume the gray-scale renderer Freetype is using + supports 256 shades of gray, but we should instead key off of num_grays + in the result FT_Bitmap after the FT_Render_Glyph() call. */ +#define NUM_GRAYS 256 + +/* Handy routines for converting from fixed point */ +#define FT_FLOOR(X) ((X & -64) / 64) +#define FT_CEIL(X) (((X + 63) & -64) / 64) + +#define CACHED_METRICS 0x10 +#define CACHED_BITMAP 0x01 +#define CACHED_PIXMAP 0x02 + +/* Cached glyph information */ +typedef struct cached_glyph { + int stored; + FT_UInt index; + FT_Bitmap bitmap; + FT_Bitmap pixmap; + int minx; + int maxx; + int miny; + int maxy; + int yoffset; + int advance; + Uint16 cached; +} c_glyph; + +/* The structure used to hold internal font information */ +struct _TTF_Font { + /* Freetype2 maintains all sorts of useful info itself */ + FT_Face face; + + /* We'll cache these ourselves */ + int height; + int ascent; + int descent; + int lineskip; + + /* The font style */ + int style; + + /* Extra width in glyph bounds for text styles */ + int glyph_overhang; + float glyph_italics; + + /* Information in the font for underlining */ + int underline_offset; + int underline_height; + + /* Cache for style-transformed glyphs */ + c_glyph *current; + c_glyph cache[256]; + c_glyph scratch; + + /* We are responsible for closing the font stream */ + SDL_RWops *src; + int freesrc; + FT_Open_Args args; + + /* For non-scalable formats, we must remember which font index size */ + int font_size_family; +}; + +/* The FreeType font engine/library */ +static FT_Library library; +static int TTF_initialized = 0; +static int TTF_byteswapped = 0; + +/* UNICODE string utilities */ +static __inline__ int UNICODE_strlen(const Uint16 *text) +{ + int size = 0; + while ( *text++ ) { + ++size; + } + return size; +} +static __inline__ void UNICODE_strcpy(Uint16 *dst, const Uint16 *src, int swap) +{ + if ( swap ) { + while ( *src ) { + *dst = SDL_Swap16(*src); + ++src; + ++dst; + } + *dst = '\0'; + } else { + while ( *src ) { + *dst = *src; + ++src; + ++dst; + } + *dst = '\0'; + } +} + +/* rcg06192001 get linked library's version. */ +const SDL_version *TTF_Linked_Version(void) +{ + static SDL_version linked_version; + SDL_TTF_VERSION(&linked_version); + return(&linked_version); +} + +/* This function tells the library whether UNICODE text is generally + byteswapped. A UNICODE BOM character at the beginning of a string + will override this setting for that string. + */ +void TTF_ByteSwappedUNICODE(int swapped) +{ + TTF_byteswapped = swapped; +} + +static void TTF_SetFTError(const char *msg, FT_Error error) +{ +#ifdef USE_FREETYPE_ERRORS +#undef FTERRORS_H +#define FT_ERRORDEF( e, v, s ) { e, s }, + static const struct + { + int err_code; + const char* err_msg; + } ft_errors[] = { +#include <freetype/fterrors.h> + }; + int i; + const char *err_msg; + char buffer[1024]; + + err_msg = NULL; + for ( i=0; i<((sizeof ft_errors)/(sizeof ft_errors[0])); ++i ) { + if ( error == ft_errors[i].err_code ) { + err_msg = ft_errors[i].err_msg; + break; + } + } + if ( ! err_msg ) { + err_msg = "unknown FreeType error"; + } + sprintf(buffer, "%s: %s", msg, err_msg); + TTF_SetError(buffer); +#else + TTF_SetError(msg); +#endif /* USE_FREETYPE_ERRORS */ +} + +int TTF_Init( void ) +{ + int status = 0; + + if ( ! TTF_initialized ) { + FT_Error error = FT_Init_FreeType( &library ); + if ( error ) { + TTF_SetFTError("Couldn't init FreeType engine", error); + status = -1; + } + } + if ( status == 0 ) { + ++TTF_initialized; + } + return status; +} + +static unsigned long RWread( + FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count +) +{ + SDL_RWops *src; + + src = (SDL_RWops *)stream->descriptor.pointer; + SDL_RWseek( src, (int)offset, SEEK_SET ); + if ( count == 0 ) { + return 0; + } + return SDL_RWread( src, buffer, 1, (int)count ); +} + +TTF_Font* TTF_OpenFontIndexRW( SDL_RWops *src, int freesrc, int ptsize, long index ) +{ + TTF_Font* font; + FT_Error error; + FT_Face face; + FT_Fixed scale; + FT_Stream stream; + int position; + + if ( ! TTF_initialized ) { + TTF_SetError( "Library not initialized" ); + return NULL; + } + + /* Check to make sure we can seek in this stream */ + position = SDL_RWtell(src); + if ( position < 0 ) { + TTF_SetError( "Can't seek in stream" ); + return NULL; + } + + font = (TTF_Font*) malloc(sizeof *font); + if ( font == NULL ) { + TTF_SetError( "Out of memory" ); + return NULL; + } + memset(font, 0, sizeof(*font)); + + font->src = src; + font->freesrc = freesrc; + + stream = (FT_Stream)malloc(sizeof(*stream)); + if ( stream == NULL ) { + TTF_SetError( "Out of memory" ); + TTF_CloseFont( font ); + return NULL; + } + memset(stream, 0, sizeof(*stream)); + + stream->read = RWread; + stream->descriptor.pointer = src; + stream->pos = (unsigned long)position; + SDL_RWseek(src, 0, SEEK_END); + stream->size = (unsigned long)(SDL_RWtell(src) - position); + SDL_RWseek(src, position, SEEK_SET); + + font->args.flags = FT_OPEN_STREAM; + font->args.stream = stream; + + error = FT_Open_Face( library, &font->args, index, &font->face ); + if( error ) { + TTF_SetFTError( "Couldn't load font file", error ); + TTF_CloseFont( font ); + return NULL; + } + face = font->face; + + /* Make sure that our font face is scalable (global metrics) */ + if ( FT_IS_SCALABLE(face) ) { + + /* Set the character size and use default DPI (72) */ + error = FT_Set_Char_Size( font->face, 0, ptsize * 64, 0, 0 ); + if( error ) { + TTF_SetFTError( "Couldn't set font size", error ); + TTF_CloseFont( font ); + return NULL; + } + + /* Get the scalable font metrics for this font */ + scale = face->size->metrics.y_scale; + font->ascent = FT_CEIL(FT_MulFix(face->ascender, scale)); + font->descent = FT_CEIL(FT_MulFix(face->descender, scale)); + font->height = font->ascent - font->descent + /* baseline */ 1; + font->lineskip = FT_CEIL(FT_MulFix(face->height, scale)); + font->underline_offset = FT_FLOOR(FT_MulFix(face->underline_position, scale)); + font->underline_height = FT_FLOOR(FT_MulFix(face->underline_thickness, scale)); + + } else { + /* Non-scalable font case. ptsize determines which family + * or series of fonts to grab from the non-scalable format. + * It is not the point size of the font. + * */ + if ( ptsize >= font->face->num_fixed_sizes ) + ptsize = font->face->num_fixed_sizes - 1; + font->font_size_family = ptsize; + error = FT_Set_Pixel_Sizes( face, + face->available_sizes[ptsize].height, + face->available_sizes[ptsize].width ); + /* With non-scalale fonts, Freetype2 likes to fill many of the + * font metrics with the value of 0. The size of the + * non-scalable fonts must be determined differently + * or sometimes cannot be determined. + * */ + font->ascent = face->available_sizes[ptsize].height; + font->descent = 0; + font->height = face->available_sizes[ptsize].height; + font->lineskip = FT_CEIL(font->ascent); + font->underline_offset = FT_FLOOR(face->underline_position); + font->underline_height = FT_FLOOR(face->underline_thickness); + } + + if ( font->underline_height < 1 ) { + font->underline_height = 1; + } + +#ifdef DEBUG_FONTS + printf("Font metrics:\n"); + printf("\tascent = %d, descent = %d\n", + font->ascent, font->descent); + printf("\theight = %d, lineskip = %d\n", + font->height, font->lineskip); + printf("\tunderline_offset = %d, underline_height = %d\n", + font->underline_offset, font->underline_height); +#endif + + /* Set the default font style */ + font->style = TTF_STYLE_NORMAL; + font->glyph_overhang = face->size->metrics.y_ppem / 10; + /* x offset = cos(((90.0-12)/360)*2*M_PI), or 12 degree angle */ + font->glyph_italics = 0.207f; + font->glyph_italics *= font->height; + + return font; +} + +TTF_Font* TTF_OpenFontRW( SDL_RWops *src, int freesrc, int ptsize ) +{ + return TTF_OpenFontIndexRW(src, freesrc, ptsize, 0); +} + +TTF_Font* TTF_OpenFontIndex( const char *file, int ptsize, long index ) +{ + SDL_RWops *rw = SDL_RWFromFile(file, "rb"); + if ( rw == NULL ) { + TTF_SetError(SDL_GetError()); + return NULL; + } + return TTF_OpenFontIndexRW(rw, 1, ptsize, index); +} + +TTF_Font* TTF_OpenFont( const char *file, int ptsize ) +{ + return TTF_OpenFontIndex(file, ptsize, 0); +} + +static void Flush_Glyph( c_glyph* glyph ) +{ + glyph->stored = 0; + glyph->index = 0; + if( glyph->bitmap.buffer ) { + free( glyph->bitmap.buffer ); + glyph->bitmap.buffer = 0; + } + if( glyph->pixmap.buffer ) { + free( glyph->pixmap.buffer ); + glyph->pixmap.buffer = 0; + } + glyph->cached = 0; +} + +static void Flush_Cache( TTF_Font* font ) +{ + int i; + int size = sizeof( font->cache ) / sizeof( font->cache[0] ); + + for( i = 0; i < size; ++i ) { + if( font->cache[i].cached ) { + Flush_Glyph( &font->cache[i] ); + } + + } + if( font->scratch.cached ) { + Flush_Glyph( &font->scratch ); + } + +} + +static FT_Error Load_Glyph( TTF_Font* font, Uint16 ch, c_glyph* cached, int want ) +{ + FT_Face face; + FT_Error error; + FT_GlyphSlot glyph; + FT_Glyph_Metrics* metrics; + FT_Outline* outline; + + if ( !font || !font->face ) { + return FT_Err_Invalid_Handle; + } + + face = font->face; + + /* Load the glyph */ + if ( ! cached->index ) { + cached->index = FT_Get_Char_Index( face, ch ); + } + error = FT_Load_Glyph( face, cached->index, FT_LOAD_DEFAULT ); + if( error ) { + return error; + } + + /* Get our glyph shortcuts */ + glyph = face->glyph; + metrics = &glyph->metrics; + outline = &glyph->outline; + + /* Get the glyph metrics if desired */ + if ( (want & CACHED_METRICS) && !(cached->stored & CACHED_METRICS) ) { + if ( FT_IS_SCALABLE( face ) ) { + /* Get the bounding box */ + cached->minx = FT_FLOOR(metrics->horiBearingX); + cached->maxx = cached->minx + FT_CEIL(metrics->width); + cached->maxy = FT_FLOOR(metrics->horiBearingY); + cached->miny = cached->maxy - FT_CEIL(metrics->height); + cached->yoffset = font->ascent - cached->maxy; + cached->advance = FT_CEIL(metrics->horiAdvance); + } else { + /* Get the bounding box for non-scalable format. + * Again, freetype2 fills in many of the font metrics + * with the value of 0, so some of the values we + * need must be calculated differently with certain + * assumptions about non-scalable formats. + * */ + cached->minx = FT_FLOOR(metrics->horiBearingX); + cached->maxx = cached->minx + FT_CEIL(metrics->horiAdvance); + cached->maxy = FT_FLOOR(metrics->horiBearingY); + cached->miny = cached->maxy - FT_CEIL(face->available_sizes[font->font_size_family].height); + cached->yoffset = 0; + cached->advance = FT_CEIL(metrics->horiAdvance); + } + + /* Adjust for bold and italic text */ + if( font->style & TTF_STYLE_BOLD ) { + cached->maxx += font->glyph_overhang; + } + if( font->style & TTF_STYLE_ITALIC ) { + cached->maxx += (int)ceil(font->glyph_italics); + } + cached->stored |= CACHED_METRICS; + } + + if ( ((want & CACHED_BITMAP) && !(cached->stored & CACHED_BITMAP)) || + ((want & CACHED_PIXMAP) && !(cached->stored & CACHED_PIXMAP)) ) { + int mono = (want & CACHED_BITMAP); + int i; + FT_Bitmap* src; + FT_Bitmap* dst; + + /* Handle the italic style */ + if( font->style & TTF_STYLE_ITALIC ) { + FT_Matrix shear; + + shear.xx = 1 << 16; + shear.xy = (int) ( font->glyph_italics * ( 1 << 16 ) ) / font->height; + shear.yx = 0; + shear.yy = 1 << 16; + + FT_Outline_Transform( outline, &shear ); + } + + /* Render the glyph */ + if ( mono ) { + error = FT_Render_Glyph( glyph, ft_render_mode_mono ); + } else { + error = FT_Render_Glyph( glyph, ft_render_mode_normal ); + } + if( error ) { + return error; + } + + /* Copy over information to cache */ + src = &glyph->bitmap; + if ( mono ) { + dst = &cached->bitmap; + } else { + dst = &cached->pixmap; + } + memcpy( dst, src, sizeof( *dst ) ); + + /* FT_Render_Glyph() and .fon fonts always generate a + * two-color (black and white) glyphslot surface, even + * when rendered in ft_render_mode_normal. */ + /* FT_IS_SCALABLE() means that the font is in outline format, + * but does not imply that outline is rendered as 8-bit + * grayscale, because embedded bitmap/graymap is preferred + * (see FT_LOAD_DEFAULT section of FreeType2 API Reference). + * FT_Render_Glyph() canreturn two-color bitmap or 4/16/256- + * color graymap according to the format of embedded bitmap/ + * graymap. */ + if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO ) { + dst->pitch *= 8; + } else if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY2 ) { + dst->pitch *= 4; + } else if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY4 ) { + dst->pitch *= 2; + } + + /* Adjust for bold and italic text */ + if( font->style & TTF_STYLE_BOLD ) { + int bump = font->glyph_overhang; + dst->pitch += bump; + dst->width += bump; + } + if( font->style & TTF_STYLE_ITALIC ) { + int bump = (int)ceil(font->glyph_italics); + dst->pitch += bump; + dst->width += bump; + } + + if (dst->rows != 0) { + dst->buffer = (unsigned char *)malloc( dst->pitch * dst->rows ); + if( !dst->buffer ) { + return FT_Err_Out_Of_Memory; + } + memset( dst->buffer, 0, dst->pitch * dst->rows ); + + for( i = 0; i < src->rows; i++ ) { + int soffset = i * src->pitch; + int doffset = i * dst->pitch; + if ( mono ) { + unsigned char *srcp = src->buffer + soffset; + unsigned char *dstp = dst->buffer + doffset; + int j; + if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO ) { + for ( j = 0; j < src->width; j += 8 ) { + unsigned char ch = *srcp++; + *dstp++ = (ch&0x80) >> 7; + ch <<= 1; + *dstp++ = (ch&0x80) >> 7; + ch <<= 1; + *dstp++ = (ch&0x80) >> 7; + ch <<= 1; + *dstp++ = (ch&0x80) >> 7; + ch <<= 1; + *dstp++ = (ch&0x80) >> 7; + ch <<= 1; + *dstp++ = (ch&0x80) >> 7; + ch <<= 1; + *dstp++ = (ch&0x80) >> 7; + ch <<= 1; + *dstp++ = (ch&0x80) >> 7; + } + } else if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY2 ) { + for ( j = 0; j < src->width; j += 4 ) { + unsigned char ch = *srcp++; + *dstp++ = (((ch&0xA0) >> 6) >= 0x2) ? 1 : 0; + ch <<= 2; + *dstp++ = (((ch&0xA0) >> 6) >= 0x2) ? 1 : 0; + ch <<= 2; + *dstp++ = (((ch&0xA0) >> 6) >= 0x2) ? 1 : 0; + ch <<= 2; + *dstp++ = (((ch&0xA0) >> 6) >= 0x2) ? 1 : 0; + } + } else if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY4 ) { + for ( j = 0; j < src->width; j += 2 ) { + unsigned char ch = *srcp++; + *dstp++ = (((ch&0xF0) >> 4) >= 0x8) ? 1 : 0; + ch <<= 4; + *dstp++ = (((ch&0xF0) >> 4) >= 0x8) ? 1 : 0; + } + } else { + for ( j = 0; j < src->width; j++ ) { + unsigned char ch = *srcp++; + *dstp++ = (ch >= 0x80) ? 1 : 0; + } + } + } else if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO ) { + /* This special case wouldn't + * be here if the FT_Render_Glyph() + * function wasn't buggy when it tried + * to render a .fon font with 256 + * shades of gray. Instead, it + * returns a black and white surface + * and we have to translate it back + * to a 256 gray shaded surface. + * */ + unsigned char *srcp = src->buffer + soffset; + unsigned char *dstp = dst->buffer + doffset; + unsigned char ch; + int j, k; + for ( j = 0; j < src->width; j += 8) { + ch = *srcp++; + for (k = 0; k < 8; ++k) { + if ((ch&0x80) >> 7) { + *dstp++ = NUM_GRAYS - 1; + } else { + *dstp++ = 0x00; + } + ch <<= 1; + } + } + } else if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY2 ) { + unsigned char *srcp = src->buffer + soffset; + unsigned char *dstp = dst->buffer + doffset; + unsigned char ch; + int j, k; + for ( j = 0; j < src->width; j += 4 ) { + ch = *srcp++; + for ( k = 0; k < 4; ++k ) { + if ((ch&0xA0) >> 6) { + *dstp++ = NUM_GRAYS * ((ch&0xA0) >> 6) / 3 - 1; + } else { + *dstp++ = 0x00; + } + ch <<= 2; + } + } + } else if ( glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY4 ) { + unsigned char *srcp = src->buffer + soffset; + unsigned char *dstp = dst->buffer + doffset; + unsigned char ch; + int j, k; + for ( j = 0; j < src->width; j += 2 ) { + ch = *srcp++; + for ( k = 0; k < 2; ++k ) { + if ((ch&0xF0) >> 4) { + *dstp++ = NUM_GRAYS * ((ch&0xF0) >> 4) / 15 - 1; + } else { + *dstp++ = 0x00; + } + ch <<= 4; + } + } + } else { + memcpy(dst->buffer+doffset, + src->buffer+soffset, src->pitch); + } + } + } + + /* Handle the bold style */ + if ( font->style & TTF_STYLE_BOLD ) { + int row; + int col; + int offset; + int pixel; + Uint8* pixmap; + + /* The pixmap is a little hard, we have to add and clamp */ + for( row = dst->rows - 1; row >= 0; --row ) { + pixmap = (Uint8*) dst->buffer + row * dst->pitch; + for( offset=1; offset <= font->glyph_overhang; ++offset ) { + for( col = dst->width - 1; col > 0; --col ) { + if( mono ) { + pixmap[col] |= pixmap[col-1]; + } else { + pixel = (pixmap[col] + pixmap[col-1]); + if( pixel > NUM_GRAYS - 1 ) { + pixel = NUM_GRAYS - 1; + } + pixmap[col] = (Uint8) pixel; + } + } + } + } + } + + /* Mark that we rendered this format */ + if ( mono ) { + cached->stored |= CACHED_BITMAP; + } else { + cached->stored |= CACHED_PIXMAP; + } + } + + /* We're done, mark this glyph cached */ + cached->cached = ch; + + return 0; +} + +static FT_Error Find_Glyph( TTF_Font* font, Uint16 ch, int want ) +{ + int retval = 0; + + if( ch < 256 ) { + font->current = &font->cache[ch]; + } else { + if ( font->scratch.cached != ch ) { + Flush_Glyph( &font->scratch ); + } + font->current = &font->scratch; + } + if ( (font->current->stored & want) != want ) { + retval = Load_Glyph( font, ch, font->current, want ); + } + return retval; +} + +void TTF_CloseFont( TTF_Font* font ) +{ + if ( font ) { + Flush_Cache( font ); + if ( font->face ) { + FT_Done_Face( font->face ); + } + if ( font->args.stream ) { + free( font->args.stream ); + } + if ( font->freesrc ) { + SDL_RWclose( font->src ); + } + free( font ); + } +} + +static Uint16 *LATIN1_to_UNICODE(Uint16 *unicode, const char *text, int len) +{ + int i; + + for ( i=0; i < len; ++i ) { + unicode[i] = ((const unsigned char *)text)[i]; + } + unicode[i] = 0; + + return unicode; +} + +static Uint16 *UTF8_to_UNICODE(Uint16 *unicode, const char *utf8, int len) +{ + int i, j; + Uint16 ch; + + for ( i=0, j=0; i < len; ++i, ++j ) { + ch = ((const unsigned char *)utf8)[i]; + if ( ch >= 0xF0 ) { + ch = (Uint16)(utf8[i]&0x07) << 18; + ch |= (Uint16)(utf8[++i]&0x3F) << 12; + ch |= (Uint16)(utf8[++i]&0x3F) << 6; + ch |= (Uint16)(utf8[++i]&0x3F); + } else + if ( ch >= 0xE0 ) { + ch = (Uint16)(utf8[i]&0x0F) << 12; + ch |= (Uint16)(utf8[++i]&0x3F) << 6; + ch |= (Uint16)(utf8[++i]&0x3F); + } else + if ( ch >= 0xC0 ) { + ch = (Uint16)(utf8[i]&0x1F) << 6; + ch |= (Uint16)(utf8[++i]&0x3F); + } + unicode[j] = ch; + } + unicode[j] = 0; + + return unicode; +} + +int TTF_FontHeight(const TTF_Font *font) +{ + return(font->height); +} + +int TTF_FontAscent(const TTF_Font *font) +{ + return(font->ascent); +} + +int TTF_FontDescent(const TTF_Font *font) +{ + return(font->descent); +} + +int TTF_FontLineSkip(const TTF_Font *font) +{ + return(font->lineskip); +} + +long TTF_FontFaces(const TTF_Font *font) +{ + return(font->face->num_faces); +} + +int TTF_FontFaceIsFixedWidth(const TTF_Font *font) +{ + return(FT_IS_FIXED_WIDTH(font->face)); +} + +char *TTF_FontFaceFamilyName(const TTF_Font *font) +{ + return(font->face->family_name); +} + +char *TTF_FontFaceStyleName(const TTF_Font *font) +{ + return(font->face->style_name); +} + +int TTF_GlyphMetrics(TTF_Font *font, Uint16 ch, + int* minx, int* maxx, int* miny, int* maxy, int* advance) +{ + FT_Error error; + + error = Find_Glyph(font, ch, CACHED_METRICS); + if ( error ) { + TTF_SetFTError("Couldn't find glyph", error); + return -1; + } + + if ( minx ) { + *minx = font->current->minx; + } + if ( maxx ) { + *maxx = font->current->maxx; + if( font->style & TTF_STYLE_BOLD ) { + *maxx += font->glyph_overhang; + } + } + if ( miny ) { + *miny = font->current->miny; + } + if ( maxy ) { + *maxy = font->current->maxy; + } + if ( advance ) { + *advance = font->current->advance; + if( font->style & TTF_STYLE_BOLD ) { + *advance += font->glyph_overhang; + } + } + return 0; +} + +int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h) +{ + Uint16 *unicode_text; + int unicode_len; + int status; + + /* Copy the Latin-1 text to a UNICODE text buffer */ + unicode_len = strlen(text); + unicode_text = (Uint16 *)ALLOCA((1+unicode_len+1)*(sizeof *unicode_text)); + if ( unicode_text == NULL ) { + TTF_SetError("Out of memory"); + return -1; + } + *unicode_text = UNICODE_BOM_NATIVE; + LATIN1_to_UNICODE(unicode_text+1, text, unicode_len); + + /* Render the new text */ + status = TTF_SizeUNICODE(font, unicode_text, w, h); + + /* Free the text buffer and return */ + FREEA(unicode_text); + return status; +} + +int TTF_SizeUTF8(TTF_Font *font, const char *text, int *w, int *h) +{ + Uint16 *unicode_text; + int unicode_len; + int status; + + /* Copy the UTF-8 text to a UNICODE text buffer */ + unicode_len = strlen(text); + unicode_text = (Uint16 *)ALLOCA((1+unicode_len+1)*(sizeof *unicode_text)); + if ( unicode_text == NULL ) { + TTF_SetError("Out of memory"); + return -1; + } + *unicode_text = UNICODE_BOM_NATIVE; + UTF8_to_UNICODE(unicode_text+1, text, unicode_len); + + /* Render the new text */ + status = TTF_SizeUNICODE(font, unicode_text, w, h); + + /* Free the text buffer and return */ + FREEA(unicode_text); + return status; +} + +int TTF_SizeUNICODE(TTF_Font *font, const Uint16 *text, int *w, int *h) +{ + int status; + const Uint16 *ch; + int swapped; + int x, z; + int minx, maxx; + int miny, maxy; + c_glyph *glyph; + FT_Error error; + FT_Long use_kerning; + FT_UInt prev_index = 0; + + /* Initialize everything to 0 */ + if ( ! TTF_initialized ) { + TTF_SetError( "Library not initialized" ); + return -1; + } + status = 0; + minx = maxx = 0; + miny = maxy = 0; + swapped = TTF_byteswapped; + + /* check kerning */ + use_kerning = FT_HAS_KERNING( font->face ); + + /* Load each character and sum it's bounding box */ + x= 0; + for ( ch=text; *ch; ++ch ) { + Uint16 c = *ch; + if ( c == UNICODE_BOM_NATIVE ) { + swapped = 0; + if ( text == ch ) { + ++text; + } + continue; + } + if ( c == UNICODE_BOM_SWAPPED ) { + swapped = 1; + if ( text == ch ) { + ++text; + } + continue; + } + if ( swapped ) { + c = SDL_Swap16(c); + } + + error = Find_Glyph(font, c, CACHED_METRICS); + if ( error ) { + return -1; + } + glyph = font->current; + + /* handle kerning */ + if ( use_kerning && prev_index && glyph->index ) { + FT_Vector delta; + FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta ); + x += delta.x >> 6; + } + +#if 0 + if ( (ch == text) && (glyph->minx < 0) ) { + /* Fixes the texture wrapping bug when the first letter + * has a negative minx value or horibearing value. The entire + * bounding box must be adjusted to be bigger so the entire + * letter can fit without any texture corruption or wrapping. + * + * Effects: First enlarges bounding box. + * Second, xstart has to start ahead of its normal spot in the + * negative direction of the negative minx value. + * (pushes everything to the right). + * + * This will make the memory copy of the glyph bitmap data + * work out correctly. + * */ + z -= glyph->minx; + + } +#endif + + z = x + glyph->minx; + if ( minx > z ) { + minx = z; + } + if ( font->style & TTF_STYLE_BOLD ) { + x += font->glyph_overhang; + } + if ( glyph->advance > glyph->maxx ) { + z = x + glyph->advance; + } else { + z = x + glyph->maxx; + } + if ( maxx < z ) { + maxx = z; + } + x += glyph->advance; + + if ( glyph->miny < miny ) { + miny = glyph->miny; + } + if ( glyph->maxy > maxy ) { + maxy = glyph->maxy; + } + prev_index = glyph->index; + } + + /* Fill the bounds rectangle */ + if ( w ) { + *w = (maxx - minx); + } + if ( h ) { +#if 0 /* This is correct, but breaks many applications */ + *h = (maxy - miny); +#else + *h = font->height; +#endif + } + return status; +} + +/* Convert the Latin-1 text to UNICODE and render it +*/ +SDL_Surface *TTF_RenderText_Solid(TTF_Font *font, + const char *text, SDL_Color fg) +{ + SDL_Surface *textbuf; + Uint16 *unicode_text; + int unicode_len; + + /* Copy the Latin-1 text to a UNICODE text buffer */ + unicode_len = strlen(text); + unicode_text = (Uint16 *)ALLOCA((1+unicode_len+1)*(sizeof *unicode_text)); + if ( unicode_text == NULL ) { + TTF_SetError("Out of memory"); + return(NULL); + } + *unicode_text = UNICODE_BOM_NATIVE; + LATIN1_to_UNICODE(unicode_text+1, text, unicode_len); + + /* Render the new text */ + textbuf = TTF_RenderUNICODE_Solid(font, unicode_text, fg); + + /* Free the text buffer and return */ + FREEA(unicode_text); + return(textbuf); +} + +/* Convert the UTF-8 text to UNICODE and render it +*/ +SDL_Surface *TTF_RenderUTF8_Solid(TTF_Font *font, + const char *text, SDL_Color fg) +{ + SDL_Surface *textbuf; + Uint16 *unicode_text; + int unicode_len; + + /* Copy the UTF-8 text to a UNICODE text buffer */ + unicode_len = strlen(text); + unicode_text = (Uint16 *)ALLOCA((1+unicode_len+1)*(sizeof *unicode_text)); + if ( unicode_text == NULL ) { + TTF_SetError("Out of memory"); + return(NULL); + } + *unicode_text = UNICODE_BOM_NATIVE; + UTF8_to_UNICODE(unicode_text, text, unicode_len); + + /* Render the new text */ + textbuf = TTF_RenderUNICODE_Solid(font, unicode_text, fg); + + /* Free the text buffer and return */ + FREEA(unicode_text); + return(textbuf); +} + +SDL_Surface *TTF_RenderUNICODE_Solid(TTF_Font *font, + const Uint16 *text, SDL_Color fg) +{ + int xstart; + int width; + int height; + SDL_Surface* textbuf; + SDL_Palette* palette; + const Uint16* ch; + Uint8* src; + Uint8* dst; + Uint8 *dst_check; + int swapped; + int row, col; + c_glyph *glyph; + + FT_Bitmap *current; + FT_Error error; + FT_Long use_kerning; + FT_UInt prev_index = 0; + + /* Get the dimensions of the text surface */ + if( ( TTF_SizeUNICODE(font, text, &width, NULL) < 0 ) || !width ) { + TTF_SetError( "Text has zero width" ); + return NULL; + } + height = font->height; + + /* Create the target surface */ + textbuf = SDL_AllocSurface(SDL_SWSURFACE, width, height, 8, 0, 0, 0, 0); + if( textbuf == NULL ) { + return NULL; + } + + /* Adding bound checking to avoid all kinds of memory corruption errors + that may occur. */ + dst_check = (Uint8*)textbuf->pixels + textbuf->pitch * textbuf->h; + + /* Fill the palette with the foreground color */ + palette = textbuf->format->palette; + palette->colors[0].r = 255 - fg.r; + palette->colors[0].g = 255 - fg.g; + palette->colors[0].b = 255 - fg.b; + palette->colors[1].r = fg.r; + palette->colors[1].g = fg.g; + palette->colors[1].b = fg.b; + SDL_SetColorKey( textbuf, SDL_SRCCOLORKEY, 0 ); + + /* check kerning */ + use_kerning = FT_HAS_KERNING( font->face ); + + /* Load and render each character */ + xstart = 0; + swapped = TTF_byteswapped; + for( ch=text; *ch; ++ch ) { + Uint16 c = *ch; + if ( c == UNICODE_BOM_NATIVE ) { + swapped = 0; + if ( text == ch ) { + ++text; + } + continue; + } + if ( c == UNICODE_BOM_SWAPPED ) { + swapped = 1; + if ( text == ch ) { + ++text; + } + continue; + } + if ( swapped ) { + c = SDL_Swap16(c); + } + + error = Find_Glyph(font, c, CACHED_METRICS|CACHED_BITMAP); + if( error ) { + SDL_FreeSurface( textbuf ); + return NULL; + } + glyph = font->current; + current = &glyph->bitmap; + /* Ensure the width of the pixmap is correct. On some cases, + * freetype may report a larger pixmap than possible.*/ + width = current->width; + if (width > glyph->maxx - glyph->minx) { + width = glyph->maxx - glyph->minx; + } + /* do kerning, if possible AC-Patch */ + if ( use_kerning && prev_index && glyph->index ) { + FT_Vector delta; + FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta ); + xstart += delta.x >> 6; + } + /* Compensate for wrap around bug with negative minx's */ + if ( (ch == text) && (glyph->minx < 0) ) { + xstart -= glyph->minx; + } + + for( row = 0; row < current->rows; ++row ) { + /* Make sure we don't go either over, or under the + * limit */ + if ( row+glyph->yoffset < 0 ) { + continue; + } + if ( row+glyph->yoffset >= textbuf->h ) { + continue; + } + dst = (Uint8*) textbuf->pixels + + (row+glyph->yoffset) * textbuf->pitch + + xstart + glyph->minx; + src = current->buffer + row * current->pitch; + + for ( col=width; col>0 && dst < dst_check; --col ) { + *dst++ |= *src++; + } + } + + xstart += glyph->advance; + if ( font->style & TTF_STYLE_BOLD ) { + xstart += font->glyph_overhang; + } + prev_index = glyph->index; + } + + /* Handle the underline style */ + if( font->style & TTF_STYLE_UNDERLINE ) { + row = font->ascent - font->underline_offset - 1; + if ( row >= textbuf->h) { + row = (textbuf->h-1) - font->underline_height; + } + dst = (Uint8 *)textbuf->pixels + row * textbuf->pitch; + for ( row=font->underline_height; row>0; --row ) { + /* 1 because 0 is the bg color */ + memset( dst, 1, textbuf->w ); + dst += textbuf->pitch; + } + } + return textbuf; +} + +SDL_Surface *TTF_RenderGlyph_Solid(TTF_Font *font, Uint16 ch, SDL_Color fg) +{ + SDL_Surface *textbuf; + SDL_Palette *palette; + Uint8 *src, *dst; + int row; + FT_Error error; + c_glyph *glyph; + + /* Get the glyph itself */ + error = Find_Glyph(font, ch, CACHED_METRICS|CACHED_BITMAP); + if ( error ) { + return(NULL); + } + glyph = font->current; + + /* Create the target surface */ + textbuf = SDL_CreateRGBSurface( SDL_SWSURFACE, + glyph->bitmap.pitch, + glyph->bitmap.rows, + 8, 0, 0, 0, 0 ); + if ( ! textbuf ) { + return(NULL); + } + + /* Fill the palette with the foreground color */ + palette = textbuf->format->palette; + palette->colors[0].r = 255-fg.r; + palette->colors[0].g = 255-fg.g; + palette->colors[0].b = 255-fg.b; + palette->colors[1].r = fg.r; + palette->colors[1].g = fg.g; + palette->colors[1].b = fg.b; + SDL_SetColorKey(textbuf, SDL_SRCCOLORKEY, 0); + + /* Copy the character from the pixmap */ + src = glyph->bitmap.buffer; + dst = (Uint8*) textbuf->pixels; + for ( row = 0; row < textbuf->h; ++row ) { + memcpy( dst, src, glyph->bitmap.pitch ); + src += glyph->bitmap.pitch; + dst += textbuf->pitch; + } + + /* Handle the underline style */ + if( font->style & TTF_STYLE_UNDERLINE ) { + row = font->ascent - font->underline_offset - 1; + if ( row >= textbuf->h) { + row = (textbuf->h-1) - font->underline_height; + } + dst = (Uint8 *)textbuf->pixels + row * textbuf->pitch; + for ( row=font->underline_height; row>0; --row ) { + /* 1 because 0 is the bg color */ + memset( dst, 1, textbuf->w ); + dst += textbuf->pitch; + } + } + return(textbuf); +} + + +/* Convert the Latin-1 text to UNICODE and render it +*/ +SDL_Surface *TTF_RenderText_Shaded(TTF_Font *font, + const char *text, SDL_Color fg, SDL_Color bg) +{ + SDL_Surface *textbuf; + Uint16 *unicode_text; + int unicode_len; + + /* Copy the Latin-1 text to a UNICODE text buffer */ + unicode_len = strlen(text); + unicode_text = (Uint16 *)ALLOCA((1+unicode_len+1)*(sizeof *unicode_text)); + if ( unicode_text == NULL ) { + TTF_SetError("Out of memory"); + return(NULL); + } + *unicode_text = UNICODE_BOM_NATIVE; + LATIN1_to_UNICODE(unicode_text+1, text, unicode_len); + + /* Render the new text */ + textbuf = TTF_RenderUNICODE_Shaded(font, unicode_text, fg, bg); + + /* Free the text buffer and return */ + FREEA(unicode_text); + return(textbuf); +} + +/* Convert the UTF-8 text to UNICODE and render it +*/ +SDL_Surface *TTF_RenderUTF8_Shaded(TTF_Font *font, + const char *text, SDL_Color fg, SDL_Color bg) +{ + SDL_Surface *textbuf; + Uint16 *unicode_text; + int unicode_len; + + /* Copy the UTF-8 text to a UNICODE text buffer */ + unicode_len = strlen(text); + unicode_text = (Uint16 *)ALLOCA((1+unicode_len+1)*(sizeof *unicode_text)); + if ( unicode_text == NULL ) { + TTF_SetError("Out of memory"); + return(NULL); + } + *unicode_text = UNICODE_BOM_NATIVE; + UTF8_to_UNICODE(unicode_text+1, text, unicode_len); + + /* Render the new text */ + textbuf = TTF_RenderUNICODE_Shaded(font, unicode_text, fg, bg); + + /* Free the text buffer and return */ + FREEA(unicode_text); + return(textbuf); +} + +SDL_Surface* TTF_RenderUNICODE_Shaded( TTF_Font* font, + const Uint16* text, + SDL_Color fg, + SDL_Color bg ) +{ + int xstart; + int width; + int height; + SDL_Surface* textbuf; + SDL_Palette* palette; + int index; + int rdiff; + int gdiff; + int bdiff; + const Uint16* ch; + Uint8* src; + Uint8* dst; + Uint8* dst_check; + int swapped; + int row, col; + FT_Bitmap* current; + c_glyph *glyph; + FT_Error error; + FT_Long use_kerning; + FT_UInt prev_index = 0; + + /* Get the dimensions of the text surface */ + if( ( TTF_SizeUNICODE(font, text, &width, NULL) < 0 ) || !width ) { + TTF_SetError("Text has zero width"); + return NULL; + } + height = font->height; + + /* Create the target surface */ + textbuf = SDL_AllocSurface(SDL_SWSURFACE, width, height, 8, 0, 0, 0, 0); + if( textbuf == NULL ) { + return NULL; + } + + /* Adding bound checking to avoid all kinds of memory corruption errors + that may occur. */ + dst_check = (Uint8*)textbuf->pixels + textbuf->pitch * textbuf->h; + + /* Fill the palette with NUM_GRAYS levels of shading from bg to fg */ + palette = textbuf->format->palette; + rdiff = fg.r - bg.r; + gdiff = fg.g - bg.g; + bdiff = fg.b - bg.b; + + for( index = 0; index < NUM_GRAYS; ++index ) { + palette->colors[index].r = bg.r + (index*rdiff) / (NUM_GRAYS-1); + palette->colors[index].g = bg.g + (index*gdiff) / (NUM_GRAYS-1); + palette->colors[index].b = bg.b + (index*bdiff) / (NUM_GRAYS-1); + } + + /* check kerning */ + use_kerning = FT_HAS_KERNING( font->face ); + + /* Load and render each character */ + xstart = 0; + swapped = TTF_byteswapped; + for( ch = text; *ch; ++ch ) { + Uint16 c = *ch; + if ( c == UNICODE_BOM_NATIVE ) { + swapped = 0; + if ( text == ch ) { + ++text; + } + continue; + } + if ( c == UNICODE_BOM_SWAPPED ) { + swapped = 1; + if ( text == ch ) { + ++text; + } + continue; + } + if ( swapped ) { + c = SDL_Swap16(c); + } + + error = Find_Glyph(font, c, CACHED_METRICS|CACHED_PIXMAP); + if( error ) { + SDL_FreeSurface( textbuf ); + return NULL; + } + glyph = font->current; + /* Ensure the width of the pixmap is correct. On some cases, + * freetype may report a larger pixmap than possible.*/ + width = glyph->pixmap.width; + if (width > glyph->maxx - glyph->minx) { + width = glyph->maxx - glyph->minx; + } + /* do kerning, if possible AC-Patch */ + if ( use_kerning && prev_index && glyph->index ) { + FT_Vector delta; + FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta ); + xstart += delta.x >> 6; + } + /* Compensate for the wrap around with negative minx's */ + if ( (ch == text) && (glyph->minx < 0) ) { + xstart -= glyph->minx; + } + + current = &glyph->pixmap; + for( row = 0; row < current->rows; ++row ) { + /* Make sure we don't go either over, or under the + * limit */ + if ( row+glyph->yoffset < 0 ) { + continue; + } + if ( row+glyph->yoffset >= textbuf->h ) { + continue; + } + dst = (Uint8*) textbuf->pixels + + (row+glyph->yoffset) * textbuf->pitch + + xstart + glyph->minx; + src = current->buffer + row * current->pitch; + for ( col=width; col>0 && dst < dst_check; --col ) { + *dst++ |= *src++; + } + } + + xstart += glyph->advance; + if( font->style & TTF_STYLE_BOLD ) { + xstart += font->glyph_overhang; + } + prev_index = glyph->index; + } + + /* Handle the underline style */ + if( font->style & TTF_STYLE_UNDERLINE ) { + row = font->ascent - font->underline_offset - 1; + if ( row >= textbuf->h) { + row = (textbuf->h-1) - font->underline_height; + } + dst = (Uint8 *)textbuf->pixels + row * textbuf->pitch; + for ( row=font->underline_height; row>0; --row ) { + memset( dst, NUM_GRAYS - 1, textbuf->w ); + dst += textbuf->pitch; + } + } + return textbuf; +} + +SDL_Surface* TTF_RenderGlyph_Shaded( TTF_Font* font, + Uint16 ch, + SDL_Color fg, + SDL_Color bg ) +{ + SDL_Surface* textbuf; + SDL_Palette* palette; + int index; + int rdiff; + int gdiff; + int bdiff; + Uint8* src; + Uint8* dst; + int row; + FT_Error error; + c_glyph* glyph; + + /* Get the glyph itself */ + error = Find_Glyph(font, ch, CACHED_METRICS|CACHED_PIXMAP); + if( error ) { + return NULL; + } + glyph = font->current; + + /* Create the target surface */ + textbuf = SDL_CreateRGBSurface( SDL_SWSURFACE, + glyph->pixmap.width, + glyph->pixmap.rows, + 8, 0, 0, 0, 0 ); + if( !textbuf ) { + return NULL; + } + + /* Fill the palette with NUM_GRAYS levels of shading from bg to fg */ + palette = textbuf->format->palette; + rdiff = fg.r - bg.r; + gdiff = fg.g - bg.g; + bdiff = fg.b - bg.b; + for( index = 0; index < NUM_GRAYS; ++index ) { + palette->colors[index].r = bg.r + (index*rdiff) / (NUM_GRAYS-1); + palette->colors[index].g = bg.g + (index*gdiff) / (NUM_GRAYS-1); + palette->colors[index].b = bg.b + (index*bdiff) / (NUM_GRAYS-1); + } + + /* Copy the character from the pixmap */ + src = glyph->pixmap.buffer; + dst = (Uint8*) textbuf->pixels; + for ( row = 0; row < textbuf->h; ++row ) { + memcpy( dst, src, glyph->pixmap.pitch ); + src += glyph->pixmap.pitch; + dst += textbuf->pitch; + } + + /* Handle the underline style */ + if( font->style & TTF_STYLE_UNDERLINE ) { + row = font->ascent - font->underline_offset - 1; + if ( row >= textbuf->h) { + row = (textbuf->h-1) - font->underline_height; + } + dst = (Uint8 *)textbuf->pixels + row * textbuf->pitch; + for ( row=font->underline_height; row>0; --row ) { + memset( dst, NUM_GRAYS - 1, textbuf->w ); + dst += textbuf->pitch; + } + } + return textbuf; +} + +/* Convert the Latin-1 text to UNICODE and render it +*/ +SDL_Surface *TTF_RenderText_Blended(TTF_Font *font, + const char *text, SDL_Color fg) +{ + SDL_Surface *textbuf; + Uint16 *unicode_text; + int unicode_len; + + /* Copy the Latin-1 text to a UNICODE text buffer */ + unicode_len = strlen(text); + unicode_text = (Uint16 *)ALLOCA((1+unicode_len+1)*(sizeof *unicode_text)); + if ( unicode_text == NULL ) { + TTF_SetError("Out of memory"); + return(NULL); + } + *unicode_text = UNICODE_BOM_NATIVE; + LATIN1_to_UNICODE(unicode_text+1, text, unicode_len); + + /* Render the new text */ + textbuf = TTF_RenderUNICODE_Blended(font, unicode_text, fg); + + /* Free the text buffer and return */ + FREEA(unicode_text); + return(textbuf); +} + +/* Convert the UTF-8 text to UNICODE and render it +*/ +SDL_Surface *TTF_RenderUTF8_Blended(TTF_Font *font, + const char *text, SDL_Color fg) +{ + SDL_Surface *textbuf; + Uint16 *unicode_text; + int unicode_len; + + /* Copy the UTF-8 text to a UNICODE text buffer */ + unicode_len = strlen(text); + unicode_text = (Uint16 *)ALLOCA((1+unicode_len+1)*(sizeof *unicode_text)); + if ( unicode_text == NULL ) { + TTF_SetError("Out of memory"); + return(NULL); + } + *unicode_text = UNICODE_BOM_NATIVE; + UTF8_to_UNICODE(unicode_text+1, text, unicode_len); + + /* Render the new text */ + textbuf = TTF_RenderUNICODE_Blended(font, unicode_text, fg); + + /* Free the text buffer and return */ + FREEA(unicode_text); + return(textbuf); +} + +SDL_Surface *TTF_RenderUNICODE_Blended(TTF_Font *font, + const Uint16 *text, SDL_Color fg) +{ + int xstart; + int width, height; + SDL_Surface *textbuf; + Uint32 alpha; + Uint32 pixel; + const Uint16 *ch; + Uint8 *src; + Uint32 *dst; + Uint32 *dst_check; + int swapped; + int row, col; + c_glyph *glyph; + FT_Error error; + FT_Long use_kerning; + FT_UInt prev_index = 0; + + /* Get the dimensions of the text surface */ + if ( (TTF_SizeUNICODE(font, text, &width, NULL) < 0) || !width ) { + TTF_SetError("Text has zero width"); + return(NULL); + } + height = font->height; + + textbuf = SDL_AllocSurface(SDL_SWSURFACE, width, height, 32, + 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000); + if ( textbuf == NULL ) { + return(NULL); + } + + /* Adding bound checking to avoid all kinds of memory corruption errors + that may occur. */ + dst_check = (Uint32*)textbuf->pixels + textbuf->pitch/4 * textbuf->h; + + /* check kerning */ + use_kerning = FT_HAS_KERNING( font->face ); + + /* Load and render each character */ + xstart = 0; + swapped = TTF_byteswapped; + pixel = (fg.r<<16)|(fg.g<<8)|fg.b; + SDL_FillRect(textbuf, NULL, pixel); /* Initialize with fg and 0 alpha */ + + for ( ch=text; *ch; ++ch ) { + Uint16 c = *ch; + if ( c == UNICODE_BOM_NATIVE ) { + swapped = 0; + if ( text == ch ) { + ++text; + } + continue; + } + if ( c == UNICODE_BOM_SWAPPED ) { + swapped = 1; + if ( text == ch ) { + ++text; + } + continue; + } + if ( swapped ) { + c = SDL_Swap16(c); + } + error = Find_Glyph(font, c, CACHED_METRICS|CACHED_PIXMAP); + if( error ) { + SDL_FreeSurface( textbuf ); + return NULL; + } + glyph = font->current; + /* Ensure the width of the pixmap is correct. On some cases, + * freetype may report a larger pixmap than possible.*/ + width = glyph->pixmap.width; + if (width > glyph->maxx - glyph->minx) { + width = glyph->maxx - glyph->minx; + } + /* do kerning, if possible AC-Patch */ + if ( use_kerning && prev_index && glyph->index ) { + FT_Vector delta; + FT_Get_Kerning( font->face, prev_index, glyph->index, ft_kerning_default, &delta ); + xstart += delta.x >> 6; + } + + /* Compensate for the wrap around bug with negative minx's */ + if ( (ch == text) && (glyph->minx < 0) ) { + xstart -= glyph->minx; + } + + for ( row = 0; row < glyph->pixmap.rows; ++row ) { + /* Make sure we don't go either over, or under the + * limit */ + if ( row+glyph->yoffset < 0 ) { + continue; + } + if ( row+glyph->yoffset >= textbuf->h ) { + continue; + } + dst = (Uint32*) textbuf->pixels + + (row+glyph->yoffset) * textbuf->pitch/4 + + xstart + glyph->minx; + + /* Added code to adjust src pointer for pixmaps to + * account for pitch. + * */ + src = (Uint8*) (glyph->pixmap.buffer + glyph->pixmap.pitch * row); + for ( col = width; col>0 && dst < dst_check; --col) { + alpha = *src++; + *dst++ |= pixel | (alpha << 24); + } + } + + xstart += glyph->advance; + if ( font->style & TTF_STYLE_BOLD ) { + xstart += font->glyph_overhang; + } + prev_index = glyph->index; + } + + /* Handle the underline style */ + if( font->style & TTF_STYLE_UNDERLINE ) { + row = font->ascent - font->underline_offset - 1; + if ( row >= textbuf->h) { + row = (textbuf->h-1) - font->underline_height; + } + dst = (Uint32 *)textbuf->pixels + row * textbuf->pitch/4; + pixel |= 0xFF000000; /* Amask */ + for ( row=font->underline_height; row>0; --row ) { + for ( col=0; col < textbuf->w; ++col ) { + dst[col] = pixel; + } + dst += textbuf->pitch/4; + } + } + return(textbuf); +} + +SDL_Surface *TTF_RenderGlyph_Blended(TTF_Font *font, Uint16 ch, SDL_Color fg) +{ + SDL_Surface *textbuf; + Uint32 alpha; + Uint32 pixel; + Uint8 *src; + Uint32 *dst; + int row, col; + FT_Error error; + c_glyph *glyph; + + /* Get the glyph itself */ + error = Find_Glyph(font, ch, CACHED_METRICS|CACHED_PIXMAP); + if ( error ) { + return(NULL); + } + glyph = font->current; + + textbuf = SDL_CreateRGBSurface(SDL_SWSURFACE, + glyph->pixmap.width, glyph->pixmap.rows, 32, + 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000); + if ( ! textbuf ) { + return(NULL); + } + + /* Copy the character from the pixmap */ + pixel = (fg.r<<16)|(fg.g<<8)|fg.b; + SDL_FillRect(textbuf, NULL, pixel); /* Initialize with fg and 0 alpha */ + + for ( row=0; row<textbuf->h; ++row ) { + /* Changed src to take pitch into account, not just width */ + src = glyph->pixmap.buffer + row * glyph->pixmap.pitch; + dst = (Uint32 *)textbuf->pixels + row * textbuf->pitch/4; + for ( col=0; col<glyph->pixmap.width; ++col ) { + alpha = *src++; + *dst++ = pixel | (alpha << 24); + } + } + + /* Handle the underline style */ + if( font->style & TTF_STYLE_UNDERLINE ) { + row = font->ascent - font->underline_offset - 1; + if ( row >= textbuf->h) { + row = (textbuf->h-1) - font->underline_height; + } + dst = (Uint32 *)textbuf->pixels + row * textbuf->pitch/4; + pixel |= 0xFF000000; /* Amask */ + for ( row=font->underline_height; row>0; --row ) { + for ( col=0; col < textbuf->w; ++col ) { + dst[col] = pixel; + } + dst += textbuf->pitch/4; + } + } + return(textbuf); +} + +void TTF_SetFontStyle( TTF_Font* font, int style ) +{ + font->style = style; + Flush_Cache( font ); +} + +int TTF_GetFontStyle( const TTF_Font* font ) +{ + return font->style; +} + +void TTF_Quit( void ) +{ + if ( TTF_initialized ) { + if ( --TTF_initialized == 0 ) { + FT_Done_FreeType( library ); + } + } +} + +int TTF_WasInit( void ) +{ + return TTF_initialized; +} diff --git a/alienblaster/project/jni/sdl_ttf/SDL_ttf.h b/alienblaster/project/jni/sdl_ttf/SDL_ttf.h new file mode 100644 index 000000000..581e3304a --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/SDL_ttf.h @@ -0,0 +1,234 @@ +/* + SDL_ttf: A companion library to SDL for working with TrueType (tm) fonts + Copyright (C) 1997-2004 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* $Id: SDL_ttf.h 3282 2007-07-15 06:02:48Z slouken $ */ + +/* This library is a wrapper around the excellent FreeType 2.0 library, + available at: + http://www.freetype.org/ +*/ + +#ifndef _SDL_TTF_H +#define _SDL_TTF_H + +#include "SDL.h" +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL +*/ +#define SDL_TTF_MAJOR_VERSION 2 +#define SDL_TTF_MINOR_VERSION 0 +#define SDL_TTF_PATCHLEVEL 9 + +/* This macro can be used to fill a version structure with the compile-time + * version of the SDL_ttf library. + */ +#define SDL_TTF_VERSION(X) \ +{ \ + (X)->major = SDL_TTF_MAJOR_VERSION; \ + (X)->minor = SDL_TTF_MINOR_VERSION; \ + (X)->patch = SDL_TTF_PATCHLEVEL; \ +} + +/* Backwards compatibility */ +#define TTF_MAJOR_VERSION SDL_TTF_MAJOR_VERSION +#define TTF_MINOR_VERSION SDL_TTF_MINOR_VERSION +#define TTF_PATCHLEVEL SDL_TTF_PATCHLEVEL +#define TTF_VERSION(X) SDL_TTF_VERSION(X) + +/* This function gets the version of the dynamically linked SDL_ttf library. + it should NOT be used to fill a version structure, instead you should + use the SDL_TTF_VERSION() macro. + */ +extern DECLSPEC const SDL_version * SDLCALL TTF_Linked_Version(void); + +/* ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark) */ +#define UNICODE_BOM_NATIVE 0xFEFF +#define UNICODE_BOM_SWAPPED 0xFFFE + +/* This function tells the library whether UNICODE text is generally + byteswapped. A UNICODE BOM character in a string will override + this setting for the remainder of that string. +*/ +extern DECLSPEC void SDLCALL TTF_ByteSwappedUNICODE(int swapped); + +/* The internal structure containing font information */ +typedef struct _TTF_Font TTF_Font; + +/* Initialize the TTF engine - returns 0 if successful, -1 on error */ +extern DECLSPEC int SDLCALL TTF_Init(void); + +/* Open a font file and create a font of the specified point size. + * Some .fon fonts will have several sizes embedded in the file, so the + * point size becomes the index of choosing which size. If the value + * is too high, the last indexed size will be the default. */ +extern DECLSPEC TTF_Font * SDLCALL TTF_OpenFont(const char *file, int ptsize); +extern DECLSPEC TTF_Font * SDLCALL TTF_OpenFontIndex(const char *file, int ptsize, long index); +extern DECLSPEC TTF_Font * SDLCALL TTF_OpenFontRW(SDL_RWops *src, int freesrc, int ptsize); +extern DECLSPEC TTF_Font * SDLCALL TTF_OpenFontIndexRW(SDL_RWops *src, int freesrc, int ptsize, long index); + +/* Set and retrieve the font style + This font style is implemented by modifying the font glyphs, and + doesn't reflect any inherent properties of the truetype font file. +*/ +#define TTF_STYLE_NORMAL 0x00 +#define TTF_STYLE_BOLD 0x01 +#define TTF_STYLE_ITALIC 0x02 +#define TTF_STYLE_UNDERLINE 0x04 +extern DECLSPEC int SDLCALL TTF_GetFontStyle(const TTF_Font *font); +extern DECLSPEC void SDLCALL TTF_SetFontStyle(TTF_Font *font, int style); + +/* Get the total height of the font - usually equal to point size */ +extern DECLSPEC int SDLCALL TTF_FontHeight(const TTF_Font *font); + +/* Get the offset from the baseline to the top of the font + This is a positive value, relative to the baseline. + */ +extern DECLSPEC int SDLCALL TTF_FontAscent(const TTF_Font *font); + +/* Get the offset from the baseline to the bottom of the font + This is a negative value, relative to the baseline. + */ +extern DECLSPEC int SDLCALL TTF_FontDescent(const TTF_Font *font); + +/* Get the recommended spacing between lines of text for this font */ +extern DECLSPEC int SDLCALL TTF_FontLineSkip(const TTF_Font *font); + +/* Get the number of faces of the font */ +extern DECLSPEC long SDLCALL TTF_FontFaces(const TTF_Font *font); + +/* Get the font face attributes, if any */ +extern DECLSPEC int SDLCALL TTF_FontFaceIsFixedWidth(const TTF_Font *font); +extern DECLSPEC char * SDLCALL TTF_FontFaceFamilyName(const TTF_Font *font); +extern DECLSPEC char * SDLCALL TTF_FontFaceStyleName(const TTF_Font *font); + +/* Get the metrics (dimensions) of a glyph + To understand what these metrics mean, here is a useful link: + http://freetype.sourceforge.net/freetype2/docs/tutorial/step2.html + */ +extern DECLSPEC int SDLCALL TTF_GlyphMetrics(TTF_Font *font, Uint16 ch, + int *minx, int *maxx, + int *miny, int *maxy, int *advance); + +/* Get the dimensions of a rendered string of text */ +extern DECLSPEC int SDLCALL TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h); +extern DECLSPEC int SDLCALL TTF_SizeUTF8(TTF_Font *font, const char *text, int *w, int *h); +extern DECLSPEC int SDLCALL TTF_SizeUNICODE(TTF_Font *font, const Uint16 *text, int *w, int *h); + +/* Create an 8-bit palettized surface and render the given text at + fast quality with the given font and color. The 0 pixel is the + colorkey, giving a transparent background, and the 1 pixel is set + to the text color. + This function returns the new surface, or NULL if there was an error. +*/ +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Solid(TTF_Font *font, + const char *text, SDL_Color fg); +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUTF8_Solid(TTF_Font *font, + const char *text, SDL_Color fg); +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUNICODE_Solid(TTF_Font *font, + const Uint16 *text, SDL_Color fg); + +/* Create an 8-bit palettized surface and render the given glyph at + fast quality with the given font and color. The 0 pixel is the + colorkey, giving a transparent background, and the 1 pixel is set + to the text color. The glyph is rendered without any padding or + centering in the X direction, and aligned normally in the Y direction. + This function returns the new surface, or NULL if there was an error. +*/ +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderGlyph_Solid(TTF_Font *font, + Uint16 ch, SDL_Color fg); + +/* Create an 8-bit palettized surface and render the given text at + high quality with the given font and colors. The 0 pixel is background, + while other pixels have varying degrees of the foreground color. + This function returns the new surface, or NULL if there was an error. +*/ +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Shaded(TTF_Font *font, + const char *text, SDL_Color fg, SDL_Color bg); +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUTF8_Shaded(TTF_Font *font, + const char *text, SDL_Color fg, SDL_Color bg); +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUNICODE_Shaded(TTF_Font *font, + const Uint16 *text, SDL_Color fg, SDL_Color bg); + +/* Create an 8-bit palettized surface and render the given glyph at + high quality with the given font and colors. The 0 pixel is background, + while other pixels have varying degrees of the foreground color. + The glyph is rendered without any padding or centering in the X + direction, and aligned normally in the Y direction. + This function returns the new surface, or NULL if there was an error. +*/ +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderGlyph_Shaded(TTF_Font *font, + Uint16 ch, SDL_Color fg, SDL_Color bg); + +/* Create a 32-bit ARGB surface and render the given text at high quality, + using alpha blending to dither the font with the given color. + This function returns the new surface, or NULL if there was an error. +*/ +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderText_Blended(TTF_Font *font, + const char *text, SDL_Color fg); +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUTF8_Blended(TTF_Font *font, + const char *text, SDL_Color fg); +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderUNICODE_Blended(TTF_Font *font, + const Uint16 *text, SDL_Color fg); + +/* Create a 32-bit ARGB surface and render the given glyph at high quality, + using alpha blending to dither the font with the given color. + The glyph is rendered without any padding or centering in the X + direction, and aligned normally in the Y direction. + This function returns the new surface, or NULL if there was an error. +*/ +extern DECLSPEC SDL_Surface * SDLCALL TTF_RenderGlyph_Blended(TTF_Font *font, + Uint16 ch, SDL_Color fg); + +/* For compatibility with previous versions, here are the old functions */ +#define TTF_RenderText(font, text, fg, bg) \ + TTF_RenderText_Shaded(font, text, fg, bg) +#define TTF_RenderUTF8(font, text, fg, bg) \ + TTF_RenderUTF8_Shaded(font, text, fg, bg) +#define TTF_RenderUNICODE(font, text, fg, bg) \ + TTF_RenderUNICODE_Shaded(font, text, fg, bg) + +/* Close an opened font file */ +extern DECLSPEC void SDLCALL TTF_CloseFont(TTF_Font *font); + +/* De-initialize the TTF engine */ +extern DECLSPEC void SDLCALL TTF_Quit(void); + +/* Check if the TTF engine is initialized */ +extern DECLSPEC int SDLCALL TTF_WasInit(void); + +/* We'll use SDL for reporting errors */ +#define TTF_SetError SDL_SetError +#define TTF_GetError SDL_GetError + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* _SDL_TTF_H */ diff --git a/alienblaster/project/jni/sdl_ttf/SDL_ttf.spec b/alienblaster/project/jni/sdl_ttf/SDL_ttf.spec new file mode 100644 index 000000000..566d919bd --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/SDL_ttf.spec @@ -0,0 +1,65 @@ +%define name SDL_ttf +%define version 2.0.9 +%define release 1 + +Summary: Simple DirectMedia Layer - Sample TrueType Font Library +Name: %{name} +Version: %{version} +Release: %{release} +Source0: %{name}-%{version}.tar.gz +License: LGPL +Group: System Environment/Libraries +BuildRoot: /var/tmp/%{name}-buildroot +Prefix: %{_prefix} +Packager: Hakan Tandogan <hakan@iconsult.com> +#BuildRequires: SDL-devel +#BuildRequires: freetype-devel + +%description +This library allows you to use TrueType fonts to render text in SDL +applications. + +%package devel +Summary: Libraries, includes and more to develop SDL applications. +Group: Development/Libraries +Requires: %{name} +Requires: SDL-devel + +%description devel +This library allows you to use TrueType fonts to render text in SDL +applications. + +%prep +rm -rf ${RPM_BUILD_ROOT} + +%setup + +%build +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} +make + +%install +rm -rf $RPM_BUILD_ROOT +make install prefix=$RPM_BUILD_ROOT/%{prefix} + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +%doc README CHANGES COPYING +%{prefix}/lib/lib*.so.* + +%files devel +%defattr(-,root,root) +%{prefix}/lib/lib*.a +%{prefix}/lib/lib*.la +%{prefix}/lib/lib*.so +%{prefix}/include/SDL/ + +%changelog +* Wed Jan 19 2000 Sam Lantinga +- converted to get package information from configure +* Sun Jan 16 2000 Hakan Tandogan <hakan@iconsult.com> +- initial spec file + diff --git a/alienblaster/project/jni/sdl_ttf/SDL_ttf.spec.in b/alienblaster/project/jni/sdl_ttf/SDL_ttf.spec.in new file mode 100644 index 000000000..f4ca61402 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/SDL_ttf.spec.in @@ -0,0 +1,65 @@ +%define name @PACKAGE@ +%define version @VERSION@ +%define release 1 + +Summary: Simple DirectMedia Layer - Sample TrueType Font Library +Name: %{name} +Version: %{version} +Release: %{release} +Source0: %{name}-%{version}.tar.gz +License: LGPL +Group: System Environment/Libraries +BuildRoot: /var/tmp/%{name}-buildroot +Prefix: %{_prefix} +Packager: Hakan Tandogan <hakan@iconsult.com> +#BuildRequires: SDL-devel +#BuildRequires: freetype-devel + +%description +This library allows you to use TrueType fonts to render text in SDL +applications. + +%package devel +Summary: Libraries, includes and more to develop SDL applications. +Group: Development/Libraries +Requires: %{name} +Requires: SDL-devel + +%description devel +This library allows you to use TrueType fonts to render text in SDL +applications. + +%prep +rm -rf ${RPM_BUILD_ROOT} + +%setup + +%build +CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} +make + +%install +rm -rf $RPM_BUILD_ROOT +make install prefix=$RPM_BUILD_ROOT/%{prefix} + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +%doc README CHANGES COPYING +%{prefix}/lib/lib*.so.* + +%files devel +%defattr(-,root,root) +%{prefix}/lib/lib*.a +%{prefix}/lib/lib*.la +%{prefix}/lib/lib*.so +%{prefix}/include/SDL/ + +%changelog +* Wed Jan 19 2000 Sam Lantinga +- converted to get package information from configure +* Sun Jan 16 2000 Hakan Tandogan <hakan@iconsult.com> +- initial spec file + diff --git a/alienblaster/project/jni/sdl_ttf/VisualC.zip b/alienblaster/project/jni/sdl_ttf/VisualC.zip new file mode 100644 index 0000000000000000000000000000000000000000..2ae0d6a0d8a9f3d7f3622753ca9d5a1255b5c5aa GIT binary patch literal 265264 zcmWIWW@h1H0D&JtU(G-?40AAuGK6IomnP;o>xYJLGB7JUE^-6m&<YlY7tD-I2(1qT zQMC#pX>}_~O%16mNQIaoX1~Y{gfY!{jAn);HZwBwl5<K^pk_(gFLDE6!e%MqGb^nq zHMIopK#+kTjA<ykCpC#OG&w&nEi)ar=S3J87&sU}W;<=V|Ei0JfuYZYfx(y*v(ri- zmgr@GqX`teAPn=tRjJJ4+dIDQu4kQeX3g8!XuC(de0QJZ(LLQKCA&^#{pPvnE(oxC z-Uw)6Q&3%f_uuz@-x=g~>7<5xn$MZhck+1od<MUL_wSZ&D*t4A`|8sTUmrWT)>>-t zmN(|Qhqs;0-m?05nhw*=>5QA_sLeVa<hn-R`5@n=>EC8{9lDwLGW$bV*yEYgniJ2Q zySHbjjh(%%t#wj?{qo=0yW%hWo%F6g?e5L0oa;48)oUid@OYtoEhu(j@;8OU3pw1~ zd)#fmDSVJ!-6^<7TBqxWs_I*wr5jJR-B0H0S!vhZ-gGxZ(Q5O?gygk#f{r<ovL7X9 zHkPt__q>ojn=HLjZU(o!a)JM>h|_sO-E!WG<TyGyk{7zC$xgM*S;*s(azt=-=;^6$ zyMtcUylKc=m-a$?V~>y|Z^W7j6P3NI%8pFYyP%uYZS0w@m1y*8VKk$)v)tv$it{;^ zvA!2f?lU{N(JNo2zw@K%UzSFR<37jM%x`&^)6052D$!j$@ph`)t=q{t<r4lJx8J3x z<~%vzY#_ZuJW{;2`Sb~cbBkCWbJpe_VO|^I|0Pw$aJocx`MR~z={FR5F8+#|p(Eg8 zGGQV^_qEV}6Fw-$Iy87x2(1=OS=rG1)i}qt@f=@#bMuh{H!^y7juoloG%UD1bD`HE zx$clNN{kH;&L5oM&fIv8rT)pJK2eu+DFb&On~A3tYr1Cq*|vJ;yp1b++E*}&$|lc> zy*B%|NB-MY=c5wM!@JflR4{1I(o&mZ>`=bxe2*08v{3HZnK_9DDNI-7(&nv<IB=|5 zI5X!;^QL2p{0HJ9S24Nvq)*`cus7|lOWTYcCQp=>b{GCxx+h%c(h-+AGg@R`ZsdQ~ zckqrnONw8eiLr3^#od1wC#9XreHC-x>FHKc=EV;_+06MglW}3Q0pr|**&eAmRw99d z(i4}6%>I4#dG%@Wo~ojp0>S39jor!~CsWS4tKacl=6E~)&GfK@+nV{iPfx3^UY{cW z%4h!1f4<A_<lG6#|NDL4{_kBvGb3tv9)x9lOSZRD|2(zr{io&TviBX$-&<WxTl{u^ z{MSu)KT2JXdwpwt==!L**Xa$nnzx5fy`6QqKK|o6?X~#}4bH@uo31auoO8ARcKOtz zugjv+!fySZ*1jsCbp4&IZQGB2tFCO`U>+&RS<&(~WDQ&M1u=%n4)2~<Zrc1XCTWUZ zlS{VXQPvzSAv4yd=npDAy=yaDPfgewDIn?4%e0(lYOd1OF1OD&_|EC=Hd-BaYe!Gw zgtdm(6fPcClZk%f<j;CUqj6QHiTcZ5Jk!!`W}kNPKep~!;8N{t_v~vHEDI}r+c5Rw zhUS2}O{F`P=j}+m%3*bxMKte5-A{jU|MnTBAC<pxgvP&5pTx)b>&>J_RiDnKY{oOT zYIaNi%wPD6{l{5FF`nrc&ogY}73{6eKFDU&^}SnSt>tg8Xy&NA{-7lcwI|q$nEXoF z-keN`*r4vm8C6;-zA9L#Q@tRtpyRwY_wFreYRNzMUjMXy)!f>$gw4tPb8V+6UwL34 z%Hcb)ymbjTPbX{4HIWxv_wTfJTJN#hd|BA>*lD}C&nryZw4LeLq`HIiPpF;H>YpPi z8{Qy)AwPxr#GP<y+5PWoQ}XX`y1ZO^$GdD-vs+i|!)BS=IT-fTmIXa|D-gkDeksy3 zm3is)=c_eE3-``;KDzIBp6yayjkvfq3o=;lY;6musFY9T)C;a&_gP%u__dC7yKS46 zRLZfB3hI7G3d`AY*HjlDhz%1{o$-EQyraL5?7Llcm4$wVJd%ODN)ET1zj0?Ba5;Ie z?BUj>&J)<O&mMa_?U>UA-fO2etTnryl@vesPTHdVC+&-Ni_08|`s&whSJQPkUW0wx znM3Nfa>bj%&b5cHzGwDI^vk9FOX3&n^!_e;I_uJI>4eL>?Dkh3)ZFR1qvo)?MbRU5 zi-0sfxBIg4w@di{XK<>!nh6+Q-qgNF^`eEyoevu8|L2@4WeIL5l$(}jayllE>-Q4| zt_KaWO?C&Le|<1vZ|Q#i=T|rHe)aokwR?5t_ql1ZvySFkA76jTI%#v`v_+=d_Jt{* z(!L_FEObKoRhG$@wsw8nxZCU5E6WD&*a!(rCi#ZQix+nM(F_XK_<o^PijmLQclxOn z*FzqNG;G_r!-Y|A^193&UwZ@}EoS9hV0LTHnSGsk`Q<<MHS}MpoKW`K`oOm6dv|7S zHaQo1aHEo7L-&JCQ)7QMg@ruSP$<@4rWfh-yN7#A@r?ztb3LM#KWNC<l_dZ0|AWGa zF8-ir{0RZy-@VHcz2AO>qx6;QH>PKA*k`Pg_TB$x>pF$m4)ap>|2y?>YkS8tgDdh{ zYx&=bxPD_2V*H|UipTKzt=AX0gf+vS?dtYAu*)Fy*W`uE{(oX(-?RDhCD)fHjb2}4 zh^rFTbG|oqVNZJLDTAdCy@i$?@Ob;~lTxbkQ{hPq?&tiL|2to6tyzlee!ifsTK{*f z-?pIX?~gLc2XC(IKQQaTtK*ZD&Ru#nTU_D*<J_3df9J&o>HaM9@-pp`zM?)OHsQ8z ze$U<IdmWf;T|~I8w=9c2_ve!Kj@c3%xnXaPyq#r!Mf{sI+b{JuyV~>?HX1kBo!9#x z*5J9QQbS5qN1*b<9}9-N54-e=XD;c9VcV(_KYzW-%LOu?ET^QeB~9L`8~R4eJh(J~ zJA_+SJEh_JbBWhKG+XL~0>wRS<-YJb3)XB}ZFbu7vQCfn!l3yPM#n6#+`O-}b@gYq z@8$y8JS=Y`-cEY3=i2?;N%q0z%f3iE{OUOuSi!w1>anzD+Nyg#7n{xn>U{fsGmn4W zONSpBce)nDy7Fm$mw4M?V;!Awr?cbX_Y>dTxQ^{LY1*R_mNDtRsO|c&-S<CDnS557 zgL%C>=ZuZon=Wbp-pO#pX4Y-7t^ge$BQe*HoHJw#CcO(1e!6wZJ-uYd4O>-ybLV_} z_GQYBU!ITrIJEzNVD=Gwu=m09rhhg|M8&QjVsgH@Bk4Bd_A8HnFDO*-&&fZz@^{+I z$p5QuuBz;PZ6s>Hq-JSJM~q^%q_zCRU)t3Inc{PFr{An_-lk^bqp|Va!zqHnQrium z3u~r4mDsNQ@vx8A_SYL%ZvOeps_KK))3m!QIW+A*NW3_=`h@Lk&BOw=!Z%Co+?Y45 zowB8Co5!LH9Fan$g4w2`H||Xd^|vWlyY$kx$GWkX?>Vdx{gNmBU8O(y-?o@};SZAA z68>+VvcpAuawqrE-oVpu{sr`1$veNrx-`c1h32>Uk4}3%wyHgPqrNau-2eK9%TCN} z0oT8O{dHdR4$~>6N%;%!ewwz2b5oAQCI{{q^NkA=PRp`obgcfmpmt8)W#7q6W*ojY zK|)8$RO?vc+IAbB(z|dm!dv>hZKj6it(8`dO3^Wsyf^+_;3oa?W)1U=I=4#!ahGfJ zS6F&+OYgK|T*B?%^U0abV)yRcTSs;6{x7?!6+Y+q+3?CJM-APi+cQO<wYBZpp>xLm z{HJP<-r0BmZ;>ii>}bzFkr|khp1xgSQ^Lwcb1!BciJY`9ap}UDwhFtB2AuIpH4apC znrowRcC*ux-#hx8?*0z&Jb3HsF<qY4v#a-qpPJhm6Z$QS{f*|_mp(n|-V)VOOrO?k zoAVj47v(0b+nXSx##TR1S!v#a`pz4tKb_`n5n~WPzQwd+{_&qvOoNM~;#RNoS-<k- zx;<s7laFw0p38H3g0^MNLx=F9=1aMUFE)vV6>M_!*XK&`o)cns&op|jZ%xFCw<Vjo z%5>w!DtN<hXK1wlk$E@mp?SfNo_Bxd@3}TDhUrOq;ZBzQo!&nb@)s9yuUda7z}N7v zcv#EZz!kjihd<5f-y3;NI?3K!fcrSZyiC*bP;0KHo2*VzMGq7w)G_oaY-L{V9<n&o zZKJl3@wXY;)$`R>Pgz(e#QLpa#@%D*`hNSWoR8bI@la>j>_0wox&7iS%2^kJFK*~& zDG;~s5Y`Pk^X|!2qadq8)91Pvv+YYvHE{jX$<M;~*y!H&*`~><J#TI;7BMlEYtee} zP_ba?qMIJ7&mwnzU|HpObAhjgM2kW3f#u$Brj+GwnEU9U)2pjl;c-8ik1jsrzv+ir zSxrHVP4dmB23|`qz1`CpdDQ>-?p2{;7F<pjY&NoN>nOaQb7*Uctit){Ki|Z}UDTd- zBtkwZK4#tXEqhg>3O{%BZT*+_@ZXBM8^^w$JDMCIGFf4kSmo!L`A04;TO(LjxoN{r zHvivqn!aD;zmWXxW6Q6_@4xTt4D|ke=9ggn!lkmOLT$Q(I5zU8uI1Pjn;8Akbz!Bh z-mUdqKaK_)7yIqfU2hij^3=>&e$STY3fE6<X{i(ryVZK|l&ONWjrzW$zOo&&w{BiM z?P%eWiU*gS4ktGp`~ROG)L}&QcQSunv=!lFV6coPxxbT<nwXMWgrmRnHs*ElZ8M?& z@AflYt~s%IQ_S-6om(!yblH{?U0zk8^6Sx;Zl;L~T4t>mT9CW+^8deOjQd<I%XFOg z?R@N$;;JIvecx_FgigVSwCd{z?;Vuhv{rlRvs0>z`MPhP&JDPIX=<>w*N*1`^KTVu zc)Sowm^SA~Pvq*3iQA7n{ygK@>Ti4%)_jXY&xm__^40%(dH3IK`8tan!5=lN?dn73 z*9Xt951;@3%5(b@HCJ8MdavK<yhepD;*Qeff^$ipc18IoZT7onJebhW^L`@Z=ZE)_ zocrf5S$=I2_oJeI!5`9r32XE^H2CV%w_WM^RpNT+K=edQ<<11Z)m~@$W#1M3k(4jn zF~M-Y`XoygP6uAm#FI(&v3D}HMYH6#M=C^g^ZYu#_u`i8+w^n~Jj-x>V=%$Sqhf=C zk&9c@u9u<RErl!Z8kx@gULva2!p^r{(?)T6$g22hUuI2|IOA$KZQI&k7h7h(>Yq>% z{daS&nCBtYLgDkjXPsLYc>B`Q6}gv{-|l^&S8_#l^UY3E>(`~b_MUu`V|Kfm(f(7z z+Q0j@yPr5Xn?E|4VP!7AjO*L!idJ*tx4ZD_IXqZVeoKC-h0UZ}V(a!Sk5zj!!+lcw z!R_C-ADLYwb}D}Hc8A~W)=D8A7oLekE1JjXon&`dV*V<v;(&6M$f`i+XpxNl2^pSq zqLgmUJDk&htZPAl$i|5gKRY^(-di=%T<nI4P^Ww9sZa;I&CvyBj6dJ~u>Pc;x&36k z{>eMsZ?%gyr!d;2RChA_?=E~H9JR3Q&)@G4QvPs6^t{hKBVBm=5bKo#Vp}zDO`Oj0 zXZq}iv$&>J@B7|V*_2x+R>9-MQn@fH@qy&s|Dn!$E8ixs%zaqJ*A{be>Lkto_b2S1 zdFyUlOxVHw*K)Vl{N_7-_u5yLUw1xQh%PY7lepgePh+O@i=|0g9G_zLd2IQYp_*+T zcv~y~_TjfbyB|*1bh*=Cq?wvkka^$0Iq>YI%)81favz?m&MJJlQI}6N{TBDU2PH{A z)>Pe^dH6~Dtxth-bw4hva-Z`5;jM|QA2RLv+kNG|kf5RTvf45;vn#$|_ooG<JeX*s zzsIqC)+>F!@LNAu*)87Awc>oizggwGCq|uIel?-7EP;*taFkVh+s`bXHjcxJJ!O_F zLbD7mPdSs`$kNAR^ZoPUs$H$CUEZEw8>Gz2VsLA&PnGTK%a!?M+jz4McQ;<Om;aJ> z_}rCOzRSKZ+BNak%LkW#-fWgw9rXKkVt(D!?YTkBvaCnlpNhYkb@a;NGaUhmcZyu| zzN}T)!^o;9$t}@g)MvG|Bp`k}^A9<0&qEGN=ZD<U5UP$ev*Repx?=OLIC6$Ef6S}) zPKEck?UO#A@SjsL<MdBu#?wUx+Sg_MPp(#)9=zz=&OrS*CHpBA7k0=qiQ6q^6etts z-`Ub}W$M2Bar<iS)+K2&{1afe)cj-V6(iI&&+B+Vm+ST9?KS6Y^`<I2W~{oB_hQwX zsTRKkKWNWm7hufv68j^yD08FGgREJ}PoK*bWxkVQa^Li}A&38GxcrmmOV{Rqt-qr4 zslvwU<@~hzbEnQ*9bGVW|3%N`NjGiQNJMb2pFeY2h#T{*Ud@10ftsJ&xNn9D7OYtE zwyCq(X7%+0S((cMce|d@*W047u$9^O|ADE$ysLk{zI?{+UGt|auX=XP^(;4gA@6H7 z*?;$e+3W`Pr7O=GEni}E*re=4;kF*fJ1PMexBckSkovV*Z_3wpsiVqEn9sfsv3Xp) z+Fs7LTybiNZ=yZ_l~rkiZr=sn5B}dJ@~OJ_LG~|e)_RL~aXeN2{C5AQP5iVYpxZ;$ z@yEi+D?|kOVzpK<th&>-FrBrZJ-o_*|Audxj-;-s1FPBLg<h$Pe;IJjOr5e{Y3HKP zuP2>;Z|ddudAHimEScmAA5Epi=1p^g15chSIrlsC0(ZjciB*i5-&i-AaD?R>N&1(q z`=-;UXtCKjBa(f-op6)hjEYz$!GB+u@*TURqt>!oUaKLm$>wz`Yr)DW(Kg2G-@f=1 zTz@wEko>N737_~FLloA2UEHN}fpu2f#JP1%nkO%4ESb$DJtO~3wSnvxj%DvJZ~3Qv zFYT?E0{7$zq8|hp_T7kb<4F`3TBdLJkp1B_6MN>RTJuYuC574jO?-Z(CAdv5ZOf^X zJ7&CW6{;wIxOS21Lp!YswP}{q?Rs6hTRK}NPU{SFbGc!1qn$0Gj9=;4CH@SleYvMC zm+lBrT{6R1M<M0%8t<k+;YBQSN;Nlj+B90|`ybfOTzqS{)|pkIhYk3D1)tvYSpN_2 zF}16O3%EY4PUJX$S>w}&cj~bdzu0tG9b|eCd^_NnU!2aBy1k4QckgSxJ25Ho#&Pj$ z3+#=gMVnrKcp;Ow-0$hWpcN0M8^^T@c(N^Pzws}>&6Z_R$>t|omnAjo->T1hBDkj^ z&HiaT!yQY%IMz;sR4(NY$2JBO$4hfH9_mYSm~63Z;=S!J;*Y(J>Tp-ili1;zzvR_( z9wu?)HSsAQlLgM)Sf{i?^L;{({hY|T%9l^_+3rj3>E7_PbD0VEiVxODME3eWja9BV zSS{&Osd4e_tZm8JMGKqz>aOd|(DC?F66d&X<#dCIR-W$|B;Tzw5!HFeD<*Kc$|OSN zg>7_%iHOy!>vLvox&8E0+Kk48U7ER);^k>_z2Z4;2~{0j{N)BWRZ8onlHQ6<{L;m` z>y$^Qx!;z~1%HkUa$l)8QeD7%^XQ~2+6v)I^fpevb93sI`SV3n4fZcuAi$Gk_G9+J zzrV7tg}x6HeRWrA##KvG?vl!999r|0U$=Sgv5)t3v-931p#QpTdDq*5s!4*g=Jl+p zJ;P`9LGMP7n3LVxoGm@Qp3|k|N;!3XPCs8!y~%s!g#{w=kB%`lZY??xvT?%1T?e*2 zFkD<5K4rzP5ZRT_`?4i&T)zM7`FXa;i7tT>%xjN|%e_tR&FJy4&a6GeCQ~ZD%0Y?o z^5(bq?d<Fo8dp|7USSn5+qQnEVb7!E|6ZinY$|)zJbU4v6U^+Ztq+{N*PDEiHOTdI z8+%@YmGs1EE|M<BbJsoyuG%}bDpP5T$x_FqJj_3~U0k&}XkAyNvgBoF|NBy9XMUYf zV=28g<HeT^2P*!o7D$_O{g{O736l=@$EW8ypU7LOd(y^-Y0mTm)1zAxmA?K_;}h=u z`J=aBmEDyCEJ|$)ZQjYupXvM3Br$Sb&LXpE*Hu3ME!mpRT&MXsl;P@WYsU*$v;rF+ zKfhFT;k41J@63}^yoDmSmUHR)#vj_`>=Qa~RoIN>Gn*y9FE<E0diIL&PZg<*70V`e z=jf{FzPRwgr+w~0g;GU}DTU#=Cqu1!FJGx~^Y+jw6R|t<EZBYi`ohH2EmtCIa|GRd zC$94jvktra_lW^VM1l4O<~#m7<ySi8@cwR}q{hgW)ooxhM^MXg&wSk@nH8t3=f4ZP zSTlD`O75|%o7?t#nqHmcllsG@>(&C@tn`_2wok90Ij!BdW#1cP@nw-R$?ej+R%L!= zD?O)C6Cs?t>a6*U7$!E;coR0iki>+_yJr6JnJ$8Ber0u6D5b9Bcr^R!&b*V>p|2lr zK6j+V;_J=0OA-oy%tG(YG6~kZBy-kz=?v!W+CO=%kGm~3TVlqaqA|_2Z)w=KWvf3P z)YuTU=t*8lliK3ulLn3-B>0bC^f{Pf;gb|?xoEZ8ZQZwB3Ux{<dE80cclex5Rm=|+ zN~k`iI#qmQaph~<b*m=H|K^faTHj<~{eY=H=xB}BL9N1$J&tt`+-B%ZoBeuW0N++s zqpaC+5iz&tB?cIOQZR{Lc=!9t16DKhqf2vcG=?x<FZn5?R+PT@+=YT;`!%=ZdsIDZ z`y$!7@66|U{!=>inggT#kAL%hzVP_-y%SG$|KDx=qTG7gP0k~Cm3A$YD{n~IDCGPl zimS5p%FJ(3Pqy5)KDl`2<<B2Q>So2sY&~JW{Mt!3PLq<IVe(1~Q!huZJ^fs_(dVSU zKEIW$_Vnh{E6%7g1g<^eJn7MGv6<ZZ858d(uF0IJEq3_3!7OWCriU*=y=BjB2(%N` z$a=Xc`tu}9d&6k6!tL9c^141G)?N;6T$HrCEAEMuzRota$MuqW)|p56Mc&Oy?ycG9 z%yqJHHUIi9q0JqqQl)G|W6Q2}&)OfBFRg!7E;4;@=KVJTw|X?Y3ssKjZV|dVv00q+ zx!ix}xij0E6?xV!d~UGh8cX)Ysa3tD3cl(`^*8c-`@1{6;nl8X*SbaZJ|6x4Uf@yB zmDFk({S!|gDhlcxtEpnXS1G<a<NmJq_a*iHUd-=vf1G&UXv5S`|EhQz?<?^*%|9r< zdyZ#&W8YTsw>1kkJ2!d?)oR7_6fHc+bhF}aL)F&xTcxtDE_j)G_wl<oOYAqyYmGj) zV7s$^$mif0UmtX9EuMBpx$g9yEfY4}?3_{^9Q|sm?1FTwp4UESmo-Tx_RjQ4x)7xx zQmiJm>f{7}*(0V2tE>aN_pH#+-MBKh^J{F9amTUWi|Y=Tg>FscnWrbX;mS&`ibrB! zKTWoJUAg*80o$Y2gm}X=9jAq#LgXXsd>AGyHOO|`<8^bDiR{DntXDmW8jo^<ZH^Yt z^RS71#MM8oq0QLof}f0@(6m&C5I<$XEbo`gHgjoRzs9GRacUZ`_2P3Y!#@4ViYbfo z|JQ%O!fo!s9E+VN;_6?_c74oWV;rwk{bBaf$^LRb()Qi@_`rO*``<065-(4RtNeWN zMa3oQLm@(OHrZlaGfL;=iDhfK?v|K)ScYBd{Wb1OlNgdN9*Wws@q4iP#F@VP+;_yh zUFfq{VXAHQg}m+cS5vMuO}Dz7*O#um{GW<Fr)4qwuRlA4U%!3xVv+p`e#R5lixf{N zoZlDnYohtQ+Q1jn{kCUT*x%*tE!%Q!+b64~>>m<tyqUQ9rqBJh`_+r}>d<?h>SDhN z>lhgr{xOr>^UTdpDa}d6(es=-`Ji93gFxH++OCfwxjvq~?#W3x*&bS^nzk=kx9{GZ zDk`yQcSL11d(P@ir6a<epU-YLw)ZxWI>4de*UOx1#L^x8*d~hI&UHrgksW%1MM0r$ zd@4^>lev5zu5>lpyz$Vr<ZoM61vvYPhVVU9jB?hy_i@s}X8Rb&Ej@{QXZfC&(EFjY zQ14(xf>V^pzNy<+x%tmFpK`C!XxjXgYzzGp&y-GQRqXv3QuNR);S}p(?i(D(--c{( zG@oMrW$mSDpW^@2&E0tA_QS$Y%XxOr6&B!%6ZI5txu~@-TIX2##m@pRg%!2?<Bpy_ z{vp+@WlGrr$2ZBDrpM2e9a|pqGnwaibJM{DIdvI_PdnzU6W?4MSb6D~`h90rBjIzg za}4gOpPI$LrGAR~+|-q&{<}?9P1e}@)+{Ez^ji5J$F6s>UN>!1Ub=j}DH-&VYvSV9 zi9!2z)wqc-sZDbIEbb%J-RkuFy3e}ERmYzcDb4@ZQMbcq)&C9hwjbQ)F0<lrGl)Jn zyZZ+#>gdAP%GNhi<QN#TmXI9B`2{7J`FS|v_=#<H@ol$B_y20AX@^gIvuMTE$DdO_ z-_Y_}lyWa<O4pJk_4oyf7AoniOc6W^o%?qGue)n&e1M_m1*_FF*~uD0oMu&3yQ+Wn z9yb5FmoHv+Ut;NAo-LkIM_2Y7dbWly!*p*^M!1&>yBEtL|DPHHXZjCy&Pn5RpK^1~ zZ_gz+_I0)Dt6#eQ-Ys!M#oaq*dB+3ycswbYwrP9)@7wLo<@JAG-)3u`|Ng~u{x6?x z|Nbfe^|P_=AG@?}n4|T>?L}wWB89q^9Q<|BLq+qqO7l#PXS~M_8~#@LV0=xq_(#sI zI~~z`wPnvONfPF~(*FOrj6k=V&Rov2SsaEjN1Bd$e(}Gd*!yCReg^jqj}1PZg^PJ| z<$4oWf5_cap%XgmMBub8!_$Whbp#lfE6rS8TCVBHy+q$hRcg&`%e?PwZ=ZemERa#W z#lg=rb;ikpQ<pddGhamOOX+yc`MvAHrJAMP8p%d7%HE7t#`7*&8`o(^DE*irVElbq z>6%5-Yu%UrF#P-cx02sXpPMS&O-E<R#_Z-c-OCX*SL)@})$gCMgjprdE4SLSL#9lx z>Yn@g>aVhU)SUxsrPuTSRgmWXc3P#@{8WlT-noB#@8|RFUHmPQT`zmP->tvl>m^q6 zUv+K@lNStk+AX!^H+ys0_F9`9+0xr@ek>}#Wx4y+_JXf(_LSb)FJU8h>vVzk5;4`r z(*c5)4=wwk;}NbI<R-25k@trhM<;WyaZ<{>9?7>iCKa$1P5HpGv&ur4lf$*Ch<W}d z>wN(lO?)O3+}y7{Fy_6?@uM;H`5Un(?Hdfsjm>{%&Mrx2e^V|{I=|g5-eN}6yLpVF zQVsd5?zhz+)?l6c!2R=121AMFTN;m_6|0KuR$jG0XlJ)kM7BcyoT=K3-cJu+YFfR+ z(3{E3bCKmct{3JGKCY3E4nOm9Q0bj?_EhTYlI}(;84I1b7o|^*yLYg7oS9Xe5@@KN z#JOF<Zd$<?{SVdG|Cg0qeK}9YuVHb}gYC{|_qVrx-E`f+#BBPzsS7>N{!^UK?b0Q_ z{rW4}??J1V8h&<Tx)EQI%BSyWET!}8Wl!&B7JtbH4H0ZA{{0u<Mql=Dc0X18<owUx z1GWJrB7fEAzqa3^z_nR<^#ak9UCX+!Jk-xx7-abWw_I2A&WY1HT5r}LoZ6E6*)eQc z>Mp^Rfm;RSUCI|ut^7LWae?)nZZ=uL=8CJfvjhB!+0NX*cllc1H9@1b50)`);cevl z5c}W>bFqX{&DxxYTP`1OUe15K@%zLxs*ANwUuZfZp%gZS=ls)Z_9xb?o4Ts)`k61@ z*m9}rWt)EWrS(xlzf<>Za9TBC8o#slnP%0*`HgQ?CzU2_+k44cl10U6nxvQaZRWKM zO$U#sE^WWFu6z&ES<77cvwvO}u73E`;kE05T$_Nv#NUe&v@O|rr!$1FPkC8-foq?| zev6&2w#9~>x4eBKmZ8nEXqzR2;~t}skWksCXRHw_ni4M(ybo_bB+Yx?P*}phH;C;= zk=~a0fP=c>2`gVeU6Wwj%emp+rL^2kaXU^kW?81yr`K{Xm^HP^K|E*UPLK4968!rF zbUDP_y*ximp6z|%)seM!vumWy>fT<6^V=r0#rRs9?T_{6qt<ZGpLZxf_ec7Py7cKE z>W|$!SbzKt(>kkE*&YA7*2x}v|Kpxm;p*vmrjEB6?LTN;VVWiNl{u<VrRhcA$xgGM zmUSYA@0NcOyE^xj8~esR;*2NE+&BYP6=(e3Q+fG`?=@RHO}k|)jut9ZG=001y`|GL zdFq~xhd6If3tQCOXtLqj^rq#JPFk1y9T*$=*cM-?GJY;}xcH)qtF`2c#j7q{Xb3X? z)PA8`s&kIh6St2B<_6c-7q9-e+3tFp%w8L{=Y|W8FWT@%e2bnnuk42=|CEg<giQPw z#kT1<@im2Sy}l)>y?N99cXPM=t_av>o5B$CmWSW+&mE`3uR9F)Y)%k7|3Jm%bP88H z!;jAyk2g>Bd2VwqcDDQrh7caU_nJp<JTN%F@L|>>7r#`F>Sa&FKW^?5IdPJu%!FnC zB%b*bZ&n=qE9ouFSrM$VVN*~-?xP&nl-K{OzP-L^d}g-pJIz1VeNILD8rLW+`RVto zQAMxSf09m0WW*7zgI%9JJt8~viuaW1gvxwi-QZ!w&gCb(&w|5&g(=}dh};K<B9pRZ zJ3>z{i+iih8u6N^D8Hbz<mS&i@1)FLe>ry}FXKk>71m=jyhW;dw+qFv@VW5wN9}cN zudS$O@Hv0X<|&V^`PnrYTW48pVdgCf+4pioqn4ONUEj>EXHD-WWf~s6`%B{PLMvl7 zCC{e$93hV^k3ZhdpuA!Cvr`;8iCMX(+5JskhgTTC5I7{UW3|DRZAU(?NZ}}Sh;&VC z{@^Ii#&SKtr)}j7r9jPTtvWobcq*hm>)zU;lgV{nn#aG-_WTRCDQZb(C62ia8Ot)$ z7S5QQ6?o9s+M&&D_1vWQUl!Hh`DV5EVf%NU#nz`+rBs*9cGuFaIG4(B>02B3oDKYQ zK6C1wFlaoSUr`ad<KauMLTl~45)Wto6K?H&lhn<TGu8dVd#Ub_AJ00rIiAwWd*Tu6 zAN1C4VX=-%%<LV0(i_u+QZLVxejUU5_Lke~qjJG^GPWgLt9AMovj{SNo!!(nZ++R4 z?B%!1C7)WG6}{HexcW|hK3~CU;e`SAm*z<>vTL;7F4}U!w1gwwr0uRDpF!t=N!K=d zUwS`fqBQ5?qO(r#8m^jni(Xjw_IdS+RS$dSnMdaFFId9td~1fw8R1qb&6tSh&!2v5 zX_?*J*neyOyNc7olBr#_b-%Zr(4Q5|vUGJ0lhp+yAAv6}RVEfUgWvq}7U?cHuQ17L z(o~%-Kg1UbC3pBWxpHo=RZWl<{%`Q3sNBMHd3?&9FY)%icXP7+{c}!eY+tJ_H;JR0 z`SGm^@#?dt7qSlJuH9N<${_ux-+#Blsq_t}^`}3T6--Tenclr|Uozubr6cnNuglx7 z5sMVM@>;*3>Ah&;uS;I?x*K;+d6aZ2>DO7#`wlY_474xiuDxjXqt+m2esz6`wYwGH zratEV>ok<@b}O8&FL|o*U9#k@u+e?vg;%?!iytd};Ep_`Qjqd#-O}ot{u&EPgWk5R zj&Xm$x#DPIzX;=wSF@}QkL4@>v0~l1Tx&-n6Wf8AMh3c{^-N`B87=%bHJtHiT3X_E zueD6{RJBP^y|w&|D@GBAtWGpB@i|m99ChG6mT$R(A@5G@?cEnHPU=>aaOipyxMc0O z_gtHvN^19bC+?a$>67;bo|OR`X9h8)PL7NcWNLA;y}g2Cs{Wc4fhRt{uqx+S;&e7^ zPAii+&%eE#i@)#+f3NU4_&;c30?#UzT&Aum--Ls|pL(|-QEEwJD({ug&wMVdstJ8| zuX%UXEcFkwG`wG)wyKx+WBS<<^5xo>Vwb>x$FUY!vnu>Odya^ntU9|b$4|Ax?d{Yu zNA+8^6B9oA@4V-J`t9MegJ#LWv-^ARc6iM#**&fDuE7Ctm?h6YHE~6Zj0IZ<<JY#n z7|Flo5iZxAc-lX5nQ(D76x{1L8arjeXM4{JExTVB+j;svO;b9M!BNV<x5Z0uPw1Uv zhxjWF?LYbE`v<*EQ;$l#JF!MqOS`c?xa6sOa+lIGqlmU;Kb?EJPw6@fe--X>`2G2* zYrV%Qga4<kGv}LyKMs5E6<K(`c5|s*?%mhV9aoE+r=823%dJ&$^5I-Iqs=keg}0Ba zb+P_q>gjOTZeD@*f>NiMRnzuzWQ2d_i8-qKd(Xe0h8N<#{o?x5X7f*H-f!a{XT@IG z9LS6BzHjn&-ihM#&$hce{$8KHuF%xv*sQb5&K_$hJGwuP>FgY@SxNVfp7j!}QrYsq z@=&>abF}S+PnV)6OPqeKtu4r7G5K`+Ij;;=zst{-3u|Rqy<@jxox-lWTY+1A)>*mc zQkF2L^OrK_J!d#GJz(9st$*LYYEe2B<Z#(CdUAGc(%HA$$`@uG<W^my`Y}U#pGe}& z{a4!VZ)45pJ5aq^^^DxT^?Rq3h{x9LS9aT{w{b^LNLG-)ZHY^%#N}x$HgZvWcLcg7 z#~qpxz3hF7Bj3%>emq})6*=s9KXa4UYaj6oUw-eBkbAv-vgXW>2P(E7Xx<UE?zKdT zqU|$_2ey()x<`%j!WXK1tv%iB6Tmn*@W`CG#q#@?rn$y<GM5XfnyE&dnk3>asWvn2 zRVj}&b5&C6m#3@W9tyRH6OWP2p6g(EEs6Ql*^Rb>dRz8fJDIoQuEv@b3mJ-9yaYV; z)r8l~`~PzF+Aj@{9$Ef8-g(5ueq}}Vw;K_YFMV}9x^LAnqr5h+s*{tLYSnTZkFE)O z^5VAH{W<q*ByU~bk@(r`b%pLl-ivk7i)QK8NWb*c*vgUEyYf%dQQfeHum^32Iz{6o z4jMhQj!j@W!+5-Zsi<1yHH#a!O<dpk_|9LccGBz7##LW?79Fpg*;0My_B@Snxspq1 zGMu9CmTue6t7rP;sMpEM!Ol;giG}SlJ6lj`D8bkFd+zCl*R$ttXWw10Pj_z4f!1js z>zvQ7E$Xac*-}+_yJVl@_9d_Rw>ur3=5+Z0-`dI+Ubc|Frog!?vn=+q?G)xnF?b&L z^Fr~$i#x-up3M<yHc&L4t9USn*&uUDz~tgBdxG3Q&9zBnyys<8`tRZK1CQHNTZ4?` zN>h2KHTi9IQu$K)`crAPOyi}C%Y4HZox77iw^Tcnss2-DXGhq_7{=U}8nKzraxU#v zt=;U&Zy)s1>SXuVSKlQ|RzKeAS-sUyukY5q$nW1z_s4BFmU!3nO-kZwi<+{;)LD<t zw}t8F@h`nIwb^=u$XDKsKaCR$3`H{{9<e>YXXlWVyk|qB!@(8TCT9G~R&nmRHN!YC z`b{zSDweZ#Z%tQ8>nuKMowshu@2ryI+dK}@bK}1FeJg5l+<s}Jz3@NYrIYsy<z+v8 zwx{$BW7pxi7VpkKa9EzkeAjweNqkp-sg^}lN>AtQIhPJ_nQJf2jF!HCO;zKOo$n6i z^I<_@g<7}8&t9^b!gMS0{i_Yyhu{3`e44+yaP{L*hu70HYs@GA(|NCbef6@avb!%O z60>>PTuSBJI~~O@tmvJz$Vo~-LZ)+(qxy{wfuldJTR3eL{B9WfK1oF1#4v15z=eo~ zQapJN7O5Y*wCMHXlPtBn?+DDCxh&i-)K6+dbgaX)X*)UN&i^%e?D$hJ!(e7=Qrg6- zIljzZQBj(Azn)vg7Nc%_^;C%L1;d%ecc*!~N^M)ZVq=mxSHIH4TVLibs###a==4-$ zg=KN;)zbTf7e+KLyL+W_S<vm04{JjzcWZ_2PUQ`rm)I)*ZT+UVw?e%qYdE}q752&N z>-8$zj1~V6JbE2|p{S|wI`6N_wOsbQv-sKO-kW*d&OU4YoGt!){=IblFTZ}Duwu?n zy%%4_jvk%+jnC`Dk50aS>>sMNCUJgmeYfkFq}ze-KiXFA*KyozS1KWSoxOD8yiX0g zEEaUKpAece>$2OO{U?RfPTT6{o$R|^VO+H7^)3hDnv0F!T$$zkjP1@=KjzA)czAQo z4x!n?lPm-^Er0tjjn3U&uw&u-RhO;bZ9ji|Z{q6R%7OV`W^51_*!nS}(YN*3!;7*j zb@~=L<lpn~KO11j&wrxDG;Z_j{-jElt+y3Ldid`(wpDJ*yK~Jeb>ZgaSFR*msoekn zm?JFDw@gHPdZqBX2VN=@xqW{(+rM^x@Av42;U6PD*Wg_d{QG{nHmEn0UC&i1d>5$^ zz`FQu+(F*dWBOB#t)Be<?6%CJChu3MzP{eBdka3h&)&FQzV64z+H&y<nG5#$wcDIE z<G9ww-6=Vfbng9Ao7tNU4zH{~!Ca=$cKhy(j+HKPTc&cSX^2E;zPPcc&g9Te>jTdA zdo~}Q=(FIh|Hl<x(jO1+j!l>^Y<Oy!Px-HXGEsYXSW4&3IKn%*m$TSslWK;*47V$N ze;NMgO<Bmf#^mDHf=&b0+`P~CzN##JZ)JL0YSBJtR`XhBJGtOc-W^QEA@#uv^B4FW zG@q+wW-XDb*(YjT+<$7vU2gm8EY1T_yRLqW;$oPabno|zS7%;ttIsaqTeiRcqW-e| zp;ay2z8Q90w>I3j$`ik^B6jnh&GD&ApTtTv>Q&`+adC7lf1PP#aY0wGkzx9TrY(>3 zZy$U6KREW7SK950&Swkm8u*+)Dzp6J#7}eW_WeuZ-BMM!x@1>k_{>Y^cwZ#ETIiRt z?PSdQMwYv09xpJI4b8CY*OXyfv}E?W!o6KyyVkfZTPMoQ&+^L6U2{>+7MZyc%}18* zYCR-)^vX3e>&23%lf$;KMz^Lt+ZH1EYENz5#s9Uw>;GN9)mrpphga_HZ6Rl7HF8hZ zIdWmv+dKMK*FTIl`Q^~E-Kf*)%L?19?@RCQw3FSZy|(WB%d$nscJ8k+J^QVGclwf3 zsn&}&mc-rUc;mhBYIn4t!P)3v7kuxUKg>94lc0b8D_`7e3BA5$%#nvKIA~t8b_{j* zzPfaGaHV#L=3cp30;c<x>mS*)?8NuYDhn0XYFC=<<_`@lNq?U<N3`Gy^K-ZO^O=Sh z*pz&~di2k!D6VThDr6#3<Fv87+U;nhkoygr9-}J;MUfM2VvUWPO7DuSRsAf{lCQ!% zbCP4K>g6vxCCvqtg>#;2etCEMboCtfsuqsvjhps)?o8>F+LHM|DJQ?!E%nrmgqBB_ z=j1MRzV+h#)VHf|X<tnfN&B&FK|xmgx1w2Vn#>ZGuQ}fK;Wp>%&3wOmmq~2$J<Mh9 zu$p~))ypv9EwUC<dbBOq6xGc8Z}E!feDw6@S3M0ynloCbrT2ZkW9b!;v?V-TM<YG& z<%2EeTig%YJv-fWR4A{q@%i^RN@9w<Hh<WJGOuw}PDtCm=l@l%W3T>MFI~lFa!P&S zJh4Qx<%%t?g;SyvW?cXHDQWW8X117&vdg(vKU1~WK2KdJx{h@xtKZouyR3>(!$%tW zO}baN2btA~+_hUYC1iH&^(>)fmLXb6(SElq8%;MI%&|=V_e4k_JNT7nb>=+P23Pjm zE2gPt{LWKcp3L`ZqL$^(0xr&Lbw5@{o8PO6Z48sn%TBEl*RH&N(&W{hNhaz&#|ss5 zPjY;%*6*EbUdp&5d`hBg*&?QhvnDD>IDRI$Jl6Fslsc+BhpU#GcgdZutt*e0Bs}%k z*r>dvB)M}H&k_9vy{uYOCZ5Q?BmL``u-$QWeuWooXLl`7H!;oOt!(bRl7H#SM4>Gn z8p?;<8V<Eaf9x(+TDI9fUB{)njBzU4+&ONIw*;5@vDoEnoBzG|%~M4+<ND8-&z`GP zv$uWMoxg_l`Mah+Pjl*P&OJUZayGvuOh2!ub_@Rk$K~87YbT^FG&olwSz4@<(HUmE z?zg%3g-;K=^}ToLy#Heu5n$o*agXVjf4>eqe=qmr&tK;G^%W03%gg`x^VXST-(5eY z&1D(->6^8-DDG$sU%K*}{|CwK9npJBR&(CkzW&y=nPTqy`EMV$SiR@6^tRvA|C;?- zvy11NL75MC*OQ64uSD{7zkYwp8?&@xU*(PnM&EOR!Vk}WnNevWCt9Yfs<hz6K2O!z zn|9opw=$$Bw>{5Yb+>$StJUmBJ%VL-*cN#N@}zKooyIS5xirZ=;;f3@>w>$^iq{{8 zz4wwo;c8;0t~_m_<lbM4rW`RV7VH;pz01Kivyks~SlQLxIlQ+wtP*~&th4U2b#}tk ziIN<tzm2(r>x0A|U)_|~TfKd<v3%IW2hV!mUwOnE-<8y|e17V&=FBM#G6AQ(EI)2f zTH12s@N4Z&iuq4Wj;#7(9=3Ytg?Wd#>|eWV&}%!+8MP|#;8~v&bwc%`2PePslHcs5 z^L(k?4vyd}vogAD<o@nh@^)HGSh`12yUHo64Px7PtzGlat+-KZ{N!q5+x<+<&hyI` zX-uwK8>t}p|5VDRuKy*js<tzEqm{jwr+7Yoc0TKX<%f`MUeV6El4$}qHKlVBKbD9c zi#XZz++Qg~?13oX{?uEoZL4*@haGXS-?_3vF08IvcDm-pvt3i(@t-`@p!NOmp9F0- z<|XA5S038_Sg+W-Hu_im_8sfvSL`@GquIxMWqGizPpypTotXFEN?ycn`?a<>|Atlc z(UXS$4f!jJru&CKNZa(oBJ#G|BE~10-{%X&-;ulfsb=oFPXVo5#vX@uPG=}S8n{Aw z+Z^5aV{fJA8y0R(pV6{wvDBMiGTlz8+rCTnUzsi7{qZM954&)$qM-1@DPBx58I?J0 zn<f2^v1@oHSNTNi&9u^JJQdN+S<(A%jmFu+g-?Gk`NHy~=ESwqSyeZB9z0yJcJChc zjL&*8j~Skdv@|(MWlHt_TRH3BJ>f~Lw{Hd)ZM9r=$-*FPE?24yckY=d{J(D=xpa2z z$J?jVN<$Z3%$a{W=1-Sw-JuC<xlDLOs@A5glHgo({NeR<r|O^C)fbAqOas&Z{t|Fr zv*5tDg3~YW&0(p@S{24|wEJ`!{|A}6BO7FX=RenVsQvJn`ND_Bog%@m8J}C*e;wYO zpLgT&)e8rlK6G?(E!bOY)4k?!ufofzb^j~u?%mUS@o8Fo@yr8@6ZUJI{%v=BZzKO| z@$VnRN-IQ-m0~meXD`|=xqZ6t!PQQyA8*y{*`wpL`@z(;-8(J5?Kl5%MN+Q5WU<aw zPEWC0Uiv=Qmu-qPYZd1D_aRd*+{-SaxpBJf=Dh*C&adB)eYR!k!n$oDGxvU}(cW^W z@Ra<uHv!F4?EY<ujgR>9bm}LTH>_J~Ho4f;#~c$A-uJCBEM>ZD;>QIBGBav8)-kl@ ztPslWW0pAaCht#v_4R9)w+Xe}|E>LpZEC|6+g!O{&#abQIL6s^_F`qR`9U?YKG{my zj9;&<H*YqVW(u4gvbCzh;e^HHz3*f8{XF*Vk3_XYv>kuhSv$)Jb)#!4++XMBG;aI5 zZ|>)cwWXEMe@uRmWz^QJFpsDGVWmj>K65MiE!+LQqb|Qz(=l1}!LfhQb|%sH9nmTq zckB_L(G`6vNZmKHjUj&N)bt~lVvBAt-Co6#_xfesao-ZRH+L08j^55YXb_m=vP&p^ zQ^NPiNI}Dd-Nw^QcE{gPo^<Z!u^Z;ntjhB{SuX9F=r_xJfl$H5s~z*F`aRl}#JZeA zbYn;3#m{Fg#l)1IbPjeLXfhDZy=*g)XR4Q!qW8k-n=F^9x^}8fY+G>Q*n>m!=A~}^ z_wRVI*0TOBs$roy%F5YgtWH{DCm;0eh&{Y)dCe=M{h40MyM2X4bVZK8njd&5Gw}Lq z{=ITyyBZgF&o@lTuxb{3VHo$t<gN>Usc_=7gI#{-#l9NVyGeaiQPgO3alL5b$sG1& z*}>U$=i@ho{^vAof3@;U!uzV4lAkVrzQq4o&+h*F>(m66Jl8xCS<mQMzA;Pq5AeLS z4tXMBKmUxl>&)rfrJq~uO)r>vx9fiK$J>+C_U!mDVG7s3TWPyRuFg)mS!og5xyae5 zlC?l8QS?^YZKlGBpXO_%e7~~e?eph5rMFo!$HsZfvmegoJ`rc2n>j;o!G*=~fh|kk zhh%z+9q|w|ownf8;V_RIa?d1r{$HE1Z}H-v>pt7F{b9|Ny>Viq_N901)9s#x#=44Y zZFjrCw?Ssge9^WwLF^_Ar2Hx#u1amvJXvsDT6vvQtQYIYmp#u)r*2UFS(Pmwnyyv! z+|oN>`ovodOZFS@?2nqobMFt=o)eZ&Hh#!>G3UGNtWO_)JvQlatd?xG5_k8nY0hU# zms@%K+UDR3YhR}wQ`p6_<J3v>YZu=Iw7A{=cJ1;tm78-*@6@#~JGuYEvc#6uTNjU8 zeLdD3kQ=x}Y3i5Pd(uAdR@U3p`aE*4;O*1X(sE6=zvpN_>z}jExwT37c>ID+)vInj z!LB!dF2Ag>^W=hy$NyQB#BBfnPX1#02BwMAbXUf6-!Lk_x9`2YLdc~kr!*xeW8oiH zV<UXbI9~?exve`lH?)yAJjXTQM(eo*$J({A)AaiNWab*)S|QV*$-cwwY3T#r=4B>a zuY@NWX*AtG&~e~;FxMF=3-&F7&*m7hFH-A#f2P2A4foX9N{c_Ai&fIv#QnNO^z+<3 z-Rzsy?@rUQoOi@Pq5iMXq3v6Am!B~&6w}zeaAok8C7Dwm#8vH@KmWP9EeBuLySK5o z*7LhZ&tg||VmZb*i+hH@)PeiV6=p&n55;pjnYZQcf4ogSQ`SPh=B4fNM}C=Mv;UYF z$p1MXuVV08b^e)yd4>5mzCEe^cj;r`UY!Fnw=-kv@2`mKJ1DoP(DcCd@E;40u`cQi zj@o`KcG8-TH;uU}hxd8eC@U^_zfRLl!`NUZ%fxkBJ?;%0-9H|z)f7EbTEQO5JL%{g zlgffqlKK-xj-Q%$X-m&4J%bfO7jCGE7fv|K#XY_A(ghWE(Qd8TYgbNMS>g8I;mLxs zoRw0SQ&YR<7z8B9OU+k5Ab&>l(Q<<p$4M=R_+%rLzAoldI+L=YOD};bJe|W)C1laj z`_0Q7D<_{Y6cOdU@K{T+B8HE3<C8f>W&OR*FCG~E)=Ru*aE{+|UhwyMica%;*hCCv zsuyoC{2y5Sh}V{H4P$5Z)`n&S9|@Pe<`Z)!DHXmu)uMPggssPip)c5LZJzE%ruQw& zuf`s}KJm}Pm(wTNc$e~*IZD6Ln6{&BW7sVTyXtqm4_<2jlrayL;aC2tDqiSQ%_DdC z_K)vq>+1J-IGQhHV_=ApBYEb#xFjVfGYQAc_tl78|2u91|IV$C;9R-qMbVNazDrlE zI&ymA9G3-6i%)J(J})=ld}I0CyQUBR{W^E%*Sj2c4uN3K?jLG$zi(E~zj^oOyZ5&u zZ{HNFjWvyWG`HW_RC-zMg0CgI7r*(PJH9@KaiUj<N`Q}cuIiFLS1uzqZKcJ+ruu8Y zoXVKEg6GJyM}I%8X-q2#%jNw&Y3=mYZq^2_saI{jCVl_<`Yz+$`yc+A@B4r5`}Ugu z&SzH1FOWT@E!ypwX?mm4!q|92Tuo3USEOCS>sqEqoyjLAn(sfXa(>ZEl~BDOob}wD zO*377h#Z;7IwOR&<IpU9fu9N)dfH{PXEbWa9%(j<%1ioUV!Ld5^3y$`n=d)*c=<kb zJRq0z?p@T<)@ds_wlp_d$jSHkopV2Y@;T?NwEc?=K6_2~I^Sxpaza5TmbYbNZ|Ure zx|Nx!UJFZn1Unxsx%7E*NL=FviDNnud(B=K&b}KV|Ge|;|3w^J`cuR`XQp0lZvG`% zb1S_zI$C&<{SjHW*Z$#d*{lYwDy~QF%-SSibo$7yOMzj>9=tHLoaQydBI24}*?+EF z$^Kh6WcIH&P}(>3RFm`cK3gX%<s^?OZbxF=t{H4#)h$l=vn)qO{?aiC5vxV7o*&tI z$l}V|8|BNk2qpv^FNl6%(|@;**KHTiwB3H8Q}nLR^6OW7KKbzDkN>_LF6o*%Pl8*q zwudd~dQ9V1tv1nFpX{TL&))R4_-e*q*Y~$>?ea2sKe?~-+O_7FyZT@L6{vmW|K`<? zO9p?lbAOgSTHd-nV(TQ$wg;2m7{C0r`Fa1sDc=l^OU+*yQ~5nOpnuw{q#C1{b$5QB z+4|$rk1tPZf6Q-9^_;NO+_FzWFugS8)1ohm$#Z{g7d&}mhF;)Q-nLz5dgkRX$hz^w zb{X3>u3tjM&!&c3roP@O*m-2#xtE2xZ^E}X9oq9yDkSBSa&N4D$+UpVpqB>Q8L}BI zUQKYjKgsEQ!fN5oFRIk8DDL<uR<t0>oh{p|TmL9q_QK`=YK}_YZ;9G*Cs}lLyn2h~ zof9Y0uZH~jHSO$=wD2<;YU?-?h1)D1T1<8pK9#c3V#B6G(}Ns(9x!itIeYt`x7QqE z4m-_=satw3rn6FWt&3t*KvA04`B|>VqNKFa8qUThPE~y`=UcXuYjd`cjLMzwW%X>E z`)}T`2y~frZ0hMF?U9u;@)lTVbhWZ1Pj%YLXL#v@)bq6pIm}w@&!5au;yha*In${7 zE1REOm+xP$vq$A_E{N=S<0G5impE^=&#i}>HGh13e|huCdnaAy%<*%3U$888$Le+E zM!_p~J>GKQty5#(l@)G$x2`8&iw#;So3rsnNS^=ftd36ivo~F=Ilo<)dqiYG=ai4< z3M}sI@^@?(mCW*Avul(0$qpGoiyKXSDG$BQFz@i!n)6$H=cZf2EBBm;P?elu_#kg% z==Vbz1)^b%H4?ct8zz2xe{i0a-{#k?aTi`yxlew1uzm05m;Wl7y!B70RR^B_xay?Z z_oSoycJ%Jm`M28c!zQb&DM`NF1=EjsI$BHm#Odr8OtYQX-%zzH#P;SYTgHiMcR4lM zZM<~#WIFV;^|Qj_N+MlDH+QW%e5%kcRZLKJ9<#ii^P-bZFO}|bvMf5CWXW_fb)!t< ziw#B>8e3i3mr8C_+xJ*7#kZtlT5qVZtlYoWryt&@w*Gnb=&eUr<NUjVulU=m)_^QC z{-S+(ZJqn$$Aas<T`sqJPLXt<?4uB+^Qs_6UMWh(ZleO9pl%=Yk5e*AQ8N5DUUWFS zXm@d)3GCNhtrnLhv5@K5FZq@W&I{$#L;bhCY7v~zv0eMQc~Bt7zf8jiZh?xc>nnCF z6W)E)tz*9WwI_?N%*p&Ak@w<97yGn2|Jr}%%adKrOGJEwA3j>}vopYd!YcLXt#@81 zg|Ufqx^%l2>vKD}bWhgbcWVECE^n8FYe%}jm}D)BX=(M&GI(0c&Z~d)@+E1l<6kb< z%sDBU>29xoIk12^@Z?U9=U=Bytx>x2c<HN?VQZ~;{&~lhyf(0#b?(%Lv(cAUaJ{Q} z7;7QkwPabXL7uMa`!g>&40Bu}Z~R`rG*s*XheX(M-qp@7c5Pz)O-j=nz6QNKR_K4a zWvzor)xTEtgq~v#+fQ-LP7OYDWLm_9+q1WBxgGsz`q`V)Zmhaq{&3EmDC7B`b#C*@ z-%w#YeaY1D=Z4CQTVEVeXp6L*|2b~O7S?m_c?vI77~Y?J^`p+nR_1N|p80b9|0HGo z-P6;Tr<ZVDs<gAbZ7uOJ@amxn+)HQMhTqx{9U09o`&g;tzNJ+9!;c?dJely~KLhFl zumvoC7d|RxU{J7RX3$|k9A)ALJC6i*mI(a(4;TYS{r4s|H(2T9rho6&uc-dkysL4C zm347i*|R(zB`xbc5)Ia`JEa?agFWWw?)qI8+Wltd^ZoPBta%mgz{=&GoR`05F|SQZ zSnAX0)KvL@8Skv_SpJzfbC=02jVCeZnBwGSI~bR!W~4jB@~=oveqL7d;FI;cO{Y@l zM&6rn^IyuNYMxH<9DkNOWo~`Bp6q$Q=2_p?&!4<)mHZhe1+Ptu`Q`7)%KZOwIk5BK z`Q%?e+v@)L*x$c&zWmGQ_c;d9EoE7EEuF7*JN37#Ui-*yGv&?d$9+4kH3hfFTkbn1 zRl~IY?lk!&XLXkE-Kc!yM4@GKJu^4QXLp~zN-Imp7yl>U4idE5m}c@P=Rl;&j}24Y zXa8`Xp|+<tU(U*@?VQ4-niER-96U-Jo;-BX`8`c$*6SO0g!deg`kJ-&>e{K*^<NTl z{L&O;=auX^@iA}amx&W5{dyJI`7`lZ_2vwthb7P4&wOmt@N+nKV^T?a&fP+>qHK?r zm+#f=#CoMaDy!`C`G4DtU!_<@+I5|Ev{AEn`oRmX8EU4N&Yj~w$6+D6adX`NHNmUD zuG7!{+dWslLgJ9a|F>x>{p=GT^PPSiE8+0)t=9yecLzV*$}?%HoL~4ezTW#@{mUY5 z_N#NFj2l0*F{QTeI}mwA{$vL04DJb%bBqH0470vpQz`hV|5El?U5EW2P1P6ITk}tR zY<$mPDZx0uXQuQ{XD4Ix<t^8k7w+NIWjviOzBTzl^_|H%60CZhn-UJq|4<RjyYp?7 z;!1BuW$X57hCIp=ib7AAPqX^W5=}pHDUs=H!)LCb2Ng9DaSpQs{m!0s(%Sp?%#!cF zt?f19y0(A(%l#xnUEAhr+3PiRa{r4bR<FJGa*OrdL%uG@tF5g+9QS;?=iaOMD_YC9 zo;#O4VV8ewz$pcn{Zfw2+)K3IM6Y|D9lcL-R-^XAEzdos=O0V&+ot_s%3cpYZRQRA z({#;~%$#qx+NW-Ny})V{)6zbV_Z=JMcOI_bF`8AI;mKX%Cvnq=%W-FZ@8w{<Hy1d~ zCO_cG<z$~GaFL}%uaaL=opZf&32UIBy9(<AMV1eOJLbA>e(?99?t==U`p0kd<$isT zv!B#+f3kDqDapiyZAzz?Ha1`U_3Fe&nOwU)`YFNoGF?JeN)O()$lT2^C}ddmN2M%T zxN~<7|AhBzE^Pd8`e2qtk$v~GiiFGq;!WXsYQK~{e6%j~|FY1(XO-jlcb2QMb;;>C zyF}4zsik49_p9H`irpmjXRqF^sx32R&5JYcFYc6U=)PBOQ()pg?X0=0aY61`m-z_> zLG_(;W|>{wo3p0YCz$7z3{RQS`TK5jXPaM~azP-=)8S0h17@Qub677j%$c0DjZ-Ja z%IK+X(Jem3Ii?zW1^i9sIA*kNK5qBLWy|JL@q<oV)_tDtxTUyUtY`N+{oVzk$HQ)H zVRGJb)#kQ*l3rG^3G?+obINw)GM%-_otm|_{@RK;-*;d2T3mE##Y{)*)&B#n-<H4r zzryyxu{9mvw$|O+ZO~A5@!ggG7xTVq^@<*tw&-u%>o2daUfm!!qjhswzUh+o3;V8E zt*v@}M<D9+s*9`R&9eTcExo<Ebe_e=(-+Q3U!N}iH*9I9i&IuTgX>za#rNNqW=(z8 zmXUs7fzkz*T=B1B0^6Aa1kWA_-N3!~b(`9|C3h`M+r!#jL)WkCPkS(HdqZ2vdbii+ zJ9%WIb2`!<L?z9=o>I<ui*1eAF<mKv2UaDb7kFYSZ~4hsZfyD*yEOMw*ms$m{x*+& zFZ$K?OFJ1CJk8Ah_|k3PdnLc??X#D!J*i%25zTMhe~oWPdY_ro>Xz-<D;HaC@z&m= zCbK9|IYU%axB8C#;lFXo8L^T@*_$M1HLhN8f5(!Fv{+rE{<4>Mil;van}5?Ls{Mcd zk=B^#gQA(mitEf5=_Xf83GZkNi|R{jFq_dDmr<GYq+R-ybQ)((_Ko`o*u>Tp>*SZ_ zpLp-PU~9tN*^bJ76L(x~?8;zU*R*ZVnytUiMs2>k)2ww{(4LPPw^EmuH!4n)+;Z9P z@As?B{ZF@)YMl*zw6GPVde2tv<$o{Viez0B?3^(->h+ZqI|QRP-^~iww|Z-uR>~N) z_};2es{;kw>+ao>SbKHZp7YN>i7ifCv%Bh8qU0^lz1P>oNG)7@D>Hsw=l0T<y}=%T z-Jb5M-8xA`-+_5&MtRoXxaF5#&D(0d`o*%R8P9vaaSB9O{@r_N)wOxkx}qD{z8qMt z9lqC$>y%cH-oy!hYpbrll!}a;zV$K}$NN<`yP0M+W;5pQ^?JUCZ6b%y^R$`AbfOm5 z)oomLDyFY3E6;U9d&cU#SyQzZe65d{KYJkb%gK!;rM2}1icy#4XMH$%QTopz=lr{8 zr`XJLi<-To^40<M?f+vYAF4E&`rPULb(Y-e`zB;*mzJK$JvIAYcC@wNE(11~3n#6l zE4q`PZ(Z>0!nxorTMx|?kBj`Qm6f<cB>%AQx3#H@d1Ini&t9=4wWnkgGdG+10*hF! zxid1p{T19igW>7(qOxx0;IOT#u3M~6_wLZjdh*@z#L90MKi>Gb`;)cVp;KZDZWl#1 ztW?v{nG^9zdD`5^(|coHo3($d)Ju_wc9Jzw2wI-(^LeMhpUa&SHZEH$GI`?i+&&Gh zmQEY@t{rbaZcLh?d-mnb!*>@NsP7F<*Es%Wdi<FMD`zg7cvqC`_sQomVheL?QZF2v z<CmR#=v9!P=(nyldHuomC4M_Zo0k0FsJ7qomQ;;OqHA-zNx+JbXWjQdiR*AjELvy! zc`^HqdOpAPz6G~FH}^{1)muLG;oPS;Yhne@T@*`R`E|e6Y}YNl>(|6SSa@gOmq*(z zzD=&E<@4LFzE|5|SFGQ5#l2C>*PnVGW^r_LQN;wGpB|s<66NoGUN2i?{VwH~)9rix zJEOZ6_FMm)Em`}o@TT_l&+A_VYAr~;e*Jjr`k3?kC%OLqE>kYQKm7jx)NAQEE7PnB z|DSv-{<-ddgB$bx7k^IPoEQA;sZbkp%(Dv*_CB%VEKTURYgPVW1^d3o3s?Q~p1YFm z{q1t)CkgVgA6R5+KNg9t^;4gD;%q;^^WBK@X^*3rr+*jpf3r!@>fDc`^Gi==S8^_A zTer6I^-BKkd+CcleK4_JcUGuR_^9_H7B>e!!#@*)>p7#UZthdx!JAxreC3Dxr8ZW@ z%iY4}ALXlg_`rHw-5&A!&^pgED_Pe>ZNC+LvamDg`L2y72f2;-OvNuRQz^c>AVu=l zt#CG9jk60azy9fL4%EMURekH%tSA9#dl%`oYJq;g%oqGPtUpgbupn(moZH0R2`bx; zy{xt8_@VO5<Z=F`w|i%l&U*6q=o`IfQ&JwPo_(ovJad!Z=bBYV_q1FLKlpO_G<|cs zoT*FSu71q>cV$BQ+Izbaf5r67iw-<>VS?#Fud>p8p1NHETjZp8q6{Y{TsGWe-0l`D z?BsBuPxxNI1;MEE-wschHUB_-!gH402lH<oeIl_nx}kHs@^rpG&n`UrBOYP()o`m# z*~@chef~3Ql<0L%O7PM=_SdZ_<Cc-ipTJ2xJG2){@_txzS+;(|%M;hGIqCO=xT=?} zlYC^EoO=A|<#Y@8*;4m}b}zhmBeXUpPvrmZn`@N(w8|PcZcukUX7c31C%$gwgWq~X z4i&j6+;D5&b-Bl>e$nT)e+P=Dz7V<Cw8NoruBlb~wvStN^iKX*vvb7~ZmY;;jvoKk z^@SA`Hg1Y5HlM0euXAVa%iV>4CM-;{zStaTGP!sY%i6PkH}cmUTgCHz@9H&<$Jg!V zm)TbL@V8@I`SiFyOX{3l(=RE^vOSRb;MSvOmn1}Xp1$}f@?~Lkcya%3J&8vRacd*L z&A9tQyzFAl`Na!wl{pIT{&7-~e*+8Sm(oQ?RtmTMSTQ>x;E2R8yBqvlt4-zC{bGJ& ztJW~jerjUt4d(MMhwViYrb$fyw%uU8z@o@?AEuVF9%lb&A;+2^e7d<qGo`wzxU2H2 zVB=q*Zz3~`I%aOz?jh)VV_JE`MfoVdFVT#S8|N{Vt~h+<pHbTOa1Dlye^rW>7AqXT z(ZXvyXJ?v`46E~AG4p8)`*L?=KliuYmXoT<7QX$)`XejPZI=A)rnoI<rlGW(_xD9V zV{9%4M?J~nv$PQU$Fn_T<IywEA03>l&hz-&+&Lvh)_2|=uD&F_UO8|ltM#QX?H6aM z$AW5+^i9fIa$ajry7W43dT?^ei`ff)Zb)4^)md3T{%FmN<2);;@YWySvebNXa)^__ zq}OT_9beqHbk5mw{IK=$WxJYqX7N4SFfH+}z{ALEeL|u!R`zKw&v(aKF4uZy-kA2_ zmzlQuW&y6#>c73%ct0QOnf1wO!yKKB48}Sy{3qUBXzNw7XiBo1$ExY+6U~^f3q^)c zo_%W9uiv|;e(k$fz;=Nr=DyptWZn2<-;dTmVYTXCcJ%hg8MfOFMXNqIRj;NVn(J?n z-c&8|rB~~1NRa0-rdh`mT{#LuABj$zps+~cgLBD4larA#p^D3Ew&lEG+Gk^R&aR?X zsB<#I;#rZ7F)GLX4V=$!;!8g09iCM4e0OX&+iYFQ9rH?cn`(Y+UntrmJ6p#kt61yi z{>Qa1c%s-EA6t8C-Cm!^Wm&vGQrh@(;oMF8W*%H%!@#mjN%z3tIj_5y-kYArQ1n=> zXw{?QJM+BVd;JT;wu}9Y=X4FY)XKQx&z#qx42u>kMJC*ReEH6X3HcixoGx7E(6RjX zL4#$g;*E(DKExg8R?510YVFCSecR7v-cn?;xU6Wdw))!!#_wyn_8P8LEQreF=A0Zb zW%A8QU&0)A_;~5(ojtl#qT)mHiKS0>+|;Xi*HiV3`{9D~9?~~<opL!FujhCAWruI3 zae?l}qFK?o4?nDbe{Gj!&cE~rRdTPN9ktS|uQ?R-Njv9s=yqX2{Y4AwGjGnAdX)8l zkP%1p=Ddwf3l7T|RMmEyZTju{dC4aILcxeX9aGoTb=X9!c4{{Mx4i$UsYJ)Fghlv% zNFlRvpv}JNXCEJ_H4nM{O|wGt@srz(JpD5#gvlj4&R*xcD1GsYsGVy|joV+}>erYm zn(001_1_?`yi}<jQ{)_e$Go|~R5odGN}Zlbv?DW5Q{C!g{M+yDyd{5r(aWj>Z#Y)} z{q=Xp70<KzMteUq{mXgWw$JU*%rf0JXLs=z9X;7gvL%W$vVI<W6rI$}kvir4jVs~& z4xTEZUsL>_8h=_6+@t^Trm=~UM{BdkLixL^o(5k0{`h0o<Hh9{CMye-1{uG9`O?3k zW6^tqZrL>UI|~>xEB9P|ul?EZkzRG?-&ewWdmrf~2)Qr0ynhm3otV6H@#@;1w^PGs zJW2AlYdbjY0Nc9s-Uay~c^u3wv0Sq?Ll&rn#fXR|{nAwF4LWg$ZC@PwO2c3;*VUQ1 zmx`{2O7yXWd1UQ>FmwIuN#~2R9-MkNxB91h(hA;`E6v86*aVcsZCLlukkGwxYRT>? z+lnlHDH*mKY_i$n^6LdZPv}*fhsoAnJ0m@OQfp2GSo5n&WlsHk`|{IlhiUSjceda6 zH_t8J)qTUo%ISXVO|LoAm;0a9zW8%z&+%X;Z_|HX5A7fCbDrk5cGcwQ`)l`^-6*+x z;Om-SR=sZ$948;zR(ieDC&96i{hE+|A7`%o_j$%Y{p7aKZMQhmU(UVZElYTucGe`O zT(8#VT^GA{cblHcO7AOaTflDfsy9!~V&0j8<S16l39WxWPha)-`KRSmtd6qls779x zq5Jf}?~U1O*E~>>pQ-Kt+s)NrRhRX*kM`%kyIhexb0jWDzxenR`8QTga(8CR^msk* zVQFJyy4(EZtHr4Wn_lwV;@$W4LAd^`FUcISTh_&S<S(<_?XxWZ^_*LQ9ZEh?^A?>v z<K(q-vrFT>yPssFj<xKXpi{`U>2JcN1=l0ho~~E9{Ymt@qVdXNiB&s{a{8^G*rYU{ z%TcOhjM6jTAAiZ;J2W(7-TVKN?PtR0HEU_lRPf2RF8;mHXj)uVSC&fcmzbPYaox_5 z8*7+A#pc@Mt7q1EtX^`IJEQyUsa;zncTB5r(%gQF|B`uJyZDtO%P-HWP4QnF`u4ll zYV(yb4QUT<%@TKcF7)!@zQT<xuUa*13U<0wPQA7^ppSdmQ=5l(l9qJ-jz4+w3QyD< zrI*jQ-8-`Gyk7B!FVgcZWxKX?Sk@`{Z|nIv^~I}o&1?D9Bqqu4ZDyFzbyrsWrgTu* z#GpI*eIHf%!e+g0|1(WvmF}X<-(p3!1x9m4*Q6g@-q2XYSkJ%Ztjm$*w?ZB&*9JO< zTWimGUDXrJ9M1MO-tD49x4ht-bvJCMo@*13kvS%`**oXNx38Z2+b{mhonbaPL&CDa z)0DMhg_3q~%Eph8OQs!o+G!*h?s0H7o9D#Ug|{~G%U*BZ|M|(!3)la@Su!E3>)-6R z59=8ULcc$m{rInK_WaskNBZj9`v1oN6Mi}M|B(i}!Y}V$&foA-_|0GE`3XDyd4kox zm49JARajxX?eX#J7kk#TB_&z3e=w5Ynr7Gj;Hg+r&cBSGy=gallWbzvXtNv7UR=4w zB27D()2k@TZ1ZXH<2FBRj#O-aWf_$*W7|9f{zm1iW~yQTrc60{x=)o&+Npm@a(Y{l zobD6GAG&of95@!0n}2+3@ytrNd-(*_{nIn`*w!xRxBD%pe}7uB<^9$7ZXWzC^tbrS zx+CZO`|iuge$NgME!~y#a^mWvbEI|{WvJiTru39&kENZ$c4moCN%f@_o>`A3`0=+j zMBLeblq1*vxTf3XqkFEZ2yHQ*Wfs>WF}FzN-rJ^Mo7WcJT2^2_Pj5lD-!=Y<X}(s+ z1RsVyI%IkCQq+&RW~Y0%P7Zvws5UBp?)T`oVYzd!#YFlU*7z=oiM%rZit(|J7CiM^ zQlEW$W^(#v=xV<GYtQ9O+otucMxe3ZSK-UTc{zH@fqM$Si<(Mot8e%FB_pNBR@3_J z|5v_fp5>xF!a<6w-@2LXn3}gW&fmPMD1+A~ys&^J{_dC7ko3^6?muhJxu%*0dMb*3 z&ak?=(~<AH<+Cj}-<GeRt^W2{*XCa*=9tNHG`HAKT4Oz%r^bBZyP%}}m*;AVqdOK9 z+z46J#rdn`(!3XE3wPH1`IhU*xJkgcGqv>G){eH5FV3u!)d=fI&Oa8!wqHihZ~5g- zXW!4+e@bq8`>WHZk}YrEt;(4_zx7@I*LTaTmKbpFk8FI}_$#4Bmf!y5HaS6^q{uF| z^+%hZ9D0$Zzv7R-3-8a4cA5Su&VOoVIB-i?n9J_eiJBf9EV!X@o?VB{49|HRMVR0H zx}1N}%gCDhRCYwIoZJjn?ah-_(wshVsut{);7>|QJ+Ugeec8!N)uEPKJgTP%pZ*vV z67?f5TXgCtna5>8_Vw8jRnvQ-^|wrN+Vto^>cxZ;Rnv@FMP#;c>-_n*XjA;_3)_Bf zt+=x<Eb8v+YdbTmf3b@FX!`j3^5MyU45H$7{as!rq+C4r=<V*FV=ApX#d0Hctvh*{ zUiLhhaO#agP}tWGhtJEO`V{xh&N*eu{MP%o#HUU+J+l49{+Efz)1;lXWuD!Y-1dFx z=~e9c_y3lZ6nuGj_+y>t^?iCyn?D!ddZTuC?}=Ni5&Mh2Ji8nCM)~Rfl^x4uB^>j- zg65Spsu`bZ7n;ndA?{T%ZF<qJpIa-$w3fe}9JN32<<;oFi$&8OE6NI4m%I$xP$W40 z=!*-FE+%dHGEx3x+@4c&cAq;k@l>m2-S2f0-L~%C$A1>S{-(9|ve)x3FPXo0@U7&j z<+#0Tqt5bsvt6xu<$C8!?F|xq`^M+!`yKtA`Iar#r)JjG@I23$Eq#Ue*x4grFX&wP zw_{Cd)#??K)XzG-m1Cai{`|rJbjPz!Usv7EHs?L-RJ7^s!;AiIyBoHhd+_}DugGI> zKWz$pU4HAVSGKD4kB%?<mdAvv9+=yIVSY-CP>)lAuwG_Cghl1tp4oi|OSkHrYdg1e zRo>AlwLQ;WFFc#~p3k#kbH+^`$IF`{cYDvR(TQEwy>n-Kx5B(sv0J^tx&Ons9Y581 zOfo9GaD`QI`_)QTi3ge<>)J!pPsM*r;BbyRlly$n!7YXtHFNue#Dv-Aaj)!tu<vAM z`%j)@Ru7By?2b0C(Mq4yeRAUG6oLIaTNsvSx31_fT;(wT)NA9yU10$~C6;sidi1Ph zt-%LFKhqb&Gi%lSu5)dbdpyNqzRk+@$?M;yv=w%V?%XuREc~SSht8SoZef>-pFDrf zSe&t975BxS12${w=1muV^(*bp73S3sSH#`gVH_UkaJ$w1>6I&|FV+fA5e#fC%XHK4 z+x)}!n`DW~*U5A8RpylFX{q`v95^L;*Cp!M*%sS#?KKfW$G-<(-{BE`=Ws-6X2ki# z+P<w0)owo`I6AI>ZJajwvhk)%)2|xe74|yPpX04=>U#Lv?Ol6J=2e@#_?q|o!QbE8 z<rQAsT|8MkxP8y;AE%f6*T}7!p1yz1w~zx|IScyBHZd-Zw|7-|^Q5;uy+lpf)jRun zA$#`{(eJ7|xfZ!+E&I8*)zom+k*~+Z{!X}W<&+eE$tKtH|KHjAZ+}&X>dV%v>4tjW zzj{+w)ppNgvE{6{LVolYu+J60EL69#<%POO09R*=eP+O+_qlQ_(rYpVPc8N}Y;V7} zdD5~&C3U5HHixaRKdAd<dZACD)1%-!pSRq7arWn##}1E-+GRriZO91oD%vvfh>eDN zdZgq}|LXhq?wCz_@^imEtC?An%1@20YhJ#5E&aV@#x#xD=2df5zL(_3u&_>A&|=D2 zz;IzwRsR0pp?0rWMLYsnRy^|%HO`yOGU@A?GpCO0KR-YFV&}WS_a7eJJs5xFoBfUd zb;oD3?7Q$=_L*@_iiow6uwHtm)UUv)6B@a)quis<II}F?F|+S4PtUf!1sxam$*)^q zE&j-faq6M!<!=wayZQC!)%3|yX>uoAC#-LD7LF6mKag{2?S?tib@l}6nfCjhjo$w0 z&w~0%%_15h$3L@KW@%|Yy)yrs-=7y{YTHB%TxU$GKexbz<CnwH(Bd=qs~$z)`Z9s} ziuvXV9$OBsuB}yX-DQ##n3h;|+&n|sMnUklur6nK<Kg<K=X)yWB_2xm{u?*vPF;B; z<JbFhyIRFw*M7aLKX>!u&!<<vFL=0r_nR&Ke%963_s5yvFqe#xbeys2{oSMAEeZ{l zqB>6ge6f6q*48C5rsB>y4YkJW(pKp0Sa@OQmooqKzdSs~_pEsvb1y7xVh`MxKWTc@ z^3$q+xQ?GUy>zH>iqZv{3)_AijC{5C_QsVWEAJX?o&4>ly5q;osmniqUpuYw`Cm_s zIq|%Qxe8jmH{9Q`#c^@|+tc5Uzf)Y9u~XhMFFvkx`wZ#B`7+#zLSidF-c#e%|M>gi zfi04{yPaQUc=)EpIjop1s+oDUAz<O=O1-;HYmfc^To#r8Y~KPVqo{jfTGvuv3;vsN zK>n|8MfJVYYj!stxHIdZw%{MZL-NgQTkUzp_@`|Ba`^wsd%oiT3}y-(IUT+IO7O>a z_j;Ww(RWY2tgijq?D0gOJN~Knx{7adaUZUBh?h&`_geT{oRRpqLs=<n-VwE?!?(V( z$G`uZG9zhM!;XfphYM%eUb<Frdy&iU=)$bn{>_f+-!1%?zh>RiE%M^A$}YL-$6EJW zs-OGH7JKQly~AhI`u{ifX&6q=opC|=$77j)KXw#^`q*>n^)34#`0qu?5(hg5@z%p# zA~%FNt*h323uCL_6J0ZbCpd5Qhkpkjedqn^xo?(+o<OeS3#;&^i9H#{M*Cj%MarkX zV!KgYQ4ujQir2Sy%fB9dj?%`YX2}<I8NwHz{r&Ehd37Q40<Bpuqtr~zCWov!zHddo zsfnZSvjsD<r5sP~xcI5*>QAB7E6+`ju(P_q_=WxVe$9n%YKnOh+4h#7GuO>Cdj6LA z`E54k!tX!rb5r&8i{|Lx{pR^(N1W2Z$2Du^@BLf)X1l{5i}+p3Bb1+e>$J>y|2Mtn z`FHO+9@mS~&$I0!SgW;I()&tgeXer&SN7a#QpT*$M!UP`>Q4?S+RszIN3PP7TR%H< zgJ8_Q#-M|4QQucx$;$98s?<?ht+Vgcq;GS!&wnqaaopO7Vb}j(;oR3)KY!)q&DJx^ zO*Z3C&3w4eb(_rDKhZNK{+^H%*%_CUJomaePgKCy`Zqiqw_a~G@=3C}^iFX3e5R63 zH*VKjI{jSn>5|Ty+ZuBHkE_>wQd-{kR#oxdk_%T^zS<w}Pl=l8&081L+I@n>xXa&F zApO+QHklQi(|P9J-|lkAUC88o@w0YGH3ci~taYJEb7wh5$yj#3sGEJ?d{##4u2m+j zPp@2gvh1OX%<q$TcC9!%@!AEQ>Yl(Emm3Zl<QnY~IKUye_-FFmmr^UZMe4t{c9%sh zKm2j+#;jci%ikT%j`e%5eC@%TiqoObbC%?PJr`Yj#msST_6i&K_0p-1NmG*QrM5~% zCBK?8Vfn`^|DWq@Xgrhu$ynjW(P?2{OWNl6_A;Db&Y395{Ay|EYVE{B&yrr7mAwm; z%G|F1^smu@aQhSQm@gi7d0{1SQ?Y7oQWRgnmjkNT7O?TP-&SC%uxZG-v>|JwxkUQ{ ziCIUruTOP*qvx5Rw<vJ7L+u{Pww-M2ayD7H@?Ocx=$%^_`%A0u=OH7B-<eslcjrtk zuVFWhtZHv$P0hLTdH03v{R~WON}?Ms`)cejV1CBkks$n~frZx~jd`J|c>fiq`z$j& zb+WoSS3C#`e^Okloq1ZvBYBS4uRG2PL4QrpOV^%iv@8;Tn!av!=!@BWA8w@IuWVv` z%5^L_XuZj$8gZ?@Ep5~0Z@(zfa53cYX)&IVGm=ZRE?kcgU~X9@?x(Qf;`1z?&}U~) z%=+@%FjQ~BY<I=(B12P=mv0aIz5lV~@5=A5*Y97o+uT`toucR5S9MR-&e`TC{a)yi z*37t%!$0J%V%D?^21S2wcP2lW>J~L;u9x!Kg-?G-C+}Sy_8|XHgUvD)={vF?1GGPw zv&pnhQeZjDH8r^Aqoe$X&h2Myx6io6`{~ICMTu`4)UI9gJKgu~RLOJk;O0~BS=O98 zT+=7?Ub$YVPrf>0xsO>K>kR87S#9bDUm~MIopfe6J1B<!Qd6;Ijy@BRD0=#4XWsF| zD)q@VH>Zg$5k21&!d&uyo1npmXI3oP=OPQ@B{Dq^@0h!GTKQ)~xnqJy!tT_360R3= zKdjs0c5C9|bw}<yWHai@O%!GoG~A>y&*56ZoEK7d4HnUXR?DT-XD|7(ZBxKs&(y}Z zAq&+Cw;ngVa{TAq;&~}KTV^ta^(tR%ZDZ=cb*$9+*2yKux8CwdEVwmC{Ls^cBc`u7 zCWR#)H92!~?cxd6+($N@?mtvKpY@fzd~2TCw8{-jlbW?ZZ14XlQTF%j!W(}bRmxV| zF{Sf7Zm#lD%_=&4s`k0`<?Ej=&DbWu>K$$s`Eg2vuExYEju&Tso>yyW*;qRx?47hj ziT1tiSDjv5beg|9FuG>Zrrj49&ppYT$|ov6gX_vF8O`-s_orq4+}$&6_K#A>YsGs7 zCH`Gk(EqIcWi4~qybB@kw%*C#*yUF?J!`c<*Ihlc8FzInJrwt_B&Cb*2u#`SSex9< zrh1LnsN&kYGeKoa)uOkYME!;S2PVC&Kf)N?Xmli~y>fx)iXGM6r>~oCRk2vTA>ir{ z>DV=kZp3jMe`30;I@FOluk~(rn2o{r+{3k}zjyymTetFIo$uMx>$&eOyS8s(tI-zT zm<nU1dHM@~7fjxGGiZak<hJ?xyn&ZAt~S(hs3>-yU%8qgFj@KS_s32-bFaua#C>Dr zV|-WpXs2xhQ^#b*7cGoOSBAcxeQcdbG|$O%iw>zS`{a@T;psgSkE*$sb%TnSU&uS@ zCoHX8xYH@H&Fi_zH361@ul=v&Jm+gIJ{)uZ>;i?9)_n(S-r3Ik#UCAYhMnVVOJ%O` zf5kZ);+HgqYRM*S{jPgSTIHj`txGJ2J2=92T6-65Qc#-lcK^>5_simEvuanri^(te zKFiv%E_RE_D_-`}iX)R>+NW=*G<03_sJ8KD-<3H>E1$;PZT|bd{!7TFn@L%(_>QdH zwPC~iZ{NRjGWQyEKY5#JxYhD>M8tw;ON`%Zf6k6$-JG<y>db>DYn8T63OnR%G5f+M zw(tdPc`K~{OG|D^@bncqdC6qQrnEV~THUjq{iY>}9lPFVdbM9v{A+x&FYD%|)+r9Z z))#&a{<yPy<w@&ekvqQvYESO;)e6?Oe|+@X4ZfY+KirZ`?kWBeeLlyLSD2-y^@zK@ zluq*YDSXe~$Q><_;z^6x!=<Eo@L$HX%(&G36Q`Z$yeYcU_pymithe{9yfZ7sUwNLF zuWNRFb+`R6Pl!fb@XDPZuFKWk-K1{BFaA95Q(9WoiDIE^p$m2{Svl+Dzv~Rz)2hBV znfo?!J9u5!N!E7RS}FZAv(2!AJG?~sddR$+lT4Sc@9vH|J<CfznKkR$9_??2-{c?9 z44FA&X84s4`57tE9up=APngM{JVokO+O`?9UiGbu+W&G+4I7ipj?DfDsV7H2^G%c& z`R1Zy8yWh0S>2Jt_97={8*R>6%D13<liHL%A8px5W=fCJG9-?euDrFqi>t&n>$J&p zt&U2`n%)DaG)?t>9&AdDNE7|U9dPG}^rq^U$MVc?e}A|<(}u%vTjccr_xwz&T#M@@ zH@NKjeeA16s_D6qTRLY=Gq>ck&AHOFPqaaDb@aCRm$vU>+^(_5v#B`X$)gLO-48g_ zXeDa7utYq*75R++UDff27ALNnT))!ueBCCM5A%aq7ByBDx124WGEdZ)KQy@~Jaoym z-;>x&JTCn<|15XVV4{(d+Z<0#QQ6>y@;jZ%FGc@#KK1hJz9)ij*{_D|npo<2(y~NE z^>8`ElOnnHolll@MqPXq!gy2n@7|gRlXK(Kia%F#`hIwyQ$N+yY%)V`WXA%<T~n%V zJ0GZKKYC2jbX!@5w}7fa$x*TV_Ns_Ug~bx?zwSx*eB-hc*}1br=#lCKb!Vv+(=vTH z>mDsmEpF@HHcx79Yvb81A6|xTmkVrLy6OGYiHqJaUgGQRO|OsLAv*P<=BisuO}eeZ zB?FIhNlSC~otY|-{zYe=g71lGb{i&sjt;3i9v$-b0KbvgUimv*Q=Qk$t@+3yc>K$q zNA{vOFDD48@0xat<$vb9u!9Dr?H}f|d2?Jo!=Zhw`FeB5<V(%W8#>Dqr(D#p={~&h zY)EsvPRE6*YdxO`i8#rgnJZo8aNuaZ#sBu3FVk3R%>x`S@P)^8f}4Ebj_`#F$F<v^ z>v>df9(C{OhfgtA>|XRHyY|L2|4^0Gh^^!oITf-%?cK@=`{dY8NoOTH-I#aVRe9~g zm7yzkvd!Lme;wa#^|$@%-eT&T-EJ*qxTY}GErxGP!u9y5o^+SlM-BLb4)C20oUL}y zJYrK#18eB_&oj65c)ma0k=^w%%-Q|^gJ5g9A3J_$KVMOP^>6<<(d*u;?JiA?zNs~1 zZdDX-|IyV6{u;Y48wy_&><jP6R8`OPE52>ibx?Zw#)}0u$M^hQTwU^a=f=vzkvCMk z*RC>~P-GE1?^dFXw-dup+nKzF67PKSd#u5BKKW|Ztk*NQuYSCF>8o6eUtwnX0;?U* z*vPs{K6!qW)8XyX=G_TNBC|KIbp2>M-Bops_3A^7J?XV#!X2jh^Uv$={$E&Eb~kR- zoBKt-eKS@(eE)%e+YhN@0Z(R&na-`@6N}E&e5UYNOYPIwGq?5Uo__uAVbSJoZ}w<D z-dKFC=*p6VG3uUNqDOkZ=B(tJ`mSoq>zUj4m+PJ1<sEJnop)~^m#FN)maX2?H)$T} z)3TWRp!8=`k>w_L%|=Ong%a)E-Ue<b+M0F0`7#~)H&^3bp=u0^z}9=I&lmn^jTDmP zTIl*V+MuD}*W16>{`EZ#3)|Ti^z^}&BvXMCoacgr6TQsm>z!M_Z4XcR$!+t!)}(Gt zezQos>*#t<rfutw$jtjw_VMS*S%<$qe>au=h|S0Qi_aZReZHagF5`)bi;LgC`E%=c z(bbRV^!L6#cXjLay>ZHmdQ2}})>pqC>ri4P>ijMyOy=F8%?xbyrD7pnk6CJ`t}JQi z{iCV3-__TEZO;S0$A(MuHQTK=a!an$=zQn3=-j@Q9XUGXa_ZholSNmoy>lvzaeLJJ zHMLRemu0POiVSUhyy#}?+XZ1ytR}5q@ON3cTc+eJ=?61If4Tm<5?wm^m*=0*HOt@e z7c#Dke4mu>`tRFK|7!7YxAYw@%m>5m!=sjOT{buVXr)#5{4eX)>07^DrFvk^zS@P+ zHZ!YRV&2+kt($$+==j9&1J^r^Gd4FddGEAV_|?-cv|xWlxB0|!hk)d@C60P^I&JqJ zmmCg~IU4AYz+bUM(Wl;jT85CU<SHrOCmoW%dFJg=ySu4cZCc_~E&Zm)DOy(<{X`@M z3^!l=eqdTVTYf!*Xu`zW&b@N?-J>+Ouh86(+j95R@vt_@wpND~4pUZDC1`lfT@i9Y zb5GfwJHK9roC*#(wBxj(TmDP=NwR#4qF=0c&5af{X>2+%Bf@!4#D-=CN1gn&w+_ZB zmPa=;&K8<`AvZQK_jYypqrYD!vv*v3SMC$-@NRDT=lct*3*OCb-c(*-xMtbCpT#$= zkNs8uf9`wgdyTvMe^}RRR=dC2+gDzvF_+m{_|)Fd_NVV@z7Y8}SN`-pL)C<L<^RHO zT37O|zF!%>i+_f^#j^)@t(}a-Zhz0c8{v_kVE$PC9{WMfNk7(q;ZF&he>?n`*o|e~ zNBVwtO-x%Dms9Q0QDMLGgVVb1;J!JM+^>I%U1$$sQDJ=Sc4oU(zV+mTj~v|ZRj*xf z?G4|S#<{kes}tS@{rz=7IY@fSRUXN&W;?jq;@=u*R<68avbOpCJo)$k_ZeOnu)Fj3 z=7G>3!7n9mM}B{FYGp=E=G7@)UZQDc_jjs357qsAD}CzD$j_5ciAQ;Iv~FDK5L~zX z#$7It%X@0i&-`_VW7?d`lV`76eY~r!T047wMSSI7Rox`l4{x?51qN--T={GJkNfZW zqwXbsUy&NRH`miC;`W;#mmcM&dOwx;Jjr{h$h58Nr(STow$aa^chb4Pv2#|<$yD@K z_z)Yzq_lRmSkLtg?<XzHXLtS4_?zwMxb3WyZe$GqKkhB%FRv^7O3_$nHED(@OOg-E z<Jk?3GRMy?TJKuaufH&CYFSHj<E^+AtG?JB_A_$5|Mltgb6@kt=iW2bv9Mz}TD$a` zO@6;*_SQH5nj&Mr-!t0sxHQ-BkDrjT*qcx4xy%m^sPsK5;WB?Tt=##(-{G8s?MLmD zJ=^XsfBO27#Pdm~lkX{C(^Kp1_WyjEB}~E7b)KVLP1>r$&f}BkGCeEQa#K1pae3cD zyUe98rv0dy&iMFTXz9tGqRpSxR(M3j%)D-E^LW+vd9t4AF_*NW9HugvAHQaq9wz%Z zvgr2A>G!u9cl^n%-5aCyUi!hE3f*eo)v9Z}_wC+$-fOw{gxxNdJ=b<yq^&Ocz_9f5 zk%&XLPgM7$-`gvn`Z;V{PS&)Tdrh`W-kIj9IlY?j`u7?U<<#4$#ST@g16D6wtFDxP zz2n5@-fwI=3t9ZaJ{GW<uG+@3`*znW<D@IRKWB1FXnkATb}fZx?ndWb*WXTlm)ILu zRXoY@D!<?s?hQ+>@$skhe|h}#<i$&k&Zm2}$oGp|9G$i0j`($vo^=VuXJ=-94t}(f z{eCXT`5cCMa!HTk&209XGM65>eA=hE^2L{IkIEvRUdP*O`^}Z>_A_26o6{Qn&3BF4 z+O}&q&au~uPu5&2?KWMn;jLHU{7=?*j%L<<HZ!@jEAg6q)#Xfu&6yU(lYPwQ$S{11 zE1YBcU}8YovWLzFe$n$TykRd+ye2r`*hB3e@1IlCw)^HAwOs0JoO!Uc>)E+zp`Ioc z#e0vI-{Vz0-M4ao^lPop4p-!4KOZ~5A*z-act0a)`mDX`XQUrX?oeB|v9kKb!#x+C zceH(f*S@#hzCxM9+`S@rj>W2E{gBAFOL`XPhm;oH+aoHwLSk{^f^yCvcKbJf15%f` z&Chri-ej}+kCgZMXx_88_WG`Ky4Ss@fH&@iR>Xw#GtO7io1!1c>};zS4QXI8%H8_3 zl<}Hz5I0AU`zrg@CRcbRSF&bIb>6gU%OYvxAZ7nbyM2?hA8`LpJL|JG(R@kaRUQ?` zT}w~KC>|?VvLmwFyS({<JO6VHpG#+?&oL}+$Yzqf67b%|g6oHrk#%Yk^B+GUpBkqv z5C52^PH5GU;<GY6uX!x6Xhw?M3|7Y_@;6_(dX(_A9$)3RFF(fh&fHY5znqJOK1USZ z%gSIgl~uEy^YG}jr1_R2!tJxzida}?pMAJJWz)8miY@CWRM{!NUc&R;%h+t@(jRIp zjLdaC7Y?RPjCg;+g~@nD;)Sjq8Qe>KFU<YHnR5QHuJYqsTmgyf{3rH@N@VW+d`(ow zTH?{40H4=;|94y#Pib?E=lUm*TI-avPko!u`DM$5Qg3Vi{PR9_+H`-pe*tSI-MGAi zSujTDj0(@=oGvrA=2_b8Q8tI(SHH|DNI$r9t+0!<U-G|yYxJikStPA)J<Mdo_UhZ& z#vc|8@n__sR_F@_H|O=d@9cWfx3D<+yYTh*ku7q?EmLk;^z#T!n$oA(b|83q*Y`=2 z&c<<{S{-`$pwgEa$|<W?vmSi=;*zV+d@T#XWlyfW{#I0SM$gkps=S3`=hbCQOO+Il z2?buB%gR5~+w|l_Eg>V8|J4dA|8nz~{;gWtVYG9*6zkzT$@;gZe0%gte$uW-E9x_D zoG<z7tjCle@K~Lvo@>tzk&X*(63;5$EQqWRyH-A7L$G|}RUY$yw?gY9Z!+kzD>xr( zFt+G5G<KcF!6+!J_&U`#_-)IleZ7b49;x?Fn9pMIYtByRC{5)zvo^l|`}0MQ>aPX? z-uQ*iiA<J`GBz^Rjrvx-w=ekS{)-8pwOwjfC1bLw)0(C$8X`O9<@W8{_F$PJbB=h) z_PwU7M4pyj-xyeEpR>sNsP4NT3o9iuT-@@4@6Gt>B+WK+PIPnnw388i4Vw~o|7jA_ zx>7G~{IMwY-kSd>8@K!v$uixNcGrEg-Q$*7QTr0&io#FK)!iB#`F)LpZ;;pC+#3hA zq9-o)TQE&1?17-Uv_m8JC8Zyy)MmOp+0$xps?%c46!vb{2}TLLrw$jXmt4PF_(4~~ zS+7#t-`6_u$d<dmPhN=VN>rF4kgB!v(srp?j&HYDxZUvkXxsMm<deMQA8sonOgPRg zRBKj#`ccRxLquPF<+aCA&;LormHtaHwn!3QsPfpN`r$&AXFOL#ycP-Sp5C(U>znU) zE<9OgZhx<5?)?V61=n75PJh6A^XIp};m+;W`3H|(kMP>=(9687^~jFpml`e_{1M|z z-?wVkf$xh8-|!#wyUl-sO?Fp<wMyK=%o3KFn_FJom~eZ`o`_d%<=3rWr>&jlWhd+A zwsxkg^3v+-5_4G|TQoU+EKVs%o^|xZzKF_m6VGi|G`Y5&!>8}(zEa6pt}hXtW+xa@ zJB(%fFVCGey=j(8+0RA$UJARgrD)%7EcV`W+d?i(YGp*Qmh0(voI7lPb50H3TE}%- zLT?e9;0rge?)SWhUA}np`29I$af9`6%a3`dlJ%FEc?+J=X>O1+TrX4bFK3&=-8o?k zjTQ$?-6wkPsm$jKNm-W6mu!>+S+i8jRGKH6%Zt3I<on$6<-}_R*BS2&ckp|fReYNF zu*tR5M53oi+c|5Z!a=@ii3Y55vi&rU-H)gcbCH*jkmRm7)LqbPDL8*}R>O~kqZ6%W zpYgqA=$-u9Db|rAqxzKM#tBge&nt7EJn0p$x;nr)+Qs+xT1ML$3iC~jxzr~dkzE$L zGPP5Fslw-_-r;%T57GnY1hYs<YicOgeX{gBWX9fiB11#F&qeeVqyFAI2Sn#CzN_;z zz|7D(jB~rwlW5i~qrPG>#s0&+)%WaP%`G`^_4f3=z~`%ezx0_pJ<5ewT#%0?RF>z; z0iNA!-P)pEbm#ayR(UMNd+B@cL2)ORe~-7XerI3z`$*~rtq^uyw_BnP>w2$!;QOiS zv1yWQ((!w{ww-v*H}P$JQTvJjldA>o1{FdsLD_NBA8Q*eSu-i`=O2TqJ&zMjEQ88E zN_3`keQoAv<Lo$UB@}NQnzi^^dcx(EyN+IU>w4ySX1Sf+ew*C*?{;PD{cnrwe!uJ; zZ2iB8cloNRtG9h|$!dSTT>N?X-E7D8_QIdpW;JUC@B47&c%~H7GLM(Sr@!RxObd8? zde6lo>z3ps0lkUx(|$hDyHMmF+{ONChg8(FOl94hiaTfR41K-e*I`A2{7bAy{n-A_ z`)<#_&0e~<#fd|w_+#XOsCcf=VrKhRF(+iK?${gQ7|i=F)Bk17FU#3WAIe^mW>?k@ zi!Ao8O3?oLVd6f4eH{TSk0h~bI<H$7Z5SfEoj-3?<RmuT()r7Z=5enKteA7?&z${t z!*1mJFWeTRz0OH&_2#H;Tpv6N1y`)N)D(I`_h9OQ)&nJquL4BR#<=(@F4VqI5a}El zHO<AnT)l7>|AbOAF|9`;OsosFeGht1uj=33Y~k0kuGwjgd`rZWT*0l|H%<9;TkFpD zjiysi_2;cwc}kzhO<R;dQfuPs0KIGXKTLDK*8l4~)9GNJ&5{dt_Pm>xDVlZZUCrUc zcPCY?EWNtsmidi*r_k2$Bg=Y^dq{0qWb@v*(vNd~dDzLMV~lqet3-6T$2Q(7I=iLm zoSN<1%k9UkU1}~auiEk}yYNWu+gsDMUM$*obCX=;nm+wy2{oP@4|!z%tz0a)We3X= zG5JQhj{O(br=3lHJ^7GnSoq@2pYNqU|8V+gXga4ymPbg(qw1q4LP}a6xL?Y<p&(IY z=;my;p{Z-Dx6uEKF@cYNEKi&IT+3?bR!)g&>WUJRq_cx_b(e_+<gkX{<h$^{#3P5J zVO4MBnoHXs`Gn8eE){jodfJi4^VSqMt}e)UlIjs{Xr$^h`)v5F6-CBE_6L95Pv}Tn zzd5tvHs80r&l3#KEn6U>x?{V`nIlX-n%7i)LtU3X_1nAN=lz6*%scrnJU5-gx|8d% z!!McQsNNrsrd>LeaKo)hz&E#b-%aJnMfs*C!Pgcm<(nB^I?WLIsMdlZy^kfcjn~}y z!fFFk@wA7%ld?Bt*f;OIsIao}kN8!$tSU>c>DrrLIjCj@++>`q8sEtLyH@cNud?&K zsdwh&8od49b}&M&(m#DhTfynW8U~fs$(t2ou1)FP;B^0k(3G~r4w?_Ymj~RBoW|$s zACtOzchigi{R*9#!j7s7O7GiEdiGq`adFPo&f6`Ot8JfcjNYKKVwUU@W!~nA_R{Ig zHm{j8D`;7t)$zCb>esFHo(p6ruwIs9?UcCkpzh#Nt%%>wC$BYK&^>)3d!gN9y+p&X zEzwqsg6Es$o0>FBb*j%%cyJ|I{zkF=1kL1-&#Kq185PKMn{xGjdb~4q#}O6XsG!sp z(@jg<5>0&8u9ko5Q8Zzf?^zAWCfhq+TlM4`CO(bkdFpw{GSQm%T=at7eXq>3^tMY( zT(hp`Qg&jWQ>)_>H!f*GH;zK-u7>lQ*&H2prMCGzYfcG>npJbZVr9U-)|F*Z-FEj5 ztbg<G%(JQKGt6}>*REUO*ylYVYJU31lJ11nj+w5H*IMQqhF@JYgDaB9CjE;~li^wW z*;!An&1Tys8nX9X`(2Y`31=-|zL>skzU=Ky>HSlVJFecb^g-5%Rb3nBa`zTWA3ACO zIQ5M8L$5c!mlModrd(E(kogn6Bd3t3XNS#w=dY)$BfU>}zI9t^x<`J>j(e-Ryl&ih z_ji5N%9l?rMZDlnyi)xj{ok{<`{Ns>L?Yg0sy^?$5|+msH2G=5jV}g0&-d@%kZ&JY zW+U2jMUMZO@CNQgzrz)3-q#miPPSlCd$Z&8ofBX0RGl)+E)lIe^g~&SB`eZ=8sD}R zhkL*2%2eL|d3N{dj$=0--<|(;>htIOE9>nT&V2Z^Z)Nb--{$Yz-)qln6v{ei!8`5s z1OI#L-X&Dt|9AXVZS=;cD@1p+o7#PKjhsIF?q1C)E#_OQzSJ6@VXNzrfAjXO<@dtH zwZ`FBW*PPEyiq-4_bD+`!vzyhulzq{-{0?CDKWLH+h-|9Upv#iAt=rNjYJt=Tdn^7 zveYZ5-j~?%n01JU-LHM=mS(_tWA>!{g8}O%N#qL^7;r3{>~eu~f{4@XH|>uNs+Vj$ z<9(tw`K!zFTc>=YO*z;e1tgzgWjj}Yp@Tn||DV&*NvV?$i0<T*Jv~F}Qt;R7@^1sU zf|iOFR=@ID|EtNp#cqB5<2z-NpUy_r&yQ9-ePw-}`t+!5n+AW-Fyr20-(<_c#x<<x zf1a`ExF@dQ_vDIpSj4A>XH!#S9fSM+HOBbG81~+>Q9Ap?|El-d)ys9i9IA-lWBmTY z?r*#9?fh{&^yTEx6}Bs()0K+H-_2O-Y${g%!Y%RI<^uD1K5N^SxkZ)t$?_O~Io@#j z0r$hQ_a`JS21qcr-8rUwLTPSq^A?BR2fu_3a_%}E^HbU!>cbs3W0pkiqt<^qGW>gW zj=aj`Jv&=K<WW^veApcQ<?7Rw+$KlN*v)z+D<f;k^o%vD4ey8KaU8nBy!njW6t!cM z${xtJ7CC3@9dA(I^7-}ApHIJ<{S)22?ensVqV2k0->;3@HutQDTwcS*z}C<8mB-3l zmfkDP+C6*yMA<Z(X_AG_)(5+flx|23=3acTqD_;<>12QUNrnaPmP(6S#oM;DW|*(! z*);3=cBxsjw&!iJir*Y_C~sdIW7mVZC&Y}mhacPKbpM%w+3P2_dU6lnh;olPlI6y1 zx&Or++qFF5jZwU74Yy6xKIZz;JLXnTu<!v5?bBILxwD=Yl^&>PG0muc`{Wv1NQKw^ ztc<LCQX0ovt)FZuuB!VfU7LF(?B}B^{*Rta)PA?D!Q3V?eA}uwx37LpU0%EDSDA#r z{LXb!U)<RH?q6U}yH)kLc6Ua6ecPnIP5B+i&)mx6P&)Byss6f4dReNuuhPpSPHsAM zEW2ij`}Di<R@1+1m3S$xx4pvoQk`Dd0jaQun`)~<-$>usx~%Szf6%vzQ}q+>*RMah zuXj@%k4_8UgjciIJ^UqSyH&nOU4X%fY5&8!+P{xg7bo8T!Ln{^{)V54@AY5Jwrbo} z-uu1xn@z3l`uv)-Yc}~Cj*5TpJ@50mHk;-0`(t)y0sn5_TNABo_3>x!rm4%_919ZW z%sgYX%2B|kBih%ivC;e6+O}`kv{uiUeC{{@d#?LgKX?2u2>21^z2a~Cd+z&L>-PQs zu=sK8$?&7^-|Y{)FJ3v@x&H^>griTN8M}u*vE%dH{~`CRyv(MGhqr&RSU-twy+1Ae zjAA2Ke*U4eiy2L}anDdO$XMsMw(Z)3v&yb9fy`VXPCR~$eZF%9TAZCPu(itTJXf2~ zc>G{?#ZQZAsZI0mY?qp4w)1Mw{AoY8^Sm+XN<XRhB)8(BLC2;7m0&ibnVYuGh~hoF zplzka4Rhu7O@Zes{Pj<X-&BaaW$P5UQbzERUCtZ-HL@*til!?$9iAhZZ)?cYHT#CB zi{FidI@`J)>MS$;e1iXPTkM{$Luogfq#m5OwPd5wR;j4TGCL1+g*uk;O=2}XcfDlQ zeRfS1s}+YAEX$F5>-24Q{+|h*jO_{%vqB?osimLRTERB^?qkOmf5@avIA8PWwh!f( zR<BglPL<EJpVFzmN9}>FfzxzTjpK7B+8tH7K4Xi5?hbY}qnYnrM6U%b+gK`S9wG7Z z@XtK+yXHC;2Wk)Re{QV$ykz~xeNXd#T>B}s{N?f3J6abEe?FNN@WQt8)yv0C+Out9 zKg~3K<hZ#kDO&!GOl)bn==TUtkIaoTzJLBLmbT=)UC}@H6%O-5)@`<0dB*K|z+rRG z-nV@zx%>Z4`)0`KX1g%i>5Iv{zeQOy4mNMR+R?#j`nuxxDU}?Dj*~%OSWUto^{mLe zy@)wivEqb~Gs~16r=@Hnr}3_s{F*n;$3ySgbTP*n&%X0so5SV4=*yZC&zlOlGyF|g zEZ8|g=GgSqKk6xSFHLmGw6M&IkTmu%o-1M5b^P%Uxzkx{0ugiVXSbTnIacN|{haT; zp0-Of6<DI3dOg#Hr=Hc7b<)eqVOLW1I@6_Cy3OO<mLrVn%^WH#K7Q|6wRP&|!^wvX z?i{FTTf{JBs-q1r<0@7Wl^9m9pyN6=8jM{EnOy%4Enu@~vSX4yyxN(o{=t`no!39R z7c4KBBHWsCCTVU1|Ec?bww&I1{lTnxr@uU%=CbwFZ5Qw9*IT*my*F1RS#O-u-uv*L zn9qUYo{-y>&+}5XJ6N}wGM>L6c5F_G;)A>;_cks~iS_h)bL*UDq~_a$H_bU%&IKl2 zUDoCt@M_+n(}8>J{ZdVNXI5$7t*-9dXKEd^X~iw&tv&{t?glF-<*IEhx<3EjuIrn= z6;x=4#cxov{=a|cL_Wdui=Tc?j$=q(Y<XvjkTj>l`ajVgg<F^Syt<pP<nXoXqf6Bj zyJYxpC?>>x|9dc;$!YT>og)VS8LJQ6QS7iU(myge;ig!VWjT{JpYZ!HYY*kGn|RGM zpRantrqmnX6pYt1rW!}K7Bm_BbmCaN{n}LDnZ15zVpyG<Ue<81oPXGOQq*{Vs5#rS z>92MN_i#UZ|H5VGX3H<@u3ppGdH;S@(8kMVx~AN-6E9~e<b2lIasIic?Nm^?I(r)L zH;0aeX7{hV>0Wux8s0K{LSb=U#*(`)_Dpo}J|CIpQm1{`_qs-JHovCn8~K!f4F&R_ z{n&!4-ZoCl*()5qO5E-61IM_$m-3flRPrCaN)kR9!eLZ<_O<lBn&-=XiuO;Ex_e>P zwR!&+bU(E)R(SKvB6f%4s+sqc?ku`A@m^Aa<e@cg39I@3St{G?z2B^IZN=2u9R{wu z)8qa8p3VKWTH!>Yzy+}j(UvW5&V2mUb#s54fwyLwyS{hc^{UCr?yq<bJnG<Mnm%F8 zk`GIkUVpLnS(TsX#qC=<%~jHNDb9T~MdX0`O0oZ|tXLy=HWYtnHWHpy6z$Z|IsJ}b zU+S+g=jy8gVT+#$W-IQWW-PTx{!W|Vt)`_>4bz@{O=wEGe_?v6<+dH_ITK~>oL#hj zUZm`qH;-0-+j7eze(Un^x0#BdWkvtwR?O^O%_qmU<<!E-hn^_>O%O@0V0SbYd-MPG zbz$DKD$Dh%o=Pci-y`c|_+yj!r!vE%rP})g))l`p_tAZQG<*K6rE7fFwq2X?ZDr8X zGgYhRsJgb*u5>g!P&>b6$Lv{CH-2~jbb4>reE-GI8voznQ`mgCIq!_9xz?V~x~*Il zQ~I{_+ilqR@G5)FlP6biU3=mYzhj>SqmzEfr+xM7_ACmoEo9AFRNJ{>+777?yZ5$- z@f~GPc)=JmYn3Elf$-8*k0#0{pD2CzMKWE}L&oQt*zuRbJzZYa&BgN**X3rJvza`S z`SY?%dF{ffnWkw=wpjT6pVQjB-XOI6-~;U=^B1y5#a@-YQu5bxrRIalUa<`sjW<iW zLgzK?m0p@+abkf%{v_2E2B$Q3xTd_GCc1X7s^R|9$m_Mc^A{#^TrAyk<j~RW6EDna z?^wji^SFHVg9Fvy_sraXc7KoM&or+<gPCdllTIuDZr;FqY0=wNwzn4*oByet;TAoU zJtn(dmGf9{hpXh-W2;`Nzs==g(Y>-lwjt7^=Janqo9i9lm6{(Wq-vCew7WiH4w@wD zp7mqTErDrIS^595Bpf>WAyZN0(J%JO><dNrZ6dW2oZ?^Y_|~|dY4@}CBGWQ4D}i0J zg#FH_hj40lFJ#zOStBpGv7F5`@)RRmaqBmIl^aRh8XXJwMXB(dh<1MSbB^?yN6bfe zYj3;6y=K=gt)=gES9TnA|6CrB^I30^>zd2gt5^6qTJjzD-`$ya!gk9U?xfTQ3%okz z544)TpLT!3?8hhWJgPaL@J1^-aGlHAwreZyJGq8`@bE775DQwpaIeALYQF#GJ5Fso zTb{_jE2m}Yxp(3Ba*oQ_O$24%do|9F?<^`|*mLdnoL4=kTVFjo|0#-b;!4Y`e+3<( z87*4UZf?8_9`WY%uWD%eWhvWjeIVIJJLKE6M+%>A9bYaI(EIRdbHyR6buV<UuW>pX zR>Bpr)_T9-spN)w#`mHj>2sV4CC~l2DX?JH6es`5j?&7lJsw~8{Jq3B!&qn9wAi9^ z9;;{RoCf8jM5DEw)t5|vN!A*-JUW&>ZM*C{)@t32<~0Vn3rt_0o8M(SIcQSc#(h?C zT8918nLd|an80YJwk9Vb!b!ozLZbhG!lI7nzs-1#<nsnc&OE&(BPUqs+L{THv$T&~ zzajf;!leCc{;+sF;gDO_R6T*=0N0}LF`ZLB*|cq3w=O+kcev?$4c#+4_&Yw%ae7%f zGyc@djfW+kix$Rj;0gEpp7OBa>4g6h9D3cRMwe8#eJ+1!wD!#D_@lge-;2H)rTRzB z1%>6_HyS?dbw*ddh3oE8ynb#s|FLA3gC`h07N4BGMf!3S`;QCSQ$Bn#b5lN0sa3IR z+NJuq)E`{6(Hu&;Zzq+s#P4AIpe510*CXwz=*p`Xq>|H2d}2GyMa9>xKmD{U|K8Qp z4-M8IX)|lNcuDFU=gJM&q7E5P2|T@B`u}YCzQ1<uhh{oFx};w!$)hu2QTVpKPWPW} z$Zd9iDzV)=GxX)QYyWNt@ZEPPWSFt-Uh0SQkrUGPs$a3aDZqEXZ;yjd+ysL)Dop$b z&k7VYy%1W>%x2K7u+Z|LyL1a@KGV7XtA5MRy_fp@f6dF7*zfD=cfa^@?wtSb^tZwf znokERGrNj3^VjtVAKu7hzS-l&m%W)2zE~|+y`z7|d3Mz)v(*Nr9E^^4RFB>IwzDq4 zcYVq|J?poV?*)F}a_flbGu}5^_YCH+1bR(lITJY3cL|46w!gJ(LT@Nj-3_tHM%w41 zZEh`G{xIRgV;<g#vrFzb*j(A16C7Q1PQ0h&>9!0}yE>cyTOVCJ`~7WH)bd{+dmL(i zePq@@QfqN$#jP)~0{8Bvp89u9{QL>sxzVj$!MrN(9;y6^{j(;bZoz+D4+EJq%hGfm zxE*_16rAsD%UZqhUZ};JIU%VEKldpfp7Dd<R&UC!!z=ZlOBDs(z2dd})~pNPf2^HV z`7^e07T05=gna=r4b>m-)w3wOeVtf0<Gfp&;k+%$50-KLJNjnU;{25BDGzMk++<n% zkD+e+@q^q#t9qKZ9}@hvy6DQg+9F56Rr4ouw|~kLQP(xhxTqOFrzb<={_KaPeW4R_ zc*}qE|K?}EU)`MW=1f(TO}_Sa*WKS=ZK%DpbJec;wfkZvKc^b|ica{c|G4YJ?~mp) za}8BjTe-0|&HXEA-amt3e&IDWyIb4(H#Qi@Eju$?t@i#SlZ)2>qb1G@1ZSB|wVs*t zYU$+bH~1O@a(KL33f`Cm%(!mU;x~2Dv*r@{WWkb#6}~q`k^+)_Cwe{THM}uhebuIl z+=L}U2Ao&owlB*+s5bRg&)QGwD$%n)b9B73jBoat`Po$V*0tH6)ctPn*HT$>h{61E z&~=7W+bx9^g2ESsIcL8MdhYOZ-jTxzJPdn}$>#mt_T`qg>J9N?#iJ?T3KK6+=iO$Q z=9RVOrn$>|o=XM?3(`KmRhqhB<Gzha@t4ehecLIZ<5;+t=Te1@^T)%r##e5-)Mh5C z2Y<TwXy4rplXzb#9-pSH_4gouwSC3nBk~0bS4?U+K27|4v@Pk)&(-oy{w-edbIg~% z(4V)}^|RaUMZb>Z9@=wtosN^*+<OToyJzxvY3`nE*p=Qm!)r}(+|3_#J>oA58u*vA z9@6H`3SfJZ;<w?JRLI3ivla>+x-b4&u*33Pb;GtrRfi63d!nwRXY}6l_nkfEt9+Au zbl>N`JA5`^vDAmUQ%7r7{VsOCqOnmkq2W{2YKD>;6St?IyAA|Ddv18&{N(SS?L7Nd z-2Sa;67PPh#xYssdF|Ql@5LXj&vAOP?f6aEw7;hUj&%OlIHK96Cn9@G*k1aM;fcN7 zQuli`HqG6vs<_Coag(Cq^V&^+nacuNuCESp^Lnzvw^rcR=8f}3k~H=eoD4Lc*5cha z>H6LCpROouEZLf|!Swe6U(djf`E!IFXIl4_<e49lyz8+e@S63W&y$yX-QgA7k@~Z3 z+P+3koi|PAb|&Oz-F_sXIN85^UR9czXN~k*&Pg@SN6eS(`pR>-YmMHK*$n$L8Nch? z@hns}5nre9J53_2sCIGwv+{MGvroO>yJS`%Yn8>Ew(Ql1*}m($-<N6Yo-}Xos+85= z)^cil2xx5)vXD&L?EIC-W>?ai8ow!>E}=$=v)gl@sxot={?*O3IQ4yPTbNbQV~0*h ztL+7aM^f45FYn#HapJb;YZjO6RaUyPd!^JYiOwI_t1nD1zH;Gk{+aHFm%`mPyI(&1 z-=6=I`~Ghe&s|T|RXr1y_B@SAR{l?cNV@%uL#rQc)-gII7q)GUOnLktr+H8J<(&P+ z^ycc0Rj0%M*Y2EU>T~P#r8TlMCW-o_NH2<fT;+9jSIF9Bq56?uj;Zi}?RE9t8D+b^ zc)ipkuG(k?5#E21iWeE$HB%>Ue63}7diR5;UTY@bkpE_9nDQv=N>&E%u?-r9s?HG` z_>5dOxNL7?7S2++c7?&u=fBGx51#X1x@z_aHMmXPclE+GrHxvgIwwB*GbQsq?+MWm z3_1Pe=6mI>r|o5a&sk%!^Db9G&+(Y>@_QcqyWMxkH@k1_eR%fD?PuDH70L@)uWNjq ze)w^6AMf2r2VPr&B-!+i^$FLN#P>hhV`!!}JJJ5jhB+$l&3{<?$S(4C+1_J(aQSqG zR+sOER+je{?8#rSXx^Od{Z;$_{nBoX{b^8ZIU{6+)!ZY=WiO@#FIH`-bJ)Mkljl&# znxpr0n>sT}u2xLzHMC5TGv!^<dG6st$0l}fzWGxUd^cZ<$vU>XJaNj*yBU>^W(AtJ z)?1y;s?Amjn3HXLF^<_?Wy&(&BOVWPlplu(b~%;qns)!hr#s88zRrs~I3@LWm~-?J z?yR#%w)9PT(RfQHu^{ey@uQ9Q@)2{MwPx2Rw1O(z+|OI=UH<n9Phofz+Y~=B%s0)K z8`Oy4dwc#VtIn%B{gB_z#o9Xim-ooGh|Rw*xAX5~H=Q$E59)Y21T%XHFg967Wlhp+ zc)RmTn9R%7`@XGOe|F)sy*jmLw{#gd%r)z)pTsv`FOEg=+^^=P&rBX~j9-%II9*IT zVnKZ1gDsD8&$VA$5OeVSCHZ^oCwBeT{yW$0$elwq$4+bt>E9+efvIJ;#nRnV<kw2_ z6p0;~x>cOR)n?;1hajha-%NW9_FK&}`oy|St*d^4p4}YP1BE*OHm84^FlTCOp-gGt z?RdX+tnpLtcdV|T<G@rc<2iBT`G!4OALOmyFJJRM_$<@k%d;lE(teU(Afv>>QY70~ zVbk~ip}7Rt=k;#w3-{i>tX?g1JU%$(9oH>Sr@xo<`9JLyi_Z+&^U}d$Q${jF&pVDu z>k|W%8$>r~x17+DtrlCDExVx8<JiwjdJ*4rmOsi}9%FQ3QOncjvTsF)?QS&3xo#Bq z`E^iWUD}`Q7Yn~lJ~;P>N6%dAH?x#phlkA5FRs46;^fxz=8mQe27hl9OE5JUc`7$~ z9Wdc5N-nr|g4bhu!VcA`yr<Ug^gXoDRjb9y$9a<bMhi<}9<`}cH!P{qnVZlZb~9zV zkAXodSJ+$oQ-5z8bv!UpnemXnG*pP?<%C$Tz}D+WB3Mpy#bx;mr+<1|<95o{y@lyd zXmgL(>SOAP9Sv(zn4diAVPj}l-`cM1|LLaX(;HFlKQ-DI1GE}emPtGo>ApXo^P3P$ z@Ez8edUnIaPr~k(*thB{Rvc*fe(=Z7^LIDDes@z{xAe#7{=2U)e`8Jin-R2GgV*Ts z-_z%A20q_Zk}+wU=?;UVxxBx5Z^(XsZ`Q$bolzj>m$XXZ{V&HK-DqdndMKSU-QjYO z!k!v$@5-y5Z@(^fpX#YtmwjEn-A+d<WyP`-`HM?79O?G*T+WsF^z)2QAxewhxBp4n z^}PAnsb@DC&UwBod|`H4sD27-r>#z@?5~XcTHjNa%pOwp+sdozSR|iLU;b8j4uj?U z5-;9o|9vx(7e0ueXu9R~x2Ma`nXbCs6uh$E|NQxL{Pywl=9fM56U&>ey38xrK6~4) z?SgX*wD-(yoU!zch;YmOcS>nYHxD>h@$zk0#%g=IeCGwrjhgTNy7L%#NlxDJVOGua z>F1u7hVQvzo%z4)-%+u%3)CfETN){E+w?&3^Ra)6EgmoWZfo<)HbJIf&B7#w4Hdp# zF@8rL9(<G*q}C^Y*Vf8zzs;L3x8m2Ge<*Rw_~a@tuRkLGCv>{Y-)jWB@|4VCQQj!% zkWy>x)yU~7ljy7G+kG#w`0=4&73=bf%DRU!kCV>x<YZTFms0sS#VdExi{fH-xA%Tc zoDNwB0=<_nIQfgy!{6lOm*f8)Xz%G`RC7A?AbHNcg_@ZYGH<ZH6O1kCyVZ1C)-KT^ zNOlgJb3zF74Os<ekHjli=DbppH~qNZb52@_y$_=j?~#?>kJdkGdEotQf=AL4%Xy2g z2o>()aBJqZ_G#-A(b-%rwrf61|I06SbLZ5Hq%W-f;{Dqv=TLn~|2lj7#H1@1TNev| zXFSvSp_@mrp;2Yg{|@OC@#kA+F8v`nT`Q-9VbNKYKxN_CjcR_~Qjw=GKa)P5Yk21I z<ZsLG6@I^dPOv}1ps#43gpI-{**|?hbh?H69()Pjp_=2oj-T-nr)Pcj?-#QF-tU+G zqkXKT+2~#6P0K$;m8sdHV(!zXK5Ls1HAO*6$nl~-laB)zH+RbaioB%?g`Bz4%@szy zmkqd|98qn25WJG*>Z_o8fv0bD%v>_DD78;|Me_7>zfvTek3MnxXMA@O;~bTnpP2+q zJyR{2ThuFLHSRxP-fchmweXjiYF7KXf66{e&UlvjdslfyT~%S-)xBjMrrdMbs}y%_ zJDr@mrk>Te%T43RN%OLqoHOj5gfH0m9$vU{V~){RQ@gV3)8B5^mN<0h@XC2nB}!AR zIg4&i`f$*A$&R-ni$qPnCfV(FF8AMZFJPZ*ae1zDtC8OAE0HZ6N(H*UJ^Bm*me(%L zzv%KeZ#)0h<i{FvcRH&*6FMh|{adr_i*o!_8%4W)mnI5cw^?Cxx&BO(%pBc2wWrqW zt#EZvP1vE)=XPMh&K=CJ4>vu(!xc8+u5SU;k%>Qb=Vf};grv>6l>REsV7b<M{-Xu| z?!0>V?$qwv7e4N``TlOI^~-ssx2Er1d~WIu-)^%Dygs|<*NC;;J`(fO;_~zT9I765 zc?II!p@N~0v<p`Wo(-QFwx8|tpS9}CFNnvrZC1NGC$;ACO5Kyv-3ygMgUjs>9PgT- z+52Qk_ewq`1-maR=DGWwO?u1q{@A2G-Mj_c=boM`H23VgPx&EEo<dT$%ndDWK5BRz zA1m%+aFHwZfti8%)E{RZ74*2B)ON*fFAccMI?M9o4$BpXlv)HsEm|Mj9<er*{WNEn z7T@B12PdSs+n$Si+V3dE$7twx=Y0E<`i3t1S;urtSNSCV{}8B`rgu`LpL=iCkK3Qc zmmNCx``y|7lMe+Mys*6e?{M8iR#mn;`g@A^Du`eDddTr1>$9z?vA^zp<z92aI{wGT z4^ID1O_6slys}f<H&NiI`I+jrY>}hpQ{>`}dLBuCE{S_HwfN_fu4nJUUarr0IQM<{ zM^WcfyXv0a-S=2__I~SS5qmzf*$PG~nAon7sa8MoX#dV_U#HIax%%GEn<w*A5107) zo@6>*_^$q;oP*lg*;cX~-L@RRB4+oWD_7ZYs4M8=7M)cgb*aWW2I8JQ6+9avR%&Uq zoiqCQM=1C3lI{-or~StcToUqp?zTIA+Y2w|IE|y5wjMs2G&icYkW;<M(O_MctJu#K zp);)i&o-LWm6@Qfy{ByMnHR4(y+n7Nn7C(xfn?~`Nt+I<nib7q{IXeNu4-d=+5?R& zi`;~t6Q#1|O`cz3U%Ri(+?Btn-O*ra*9{>D#gN*h#et5+=TABn|DUp>^2hX>S>XXw zw!T*ht(f=bnx>B9>B~~{C%Csc&E!1F{EFkQ+P}x|ECjxrT$^)p2SecUwpltMFJJm- z7$p7530>_YT)H~y+MHR;&B4Xh?AalAT$S~1=asn6D)RsP;^GdjO{|p~?-vxjx?p8L z>+iqc%2DTjJB14FS5h;W(ICWfP2r>U_6e^OSKYQ_`nA<@w|MMtsTU_1kN&+PU-3Nr z-ulYc{c}$x>#qB9EYI=l{KLu9ZYZ>N9+otF{#MKT0Q>6;ehI}!{Rh1F_w-9da<A6B z$o1ay&lizx!dlY{<1@PZoo>$SW432?)!CvnZR^XMJMOr@6P>+Vldr!h`qAw9Eg!0D zR14<tW*1AJ+?bpk-e6{aFqUz@!j$_jBj#LojeYrdQ&ReprR6)<-3VuIKHn^Hp!AL7 zMwQC%B^h&d7>;mF;be$P=5S%S8uh08^JyFZH+@{w-y4LUsy@B<PfqJ(lN@pVHT$=m zIduC+zTQ6021}VZzpR=#o^Q=2w*{>Wcs^S4sk5Xr-%g&8#GH0c-&*lf_6qCO2lmz0 zT79{hF77q^DC6}Ns`YP7{4P&eYyV+!jWC<X;ZM;liyk!RoVl`bbNZDNKg4Fc-Q9n| z*ZN?C;g+cj9<aDgeeCgn>HnyXg+~wcIaREwvAEvD(D(oOv**_Di}#=9u)THE)qdx1 z<LKz3I4uidALjUf`TI;nLtOt|&3%7xaR^)f?c389s#!mJ&u@Ki{+{xB!TbNdO#c3k zJ%9NWHu+dfOR>`J!nw<PM0}l8gZ^Y_YNmX?>hW>$)4f8Iqb7>jTlG(Q&=u-=aIy88 z<;MB5e>AJ;T`qgD*L9bv>!OE&hI^JT-|&^2QI%&w`~`{6Yl`v@>NVGW^jjR8_DAcD z>788r|2?;T-tC&ZOixQ%*e!2%XZWHp=je2aonO*4l&!?=4xM)L%44XS#InNC_XXSb z#xhGmE7sjs7r(ukeXq|)BaFc-{MvRWjfbFpm!`5)-kossY2`9GF@1Wx!`ilM5fYZa zlRy2Kbo8&9-fMP#_CGesjPDl5y^_%s;An3Q@Z046_fk=<G~44d`bqJt_VvD0s1fcK zP!F4aVUnG6|J~YP{WS*prd!-5?<zW@WYSe{usI;H@q|jsME*X>Q>vwclNs`Z?H?#e ze$iMsT|8;cL`lhg9W!_QNn26yO@6P<)|mSaiL9y9lf)0a6nJVdL*RV#s_PtoP2F?f zESHp;pAc|q;fjUqmM1i(f8GCl7HBo0?(<d3{QWYPcYX5=rZ)+R*1Wvtv|g0;spOS= zUD<b{YdqtRpSi9c@+>8LZ^d@E2j90_$jlPp_6pN)v@YqYd9?P4*V6NUo7jJ>eIg(| zDf+s@N%!FRSkQ>6<<gA8lkVRxE)G1g;y=e7b$?%1HQA2Cml&V_K634Q@TG544Q1>3 z9~mEcT0ckspm~Qf$H%5RQHvRTJJwlUlA2{16nn1o(Ao(vFR1Uf7q;T;iJg{T9CGgL z%KB}>u~Tyx@6FkCS@OoNEoy;(_RN@|Wcuo;*M$STZ|||4s<6uYJN5MYrz>7+*k1O@ z&-wp7!RA!%GkHUgqn>BEGM*)rZ8+7eVE^MZzns*k;8Qjq*_~!bOP^YH`N+mATXsIz z{qbB!#K~lVP}RE=X_s=BTzj%ejhS`hJP#?K+7H47F$wk(KN8k&o*@*oH-Pg%b!?xM zi(=qkORgO*yB#lXbMM<{@laywripr8vJrXr!t$PGpSst+Jm|4$>BfAn)0a+4PF=C~ z&a*dhUtDcw-kLK}>e-#s{_=sd|NVF=)XW)byMW2`rDn!NZLcqR;T<^(Z!h2SdAX;} z9Nr`A{$8Bp{<d=4%D*>HAL8U@ICfLzpZ?#3n#Ktai@ARGG-(xIInk#7_U?x1`n&d* z`F*kRJ2m-Uw{q;xv$4S?uWTmXnqwO3`1hUY)Ya+1w~sB|W06(8XNs<V=jNtjj>)y( z%Zgsdyof$|XtsCm^;@CYZ>2I%{yKeU*`%pro3*c38Lzun@VRaC64`Q-0?S^TyDO%P zO)8zF;J#M<U5)K}bFP<Kca?W|D=2(BZQ)nu{=ktdNOet#<vGU2+q16p<OJ@S;P=<n z^5SQ=D0k<q)<@Hh%{``d>dA$L|DL_w9uvQK)q_85EPcPH9$viZeD(epo2H8CE>2i_ z@#XYNNm)iK{d0_SZrnS3_^=jeZ+EQQdP6O*^rFK%W!VJwajltlc0vW4E_)E?);-rf zBg-|OrJme(^}?)OY){QRSiT=I<TyX2Iac=hZX;6;?vHznvf4gh_FdbT#-h8c{nfL? zRQ-<~F@Lg^e|RgK-r>pI3Esc{=cxd%*UVMd&jlK0EOFmGWz(Dz&08!%Cch@6v$ARL zF|b<uec8<YPkWudWiOuU7V}9_sB^K4(8_7zzr@_`KU$yh=zlo7s%yK3dAsz553`ue zCdj)L8C`Wc+Z?_~H7<+G{K))_4+c$3FKyF0EVZcS_Mga53;j9KWihLh6*jB-7<xG< zeqMQUMV4r4=)!%!wG}RL)mqOBFFo7y(unu$2eUbwH!aGZ#(m^Yt^RfGFW(gy%f6&+ zztF~UYEHOE>*)ozpG`dL5ud5oqr>*evw?Tfi@O{~mX-d3`Lh>xJmz~DGq3c#-OC)q zgR3k>`VQ7QFfyE(cQ<fGBdh1R<i;pZ>9zt}rqh?Uotk=If92kbOZNKpeK~!z@cXY_ z#UV197Przb=ABHKE|J-)yLsNkB)j>RK?3VvDJ)=ad@%h+Li@_~qQBHOCr^J9&3iUi z)9B}%R4uKX{L2AT?hE$mXE04IJpO0ySplu~gt;q><@8>E{P)tc|1sB<tPI|$as&CU z9&0(JQpsg=xjiB{LoU@M&VRa6H~Cm3Xjwz<QjK+)g#r4t`_C(harrL~bN-$Dwp`Wc z^A)p{{jW_+d0v$s-kkKMB+GP*{jIk2xmy0Y$!2?Ef|t+R%qYE&v3gVC?P$;>>_*=B zI`$XrH*H&r)4y*#lYcCTWx|S#gM0Ej-WKL*HfD87_r_j0)@ad}^Qc5LyXpPgF5e9i z_pb0yP78P3!g9!BNAbFS55Ir5z8-P^LHmh$?Vr_h_fG5V7P=t(V(Tfb8^uAVw<<HV z%uraN|LmKBpI(Gr+e4L(ptjV_%#o*8-dvvjGH1HfEUU=pGpgd}pFCl%qqN7FYjNnq zsjC8Jv|ai1tar*9K^cK9zEhv=TqUt)&8gsrJX5EcPnSxYtWo5Upz_b^j_<|@y~`2a zD>sTKUCmeMIc43xB3gOF#Dv_V?-<N>&OW;P$fSQRYdGy1^vgncruv@sVn1+Wx#xtt zM;C0J`#3K3ldiwfB$IhelhhVn;4QvV@!0uIQj_ApN$yLUD^BgOe58I$Ja+D>ox8nX zPVY&{)0!Y8Al7qzPQB;slJKYU3D2ZC^u9k@cRe^c!}qFDbziU6y(lids!J0*yX8Wa z7Cmu1B_^aC9FyZ5<IMYV&-G6GAHQ7AmVYj}$K$qoiRjN(%?*dvXgz&h!L7&han<K_ zcg)Y+d>d$3c1`Mo@~P({PQUK*SHExB(5~aZ@l(_J$JaAe@8%xe$J>0{MJ=G<{txAZ z2M1~vxgIL{T)N%M`@!B<?%H2-8+Eqs*r*!#e5&&C>-~-!zn&>J`(CK2pE+ND*`I4S zto5Ulk_^1w^PEuv?fo&;G@NXZaAn1}tBKoRyBfrqa6~qCO#IQ%>s;|PSh9$1>u-yP zK`u_`{XChL#_SSY_kRBEaGuF^*X-WL<R1QRz3G<FmD;MQ`%S-`4OEC(xA4ac$>h_n zug|+FcU<`-KP5z{o?kJ*YL@S>fc(ssA9GhSHswE8pZ>kKLqC1WeSu6r=f(Y>4`{54 z)3RUUz4TEa-({w)F~Z^zOzf5aidO17n`ay<V@fQvaAOHd*{sT(qoh8GqxG`NKeiQ5 zjtD1oCnyGfT;Zs@c_y3Kny!669~XF-{$(g<T|MbwrEF)jm3K<zegn_VG51rZHcQ`H z7|pY}!<B7q5>G>`#muz+8*BGYnt1Jk&hZ77q7qx?aFjCXIxNawY~UQ@^31X3$dMGm zkYusjg7+WK(0(PcEm_0F^@Byvo8Q$Fj_gipO8ftKmRpvX;L{-GfIL;1;)OhNPb}Uj z>zKcv=P1*A=(dgNkq4ji`W9Y0d9(0)@cTcHc2(E0eYoA$abGEXwbr`eYujfVNcE&2 zez1F@#Rh?oUuFNkDqpPQmaBeu_iXl}%V+lJUU;~*E<*IpF{6aD`s(NX;|=CNpBvt| zMlmUV+pjvo<&v4FPrv>!d-cB8f#N2WO_`$0qgIAhyRtP_*=m03V9&n5EZ@x(IsNE< zuis(L*<rQutk3e3MHVo%$X!2tHdk09?)%dxEM~`bjJCILH{_b2TKsfDqVs+CORPt< zPoF40?BMb2N1#~erj@p~m(O0^E)^B0kf<Zv^mMOjYEa)x$tKSBe?_W?M3Y`9I4LkB zuXO^gA#m9-$<(pqDSyR|2^zB;*J>0pADZI&|Jv<u!9H!Lv(uJEsa-W(SUWYPQ0L-y zsacAGQjK-7tba<KQ|8}dUN`a4J3(nDyDjI=%)Ng4|K$~xKUdE+S@G+XN<-;WReg?L zt0jI}eY*^@F8?VOQ%TTalD=I0AiFlDXDg@3bF~uZb4Qj5^u6KhT3^|atiJ7QgMonX zdv6iGl&B?-bqW$iO`91iXFF{bjBH|!zot4};D-iR(G`ua1q??&2Yu}hC~{K#no@2Y zndU$3yN>M2&dk-*c)9bIb1ziwzLJ&Ez3#}imaXfLaKAeuyL0asx9XF#PH|;*ZGSoI zRL3b7BbF^T<;!$~Y)n-zZb{sAluP^^??v4wO6P)gf6O!z`?e~2&9&|67j#v!ti3di zwEh3GFspE1neyzQ>YOR6vfK@;Z+A3#-v2vOb9r>%zElO*`4xtmL8}+)PMfI8ROBb2 zYE#d($>Ch#+eLzP;nPk})XtrD{pXVEyRVt}&Ehpyu6Hi;oEk78`E#{etH6#4RpFln zes)g(ync7ag?%CGU!<_L^d9`x>-osuDSS(bV}aY@kB!p7HhH3N_CB0{`_Qj57uQCn zt=(}eq1F71;k7ln>(fom-7ZcPcG<jHXsgsMt3^S+rfTIHTlQ_9{(Ps{R!NK4tCABM z*EGoa-j2z35B(M9oNagPS%2E3k1sy(iQEVch&i})#nl_zZ;8%L`Y|D-C@*c|mp8W# zpSR93ce(hoZ$p)Jg!q&)^=-G0^dEYe^Cn&Bp7ALr18au|%qdpAhYXoDqpzrJsOC1Z z|5JTmM>S^?<I_zOJhgt^n0>{fqFI@vD^%^`UB<>e65fIVwMm+{Kh-X_=-v3p<N*(3 zvD>;=hKfJlh}WBJT^Y!qr<U0Dl)0dUd(PLVs{@>iJD%$E?abjw4LdAm@y>sN(>l9f z`q2gQ&U5(BJ@x{%p*Y_;9q4J(4-uMsXl@Z3x9o<DuAZ3|c7e-Ox4)gCF0B~WHKBY> zO`zEJ-Z0sns*kKcgEXyXthagX`BqbUyH>{c$!j%sl}UO%DoDAv=d@dwVQKxGL*>3J zG(Jt5HtlR^YL@AiV<A&wWb>or4`{G;rdNpB7?g{pvziFJ%rjWw`<KNl%2{K%Y4pw; zum4<~t1fd_lg;$qb&J0JL8XE(?sA#Nh2^nr{l9AJEN|(G{Ys`?_mtT-sH|mszBVt* ztNd4VVDE&~Bma-Y6dX6@72EpTdg0-!+cw$v_W$)YI5JoLd+t-)Nwc@_-D|sJa<jDH zln>EX^KTb%MO}F<+j99p`}3gH+w+f>2K;f-Yksvn*-<C!e{Ayouw_>t?0I=;o_T&` z(Cx-IuHHMQ?7m*kdVX`jJ%%d%GnW!<CNVJnUSWCfxJcCh>qcDy>+*vqPn~ylYVXGF zo?=ON{wa0d_#?_AxvY@gxWDeHwZtb+%m4a+xR#~<0R{Q_D%S2JCR6Son6{&-axrKo zLUoD#Tve0*-!H7Wx@qOlmF4mrPfz;Gmd3BTd&2Au*S15dI_cJLXCAw3@>y6XAuuxY z{s!*3-;Zd|4Yvz&-et2k-*k&<><gLazjt~?+C6SPw_$r@`z85$-Js?Zo0s2t&JedY zV?&q2!-Xk%o5Nd{PEu+TG`#)bV0*oV*wdd=3|9&|ehvNjUt`$^hgp3!f(*_le=%R( z9=X6yQmR_@3rB7GRhb=sJa_f)(~2^=`cI|eqhHosmFR+i#s0U7!c`SFD6yuxRXJwu zSh@K~|D{5?%@^-(m%1etvRM7KTd$#~m%&jT2X6L76JlaJqk3zr75!fQ)bltSGVP?? zzC$UWwqJW>CdJ=Yc`wc2#?|TlQy$dTT>8gidhG1-*n<hVp+(-|=cin^sM;s*Fg5v* z(zT2`5^CqwJud~lTs~>*4=?qD55zY<E0~y&aV)=1=$P@r70338ZhKn0V3)(w!&&il zyM*dXs{UK-x7lTsbn(>uKVP@s(|<czf9_8I_<8k~)=lo~&sWda+wJ~&p6iTvmHZq= z-19Aed`-A_J${|l-plu^md|~C`rX1;Kc#OS6bh`l_-4hob%(U8W^It2vOj2scHaHz z`<*Ta=Gaf$zew$3&Tszv@2Br)Dvrwd&2N9MQq}zYpJNCA)g7KV=cmTG)sgc9xOZLD zh$|@w6<PjXGJdvIqs`Xpp1WM-5**KEJ%!AFe0_JmCAUk<DlQ`<ZGni^1NS*`bK*<a zTXP&)#oQh2>C$%M45!pojccFos|ZE>d9|unjg_I}t@aF+->yslNHE*X<y5=Ie&U_U zQWIs%9T{dXHUDi*{c7aa-L%L~_vhX@r&?Dv|4Cha`m)@oO^-Z&W+s*DhVpMeu;%lV zKTp2JYMMUv74<*Mu=d(*wl57Y3XeNJOOTssBH^&%l9Sa6v80WkE(xx3@A$e~<LTnY z)vT{)vpjg0%_>~1Xvwg#(tGo^tCQ+&Z!9{s@`L}?-MaZs(r!TqIo7UxF>^xA;RLA( za}Ayu2*rf<-WFCg{8Qo`e?i;hVB&<%)&KrTJY|~Dc~taMsf72zij^}jC?A`+ip5i- z%6#pI9n18eFR?0(Sh;kb-HhK~R_aGQVzysv{<<xue|^){{NrT;ms|?W@6^0pbX_cX z^}>}C<Jxalq&m;Nxc#vG8;{$6MK<(>@4h@sne~hImvH3<yThNBo_N6Vr9M&j0Iy-? z0$$~%%8HXaf@{+g9=GjV?bFP{zkBwqQn94g4c)FBZjW!Azv9Dnulm89)64cqoiy;s zvf)0!mi~D0hv?obeTUU&T)T6{<#^VTGRgCc9&&xj$!d4paVa1->-b{}zpU5N51%p{ z7;<l&x?<vjmZfJ8X(}IG=d-r^>*eXou3k8~%Kut^)4K}|nS0&zf}FE`&TU~`?=QFX z_!*N~(MhdI98&~7=571C{qNlOY|&<>C0t%-V(JZMa6bI6k>@z`4A1X}zwg@JIrwmw zA!nPS%DMygd8&0eb_E&?!L=d>WKa0ZO+U9R_e{;){=W@>#BZJr*dP*L^ZM}9DI2Yp zdGf>`YrB8&ORwL~q#ZkCo!_Q6JU(Ny!9<ATSwzekmcSJfix-~1W_amVtkAwK-!9*+ zb<(kjVUxVM;97W~R7q<+lVz}XP^kE!{KTlOF=3KhrJ@$=aq@j)UfgJNhV{Orto_16 z{=sEY>irUpBGG(X1q`cy_jAbomg~tm;V&1u>BQNU{}tYCie3<RZ%&)wzu4Q7YxZrt zsK}eIY?S#UI_1ENaKGDGcVd%v?e+|K(Qj*C?in8c<@7#@oKv!UB`u?;yTv&FUVQSV zP*zRSclmp7ySF`^wmU(rFF2G-hg)6d@MQmE6X(wGsEvrapm|~gzr2LGTYp}U@_h}> zA6m7aE<NW?S$`t)@Jgo$qqSF_tW2DJEK|x!<BFNYNy8JI4YKc6Yue4$seKYxcTH;Q z*+Z8Z3Zmt^ZZl>5Q28U<C-l2baoN2Uy$`-$uCO`HG+Rp6U97WdL)kZ(H}(IMy}dlI z$W=afT<B#o{bQo3WsujM2j}K<S<d15CaAQ_sH5_0l#qXdc#x!;*6hp!hh{ERbK9z> zRV?XtYU@R&sSROs{;)d~2_&4EAJD#Y-F8Rcf|Dx$+DtiuLxm(JyuQ#-y5W06a_x3= z^_rcAXZQDVh#NW_axRZDVvb$mcH-pmjz`(^Ywn+$Zo1-YNBNg6-#x{$r`&$F*X3IG z5usYvOWQpkq@UZz>)a5|zsT{bz^t9hYZvNXo7?hX{SxcF38E|A7ANxNHixK8)3m<- zb@gfw-L=Y=Au9V`>8w}SyUJs|R#0fxJa1Q{Z=d$h=o0a$^<d}HShjs{bK~a|LjSlF zEN<`ne%U|i{2Palvy(Rbna{tcjw5uk@ywErZ8GQ1D{W&`<m;(dUafn-eWk^Z?>|+V zCG!H>Zo1a?mI_2n;eYjRf11VWqQX<f-?aR^S5%f(pUuiRuj(f}qjk<5CG`*Ux}$j4 zR!%$``imoki9JFi0kmr&w>IhEZ+VH^nopX(tLJY&CA+Jz%|$d}rt-<nX*J5zUO)Xb zPpbBf>6Yh@Y<1c_r-~alEo1vB;PxTv%Cn6to`M!iNUJl)b~OB+8{BI8ui?7q(Pfr5 zK7K7QN{PR>?)y3}>u7!T$CH1bI<aTh;p(i6dKNdcCP~c=8^hh6C8X?JS+sGZZ)!?i zsO=fwwQbuvCZ3%9`_#!jyPUbRGkOb+Z0$lDIu_L&?Gy=LdfWQr&x3~>%@1ZA`+7}a z_4Y-a{N0iQ)8(fp_m*~@d**!qLX>FMI_Z;lxx-2puW1pQs`ItvR*A)@CIOv_d%SB6 zS|u({*uLh}gR@09^9xs4<jh-~^P2za`R;quo_z}V>LVKYCrtNCo59On#+6GhZk5Y2 zH8H)k%eXQ`?}5I*T#>W#TI<QrBT_dssLOx;p?I`F$NTo`nG@pvEB(JEaB%g-hE2OI zczf>1CO=_dR=IM#(1J6O>A=Se&y$+Wwldu5+b7QY-5{F7RpDOn=GHjBHIr<6*d_cO z{H7k9D}T30mBIL&l9Y-=^C96UmeH@WE}hW2a{Rv3>4figEJ^c9<UV{%U0(e6wyQe3 z)kD8H_R6-7sHD43#5mfMwjL6k+7!lpsz_$xnu^+QBBBKgnxtQ;yiu?FbYpT1GnZiE zErScQ95gD8x)1E!oBma&-FRVp!L5JypHB~Job}_srb|{{zQw(l^CaK51Wqm2yLG*N z{!{B<d*SPcH{N)VynA-oF5{=x(JgD46-1i;>BuBM*!!MWUb$X~@5s(BhVPQ;o`Hup zHyu?xVjd~ezuiTiE&lIqhA(aNe%zExyQliGVog`c>CoVijIS$>vuU;3PF0)KVw-qx ze)s(gTPo^rawOhA(5th5E_iL8kAcLBu(s%%R)6=Tw(2nK){mImvr5Cv^yAYEvt=J_ z?|u6haf0#2FPTmJOJ*i<ziVJ#C2ajcc}0HshnnDnYEOLS-~7E}WZ#hMv$1`t^52B~ zx66+#%RSNSqbCt}az^>-^BlFWcV76H-OjJN(;(a{WO<nL=3i}}($|?(ZQD0-&gP}} z<QL}i-o5!(<bc!rPhS@s{nu7wx%c7ajZ2Ih5?7VPH{Vk5*f8OnNoT%r{iLdlNyo*X zFmf+8IP4&MsZ!9l#K3!V#iP5w`@`-B$WJd_owmlU^yqKflhyNI&gr_w`a)^NRo<@3 z(@$<?&G$KUdpFPONlssRTIb*5cWY3dCB3q4?(2^$ElL9ZZ9b|f^m_B0Co2E9eVn;` zM)u6RM~-+`dcRruXz>C0RkmKoOP${s`0n`o$MJ&o9&WaH)idW?{Y9ToTNdV=?PIz- z;Ar}<{>TFh-eyia^W$0HIa}6}C0cJ6dJCu>U#3=KWD@x6;^HeGmRV#!3KR5~WQm+} zdrqCWafalI(r0t$YBApX9XL&UzVg&<kxNe8pBN~y-s;>$r~APt`SxyaTDoUy$$>2n zd#n3`F3!ufG)!fm#^!Z2Q>OpER*6w^>75_HvZhA8>74UpK?L)cTYo<@^_emK?vm2@ zw|3FJNH<W&{_|JaP{oCxC)rQjQ7ll-kZ1X``T2rlyZ1hQTfMP|EAG>}OH*8B^|DRh zO=#Y0|Nie%vn*4S_RGJLW%{R{-{td0;>DI7*W-7j?Bm*`-}SRzY|s2nuct2o`P-;m zX-XM`n#3}dA9IBIxfmlvb!4vyh?^)(;^6IC^!40-F@~_j2|gE2uJC&NNNn=<HYHOZ zaRH-!3U{`vK1zLQH|?bMY?Z_?VZ+``-YJt+f0c>dsjfZf!erlciTh^Lp~t=7*G{~! zxWZ;i^Wur#te@;!UfEBXb*p`?wI6eEl$cN5zVgzVvff3)8}oMV3;&q$@wC7i(LT-j z;+@ZIycw3+1{6(ypLaTEVtC{(rmd`-uBd7hZQ3G}6=LQ&qhIDkoDAEpy9=1p-S?iK z`z`SKr?a!`*;h;#thxPKGyB8yxPCb?`R?|I@BhoAULcw?>t3233j+hM5Cel2aTkb| zBqiln=w*b4a56B9*)MVf;m`^eh8N6?OjpBi=SiCj)LswwdE9=ZO(~v9q*sciBgfJ# z;YOR1$-B$bc3ZDbJ**l!NxSm5``^BQ5$QX2?FzaavU-tfLi95|{^w_&o_X<P$IjAA zR+eqcuJP!8F3g!{RcV~TyO#CVR9Bg>WR@DCPIfa<q2L~G{XHg9e0L>;XP#8~Q+?&< z_nh4Zk58QneE0Cp+1dH=bLY>Sx3#fuf7^~<Ra?9bCu;I|ufDh~F(GM-oSo;?#ag!% zO1S1vn14`L>`Ts;nJ?;Q@D;yQn9SAqua8wS&FF)rUbFGGXX!pQxfzOD22r5`%2W6* zf3u284C)fk|9pC7$-PrMzRYl18LV{TfL!jwZFe`dElX*-l_;H;ulK85{`cI6k0;bz zUajH1W%{luRV?>5D8BvmY8CIXb$51mJrnoQ4sN=l`CN47WN!JgB16Xw8kZ7oym@yZ zdGdWG`R6|ie|QSXR8NrG6tptSn`OJ(!iAz2W`!&X<6dBSWOBnbnd=Q=LNh`SXIz=L z=!JvB6Ae=lw}jq9de1%9Y8S6GTpAvve5CEsiAWQ7WlpE>+ZTUVy*(?kc#HIT(^nH# zg%o(EUK3Fa*WKlMbCI0k#-39NN^4A(E^hKJ@;$lk+69fvb1$BmTCj7?@)aV}w_cHR z|H>P5*nehv`pfAHGEUo-pN*SgHa&mswZ=0mf{Z&BtxjBD{$C>2J@9oy*$waP*?-pg zh0IjibM{YVjMvn%PvxiYu1+j5eeu2B-tNod*9~V5Xh*YW=>Gic>bB^a=am)jgF?iF z%EcxbyIon(<6-#s+0jQQnimxW+;|e)k));Dxp1RsYxIql0-e+9?xyOkkNQ<o@+$Am zj5@I`ruN*-$%UIPJ5E~5H-E{Q^BtxaUwyT|bI0}i-|y4^9{j)X+5I||_ZK`qtP?be zGPdnl!L9lt!lukIJK^m@p?|*v_iBB8ml(UT*XVbh*bV*{i{tvAov!b@b|A`NugmlZ z%X__Vx^l%!%Zp37S1f;7nf-X>tSt^NDyNmF1<RWYr!G@bJAc8$^UIpVHqLH?$_I<$ zP9>E5ndRqOF>PsOdz=382TF4}<|h17zuh7wsa+d)z+}2gs+g_sAwDIi6-qyrPC1z_ zrLo-dWzr1(<;(I8OV3nmdlIqC=h3`-+k#IXmY+ZS`<Hv~_y5)E6nUv8nI^c*sa9?G znHKhd&3x_t_cm?kaJcnBUhL89U;pO?J#m}-yIgpOuMqoPy*=$4AL_~9Ik>KP*%r=q zPmYUUl#1Y97P5GEaIEi+53WKpUKY$0*T36#=!RRVzYn|O*V)Ot{xHcdYdF%f%c7Nu zRdj~7a9&#d+_TjQUYl;$*X)qz;Xiyl;Z|VwVj1~$Idb|%TkhUsI=}c-%#r@r2J*G` z*|`F<Wa2BzcS@wbQf!~UuCMCr>Mfq@_3Z9T&6`laU}oeIlc>`4__HULPtlImsQvb8 zx1_7x%FFMHpVgz?Wn56!y7MwC14F6=1A`{9MNvu`j*@6^L~j0VGl75a;tR9w*YL)u zm$ubr+)~QRS<Ys4ykP6rze_F(r4~-sY+f>n%lZHBcN(43{s@_`2x2N^dG+H%+`Qe& zrB#>iS-hPy&mnrTOZOS2o~lCc3|-!Kv#>eUKW80IFl*EZJ<!yUt@}ji9`AAeFSFQ{ zgcvgx7x*3CoYf{d@znFZ$1lItihb^-lg#{g^X9tgb?4u{&;RzlJmLwzgY>3o!KUe& zCqu=by=>BEp6?>`Ipr#=n)8n%FJ)^UXxD6ibGQ52x}|YCCN4@38~$JC5%pF!Fuc!_ zzV=dmMFN*=xK4YBnx&3K%B=RgYPYm_4ed;P4=r49Lf7c9^NExWHlYm<vzGF|z2xBS za$xDR*dGQvrF`xCs_v!p*M8P(SD5N{qGv`@P|%X-oVn$UnOkmd?@ODrv~pJC1jUaW zS375JG&bD*bb$r;+N7uVuJzT{ZT^<wy#B4cQF*R|M8_tTll(3p5=5e;#MYkey7JOS zR4_`a@qNFokJtab@5|>sYMHRdu)WF1W7CAguTOjtpXqTZ?oXMq^|wDCYfL`vJLC4R zn%jHD)|Ja+G<)t&=8#OBAQ-WAf^wg{zM-8|<Z)FMP43Dcr-iqtOe<(x*mWdadRKr( zO3<pJ3v*U76p9q~bNTc<T<V_EcyG=1%!5tL(cd*q7l|nMaT`9fjq3c;dBHa0+U|>A zQ(o<t=WSbTd5&R=cvEoqH91S2Td(_H$gY{6AMJR!QTJHCfnuq4hAvO~N_C$@^=Hnt z<$07z2$x4WW+z&BvvccI>KNFkyqUIi-T$QOfA5;MiLY&as3Th>tFiH)A=~wm&Ab8P znu));goDIOTi7{+zpZiny5Qj?jmc%L?`)?neS1}4ji>Ixg-PG|^>&^KTmMFxPp8Rv z>bj31lY<Z5@o1eLVfm18TUf4E`?}Mm4yEDW&Ajs?Cl$U83!FXkY<}9}o!^gcmrbrR zmOZGg&hSBeZG*AawGyL+&5hZgc)}K0M1)D_ZM)TN_aX0J#)5D*AscP~B?o+VSuvT+ ztXll~;vcy+pZ|5U&Xe8};dLd-<M8wtS;xInXWA#fd~mq%hR-`jwYG_eSF#4HoYu`U z{1W(R|2f-v%RjQ6+r^%;=0DfW>Fp_6*BAKwpU`9cg?CPH{@-njUmjijVfLQOD)Bp? z8WtU|kUFBQHmUz$YVE^0x4V7BX87FvUXk#W(@XcL?)0r|{nEo9tNFfusHKp=ebYWO z>!*dE=C^yV#jZT8J1>%Y?Ph-O^{HQfpVd3?!D?d5Y$u1hj1Bj?D>rwU1gXCc?0cuP zVX~`GxuXlKmR7~i`6r_%q-vQ4ut#&&@N850FIIFQL_@`U)`cSV?*4`0nZ+G;)_*dW zRqO8US}Oi6R&AxISdqhCq1P1x#-T4f?e=QiPjsK*QG9QGRn*F|w_oRf{XX@kxUBXE z-c8+iQ`}AE+pmS{um8R|JFn)}AFi{Pf7nRg^M7yYZuBwQZ_2WLZqE~6OWRCV3>IK= zIq~sQ)`zaH=|`vVEIYmWvFWBwb%!<_?~9V+*m=%urTE4LGg*62IY)%uJ9X9J(wQrP z5dl%hQzt~#N=;b$Hej#o(UW_$r(3*~4J?{?n|F5f)r+F>ms)M^_s8w6<@mMqQH1N9 z?{|II?l`}2n@oRd`i4h5{Y6%r<ELh=PR)ub)ZbS>g-63K_s-H+@x0}Sj<{+RX5Vd1 z^1l5wb!TALtd-UacX}JAoO|*4P1-x#&HZ7oDxWhfUUO!KQY6o<6}KCm7f;Mrx87L& z!%KYnb9?*s`_|9ROP{*>^Tb2HV$UpWUs-&kWpVZ2jdOmk^Es$^^Hi7lFK*v^ll}ej zvhVsQyc5f;HMv;cw=nwDktrhA`VOdGXge0xrD}CoaO>Y??>O&BPj!5Lv4qnl`f9Dk zL2l9783#A-V|{t({yA6udqMF(ug(jdY&|VIS~=GC&gIK5Zv33!vRY%?+%)&#+}#@+ zx87QQLq2A6?WMye#p@P*S@c>l_Nd3rmltYvwe~4rJbi1siMGdl*1$>g{<EXDT!sA- z4}4`~U@$dgV9+79y2vcaO)S7sW4w*Z&A)BI^Y32#!P|CUSRHqX?oPZRdid9*IOdYv zi_bRPT^_RSX+-$VPmx8@@2|^iTKC;mskOX)yDRKK(D_LjK`Qb=Q_Re7WzW{0Eqx(O zd&SRVf@&#+_8HAl-fNeXO(?KCmBhDFFlYwPACscqfQfAJst;DZ=u&rc5w3WBq>z8x zoA=hgPb=};J-FNxrMHqzP;zRy;=~D(5tj|iTlHhywp{;hA9Kl8G`({M3){APdn&Il zzJLGi`|5&C?!mXy!w)qF&T_GNd2nV?LGOdr6Bwr_?$e96{CZH3e`Ee8mwSFHvaC#{ z>MHDiq>WR2ekL&41((iQQNJU*$jy0LV^<0r->rscaqInbL*!QV#$8VE&zQ`iZhEKL z<WqoyQci`?tJL_Ffs+qCo%qbwLh2oF-+A`G7q<(pJDca$))qEx(!zx=mzW%@vwF=q z>*1T-p;^nOm;`Iyn&bYg^$kl#!56iJa2cU<Hm4&#=4u~bRJ!?7hV$KT^Iw0u(O~dG zFet4&>J3wtuBrE0-<s&iO5K_%SK2@RNZ4X6Q+v}=R=)4J_WF-=JAS;qZemxI`l|58 zx3kkGbG`i9?7w+C`{IuWZzdT0`dwmRx8+J_#nY?V^Hf$G3b&JLb3E)I;}WcS_KEH) z&&3}<ax6)b`(9Ta>SsB1&cb6gg~_HbI$3zVR3$Uc35mZ{Noi^cX3Ux?cTwU?&c3jn zhB`mLh*fs15BO*y7<zyC%nVmMuim7$eE($R`uW+de>WS~FkhIbW~RIKTh5W7+jh^z zcG_=s;$4<u$9F+i#WKw}OLt4qrHKZU%qMR?c6;4a5x#m`&vF?TyJxf94uw@{yQ(ms zUmC{ua7!J}p;E<{cGvTi9;J!JJUn~MaqjLGUVWc{pv^jaBe%%S^|&S1X2a@ZrEzVy z?r+_zCU(!R_paP}!D{pUM3tU|pqk@TSd&^cO_xS<O&0!PV;ttve#JENkoeAg_ep$< zCvTBdaO^do#xC{ahhW*NNkM1I<rLIPlr-0Ud~o~a$(tFx>qOFizt-NqCVy>{<OW00 zq`&>?@1}3LoaME)_1et%MKw*?MTeapmu)_+)cS1JgRrcboqEfzIj#PYdS_L<*FzPa z&AG3qn{hu8YdF<s6Le2C-+WTiWi8*BJG}QE^(riWp|wiSe%AKfBgdX)t@w}@Ve~L< z;S$&D=O=yXQC2d)lXt}+WtZXU?fL6IotS>l;e_O~Y^$TPJNK#kzBS{!usC(C95=_u zoaccL#a*@UEZJ`4FDdMwoApt7`z_aG?ZsT%iuT(7_Aus<Rkf8fU3ksuwa%p}pEl0y z?!WL>`Akjsjbhy;OHRoahh#l?^z4p`&8!&-rSqb6@^)OYXy#H4dARFD+T!kW4n77Q zqVp%-F)v%NxF;}i?yTf&eF-*UzUd(v&brDLzB|5e{ys6*^`Iq7U4_gW9j<A=)b8<J zHGO)r%WK7oeVu0>HE6}`F;ITzxIpOR+--+8cRe$@$7WvGRM0)yg(dp^@At*hnq0q5 zr@ZyK^k(9uTe*8rubO&$xkBdaYVGAcGXJgXD^AMI`naujjnCtx)V-UI9`qId!p^MJ zqsssBq}&=tsZE|O*(JJS3wFsKDqg!%PVVZ;hfyEvgVi#xunW}fT)WZT>YC^=MZINf zt>*CU=j}Td@Ar-UM{!LNf1Am)k{7p|=VZ4{QmPLAzb=gJis{bXlNDuzo9l(d=6I)` z+i`ohYp=&khozU8o!EA)=#!rx<L;WYv1|8^8uiBa-HRJ5@7<d8<=>y8S?pJe&scBr z&U*T#SCiw8;ir(7e|DP8YUi1k_-V7h>-SGiMao&aTll)=cGj#Zv7Y@Y!L0MvcZ2`j zVt4o*oVS%T<gDAGpmFx{kA&x~Z-PV?+IqeGGpC{B+_H;jd9MpRo*mUBRv3}|_q5&X z+n(YZ4e~bZ>Wk+M&SX(i3EYto<fC-x)YaRG4^%~S&)nXkkX$KkyNKsAbA`63{nN8j zC%zmzq;v1;+oN&%JNmcJP}O;IEN|Ag5Q(HGJCcl^{yg_W*Q(`fbNN@+iln8>gO>B_ zTIeph=2Yz|H#_jKnaQ`f374WQEGurry!c$Bqg{KjV?s9f<&cyWfs1#xT%G#zch`d% zGTKiRW3Mepj_?XL-qo$Vbdk5!y<dB8Z#p*V-_oBl@fz#&m2QbC886)RXlqCjpSAVl z-Z?K99e5Mk(&d@;kaPN}4c=Y_p>@@rk%t%m_tPy2Js+$swrkIdK)E9O9b%t1b1lDi zNiNd5_4ri(#7frEpC1xKPCrd!d~!2=*R@`$pzMXE(_X&2%omkfJab+51J~<vx!Zp2 zEED*1Wb?`Rj}`e*+q6FQ?b7;G#1{K%_v#yeCRLg|UORcyRqr#(e`*R8mrFg&yRXk! z&D^uEXixmTptJAS2j%~j%eRw=f1FVDj~}&8HOPErRIk9mF#S0LgEo<MYI0(7Mk=l< z)%I`xZI5;PzptNhlu6vW;8N~)yYE%5n=>yxTj<-RcJv+-|ML^qEUvBAsWdGTx_|ih zeR=ydH{(fv1l_Y<M|1CZ=Q>S;ul>mcnMt2Z_V0ZCa`N)ui&lC&OFuoFU@@)zvD*UE zlE{qZGpB@qUMX_CV@bf~##yUl{9N39pBhNH9#-hTw50mS(L!s#<)3wSNj`sc^ZvhY z&zqmy|M{>+{lWd`U*7kBc`yI+zWv4h^~>u2E3tjH%2?lgTSFv#v(Cgw{~8~5qti$A z18t^#T%z8jBC_A(kMEwz!av@o9ju6!e0kL(C`sgK(1H5pj0)5GT=+I8s;AFd`d_)- zQrU|0nUe3Loe~~~!A5U>UQo;AxZJk=<3od>N-^HFojgZ%I1?K<ET-Rd(f!rMuG`mU z6u3$K-dx%FbK>X8#QpuumGSv=49{hi{z;Kj?sV9=x>WsnS?RxI=I2=Ps62No|8ylU zrxbmMbeSh5=`we`CZ1GKIr3$Drc7zc;*Tq2>X-fJZ7-VDts%ZRQs(^hq8#2WZF)`D zmbg`Ydh$DiMOn79?*ErpKVJNJ>-j%-|Nke|J497Cm59&xYx}4(<<U`%db=5}g%uWc zk#}tOzS>{;{dN2HzuQ0P{Q3C#<m}C#|J|Ov_`16M!#;ttiT_znI{xnvpMD@>fqUGi z`2`b$-bB|vwyPF>x>09d%GnZ2X_=TXIa?`)*{p~6RQ$@VYX9T$;HZWKQ}n7A_a`lV zs5a04xDwANhdZu6cO?9M-mZ7$dJymCj8}?2POB<Jl$Nlw1^s0D5>qecR(jy@tIpkp zCNhf?7O#*>Xh@LpZ3zDOHKk38eW{>Jmc?nKnNJk%z6?=Q*s?yM&o5D;#r|I*=VHTx zON?A=nht6fsy~+a->tDA!0n{QS+ym5A12RVD$&QRB3hFr<P+-1&#W_x#oR#2!D3pE z+{tedZa<FIn#}Y);^KEHhcCI&J$4dj;XElvK8Ajo69?x@oE2I$lc}^+Sk<Ro=9}q; z+<N{gd>cOQ<$ujpm*&NE_t*wD2Fqoc)7YD5yqwUV?$xp~<Yb(low~tON2BwZHx4Sy z6^!NGAoxO)^$LTl;Bkil1@;xQd}eSmrJAPAb7WnV;icYQb!hQPlfEUJKDXISJyuxN zK0m18q07G~3+tpB-I{*x;9WH10_%sP+XcmwycYPf-Lmeio9!tPBXVfY<ZEqDPd8Mx zvK(4zU#*+hT%ndY&(Za;6<a^!uANJTbSl5FFPQbD{annBiqDI;6s)j0`{fJIWzIDg zXHG20I$NIc^1_$1iHAO4De`2JVVUe^GVj2AkE%lPGk-N%D*c5cn!EJ*8(A1;3ha<R z?V=LYw#6s&2>+W0Jm)PQF<r<jJjrLXiNVMqm*M5Q3BuDlou4hTI5F{|aygr@REbXU zl0PaQ4O5-Hom{r6M?_8%VSN7}OH#G5{i20;x_R=iSFcSbe#xBAblgN^-V4DD4jEPs zIp6&j)oVK*^ISg_;o191CDd|-&XEfZN`=mm2g0X#wF|DF<xnqGpDy*}vC51Sa!l_J z@6vj|JHgXM(mTblCd6rtoTG=}&*IACJ0?GyvOPn#vBTSUarN0JHa!Yq)A*OI3=%Z> zp`^=j>iEo>A5UUu)v~QvaIbB_y&1+Px+b?fPx7?cZ8&^y{-IBNWh@g4?`vG@<Pka= zukb=4z$Ntub191fOPzP`<w%(>m90Vyr}P=64rSluapCn)y>#Xfqmv-lx$Xw`2@EUd z9ncSa!T&ku$TFT)UsZPaE}oFGSD8PbulmegMs91{K#hh+zwgdtY-{WPw{GUN$N#Dy zonG@_P~_d(D{uI2#V%d2|H1yYKekccDZNYXH*};Wd_J_RNr)>e?9i#ERqn6*O!#UO zPhH$%(qQLpnVRU&v~8K6<I=N6vrY?m@EA)mZZnL`*6iXruPeZJW(P;en%JdAj6JML z(^<K;_;_BQ{PqQx`~@zSxz{+Cuy?h)3nfG*C2kOIyy@}FcIwLcm%9!a`AIcRIQW>0 z;aFMi!I_>Nf9qQ_CD{5}n2#0CsuSCs`By0?EZ%7=U-LifidwVMc%A=cp3692+}Df} z+rD6;R!`fTLUDumXs?4oeY;%Nf3<Bd?7Pn%ylKV+Kb6!nj|Du9Ivk6?s61|xXXtcZ z-Dsy&Kil=dZ-ux6&gXvo%1^mx&&KmBeMQC=ulZ*hPAq0vVj7*z!P0SN<1EKH3pI<* zyxEY#ay0pzKtkpzr3dC~<&9MIbX-5M=JR~XG;Ut3Ggm|>qT7C5*a3daoxWL3EBF@4 z=&qFW@>?>4X^HjLsVeRd>>evUSeIPZGu_^O=Uk24&<{=_zh<^C(-mUoa^u{$Mr+<* zjdlggn>ifc3t7|GscSpGu8I08S<39%&#=ez+Nlo{&rLM9l95=G&!87-VX)xs1RZu} zC6?G}8b%*JtQEY(6#jI-9M6ycUJuHye$D*V%`!XNYZc3Nk>qO)C3S4I%|iJ{ChMk1 zrX+|wI3Z(kD`NkN1KeBEb}1*l(+w+pYP}%#;6JBnUvn+uZ(h0kkK<TS+;?Uv=F;!n zp&NdLU*8nJg)KzDmVIy7zuo^e8B60Uw+KxCwfpJ8up_IP1SQx1DSyf=xA^-14Gep( z25dDy{ovHEH4N9UeBF}B{_|y+gK+=uYYpE%UwnFV<Bnfn4|i777FCtim6eti*6q~X za<(vgTHbx7E!UWA)?ax1f90C&ulb3B{y$H8ya`mgl*#aF`r0xcpCk^~-`Zstlg?Yr z-@JOk_3Up`)@0__FvQF#<TYDu)xf#z!Tw^7-wIQLXDaOQ+Ta+ea^pOsk5bHv=VH9C zBUvi6tsmT&9n13ekoO4|LEXe#%nJ(Ctuo$(UbZ;lTzs*DRjz%@7E5>go-=bk`@g@p zaHl-SC#RU|yYfd@e$*2DuW8ZQ=kMLOLf$Z8ySZ^1)9+_&)1J@Gj$XSbL1+h0&BhzM z7HxU+``C`x6IV-#pRy`=vb1A1$6c1kBAZSxJ7pJrM1Ru$w6_wUu1+buX5)TlSNzdA zCDnbGQxjY!ck*1^*p?apu$}h_hp%SI>YxLv$%~{M)T#pKEwFme>9aMmCoO31{}dT@ zW~bRx9~9PJJ1Bj9p;Kt1Qp?1oXYTG&2d&<`-@WX@{n??cdfJzN1WK<-&AY12KC98u z;7`uV$d-K#YfZhaFZEhITysIjRb=g<&vwtHmPHGMDwRbYxbWgfM*vfVzSW0EIy298 zHJG@kIDMQfE7M-dGkx;$MVEeTds24fq5^lqw!7c^SUOxJHs6hDnR|Az)u*S8C!gfk zc9mBb$gIscIqTz-f|5OpmmJaPV98_If5iBHe9W1m@)kzkqsK3IpD?^6*U|rEpGeql z$*wa-3BMF?Y%rK_|0085qm<`N6@$TrCr6$Ivbsig>`rI2&@?!GJ?%-gh{fR*Hh-FS zO-YjX^z^=Uw8gU9#9j53faW7_$*{v$U7F8ixvTf3#AGErVX<e;;)vC9YTmmeNmg>_ zouiJ`Jw+Ry8JR4-!Q6Iz(Hs$_3Z*|Ssg+OODgAhVOiTY@>3$>o`tXa=AC7RIW4QC` zP59Amw+l@=QgfrsU+Fh|_cLDp@X}NN`U~3{6jjeY_!KT6on-y&uwI7Qg=`DG-L7p7 z`sdEA_p|%9UhmiZd$Du&zwB7~;*f?bd)=QedcJwP=05s;_uLlkU3v@>UoU?2{Qsu( z|J#dCZ})Y4c>DBvy>&+U3*&Upe~&-sEf4M&XsY=c^oQgB&+wO}@1s8b>K1>b|3UuH z-`U%ow_gnwY}yue^!MV=i_O*Lj~+e$zqF`ktK}A7XofNS@qJ=(!gD9*>PGKtr<X0@ z)PHfAVGEm{bx^tcpNkh-?!`Q9J=b~h(lr*nvuZl|K_Mp^tT&uwYFEujpLaUL%qsK! z)JGdr{aI`_N|@NaHw-EGoOEnz#{Z~H)wgGwE=ae`a#s2@C&BGR@KWAtv%F6tcVyMq zI;0DQEY!V!?Lq8y8}H=$+w$h+mb>0L@1Do<z4q3fd&&)8%%8;_xPMJgS$}U%gzU8k z*Ocyxu+Ocn+v#`U1&a^k-rEYy-@RX|u$^oFuwd#W<r()>rPlUGZ&tQFWNUe(|E^LO zyN3^}<fgUVzpFZ`WHk9^&X6rIek*5E;8SS-i$Ny%l$WK#qNNf=*B|y&EX!cGRxLJv z^7g1F!?NsY%Y@~nq}FB}ZOU1v?(Xe=>%i6%nb-EbtT_A2?{MB{v9;bi)?eV+!nW?( zwWUg0FRN~?QJk>5`^}`u2^MAb9U-E#?iSliEHl1v?V;k&V?Qi(Z5brrFBWN9@4a&! z^GT)DFI$;;KhM(eX?xlG>+*}`K^qJf?0t3f%C3(yyiUziuieJ9w()dqW98(K#|~8s z!c$5fMG5jOl6bts;lk^LAGdW*J&`-gTdia@rQKFsYPoPqkyD}frH#|3_!v!|@9MZE zvn|kQuFvwDSFT#^*l9gs#S)%OQ_b!h0>{LYog(ff=cpXw+4I`xm{CB(^3{UHe0_U9 znctqK?xDXVdh_On*G9UzTdhyH@;Rj@zu&+Y6};o>i|{407sq@&|MtR~<yKNZHQq+$ ze++JUS$IKeN7Ust$EU1YTq1M2`@}kJE8X5HkGJwV3cEfD>zH4sbXZte$I&+Q(bl6v z#=-ke-k8<4LCxyXw>b5$VK%Ls_CHDU)H~8E^hhf*bpDi<t-QSU0gMNA^sEEc_Dz}7 zKUMkboO!ykFB9hJOKJXJV!U3!_K?jJ3;VTK+PMo?%LY$;?Ah|*h^LR(vV!lECbBu3 zl?%*U_&G>?%bVxs-rJR;_)C}%>#w*iy770wv1pxbebXMK71v~HbDG4*+~tk!ihiv8 z)K@`j<qpPc=NBbz{J8G>ov&>j_cZiQZ00fVOfz_Q_LYjoJ^4bPC71XPC3Y*DN(Y~H zXx27RWL`G=wa^14vyVc)nTNUlJXMV7(I^+qxM%w4?F06zgSr=e-ybt&_Fc1k?smN` zY<f*?v!nn2DfswtRr2?pF5f+mvc0a@9ri40TlLcIWqYd27S>*n-jbkO!(6`dRQ`mr z_z!NX>5C`4biKdfcm6Y@Rml(4y*|FG)i%C6*VR9AQGe6516OCc)*CTKq+BfKa=p3i zd6%V5%FJZLrcGBlBILt5<-}X_Z`no8EndI5`K@^LXMR1Yulzj?Q?5<<!^ju7`<CGA zNUd2DD|SBa{^NIL@1FO^9kU-~`Ceg+o453{)3vi_*p*{+RWh0^!%yp`+|@0-H=QG0 zE+r!Psrux|+v~-mn6F12>b$dk@>$nSFQ+8ta;$A!ZF=+1iq~_e=&mlh<MZvUm-U;c zF46j5)=fUzbk?av^^VkzeQitDTYtGG^Gzvp3R8!Hd)4+so&qt3s<$5{^+)JrrzPIq z_-@Xl;}4JR+~VsfJSQj7C|aAVbCdo%rVXl>b}!Kg(rDp*T@ah0Hg(!I%bntkWz!|u zB0CJ#-#lHAViV=IGwib0DQ1&gVWCc8sgyvQ=dl+K{IIw(;fT#Uhu0t6G(P=3=v|d2 zp|V5y4|ChuJ62a5X1w!xG^@+!!^^$%+Gnqwv{p<q=tdOVL#?&<r0(uG;ClUubmaZu zr)N@s_>0|@-etfZklCiOHgeOfJ2~9!yJqCbitu#K|8-7%Ilr#%g$Hb!tJ+ni`POG{ zp1%9!k<5n9r1r1MxzqCYCq!8-%AIuT?6!LT?OXUSU2N2}b(1}O(thEY#`8J<rZcZS z?^iN^wytRPktsSMZw|0;yk{Q%Z(b#*RQ|%#Eoaz!**JFJbLP)=?zj<_HThieCgCVw z{|%f%5|vMXFm79L&>}%zZ0o<HEB?=$aId({f-i)3i^4In&>Quq->WX#%xz)l^>oIp z2}{~U$|H`Z?mjeS(xMeAjL)Xr`1f#TV7z8T)QziO_Z^?Kr*?f`La!6k<QL~T#Ag1B zesD7;=$3PH8OyS=2C*eywzxZIKgiOTJiT(Y$?g1QpTh)8x5Ta$S)b$N7BV@!&8+v` zMn;YghHtA^x*oGrySV09?!i;Pcz<{<pV;GkRc8Ox8bQ|V2N$NTUu%Bv+LvFkB0+51 zkF9;c`s?BAWm)~Is$W72AIo2JTxWX6L#*Z7t~$Tqh(*F?hVu)LzBd&NcwT6Hs5;4I zj;q^Ir8_z01|~sMGygB#|GaxuRIXv{0)_joUAqsQv7G)>?!aX`(*yP2zMQXTVPn|b zlKN{y>aM%rH-<`Ge5+*m^kIm0g|G9HC}+QpAB~$Oa@)NlTc5=|HtGI1chXwds|$=b z)jQ5?z5HTzh1utAZe6i=HthJ9`1p>}ee*|$7+-OSxO852IZ&pyYFgBb71Dy|?~2?u zVGHk$W)6>aTAn}g%frV1s?O_{g?xGct3B!a>@PlF%~s1)-+wn%_<g9n`pz}?=6%lH z@xR_~lI_O$KYL}<QhqZQJvza=(6nHyoPz!%7QY{<ku`h7ZfW2Dr&qM%TL0|#Oi%ic z`CeqnV0Qbz@HS5l!&=8Xv-l@yi=CboS#YRhH$$al6!Z1z+!J<7t$fK~xo5wT+r3$H zUM-vDmz_G9H=b|yYZpa>SL-LP=Z_2WxX~_VX?XiYcFCEQC-hiDUtM0`b$judRa~ID z>qoA**}a~;`wllOiWVRH@0pk!QaQV|SO4p+_1FK31}0};efQaGmulc+von7eMSa`| zD)7&Q8c$uE_we1kO=s6+XL))$7Fk>A1Qaevjd;MI^@jcOQ}OH=C%^W?M^mTWepYPM zm$yOHyi@Jlsskz6^0VxwHeG#W{`ma%hc+{;Vub(da4o%Vb~!rubzgFEXj$4dm-pPy zeuxI${>c4t;;hnB?@upbeAK?TuRibpKGR*|`Y(RFSMp|9&Dd7IO>hOT!L=O=?j?$E z)%_b#z-m@IQPTYD>zTDm0{0n;RTtecyKd&IY3ZoAL@)bj@|LO6rxf~vT{vzh?y&vG zf7j7XBdn}~_3=#WBtv$q1hI0#lH(jLk_+M+pM2Z+VOIC2%;2^?$6UBiygKkrwod;` zkhzRf-Nn{FQIEG?*FIM|@p}c2@FBL%{f@8F*ga>-sBFFwc!2d_`qOP|rr$U@HQv3r z<V<_;jmvB2Eau!WGtHq<`Yu<Z)zrqf|72BnW!u~?T;(w37vn9#0)yGT2FsRQ7P!Ko zEn?q#XzfHUyS8;%9V_y)pP6aLs5f30ozx!f`t|n9+exoxEM6$psHUavZ7USTJiYDO z9i1)9PH5*w|K)pg+N6AEVb{gmCGXf~C7qindMSkcrt`e6&#lL9c&xagDKm-9qGILb zwHcxZCMP+Z*f=rG^GsHh?+rnVziMyx>hIGCn|)n>;meK1hdev$_@k4jwdco1Xu9gZ zUCn48`SxwrpO{?jz}Z>LzfFC_A(y~cF1n>6<8XLAZ*}|Hz`(~=Z>NX)vp0U&!d0?} z{nFLzZm+A?&RVS!@$^WQaKxo6NmDm{V_4vRDkUe%-@bucn_d5k(W9xC^=^v$Ue><p zr9O|{ICz)&ti-6@XVyQsYnAu;$3MqyfttZbtJ66Ye$H8QD!b--%bG9OOII#r-o(P+ ze^{|8B*%Jw+}sluv(`l}wZ9yzX7tF{G1)zA-NALLuiooEO}Zt#*2wUD{qi$2YlJR4 zbsyercFp5{ae0C5BmLUe+fQGG>(rLJovmLLc=^zpy4M%vtl6_2t*h(5JahT38+U1a z#q|w83NPH+ta5YK*RX<D58Bv7BDQM#ex79#we8f(RibMRBHn&^xxQlF^0>3BSDUIc zL><uXGy4$k;dfQX{#5zH#dGGq-oMCL<MjI%x4Gk_jvnk?wWrxt>Q8Y0XQ9mhA7$@6 zo%~?hZ$Z&X>!&|Sxo%^B^5ngBYL*|1+$*dyz28m0{Ut){-u%BGvc!t39;^6GcI+)Z z*tlBOtpD6^RhKg#SUKn1o;QC>jQsftujJ$R{4e<Oaf$MwbX!3?^SQtF*8N!|Z1?(; zn(?L&_Wu~o=UJQo`_LZ5TvvBbMdtSNv%Re6jm@pj&z8R1dgJp?riYt8v+kL=U}=fe ziaRpr9>@k?;GAp7c%)v}Cd|S9^yA8pPJgEMDK4mvdJwknbaHd~{|Lu@b3b#41;22d zZhGt1i`mg%Zq?{)VOuBWZEC~1;I5<0uFT`_=A5#*&dH{=%d^5#%W<*91(yDBF6F82 z4-W1U@b%8S(|I^yGtbYODGSehc(Il%uS(rkzWH$L1oIo^+4h~+(x+~Em8}}F)mHlY zKf$T}jiBZZ&rjJPZKW??x!i7@(JB44c-C&U&8aVMY*(!ger|I$CI6aVk+0Qrz3R_` zJ9N39{)$>EbvkzI=difDx4E9@Enjra_PBZLwF6hH933z6ot~O}%bq{%#e3brE8SbC z_qD8#TN-ux(ZU0*$IgZ&E>S&o+4)$q@9CZU);=st-X@k&TWscj$7sX)NvH1pU^?Dx zyfS3!;>i`4lOo&i{F<0|O}<=kORs+Uk~x>yl>dfY`Fv35)bi*S#jvG8=^q2{vhi~U z>E^LalkU24C-dFX<)>zLo!dC4+ig|<>zXSb(mU$X)7)OWDn+%<m?hv7RAhDa`Qs|z zHxAb2tDU?4nccX#S3{I>g7KLZzt(BoF{li;%X6MQ)4*qW@xAEnhwj-Qt8P(zmUVXR z#@TA?EVj?wQt!LTOZ8OkglTq9)dQIH=Ov5IjH~Rspr_-n@Un#OtKP(2&%N>%tSX9L zG`qU2*XN3katPD&H?#Z}9GTmbTpYA^Y4-HZQhS=1w1lNRK1TW#Z+4HhyRgjS^sSTs zuNjJqM-|>WJ4tU|_IW4f>xV3#-qbmkbuPZ^sYZL_?KQr3x96BPr&~%iiF03>;I(4T z;ptlHEH8ztg)8TGPwH)%SznX4@H5+{rdhmvU+UgoY&Q<^ULTypE2d#Od&cH>#r#t8 zx0fija;~^<J1vhlhQDy}ogAj?#!(af9<={pon3aC|L@mb%kQr_p(;=|>+6IY8Ig?> ziXYsxTmRSk__`S>(Jh|?GI(Qj-8O!FalFAlr8@Neg-I9AiCEQp?v%LG-nKOB%F_I} zEt_qseYKU>31;<{Io^J%_Gs(M)i-WkTFB+Lc30Q0<E?y2r*}MDS8_im;<`n^(RE*^ zufKCuPbY5nu8p^!9(uHOrS$HCCDJ=L=I-85k^AhJ-odkmN3WHnO?T9mxyx>`#ajGZ z;f}X4H|BEhE>0}hdvmTeb@IQ5eLC@RlbJU9&1d>MtNuuMqU^e_ubOR=e&0I$C+YJo zvFhWwPbwaIo<8f4{ot38Wt@|5Kqk*3nbXNO>|D|>o-H$z^bG!@S@zdx_T)3iyPw^N zf4chiNz=&4Di$?)?*DiA{PLH6++sc#oK4bXJep>9+Ey{;_-<XpZF-vVcCZew?!2hm z6~*b3_vOUK>t1-e=g-##rUg4A7wl>*lHBg~?|=A#-Zv%>A3QVpaCA<njqt7)OAMwq zWUo?s)wN)85_h5Ug{l?JCfo<RUa+*!=Wli{^xeNw!)3e0i34`G7vB@{cB_(IeehoM z_vYK)w>*5kCM=ts%f6>6OE!0p-mzSUwt5-WP1zbYv;8*ib+=XJRq9?)>GH1VUQwg+ ztQ{>kb@k&nzm)wkKTB~-yyJ8Rrobl7dGR})moB)MIQhU-om%JH|JE4^&-I+O<glSn zmrL00lTDT1H@M#U5D@*RqkNX-J%)ojrfz&^nR_b3*vj#lq~Fia_J3Diy}XpQO#WQ^ zylp!3H@!2E*`&1Kv)zHVeAewchj=|^pP0=szp`P&HnU5=751q5t-qN6Y`JK*OZJYl zr*}lkCe=mkblTE(JHbq9<L&T!IVZYVbAE2Rx-azg%&q=iUfceiFFvL7>GahvXM;B0 z`e<<=@ljLAKK4~pyRP5a9(iy|VpQaI`xvJAPoplJD&X~>_Wu0aTJb;oX7X(RZ{A;N zedhZ%nX6~BCvH1l6aQj`*xmFclS0~3r22Ng{C>|VFQ<<6-r6;W-$f-vIgf4r{6e8a z`4u~>P~ZNNopY{5-`lYEDvRRDiyBgH5kCsV6Iv`Ei0Ynin&2}}VVx$wMz2WqvrBT^ z>=(VGuf=CyPH7a5U6-@z`!;8}+a9YosN7hwE;IVcMg5#4w>Y%`)0*9?odVub&tB_v zOr86Ad+Ozy%EZY{E4Q55w$J)X-tKRPJ9KZK`>^Gdn(ZnX<HYbQPbL&kp0zAD@REg@ z>V~Pi*JZBKO1mr5QoohS@As3`jO&F~e|m0jSRt}Zvf`bm-|bUdEIXyUmzpi!bF+Ky zU*Giax`98ny_eX8?%;}Io-UocT7RO}^C%tdNm<tW*UXCER`(;>dzx2L16RAwZO3S~ zwT-K132xKQs^Zvkzq9jVnA;7eecL-PYUo+@weeN`6q(-jZfUad9peH6cD2bzy$_a1 zCBHAQQ)!l(;B)5MByDc1Y|S2#?Gv7vdTr+~oSgn+_cIRBsa+F_l4|aD`|<BHay;Pb z)Wgwi^W)U<WtZaGRR7Eqy6%%-dqh1iU&GUTd;PX#hLYeZiqA4XeY*F2aY1(3lDFxX zKJExtyEt=;Wxm+8a|;%iMx~z@)hw3V;``~j*UzHc(|)HVRq^}O2&>9|`hBieyV`ti z)`E)OybXC@uXTM|TeR-hsg$inZCCB2LQcz<Z@Roq$M&ta#RmS>cW;TYZ;RR!T6ib? zO5V>-uHBE;Zk>DMnpmIe(dd>tQct7bE@jBg{&?-WiQVm@bsukCIhc2Q=d~SgPp!Sy zw5@oZd9zyCxv%GT{@bK{*Ydjc^Qz}D_D6P>y*?!)UcGkHrl8Q9Rj#Q^XKniGeab8D zR~2jOzUBK4`Rm7N?kPPVUVkd~-u`~K89psP>%^ZgPtX4)F2C-a-nrl6@8iCo2MtQj zli#~L<@&#?=5KFp59}}I`t|91K)>_y!>6B4wb)}=Ys)n0%}@2YKQDAWnf>U;j{|$e zHFMkj*=DR=-@no1fF{oa=gaBQpWYu$^ncC5k>z&lKxoS(sdb`8$2mA&hs@h+7B!cH z*`z)5r`A@d%P;n=&z{+1oVWbYvz5tj7$zs|E7)iCD6QW}^I=%ZDt*^=e^q?LXRj&W zby9uq>evhW{;5y4_;(~F@%4HgyHk(9Jo>ZB;z;tBHR^8XU-uo>kbPlT#Q#O0=Gn0q zJL}h1`LOSOx}m@J^v>;1bZr~&MgNN1o)%K0bv)zdL%FFFZ!W&@%J0XEo-W3+=`t4; zf1FGTs5sKzd^9Tm(*ds?<?}7>JUR2e?qIOZ)zdtx#e90RJ&zPi%QQ!qbG_>le^L4C z|8GXkjqmQucf3~3_~l#ZyS247`#iH?>{p9LOXZJm?Kt*zFH3rHi_!Kwvyvv7Z0cmO zU@x<_tg8KVk@eF1!wMfFHvYR^H~)U)?hiWu{-ZA#yfp8hr6UsqLzy%KgC4Pq8!{3L zN>Yo8^{{Vuc{}4^mb9Tj+xtqcxy+p}_lkHa<Su9p`mLAp_JsDLsV!;Sj@A9jD!=?@ z(vu|<4=$Ux_~88K-(Sp^%q)%84>MmK9jL8#YuQ$fo>B!VgKNxOS&j-z<AUcquo%~U zn89Gy&Y{%U$P#z>ulp8tA<65?CP~#2`z83Vu;~Y=OMAYFULC!Wncwr`>HOOJfBqPz zHGI#{2%UOu%^}~^xUZ|~>M}xAJmObfDDqJ)Hga5k$=E0}^pWe!W0RQIopa5*ueS8j z_nVrr&1%v%Mo0HOo0dCkNs(TLX~E1bT7{)r{nMP=S%O@n+rw1-o?K~P6H@c{YY2p6 zKVid-h3_+>Tf@9hUEZ@{_ui$ATkPZ$7n>AhT9<dMeKRH8`o#g^{%e}LhE3a!y*hM8 z%w&uEfvlZd7tFd--+olxxRguv=#H}ZY1e+;z20&~Gf8e&_lte~i!bf|YQNOA_lMH1 z{Oi`63b$xJ+Z=SwBtG+J8msgBsY|x4+roT)i_fnkPP&;HHlFLP&Lu?nv>o#hwkb?7 z)}0kHaohH~3#XX%V(d4uIfpEGD{^e*lA~*0rzB+A9*kR8!Y%Y$SFT9><%}&_g{$_~ z1ZZ9R`z<e4@2is9;hopEEZh9getD97vd59#F7YkF*Cz+vQ~hN$M{3uN%RkPACOTPn zt0Z$t39P+un7L3r-S$Jn=WD4eg9EpnGVhxoEfs#x=tT9clHKlJ4|mE~{VvJbb!K~e z<!OFj`*%O)y#Bl9OGa{_o&2Rch3DIJGj>VNll`<mtj6wKUDjV##PXX*fnUw8{oHit z9R~x0tse19T2qUPQc_`?AjIt#p=`%GIt#R<Rp|Kr=fMKC#V?gI=H$)ZrvG@knnRNK zw(n*6g$+vHQ_gm~a7~$V<L?)1XRokZ0nU~B?c5tO&9?ow=d<*edHQGi_1{+Zmj7G# zUJGA4ZA#4R8S3x1tzY=fE1rGp%4aoO&s#RTYMoUQ{oFKH%(CA_Y0(A|uYI-O>mzS_ zJgwF>yFF>IJkP!P55Mz2`@Qt%zs|Ma-B<J;b{E_nx>WUgdd|XYG1K3aPt2>FHFsmc zu{Y&?>o-QvJD5G2Z}xxnY3sHvO6c^kY_9(-Aht{>EU&WKVrSU@hk=>mvs$Z{rR+-2 zKDVmrc)I<nRIRqfhvOg5P7a(BwPy9C<7*}vN^~50Fe&n)>rY2rQNih~_Q~7L7oW_r ztla)9nYG&ZPV?#$K_|RU@M??dJvp=JdpeKI%BObW+Wgbrg&u9`xp*|e^7aOk{WshC z=VZzqOG`ApedFOR^JM?PN2j0d*LYNU(&gkNE#L2P>;HPbow~2*R(9Hw$->9toIn1# zTKeyw+(oPH=BGtx``=92I79zNhTS}!^Y7J8KfQYW<R^)_`*+W~erx{!u;cS=ev7lT zJrUS1kQU(H@+4>NDc#xYm^M2<K51gW$gqFL+1v4JD;Jrhe{E8@wP;J1?+&xT8`dr} zKEAH9mFBAqa@m$7@{IMH@b4*S<<I?@^(}jYG|#yk`~BngeR9+Ct~`A2+Jy9uK#iqZ z&6Vd;H#}%vRdU37A;ZoB$9pbrt(pOiXOcq&z8k+a|EX|wGS9LN`3FN@>gep&Ww}+Y zzIKzA8M~U>QP$lP`xCVu-P;g9cf-~&{yUpAPS`7UI?Y^uo?AhFjzD7QEv-)(Ph*Zm ze?3xKu>29%nNNw0KQ4NnIrCha@7kFl&1tLDPo2=-yV6LnGk41g?@K2(gcVwMocJ{5 z@o5>qzV_6m)_(;(=3B`;naSn7hAZ`kR?PCddG{aL1?vSZ;&7d*?s@R#S>q}CBCe8x z-&7PB1<z=&JzTpXNNY#y-)}eA&S<L}yNHS{Te&G#NBc;5o-J$W>z<~UI(MJn{+uEG z%AjfA3)iUPH^;*NcoZ<dJ>JK4nmawp+F~+evhb1eE7$sGO=VTiIA>kKP`rFQ+qGNm zx^_o5AFG_i_hFY%OyJX<mtO4M+8DWGVNvYdW8yNqExpyvug-n_%4A*T-N#O08!GB2 z%?(fGa=rRIUA*L9a9FF2=hUaG1XMejCRo3f_1hG<k!@FlgmwACJM7n;rnQ=9>EH3> zPgZ3X-R3HKYD0d~@yiLEjBXnm9{W}HCR(nVVUXKg%w6ky>i3Z+TPv4ezxKVvXVuo7 zjFCF2pVmga4tSrb^Wen_pS526_aeA8D&({qpZA?=3!m<1pC{#ZXZO;EV)o=_Z-=Gq zJhIFAd-xnC->*Ip<Y8u;P$F>aPEbP_ze?JN-3H%(aow#>U^{<k55IoTwtKv+a<YAb zs}h(RzO4P7lfx<g{mlD?@7$ggbh$m1Jol{e#t!?b?0lBz-MHp{W!oKpxAMV+&pAsh zHs5PBxj8i^iQnr$!xKM7b|L!}Tb`xa1Wyp-C|;Q17%X;Yrunbi`}y;V7iK&ZIq~R@ zZ>|>CoAl?|)(xK$?raO&>NPhm+WPfnwKp|&CpXKvO`FmG&wF0#w+~NLpC3^bizr#Q zHdotWDgPVCCn`PXw(#<VR2>kr>G7PQemP3w+{>y14_<6}d0?(f!^N4~+E%)?u8Fcb zvxB|E#p<Hk3Mc0DJ1nhFV_gOHPl$ZDI5%@?;L6H{fghvY=gS^?!IGVM_U284D~S(x z{?s{R&9vjOS0I<buXDS@4R6Hmy6k&)<-FB9bk=1mFD;!qon_^+oz44}x%P57&T>BL z5%l%R>HO*MCam{d6{hH5ypM5tRm-b0A1}J4>leJ_E03(7lY92~&C6oXJ;d~%EVB)a z-t&8k_hp@mcO1=k)%|x~scDvs`@Ac^BJ6b7u1(E~GJ$%_H;2y8tDEP3clzD3$oaN+ zYwnfabp5>i&r1U_C36OgyQVe|{o6NAFs_-NDq;KOi-F6|*fkEKmkt+LT@Y`c(^qY> zV#18X8^trilJ6`{k-c<y%f<?kgmVS*e@<@wls{{C+mQuHX)Uj9fAd*|l*N8vxf3p= zoZ`JGyFD*tj@!r5t&G>zo>|y0xD%=zC~9}zS@+OE_01nmc1*mm_|u8o7L2E3O?0@o zW{C(3NrlOUmMyt<)9Wg$(7*JT^?VE!-|uYDo3O&^d}z`>4pmz%mX7Lx8|Olke3lkH zzIXmuhV_h)B4@FO=bhD8-?gf#;+k7;yKCFZ-Nx?z+LDsrW~j%`<eH&u<*vT9tF}Ys z)U#6;JNHg3I3ViF_GZShuCSxt$0imOsCPL{_<ehVy5FXihMaHK%NlMz^J-_qb+7LC z0o~3rw!d~T%&}^W4q=R&;S}qpS+=WH{@$;j+rJj<dXfAk;rr3pce4b`5BhyPE_X+= zY*KBx^p1C*)HhE4vdPWjmqpXlb@gxmNTn+*7p!@o_`EdiU0>qv>_?kFpRHKw$|Aj& z^{E{9k7Zq-X0Yy9t-4A_S@+YVxz9cn^M6Rx$+G!#PH%U$*5}rJEqm`Y+I`mhB*|p( z_wzb&^>_21)&D-WQt%+-yP2-fZIVAEKdml``t?mL@=GtzthGTdU#|6qOg(ncXX?Qa zk2Mv`s!H<L?w;qi;!uGQQ>H~;mcY*0YyX$cSNrhd(ygcaZT&tUSpN7}Y@Y3(Z+%9y zoYLg)_Po9CGxPQ-)>7ZdcZy<V2U+f4JbZJV)w29;OSO6;ez)_z<35uABVqM<*{`SO zu9=-T`{rzyt0yeW>y<;lZ+<=fNT1`3z)bT>j#!nA%S-E8(oC<YPRlPSomY0}FZ=F= z)&B3NuU>sL%WD4Ge~f;7^OsLbX`WM+!Fy@%=I`#8&OGjuGx@&mo__wnIWmriQ(}G; zI22Fc_xs}4t4WnTg%wpZcG)g}u2=Hy%Y;gnA|=J1GloKLOqXIGy;I+Ov8KlOcNI(F zj(e5-0-f)e%I#(TU1V+($T`}6=r))1jNJ<&CCnaYKg>Hn>*I`GrrX@*=3LI@x`)r3 zoqeD9psk)gN;>20Ta8?ModbUu87{8mxx4hN&H<aL+BMu32kpPNSnH-O+>f-K6x5ii z<&bTRXJ=seph8k(Dj(k12Q{WZ7{0eXGCKdZnMmFD^%iU8XO;QQVmsWn?RLYFiQ&ne zvPbl0B}#`xEz(^(Nuwi3XyJ+a`<7ScZj(Mft-ZHnZp$RQd8f<umc;GP%HQ*DPaSJ+ zuS~AoXAPl=Hbu7_vNNY-G<ST?lqw2vYEsSN<Kxab&ns4-;GDO!_<GVt?WXDO|5xSI z3ND+tyCA9J^S8JB?dr#m=T|k{SAX@p`s-iiGndX@ICpbx_F<DwCb_Q<qRv!^99F+x zyyN+I2GKVEIqMFxe*btYsdruV#gbP$gr2QC&RE~h!zx_dAsc6@-gD&soi1a?+G$N3 zdqmP?gigMV6Fw_$wyS5^%e3253!j{uG~@OJ7Bel610J67>!O!7KHDkAuk!xj(GB@M zYR4{qN$c8X={-@)@eLd2M-?#@5B+GXw~Rt7qqg^nO`o+)iP3yRXOu?Y;Uv??8>0CH z)3*uf#7Do}cq-3JUh;D4*Nr-I#~vIr@VC*AJ$=nIE+bQ8i<xoIa^?$ikFr~@&0ELi zD;V*V>se#-JLg%VHEL}_jyZPa%<KL{Jrh@XkWjT~@kfP^l}m#7Cick4cz=0jz}C%r zz($knmGFlq_LB062W#|Hqdy4sW=QC$+}XL2nP<s)8-C{#T`UhoUvq!>eIZ$6R_}s& zJEDDO|GkmR(Vn2Ol3nRjq)xe$^_Am(8E<>Ia=ZH6^UvLNo%GwR_)tRDx8sWseh4qF zF_rCee|EexF|O~teVoLy!dlyX^EB3<uVB_qp4_X+@_ID~C;w~hf9gt8AG0i~KY6pw zlx2CEX3&x|7QQ!Mn4O8`H2TK({_MQdFP<25&Nq0n<yPaV_#eU?PZoV}4oP|TGNUU~ zOLrrO=hPkZ))wW?O!r?g>0jT=K9R#qnI09XwHSFa^S)htCSl%Ozn-QYOp(&=JjJHA zOO+06eWh9>$0<Mg(IjyW-@B!!_q62CQM&$POYg?zCssMVHuC3iRl32HtGQ_#*T!16 zuxC}GqI#^&XC_H*=<rAt-mNrIXO5A#w$jNppUf^8*gh(r_WY9qo65fF<@J*ymY?W} zG)Z%*eo|umTug1<g_x^JO9TqIuKm!MylqGSlEnc<%%{EI=**Ekm!S9M)7FAssp``l zN{K3_+(s#4?ac8fDwbZ@7N8x_@UqPL;GeIyZ-e(<IJV+v$b=_BUsi2f5$XKA>5q%6 z$@eEc=UtB!2VbgjzP#sc)%W|Cx17nJ{PN}3D|;mTmVJ2FS#&Kmc(2DawU7MVFV|@8 zHsa$BGGV>dRvl!nq4s9Y$Giohtp^UbnPoejn0D$H%bcbs+i%oYOjUY*%wete^c3p} zbJ81k>c0Q>j#cCz!-lE*-!`^P_y2Tcaoh?Xy${M41>^GWie6i>xb~So$FicfRfX$% zFZxB#<>31v`0mE0M`?V_I(h4I=ecp`s5H;Wx$Cg|>V=T~osx%dZ_zTlkkXmfsqx52 zq_Jy1kF|H{{gyks{d+I|EGyi4ZMn^c)P1hOfg4$Gy<6;Ly)`%V>x8sS<K#<XfrjTy z*e|b{YhphmZKA-g&|NVTb<0=q{=W2uxpcXPTwY3y{gMwm)4%-I?7JKP|J&A3lZJIg z^WW`Wd$CAMq;TO<t10s?$Mf%9d*RjB?qkW@Dp=O`M4q_VS6#rv|KUR&^Ojh5Vc)k0 zH7BYby?H?|V|S6u^((wtPKoDCSDLLcyTq0;bKSJVi^3&m>5EG@XJ+v4Fg4x0`M&+X zrupV>k?ObeoF7NuE1KSN_`)r*w+mBmMmc4_KeFcX%Uz#EXRf#$8yWLScz05G@En~p zGuCX^&zc@m?)>=7;XfB{?TnAUwxVF$_cLx5!pXlra_Ra1zW(^6o`wIk<+{J$bT!wU z=90gdlp^tbSz+@ZshNL|iKcW_Ubdh6s@UXerkF_Sea1V<#V%9d$?b~u_*yNseNEK{ zg|fPruWm{3<exH*bBpzqP<&$hu7A;-SD};j`cGNdduJ*i5Ym5laIV$K*7KF0|0V5T zyQyoZ&NS($7u!yhYHt&nt5>$?U5s&q)x^~+{dqTb6$ROM|2q7LSL%sAWAw?=nPNMI z`sd6mD{1x2ij7^`>E(1NjBEZvsil`<Z|P0HQZ4dq$7K7NvtMm|eD{+qJJ0j4&(>IE zoIPJ98hXVtXluXD?FXUn`5u|nIC1aa9Y1Zy(k&O93wOSMazpygw`qBorM-f9_vzhV zR@(J7A#cJ?_UUiru2)yw*SwKDE9`~pB)if(X{Q*ivY!Pqod113^Y0{)*6#UNYr`y! z^JEw^);C5>c+PHgYg6r+w#EnN{ZgN{iSA#h(>}d};r`W~D?hw?^sv8b@~S0^SNzrF zz8xPT(6e9Rxy<#V1O6Md=M-AhE#tJ2S}#&r-B>J`{c-K&g_}Q}@i`sPxI_DQ|FexJ zgYE~;`_1F-+;w5i_Y2qcBd$djuDcMkyO-<7|5p)ehflBOX8t99>?Mcw^tFZa^!%g0 z-4tE!CT?446C$b1c`Yz%e~6Lyekab-%2R93URB!kuOxU)n&x4q(Co#pzOL2zzF+d# z)N5Y?G*4|lW)r5~=iV2_yk+?o(XNwATUO02UooZYa)!vS-}0zKA^NwTH*aNOU|`@U z{#=^$#A4XqUQoRa!mzq~Z&<AVYd3+~@9QOA+Qm31KDpE$wmsCffnj39f(Ne-1;0BM zcRYG+`Q5vw5B~i+x90Ks7XHw)YgL{0SkJWFUHt5fjO?3tmRx;&3E}5&ML!BV^Xzbm z`Mt6)Cijj79$Cve*CB&TZkpx)oQKwm|9JXzRoiW6fA&yOO7hFtYX4{dhPf~Im?TZL zvXJYoYfJq(f6v^_>VnP@5=YN6JgYj{+nn#TEGCUPL8~o)&bJ4%(syjHdOPDov!B$m zLrzK`)_tr$Cm^xx@KPB)p6{BCcV5_6KG9krsqLs8d1#VzVx`TC>eD4XHy5QE^|h9| z>2M!U)(GigS2^A{`^-MkrO$o4I<!x-7ued)zH`sN?V)o=d2y7}lBvS01hQEDgeN$P z?viORo4X@6f1PFKN^SuywJ^mwQ!MvS+N93cw)qBg^zm=cE8gDwQ@Lhw?*I0XbFv)l zo{FhI-PrD*In*cjK6iST2+MqzCUxJ0LP0&f<KN4>SG#`T6mNO7*VH6rqD~Uue${ss zksOlzm+#*WHQ77EU+v-JyD5dDEDXC@q%Pe2%RVO}MKJ5=^;e<|Pf{LUU6TE@W%8bl zJ6)tX%yVxDWgbzwKI5$Ar7nBH*I5T&ofZvGN!aa|l&7rxNp6Y2A(9=8bZa(O2v z=X@k2HqzzIey%*Pgj^Gq?>f)B_FX?Gq{I5hAiz7dmr2vlM{HSpA%l|RF(K#Lm)z0T zr)DfTbnJ#lVujyMrio7{rO(OAW#uxJ&|Y$IQdidB$Q@IduGURk`gr28DUa>UcRuXn zig%8AvPsXf@6+<6zd3=taWY}Dp~9BNcf>B;Obpmqx!mUEvewl~*`ES0|9JTD;o>X3 zff8%3pHNrh-jky9PkGOur3LMsDcarY1u9<*O?j;{%=i1AyLM8(>~JXGc89y?#2)_m zQpFTMdu{2fnnN?!OmH|hbJNsWi4l*##$+nUXO~skO<>#9!5<wT?7qy^&r<2YM3EVV z^9{fBSJr&9`xsjOaT~|^^zPF?zx+v(`eqO(B`B|UsB+Q-w`(mMSL&ts*qq<#_$;j= zQuNiV!#gHCw~@}1`N42i^61xu+G}l{w|kOjZ{OWm_UA^km0Lo)50_i%^+_M&neO(K z{I4iB=6rs6^U=R&bHw6&^YyC(-y5$rR4lO$dYs;NMm(b6K-`3g$VQvhTMt~nG4sip z3yt<%-xJO5ee4yUp}V<fiXKz6@*Ba>%<Epyzki$VvRGPBGPm^61^>lzcG4ln*VCWB z{mS=ehvMm5!hQ@h+`>cs`m7da$*!0xTkR?RqvFTqf-TcJcPZvx_4#l4XH)9Uhk3ty z;@t8hl=7?iqvY}<_f0F`^yjJUX}*q&r>6&gcs!+l%W`$2*xV}jpU=LgTzOs5dGV$+ zZ`R$J84nJ<T7Ng>(+k<a`HKS2EqL)<>iNd3S;-p?*)3M^k}QqSk=t4EP-xAM-N*k3 zFZ{G9_uP`K6BYMk*6Q)>`?*x4`E=O(6*1YH)#n`EsC=^DIdsMBh~*~FE4SX?T%-H( zHQT25>K7*Ks&U<(`gB><uJXvQulsE3PgKu8aPsio9JzNFuWQErsJr03I)49x?hk$J z2i<%hyp#X3`Bl=ldfp7VrRRQgz7}z3t$E#3S=X+kw*C2+zi1_*htZ=QtA!aD&i4|( zH#0q_vLFLGcL6F6K^RsfzLkAjbldFH{`pL~X?mOd!-T%875nPV{pIXu^Z16Od*<YL zE*B@Ebs{SjJ#Kp~=Px;5s9(05djgAQ&@`V*ooekny>+{yk{bWsJNoHlT=C<R=O)`; zyJB$R*u^8!XO{2HRK6f3rMcyDK*zx(y&1wkt{<9ysGLRm_&(v22f}r@ZcO>TPF+HA zVTAkHR^{WD9#$OATfcXwEc<6y4fV?%w!eQqfBu`@f4<#oqaWWJ{{8LzS9{K_`|E<a zAF^L=a+LX{^k&oQ1eHS_fA#jR{E!yQrm^WhYu)j4M|t+m{_-wjyPBb_&(fr1&TgLn zbBkw07^GbcNttcT-(1hFeo1)lM^^5d{DW>yN4<93wb>H+;LyJZse5it)#7@p(bsZ1 z={_rqV1de^nX9V2_-3igKGeRL`aJ#k-|p{!?>%_TaP3(}Ba5)7{j`59D^-qFzqr_~ z$L;ibr`Z;bqa}hze17R&67)$wrM%1N>Gh`8rrjonpK}f^&biAWFZ%HMm-^#^pF2)+ zytw{ZOw>AJCpRx|)3qfow{9k`vFz~Yh$`M8w56wEqQ(xFgN(nQcWwNldWuuURCS%} ziM?Eo$&Sid1v}<nF#ojU@j-s2W6z7vcgRihZPMoK5#U;2%CNpQq%Kcc^6ZZo!B&>S zC!X;KVh$%9vzYBMgHyWL{f?_n?%LS_-;`El3RLSol0Ea0Yt1wn;p7hi8)ge!6WY<c z*>H`~nsg5CEJx;b-A8hd*zoP|nDIfqLED2XVufX%!=dL5uV+7CD_`7wdyB$@;)uf; ziH^=2_cy4wD&*G)SQMn6m@?<A?X9UHRTV`dpEh*ej*8s=tRgY}`9zs!5y{ODKa_m< z_2=?#^TXzcAD&ZIiVfV+RsOqAe0S5|Y#G^}q?bGQzSO^Y_42_FUsm0huc^8&zfbW7 z$E{soJX#djyy#E9(Z#VnDJ!3+nr-#Egx`%CdmDBi`up(s7xnix3S|mnm8&bg+Z0wc z7ciC_aAtqdqH(8i|1t&pkNywbr~Zv&owZR*uC`%Ux=e#dt9(<y+lTs&cKwXm4zE}I z|Me#6$Flm0OZ#uJb$(g@y{Y2WbhiZu6;2wlggp>8bPf#Rj$&3mTB4xrf90^T`S$B7 z&iCt@XUO#(SoXj#gga6?n2~LM$pJpbYL2Z8t3>u5O_|+rRHB*Vn%B{%g7IQSx`|av zQ-n`d+H!4s=EfD3IqgJA$+G!V!?sBNl02t+VNs^Uk;$5~XMAP;xu8=`V&UHv2{V7) znJL9<s2rOocj||b$=U@6qf)P{TolsvO<Ur?s+(@0${L-tMSx?c<nrS>=hrq~Y?`+4 z=D{ub6&z|i3vA>j2{vn=bNqfP+o(BE;PT~<`XRCo?+qoMoMhtfw_SH-f~ek}J6xST zS<BYV*i>${beG!#Q-i3-_snlGyGMQG?N9w9wd0VtW#Hzu&%_h@H*;*YI`2H2UFH3U z;~5@*X03TVwSZ^u(S_f3eyWL1ir(B(Ju#H`&epr@jC`aeUh2iL1TOwEO}H?{_%~z4 zEAxHd0zPf~puXW|`o^vYMQaY&UpyA=*VdH4lE}@)CNslNDX7rgk176z?#<N06B#xt zwrvof*M6-2=bcOQBhCK(HOx&|Gbza-<M7^|`t8nDd(~yKE(Ldfaay;Ue{JK%MQ;@& zBp6m_Fiz^6afQ!QrqH`;<4*P(W#!P8V|TOrCN@jIbPG1&oM-#qwz@A*aKl51J<Cqa zV81GJ;nJ?TUJrM!vg9&6)UvnYAm3z#H4|^Hygu#D;-!~_PQ6XwV&<8lAOB##$@V6v zg|RhjKFGCty_mZ#uWNF4ZeG>z%sh{(XNx<-R3<ActyY<M?b);d{k5}~#Uy{3l;4-L zpy>0NiPh_u?i77e;umoEdi}cxa|=G+37Bom!@6%tb;IJ&i&1xtuY59UT(sZXboY|> zdrQ7dyZ>d@leWmt=__>pZCbuV_Sa(8*WWvQ*8jeJAbOE~&cpE3|DTTVZ4L1_zhmzQ z``OGhyWD@P%nndna&7&&X$8?U{?3X|R@fR>n8(}0<*oTYAz43Ce0%e&=nb<zaR+lp zF)wyqb)H9cQEAT`J>i{RD{Mrbcu175=XhJ}^`*Z!Wd5ZuZpGONThdG?E}f}W|7%JT zcbJmho7YdO5-O5%&hpy7)qcrkCS=2Mf8FU6|1TQqhnG2O>|ap(CQxl^PQ$64fo9zG zPmd&a2;R1oxcu4Sq{<PIna4LyJSQZPyh3KyGCkic>75hTu9beaK4Mqihm}P)*SSh~ z9*;ALn%%YY?$(qacm8zEl<?5pQgXCI{xWBR*Zc=@lXXu$vSeet`tMQuwd-d)xQ)zW zmFF|fRd!0bcJq;L=h=iEtcycexXbdHY5bYH@$V)*|4XYv@;9)&HO~F~PybkH#n-Mg zzFy4p;^Ow&vIL|zZ*PAur#|~FXF-Uj?`sREl{Q;)R$kO(n#WcYtX8~Nt$wSU;t790 z2AKuV8s8_?Wb*ZGIqvqcf+wW^){)&0xu>@7?BbredF_FwNnY)HWCA=Qik(a~m`Wly zH29kf&HdK?^{n@v*-eG1zb$4aHttgX>T&Lpjl`*olTIsWUs^3?Q+MI_yq`Kh+4I|Z zuQxp}T4`+ay)1Uyv9{>L#UCfvgwK4R<g9!-Px<-LxU@}Q<c<_;+FaeC_wDN21;52= zrXRX=rSaN<iirEF3qSSoRd~L8JI%_-`$Eq7XY=aLl>O8zoiqKKPHW2VRXv`c|Ayaa z{g!(&HP~qRfvj7TrpvQEPZ$52mAomzd)Cx*Jty;zOtT63_GLo+QQfJp7cdxnoo2=S zgf(z_k+mPgy{TUg23+9`<({=;ZgXhYp~J_gDsw*A-28m+^II;Vv0}gF*74hwy!m)? z)y{|W=Elp-<I&e^f8Wo4{`Z@<*|Wq~+O~df*j?3cy?e%4zxA^Il{aqYx|XMzRcu=> zC|{Xo+O^Dl?YeD>9(UUpvD{+Y_D!ldo9nWW^qvg0HHj^==Whs+N^L7;yj2z<v3%Kw z?JKLyVk`x(uIjoe#jUJ4%kONaa!!!u;>#!8J}fx#GSn$MVabenKR@qScQNBUZ~D22 zNTCSU!WSIg%fbq)yk{_-zUqFpPcFm9%V2KARCDd4k=`@nI1N&>rwKj(Vd8oJ^`#tk z8ApfLnzK3k+8L5A{pOdO&iwM?{~zx@WnEZkpP9AWx^m?u&!wNM7kLLgwRSDod1{aC z=JmVpulKoj@<T%1^}wyW7n&N#1*utg80)i`U5LB>luxAIyzr3HmNQSx)c8X$_qqgm zr@xt9vo~gaRvvH9H<dlp9+!Lm2z`|Atx|L3aA(IU1JnB=2DM$sb~d+8e(+k~@ibfK z#j|hk{D0jYRUExkKdAHi#;J|Vo~PC(-rbz8@v!>3ShK)3v1GQ=1*QhKR&)6Zgs^tU z_Gy|VJW{R5Ir>n}>L`E6U5-zGHwFI8D>|0#z4z(`DT%e2MmIJD+|v_nEh;Oho>0>{ z|M}-r8KK#MV&N4P(^jVB<wZ5k^nJTSV8*I>(PGOFMLkhJ|6lOpPW5$*L$q5yeS0N$ zjZyCCW`6(O)2gQ#>eNj&&^7D0F=>bXv4;}^7P}a|6pm`k(-d82(&~|W_g3jH?+cR- z#rj5nH}u=rb<Xc-kzZl9iMNP3?~aeUx|iaVn8NO?^sfFc)OJV6_Wt+Bk<#hc+uYp` zzWtzU6v~^y+w<*<jR9xcuA3%1E~-Y|>2|fN_5IkI9KkthtD>jD!*5;-Obvp3>KAvK zR4;1(WaaKYUA|pjPvd++lhkv&3lf(n%{gj!D#&ZmFTt8g7w59}q+ZDC_wu=4Z&6kL zZDakvI^mGhhO(zQk{PEw-B{#Y{^+;EjD7p8tSxP&bG9s9I>XQD<-7abH`x!B6nuU7 z=tseY^}c({+W2`?w(M3*sC+4MFTCUFCZ%PwC+8LBsaCJ*esS&Y6|v8`OkcugZabNN z+iQtfHS4w5lf06f!|zP^z~NL8R_5##RdCqxCNG<v;}6aHTk6gaew#=iyBP3YQL;Bd zHZMOv+c7&~OQxB|!t;|0@5^j2W8D#TL!ZaDncwThkHU3TTbXXHSN%3^qqB;QW5IXr zl{1$0POxcQvW&TF`}ae0zQ#ZMwrWGA+^jD5sGM*IZ&&Ah*$fRm$EZ!Kc1l_X&D?U< zx%<$K<$gt?7lamWmRrVl_SDX)3r<EYn6QL1^y;#(6Ysk2r``@%y`)_?<88>!73+UQ zZc`QITJWg+=A-GaTGvkay|%SA*nK767B;u+qWcoTHoR+Ujwx+7_#kniO>g4mUgk5Z z8wzCf50sVM`8<u!G&MC;<Wq3$GV84iS6TdeU%$^oaM^(`vR_zU9Z_7o^rU4$w{mQS z#8bJCnUBP>{oHPt^EN)}S&<sIz$Zq0{>(CCoshDG;^6#)HayJj8FH%=)MiWy%(0Rw zv-#PcU>^K%vq8s>cmJk~_T0XZx9rl)G+j}lHxI(Bw2wNwzpdNaoPYdaj@;!piw}MC zY)#)LmUAZbimS?o%WFC=RbQUEb-}~;D;y>tesm_up<1k=Qou99rq5S-hJK6pU&Z_# z-`Tl0_$p0m7n&?7yYD3Hs})nuDSlUpKVijDp!Ms64Et`oH$jnVc2;KBjtecDe_YUO z<MD<kJUv2d&Rwx?c0bgTSDw|>KI0a{83Wk^SLJohH)q-1h>u*mx$N35+p5J4!9i}m z@@Ld$v~BisU(9s(CvSB8r8ARH1Yf;Vl(X*b@%2(&nfq8yJDxeS>m~1*IX7f}g<4Ju z^3g6*al0IRi2vu|PYbHG7hFBQ<>M8{LQN+|CT9McXWTcOEGO29x40|awR=1J@&Z=V zX5OMe<~!QC0W+eR4>y&i&2QE<(LSqHRJ8P3?6;Xb)=v%}ugviD?RR41S#?MF4;O2p zozN~D^RC`!tB-7sb7)ri67zDK$b!T}$FKiotF;q;wxBs=WpLH^XIr*${}fs!xqs^B ziftjj`gsSh1v<3FD*r3l%kft)UA0kjVf5aG)2?;-ZVz|5Yax22*|wY^D*cu9hT;=D z>+0_Mbns6*z3SS1*0X!cI@WG2{k=Ib<IEbN>Z215RBzA!se9Z1-?V?Hc^A%{YIZ?P zY|GJO7yj+iuM;iK7Lp3oR}C(8e$*1A^Xu)RunkAqw(6@Y2DXIBnZJ<oHh$b8%_*i} zD|+Hukm=nZV=GRrg`ztHGb*}Qn5%{;?7aN>^y$@pRjK8?S=!CpBAT|XVC<E6C2IX{ z{@nSod)_U%eyuUwY<p@(_t}NDr{|<r>L`C&_vdMd%XEp8&(^lA?7DERYhkVRjCDQ- zbdu+4`^0XtJ>^`(-@P()O`)uZdHjlrE=_N&dP75{3a+!?U8@k={K~pt<H(lfcN=vz zFJ`P4G2S3$bw@mkdGXd6w+(+uCx*N^ocZeAN)Ns36|0UczdtF+M?n1WlHQL+stKiq zY3oHmDqr|$e7I|I<XOu~|CI?7OJv=5d&@tPOPy+Y<*lu4<9?=K-k3XcO|<7nGavpI zcVhLm>C?YonNp_49<*ZH`NzjjdU`CZ%DZ*(qU{XcTMu?8e{g0mnLjJ)#8(5~d3kYj zT-octzInM}i>OK@`>dz2xt~@oE-O1IW4-M37VgCgA6U$nOgnlvXnCmeynV5WPw#xu zOVK}m@|?xxl^HdKor3=|&wm!ZP*d}{m-Vn!a!}=jC93QG+wpa65iFDzNfNwKru8t_ z-1~gZwUlob6Pep4cVEakx6Xb$n;T<rl`{W6$-eV0DZh%IKACg(t<UO>>(Wd=RlU8# z*|l-!@wr9M7#|({R(a29xm8}rV}qL)In#pDQ*$zAoq5st;p)4#zM|c)ubFJQb+0@z z@96b#0n_zQHNqWEm!=wXmfo$)NzO2JUwvVo&BB7sf33QtE|{<e2Txmbn|-g~y6kHL zCDV7j-K4Ur_L9BrAA<z7j0<MVJcF5|uUtKT#p+z|jCcPR$+~~r{$$CwyBD(hQhj9K zwmiAh+oyfZ=9`l8{8F{|?^muBtaz6vX|myjmCpUL=k2S+`f|Rn+j;fL@1>=izbn3v zFFV5~urc<lzTdC#!`r8;*ZLMeZ+_Rd`@@#g^QPvfUA>d>^b1RQVX%p9LluLdy<nc{ zlAw&9uT{RO8?xN)-dYxSdDY1axtFGMimu623f1vj)0XC)r!d(sZqxgFOVw^2yTW@R z?t{3G>&J>YCX%m=R)t7b-twq;)b=M$@+s36sVjj@YoBQx4AEkbzdqH!a_M^OPt6&T zWg!lyO*IWRWvZsHYY4Ocw?}nXUBc{T4rNVzVtx}>Et%Wxb6)mW|KdZD56hA_iL$>i z%A6PDtv11Jewa-E?n{NzwMu8W9<3=}#Mi#kaK*mg9DhE2DPH8c|Gq%}v1wZuni@oL zf1LNCSFfdFf8)D%{NdBKeM|h!?(_79*TM<M6z46;e6v)4!j-EU!4J<K-<ZDFOzQoQ zZ#%cYH2?IfNOaylyFGGS*xDMe-O<ZAyl$Jq<gbaJ9!7uo^W@I$J(<_0op@5Nbmgyq z39opmB*!z)u4kV)dg}L?SN##SdS#|N`Daklu?4?pu6J241IjWik5>p?zA7Ebx3=+O z7K5D#*J9&@<;VBgoqoJ1S5M`o=8c#ylNpNlJnrUb{$^be_Tpxf%gYq~Ro>F!A4+#c z_v}mdzPaY%Ouoxko30(m@YR~XbgMw*<wbEtdYs-(zBNAKYprGW`mJeRI{)RAAJa~( z>dNz-wl*ixesQqtMtRna#=gZ@md?00(<e4LkGJQ&&dFU$1`{9O@$=k0&u3L;Ix}O; z9G?4M`2Bx{TU+<Hyl2{Zc>CdpFCEw~-sfrm6}N-y`?C7^>_5J(y<efRvi~RdA11xS zN}lzfnvPzq_&-1G+z;>jwSg{A>rtmh48@w5J-HYdObkgF2&^be%)v1bcr_}w__mqQ zzjyJCtL=}R((HP>Z0GKnWx}e{a${wVCmZ)#mz#6BGzn#OU0__ITl(wq?%fKSK}sr? z%hWB;T?y>Gd-Sy3jasn>pO>GtJzqZ0KGoND=2ipAvw4+QB+Zl7E?mB$Y)$KjXTb+| ziPws0olRI_^q{lH{mf;}t#f1S-<R1=`;e%@bK5xh;pu>13QHb^J>Pijo1gFVsJ>&I z)_3mLUp%(o{^I@VITri3Z{@%9q2)fux9soE*MHwgo314Bxn=MBJ^A<RbKL)gv7PZQ z)iIe7<h)S$TclgEpzp1o<BY#`HuTQz<lNG0mA%&VOUku98%=bkOicLje#+qkAtxqn zjM!1N>T3QW|2GcmHRnQP&fW~zaHV5G>{hct#vfAgiwhKd7d<ubbvba!qJeYKLzfqw zg<pd<ih0H#aoch;@_+36KdY{PTxT0GdwcP-)e;8NmEH)oGH2di_dJ(vLClxvZPP@I z=dPY|(!#;#P{D=uKhn<RvtDjuH`%Zzf0p~*T^DP7n$CWi|Gqo(P|Bf0CSA|?_^tL{ zxZr$kR!=_f>};8RBHD@hjp+wvKZ!MnWtk>APwiP~_~^k6mW31Du1(e2$n`CBdDdHx zJ6#^W>PpLE170+jPWD^wr944#mV(_c!<PM=tXtDNKOEoKbtNNiTNxvB;Ei*;lm&l( z-uusW`_;7nkAmg$d-=cpbxuhSZ`&a0WF{d~t$uxf$$7Tr%?Hov?U}SOqKf;_M){?U z3F{9(DVT9e<3&$>+#cI+Y{#eXo%j8<Ykq;(vWrD8udcfwwe1JLB1<0&6T6C6L8zb` zUxKtWho4f~#7B)B|2{b{EE448v$mRI{3$`fltpIg^D`XlYBwx4bV&@8b{07>UqI)K z(|rwT9hq2pB|j(DMn(}ulac`8MLrzfESIZpTfdyo?^k_y@jcZ&iEAv)ZPc^RGPbPQ zyRYdg<ClMTI!r6vHangZOYpb362<Iq80@b$vEqh}c5-x*)Bc*HYvePR-BnC+d#BDn zD<?DO?u;1<Pad4vx@aETy3X=`lgrA9HM-0BoeOR*KOxt1SIEVFM^A6B@}d46+y1py z2rM(?oOx=MPNZ>GP~6HUo%SYmkJK%Ht+O{T?0jVQTi5i%GqwmNfjKV)GQ&?w?f9~+ zmnZ91+QjpvukBu@rY_^PnYs1Zquc)-_vBo=mA)=HVf*?U>du~mpVI%Yc>R^_`t|Fg z35DHrtNPdXyp3?3xXbyL&&|lF1x30VZ=dF9ZLs0^k(<7Dt6SQw6<ePP1bvwP>CxkF zGGEU3S6#pIvTm)wyL*!^G<s)*30bWXJ+wDo=-0+D4rgc27p`js-1;V6@Zahr5#i;e zpWSM3ZA#0(FzuFwD^$LGk5cRjQC(Png==mM|G8b^aeCqF?-x|uaJ0E7|1IrM?b^7T z{}Z*9U(cOiu{`x-!o*T8RsJHEIZ28BuIqch{EPTu9^iZ8#<iucwoSifS9vIGlsR2! zCm5jrd|AQdq*Fhg!sfXu$*De8-%#(K8Mo!h%l5sE2lb53C@3o~+MHb8oxL&B>&XP$ z?ehOl@kN!Ly*TCX$IPz6%=)qo`}g<zNcgjFh&ZLC_iFma{>_JP=Cr+yl32Jhq1p4{ zF)u}~+AlL^s0LIV=CR6dt9)9jZ~Nj6Yss@omAAk5{ocEIv2Da>!R)oidj21n@a>iE z{<_%8{kyr<%E~w2+%AyMdocHS68i#W2Ici-Yvxa9V?FPb$C)&(ZKH=&(f<Io^G=$J z7%aKu{8eVEzf%c0!spZQxXAnH#uIlVoIJO<JX>+@q(IIwt=7D@MJHUJJkFW&K~Hp9 znca)*Z>utr)<_%^ WEy5-QdNmgy)?N(;F3+;+mpEp~X>`}HN`LbFm&o#c%oLfu! z67MYR^PPRg@PPG|jhU0J+Uh`RgN`qG5O92%?<<LSvafDz@s#x_TWi$6XuZlK?&N6` z^&>3innWti<4@;Z7~!eieZcjsuKMYS#hz#V&fcs#JJWgcf%n&zJgf3Ov^RS4tk<TT zpYnXO)?HWGvfFg!&bY}9`_$$p6z^55yua4-?AKW=`P<b@x4&{^*${gwxn;J!#=)KQ zM0M_Z*Oc)WHXZ%;sHOGoQBH>2-IK3x7grC@*Z2E(H_oO!tJBlePrJx2!tbc5NP_Kt zjYUs&uLmt%rk2F?{qZq{_Ql3QJgc>MdKvyPUfkfM-?G+1S9i;w2(~6=%`Llfblj5{ zHr{uV<+_r#V&}YQw@K2E>LxkK7mH~mZpvO7d1w=J_59-{%E=o%XEtqC;B5MKr^EKT zs#c%s$9Yd}R`9HOR=?6EO+~$FMTiyS#IVkXCn{#C9p!4hBR-Xdc}@<GaQ}pui$6T( zJ<+nvDpaxJP_{EV?bcSY)TQNIpWbf2v+A)rb*=4&WvVVG&&(FJ^ITKCs%K(CL*%wF zN%2Uz8(fR6)V@rgxWD@k*Lg8zw$lP<KR$acqwjXW{O!{^an|6xY)7T#4fD8~S?s5Z zTg-lW%40=vg!IB(J$<ppnF3mie0V>m2`$|$7xpDJ$wg!n=dpQ;l0kOo^QtXAD|22A z&CH2%*cz16|A<ZD@MNwH6K<yqA57k3siZJ%OY+o?nCo%-pP5SEU2{*fHhE#xy|jf) zTKChorMqY^nDXm1k7hyZzRAm)*5z>=UA$M$)&Jv5lT&(+K2L40oql$zN?WD`S1yC3 z(Xp4x8=lQHJjhtry4h7_!;_rHTt5?-+qZ<oJ=j$uaQONBbLVu983k8PotXQB>7<Xx z9Jbt7KRlVXDoisCQRa?foaLUj#AddkdSzbTrlz8eYhSoYeBB(Ll_-~AW1PIj##!=Y zN}Off;qTlErDdBYtIf!G|Lf7?rS6s6-Rtt-?r75Hlud5g(70%?oqf%#<DR}LHx_&? z>w7(u@!$Qe((m`*E{(bQYi)hq<v%SFQS)a9ENZ#?>Yi@yf<u4L9xv#=JM}_}`NVTm zvyW{TStNVhRQj-++_n`L+V34Q^`0bIFqb8PWtH>KwUZoq4;6mg?)qKGO<p$g9P`xj z_tn#%_s(0nr(2=g^S|x9P17Vr8=a@_H)S+ROwD~N<RSMkT>r~OuD?f=zwh&1Ghxz$ zR*e(F_bkOXYESXJebanNr{HzRPGyITn1T(D9P&OVo^4;vwa$O@TZ47;EN(nLRg)&a zWc}2@#H8mt_UXNki<$HF-F<iQru{dL*;!UM*KU}jI&W3whpuA1ukMpK#QfOdFZx~f z>HOF>(=PUPug?1wcnTl;=-&G`KOlR@wzlfWq6+8cZY=*WDZ-#O|FV{4(#{tS)6-nt z^LYG|_Vq7XeCXP~O)pLed8bC}Wb~HE{SrQV+CsHXD%3?}&n$uRH^&bjWx70RDsyP% z*V{W3Cf;}ue>!=y|FWLTH@=7YJU#d$?rO+9pKIbFr?2+-ix-*hS-AU*)GMc$=CAIH zMGsBCv}N9!5Vq7MHLjTt)^Ki9d|IlZ`*~XLmOU>0?_JM$uX&z%^X2`fFn#L>jC-u^ zpUZf?JMkKeM91@Ni85I}xyeb^iyy1??R~R)t@nwlX>%X)?00@MS6(z;@z#6cjaxrW zT{g9KyF&N=|17A@R6n7Uu4h>o7!C-Ku!5&56W0o!qv5gnx6MRqzpvksEq9A;-Q-kf z!xGntW*a9nxJs$$&3fy)bcy!t)h=8rqSt?ZwO(SUlYa7oBA42MZ9cJb_xcZ?UcC42 z!*zQv-qYhPHO-hAedkosCK<Ne1*@H{8}ru-#ZGBk`*g}0V;!zdp^;gS)&4Keci$Bw zy)(kf>c)M0iQn(z4}D+%@VDvF*Z&*Jbn;TXKA+MsOWt+GP})5{W#5xM5|aZoYZL$X z*cCOVce5+iPx5%~ovAt5Qn=2W@py?_-boYVGoMROhDiMtS6^4QMIif<R($Z8kcDZF zbGJAxH=0~`LwdQ8=+wfe0k^%Da$I1xHfycTn5w%aMs1Bw|I5cWFMj!xWi>PY{KVP( z*<M?Uf<l9IPh`G7u_La^RxP*c^|y;L;xD7ZRYJ9d8M(KM==JCv<rU_b!FGJsR%e;- zPj!zZ&#jlS^E|Xv`K89{Pc?s=@6=A3#dmX}+hW<7ikEs8WtiFj{QO4As&~;vKDQ;0 z-a5`$rLsO~+4h;%9ojROPky@l?28<^vwF)f|CATM{KABx`p&%zeA3OYY)>EHWcOQ; z+o&q*T<6xRQ*pejNH@r@zUrFq&J&RfB4+-P>zeMxte3f2?erm)1BUZzC4HuAY}n7r z|0ZqURa1Vsh+hZt`+OEZo6)h#|BsJ=hI5m^wf2`MZ&sFA)z;hWmFewhTYWIjLAp<t z@$FmDNy=NR%sHg=>W}d}xor?G{xW9Q9C`8Q)AHxNDG}|{{9Unyah=|!?}k<LJnk%R zdi(R+&0o)U?I?Cif3f@Py`PPI-(4okZT9Wakw5-mUj9RtEnlZ`uy;>5buG7La*Twa z+yYsaok`w)1xHk0eAe>$IJ07sNBe8V7oN=r4{rUi@UR(U{-O9!fA`*#ytsVQRR3$o z%<f)UWBT1q#pC0utF;y<6&)@d`#-gGVaz2n4c0DJ(??4?=HK@?9<W#L!1cSHGgBrX zefzl~^>rFQb6!H&CEb^|zW=@-=Wmwh9U8W-bjQa}zQ6D9X8Ngcrb)K);k0FSr>~?* z3;0}_>iOf{k+d)CelAR8UwA`xt8LS(X03~w%Iv>GHZXYRvffP0&EIyZ@Al6B5v^UP ztk&N#DeB+iV))qONr%wH=Z@a2omZ}Gl|K}i&M<eyf(KJhSUdmPrTI5-ovwYm3(vB> zkJhEkGf&uEP-MR5=Z7<I-w4djKGExDe65*xM&I6?EsXcu(=0q153uF;eBSrQ-RM1o zhgj-4*5t$O8Unv~osEthN~*37WdF9|b(EvC`V6yx32W?rA7SD;e3I$Fnfo=fk|x$f zb55>Wq{PXyQAk5ARKH<gc=`*Q3QdNYnjFjh<ewXv9dfwVX1wh=^BnIlPA89jWpfYl z6X!UtUe3FB$)!8`dyj-=XV-L0ng3a97UvW3DWCrTjpJdStmj>@=UK!JEhFWnuWM&W zb(;J<AQaeT!Jo>hy_Ll<>FR+m-wn3C-yt6qYuGLw;&uJ(0rtqeI2Pl@w~d@5u8UTR z`q=tCW9E<!-}RR3yN66%#4BCV6K1Arzt-$JRV;Nj;(_Ljc8QNt39p#8ym{4mK=g|G z4C$sxmBE3#TrKWOzh04fuWsS%ZvW|@#Y5J2+U%FPdtE6$=h!ViW4XKaI$wBS-~IUM z`-PjDTPpTn_*uBzDZBR7{BN#Rxm}Jke*NChh+0y5zk9taO`CzCSD%sSQ`a+d6Vp?1 zbm-sKzAd_aqUc4v{n0tMRs|Gk+?-TfV}4C7_2#17(3gi*FIMj<o!sP5;Gx9E$i|>r zIQg?fW#8|l?Yo~dGbcDSDJjf8e#}zao8`irnJ-_ye^>c!%g)y~C#U;I22XD>^ZL8e z`q}Tvprh9_Gu|hk``s;>{y4#Kwt>^s-bEF!mT?vzR+RoU(V9O<Y`5pB<Y(<4il0>7 z;mTE?S$JOl=e*g!0(b1*FPYaHBXnzb#<q^XA5~J>|9{e7|BY|Hz5NTLAC(^V@fXfd z|MGeLm(QYq|Jdhj*x+bgnEzMt_4&sWj>ndX@>a~*wEyS97WT_}zPImN+)GZc;rf0| zRQTd4kKe-fiOTj5c>c}Z*$`op^s*)0+qQf0|0i);0&{n9i?tqX;<cEqUUTED^K3Wg z2>(AbIu80@x*>li*e>OB0SB|o0SCd$OI}46U0}NZIPuW#H*dbgzJIi9`~Cly+ILp& zPKXm(R%h}3u%WlI%M$H<RTonOb86Oe>RwfjbtztOM)8vD0^`EqUn!676^Rv>dvu(9 zzpU`av)*HqmsHID_u0nId*=L27i~DiwtDVtHO-y0-!^fLWy5)nsA6Z;4DrBI@tc#& zlr8+&Pg;CjZmbYEU3H%HJJz}r6BF_huRr|fyvcP{r{%;HzF9l&eV==}vg^I-iGxai z9;}`3cQ-O9J26@^vv~D~Cnxp)aU8Qt>ifK}zN+re!sj(5bJX`AaJLBm=|5kg(dzo& z$K8`3Z$8~Uui4n9Yq4g>s=_yVlWO?`uPF4YKRkSa`<e5(I_ahD%{%3JzN`QL_C$O} zMLkPHVN|uepZ=Wwy^kl~yE<7{Vf+1cjh>Ager<PKaL}|s_<nIvLZc@$=twh#?eFVD z16gvnEz#M|=WuiWB6j@@!6@eGaxXdk_uQDD>voteuXf4{jRQ|7G+OR>bM)ao1{cMw z`s9R-U60i=MT*O~tu?x8%{MrFUZf%SOYubNlP&5sZEKiXYD6XlxNSWD-chvC-ocEy zoL$eZ`{8$ktq#t%2Y78CJ(8L!c!1&M+vS`ux!Bk5`cVJp?T4%Xv@h_#W4s<HurpKe z7Ec~4E04TgK5q;Q?{m4Id5`*?57=}hY<m(VlY8{qZokJnr|0eX`6>E+`JxSO3rq{P zZu{ETy6A9X{6mp*$#FL_^{j0s-hO*RCFa>7-+%+f7d)iJt0gjDDISaP{`~FU^MeMN zeNOLgzP^5ByV`-ae=KDWX5Fre<;`EXU|}7n+R<AZZl!X&NF7^O@Zed!{lVu`dUn~L z`n%J@Y2C-~Z+hjY_3o*azH831wsEzuS<oZ-$r=v3r@0>Dd8LvgaJE%L&gFaTv-h8C zCmmAFP@Byt#+)>*@krm#E3S%jo|Vf+ovXTiqd@xC#tYl!6>?5rklJx8+3UH1ZR$Rg zug>*W^Eb_H=)bf#bIOvdd7H}IxUL^M;Hy9VSdPHbOq0K1JMPZkZB}Pj`kuAy$<gS( znC{Qh9!@(u`;bm=nzq_n**iLm7%k_z8XVYEp82t#YyR%<u~IQ=S^|g4IJ)92=9}fd zTA2D^j=S@|S9_;|EEX0~d~8r@qgK9m!>=g^BrcWnS`=0Y3OIc8Hxr&2pC@?h#{Q>@ z(i5V2%NTxrY|+0a%UAn{>4vt}riQrm2Hx@qx0gtqbe29FSZ5pIA+o@<;AQBKyS&f# zI65|dDf_jw{MnrNd0*yqpYE31G^5=qx#vUj`HKba&Q|-L9{##)qv^Mq@-KfrJ^D0F z**5L6M$aBk8Q+~MHec8l2NgHeZ<g$5J^JiL;H3gVsapXlX@agw%J-e6=NyVu6sYex z_jK;(*V}i;mYILt%Q?Hq+=u0ikO`NihM;~d@0M&f?gPn>)ZR?H_VU4p@ZYa&E@{>5 zu=<yLIF#e&`X{nM+6K=QH%w88keFBb^m60OFW>JRDF4{kVfk!fAdAq{!}GX}b)M@Q zim7o~o=wd2EZo*OnKz-e=t4tsXXZY~^JVN|Po~|N&M9zzZ{u{?mRTh?I7A&2eWR~^ z>E)A^i2BCYV<&CuVE^Z}_H3~a9obbo-YpU<6SMp?uk+{mZDEC$hI>41Y__j+&3IHh zN$Sa(!!u%=1kE<-Xgq2UuC{!v*veNN_~ftBmi>iYZ(3y;TFiLbS{b|!ELETIZGQ*v zq%AL-q$=58%e}wtw(H~864AK49bEeL>ki%eJT1O;bGdr<=Ix??*6v{lm%q2@@XxpH z+81WqBqU}YySwI(?*WO<3*U4WNZ2@sJe_}1aBb@kw-k++D$n-xM8EQ9yfIhb>EpVD zv;>ph+AG_7=J3t<n$7Tl%`?O{=t*w)-tNiwrq0{_KB$;s&z$?_w<G(vE-RdJse5X6 z^fBM{+ah8N>YBfXm0z7@wSWEQRk~7ZGHOKLtle`lDxmxSRNMDa?-nX${+5v}xca<3 z)I9E1-hm~dHE;ght4(r#`J-Dx-{+1&QsNY*RNuwX=Un)X-T%D!pCRwtz*iGeikI#9 z@cldghqHOz3(qpyEB>zR_;XZw+5=ZbH{;-tGJExyW6sG5_M1H_(zF-sJz1^canN<+ zyd`(mX1>bp%$&1)f<S0}%I_1e?@jsHT>4__g$pHXn%ZPiZ8N4=1T*s9JXLieEw3P= zRk~1LdPnMoIKAd?MXX!c^v<YHI_a^^bgRMduIEQrMY1>?{hSo5Q?u_;rQv6@#=yUa zykB$cH!eN=M{)oEqw*V{+bgvnk1S-Kx9rcsb60d9e)!wJ{Q8>z$Ct}B*ZWt^Usv_M z@3(Epe1E;0M^oq5?rV$wyZ=h_wF6rZosE9`uyksgm9X}8T?b{|@8|s0xAiuB+<)n~ zD*N?mE*}aMCRJr>e5^PS^2Pn$f;THB>@4hg^{->^4P|v9Nq*LhQ1KPa2@Th|+PAqW zPMf$(+wGT;^vgouJNtfm)H}B)PX6=OVq-_Y-sNb<&iQ{%-IMvU%fNMdhKIDrb<r7j zf|i|IontZ4xoiF6zYO2*8wligm3(u2bBw#^_~(Qxi-MQttdW$lHNKuR+x2#~*{?}u zllLus=Nr3)dD<;sHYRtcHC%?PFHP8A?|9p-sQaP+4S^`;>x<R4XLv444R<M&|KnR_ z>S}nfPB2Q$amV4<vg6D0Iz$5=J#{(4pJYEvJ!9um;i9uHpFbX%rByt+kV(=l!n$s! z>LSCwcbif&G&NHGurBk_W3mgeWn9a-*}8tltEAmRd65j(hc~sPWbZip=Zf|txA~<F z7x^b?91v0$+^A%pkQe58Pw%j9>HZ{^I>n@vs)|^(Rc05K8XQijnIXDFxA9xxkJqkY zGaO{JPc1s)Uz>2ETv%>apAS!_UgNV(vlC0i%M3(+`-Mzyt$CBS;Lj9?hQ31M`K4hG z+8h#imM@sV!ua`4i#n@~;q_b-uZk`i2DZH=_mrGp_pUfHQK?ttW9#hX1j7bv-_<J9 zuW6(h$oGZ_3J0Aq<b2Se-s$GM$)s~bMPj_zzqK>W9ivXF%wl);I>6yF&2k2-(b4&r zm>QpU%KUzML1T;W<o$k?G1i~k7-KTuoSy4?v{B+zYy65shMQxq9XtET)Y7Tz=$z?~ z>|AxGIZqDEICR|H{G$1TX){kGvAG|rP_A1h<gBhBRVrd+7^E8ZhV^aXsXJ386d2Ve z{b+XhsrOyGAiH8o8(Y*efjdzT1K0|lEOt&-o3!}pj=<8M6%M``yDsf{yJR_cNZ(au z)k_!L4sTx_cqIO+!i!ahCqChJSNgM?Y5Onk1<&)OpRLUd{%q^x)zLKBso})go|%a! zYs|VIg+#RPVv;V`{OO%~vY5?xN~M%iodmOTx3Jk#p`S@<^G+OHY$Wp0wK5}E$9Lz) zMG9T+pBEfnbn_SIJzc4FX;C_Y8EIR7MNXBBU9nLv^8JLM%>Axf?K@2QQ?E`lFMPb* zYesjqLP_#xSKSRqa%+_NLq9(4`psr8?0?7Y--pbfoXSh5yX}|Vcx>6~qSU+1#@)*N z7U71wwyAAl)8kybGxSDRXzsnYim!joZn$>fYFtgClU2*7njf7<e=b~IJ;mnSE>)2Q zFQ0MppI?7Z$lditLT8~#|Kv^D4)-S}`JKD>*hQPe{L=gYSFPQeN9I1Av32Da%`;0* zrDs&7i9B%YUFe)ux6W_7kog7K<qPIF9_4#B*+ck=TcQ-B&eYWHW|ywWYKMoNow!Kj z+=O_mpfibKvnR#9f01-2_|xQ0o7xM~6{}9Y*IL-w*?2sE(Zv<YpIo1PTx)hI=G(Xb zf8Woyd(byU*4?pig;>FqQ+<1zR32<l-ecHse$|v#wsl?^3s!AlKEe_FCUKhMdX?P{ zJuyP+s}3e9Wqw<=@M(^*_}NJnJJk1BXC1q9<ML*=2mPxK?o_%x_3&pdpLe0p`j2$Y zGQM%^NT#0J3v>TXuhQIC%>Su-JXC#&s0jOljtQy;MGL1$T>dTf``^8zugV;sE8Dw0 zpUCoZalPzj?UEXA!v$U$=I5<<xaVIH`2YU%{}&t=l2T7ZPjBDNGV9}1wIlU*8Z{>w z>p1=QmQ`NTxZu-SA+*b|H9q!U&>{KAiLV)VfBOIAS(DB|-j(8a!*ZM!n})Kk6}#Xp ze2{%{!A*~omjyLjAKkS0)?TfAC;w&Lv%fq4+_AUb`@-`5`9AxY_x95^s+%4@bIVwF zLr%6#CqIMi?z9ELbzjRx6*+fV2AzMR@bu{pM(-oWy;lF0d%ehVU^%5E-JP4E5_IX= z67JSp6My!!sN6Syahk2OP2Ev+nWuA*wfM{qR&7(8%Mr`+O*b+Hbj2;t`?Ph@-af&f zQ@wY|s^uI$8FI9Ci{uuybz;eTv|`09?#=rk@G2+rN$nEu2_lM4$97q5-s&iKi`Vwc zg@zo#?QD9s`MM#Kw1gJc{CvZt8MIz!i|NF)2W3CEci#);GhceBvq~{S&pH0`*V?Ux zr#T!a@M*em-WH7dv`cyK#H{*o;Y;?ZzZ}x1?^%=W(EZLq@}-8Z`^Nnl6H1@NFwf$7 zvUGA~li%&YGlqv$7q8s+XnE;EUQ3Vj85<YH?9k;h<XG~(`u(AuHkO6==FgjJxM;$5 z?yH^KR;&58EOe`DhzwkGZ;f7_$cFAid+jS_8m+W9y?tDHV5?=Lmv3wa``tTH_ZZ!_ zNU5cLeco&GIa=<W>tV%%3P*16S^j;$=tuU>qRNx55B-8ZEDL1W-(@o+DfgA~nwO$F zudbH*>#j`o6|O&Fe3sidF#PEJ;_0*MvRXxd+xWOL9OhPf|N7qC`6AXlI(tjzOWl|} zlUMQTjyfB0!D+XCZwc_adHzR?)0Jo9Rpq*SeUg|HH6ES6*kfdD<o@E8a;o(Lmt=S0 z1;$g>n;dF3U6}YWeN(i|B744-x1x&n{`x#^vzOfNyWNg^m&@zvt*<(F^6FFdA1`)! z>^;?VN@jHv_nM8%J~~+x2fvwV)3f-dTwdp%tYB%WE<r8TPeF&@O?Y@SB(&jL>#@Tu zwdYneHb%8=op|!d+`_w?Eo0YA77U*D^^(9@%Qdf^POHhZsh;RjEiMV0k*V45peXNe zUsGc6_Wze(Up^i3a9nvQ?bL;7@zbsykNU^`D3X0vi(=S84(Sz2g%i~_^SRIZ@tE^? zn7G#V$NQh<DP%kj(NNyHFw?AMjbLP;(NYurr*9&%mvsJLeoFSjS*1TN>a3k+W?L8f zo=EpfC|Pr-`@-6(pB%n-t>-@bpnKh$`N@fu{SJGtFBg|TS9Nar<Lt!nXDiJEr3BZs z9yeX}`a#$SeMX(Blct*Tt>DjnrnaGG`=<YU9QSQvtypP(@sjtaqcyf)S;dYp@Rm*0 zimhHUDUESAEBBp>GrWgFk3`ImUdFccR!9EYiBeOt6m3gupI?f+`Y<$lcaQD<`n>9O z36+nE*|$CKV&kwW&!}Fv;>w|7{oM1SSJ^AxU02`6-W|juSd%B~Rd`&f>w}7@tXb*7 zLl^7c@QT&%Sr)%C$vHK6g5w-p(=&e@UOn9R;`N%j<}2o=n_h4*p3lTLX_kcJN`|OI z8apS1-b(m(_7O98+opXX@ou7PJZ*kIHNP0pKYhRFlaxx)v*zq)%+pn-IGkQ>$+fwm z!%$!QAy*S`i)W1(M^dx(3a?3OnT-Jo-rNErulUwYo4=qnfq9a8Bsb5&yRwgNiaHy1 z%w%}7s&)0WO(z&~-iwHDJi?QsFFJkwB;y-#dU`RUyEp8Oj@hKDbL3l9;l@>x-EZGM zG72@2-h5B%vDbUM_`mmxe;t=EYdN*y^o&1m=ilJomR)~Mk#G4r=HJHe_4NJjXO_i& zJo9|}P2+aa_-p(B{CT%n`F7DCujYWdfVY0v+V=L;K3(c7cuk(^efZWyUFL7!HvJb= zKil>B|AzYdLt*h@GQB64vl}EIc)2_IxzU!rX#(#5K9&c*s9t(JvvSqF8T>i<50XOn zT<kwka@cg!*+ZAg|83~6lYZp#{`tb~9}7jVEwOkmQ}U#)CH_M~25*e+u}(JwlTWcP z*UUX7w`|7D*Fm3TM0ef~2+h<J)OeNhq3!dGzLf!XvF1Ox>g}bALKd!M@%rMj`pDWw zZS$Z;{YM<%80P<)BJ0o2{6H{XkNaorG~Yz4-dkTA|CC9cdp0|*<XL#*RN;*;rWl$m zy`-bsddqB;XXP9&p#`gVEMjspVOc7CT_}sW?YZVeC+%D1o-MgMo@RIjKiIw|cE_U) z{$^+Pnial2TG(P4<g9Y+`KH_~qwfa7zi-c9!NAQ?|JG*fr?You6Zbs%WO8Z6?hqMq z<BzIO-^e}9-FIiYWs`UG#2*Kj-jMwBL-XjHpfyw8e4XoU_;Q7|mtk#%^0UxBL+c$% zUw_I6b*=RLsd-dN=B2;pw2x=EEs2=vJ^g4z+fjbKV<#Hw8f0$Q8Ey;esywuPgKd(J z!XBqS$*+uQGaKVQR>Va;*lbqB%eS>~<%(4*E_0bKo|wX4J7;|j<I#rY<uTjDIb#Gv z#F~!U1)V8hFh|dzX=zJq<UY-=E2%q73q+sVN3UXfaU@eUl+~B9b;>Rg({Aa)!m!X& z@y@I(4)M;f>X7;n{4c-Zw$RUf4w=<V3g7P(={{iWI=pLE^O4PKtR$F!Tr6cTS^9s% zuESZvHx?Tl7JJFp@;>P9!bMJn`+c9>n)Ho5Oi|<1|E{mAzFb%w>U+psE^6Xr)|S;9 zvSX`PEVZ-w^fJ(^`i4X8iUV&OUmf;;o5*};S|<O@6OqeoW!9{<Te0^0+pm0vPTlt= z^44l=@!rl}?Nl5bI6YE4iaETy%l%rg>)c6er1pu03PqO2259(XRK80so8V%&-sZMv z_>8JWx4bi$gRUIVWu7y8gS8yXk9@JeN6Yi}D0m&2f6-@K>2~9Z+f44Z?cVa>#T=7M zwE>$Ra{XQ5Hh<PN7P(wzW^>W`D|#b$NA<i{ERx#JHUF|u%57&p&D##^R=qv8sWXRn zXUe1g6-KdVW&ZlEyn4f?%#6F{X5vAMe>Df(BjTC5PECpvx*{#i>GCSu^yQMR6ZtA9 z>^kOg^uBK2meXvXr|euDvh4ZgE8EtYncus;fBh}hCu+xx;wE14Syjp7B|C44qF=np z!o(mAF4mW?FSqZQxuHBHvCICbT6e_@9W~*ksC33zuPZ;__$uZlAvyEM58Xxo&K+=< z`O{b`V<*P2Cr$U#?Rs;r-i^Qceur->K416SH{g=q?b8`mxf$JT3;)*6HN1LYt!Kvd zm?<+m+s@zM>1fmb$}VMCx~<ah@7kw_XK8g`c%!>>-&c?6UuqP$nwC#nV5%DQO4j{o zdy%Ai5Tl0el<w!6o-uW&zTDBASP_!fmlU@pMC#J=6N?%ybIFNHFYYMJcdwqZ%({l} z4$Jdt=X`F;L@`fqxpqe@=kTg|yW?a`U%0T`va_}S=iqsFHt3Rzvm#5YPHXzj*E)A} z@#N<p<w`&Hy3TjHI3-}aB%e~wQ?*~5o7P@jv+nPO!+rh_n`HMKnwOSg`kOH;=r9NW z6uv*}=j^pO5`FAoYJ!aZqDszLYa07@e)+KErcKg!b{)OLb}@w}96zR{8FVg_vA)rJ zR9v*_W8J2AnHR4r=RU{^+-y`7_*L$<pp^4;%kS(z9t+g(IUujUafSN|VX=(+oAp#o zWx})e?>zir!#P{0V%3AXuDeXWy<(8{_)_2<bt`iJkHrF|;>GXg+ax%i*`=`2V!^#f z|BGyr#N*tieiyjEQcG>qo{|oI**#J3mx}+mv_9vg_nJSKylb<==RIz{JooXxXeGvI z3+K<wVau%F9~JDK4Z0NOykxfJ@=H>TX8fx~mcCxKaS@}g_LK8pYYlh`YXg|3UO&B< z*TLzI>!VcRSwFl493x~-O-OGD)I0BbV4nFe7S^kOPaYMMxH2)J$2a&<(y8h4#x_A7 z2WlPeg?ne;a`N8ApI%?{>&2e^d#vo=b$k82p6z+#j>qp?%VMvdT*tSicfG1|ZF%Lt zm!E!Z*?+9STiG-!Xu{^cl|PtXns82&YF^USFem9_NYWhUsm*HJdF~WWxF!48Kt<<> z-EJGZ#;t|xs@~hh$9{LoIFw-&-yl|O#oDrAX0m<c5#vPbCH_0-sn5!PxlP=2<NX_t z*B-ik`QOiv%eQLeebwq{Q#7h${`I3F`=3e5BOYVxE#|*O_-0J7cbF;rSzx-r4gV8I zeRhioij^`xs!n-+s_2Ex{K~~g4wnin4Zm~x_~xW{e6HH}t}5UC5w(eHQ(w*8)QG)Y z+eO6PLUps1te5mU*00EjmYkLSq-@8==@&fXL|^|n_QERL)PBasw(@lae6zDx%nD5F zp7Hu$NYl29P16?S*62oF@lT)rx9<I_wXSn_9+=(X*qU)Nu-qZW@~Y+r247RYBik+~ z++X>w^h*CaZ64bRw-R_x?ON1-V4A@$!=mMOWj{5Yi$g!B-`pp8TTwGp_tvbAG&Qz^ zAw5?Vlmuli&T5~(VDId?d~bFd2gx+}xM(YTzxOy$w`$k!t2U3bPHN@UJdN4-YeGVB z>e-)(yoZl1lP<Yg{I`DF?b@Knrn(us*E}wL;ND`t><4qj^SteB9Ez$d%yZHk^nd+O zJ}U3&D=_J(B2VLim}ZWwrU}wr4rh*ZXPIQO|F-Z*UvIhn_QTh?x74JT^1bzO&+&Nv z?_V7=s7_W}u_Ek7<n<+M<_hKfJHPFiXXu4{BE6m$%{gyob4_|GJ@3rDEq4Q#OjuJn z;bPs2Bekoz47x8EneO45mF6|=&{d@^jdnYCbIp3-|4pJwaF(CXsus1#t97y&#uuDi zjvv*^n3Ns4(6qqz?ANAM5y7i9R@Uf8@6Cz~`dPFsLNsW}r?WYUt6JQjuD+=i!r2>k z<iK~n+~7;A+R9jazR&s^*`K)kfbfs+w$`cQAL8Zz?QXg6^;~~TSM=u3-)x<3Gnqb% zDDxMe=C$vB@$@EN;jHg7gYWgeJ6qQ=PlWaC)jpP|n>|zH^D=8Vn2XHhS@s?8v!5Ge zG~s~4>HQh$OJ<%Iaa-Cu^|0RDZF+$Uuho0rIXq`ytvZu^$*dEb7ZzOz`Ce?ZrcAD3 zm*Z9j=Q8Cq&V<q@iH_zKO^mmM&bzJLvD5zLg&oEjCAZ#8ILyO(Lt<*C!u?-+Zp!DF zo6I|)Xddo-L2AbrkKc7tIWmmq%nuG&btvz-%sbJ%;o5<v?o~D(L0@i~g&z7L_`~_6 zzj{P_(p=|*;-QZVOFo|YQ~hV})g^6Zd>Oih1@C;Fa?<qrCVZGK*YkI>dagy-jg_;f z-Jf+qBJ*~*^roe{3-2eJHLh)EKYOBRdhDkZ?R7eQ8ce6&UYxk>%k)n(gC}V4pJktE z<9yI3?(Ca}1Cy+llqj$n#pV1Kv$ho#a{KxyuJC+imd>{_i>py9e(jn!bK&Y<(CmiC z>&O6CR|`k;r;cS}j!njlU4JCb2i;|SB*U`qd#QNl6!xE&8D8wsb$-Ymkod$msmIBs zVoKVp_d6TkKN8Pu-7f_0fBH_(%v4{kHLKC{l}ZlNrN91DDjMIoMa72Sk1Np%V3&AO z*xY~oCCgcfjYaoWik>|T6qR^nRM5=dtWmctue9-ETk;b5RWs_&m9aVGKbAQBdiT{G zj1T4heO;f!zPj|uVS_{7m0Q{}+~z7DSgL&0Wlvl{ruQYk*0yEl`%dLeNDsO=izoRz z-*pDwkU8}en?-g_Yno?1DK;o+|B5RAyX!w0tUDSProGT<-xpSikZlj2ZJH^4`1%zc zjTpmAZ0qjq`PkFs`i|Gip~>1NB(OBA%CF1%!lUG=A0xZ$3oPF(|NE#^pG&Lc(ZW6a zJc|mL_gd)O-V!;H_0WC3s|#BFOlDm(Z@+fn>Y}U#r}uSQUubhJ+u;7k!KhotJCsl3 z+4Me_OJDCZvgcYJaOQM9y3~TxK(Wo4@ox+J_DPi!PB~s$#lUOHv2)K0ld@0t>u#H@ zTN;|NtF*_$!`svQr7mM;-lwaghw}nwoKF;0&AaJ%KdI0lSaiC{Bu-_n?|-#2&OTC` zATT#FMD8T7;+>6(Cv<;oZJV7T!@Q%mE&iLq?P*;7?dt-2b!Hzs@heKTHM*>9`{IlY zQKo;r?}T2zJAU+ot5m<$P9L>)$qOB_C)V0)70-VY;J#-0&sXhJlBb<{Jn{9%u-J^7 z9>)3%3kt=PQ%u_zfBXIN;-shXEownKjrW>QPxq|6ZY-DV5+Y*8Ufkb)Z;@8o{Wl(G zb&A$~pJFrX4)5U(zGUg+cSKX)uXug%ZMEGMQ)4!h(s^q{)Xf#*&-d@QkYCsLzhIrc zY<x`lg+!xI$BSojuYWx=XUE;1OC2f?{;@D?{%rO%d>Z>Q=aa~O@%Gr28@u#eDl?Mw zg_a&wI-08$#du&soJ^Y237ZW8DcfEiahn{yD)+(b4gFrxet$LndziZ%|E8LE`z_-< z{qfcl&5s6F!a;}D%l^&mb<!(5^kK%syuQkpkAFXTp}eMc_QSx2S2q5&ugde5EVOA2 zSJ7SNIgP!8PuZ+6KXKOt%aSR<P9MI!RJORV;o>FXoBCdwZM&_PRy}K78z1~p@s`&% z_EKhzKW)o{cHETH*;czrcAJ7s^&yuDS!)`9_piEgI<oTh^4fVz&e>;GpZs_Ha`v_V zkAwRU?pL?9VSBsdzI9`7QPD{~z29#>o8Ea<FML11w)t>@rkG#QS!d_7ocs^>&Mwg6 z3iOGRwRQ+&jeI}Db6<c^W7K=k`|X+$C)}@I{CSQeitYV@7soo}wyixf%j;Fg62G<A zc!fXjI2-Wx@z2c{4NMbwf2T^H6`%F_YmWFerM-7=7wrCTSMa;ex20{jqnrn;_U#Gg z8-%TAe3sKReI#wtv#F$ci${mgh3Kcd3r`+@_j+sYm89S9(~n;N!?@_ja-DlJ+mEFh zc7>ZSId^XRzk)ud%K}HV-t+q^&$c-`yT|q6t17vTZ#F(^wOrWsvn)@M?R#)lUe9g+ zmp>WqNWEWrr{PD9%Hthpu4H?kuR2uBotn<gYqYL!{qMcnRx<Z~etLRZ4K$U^<F_)& zAg9;mc=qcc1CcP5Eh)9HdGGo4Y)anF@z&RE{`?D1(^!u0Uu(R!S4~8%b<UT2^7VGF zxy|x^xz7*p-)*`s_Q2a85jG187Q3E{+5W4CBk4t+=7WgZr!t??Zf<=u-!x!p$kqj& zv%XJ}%9rT#U*L81e~N5Io7>jn4eVQDUx{zz+j8r=5SJzE)-C(1L|tr>dGDOznH?;t zeB{jLbzS^xO)te5WLh0B-t_2&Soh=2Y{pZ{g1Bcb<h`(fd7j#$8!_#<*ADo)NG9Lh z*kXKUnM2dl?*|SAWQVRS*t%eD-;o%_`_1(RcbKv-n(`lsU^bta!8Pl4f}Ip&6yLeI z%^|<l`;~i6cYHhkdi~2wt4&|6-M49j=rN%~FV?NjF!PRBl4rPeL0|w=nDIx$Z9Wrc z8$}=VIFtPLa(Vjl`5zuXvg<8jlJRgZo_tL<)66=!FzNV94P}cBhYmavoU=~ML_z1q zz0EV<d^p5*aj(%OqsCb2?b0nz8G2G}U9+55uVt+XekJ=PY1XRzj&(=ZvYz!n6KcT! zShef|>$N8zBcsHlBJO#5XuqgBzC-gu8^_dZkDq+#nzl0IZp%c6X%?yzx&`b^cc#95 z{c>|m&zVKa8=rqazj|KaE-stm08V$Wpo(W3UP*54emHabp$5a*vNmT$8@h{F*v)q- zYcBHIzq;ydsN{^L4@2rEK2o@LFm!M0>-67pGVj79vUEixo>-oB10@ZUE2oa13V7yc zGp~DDh}PE#(HkW~QyD|rwp~lSrCpf);MAQ5yy6lwR?V?8b*TvnwAd&T#XNmxwD{R% z{nv^?b|!vz%zanO?z6x5KJD#;RfWb@E}=K=P8Vc9FnY;r%l;{OC)doL#j~{ob9l{t zDhgW?LU+7m*%|cfpR#<fyQ)*)xq~iuUMx19kj-yyU#el;@Uqf5y35YU;8#sy)xVc( z%J1!d@!jv=r;Z(}MYpAQJajh=%)Y(yoJii*nAcP0t({ganRohSiE18iOxm(}TeLou z7dmYB&^qFr#p5fIyKqZN^4ddZS7|+;^?4Ti!wGDAS)!h8dh~sPx|$Ft`_GROSGcDN zY;W!?eWCqf`c4PF__zCoR?ez^G-q<<i{($JEe-vA?ZDEfnU`mt*w7)if4<4=n!q}N zRSBo0S69uyzueM)#@Wkv&MF!F^g1DwCn>hf_~Sz5+y_Pr=H5zokusiEIiWb=eB)Hr zD^K(f=<28GPEL_se9vduwrAN6pQ<>PI<7hy{#-g?-^SU|_s>Xs-;XrBB<-A0>Z10l zcarGbH~u{9r|#Rtb2j3AO}6w*7X6zIm0pWJa7Pt3uiYD7AkM^Oxb>dfzCG%D=N{JK zmQW8+@AR)IyeAS~x9!V^=T;(@4x~D0r%Vsmbujb!B7Wr0{$~dBodX+kF3sL67MXro z{ZY*JQ#Si-@-|&wp~|RuvGUC%qg6%%Q9RqEp4MC5Hd@VmCG*IlkDHD;Nr<^0Gk*Fw zxz$g9-b$-Aon`y%)|`w|o1Xji>3PZOK>G~ei=iw<F6$TWS9x^B^P67R{(r7#0!o7> zE>Ztj^z`=An*!qRY<lnB-X6H~^Ri1Sn@*j)b1BDt%C5aU>$&T`Z*V%bwy^HW<`o-$ zvtK>RV9oV2cIDy|MH##?Yg4s+f0}fOACgwsz1$<cVNY`s|BQr?*eiE0dFX4pT%42a zwr*zX64UUK?4s^{=ZkOMHsCwrc-m#f&PCcjRW2W;68Nj1J~86oToz~|vheI-+noCT zu#Ip2JpLJTRpp_j?8>g-mvv1=ll*m`J?5D`;paRL%@3vO|B5%RWm$M|Z*AYZtxT@d z7ACfxxzO8wGd%j+^W!i0xG$%iowM%E<efa0tsJIHr!@b3-G5jktS=@ob77Q=R_>}9 zEs>xRxa9&<i?=V`bMx-W&JsiBt0z-`{as%5eYR?7W#zKVQ@!v1O78wOS>p-+q_4NN zU$t+z{CLF{d9BpL(>i`-F-Ca*5M5weu-3~mbjkMJ$z~g)_f7sNyVz<I!^`9MPKC?( zENg%BRQKkoC=;*cTqk41zm$pG4vIM?l=dm`M8;E{t`AeXluW)~`^sF(B4x@u?f8Pk z{UUb{&4_X4aO8~2`M-M4DK?YJQ#&II^X8QKsjpg~o%cv9a!#qHT6t;Eg!>DYwS4ii znyJ2MCWG4jTK4viP93$Q!JB7Qa%m<U+;e5wmpjSZ7ZseDtoQ8JU-e}SvsN2;o!l9A z>7wgN&h-zA@9KR!bK|h@lxx>Srk|8ta5;o+`<;gZ&0;HpPxq>tCMU<rYku!4@cv`J z`C7>jYX!521cfxwxVI0l?buqZx_g@Pa>1<XOznl6P2K)6N9XV0xU0EMN1QvPMU9vJ z))M81exdF4Z$;itT(tI}*YVF!R~M<Qoa8SwcXr^OXe0j=zBQ#w4B5F;yB-Vu{r@B5 zNwcn46}Q>!<1>18Uz$)G6YAQ1ZO=NV=`(s#O$~PL%k}Sl8}?e&%JKFccF|RW4<oMi zn!K{#R#bBKa<Rd)|ApOQ-AOk^9la9-l&^ngwios7^Arotv0iv>eWuj!1#>^_VS3cg z`a0wOB~Q-scN6%ZC1-K1GSln)X_Hs7;;YlE$cwQDKW|vhAHPGganJnb2QO!Eh`4Lb z?6+9?Fp)F;_EMvodOhD`E=n7(q{h8lsFSwR`kI-Unab3qC!Ajy@>u=uIll5H_iEES zcV<jFoTFJ_QP^?GxRw9jjOp2i@>l<+ept4tCQ>)fYg5yy(rNnwI_6w#3GEQ=Ii*+@ zv?*fazm2Y^MKv?{4fbqz-ZH0cyI>iw-j357${Q|5FDN*-(?;KPO6(V-jMr+X^^ULY ze9c~bLbG<>rQ6*)L2QOvt8#lbZ(Cj9eQD24r&*0$cXWbZ)gQZOc6ja78`AsB_lC%x zSvRYtTcv2@L01Lc?u9Fz7!R`WWC*oQ?0vkv(=+>o-RIWW<-fl0ZNHIn@r0}Rb8(#y z9_tMsH(J<69%nS<H&c2ha$#qBUQc9pYw{`9O-zTs_PyA2Hkvuy@a-wyNgAj3PWs2N z_Vr_x-k5kx_6hgS=4_48l073Gu;H`i6)g*StM{$f?k2_vZ}-|UrKjtg?Xm|?76f*# zp7WsSR?OPYoZNf+YJPs2wKtq~smpe)Lt4j|7<F+euQ+zrhts8g-HUlTpK6vys_sfW zwBPQT%5j?qFM@A-TIf3p_dg6QHg~q`os{nR##VaijP|K-s*TpJD|s%EA6cNRerj)b zx0l{V#ic5X#7)z)R5z{6N<8E37Pb4z;;MUQyTewToB1yF<Czz$+xXTNe<<4Ye&w_& zQ~kvM)Oi<JI_F4FdHn6w3zqo%JW<Ty(Wf@Poik6dmi5%yJ;&a#=1tNNHTb~3QF^lF zooNRz7d)L^c_;tc&$t4ixjXdpx!pMa1XlNVU69)0wQ5`QHQUo#hrHrm<uA(ezLVs~ z>axhG{e??SP|3&Bk3EfF-cH-h)GJ+UAITiGUV-Oj@zkyQXDx5C)Xse-A^pIt=ZfdU zW3z&|j-OJ^4HlWYc~|G<RL{Fdi{D&L&0CzrRciO%O!?KL;-4P-Jrj<qf6mMQsd9|- zf_n&Cwv|!QmcSa5`DQ6Pp_+?lEpt^3c`RdB*%bBSXy@mR<uy&moBlK1XZWRdr*zKu zzn4Eh=C^&m_;E-2!{Car|8-&yJ*V#9y|I7c?<c1B8u}g6S^xewoxObV-uS0c4`)C8 zP+G|O-yU@hFSmAD)_*PrhL@TQ3_3(!E|i&<T$GxNV-fFJ(5~Dag8$aVH^!wsnx6P1 z#_IC9Bfif|I%TS}e%th|yZ(ELgNn*RcR`zmDT}k;?=LU^=oFxox;xqYs*2QX7P0QT z>GSWh))f6InLqj9NyF+@{gchsr%cS+D5W>w>6UP9(-vdhBPqdLX;Vd9j}}kUo_8|o zAfK;hkmYpE^-Hw++WrUMy|=n(@zbQpjppm)_j`W$-T&pU`mcY+vvcJX-!jLa?(xlv z<(Ru6+EjQ~lKsgV%}=3+Dkg56&$2IhdJ^k<G280eX><LiUD~ko%t6k!sWKwL#bLUx zkLLufuJ78iscYSjwv|fvH_S}fDj0cb+O{Cc9X#@nANb7jIvp9?*>lyEP1@z))C<~| zw|jX<=>-Q$Ox$p~`}^b9{*NC%kr&=@_Pg}7RZJ6NmHo6@yHv_v`W~9ncdd76XyS6| zQ06B_En+J+KM}Q!{IoS8>O+r6arR}qU2oie8;b5*_CHhWRM*L_v#)LLe_6EkIJf^7 z#Z3Q`9?b{2E!*dwyIE3YwsS{az4g9X^Zb`Li+}JDOZsidqkn17IhNn2_f#3LPMya) zy*_u|Jl|#M+aG^?@_hEkFLPQJzj<+yd!cE?huM}77BR&z6fy=edF^A>mpm{}qeI>0 zTYLVYDYIh=3U0*IDYB;pG0&TF&p>&HpJSgJ%ellCLUVfTnZ$gI?`w3o&Rcpvq2Y|^ z4_URQ=j|544kql%2e<8$uivv{-n@Qy`D5Fg8LPd_c@Av+F~2rF!QG)P|E2j4mpwOm zR;5hsHh7}6=$g0p+Oq+6%?=MUMcwwV_gxzHCV8Lc^tvA#B<FKZ&Wb!{B~Wj%S3_r~ z4o`HkZYb}!Roqp{9XbYK-U|=1YNuUUJ>~h%6LaRAzZl1Nqe-M-Wx|WF#(J5<F&lO- zy&y2FGLKz~olQM!T_X1!-6v8BpJbi-mK#I~pJWhjR&u!CG0|lD28G9|Gk4oeZaHgY zrevj($<fmy7Gl6((Q}@`TII6dS*{x*d+z`E$lzkocAaCwvvNo22`K^#xbAofsyd~w zu;$DOW!QY7$gfL7OrVHU`0!DIDT(H%LaxcbNjfU-(PkdC^pM2T_KS9ET+0?6n#L5^ z*dme7dhgiR6CU<c7AbhEPGIYC%-mBT^x-e>^%~WNJ)V}g6m8}1_N`ks`Qq`FOB+9a zO)26078w!Mqv{gSGT-r%%->DVDtnLpRB8Fz8TC-2$F%nTljw;-4xgJk^=m?#rvBYG zarZn;u8A@>e{Rou+dC!jV93e(wTZJ|WLYP<mAR?E2xpv|<+k!dd(V;HhfLqwyV(2K zLqx3NX01FOl&R0n-N$p?Wy>LpjzkSVg*HZ`?3JO3wS^gm;);HY_`P}?4BR^>r#%+h zo3Zs&#nHsKj~I@(FIZ5pz{QuL#mi}JW3%duK!+5o$OCJNC$JsnR8(7}*wOW%p}Wg0 z{L!_t!#6J^d%T)@_Q}C1w`UYxTJx0GMZAb>*Rch+q|eLrGN{X4Z2#SKB4X8<FAU!n zujmM}Z?HYrAT)Wd;EN5{1k^dFzMEX8y5N*2Z(rZxyX-+Mjy@^X%^ck;mMw@}WvzZ% zEPU;+J2OvgayT%P*V666u_=6&OW8QKUvHVZ?D%cN;$Jn5SyNx|U0u2P-oFW{Y@T=D zF1x1WGVydt$_q(zqtcG}$dv)^VG-|sPkHj`EVIqa2_g$+U%j+3j$0}zVl43Dvi_Ug z6SppypV9uWb}(SE!D{ZvnG%w9@6_g52R>z9_9^Eqcf#w8MY=+Fy6>%An=n_W)v@h* z)Qlj}l#@#@eKJp7xKvWWk#*y2cIUK3N3^(|0w->rtMZ8DzDv!w&3p>V`dMA?y(0G& zvYxPQ+$rlN8}RNRf07j2|Lg-gNAxC|O6kunv%jBXTOQUDk?`jGzo|lHcmBSUY+hl1 z`|X8Wwi}<+9?W^z?kLD5Um(6M;8@F{-bXJF+>kN49dc-LcGzOhlT#xW`swm9T0cDb zTlKonIqQDWCF056i*(q2ZvFIkfp2KQ#n!Tla9MWW#|=AU-|zf6q4B)K_Re*gi#fM- zO!;;zuz|^BfAOSTvF|cH9PLk^vu}G-BD6RrC)}ty#X9hKsp0{(*+N#IlBYGz+z`mN z`obp8wX3sEEI8U$d(O4+<9FukI=r#VN}CKK6aG)%`6>JHtEBDE**G?7ygqPXqrH-n zW&51T(Ht#8nc4vh-!3-1%UUx*B=z5o^-p$dmi$?Cbe8xRhCi!a^%VYTSsPrE%Mo08 z{^a+G4S`c678Ui?y!>IW*Rm#`|NS(fT^Fr6D^t~^u5$i0XiVmKV0c8k`W(~b8#>`H z_1z~Xh1GC)%e!uy?7Q#)d;MNEzNZ0;X3TQ=e$~IY+~863<u1O<FD#U`3adIwme+lh z{&H|$agOYP;~6<GE-M$9AIoH2Y*3Nca(QLf?)A%>CbAw_(lVnbiv5L}*Q=Yki+4D` zQz+?iYj$tHeP`F+Ll+;4F>Vu>%Oh9j#;jD=a!dP<T;pd!rGVwh|97)KyLjD`Y3|h5 z&YK$am&zz?yUix8tJtUTVCUqE3X?B<6ezHnG|_Ed{=ELlatBqv2Y4*#OFQ{jMCft- z+LUXpe`VL(@%|`Z@Y{6a?Z7{_a=Q&e*SKC`|8Yq4lh^7gi6W1f<2#vME6)c;2Hm`* zly!r<QGe&L&EKY6mMp(K@3+(8w7O}h<6T0MEq1Bde&{(BvLUMNa^;oq>6Y{MKd20K zIp%j=G@juC!>y$k{?{M;d|$2P+86PUCLWCmyN*me>&JiTRr8+6$9!3t>;3M0oME4R z@Kgp{s-W`XK=u6BorxyGRT8@5n;ul|ZuHqu*Saff_j;vV<?C#L6D~`}7tg%xD1Y(M zCE0Z|3(h66n7ZxfT>ESFoO7~CuFe$;pRKz4x~#me|Lmqf5xK7$PU^89ozH&pV%fJ| zd;U{LDz2;#x%cxNbNc%?@6Pe@i1FmV{Gj<$;OoZtj|)B0&DcLLw)@zlt5p)?v6q7_ zy7-v?UWWxH)r&mdikQW_<kwX_(cY!=`(i}Zt#S|3p3*EnR~^NUtgO4&pIqhG-MF3c zkAcal6&t>Zvaz@Evv@FG&D+Db`1XSKu5VM%C?7HJ+J5L=++ADK#+rQ}7fm!iq?o;I zMRMPZgYy%2T@L#a7%jnDf8b&}yXWf%$@#hG%4$k(ndWcrzVX%J`H^+aTVijQ$*=!$ zw`Ohg35mzwugLp$awHU(fB2@bt+d&BI@{Xcxh|~t3@tp%=QtV1ux$zY`R(rQ^Q+R* zR=%>?oPJPrtwqMK1MjpI@@5(Tw+S!jFfaG~Z05B>%yFOGopQHcFDC2o<!?Wp-FxMm z`jRJWB~zA9jGHl6lIwm!Me!@sp0s&$0{*QzJ#Fir`A)}AMqDWA*vP$lPx9)sQ|j#A zN<7J{&Y1A`=a%wR*M^4F!}k^?KD;Tg{=P%P{Cq!ab-}%Rll7C0%e5{VB{rm(n9L}& zIKR`}c;)BAXMaeQ%$gJ5zwX$Z`xli1K3~pU-ZLruG*d~+y$J{Mg8y%*_6l6TY>Odt z@V>Xg-tX6D=}WJ9;Pzf4YKE3ea$)_ZJ=tPYcGfa=$X82!?mN1$l4I#FALqdN8>Tx> zKk|+3Lr0!Ve^P7v;bk#@YIm=D_3*hxj#QtYqHF&B6D*&aS(zNRKYiQ6`Pty@qRSN@ z*I&NQ%KI+ya?nN9Wv_$3-Roza@_p*|TI264zxP~IjAuUSF7_&=saogB(Hkzw@10)e z-M_1Dc1M~g<<XPJERChR`yR=DbX}>lOR$6I?f+{l%&$I}z53$)V?Q2EkUi1dA}jJ^ z>Z9p)3GOKwzZNs(xURErvA?ph{!p|2?fR1`{~H+O4k!HiiPpLf*4Aqh;9y|5CQf|o zIwv_LEi(s4>w0U%`}{j*LVx$wvo_XvBxy*;b8T^`)_rs%JDssS*J5_}XV0fzSGsy# zR;i>$m+$!h_uhnGJ0o{H=4&763s-4BJkva1?)%q^59eLqeBJ#`fPc1bvFoI?O*5Xi zZzx-^e0y15ON9B<1oi9Q(=rbW#Xd0qQ+mi_YpPZ9wtFF;97S@JV^3;t)19TY{r8%^ z8>V`ss0qJY5~lzB|NMOR%Bbw+yRv%jJnP$QY4^`=(S7?3zMsX{&i!aTb5m*V6a&HC z7o`(reyeoHh@>9b;dN8pG5Jl<6p7n*LLK{`E_odjb!vXXkNuAdcr;6PN(9A9{@v{n zQ?TU;@8wk)H{3Sd>N1%XrCr)pb18e)9Iw|scdqy?Srewo=h4<U<&xdD(?_Bdg%_^r zxbgH;$;MwBW~|S@-f?y}+lFAjRkH-1n^+39uASY%*mrnea`rm=%*EMip<X+htu4#{ z`JQ{vV%)U+-o~>0`o7x2&(AmZwf*&<)N#u2Wki^`>*uop|D=nmJnCkjop+K){cMEH z{PmAdU*7zqrgCT8og?obSA64P4(i;S9I;~3B0tvO>Cf)vWJNCd{Ac<@-LN_Lb;Mqu zzux`B_S?bd<=x#+wd(d;SVrGDlhz~qNyE6S@Bh(zQ4e@(J}3X+n4y|^$M{CYqRHz7 z{+h^4nEQVAG4lp#{}}tvZc9p)tn!w;Jj5&~7WeYh$)JDIqJl3jo;$uQC{b8>b!T<< zf{(ha5qUi3zJDBdoL1qTS0U%O<JGB&s}v_>9k$T^@^^Jt^zBHl_LT2CeTuZoAH*2O zg|_l&fB$uS8`G5*FHdV@J@Z}np50q1?N}-hFL3;PwAn%XA5B&Yv(x-_teg){td14e zyzCit*z{%5l&}I3JBfU`?qh*TIZJmR3f*NbTIR~9k|klooA7B@hUIC0o~!ZN^Q(N` z`N(R%?VF*q+G&cDV6f*^-E_Haw&9|Rj26$*FSH8TWz3zsPE26(<<(bzep1@ED^7oX z*vIz%_v@x_?>_w_Z6ni$>8rVKF}5V%$e(%H?)v9HJJXk)lTgce{4=QCSuoI3yvZT7 z^2VbXA?!z29G5$|?(nVo55KT5ZrWFS=i?%_M-TV-2nI7fmNgH$UctWZeb&OWceXGc zy4A_dym8ICFz#>3_8sR|H8LF6N>p$=<=C#^KA+>xJ~f*aRiT%hwLZ;|$dOE(SnPdp z`z{d;=8CMNvJDok??t+U`Ok|zSC`knF08(?!P;eO0&i$yxdv10S*4`5d@d6s{-|5G zb{!N`IzCf(kI7Autp~jl_ntQizrJqO-Qa(*diwY3-^Ok**HW3Uzb<Bl?3ZT`@*Jys zxAE%nZ95UJ&$!odMN80owtgM9^xYFOR41%knyjiT)zf&%?2zRopOq^nn6B5~I4!!p z?!ESkD_&N)HP^rEH?XW0)xR-!OGt!&Yf@oh(XUE%F-N5U38CDE4zJZ$lyA0+PYRe+ zXmBw1ncAc4@`)Q-COCe6xWkg~>C>)<BGU5}K6HIvqbpa$IZO3w;DlvO-#(bJTgP5W zx%M)nuS4kB(PrZXIy$?>T^nm{D!0yKTan-E^SpVjY6NR@Lga+*UXL{un(h7ZIUAIi zFR%5L4Y|3jQ0d}JjiXz7SN3E~R1!JRRom~d#r@xg_5W5>D#l)}obvF^!ECK#nNG_D zkH_DeZ&sFBeNbbem+GWbt8Rtd;<~MMF@Rb5y29@!;|R9YYYQgc*tKd)X5?JIX;;^o zB^|O5o0Rh6Q~tC2XZxe)rOsRD@s}fX`i~#-Qa6r!R@9{(zc}w<pFmyO{~P8quO^1= zziBOF;I(>xe_FNLpQ@tMD<n6V7$_<%yvVfD)8N~E&iel)FZO**xqd@A>|e|apXieH z86JyF;$uyl6Bx}^Hp!fx9JbwM#U*{EE4n9E<+5H85fYJ>ym3{3Utmetp9Sx4d|V%% z&fR7CFzfv5AMwH#o~>N+TT(j?x1{<NTn*5Cr<l9ZDsS7Nufa<fWxFaZTYBl*3BBU& z>p7S2Uh1mU>cPg&|ErLFv!$uojtkR#S5IJB&ZOuhtF!km|I32UPMdFJ=Iu+rap$zv zqiF{xJePQ~ZHb+uAS(yUy2!~4P0<CxatE&56=*e_#~+j>eteBc%tHI?J1TCjWW3UN zgE7=%YJTof+x#~NM4Ka8t_Eu)CavDoR<HWs>H7Y26Dk_~{FZ$Fz`0WT@YQY}KF{aL zA8axfOv_*Sw6}2U?9PpMxLa;@@6Edz`L?*Uq;^x>nrrfX0`0p4*!nqVAKV(ky?WmF zvz$H$Lz^`tbmabQHEo#__lNDf*s&w>S3QJ|KUb_ffBWBsNT=x2Pqvx;do6uL+wj-z zFY8s;z54s{kmcLZjpBE$XIW>x=h9u(cJIy0g&J<#%37+~=Vw~DFFm}O=ewiyt?c@j zoCj5YRX*7y+$&raYHiTfq2JPdzmhx9W6QHl>$~6A{JWcZ?(7xi7xJfsy9H<ND9u{( z@`c9ZxlP(BUo!2>%ucF>-n&1u!)~#{sRdP{n#<#s_&;v4yC>fA<$+$uUY^3m&Pq{R z-ftA$k~4k#JFZ@N**ScoDMzNwb}Z~I;hDiu-NEj+qsK$q#_{SygV?rUi8b1re#UON zaa-R-Os{k9+P|0ogg3@3ulU;(oIaDae*1R0AS;`{vOG#r3)K3a?76Cw`BHU3MaZPL zv77$#b#I#@5;3Lu^A1kSh946{GDDWTG%uW8c}SwQ*y4xzYME6(Z@*qW`zyEDDfz}a z%jzxt`z3fcEIiKo_tObuF{N7L>Yu>@Di8g<qt~DN^}c@I#7E~dO3q*RPGmi{q3Pd0 zw5v8Eg?Hs`U}s=(aUlNalAO%q5*&?<x6!%9mn{VT&5K{y%)iBF7L$3gc>#~}Ld_Dj zDSor~?kt~^bh?-C_$QB|>WA0wuY2;{A~!DO7S9`p*;d~s$FBW$GuG3x=9M3xb-RD3 zw&z7A*`lS@!R8r#D(=4zD5>pq4{%>J$wDk>vV%vFlBD$6WVdf2XKdsO`m^*F{k_+J z>FwT*=ab@nO)LL>dMeMZKhL)Mp6Z9s<)1(M8_itbT;{WWr@vb#OY!a$4K<!Oe-0hi z<W7%uQl4Lv_(M)|gXEs_t0`&G)B2XhOl)ZHIq-f)Q<9QG)hRCdBSC*o+vJMQy=W;I zXrV6bCUo>qo@lOG%?Gi#W3y{NtbQ`t#dyBTM1D4<4QWNorqz0}>OPU{7I{7C;LG3t zZo2L_|7F#*vC>?9UWZA)kX)>wZotHKe_vEiKk!A<ZhOzNV(;fliZ-7L!y2uESDl@z zxi`(l=#})*OXtnXOnPT;bkD50{pY)lSoWdBe`<*q@sAEJjVn-LJFBW(YSpsC*~TQ} zUC!2wrII$?&SuFI+xAaB;e0CK!9{@+%rV@;M+JD#nDlG17PIdu;rbqSp=On4<IBkv zRug>$wIn}A9#Ecf*hc9;i$S8P&y9OuP8O+ePg-fMUt-l?$?(}+;qk|l83k2_QuQ+Z z*8OYeUhS^Pf704{{={pC{WDZ-zEoc}KYDfY#UCj*-uM5rd*5#_mBOMITXkkh%YvGa z9vQZJxgX~hKZso5?Do)DasJPJxu^Ye+IyUM*#6iHPqv%xAn0_iGbyC1L3v_`L9&lx z-bYm*=1`mUExhkl<^M8S>I(>*`k=s4%s-zcj^jX<!Ry%nhhN_Ok^KL~4*NT;9u>6* z&&;WR%+f0$toK+cW}8c~!p^12>zudEohy2m&4cGT|HVs-IVT8y{StO;TFGt$70ybV zMd5AQhDsMMX3d>*wQcEfpUO$cZ=ZcIDNjvbLt1EA!UCB~2TiBOsGKUY(qGE);Jc2q z$-=3J6b$WaC;A-v>3Cvs{)Y^enzHL0+f4H2Ph^oj#$<4Rff1M9g>wltcNX%_d>*mg zS1@{2X3^ba?)&Pm2WKys>*T3zUYyH(i*vpB@!Jb{Z~DaKn|VrI(0j~lnk{FZ5w+r; z$Ihi00Shb~ne{JBsK4*Blg%U{G5Am3g1gP@tK{og%O`EqUAJlPZI4ogwW-xx0+!CT zR?$Cme3{{bCtS1kpNMI-(N)`V>cX5A(VM=QbWMJH$~@@e*&E+qiCQXcd@%7?sAwWj z|HAOrs&i|8tnEqr73(0)$ndo`qw@3CnWAlL`kpy_DwH;QabSB+npjrN9PxxxH=iar zR5ZLcH4kz1-;&GxUaK*BgNV|W|6l)nF4z*TIrW?M)dzRAPZ^bXZx3eQEp|s=X4n7g z{=VgTU25!?r0&WdHFQ3-STM2dtadWvjvhvz_fHzHy?FPTd71TO@t|GC>lu4yZQOJI z+jbWwiQ`jWwC~&#{`RC4=YmV=lBes6_zEt+vY2qq;y_fyLxxqp84t2vc&ThSEwiEO z&-DwlEE;BStXUzGV7r%#cS5|+g-eH;m@|7h*R&pB$-J+8bWKO?Zu@C{x*u7MzpgV+ zy=PuzoO(cfQ`fT1I~tx>Oxez~KX=(|=FGKIvyzxHkA2!FeptRt^r^$UCpOm0>kIEm zWgPkXX*qLd?`ONIlKOMcM0}UY5)99p@1456EN#kcTLmMDIK2gHw=<Vb&*MvRpRu6R z@%p3l^5?Xtf8?68>2gg|y7Zj#V83lTG9K01T7h=D6=^wfrgwdInjft?u{e>V<dM42 z_lC@>MIBy8S7l7Ltc<>G6E!`yY(v{8p-hV-d<uLq`y~E94qxOTlrdZ9`oov=1+H&1 zzSO<a>+_+vby*kQ+M3*X`O*DyyHb+dqMc9uMFOitx8&-&o<7s5{lLcNE6en6^R68( ztIwZ!Y1S(Z<)1-Cb}iN}b!&B0EpPrURaiUmzNOKOQ$Kk4w<uj)S@S(-qToaM#RocH zo(f*yQ>M15c<YHCk0}*G?5~VwtZX^t&FFtPUvOj2dd>d~zjvmZWPWSRSt%}ClO8l7 zTT1PFOwyKZo7<B#vbpj&K3^*Po4T&XLvZcE*1I}0Q`edJ#NGP+S~nnbo%Fxb2K8^w z=RSN;;r^@SzU+$E+p;xD^ES*r@4d(2X=u>B11CiG&c7V8u3Xko*K66NfXTK|GPYaU zLu@5J{;fHYx$}#|{V!q{WIPV9TYOUbDy#eHimhHZPizv~voPdLPv)MzlTv%$M6JqP ze6B9zcz)E%&G+-7GV~X*e)}+4*X*=wd7Tzl#L?r9qQy)TBKH|-&)(7(CL?;YLNmcV zsCSn3*|e{_Z1+|@@9ejl#k^A9Q?c~!njqEkd-3j$W-m4UOwYW`n3*U2O?YjY$cYP6 z^A;(n-}bLbGX7)4Hgo2E@86wV*B2Lu?=HT6$<h1yH<>waOBB{FZBCXxlhruq^WvHS z_j?8vlc)84FI*cTu_au7YvkShxI5cDc4oGj?2>f-yGX!r?j2rsaR%>;Tb{9>J^lB- z(Os>#N78of+*&fNC`@<vlIfRKl2;47R{pb!<BV_O{-!(G!Q0mykJ^6JXzpRAD9=~A zVGr-zp8KhJ`ZMEg*;&?knKn}0&r96&YZXq%?z}VYh*<U1sw$_)XQs3LPCx!LobBy& z&X0FLg=@WCTOgQs^!k5h)R{eB_QHVOEDQ__1Q-}JiJaNXsVc|O7C0In>wm{Wq;`IM z;dYxXu9q8KS7#j!6V>J67Fxuytm&=yD;4ve?R~O0`7Ym#-+$asZE|8_sIH?l=ZwO2 z{qK+Oyxu<d?ZbI<FP<~w{kkQiHN0L|?Q`P=wkoSFoAs~f8wH0=oBMdqob5VZMWvyV zuhsuA&u?EA6;)~dearUUzfW8Isq=pM$$pV+r}fOsYqrgLJ44U+)V0f7LyE(m&S*LJ za@JvMtH(m`^W-`IMk>ucyL7RWmfD}SEHcKdKP@kBOr58zz3kL1d&|$gi<d@Bx|rpu z8Qi<5*ZiW_<kL=VPZQ>NPYGGJ)x9u#uJQqfH#euf+Zb$iVak~ZYq`reUp@pMV0QP+ zgxUSxr+U5xT@SiH$^78N!s0JQKF7YDd%O6j-le50JzvG7F^Sdb)x^x~wpKGR=<nN_ ze%wOtRCLerpC7FLrAUU)Te5snSk}+QPip&S@mWrETdW(YaH(n1lZv)FU%yEyTUuFH zRwnbdSp}D#`?Bssb*65p-OT;*>*dZ*dVKn2$+zQ2O)NV%FmBzx<><9VW%^tOhnfXv zL_P30-akK3p8eWJwN#gLKmGN0>56x;dWD{Nzp-TJmV`+gy^C~m*kq)4gdZsB`_$H- z&=~!`d|Bc_W%u{3*ED#v`g&LVRC&Wv%e90(v3AbCx~h3|eC%a>_1%>hJ=EGDe6j7Z zn@e?h>l2T~_xYRJ*v-!b?Bo4hGV$D!@IPBD%xjphztoBg%468VI8W~qzoy!}6MrUy zPcLh|SoOY6&!A-XwVx9|e)E|qxAF9vHS>-=n3w<YU$L+Ek!)9wx3dfn%@hhdA}+zM zD7o$t&-dsy#r2Q-W^|@^mh6x;lH%i?cU0agLN&p@ZmGe&+2=g$Lf1@Oy)|>+x*Mmg zZcI=(+dcKgVO_qDjf(&B=X7tKw2oCXP?KZg0;faY!px3c`pU2`&wtgL88wxX3uBC5 ze4H0OrS(hkF3!#Wu5X{b^>R@7*7%*bf9=@MSvNzS=an;kxjLFZwRvDYkxRti& z)`hy=`DF<=orTIIV`9zEE}b%Sj^HP~sX7iG;m!#b*Ke=weSY;`{T!#%w>1|s*k-zk zO`1~px6o;3fYz#I8f~|fzQx+V;aR|8x@DHwD&r;VUt7s*J^rD3B*EnE)FQ>HSqHa0 zd{Sof`QzN#Hx;eS1H{%^<%mTaOlE6*p;X6lwrJ0{<d4mU@4l^)Ke>ikAu_DX+pYMx zhQKdbXSpSZ7EW)jVUD~}o_l{2`!ZdTBbg`cHa5)qu!+Us^Y#hLLQ?LF9eUO{-Gj+_ zhKrYHt$u^pOA%+bSMpbuu9#@0xF#j5wY83Sy3cv$9n)q;>qZ}smI$m4R+=&4mg<y= z=Rz$i`nE-d{$Sv=f9_hOGa*($tA@W;TwE=-??Kt&4L2k<Ddf&tc6zPLB&Ud(D_mA3 z1wQiBu8P>0k@$<ZJ5Khya@MP-9~n!Hd>^+<+`c4oZGl~#X!x3=vopjDx*pWz1im!S zzP&jA&+;Xi%RDx(+<G$o?$tS;pUhyr*HqlWA9UYrXZ*)i>R-h!%y^K)<FRVnwBFrs z>z6Jrb80Wn)3b{`7Z+Hp67;9)%K?R&t#MJllRmyUc=G=C>{*Y#<`-54hdg>X<MU#_ z3^O5<J#SBbI3|?6foJ}IHq>H~Stv&IJv#$Kq7(7OVs2tGj$-j`^#A-@79#)W?tkQ| zzBVB6R^H`z+qPcL;FezA7iMz#+hNa{o-!YFk7$&g+Hw2u`|mmG0$$9TE#In+UefS> z<A2Y5|M!iB-^#nQe=q$TtFh{6#ylB;<=6B%)-Et}T)kUwau55FcK;(cg`Hm+^jik( z&$%iWwk_CBrhU!z=><Q2eO<lxIXioM=z;Uoe|?_%?~mxN$2A%I-JK4ZaxOUB+QAlT zp?v)et2P(2RM^L?>1{&$4EFoi?(t?4-xpBIf9@s2`>$EEFJF0O%qaI+^TB;ZN6Q`T zoBS6_24(fOi?k{JpKNvMgsDREgGT!{y;hHa?N;4p5A>=6V#DUfs->LRHF1faOJnyh zjReobjVG#3@yt3eBgGNb`uSSs;@Yb#BI9*Uj-Hf|k@FC9(RtDM#B0K;$}c;(Y<z6Z zd)3ru^;NRy6wGwq(Edhv<@zrtO<N}jg>#G9N53wdeRqqU)2iFQ=0Co$kVWlacTN2q z>l*V1mz9izRwnE@^mu!1qUk*c?SelimTHO%^B?Bvv*FS2e7JRf&C0L$CF@`QK6NqE z<Z@ck#fe>h3){XLniTj*GWW1pa2FJ;_@!oEqHuPxq4Mk*N}=}-d7PK~(XnX3hNumx zv&6EtE7eA6{XJwehga@K+2vm$_FL_5mAw?-bAZXJ*!OFXZRwMf&+m5p)VsyJ-dy+h zl8+0oZnHOgmEPOeXZ^zR+`aBwr*AF%Hp73)ahWrVl!e$FcG(0?)-4EO6;$wC-=5jV zQSj1WNmkZwuj?*mHHRV}Z@O%;HoDh%cV6V&YbVoJFMQW5cvbiIxAt$(gKw|9b8*S} zc?acHzb>_DY$!keVH1;m{j&A4@`t;-Ud@g9btNml#OL{8ucbzYQEeL<uBjOL<!+1B z^A8PeUa9}Wh~rIb=XvjcQv%*RT9g>SSX6wu)Y}(bS>pS(S$L(5l&X#PUU$=8;A^sV z#+R2>Rp(ADn{+vJQKt5RpN|FG^_WjMf#lYfZ*&rNU$->JYa6$#=Lyq9yO&8$PaFN- zuCV7;5&vuRw8DATyugPoIXmK5mZxkE(C`0kC$ITwvAVUf<b;+h0h?FK8f^FF5DPn2 zY0}Q$7NHlLYFK1meYYvhq5ERjX^(!z!={h5!mi{TxO0D*^6t*bck|k663q2)rE4!1 zy<lc0?Kg3~a=W^~1;H0jj_t0Je7NvdMWnV|(80wQPA-U$zO+R&#^v==^BEJ*rr({= zQg!g>Gu|tOTa#8O_lIjgd*>8tzU<|O0AE|X$f8W&;vWT!QH;8}vu6eEC|P1ZC1=;G zjtq+@3zKHcnQM3Lb^f8ou`D%a`L~syYuQciD*Q{jDWg=hs(g12>y}P`!?Nq;SzcyF zs&eLw%JW{O%}j8fRkot%km<>%KJR>A>GC@Fu($6%wUXUn0ZaCl4w-hYjW^CpU)pk3 zRh0Ey@aAHX>3Vw&y1%zfiI$x_<9@PcmS3&5Puwv{y`#J)d#l1k+E|^0;tPe+BIZbN zd$MPxrdRkc`)X$P`oErt?zw{F9~w{j&AE1J!{SSK{6cRp^JNp!$}e6t)4_V*-dEEn zUs^Enu9i&5!<qAPga3%!vS-bX;*rX__M@uu;>J_IR$tp5bn1cSuJe^ay25Y0XZm-1 zPbj&pcIw@#2Fp!(cT0mf#rQLhb>>e$5>~&eM`ZEdPH*1F8ZntStWJeHX)nm_nK-M8 zX$J4?@T|ACiL83U_s`y2a%+#;j-24x*DI7Atanu1yZ-C~SH|oonMU6fua#`QUQoDn zs^_<Fq3jx$qt=J9cJr=an6vi6LuQk6GPiQ9AMT6ZsV!Nh5|iPP67Sx&Em}s^us{4` zW0tvLTANG9kMF&%8Jpk!t?|0@gWI>#KWFFC{VE$B=h$@Farw^YXpaeK%|H7#b?S?j zBc=kJ<;!0tIqnQum92iPNZmN~q(Jc0vok_Ygo^c?x*>aC?D>(#($}x_SgWGvT%Y{5 zvCDYfh6@*WXdISSmaAKzx<K@T+=e;-^t*VTXe{>@treM-cRDl8EN<nJEa5wQ*St#9 zo^q|?&bB@0reF6q`QxSfZQ|5$*~FJg#=7fYskGnYFl=1%D!)JW@_{RhB~5q@UKuZ6 zU$@)D`q(<F;_0!Q#7=}c?Cww6o3*vh<*3!po>}u;<}LU0D-@X2UZR(m7s;o8K_u}~ z>YB7Vo$?yDixteJY?FW3_4EHdYTur|xU@GX_Lb&I8JR4L#H`EJdf&{#ez8Ak_mT^L zqrd7+nP2m~H~xHq#}?HEKf7&c{c_{A&O>=`<1#$YrT*j9&+R-CwMkc9X#4fKQ%|;J z&5v&UqZ{aaH1=Pj{=DP=Jy}clU7T6+<fKsdZH?bu8LV5_t)C@oxD>fLOy((FX69;g zDP!U}=gYngDH~U0<-`=eQ;25Ft<FfXHOWbm`tf-;!%vxN|JP+lJ#U<q;#6)sbLh{# zxkc?$=lGwWayD6USpn}wbtN{t2%&?wljUA7JXk-KOXaxDwYd?QH#e2FU0Kw#)5A!z z=<)0|d@uO_+MSV+n*4FKk<!$Ls}uRZ-sAP-*j%>fy=&}0X11sYH<j5YJfFgNBt={E z;_jrIY(Bp>Fg~%#Hz<C@u&kYLlY35imYDD=zOP}f+6!#$oR+@X$~6C$&??i^+ZGF> z4sMKg+PZC7w9{7;j;XU^fBw9p<g|3+yCcixW&|ueVE!|N&uZ!h&Di<n&aZS|*?2Gg zWVljNY3mgC)XN&VH}BSd?#o_WYgT*s>Yk>RdCTujG>!czRTg^xKPzfeLTuG#DL*a- zh8+<M3>rlCuyS#&n|vD+SbTejVBPoi2Ylp|szWUOE}yw$xp$@P?ap+i=f}eI-<3qk zx-<z@sVr1>xSh59|K8o)K}xEVCaGTP%SwD!!^g3<tnujgw|Wlpa#ybNedptkh}E6= zY^K7Co>!B?f@gc}?r3@8d#tH6`TmKG{QC=XU5?m@N~t;jxcay+LDyES@5_?Iy&(_l zmRH`jTlG<8(&34T?)HB^{NvBRzsEAm_{UH8UqAcm_N6zU%(`^$$J~-g{XQqbtv9zy zb)49ce@ULxKEqgU*PGb~(%*D*Jh-_bSaWThceV1$nd*t}9{x|}>(cC>IdO*WIg6nG zLVX*%*lG@iyzsx_upxqb``qbb8sgVDcNcEZ-rD&@!R%0K;ftn54T&(*3#s=fO@8L> z-V(Lt=JeD3&%@21&%Kw+|Lj@GA(;XJ$zw(`MvDU`Zu|SnbM{J&&wC>?)3RQ=9DNY0 z_e*$%@uRjXw?BRxJPM|Zc<-D2Mq`%wCU@x?pZ}J963yqOo*mt1uNispQs|166Sr6i zX6C=2`sF}S|JUE*d-Jyc-+BLjHS7Or3s00i+;QP!a`*=Rd6m{3OW&8d*`KY_uljrM zex05DtM7h(`{&&MVt?3u!TT?NE<X+Z|M}<1n?Fsz7=+FL)vmI3U#DuOeBJ?f#^$<J zu2NeR9QV~ZoLFu?Im~%>)UC<K#An}}c{!Kw@qT4*e>Mj3JBHGdvoF5gyvsd=tKvjE z_nl>(cfJTUWSqEUyl}2ZpZVtpJ$beaUj9G#?NV1^leyl~7AJGbtg+s8ntGR7N?cUi zpVHYU`(A9}?ArR_?K<a69?p!<xOCeUA6PVPV2<y}nKN-&tKo`Jqdt3vU)El(>v$Ny zP1ilJC(m?C&lZ0tR|8=IrXQ1-CHr=yJvzwY5Ow|26`daoJAeBsY`wGkg?X9&Sq=T% z1q<3ezN|QMJ0sBUu8`rX6CW6PGVXrN*zd6Yifw*~g3vTJsh$v?&77Nkp4bO3x$S$M zdx}SSsoO2v88amPR!y2;a-v%8i9!_HrRRde3%lBtPoLP6aj)T<=?sOUi;Cy^+Mcp) zi%SfYj=cQKB3s+yg3HIYjG58w9n1<n76*Bwnzu+rC0A57t?Szzd|BjJWI@Qf4+mej zfAUkwP(3WN=Zl2w-R2A1CIyBkP7Au5m0_92z?>FlWmA)TX-*>#qX`qks-T?<P4`YX zR9;$pPx@2CiZ{pQJNXKq#$~^%^%1&oMvKL0ilfY#m(#wfoikNFs?<9BGVd163%W0B z_3loXZE$zvy4gpU+1dO(FUQwn*Wl2h%lGD${PMl=B1fcCX3u@t#C~m0a?8*EX)W^m zBObW(yjGuhKkZUhhA&e+=OgJ)e^v6fS@1iG$FqFjDeyMXAbw>u@7q+SdYLbkLR%O* zVvk1bUVOBA!G~|k{LZNg>&jVX{CnqlP_%Tjz^c!?ROcS|=?{6cdxz1&E~a<RA^*S4 zkDPp}R9Ir+j6k8)-6mg8h-O}7t*{XJmojsy%w>1qb&iI$3Nf9fJ40%3Xfo^YJBc;L z`Tq;m)7>)7YUfV-s`#DJQqipQI5QJP{broqbHepO=j?`_u2aq1)EDjG;d);2ZvFIy zx+j;-D~$P}@^#ghhbD85_y5^je&zkVJ3-IiK0Rx1^kn+aTjHl1_J7D&d?&qHV#CQR z>Y4>QiPMDcW@X%-9v8!CSM-0LzrqVKo0fuW-G5sau6EgfB8By%P;{L6i>D7dX1_4A z{a+Mf(ARrH*G=nx-|vkZL~g#7OIF?BBK1Z_A?1d%V&O}H858Vor=4iqu(E-(|K8#S z4e81!#HT%p%xt?oM`ykCw`~Ti7)=EC9~XMYf4Y|;c>kki)pM<D<2EgO>~YuAU{i(S z%r7@0GIbTzUYKNQ&THFc?0s-vM$^3nU9Uxx#Q0aXcpGp{n04j0wyy4sNylGJ%k1zd z4!H8x&fjypf}2<6u2p;!%HmJ3J03swxwYXXv%tO^GuQInP|((uX$aSIi`%khbB0#v z2Uqu?@C|%=I;T}^<D>kec;8woYkqMPpZ8ejfZg+(7gk)Ju{5XkjlHeD*8OYILem8^ zUy1~Y&p6YxXX9nVkKyTNvm84absq;FQU7+wr&Tj&am2y7f*-FI>8(0=sl`_7By)tG z$)(vB3_mQo=-+-}=HL0uS%+>km)sQFu!X_Pcv76sBBxV)!GYadq;5?MNl!OD_ondo z;;e1GZ&R(VeCObLd$PJ}Hj|E9&&HXIk=>HaUmo!U#N3FS61F(6H!OXl>Iczt;h7ta z&$?^axPPd1H;B&FOiNmrw2wz+Y1q}s&%#%$xOLaA`nhgV^fEmg_lK;4);sF9Zn<V_ zG5LU!(T5Wk=J&WWoLV7vcmI<OnKt}vDu(Zj?uxC6nbc#li%X<T@bk-~p(l={Y!E5w zP0M?=s<gRtue_&9U9>?ti^AzOe$#ku6K?BmHkp~@`;&XOO|q`!rMUB#e*Md-*=n+G zYte?R_qPgISy<<OsghWua-{JL$NfhygEAQo3dS;J-OhO4n7re5+I^OLC;oj7eD1%) zz1}u--|t-)Gp3!NntFZ3L;cv`YJ2YY#*dS-<b7SP2W)VU$+Pftnepu4*~<K5#p1eW zcfFgXE*k&*&)hppn2hGX$&h#6yLXXrf2OwmuM@m8?U^;@rp|ov@`Op@{K(nAckN90 zqOdz^XE%$1L2t;-X)&t1J@mS+m3|dddo<ZV`mWZENi)7iF_bWO1|2Pb$T~|>=VrxK zxwU7GE;t*;c**)ev1>!hWBXvy2Szf-XD{>EIa^|e;06|b#uc&gOB^?c6}G5{8$6Qq zn{Qv!d-mC~w4E3BEtqi3l$-OynaA^lE?*3~!CAQFp|qqWkLT&{N?i&6Ehca@dFFTQ zHMzX;F~{B~H5(bd8E>A;um4wdH~ZrHCAa>?DL%T`(S5{ta$DYwd)hynTB{@2UuM0} zcYnE9Q|jh|KOg@)D7R<IE}rCD7O;0_-fiZq>JuuhrX&{4p6zow?X8OW(VI)Y=yq&P zlvBvuxkao-ZWE(?Kc|6d2ut+!=g+?_6%04b?Ar8Gwl`<NZ6hhgBeRt!2)&!3Cd+Pp z=)mFx>)P}wY~SqDP8s%33v<ryG0@w<6!GJc=WI*mr7xytR!=ToQ=`Qh$f=<jeAd%= zamTuedSV;r?GO8Bn{F5{z0hr&opqk4K!fUxKPTVTFj|It<O=p4T-1F(`JMjC)w5b3 zvrfAba?#uC)urCb{3KPgn9E;Gc3wF5X}|eK<y)nts}*hqEj#fkFZGaF?q;jUXEulb z5{c8Xno)J~bXu;?hIQVzZ=b$(((<dmO;qc?=Xr;PnsS`(S*P9c*)D6mF85`h<o@h5 z9k<6ZUc02s)A%3C9q#MCel*U)-f2zItL_W2$}8_C)y32-UolJZ^v{cN+a~^Ro5(!p zc<79x<NdQ=ZhL%utM1v)$tT~Yot~+?t5c^&@Imd`D^IxYvK_j^Ey%?F@R`-CJ&{lE zPL#c!x8U|Cn-a#`^5?g{HhkNcF8=vKX=j;tMcKEq=GyB$_wrcJ{Pu3OF7sM?^+H&$ zNA?Ys*T)u%-aZod*=g?jbIa;oKZ|B)+16P7W}aK7P;$`W&tJ5g_u7goOfq;G7_5Sb zUxt{QpORRRiEG#^27dKkw*8TBFP=<)ow82<dZ+N|jn85%)3vXE6Xu>cp`}eJqG8M8 zdw1&h$1<=uc1@YuQFQ+KVIP^<EYo*)*H&&|s3^G+YkkYwN+s6RJ9n0@i%amm`Q?sl z7e8AO>v8PZ=_!H<M*TCDGVMAmJt`&{S}s*o{;id&IRDdxv=|lkzsDcF?e&;G>HITE z%b&kqPp`MLwX=IE_@i=F{Xf_LHJ)mx&#stz*;;O5p`Nf>^%FOr8D~!P+sxZsaZ%Z% z^F%+-`-$4y8mc#|8J4TQtT-n+^V1B$ANETR%$PAL=iI4-o=bmBZJn7|;yB$!<>MqD ziIbw;RiRl16AYp%B(2?JQYZO;>Ty-^R}v85JbXhh<aV^yl>=fCiz51Cc<=MLZEybf zW4YmrXJ03^D4ndB^f|@NsIlkEnbp&6m6m*un;-Q|CALc@N5^S3Q`s|<%i+(y^a-BK zSR%Rk{k0;Km%gVL8|_*9zg5xO_>i&D*~b+(jhfajz7Tl%%B~)d>gxDUnjTiFjs=GQ z9{&3C=B~jGo~FI}52gGg{u+JrKV;D_@iTAMT)!eY_rE{CKfT&rSWsvz(NkY%&Y@>o zs`4)O*CbC)=O0H!c$AqBH=JNy_UOzLmNw7Ej~iQ#G`Z>gx-9-~V!7dBgQVbpf&B?b zR3)ZN@LnV_Rq?{ajHcihR_%eu;txuM{M;jSOd=|-woA@P)ZoJh1)f^@`7GMAnyx5Z zdwuZsLya9WbLR5rJ>XKj+k0f<vTJjDGqUdAZ7Ne(QFouy)G0@RU(95o@wNodZK7NG zW=$?Rvw23YdV1@2`7KMHwEwsBJg+A3Gh;@s>YC%Xm+m;u;H}*8qS9*e12eTP-rEGq zQy<Oq+E_5}QvTv=j>VJa8H;+&%S%5fm!I4tA#vGa(h&jS<~Jd;OxnE++TObCdp;pR zDE@^gcc97=&NQzJ^4g{nKebw}Ocb2yY!w|Mx?Om0srW>nmd&>mgneoZ=W5mjPLx*A zaLTHvH|5Y<=l=M?pR^z65B5HO;bOmj@+MWL{ec`C9{5dsQZ6umcIRClH-RKuuM2*& zJ3ZSXr8FmsB~3qkafeseg!QvJ&pt}EQZMH9o85W0uYTVu;osTDhEsKuPfvfgrg7HA z@PgmZ-n@GA^{T^nn|~EWH9k6?VJ|$NW@@D@+q3ZB6t*KF9?4dW&jS9g$}(R&r*~cR z>+g?OKg=lTo-^01K#a4X$z{rhcb6@VH%+vjd%E+)W{DYruPt}m?ACSv_TzCl?;OT^ zECGBi70c}UjSJ_CTnoruTJEC5%Ht&X|K3H5bkXlK(i(kduK2QGL*;F$xyv8k?CM-^ z6aB;MaI^24>wgzL+}QPSolTle!up4n%5e{P*8Yk)d+qjof0uw+2duht)EOBziPZJJ zeBtOKvqJEdMTPns=N~-_Ep*gY-M{vWPayEn(!Yl{eU|pno_XeC5C1oBCDsBZc2TAB zCU;Y&37^dB_cflB+9~}_Izr{n>LBeGU$0fTbS#=s;HUazd5hke)AO00UFEtX#8tJY za<O#qQn{*6j9Ic<<~~x+&R8gBx=CN4=<>;TeJXn&==6n@Cr7cQ@}@7S{mfhW_CfE& zszu!Ve#+WhH+q+-=6C(iQ_}d*#=Q7{+s;)UcN97~rv>*_G?{h@1h{V!%%7Zk?8>pL z-FLlLHFKM3ul#rWT3^(Z{~3E6jRGIU^_l-RUr_B*p|1a1U4Nql<4OCI8`o{O%>T{( zOZ&&wCUt?=<`TWJ-dc*G1)Q4OwKA95JaWFXsQ$g<y;~un*AL{nEoIJnd&TJZt<3*B z+$-jPt!A4gCvX0u@OstZn@jewR#_`wwz()OZoc@+WM8SppWi8a@ToGdsbG+*oUpy+ zZn*7VM(vwhmk74aEAwRRtSoZlNI7ze>lZ`5F+;9r=rwz{OOmIXic+1tfA!DtJon|v zh37)vJqAZNdy7kd4ilQMQ@Wt~kD=~`#f-DGf2cL+{lBzBAaBopp$V+3&z_%qUrbi| z*U!!~UyLURRWZ9Xzp09N+kUIyi(bisj3w!N>nE>s?YXpKXNCQucZb`~?P2<&U8NaV zd-U!8wO_RlTCcS5-8<j;X~oW@qF-14uj4;?`M_OqGli1S=`5;qTql~R-|UKF&rRPU zedNfGM@OsI9KTf|{JC>Uktf%b>oNvqDlZLop4&dx>*pTPLoaxYmV2h8n06OFyXL$y zFMZOoxn5ktEAH2;n}sjiwuWKRHT5v7i6+W-Wj(77Z;Hv=sS@(>GL!5q)olST8b=Ky z4Q6R9`ecyus`2HqJ{8%{oY$%gyXLEf9jlf*9`Sj4)YJ*JKScgq{iWAi*jVX#!+jmY zIj4Eowfkn=tFkj)aQLrhpYs)mRgyK#q6hBJ6i8{)*tDN}Z(`!><>lASAJ>LIR${N- znz816Y-Iadlh;RiTUDq3`Fo};!s3+hO5L{#$M?4W`Oi~yht<DilD637X}dJ`Gcx5Z zx#oB~@=3q#{vT&-zH5kzTc0<d9yep7!f%U6{}VUg&VDG6&cSe*UoLg+_Sb7l!Xjo} z+;`4HAWwMC;d{ZmPd=_!(iY`pY71D*Goy7kYmQdrCnmMWN@oiBnb!pxZrEEbc08?7 z%G@<{#mb#09(NpZs!^z1r5n~6bErjBc(<Fj;AxHi+rhuiZJxwC-As2X<CbaD<W9Mk z<sSat`FwU;-WR{t^XFasRd^*0!&h7G*xs6FcD?FWu<ovpF0W6j#8|hjo|G47Q>*0p z_NUL*Jxe{J`Jb&?q3JAkd9qg6wFQ+<PItt)KC3QoJw8_^^ijI0;MV7gPFkx!-BbGi z*~dw_?7q#~KP6eRTV&U5eyo?AzWbE!!Wl;uqq$1X#hv#u%`z*$S;Ln0;`q0Pnv!RV zU4s^i%%5?CLw`$(<?3}i9!_)LyK^3MHLIo6ait|QC**lAIo8@SBS<rClAhecysMSB z3^tkiU21t^ysojtcmCQdRvCUl3{1DXUww4bjyRz07Pau`m02;?CO_(%?lf&T%{<&) zk(L!Kv2^R6WlJ7DpXO}7?Yw#RoWpbKW^eiEvgw#*xZ>1_QIV2G_f~!OlHhI?o@24? zc0y?7zLSf^EVC{I8d)DVUt)Gg=8MatKeJ4i_neYE-6hw*@7b3(i|4=J**hcB-86xn z<E`oY*|zDEYsxf_v@<B5K3KPL55My79_L58r+d<vLe7R=vC6RK?o?1~JItY~T0G^- z!mQvGEw48x$uD=aU76BRYx3yg@qiiy-6u_UTTW&r-?PfFUe7!6eB8nct%LHtN)J4b z*onQCea63g@0Kkx0-w_-ia*VtBmeNP)Yh!c$8FC@ws2$%?DsJanDy#>{1=Yb=YQ?J z+8(v?Z_~k?55NB2e(>qnulEOkJlkuh_xln5ifG5nU7TCIBloU-^WAvY>dLVF6QkPq zl*VONP4+%HNhj`Gfv?A}gDyvvE@x}B+zVWHe#@5=D(BC<{P8AkLM@N6ooUGNh-YfN z%I_|TpIMpa@5?@G)z&$6+WE33_EAMTayu9gzg%mnvR3Oi&xFk`6CzZMJErV<A#nVg zHiN0>)gnW|!qqQ@))jm`sd>Kc_d(gY>!-VXS!sF2PHWwb<iu?}&Bciarrop=;qG}c z>E+}HySJM2?^0N!k>G8*+bpjwBKq@XYwh-{%12WdWYsV0D%JA)RkM)qotI^L@T}uU zjUFtQy;!Lf;Qn6lirw)q&#je|H_d)*`bJ{S^Y?7!mm7JQewp;2{3|o>=+}hs)-^&# zOAo4Lt<PF|`)|xs0pn>WLZlYkPc{gj86oo2r1;D&`)?nPG+aIvbotk-NbaqCw{{s^ zeIWUE@|wKG#}$tmd~V(o^h{ag{tSD?Vu!jTD`O4_F+4x>e%8ZqnV91n=lig0&t3Uf z!0G1x7v1V}zLc?6Z`$$RUTo^TmwP$q9Q?G>-o{z+ed4i|&GYUT-LYR7XtX=ouqx@} zwWhGYPaX0ne!8JzSle{$_TA?XbNf#&mgQrwJUXf7q004XK^+MtZ(20vGA>EH+t9i5 z(#8{viRF3k>dqau{K@e1%=HPuzMe;BFtjP{^GHrJU-=>@ziDRr`g^PPL|!}KsOfpr z^k8_Ix5vjz2RKAC*t$Nx34dbz=XywzqmO~aUfDjj#(%XXwo(o6r_1*Ciq*BKKNS36 z5y)^tXRg?s*dGNqpC_N~zTbauZZG@dj}L0jzP_7n+LKi=`=(RY&MzxPrgi=DR{Zwb zQ9yI@l^Tu1QmdqoTkCC>33t!1V8459>4A@d1(UP)8&-#XU0&mHLS>hjW$+xeZ_X^o z!h#ll3AYsZ9U8%{c_iX<EL(}n#0<t#y-z77?D`WTlVw-7G>98Loji+y*-3xxi&qDn z7JO}rxnvMDc~P#$F6oYd1ceWsGfZ<2?49S}dZ@mFL1$ugn!~<-JlFIma$KGG@aMPI zY1V1R6_XxaTsrH*dXaMiT1j)i`TyMza_xaZ$D2y^)?0s{=0Dl7eOq|uo!7rb_ui45 zd3D28Q?7Mvem!zmH7<%}m~qTs_Jf=4)2cur;gGYOPQOKsA8WYY)6`tMx#wE4%DZNz zQ0@m2^&fZWF!tw*rmwbMsugl(-w&^K29F{lPl+ThIrt>|M&r#7QQa{ck7t$cbnL&U zcW~LnsOAn6pUXQX;*G4z<^LJYXF0t4s{i7d=L#gP9>4$3h&tc!|5}pR6jlZXHd&Io zaj8W`IJ$9HBXaX^c?kSFw|<7VT}*T&=aQFuUzEsm+z4MHqE#^Em7jXKq4%Ef{R;1A zIjsKkeYR|J&gY~_4?@bd8Bea6pPrtUo_?(Q-?Dv$_blp}OM69chp=93IsS2GID52j z^4YYbb8erOWDha=Xt`ifAkW1Tt(}uTc%9p!z3fn`m&?P~o8PaDR-dJtT=-mbM}}E+ z+rNDa-f#a>>v{iu!k!wD=;>#Vvb<5@tIRoIAoV%o;Mxzi@7UQk6fkX%Ie*ZUzu;Y7 z|4RL&m2WvYgB$N1zc1;0bdjb;|MS_#-HYpYtPXNz-qxb=WxBz$2_ANar*d{o+>so$ zMt&a0$|OTSk@*fnNisqk9~CNmUmKM4x%IU3N!}grO3(Z|VYAu(=8M^@Rd)ogaGBBZ zfiGl<sNtoh)7cVOp1u~ldF9rn)F}-d>Q<WqWcxKIRpgvge3s+Xwf35tb=l9}Hxs@5 zFCQ=c>C+fs;9FC_Q$OPSTPNS<8?VlI^s+hB_B=llHh=ArFs=mINmfc~HCj$_eH&su zpXE$mn|Ie>!lG)PKOcph-};@|sj@UkHRjA&w!iNa*WIkkYSuM<z|&E7=E*IU{*#j; zFC1yt`7>QV!r*gw_7eX!H|?UgB_G>(nfv(}apB`m;#M47Gk#5!2%J-pp{Maul%p)_ z*UdVW=+&W)(>HIGJ6X2y=8mFr*&WkwUY@-{AcnE{F~^0;a~<!$`umW_?$%z%`#U9P zo@;mf{_IxCnTG`iGKsqmM#-ElQC%E0XJg_Twm01OxtN~a-@LSCz0Aw_M7!kV`IF{u z7d$R4cqq2N)rqZo_0wRTwdpB2wyb*G7Y!s+k2*)cPdaw>+qAP>JEpwhyW3Q@xX1IM zzIV=dr%Hvz4as5d`+q#*wqJ1k`(}{`(Q9)UmhZadbFffH`Y@OCsmk{j=hLHE4cc-~ zT{B%9-Vm9T*U)l3s@7K2_XW?Pmn-K@{*YkPcUJP|+l6mqzPp*(7F>|Lnv=GFc5&vm zWsJTR4ej^&Hp|*~<=iOoV7(Eg5;?z!=k`a#plu;7tV=%_SXNA$vqkRB#}LuzEbX+( zKYY)Lo!I^S#kYo)=OYVUHvV~?|KsmQ6YEmzvMG;zTh`6@+0<~_c-!ZHCv*5sUx&%h z_O&%SapbGP<)EOWe0RTJ&e2x%DA;VMx&3$SnNw4uXLFy<GAnKCs}wj}*|_%30h{fY z_H-=$TDq$D*vc92PVDN{an9{{{c6hVP0G(J_xZ~oH8y%XyZ^(&yOMlv$3NIa&foQ? zScl)uD{5XT-^<x)*A4A&KHKoV<dcNfw5UnzTG($LJ9aQ=Z{!NYt>=1=X?|C&7u&J& z;Eybu+?>PSt#jKw8Sa<agsi#V%4)ZPb=sS)Z~Gpf`{VM;f8yddb}^|7D`XCNK6hC^ zRnu+1Rr#L)6W*+v_`mn(IDIOSGIlUz4u3mw=WB(16YNTVK9899Xyq-g>uhht(gj23 zEO#zC`emvR?_Z`K-RGVUTYs~}<tyIm>{{j|*^(jHv{b3*0oR?->!*IbdiJQPKw}j{ z$&A-)OS1Lu2_3k)NUI|>;_)N}ja5uvc3D1%<$6)7%}`$>x_RsVI;94&P=$5>_ne*n zW2S({Dh8gMUEChBf4CXhjO8v}<vV-9w2<}SaleDy`-K?0Rxw;NVBZqlV7i8>Ct}ly zZO^n=dl*s=iR;9LDSb2zdwDz2rOYTrYjsO2PyE#2`6b2@C$$2c)h;hJIi(Wfvxw`= ziC4E@^KRo<>>Apk&^2Yd9lw;KCkwmy=Ep7T-t>Ig=izJ|D9W`wT6=ZWOHU=2*9^}- zB`tk&Tc)@&ka3sjLlds4Dqk->Zdv46qJL28%lXrJHz!Wt#1(nUD?3q9{qJ_8H{V~X zTVGGx-Ou}UqmBRd<$C{RP6zkQI9vBZF~4b2LH^d;vrac_-^_C_zUlTkDr1XT-aHR) z5#{y&e#fI0`P{!wiu$rKF!)O|5PijFeo0v(uKmMDBXaX^n+g1T7hjlducH}roOf5^ zi!LR<<n5A8DjiqNnAs$@lyvPlwa6{VkLS(t_kC5LyWi~UZsO`t?kGQQeXp3m-=^x~ zz2YmDRgAf|ty?c>S&J9yXC005_D{`SBDmMJ%V39HdqAc_c&fr0pLY+mjvncaH0-^2 zpwaW<^o3tCBUIb>F8}&=ua|h#Jy)^5-+!;i{`-6M??0}~N6VwFg^MK{roUt<70<gO zvb9y;sLx<tsiO*GjiX#M_neD2V)K`8oi^{#EOAffg*}2V>a|W7iZ=Cb@bg=B_5O?7 zcP`G1Xz+T(>LX~>>{x#FmJjO`<$q@mHJXH-&P+3G(Baf@Fv|%%e`Z@`*qWo4jvq-7 z*E@HgU;p^wdF8J!-kPI#Ae?idO7en;qkScxSBl3fNL>A_7ri-j3HQ`SAEskMJB2x4 z?{i7&TM)={ZevoOxclW@J1csgCVqeZdq&g*u|qn2;?YJsOu2P!&qdAdxsrMFUhoEw z?rZxv<_avk_axM@;}nOk@p0ys?=xo!PvFdN5)f-!VYsnn@=CEP$BLp2nO}6z<Se_G zc}~=@k>Pa?n}>>c!lPo#o7G2_tYc>jO)NMYb+kvj=ZCW3^>tg#K3;oiGhI=)kYn=6 z6T3gz@$0F{t4}^x{7XeR=C{|OPWg1kL$@!;`5Q~J?|l*bxAcjxoB82|-=BXi_;hh* z+G+3k^A=w_Vt?N0)S{x#JFgg^ZvTG+ENBzRu3Dicp#RoKdy;~E`#PCp-9lJoG* zS-}y(*81&aU)sMXzD7!2kHV9Tf?rEdHNH7*W&g~3&aP`*yN*QLUQ^-X$?VivbNONW z=hG*TKYWl=;T+F!%lq)e&DZ1{=4{=b93|`YcX!yDi;LeZ$*~Lhl##7#6S`#H7DGF| zbE5aPe*O5f|8eai5BA_&+gkJGMc+)yZ$4r=&1JW1R^i^&f7CMV0+*y`)aYJ5u2^x> ze0%K7Jt{HzDk(`ta*p<5R_BdAI?hn_JF#ZXsad9r)1<Xo*_Ste+`uh=u1)#Z-hEP+ z-~YIrDgIBQdhy|}tu>QMv->A@Jd84O@7rl_aZqLU-oo`?1eRV}R#a#9p>4AE`)}X2 zP2+xbC;Sm}mU7SQJ<BicTf%0=XVH5nF6!~GoE_86nuIq+tEGL~=`%lc>D*N-_x7v2 zm3(b!GV#<2qpe1%ubSiDO4OddVA6JAXS?}T0SD9V(uL2my|Yj8%uGu)|HPZ>bW1E% z?q{13V@bDB|C_M17<2926Yri1kK4Se<MI2oYl^xSugbi6g6E6;ul2wFx-o7)rc<!T zx8eFk*0_A(2V0XG?{DMS@l}DbXyN_LDGQ$7`0^|M$Lh^%ADJuNh@P?dX7mi@+u<`7 zpRraxcT`xw<K)@XqB{cL?5<pL=w?jDN~6t<rglvdkNK4E=ora_N=T_pTgZHzt9Qbd z3#`FkD!LsfFmk<9E{^SZA<+CQwWqjeb@7Dcd6xuopGltG*x;~GlkY!&Nt#f}y=@P= zkIbFT%dZ)1c{0TP@zRNV4t`bsvj0=%e}(5}VQNah)hC~6m{g{tb|%M7soi^t+GLZ> zSAVq}IzIJ~%ClaL4>x4b-LO}G|0FDH_d8zoM4fkMc1_fj|0A3G{GO=$W}_EbAH!FO zC-m${d6trVz2I-%s-B4{3`I?GTzz7hmR9Rlb<WPdyEo+IkxyT}<(`OLdggT7yPiA0 z`0d-}_kHfh^!<KmzS%tdMcgl6mbyg~`Cf)<hO#ebs?~Bh6)vBqv7*vwX7k%gWs7vC z?fN-2D)8*j+?#tZ#TO@BSCtH!pSEkl`O_!VTz22&GVY4G`u)-x7E2CGzVe4hCw7?h zc5^orl`og-O%9F8{n%KvFDRmQ?o_{~=C>cMV(WJ8IFT5(RmgQ~xB=UgH{pqGudROG zWU?#xA9Sa&AmN={-d$&_zneA~#IIb)x!U3NqgSO}Y5jYo@5RO6tzdt5_348Rmwh_@ zQjScG4XG#>pI>j~pA+o*KEx{agVTZTU5CC2t>@0N|G28|oACNmsrnz6zOwl9_jqnf z&(^!MCA=+O_!#d?X%;%i7{53CYVZ^Pm)}nAYjmpk9<4m_kaf6h$otcA>k5CdC4GO? z8=00<dHP&&oAtD%D_5+JYv5e5a>Jd_CslzTAL)x<`Bt@RVQBNJ;HIwkQ`)AdU+oR5 zyMAP`ws~Gaj3M*MPruP7nQR-Y@3jgtFxXU+P*s(d<mBP#oV<<wTXcJe;D3An#@A=( z$o4O~v-Is&-`TS*`sP#|ORpAry6*dQo{1A$W+|DlWJJHb!~E6qSJK_s29=D!X*rEQ zGkRuPZ1d0+Kali&yFA1Ecdgm}^0s%A7tUI2W~OECd224)La`N7uiSh3dFLq}>D4_m zS0=PKKh)fy9enUil3v6**E2myw^sOU@Z2=Rf9AYTJ1_Y3PG50$ikXkQ&BMhm3}>fs zoZoRVC;Yst%5kGdZmYf&epmkf#o?^@%sD>1zaQq;|NeM#^ZWh(7ao4_-1rx0@l^V+ zpUQv#a7*ik1y`TdPd&p{Ijw8W;a^!Q2^{rPPll*$=6jrZrcSh?SGHR+X7-vFx!Sg} zK1<V*IUn=?KW}NkChQtKo73=s<=pgF@k&P1E=tB5OjYAH+cf#^%HY{6CDeHBkIhbA z>8s|xlX2mR%MlSX4V7lU4E0|b=$)bxq-*u&$BPB!pVnQM{Zq`4{5k8O(ge|&&y40S z*z&Z3-?r*vqQcCp#kE<>-n?{r>a)y{OMHXz(>A-ApS%wm9ZXI-V>|oTMU%WM^0^<3 z{&p)Fn)@`dJontR!!=HNC2N+8?vlFdFE64k+vfG%EU2)ssI|ASliVlECtu4g|8UXz z`mXZjfs>9m{Y}o9*IP96$laIzSC=o)<NLk$-h=I%?|sm{=yvIz`~5DRX3jr{C5|wO za;<O_m=fes*Wh_cp-L&W^U=nR{Xd<5PTlNMFk}73J<EP}r?Nd-vWfL_Q@Y@VlK~8Y zg}#Y>AHxM$V{7BJwYjwA{_<Qu9&vEXVe!OAyMOpjSZMe~YS-6Q-=A@?E!_Tp*Y$RP z32t+K|IR22PQ|SM73_<dXMJ6+aAkpJHe1_<KIMg`>(1z|V9iMNXTPM9w7c$Fg*MN< zo9Wjt{}p^;D>rkk)$5OCGnT8UNKMUQS#_~tUaR^Nsk2+Iew?Xrw9d2J_tO!{TFb}6 z3wP&!{j&8!pxX1>o*Rx!M>^(CXOR@wTX<cP!}QD+y~JKw=Iq-nJzJwfJ{(>AjGuA0 z$JNkN4!Lu8t1c?v^}~Vjl-8pHRmQW-*Gkx4X`koneif+AzQ<tof%~co90{Jw4qWk= zB{@HPm&x?&KYsguzI;h%&LS_~9h+=SBs-*LEL%MJ-iHqr|Ih9Y*u(38B$VTx%+~9# z>h9()Ydc^nvz4(c?$Fs-$vv%7Ttxy|dvAKE8Y(m@T=~T`ZOXpiE^B7AuI$iz=d*fk zY1H$#y#|My!(Um+Yz@C1$bBL2Vegb=j;z}37uz1{Iz%sYc3F~ET$=tfcUfCnJp1Ff z>7|-%T^(!-%6RM#1zHEJ?0M&y$GWv<i|$s2vw_^tYil^~`80+!E8bs_t?iJ_`}5za z$=qiXdeaybxb^ec4{SL3=>&s<>mBLo$qK!!b0zF{PATMTxW9ba(G<0y<by9(|Nr;A z*=1MclHIOLPWp;eU2du2v}SfRoSfFV^RuJ@TX=cLy~-&H+&`Aj>h77ou2cN9-~kJ^ zjUVb77fRoEmEA0|K>ASi)O4wRZt(@R_cT&2Us@u!^mC2%`rfP6QSKMd&)-~Y7H&`| z(G*-ZBY{In!f>8%OXiE}>@;rG1dla6mIe-cBquS=m|rZyykkkZl~0-L@@USU$MNeQ z^Zwb$60_Li`~_oum2e^6_^@Ype6D}rBD96qxoWNFiOc{_#{O%^jmpHtiYIcc^$y%Q z>r_V8<3qP94>Y-7PR%-f_H42tugJvD%bDChpP2C9TIlu4tCzX*rXH55x)T1aWar(K zCwh;?7ECR^CB7hjd(VNZJz;{Yw+No~IJ)A>zT+pDUU<%Rmsq!J?|$7cB0ib#=ch0K zdr<GM*BaZpD>+H!d;Rkb9)?6czqqQsG3t66=dpKpLo8Nv#%M{Jf17jd)Z_j2Zyhuo zZYVos^K!@r<nRY@HntpUYVv)QqonV8YRjJuY$`R1FBB#&?nyWEap|h($~d{mVD`^V z)30_26+QMjdq9X|dByY<cQcM25Zvc2GV7Lv+gq2$UGr9H^K8Ch!!6{!)?@ARGS$f~ zZ<n5WbFe(1_oL4(l_zq~vLEf`+caa{!?Q<oxF<ifx^?i*TW^7qo+G^6s!?Z3vMn^u zrl)753tl*&!_%-(a{n}Ahbsk{EQeV(nQt$T@ifkLSe^T+EMUQtse7hc?3%cHo71_S zH|q>5_I%uO=oD}E!C+R6Bk%kBFJ^ZbT#UG8yyl(e&4<0g2VbwaySz3vg1NeDR$6pw zq(5(9Xan2#hgrJ{LRngalYX$y>?vOEUACd6={$>5{27gtH)XC&nSW+s7Hj<9hV{0> z#y%m|wLAS%?0DUnU;B&qdp{0bah}bA_4{6XuetW|TDwHcr<woCN<X?cwJKwM)DFIx zx!2fhW}OI{cOlmPc4K?m@&r?hJ;BT0UER&Q`===L1%{cM7}lCH{JOPB`0de$F^4SG zguNw>3P0@^+mgxK@QdyG)#kel^IIRsJDe11GW-5TZ{Z%%J**kLjXRcc#Jo(pu}*3g zQ^(T23Nhidyvf_y9SZETF7zGy_vLLu;_*<eO|oXwlsYfIX`X**i-Byk=F9V6jkey% z6qGP7Dst;ETQNoVUPw>$<a@pg{C9Ev)(I?5IH9;;qh!-r*+t*CRYzCm-?qK0V#8XN zUi>DQKk=^Yk_qBf^;3#oKi;48;X~!rl$QRu!0!Q97exDMTJXe%dMvtRyjtwGIFnqK z+SX6kDkomN#lUPc<BD#@ZHLy02Jh@L7G2}oz_jI>$;4RJU2(nzeNmdh4Ea~KYS*XU zbN5*?<@WL!g?oQ&ZQGJ#vE}faI;Nh-Vy0}YhSlu0j!!3RUeo^ZL}`bN=Y`g5i=AFQ zn#KG}E-}?!$R)2}GQ(TnMNV-w^QN!*BIw%`-NJBLWrpi{1Cte3eHbno?p*D6!}m$+ zhK(<MB!39VJ<Lp<KkMwaX-AK{o_`R=D-$ewG-|;WDG{51&6RmwCwAJGGJMrzJuunu zI@{t8I}WBP`BdgxZjv+oBgdza<Y9Jt;ca8DH(nAp>k4-SD<-XayW`QxR&9UAiyE)J zUm4z+;g-I0LGpqLqOT*0&bXInEa$h|)p1Do>zA4wH;tt|MUymb)}Cr^j(0oCyz%Qp zjYHG@E-)0<Ud)x+-mv+?I@Me~{>XN@eN!~*O_XY17fDWa`p8mw_EOgMNlEX1E)&&# zbL3r6R&{=@mCSaPtGQ?9$+ocnmR_*J)*<`szjx=KcP?4NVtMD#J9*EFK!(=Ux0i}$ z%Q<bI7}ansiuZEvuhZAI)@uC~jS7yR-*;SU*W)kOLsCC6KWbrFCZL}qV4uk=sq<>j z!*ePdCYC>V6a3;@5c?hPosaIOuZmN8zwCwIea*Iaj_T|;wuvm*Dn2)`STn0rR%_9- zl}xd$0`s@L*Zy%>mD!{rNx<vY#CHy>-j@}8GPGkjdUt8i#P?EKCUVj2Eex-P^6Ol; zt)2VV=aTxttt$?1;Z2p3ZtvSCu;=xfcxV6DWgj1Z|Dx#jEOU?B<K)yr-?W7_vu2-X z=N3vR&TRPhG2rj!*XcROeA|x42Gs58dv-cO^2EPt-D8zOmwzhs%V-2?F6s4dR49{h zP_hY6y_ERa<=pcxvkd|-|El~Txb3m-j?&^o7w%k6DvZ#-aBr8*>Ua;Pf9Cov-#1;{ zI6b-RbE3e+wgr1G1lV2Lkg)B6uEXsc^#?ik&i@}&_dI<P%ac2u=bIHd3)VR_T$`n+ zxoi3Bh4UTv-q^Xu_2IEJr++R7D{Cj;+G#e^Lp^O*vwMFB%V#aaT-Dy2A$|vTzP$Cd z>v>z^)E};qFI10}O;6L+P3W0*u)bnl$1xuUAL9qtPo@WO7b~ePusJCIc~{NJ$uR-b zl!OcAI-^$de=*zTQD`lDe%h3CF`2rB=at_z?rlGoxpw(l$p^Y~Ch8wy5HD)9tzEtD zL;lmEgm(@KXIr9cRW9s(U8$Clywqp<il1+9_TQC%`>W`=a-NzYzuuj)JzF<TZP1FU zGzy$)a(U+6i9MnFb}UvoymsZc@+i5bY=u^v{mycQu4(Zr=h<9!DKBcLpzyEVy?<_e zT(UQO;t7M3G3(E17hjvQ=~<wkdaSRI&2Hi1+dF<n?f85kU}@s2-9}uc_ug2!AM6Wh zWB+*fp~sQbEXG;+jO#5c10>#5?K9oFVb5P{4bwxW$GeUnHrLSJ-D7s(kyu6H-G$l9 zf3I&}U)}!ueLp+H-)n))5xJQ*KRwk?+59}2rTpy?t59|EpW8QYKYW<^|M}lfPjtUk zm~M5uvi0=7&+-8ZH@$XN#Z+CX<G0C6T#+llw(3{y^)Go-eLfs}md*a2vF{_-g{U=a z7ro1@p67II{fiE6tCu2wf6e|GV^!!Hc3k}40yaN}dGDLfEw~b4+~vMV?OVmcE3Yb7 zwM^33;czg_xitKP*n-;Dzy%)!4zIrGem%vBZ4TGQ4+W1}{BzD6ncH*Y{ohNk_rK=l z?|*acn$=e6-!dO=-+Ej8;|br*iHTLKKB>5UdF;3N*xWmFmS#+K=o9WV>Misu@2Oz_ z<7xHah^*<8z{9~-2P<6*THIwa4}@;m_O2z;u1@5{%I0>j+tFIN+ie&O9I`J;Eiv<( zRFx=wtLyyTg&XuX1nVYRP2N_S{wednXW;b+t)r7p&8_6V5LJ9-_BQ!Td`*{x*S>f9 zGh=yj?LO0)3v-ROA1a;gTUNg2&aO`a4{r2rFT2Rzs&?b#%Ldsm)xVqL7@ZQlRxX-n z=AJf{FM3hfwNn!=ee##|d}}T9A;PF@!HoQCpT!njy~y5rqTA?GPqy=IflWRyc5V`V z?>8&i@LA=fGT{)xJ^qgi!puG%o933a{cZM^+@B5Ww%%N(bvH!f@!q75_6bwYzm9n5 z-w>F<IrX+zQG~7LULlRzM}9lsue+lE<hoF5Nye`&4DIPVSZ~_zopM<=!N2H^#if;z z3seH1IDY;yX}REn`5PbnP!(s|+GqNikGmw_-s6+Ul8cLizb~8pTIHQ(9^)<Mx?lT` z`4?-y^tO%NEEjg9X;0em)F*GG*2c%EJoQ{5U-|z7v(#>J)3nd;%v_uv@=D)zxYKe| zx-0*NjcrWSv>Dn{V_!t+tgzU5D)`|1qc_veSnd4wrMGyu&aSex@28aVM5OWCYTP@x ziFtnS>CGt{XPj6ZwkKY7wbvr+JpKjKoe$>+F*5LK$_ZvJ)R<fQFj_LA+#&hk6P2R| zuhPTgw{U4jUB25Qbp61QHshH5;~nO$`RlLbiOI9oESEHJ_<zHD;<L@qzpQ?0aX3R! zbH}TBJDi-4uKj(X(pUdv@m2X&C*7-QYdJ1YePA3q@%^+fYaj4!x}&8M)06Hc{o5z3 znpw$~UEpMe4u?{uW0iYX#DVhHg2!fY?cTh=!hMy+>WeR%CoYJvFW~z;Z~3?HT^pxw z%m4S`OMjJm^WTFPU!E+uQ1AafoB8tNyoSWi17APRowq4`YhFpjloc-?d1dvh-+3J% zq-CjnuXM`d#Ok10--p~YGpbqGYNtoUKl=9O%iRZe9sj?`DbU`(nr+|Z15O7kJ=Z2I zKlXF4<*|rA8|uG2%k6!vG*dZwPWhcg);arQ3{7RtPW4XzrMWUC$?g4&Emk}U6^8z@ zZ3myQI(_cky`p>L#{5Gek0+ga^(9#I!&k+~>$e}@dwAD6`s|x$ch@faxs5NlFv|O{ zt)=bDtGl&o-Zo5KTTv%6k2Or^`HV+9jwBwx%=lxQU+rXH>68U?ov+UIy~VzkVcw6v z`~;U+j{1MU1*4yBk9pg(H{pKyth|rYZg78deylssXMe=kmaFk9A0z%PQfKguKRWT) zi$m|tzf@P7Ej{46@6ne>db4lMsFLViZWCFv;8wl$&ekAz-DIOoZ2@Jg1&r|*0#~Sd zJ^M9j>*`kR8SCt7-Yo4*?pfU{)+chJDlziZ^-Qak%cnE=2$?pOzI^M-S~qXinp=!o z>v-4LzguB4N9c{Nkd^$chgvIjb53*oTz{o-${exHJ0mTm`qq4VGsETj_sYLjXL;`I z6I`Q|Qn^yiV@*tOY06XH(qNTyyZ7jIw_kY~x_Iy8>rcDg-fDY%%zEp)=3Cqkk$1ZF z_F)#9`#<<Rx^4EQcn^boGc!x@-#Jgy{ybUFC;!O&@{TweR{8(@sIw6-7t0nZvoSE# zND#kwz90?P?DN@(yTP~J1nQr!zoEuo(<9KBR^egnGbe%F|3G5TWflKNI&(jmZt}Z2 zm*-Xd{kzt+QnP0$-O6&<=D)l8_s`q5vTsVuWpiZTIEIHS>R$1jv1@bRlG2jUOKh6Y zC)+%{uv^ASBRFB-`Kdx5d1LsF{nmQ8kE4~J@iI@@srf$KlFdDfYp&Po-L*TR;(zq4 z&*6)!!`=Dr)|-C6{;ZDY@*lxVem9+13{GB}v7E2x>6GPC`?@lYE#Aqj!}maYd3wRQ z=Re*Y``dYc*On3^VJ;`Z!UN}97A6_7*gh^Tm=yBwU~R7G+|74($SspGI?B9UH&>6D zM^IO|P+^MSQIpFy4LW=m9E8?XT7|zZ%k=DSIiGw~)<VASMgO{A@1ERdsr_un9)B$A zh-7Nlv?U$M+t0}!Fj@6I*X#1sr900!9AR84w8}X7)|xXnnw(EXCWvT%Gb>y333Rep zRn9-dVqsn<=NYbn`_!7U7hkxTx}>zzBRX2&wPRY_gUV)3v8CnDDx>ua9gpnU+SamB zK9#Y3`$D@}X-ZsoZhG#uno-eQxZnO~-OcakdLky>il{nyStR+p(vhAEGXy)LW+;c& z$t2Z?q{;RxPSSaBP+wnb+UX8so=}Z<J};OiCaIk?VLuxAYVn*YMg0tEZ4Z~OpTWB7 zS@@;2gR|E5uP|}y6m)m%+37uJhMnRr_On&@|69mZrvJT{S>L10aJTir0gu;umOWdx zhrf_*xiHyp$-`FNW851RLe(!>?a=a8cXI!eS+=d@a7z2Z|CcV^6H)B{`OEXzHeK5p zOC;^5+J)3g-2QUxz_*-f^NOA>SE`I+GcPgb4Y)bUptiL$B2wmI-H}U4cQ|e<d(Jr8 z=DhQKYG%1a(~K(<Eke%xIlTMQKl5kmaU3o3JHM@vjVXAuZ{MoUW~&s@zcaGuwD-(U zU8bC+p0;npo*V5`dyF0@ezI+r-stdRITO#!^LL|mbWHXMPkO1ir;<5cgU5RBv@~|- zWJ$(0sT#4%42Kn_ef-BYb46gVhPKI<thELGpEM6VKh*GRWAqcze;@6QHzo-7n`RdK zTECs2vhl(x?}}Gn^|#$^Q+cc+c95?xiDz!(*;N5$U!MM{*?w)}6|Fg2{nmC@?~7S~ zt(JRxw&N8`ZGXW(JO77Vw)X$IBh&k=oQ&M=_TyLfRc@H?(WrG)lJ`*BA(gK>!o8(B z$9{a;&GPj~`c?tK@Ri9m-Z6~v4+Pk?X1`O{unu~CX8lo-hk=ju_lTd$vo=`z#!-Dr z^aYkZx7fF?SY{mdODX<gw{{Je#q${b>YUw|8b4JwvUALdTby)d;fZTTPyCgFmse(G zZP0sI^k8H1M15wh>ERishqXdxTFx<Dr7~^S^fQMGR$e%9(xbt&E%LF*;c`Z)0_{Z{ zZ{9_GE!%&o$++^gc!}Sk2}UZP3%3OG`CjwY>yedP`C(q+YN1B8q=5gopFaPXa=gYg z>`mU<Lu$?j3Z~p=3butc8&0Z~JXWG}GrEy!cEMf!OYA$?LYRHmDgEhB)cl<FeS5v^ zPy2_4V&_w&mH+d5_doY@{5fq=zfkAot+v-*Msu16&O0;ZWUJYa$xBYIVdM(AqN;bN znVH>Q>0|Tk*okW0FXlv_stlhIu;PC~@xphP4j(=->)$1vuO02TF7SWkC=HjZJiBV+ zYS)~2a~<K^S5;qC|IJK1XC1cr((<yk2d^Y<70>5ARg`v7_jG9FtW+1DD=Jb796cHp zpQ{WM6xED)ee|5Ri16xE+Zyj%z&`)i<BJ7fF8(&!_3MK5`}xy0efV--cE?;!n|E8U z1oGAv>{5QR#dhf&t2JV0J!+=UWb}DsCzi{Zda5BNyus)3snWQAt2S&iI{&VJw(sXt z%h*`1*76?J+P5pwmgy!}`PK=!&Ka9$?&6&5d7Pc2etTy}M#z#U^$bpX6C5Aj<7hdx z^OA^!!ReP<8kcxIG+Pw1V8W?NPCpCjzbrO#jdD9Q85xZP&PDQ`y~OMg5OE<*OMJTH z$C(=vch<b>attgz7$IVI`ES=Njn;+TU8_ttc?E}wa=+o2zMD@*PG<kLXS{u}_iKGb zMNeK{v*>Kr3AfjbySzQ~dB3d^2u!`O@S@BGkGU5!zY3k)7q@76Z+Ol$q3aVS?fcJ* zTK!x&6wlGY&cN_ri}>|VMX7lyskmyOr%~|Pa0mM>oHpvR8<=vtk~|-qFkVven6ve_ z$_1g^;>n)9OD<J7|Nq^mKj~}M?u{`EG#ah+N^S0a>?=P%w`RlryB05G-#CXKE}os? zS?TgL;Tr4qKDTpkeS)l_R7B=X2ssqvlIbI=^3ozr(O})mITI!v;+}e8f^UR}iEvH+ zhUA;~x>FQymMnYt^!4@ibw9s;_>e09;j{VgpIpbf^B<OZ$wja%4k^<5U7&p|B<shK zN0PnIYZYvo{IA$Fds`h(zkJXu?{1dWEJIddvET#yIUNrkVfoUd*E`wcqd4zY;SxVF zg^E25hOHqNSHwSS`{t}XGt*hdaH*>F@>y;Zq`0GxWn9{sb$jU%-q?mB*WU$|AL}Yg z&1HJ*`ak6Oi3xD6lk}II-z4TXVc+eli|mTrzr}XGjJe$EadE5CV;_xkJsH-<%KXQK zJyTdeS4Z2<I(PQf;w_aq|63J(O$>M^oAin6isfu|az9-3+DPeZ)%hDNrgI$x=Je*Z zhc7>T`+*Hd)%k+H!l=1sUu=3VcO1Ii`LA@&CJU)E_jJ?GyB$3K`ttA7i3M@9{uKOt ze%A8b*Qy`$CqHcOUj3k^q9>=2ZGrVtKAr9F`fe9hSGUjWPJ9`weutq(g6CPwWX-w3 z>$X3-cJRZUU7MRWYqeC||G+2o;0w3UV^<?)!)=8J-mNe+l6dYsU&2dM#c%Ho^Lt4e z&D`g{M4mdlSA4=*%S_$Hb?bd+_WaNjtJrX==ACS1qf*yGXC09)lT`jG>jhppZdjpn zVdaA@Y7>$lm}SIUO=?-)IpMQgt69J)KAvu`+tzLd40f{`a`xx!dcz+Q<PjrwF=Fyo zr}_oIp19bUt=?1QUwpDq^_|PH<c|?ISKhp%rheVuy)&e(Wbek0tJR9UzPeT4_2}BU zA@9sto{NtXuI&}_^u5*Dqo3-y<;lgyn_CWPlz;st^tia!+bDgF{>j?2>$A%a{jy5l zcx)|KT|j*5nQJ?=HmBEi+W)NyogA6Na&Y%7sWTg%ND41ys`(UuUVo2Bhv2HivkU^> z#8+L>&Mjy=B^<kO_KlNVsc931R1crzicM=1ifx%Jy6cUJSBauu*b6VSQ!h%)A{F%{ z(oSB9*})b2FlKs5=WLTD@%>e+-<?_8{{G+TPuEiT_XJ6vi5KoWb^SO`aqBhxUHdgu zy?hpFKWdWwdO%&^tMNWHw<o{MT;48U`6p!U!;^;l1AnL9$nX5U^Vy5Y_udQlFZjO9 z>iXd)Y}z%qHhfB-nJgT9H}J2Z>>|$x`4hg|@v9%(&E&gGT4$Hww!X7ss!?W3n8g&& z7;l{%^7P7t><33!GWHetYJb`g5O+oFS#i@!<GjkygO7Z(r&!<rH0#j9{}LAWo=tw6 zP$O6=e*Vz1Wovho8Wj2ZujEqo-nKf5Yg2F9Rz1F!u*WCft2~*tsKR~LJVPn>Ro1h; z6sJW#J1f0>=gi-Ck0gZeu#EP9bB;Iay<4!x<EcJo;q@CV!zMkLf5XosZ>{9RKp$hv za<$pF^$Q*?$T@DXyh=^!wwqC`jQo9{&qqD8t&KG_pCxbd+m^I3jnTX<rt$PKpYxuV zUQ}9N7I98A*uGI<LEz;h73`f#Y3t-WeQ)<FaJKz(oEyD;ljov>`3GWsr|>eaFO9ig zZ@GKl-wGS9b?@D$i-#Y+<2ohxCvVN>g4UcfSI&0&m#@&ceCqv=n4JXyn~(IFe*J8H z{Ypiy#*!skf;L9Ap8NN|miZE%eM-&Y$1~r<UCU&9f|3^pgihTYzH)<BtChKr#Fhg) z*Dlh!9xR#2Jge{xm*C?SZZVoIMQbj*#UIcQ6WOz5-wCa2&b}9p+MIe<;+R!FnWs@} z*20RzI$y8<a+Lckka1$gw$kX$J#7~_u5!IxdB;k^+Sz%#h_=BmhpFA%n#Wjmd_VVe z=S98L-=%Gs@$A~c6Q+9~c<$0YpnFPe^G21ThnMC!3q@L-k=w~}L+(!5G)9|Sn#>D- zdFG#3>wNRxqWUF8r?0cR-t1eQ!S~hLB(jw|FChNZ;!>&i9+$NjzTEaM?9vow)33HQ ziG?|FPF~ehmNgucnH4IhV)p){n1lRGCk~@H3!RgKsb9PAOyDnmulU!=^S`I0T4Bo9 zh75+sjg^5j_b)jkuu_a^*|V!h6Uy&d3$ZEv3RkY|W)hjL{_&85XLnlP;uGnQ8e^4e zpKR>d*|zVZ{RbT$tz!3yg@%ci&o?#Z#AasgGM%5lF5mrW-<i1e({ywWF74OI`|;z_ zjfRy6`Q^F4)!jN%{k=FPE@ZRn%e4K%2KlcA&x*d*XMV%xd&f$m^-T5N$!EAfJbCiF zIe}+q$!#{@&&yYb+>M;_?4`|yr@K!ju$}AaHJN->^k4ae+?^|Jx1U||Q*KjfU;QVR zw;LQ^y!)(pMpLYH!6kzwyldOd@??AFKAg|Zr+9Ep@4Kg0Uro<<Z0p_>7p(E4`RC4? zCiRW657K_;Y&#hC<YUai`!O{SBQI@PYjWM=ci&&>+l`$pp?`L^3B2F)mSbB;Fw=Yw z{r5q~<|>Q*UZvTrUB3FkDX9%XXU=HHyNAXV>mBx&{_0zH{ku1#BD+&UeNS@9POG!^ zMPGSb9TIx{Pw#(Ubi|_9_}TCOsMY+!`6Az^u`w`2suI7Dpg6NCwHVhzf~eg5%O0R( ztT(b-ZFSA#y2H7$;lfn2r4x4qnNDo@EoAo1;@<A9*KftDx5U>Q@9xWfzBIh!aAU&K zWiM~l+2mV)K9kokx5d2A%AG$Vda+CQTEY1TN+yS0h>{Y$wUbTaTycVmO7P?Tid)*2 z+B_EaP~4nz|A|0XM9Uqnsj?;eXXPx{nxAdxsZ(82^XJKjkB8g)ncC*>-+BK2-RHt) z^X~J$?eTX#($;#;f&EQXuVeJLuoEmPQU>!}-{@X2{U#N($1HO7^F9+<wL=>sJQ99b zKi8PiHPiROG0UA{PbBm+PCfTYEjoAX02g!M1sCtomUoLXcUcM@%QDo{aanUhDP%%} z?u#oqRo=|LT>?hTjMaDT-^TJ)-F>)Q@z%4ab6T}FD`~r!C5BB@XsrKgli+pzUbOq> zsmqE(4JNvZglYI4T07hGhsX>zIm?5m%B^j$-8}m;Stqv4K9OT*>Y+_LCKT;E*et#G z!li<Y+_WWr?Hj)d^vgt5@3J!Kkt<n}Vsk!qrp65)QKO`pmo(keABdkeI-u}nqtm~m z=XacN+I71mJ3~B+EjVgv#rZq!M<f)IcRo>M>gXw)CZ1d)Y`yc<=7^s&uEj8O?_|6@ zA$M8>8^5dh1RjCAmS)pTbFb#T{ki4xPW_}9UPI~LbM4Ll;`bhWk!14f&T-9&2QTT| zo!h#pqrtZS?c+kllq<e*ch1b?cYl6;@4XLyL-R`>Zs6QyRw}>6ZS(zZ!_o*J*@!y^ zGebI`2v(h~SnhfB;=TQMR?F?2bl~LYM~gp4shBL2S^E48!*#_+8D2q8uCRP&s6ASe zm^aV-)beiL^>sd$CSfzAJ~;aD#a0P@_UVaQ9Hn2q{@3)y-S<vLzW-Gn5qX~df!K-e zunPqidPb|ReqVbbN@D6V=S0<<<>}7b7zJn9Zx1X9pEa*%quHkmc}sJA&6cZNeYj;p z*po|>Etd#wsWM2vr+E9V$7N%Kg<?O;1Y;(@&27?Db!kfQjP1Kw^UOr2Q~P%NyCu>a zW^Um8%{=|L>KV7^6@ME}T;P(rYq(?K-YJ$9iJ@ID7HUVm^L=oW)lgR}j%~7NkdWr| zi$xy=pDbK_QSix(VvQFrV!^B`%nLYz^;G1A&!3L@^xI*R{JsV0-=<xdaPZ`L{ovVe zt{qyj@ax=_Lh;KY*YyZ45s^AB%~QD`?udeF(K)rGu0G}5X3;GnlHJ?fCjYq7Z(wJe z=;~0jL^SbG=FSVdPaIP%IvF?p0+0X39SWvLw=ZQXJXwD1oa)*pMh8)`b0144s+|jA z%UgE3EMvR()(5-vJ{{;==OO<+Dfpz*=jAI3C1<&OxxT1!)7u<}5ShhmH+e>6_+I?Z zxVCND{bI4|XA;|dxgK{$2(Mj|s&atSwk7Wi(}Zy0c?+#u_S(vor)_`yINo!!)NT_G z{mpw>7yD$nOqwO}=1ak>iues|yfMzNuWj$JHPqqM+;rSv;gO`Sj|*o?bKj6sx-W5g zD$_&m%}r*DdqO0xvkET#+obyYZ1L&*`KoiLzsp~}=vwiSZyCBhb3?BL&)-<9x%Mri z;{LEq<>Kk$Vazq|v%YQKbE8jbW16d~>^!?v^&4|iCaw>kvn~37Xm_+oO#8J%D@<yG zZ@dj%d-B*^`S6g~PaoFK%yOR<*R1<x+F76Exq7$k?#r}kEn@jIVd;U5A~TeD4$k<$ zILmf<)c)KL*HWwdw^nbgcY0FdyL6qg2J<8_L(#3L-hSQMa7^n{z|xTI9Oo`LXGeH$ z@bV0kl)3v!>i3_E+Lq@hKX{g3rIwIz`2U(N>kmv^7pu#^KC9aCe%~$z%NHg^yLUVN zW&He7@r4fKRNh0(_susqr`u<luHpCu@#$gXM5lF&SG_a6oH}{G_2elBH_NTP>EkAM zd&j+vg}0i7wMu%IWyhE=xGFteKZj@kWUsyZY9iOEC%lh1Sa)r`Zpv=e;;_nu`iau@ zKd#)+ITXEct3lZ`sp={Gxr@3yo!oOuf_CouxcSD$%q8agS+BUP-YWV#tunk#uH!(F z;#tRl?6*sQuwOfMO+}&P&y58Nb;79^pLplJd6<;We|YAR`~?qJJ1#HDdGzgt*lf+$ zWedNV$qT<v(>@|EI$g~1*)(0gMo;ejcblu;1|}~~^s*M)n(Om?s?{x7smAjY*0z4! zyd<an*uJZiHg!*1A^)5Ai>;U2mXNz$CfQNH7W_HhoOO2xukYnM46Y5D(^)TsB_}7} z(<%=P@c0$+(Qr%Bk@eAC(xvIKmSvlE@Y+;;`LxFB+ZXmlC0h&i-n>5=xo7&m|J<l` zUQpmpWn*>*21Rw^ySBx7iMe<xz1R7|mID9h?LTy&-A*Lv*5nBbI0SF8C`~oXYI;$7 z%WC(%HScAtH|<^eu;l;mvuD!GXNOD2niWhv*R<+uvd!blzsK$^KK$xd;M*4yLa#2n zlJwq0p7XlLss&+z+AF?3$ymcO`4+eI=KzCz34Z5?GOxGl|K^EIpT|F?Am@Lz(&3gu z?TA+{TbiVF{Cc_~a<(jAy6&8l@w^C2ADbMZ*;bd2ofcqk;g@F5x!>!mkt|uH-)oog z#^+L<l5BH5qk%vQ6T|MX3hkqF6P!&Y)g{lLH(L;<nxB4@Q+9vl=U-1xt`0w5%4YBX z;(7j;&!*BoW{b<ty-zvvYvt8L*KTf=<amA4e5KGrx6)&!NA_{bB#S4pBp*KJKV?dZ zfVYXo@nbR)#)h9e6LPg(>W##5a?Z*teUV(OY?tV^no~MOEPVcQGb2F>zOu(pJgfqq zDtujVBg9=nL5OX$+|JV7X99y0rrzqb+WlhAR=w)AZvU6@r++SF5?izP%E~LwTV{wn zzi@4`mGQPM`7>wftIVAtqGRvG%w8t+Zl(IegyOId9TKzO`4+9QGM{w3QfArz2Mdxv zsGolnvht)9@4Bl_uDvTlC9AWyiW{+cCX2DWt!wzGz9XkD^J~+2$AD@^=AiDW$vcAD zwR%~q#eYwB)C#@gaqoOpqUY~jS6}_Vm&-aoQ~u7fD_@-=xKGu{HFs7R2zFdcFljv~ z(|kx~#=;9el5(9dZhlVk4CmzA)&11=rO_lYpVK!ui<_c5rXO2mc+9|*vG(!$1hKqr z_hz2axt3Ggv`<LdfH8u@?ZSbn3I2v2yh*h=wXb5>=0~6Xd<}Ha*<8QAj;PXWPFL=I zeNdusY5)2bDHHK*`G7m?nxa_OPS~QqSLpUh%j43jPfq_|wB#(~5eK<nYg=?bUOOYe zu`764q)({e4q2C=YuhuQNlI|7Kjw5<{z*vh)GJyUtxKLCY7Oh#zWISreyu>^R)^vp z9feEJlv@dKW%B)2@X`r*d{b-Pjoh-lmOI}*T;Z7XwB4n0#xaeZg)8rJ-P^O{yXJ*k z?)x|tvy$4he>%Icw>*EN@%Vg~;&#EM9uEY~SL+7^fAW`jpv?JGW~R2{VXNKEU)WNN z0(P9-8G1o%i^EITMFtWtK5pS&V14+A!kvzjGd^1DiO!2pX5E@qx!c4tPr;|Ll0zWJ z$W?h_;{B!ma&7CaAFkb{^I2unwCyjaea!Xa??_ZAOf*^F5XG9CF1YTb%-q<hPihV4 zog8<Z4w5>$YHy~E(5>69F1wXIZwIY75xV^H#z%6>Neo}F-`*|~@=5QSr8-MR_tqx4 zcWb)~t-F<++Sv{lcW&SFdiv*OJLHztXn5^;8oPgvxry%+Zs`x#uK2hmEQ%<<)oXEE zG5_W{o#(vgb6<Jg^jJK{X323arpu-w8ihPRza`#NGCZcm{KC2H_?&(7Zx`8`&tcYh zxU@CaYF_JuGyDO~O!GGDl`9_Tlrv;^wf=o8f4@x~uXIOfXMOtfZ5Qk~b#)%B=4?{` zr~a{x$-h55Xy4r#xA+s!dhaQnz%b2)#mM)yvv$&+$p$XF8*2IkX0tbD<WFSSvFr}B z>HogBx&Z+!;&obIE(GtL^_wy2?7<`5S7qL5Oj<lMKRRP-<!h<uDrt+Y*9AQ^a@TMD zzSnBEu4~Aj%_2v>z50Ab!0x^u^GUgdrxxyMcAhdb`J(Q{wcjnA-FjJ^J*$_!biH?s zf2OcbbgYBPHIFDq?eG;$e_|{T+kN@%_<hmM{P@^<&b++5S642-DbtT~d|q?y^U}(& zKYLwx)k~_vkFwafM_rj+W?T1hE3@avE;jvsqY&fvCrlFmR<{{1{G6?Cc<ubcrpre+ zPU6+=oywDynUm$Sd~3}E<q8?EnU)VTkLjK8RXwaTLDosdI>jn<mB^xbsYR*MB_^%A zX0DzuH22QRLaj4@ck6t8Iho<Z+mQVF_a^)g>^c401tz>Z@3Tt$@{wa#v@)!jKU}}8 zKIvtxPuF@jiH|QcHH<~3AK#>Eb3bB9n4`AJ+ZTnqa(%;|^~xO(c<MNHt+MK;53hW( zoE;DMx6YCE<g)U3JFR?Kx44|KubxI>WPN|Y>IH(PA68!T{r+m#{`ez{nr~T!FSg9R z60vN1^Z&;e_V4knC@SoDu9^F5-S(R9hK62o18t%2{`!2m;vHpdA5%)sbN%plpPik! z@!Ox1d-m@3`ui<wM)TVjeyN_U56*u&8e6#WYw>zjt@CV0qm#cWan2A?tvc$~l-<y; zdAHU+r@(*7hQ-#C_5?k>_KCBOvFW~-i|e<?t+M|4y3g|&PEB|I>`?W%{KwTjp%=Wa z>~re<k;v=Onqeej_uKAJ#X7Hm1r;}DEZ<h*s{N5$PGP}E)+XcBGcy=7SH5`NHmB-a z=xL$+qrO3b45>$DEn}Y7OfJ4-`72|h_L?Sn)d!BeiwpN|>&jWVAW6jXy5H=*tTJhd z%N>kE3LiSxzy7qR;@NpSh65Kx<DFBq6L`WNy#LRDS|hL1`M*?vkAcC#hlCorq$oc- z71|AzuwUdRZokMaw1S1<1v4Yl+nCoyw|9vCd%yg^nSUGR2EI|rEw{S4O*nqak?8Aw zxt03+Q#x97OhgW<I%wbWlV5TEqWEje9fC_dI*U>)Z@W#_Fl3aGk*Rskb)o&d*>}r3 zmNjl>UpHPk=CvxOCWU>nZ@}#f$Ahb98=K8Y?@0;q?RaRSUTu^tDF3-bOYhR(=H(CG zx}<!bbKh5_^6R6ctL5tc`_=!CtN-s<U+?Yq+3$+qOWXdF3r+-2`+j1o#KxG3@|8x3 zC%3p~NKKZP+%~b;taaP&X{z?8yx4{HPR>y8Ij~=n_1KXaD>%8$)W!cNOf>58dpW1W zWaeZ+<<^wK^<KGJNjEHOdgdncRiAQiO)}KHBq7$(B6@oHrrc><TU*?9rmk^6ci!)p z`1QZd2mP5Roc%b*MJd!qx1!2@ii2BK+N;X`4x1U~OP2lddcH`(rdKfWz_}K!zbQ`d zB~MEBnkJX!?d?<B`SPnr>)BuVA{%`K*PYnmG3lq)g=;HwUo2jkdr9f-o0`MNH(WB5 z<h#$;cD;G^>HXi@-?ty0oBu%3|K_1$i3x6=g2tbgZ>%!ast}U*`4?o@dT+XU^XJXn zFXAeHz5DZ=|NX<8=lK2<+^H`wGpxC9Z}m3*pzx-Rp>G=|e9*5{X3R~9k9$4;LGko6 zn@?VlTDWQUBdx@Jm#yEptb0B81;??A9#j8HtT4Wzf8e>tlLnErgrpP4(~K$uf;wjQ z6wM2@xU@>LGgB>SnpRPIhSAHF9Zsqn*rR4@?0o!PNA>##or%S>Lawn^*aWwz1sw=i zN()k!3sFyBp!sHA=9&9Ujwh41b?=emTDz|AjIO`$<jDT;gxB$Zyln29Y&ByNVM;H0 zGdWs)V(j7Q{twJ$7d9Iex;V6NZaJ4Y)tK*GW0QhV-~yTNJ?Aw4%~6}v#CvPIjo>Wq z0PmFU=Y4&1E}Yp=zJpPLbqB-Zr)6BG3-~(Qc=w)pq0h=}J^2{tEvFmZtDXxhn>0>~ zG>9-@T_tBCo*;QTa$ST;jhNqWS-o85Y~^R&dlEAZYjgj}pEI^$-%+byA@yzT+7Nz8 zABh|1s%MEboSU)mq<gZVpz)%#ra#Oc3-TnsT#|X4x61G##|M#?<flaf=h8C5DlQ*; zp4DOY^tZQxbog|0@#RmpzIQ&syWq%z*lI;y;fkiq*>Nf_j&q)0thBIW(TNW&|JE*9 z$a8yE{o(C%xE87<ykY(~%hKxI{|ol<$1ZY&7_2P#GWROiTf^5%+AkI6znPp=Wy`AJ z+NAtU!G6NdEg4bg?%Y4e_IEW`@%0j}KL4t9Jd+Ko`JY{?^RxE7P#|?&#(bXItc{b7 zaLBxL=h0li9`N8;#Dy<>ciwlblw=Oxnv`h}!RffjWx<+nTYk6MFLhn`z3K6y%`JhP zY>g*+>emE#h)>^;&m#0nyh*n1kGh!-<CXa*yW_IO_a1(GHtN`l#s9M|EnB<lJ?B|F z_v*y+4pTDzy0VGM#zYxb^@aJo?pgfcishBZrdNJEd2#r|k2Hf73yK2#a=-8&c<`KY zOOR~U!4#!tfvYTqA*&`iuq`?!;JYbhPl#^8FIVMFRsT4BkDXWEpv>^;lK51S39^Te zo_e|de_e6O)%fDNpWcn%7M#8k`|*AGBHq7oVQbf>Y4$!~*U97lecZ|=g8Sz=_62Jh z&m@#RTBOsQAzjX5_u6;EfpVXjp8g5eQ?7iBzj5#Xl+HV4FIPw(pB}zk<L1BHtFmIG z-<dqQ84<a!ilLvSDWK<FOI}a0m9w|>=Q}R@*IH~bj-9)=`o7gv&k6D-*Jp=lJX<N3 z8kuytR=HGI+et3<kHq9tGlXQ9>~au!`cgT}{gm7C2j}m1OWybwQ+**Oef!D{XB@<4 zr&^im+fMZT%CvN+Yv8TSFG1x8*BIPX7TP41cFFTY(TUVE2gHtDnkg%L@?Dkt6BWip z%OfAFX4)Ff{*b}s(VTwivtip7v3;L3LpSX*wRhgpr}*{A8m_{X2TL-87+7x4oOXI6 zZ)>ppt}DA@r8;lcSs8@8G2GR4?l`P=SYXlebwAP`^{)QA!((xm)^_gnse(JWiWixe zp6e}bC{baLamo_At>n@%r!D4WB;V}Kp;H={M=t#HW!v$lx6>#5V|W*{*;84oL}8}( zr!K?dnS$)*A736wSePlySlr@kY<m0?r+;Fn&AN}u-W3cJ|M|=7t!Jy|{_XXxd|GFn zenxeeUTOX9f)yGEA3r|${AxU7p!mPZN{4nn;x>zBZ4x&4%2mVSd2@|oV*brtE&WBa z&TB_M_nx<IW8z~69!1GlYCJDxOgB8r5G*PzuItk?Ui3hdAy4PL>pmVC)%ac73|4Md z`X{CY7M$MHp`;f5eb4&iH}>)!StWh`t<zqcp2I8ZP8Aw7#(yX)EI4~5D_LQtR<>~1 zyWIlYHKL2Bd4IUDrGLfLu4gaWVm~V>DJ)%NsQ=`U$LjOTwpuy8j&|AHY8Z8RgX5~o zS}9u(aVshJm($u3gZT<?89e;({*c36H=o-#LPV#FD4BeW^K7g=bzp<n<i~sde0%V8 zd&(L6gZ*lAFJIekyXDBwwNDgcv@>re1SKt9?4hV`qRLy7<~w1r0Ote)|CL#W6}vbB zne85AtY^yjztQ^6B8L30hYs~Wtlhb9M~K#qPkhW9J_zKLr}rJ2dv9G?oFT{J$L*Rc z)+rr6H;JR<HD9dByUN(~PR=c=Uwo1-Oi<al+-;gR#}&o{5eJ!scBL)-+ju>1+2YC# z+bl#*hfi&JFX0|5zL-Dav#4F}nkOxpIo3JXI!X?#nV2WK%|E%-{zA;A(+=Fz-+U94 zV|9{XohjPlR5w57);vYc8%u7wsH84wi6~$>W!&@Uz$|XHZWsBxH~v)@-Iq<@@mNTn z+wolY)7v}eM>ToXrhIiea7pOE;~(95fyuc&nlD2a_e^BCc~PW)!m%f*`dcRMa$C); z9Ng$-%38dF(Q-nPiN=E0Gp>gfyY4axh*cKJH2QVm`P#@+dPP5&x{vcr`eNAHdpCX; z)9D3^TeM&9Jk%imy{9?x!}G|9L&t>E`4|e?qjzsr*x9<-H8X8z$DZxnPj9ZCu0Ct# z!ic#Clzy+xyq|mTh2zmxlG$I=4oV0_X&5f;N^budwJ?6gVbky(M_AkDr7NmOm_Cpw z$g105aBtmJuC>3lR+p~*u&DK{YR=y~?JB(Oani<I2|}w+t!>r_W;dFwocxTZ@}fzJ z0ngJcDc!@5U)73UeHwW&hbj1RWBI8Z)9X|6-+o-(_h*Oxbw*DcmlL+n9U0e7`dAv$ zDj?DOu2ghG{e{~fdCJ#s=F7;;4`)1eBUSW||Ak{&J6v4nJ-*wft97u=aJx<1lH`ze z+Y~Oa&rMHWZWF~}tYykIclC>_E3zincc(s$b=vFDbN9N&)HiuuNozAo)l|$62g(MB zM(h!raGLj@&?1*JiEK%tSMvOOr$`+QW|e;Oq157+Ny(h<mG*&OCe=tu^PUcw(f=q+ zPev_I^zOSGi%d_hoa?kD)l&9jdRdLEaFpr1Xto!f9+g|{oa!|*dcuz@75$lC|Nm6! z+Hc-1nsEou9K5|HY3eW59qV}A@5dj!$5hrmZ!1%qz`L+#vAgo(jk_*7n<yVj+|RqV zVyDd2<ax~MvR4k9?afkGm;BPXf7Pw$D`qu5e!l9~Y13c(ekpz3RF<4NwQioyyEzB6 z=Ir;ef2KKISm)|xnNo@9qPfLCQ@rEft-bc(+!W3N-bW?LQ4gvGBOEUsn4-uKu*gA7 zDXneB;bJubnafj6&zRqJeY(kL^6y6-iy!I-?Y8pjQQhl){@B}_zNaVlSuWyLUpJqt zDWWY*p;W50GgSSW^4<rxj_=az&)}>(lG5@kx!~_VHr-r{w2#}DscpZ#TIAuM(u(~1 zX-=nk)<0SxAE9ydtB2R}4O_d#t5;pRsKZ*i(`{bUl{HT?PbHl9Zqr&(EO5D_KSM2d z=gp$W=RPtV`6H)4U$t{_a#=vUq}LnQ+G_ced{T}4GY(1ACd9{{?)BZWx6Mp^S?)%$ z_b(THJGa75PIlrcZ>EX5sot7O>q1$t<f<eDzI%7oYTNd-qFH`tcZGOrm7R&RDKNhr z*1y}*JM`y+$OYm2GH*h&Pm9iY;P#NY=X=t|MRlzkTUxfRXA^jMcKXEq;mdmW&Io;# z-gr?*$w1k(xkB*{cO)+>|Ez^+uQlJQc+Y8^e}CnN6&vzcxwTJOa3;+Df9iwE1?gip z%RjqY9f-etYy12MH+D|D^LypJbv|humgQYt`HlDb>So^0&!0T=Q}uQ&G*{f&ATWEm z+q3Skm%4N>vhls0tyh0M<RaVW-&f=wX388A{>_|hzsrjGj$`@!UM<;QrFJ=dx>ucZ z|26Z}Jx%bepZDz8%<{eb8!k(8ZSs{-x7R=5_U_CC=XTcld9!c6y3WSGx%YnF4|&f1 z-R(ZU2QPU|<xHBIr+DsAgF0{aHt`EBZEIEge(vW<kQ3-HDPzsPEBJ#ck7s_@)$+-H zl6uMe3dD2I-nCqn&y^H=-|dj~zPV3(WbB{roLg6V&u^bs(e-yV`-)ue?Fko-d$D?N zf2jWD4u?%MC1Wb5p1jjy#Ot>02V4KWiSzjUUi%(9T=VW<=oGDO3M>08@^(cDZpv;w zuvA%K-zuItW>;hF9v|AibVI?`ZHI*8b~wBi^*zISyKVJz?U<O3iMIb8tQ9ub_p&YA z{B%W(P*Kx;yI;FiU+`aLe5<+V<gxgxN!%-YlCLd$zjxO6$p+mU^Or@mf04c-zkABl zSHe>!<<@_{w#Z@TnH@ZFQ@3`;bw}*W%2|Dk?PZMm-q_%3>5>~cY1i*9Jl4GL^?i<} z*E=n~?$3NC&2d5DZR@dH@3$K6w_};-od5rSvEap)KMuuy?wpg?zs>*LnA>Rc##Hml zkDv0Lf=YcpkFSe9d+@Oy?QEw#yXUQ!V`gAj%R|DXXJuYV22yVm)Z>KrHpA}cUp5e^ zdmmr8VS29CT?rw5g(d4suY1HsZI!z{Z;{DP9k%OyeVYaURh{#DabrP-L&f2&;O{lx zf7WT<mz6Es-dE+`e&K4?MWg6zr=B(M5#G{wO)NJ_pfXmWLVcr1e9Nvzm*pHY%^GHJ zou;X!-V@5Tv}bB*eO=$Sc(EBBJ}MhUqhxvho!jmg)@^plHTQ^b-oqz9e*9pyjr(@@ z+tm7fZKZ#$Gamm4TXH~q@r5smE3aqh#Bj}AeCJE;BE5@q5B3OkJWF#|`scaCMqD+; zN$Enq;N)a0X05liE4dfjCnQO`n-}s%os_!95!#vgU-6dP@(_RZvQsNH)(XBpmBcmG zOVfcp=VH#O*zGnBla(ApljPG5cC>1nJqVvuR2&t2eCNJZG1-xCWnP+xU$0$YwrBtM zYLnf)Tds+6Ox?9lx%|_ODo?rlN)kQ6?<1<W_diar{QPmsHQC?!lM)ggBTi^(zE<D< z$$mxV^!MB2_!n3oS^PgkcER7w{6A7}i+1ode^|p`BekZ%?(oedtCov3XQFNv2-<M= zh8!2?`61(WIkDo{1EnVidBSQWdw#r;I%LVO#wdOGr77cP^&ii!rJR)5A7>!3`FoC8 z{G81bn9~n`zTdZH_MX3QfAxP`p0W4dyb~|p&UO^>{qf4`$>j_w*S)qvoUQ#!{GwGi zE#iEdo92IQ>V%gH_2v3=KfH*}cMa};yI{ZY+l7WMTIY=yX?cgZE|#2lecFyVp~5LH z?JFE!SseXx^Yhx1PDws8lRD4O3l2)`c(i5Z!Xr0ST9Rcncb(K!zgHN&X!)mm`>ycX zzTNTbNMYHs&aM*^PGmgL>AY^#HS3U7YPzF@@6CcU)6RCwoO|4FvOBa*E=c(5{gs#A z$L)#c-rd>F_@ii|;qIt2(`)YM?=@!c{o`}Zb)VAYjJoBEg7dfjf50I1rrG@M++^Oa zf5M*IMPgPSIa{4;mGXDZ%<VN@e>6O&+$-x<PGc?%JW=M6(<b2mwJ*nW^O~02D<Vm+ zI=>h4Y@c;(z5Ji_w;Og{{=K~6%=Ms}RR!g28f@1$^J&QBcVC=xQr7N8*!ov&OqWW3 zuSXr~S)9IlqY?)L!yHm3Un+}BQek(wfHEEk!!uvh>wIZ*q5tppH#yk-V086kj%mE+ z7+^k8nz@gEL+F=Jo(s#;RpZJ$Wlv6BDEDiBd0T(2r?%$CH`$HRNBYhjFPOJ~=EGNi z-V~hwdGV*D^%db2sn^!@v?f{DvutIy72T@MYY?Z~@buNgR6g$$Gt;MYW;&+ZFivw) zTe88)vn)w$LWhsaoPRd5c8dA$uOux!nv-|4-2Tspzo)OSkE=CL`0;z|@4x(Jv9-Kg zzt?C6ndxn1u}vt?;<~lzzKdP^9ti`z;BV3wWOg?)Jx@El_6nc&%L+Z7(=L2G|Kkf% zd{WPxTWEI9X?4AGlI>#Fcth3CqO+N_d6zVsZFO3jp&+&F=t_gI?#xWZ)TKUw4oW@K zbban?>SpcqaFCMNF#C1+;@iJ37W`Rn`0CknQST{RoTfRQn-O~C!~yxeQU*(<pPQ|` z>2+zU*2Tj?MJg%j=hjNk{H$ugYg5|Ox_Pe5>@Uxr7*1Pu*MHK1Lq>^_Vb6Z9I^MK5 z%;Li16|zDT`}*QKcvR2cNGUSi_rJtmu69n%44=NZ9Xndy8LXY|8Mo}fy_9cXw}@0) z&DnqS<LZx3o?q0zzI`(P;?v(3TgxQADcCd5I;;KiqQ&2y$;k>$eD>CH#m0u*$x^rF zT;B@#tG<l5AtR@rK6!g}|D)^mj-L9<J9uq2_6u!$_O`idh2fe9lg=O5z{IsQoKO77 z&Rd<V{wgo44LZfTk5?9)o$W1h%)RAsyxx*T?{%$OzRJGRM=s0}exhu|?z<-V^C~Te zTPxJq7am)%%}!Cm`vZ%V!Rrsz#`#WZUgGO?5|oNF{vDXO<vefC<|QU!q7!B7cPtBW z^uF4h6YQLJ!Lva;EnnvS_1lW`9NrdW{4{sCzxBDY^uzP^H)Vf6`L`=&`;X7v(y|Yq ze+&<-=E-lrd^_=Nfs4+r_&4g^4PO@j?`i#3@#*5ux?<O;$Ie?n2(4C_nbg@b@$gL_ z9mjR7XRm}e?_=<|*}S2+=b^{L<*(LQdua5WIx<bF?d!=U&X4+5aoL}rRjroJTc<xS zz&TQL^15kypJP-fYtOm4R&)D&f%aDk%MEV%s6I_su4_-u5z<j>_EG*&^Ucdf&g>-D zPK{hwgB3rIXD!I(UFF%UWvX_0o8v5%jmHj5jy5^ArJt>phsV?+cjID4-m3xzzNU{1 zMPCWYJz5xi=Lc)xN70Mk7ERjc(qo?dHH*`lc<IH-NbiHo)wj-E{H1xZZ{T!oozH(C zt60|NtzW?Mf308RNr4@w9qne#Ve-t3d!$~@Q6G0*xgs~_`lLcz=G)r}_Zu$O)!zCh z*Xudgzs1jA-}J3y|6{1Q?qRCv)BoDtYD?$k@Dv|Ev2h{mEUwjIH@0Ucxa2Qi_|RTe zV$~y!ADJ)h@~%Er*m2Wr#!lBy^CDvIFiu~<WgLEMkx|r^C7ZUEu77R2VCyC3<pEQd zH`X<pDyYd!d|py{a5_g+&8+vWQNHVM%5RT4A-Z<k@k<$V_ANax?P}+`e!9?%Rpsmf zQ~$5#`1E?&h48oslUB{Ix@%OXrr_`ED#Q88PvfjZlUV2GM86N)0@mG3yCM7ItLFAS zZ%>@tAZt}9eX;Om(6JuR2m!~1zUt1)$|rLkx|FnQ_bnf<!*M=GOZUc1v~Fiw9h>;@ zM}5E5yeINOms)3MJ<Spm4Luur<NdaYHdjN8BeW7TzV$ore);)}?7N+5&u>({xm)&U z|ND-F!uL`y?|NK(VZEV!`4-8l4|C@>+b?`4^XL9~?#_Qcy9#gWW@>82#Y(sbn1m_1 zFqH*KJh=0m$#uTd1^&Zdx&JNJofx)t^6%=m74t6DeSg0C_3Vo`4O1`wo$@L&n>%E& zt4E;syy=R!nCn>d^gSNeZz;DguYK-6FJ^VV&Ig_Y;^oRu<5&WAec+8b6K3o6CakLN zpxxAaR+??1K4}|d-iL)JO1zdnE)!)cQ+((%`#!F<%MK>pn^(4KtI=tzn?=sz4_5qI zI=3r$YSCQT$V;cSZpD0^+Sl~>kmrtdOZ`4>@8o&#Gh?#qlhp?<uIi6k{pYj(rbV{g z-#_u4?qRvyZ~m6a<gU;n&AAf|oz94FOyD{m%hlWRr<LvZn<aK?$Kt-WbqgBrVqSQn zV{6iB=Gu)f+L@+RTmH)0ZFcsQc$vQcvzYm=-tT?yMt{4xd&7do<vWc&^fu1AaBn@& zY1>6cC5NH|H{E0|SIv~Rk@<1vYvojd^3|o$wfoF(_^y1NrS+97`E>X${Y<^y?Jt?@ z+x!2&vHF$bG`k|gx67b$g5H;FSAS>au&z+m`M95<?u5}o<*tI?ug~&M{bM>cWQKlj z*teagpO4+X<f=a<^0sJn{G8ACqZBL-zMZYuV_IA`J498j?!m^41?5*cqtg6x*KVHB z`ax}Rq)trqolxQ8ZLSi$LY+wycZciW*}s0}sSZEE#EzU5idjhyr>xW3G1oh;Wa|wP zrNEMPsxj_7hd#^rZ@ekJt2}eVl6()2B>BIGnsPWNPPO#*_MIEdb-BoF_5J^s=Xv!- zT|fS>*S;_;*sAh?(dt6xf?e0@mfD_ccv9n&lXu5PE%#nk;-N3k)=IBy%XnW^?6WDz z=<)>Z={bQWmsju`vSkUK3lcJZuxe#i`28ObCLY)Gj0#ozysY2EW6Rvsw_2xiN@Kb_ ztj<;@@SA7wdfvA&JfwQjL7n58m7aL(i))JhCAZqb7T?X5Il5}c>_*!h#cMHJmP?D< z@C9%4Q7+pNwJW&u_)9A%{a@lo8{X(}mUc!v_1&AhPAKxjvswKWk3;QUD_k$HW_>Rg zEoRYNcAM==-kIrVwyv@;-c=i4Tlj?aL`aIs?SG#-<9iP8m|^#y6SV<S<aDk?mW_eo zw*v8VO(jK{>G`m;lR%9R5Qa5Cu13N)He}mfF_c;UZByQhu7#P8wy-r_DcHO9cfgJw zmz#GoE-ltjzqS7U#3?DK^b7ZBlxit-=}cU{yLz7Wy};wWulgR}Dr8<|Wt2JbT37GV z4Bu4~!Y&4S><*a1cUh8k`I0$7dpH!lTo%j}F}(6vk~iWAQ&OG$wtX}6(u<}o@)PEr zE3SXbxA@=1dG(u~&wprj*YTF+%*_IAokAg|i3;miUi#4ak@M+gH37jx>RIy+s?L41 z`D2u|{K-oXTaF4C`Z4}L&!MHJd_i~@L;A8O@g^7iE^2x@a?Lwr+N!cFakEaYmUGML zJ7&$!V#*7ycP>*@QF3AKP4K;Ha_`HuNhar*w32SMoW2+N{Z;aI(?2#Y_xJcJPH-}w zXkf^u+pFaJ{nZxEpvw1Om%co7DMamnOGZZPE1!;S<!UK@j)6i^M>my6TVMNm_Lgw= z=Ntc68RupuNZmYLxr^~&uSQ5oL}qB(lBl;0t{Isui!UB6uz0cecY$e@z0_5{4|2jK zKh5~W8U3AD$}DzCl<Yoi|NHL6YVBhlAM<1bmI|y+7c_EEW;SqDROhnWBG@kx>Bd^% z=_K{<!<reFo=;IQ5!}5spw&mQc!`(dG8a}2cgc0G79~vuv%Fnw<IeOib*??U+FDIS zsgvWe%aI+aX-ct5CG4}lZu`Bi{aTs-`Q6NWm;>gX?q9p*)ro|qd;fXlTK!!sl-aP+ ze6H%O9Xx*%GDBr%Zg~~3LhS0Sz>D)9^e()uUCyiK=67^PaJ_@aV~341Kjs;pdzN8* zS>SR??Bp*7_XGQOvOhmO=R?b}8JD?)l9_f*sw_LKaME?>M~yaz->IwrUSbhE)opNW zi!k$-vSk@L_nJOAS-Eu<W-nayaqGpSZN_Xn=f=<Y^ji5>o)?p<_qp9w<u_%&R^R^X zZhSa>P0qd9G5Ken`%FK3CV0+wr3R}l^_7L3>*E*ye(>S8^zEBRZ}~lT{8l#S;J&}S zK7G|2cHMvdrs-qhb4QKxX>0B7O~0yc9a;NHVYPqQTD!`S)t`;-oBvT3zU?Cy(A&Bt z_D8Y~W3H-a!kK3gnkhGZQzCQKW?opvH$&*|r>91Z+7XHu&sK&0Da+fMd}s5enAH36 zP6u8lZcfi!aeya==Z)*OQz9awyQft>icH`-;jk+^c<YoinX`J{FaK~SU+jT>&Qs%G zvVw7^F8<i?d*}Z|gEjh>z9i~?FWP(J#?HU({WEu6PpnmYEW6>{-_7+~ihcLV@40x{ zpW(gYP1S81H%kRCoX>D?r`qX?{6ec)zggzgb=}I3wYJ@!{J&(1w2VjV>XSZ6uOI(< zBh#@{Rq;yx?3aoulF|pxy;sni!%@Yquw6UBXGzlkBzOM`J*x>f4jVT9-Ko!^5IfU) zxmU9C{?unyF}1<5PovXyb>`>>wU;x!H8|U_P4C->_S<Q^dy+pY+-3gfcKM=Z_aa%3 zhP8PvqN0pP*<$X`kc+wR@qEUPr+eDZc<k6Vmu0_V=A3TM4cb?_5(*P{izvT49k~B` z*4OIz3EH!?zI@$QkUKqLpMmd>tTk!L)=M|uc<r@Yb+hV*^ERfkKW1d?yS4h<#J|_; z_A#?^>9238+3nLdNATZ-bK94<Ztr<>fIHY-?@^9(QNcQPi{34_KWNWzw8)RLoOd|$ z!me6A^Pb|(i+_k-KeDTP|MNWVi}LfhH*F5e7hAXV=Nco&JI~Vg)$Mv_>9r#;eCFOX ztL5cu&!)XS>H5?Af;}hqzh{}9@kSTzdIOJ64RJkmA>?`4>&Yt&&(`kz{OBoXl-e($ zz~_@hxhJ(()_&ZbSQ_gb)W5Vkdauz`_Ml|D`(7c|T$M8nzgWdSO1XLV({6{;lBN24 z<_RTD59#@u(thR8TbBK|Zohi_pZC_RD22s6mls98Tb!GxaCuFyUfC6f?rDZ%Qg<#d zk7>|(KkIIw&a^w*n!epjc;oH2!Q{47ReG8Cjnhjd=cvSYt!6Qs*2(q4%Fx@=A~<Pl z(w7Z!!2vn5HdKFj_HK9jk6%lbOpNsM<Yu;4CGTHYxA4i8$g22hYuLD4G*~z{`OIct zvtf2*klO8go|``0-<uhv#C6Aaitp;CzkibKOC`RpJJ-!0^)7gNWz@fI&)FX5%H*v3 z&x~64_-kBlj^blruxTfL;HjjtAQiUS9#rjsFs$l%8VkP~YUa6^ocW7x_#H1_d)e=8 zgqO|p?HiwbGb%RLacL5Y>blUlKzG~q|8=_=JR7I{(F)k;p0QX%<x7G1?g$+*?hkjj z?f#Va_^w%DXwjB{l{tqdeLKN9YjMz`Qq|<z1^p^DHk}d|w@hkiwRzUnZJ{{(WXn&R zCw52cg$3PjhE=m}sTG;*^XZ|-#JlhJ-LBugee>qqN*{JEx8Hwt{_kI(<x?iuwv_qg zS2+Ay*)ua|qPAf|(8Tx(lcb9~Tr*@Q#7o>$UY^7Az3pxF#XCi}<Uh8w$VAEin-`$q z)8f*5!^c8cvo3j`QA=OuvZW4eJxe&bqe8cA<Zy_pkkn?k37o_qbd+h*F-C)q16?Nz zi>?Q2We9$coU=j9()Q;K%lD<X{?>nAnA>Ocs5|1L#nX=yG#XpBoLRhCOz=|Gy5418 ze#R4p<k(k)I-Kj!s!estmzdbYHfzJ5o3r{|-!A*<DRS>xea(Ddk%wI^nIfs>9v}QP zEwrT0E_J<i<40TjflLpZ^|#;G?|k!R&-r=VKlZ*`vZhQl`*__Hww@Y}tM?S1240Z+ zYq9&*+iH3JbGy~&ckQ<efA@9YmtS)?-#R*Z^I?D49chW`S`E*YKOJMcV)3fR%JREi zIbXkZctNW`dF}_l#XBeWx&6Mt?8;vJZLzS42J@_f`^MLbD^1v!KG||U^vJZwo1Jb8 z7IA$G3A|LVwwt%G%7S6GbM01<&0@K=8yut7sW{}VT`1V2$zyrUjaOxAxzy}73){3# z{huk8yz2_M$}A0Ioutc7B|Zt~{}9h7W1w<7W708a88Ii#W3BNMf0!&XI^OUx>A=+) zehg;~lv0>{E7VkGFV<x#x+iAG!N|FMpO@-_fE6(Thm)NW&u}`cMXuoryY+dFmBvyL zJ(V7NzG|^s7j@(f<}S3oEpv8ZtxO}s+=X+GWJzw2y7hHZLFkry9w$;CWNp#q40p8_ zy|DSt#ce7vzV}-??p!PrY~w7xmN(r?uG#+;$6EGtZ;g1vU0+{b>JsJr+Cy{N%N3zp z^yY7RuyDSO)Z3sB5^D12E==2)SGr|>;)RH153_0?didPESmx&VaN2>@C%=d*-aYxH z%5#TQZuN1ew{@?(w#`_b`Xp+3u6)Psa>v=tmn5VLesv!8Y1;i%gg3|2NBQ6J$-nC- z&ykaKzan@`HRALMYvF^&dv{1l_09--bF;!!)8%H$lhRh1%jvw$rvH79v;1nGKabf} zYSPNxGY)5WBtE#4ee<PzvD}>IOE+r12l%@fE>m-wbc|E}k;<iZPCxJVki<)x-7{Y^ z%xbwP@qBqZ=N;e7E2|dWy`a%rd2L;v(>sBaY6iAPGd0eH`hGE5B6!UG;U|{#W#((- z=H)E7%f+YtW~!52L^yBxi{BO+yjc}`U+@0i&b*Fe*Ij3cimheZjzX;)#a2E3V)9MW zEuiIzv&_QM6HA+>HAzpkv0Cs?AeYa}^>DGDu<=>Flp2RGpL5uDzu;3#sXe>fIsC3; zrr*!UGp|<n{R_WXk{_{-ea)dg=db+Vb)mi@sd9HpN$uAAi42z=Gp~G^p8a!$(u*?* zI`@rNJ&^Qgc)zaT=AyJU-svo@o3@?nI9#y5`ID&0CIf%|S5LBJQv^;&y<W1|Rhd1N zHP|7<E&hmwjh0bbvZ8TJ^b&r)@4T;;EL%R|*f$@&?A25GrhCXt5zT!1+qNWDR8}oz zvf8n7R(nz1^!3&Ej$0+K+7>3}bwWJq{(DiS$mr6N9siy$SX1{v&;9kZ&JNd^qUM)# zgCowX^`;ocNoTHEZ?wxhydWSfMfz>z``{qkaIuz4L6OmOOJ;m|v|x>g`s$4{+_Ro` zB|E=fJB@GiIhiS<D^>Y!$V^}SuJgy8_Gb%pjHY@7=}q2x)xEv4o9`6Y*NrB={h?<< zXPk6WUVlAORaR|=mB#9?YRV7(e(bh6JNtykX(jPfx3ZQTR!L<~y}Iv7a7mG<+omfg zUvCZbYOh?y=k>W#r8+mk?8?api7G23x1>AD$H=RjTV38JXC9yVtbO7ssqClTX9Ds9 zw7=i}{XJu8pogEb(ZM5ktS{6krW{CKbz`%!P1p;rCrWYgqUGBak2+@h9Q``YXYE;= zm8rUK-)%2n9hGks5UuiP|LnEXstOM|oemCJ=-qSHPbhwa!4tdmkI9#3g{^#a;?^y# z9f$u$^LaIM<;mI}G&yhguJ}YVW4l|rp<^}sZie2x%xN!d>?|kpoZr0RqQ(^k&sV>7 zJP(;DB^^@P`kleP(~N!Tq6e-Cj@@OsqPHJDvu97;+Py68cMZ!ePqk%|?}E>;g?@DV zkZ@b<_^nlo5C1*N=e4<y<<I$lvx^K?R>gN+FuZa2^F7X=9(BGy<j(}>fBIT;FYWC# z%iB$-6unnjGp^~`tF*N0SrN0|>_^YUO^*GVA>ZP*K3Peqc1}p{^PYDSm8Y&M2>pBi zi`~EIkaVf{hFG20$lL246@1>){7H28DHl(h)Re&dna<j~`oFK>YZgfD`^R*P&F8L> zm~g3fm*A6?o3FC%_FA!LQ)W(YrL66;<@{44H=VzdbnTtlJZp`!zpb9`v?;dE`PTQ@ zphs4j<?LQRpIILtZCGV#T&Q_VX3D0!yXLq$KJs&3_T=~blj({-<tuIkrL->C_l#+; z<LL?8=FbedQ!kf#mhV*5#jM&h&0O_)39;5j_O>&2Pmx_<`)l>D*IP}4`20l+1NN<& zIP2Zhi5t!4*;sY=z6?I5m0=Sn&|p0CMy~MH4@WB|X%)x3YVq9Dev<X%ckYbhfK?gw zR<6xPwa#@4m*2je@@H<!?aRCUqiRK>(k>V^Pt$Gwc71Z)Z;o4Y7VMPQ`VvuSCcf?O zu4fj@b*p!7N!8zRca!+dJnps#=cLjK)7Sc!Gr5n{2kf48@ah?<l(X-zmo;2nzGRnU zae$O`!g>kbd$W{R9t@r`(^7wn4LhrdbNlnpnX4_=%slX=YK0rG{Kc2IB*b+b-XEPP z_p|1e%2LC{Nm5fpwmkiRhX3a^A;#;e6Yg$5wO49!)83@CpjXkd>aGz|`PYKC@dg|J zZVFg`cvs2g8}U{~;am0eKS!88zjpKi?+iXIXYH*0y9ypKvvsMSi9ECammuGw{GLtC zk1kuxcGjLQbCiL9cl){v$!AI?O5Sx{|MR33m%sbl0?p%Y+%p#0TylT8oKx0Lx5U<c zc5{%|LzOnmj>CsLFD|*DaAD)AU){_;!IN$aes{Nub=;q!V3K7S-MaOHUqV{ylBv<l zT;%W1&sf>F#G{>orL<0V*0p-(jD(Z7yEBUeo?Sb^aq~{xmE+sYK8u<h{&Ma020Pv# zW_<k}B>_^K?c{r>T{@|9D!#Gl*ZK&bq%<D^U!jM^pXIoZsS0i{tV^)EvwGp(fRi&% zZD60e_xN#vmWygKGj}H>-I$VeU{UMoV>zolT#P4b6;)IQIZD62zW7eiW<SHl&65=8 zef6k$_4u^igdWBHjFZk5#U%d7+G438c5CK=z`bdTrxriW+?&3AOW?s(+!xb+T|0HQ z$839sxsq7cx4*1Sm(t&JK6Z%6;GAskA8)s_JD7cGlB8o!;m162Yq!uJ^HkSw4*nQ; zH|j;o{Y@IHmL6TP>S5b7e(vaR%Vhk!!}dP?P+hUjfAI;KPx}kr?2$Dr=5f>upC`g> z_$R}7i>XBRL7N9{-6kuGW^wDR_snyZVr5}lYjyO8fAsvXlY{my3gA7RDSsf1PjvOa zb&IB+zVcH>MMHh+gO~E>o=$!7kFU=^)cpgCfo<f)>^bFytD<?9b}F9f&}0j?vg>jD ze@Z-Vij_h2XV>J~g;SP3yppzIi~JM0T($DcVZmR1i%416aGqV=Etg~Nqrv#;+<Jfi zXcaNF#cO}9nQ6B!ZChxC!P6G)@9|lx7mPLkY^z8MH2a+MY3lVVS-A_6UzZmA-qg4G zaJ_CZ)2Hl@4O@;%B!7PRgO^$T$J2!#PorxswwgS@JcG}D?b4|oe5ZP<rG1wjtJAPz z*xc$Vn6W<VclQTgL(40=?d!y+mn}D}{`@dTV|k@<t?j2yg|Cg>HjLHPbJVh=D~;2C zKhact(IwOUqgQFt)Ae6h-ImsE5HDlN{>WvtT0ci9f7k7%e%n74{qpxG>3*8udz0V% z<Nl=oH^f5J<?SZeuK8+Tdw-pGR_XT*@811e{A%CvT~FqhUs0X9YjbT(bZ><5_KbHb z72>xvEfsAqwdbcBe3*B5zW);D`_>=!{!iKR{PMGHcke9R+a`GatM)skc^dpYQf-;@ zDt}z%zCQ7~!d11hKg|i}=l?y`75@161mihk2V*jGgsdMe=-4H2djADGo>jX<J6XP` z$h}>@=V`);Zyy8Ro^9Fq>5=H??Ps`|4Z0*R8!CHR9Vxl6B=peDjBOGI5?*c&@l)9I zH|%z8Th;Wh(tp9vn=P)&AD-uiuc(vV+|X9luWZ7;^q`7XwDMwhk^hP&>`&!**JeF` zec=q7(wDIGSh2H?nMQl__15RBEPAl9ZL-O+m7m`*pUmre`qyaLtk0n=4im#42r37( zw5vQZ+E|&F!zTFH%GGc7zdHL^LEmRC7bSA7lB&`-Y+2C9dUff<Wtq_et2eh_=hc3m z^=#q78~o4ole^{5xPSKvSl@9y@<n#8@ceB4><qqB*Ee=n?Nk+bsc`C^o6SGj=DcO) zPS1UB)SN0V{P0CW_66rrh6P(2ey&(>MSJ50Ww+)-T`%9yzSSUhEQkAN+>Ijci!vhI zyvDv<x4wM$HCg1ZnA;lmCXc)A?5+b%iteGosWUZerpV^nysVtN`Sic(zQ$YfUtW-} zyPK80^6v-cn+HAS{ac%Ifj6mUa^=%GjlMiOk5~PQV97j^*1a+z$=UAiDpm{Y@Nn_) zdlwVeZ}wdF!{x8fif`tdjNg{M_BUSe?X%dyxv?_w^Tis>?wmVksuX2!v1^CL+|V=k zA8kur=iu97WB(1(#rWVX#%^$m$#&lLx8L{2lvUkJKY#h{4#x0>dUgNpQTwfJ+j-e4 zxfmF}s1iSBTArDgmREvf#l+R9*F{p6V*lPRzu;GQ!&A_}VxQVnu5E=rkD?{jK3=&Z zCf2*aG%spz(00SkTi0*Z-=M$keqj6ywpl94n?i3-P4Ke%buRR|%*vH}qwWXaUa>dn zb(PSTM2m_4F7U5@XLaG)mz0e3sE&6g0&6NSr#UZ`ESE{_`QrX&^%wT6B#D&zT&9O7 z7M9#-Xy5b8e&Smf)?i)tyc1HlZ(EE0syY1Y^8SvpQ}Rz6N|oPo$0lxHrC-9qYa3qi znCtPshFVdR<9bIViWjrWa%W^$32j-YotXNPvu!_PdqUO;r|>g#gfqUj7aWSXU^w6C zX?5^5aUG+i0L?|cR~hClN>q~b5YD>U?_`)T(Y~RHMTX1PEH#EJV_r#1zDsND7XPU5 zxnWzYueav*Ek6@jr}4K#Ni{^pLp9BItwGDho_smoGbVFabtvvza@bLDm(3Psy?PNJ zZo3Uls(aSToqm({)lkv*_WzDM3Mob@hfjQ7rYfiN_0TN2?rrCKwru?9#JBL}gs)ZU zch|pNy?J%s`#slhS2P;F?EaZJ;dh@nFH5yKkMv)Us^(R{>&&XIy`6h^Th!hAc~N_d zx&3bJTqy38UGZVM;v*%O7==Q`piLSp4|}t1RIhoaX(!OU|L-K-ogZ1+54U|fX;q+L z`pEO8rg2j?yTvS}372}f)h~x1X_~p#T&u5D=o;@W1!va%$%;1dOQ&)yQtV;b+7~T< zJACiwu+Ljcy9JM3d)_h2H9Ec{VoSMfguB-Nzfl)H9BEx<e&n3VdH3kUlQVBkU8p{9 zdAj4a9cG3{Y^)axRLR|vn&)#lO}?|=`r+m&u@|mHgl^XAN&0*D<=f?%Ra!lZQ$OtC zICnDb^n%XqEo=2+eyN>PKJ;<NvofZi2`fFHU2L0}Kk*E|#HyHWrZ$|nei>b=GQPvs znPGo}{h|Bg#XqbUS1~pRmuAlY_U_%gPc6-n94TLXujD32&v1XY@cE&1l^)+;Pfk}K ze|oE<KzOf=*Zwb;OXbsg&gB;F5ap}6UUewV>AWz@w#yG{_1V9j*cvi1(XU{-SKI$X z<rg}BC?DQ-Wb#|ij(eQ1tgF9HKl9M8)UQx-VU#eN`&KEt)f4qM282wNTN-d_dyU>~ zbMv>W`{&-8e(mbZuer<1ZrZ(^Q<|-@d-?Tv>oYEY*IaXaHbb;4lxuOQNzuiPg#m0$ zSJZ!}thj!B?(6Qb?V;JG)_2pE-(6GtZq60E*!kxDx%;P@SLU31de1U<u4(<=7n>I6 zSltZ$;XZfKR_0K4H#xDBeT(j$<g<FQ=aJyyA3P817X0x&Q>1H_obPm0|JwGlnQI^F zD0Xenz4PMe7UKo$^{U$HU7Y++PF3N4HTBZtmdtq9g<H*BIp*|zQ!o_a6<RGh<*m?x zL!Dd1>Rtr4KRo#FLg23q_sUrk1_lEC87gZt9&y^5oHTR3q;zDV!nCQms%N%*ut;1w zlkMj>RpTO=hKmkAw3bLbxzxSogmwBk*}3=i`q%3}+oQN8_jB!0xf;`t-4oCLP!4!` zo9o8uXP%6oCs|uu=n=e@`CxrS&D~u(I(C<{&giN7=-HHgo?qYoki)OaywBZ^#p}kz zR}OpZwHBz|+VERPI#?&>*sUC+IY~>HTY2Wsx)J?3=}F_Kk2BpI9{qOTy?V`WU)GgR z8FdQJ9Y|c;wehT%+_SjJl8*|duYE79+N5k@y!781z3Wd}9>q_Po6V8VZq0HqCwcM~ zi%l-v$F?+1Zues5ug=h$ba_E&<K3!%FSgE{70@FX#CR*BKwEH4?X`V5rTG(!pRr0$ z`h94RwBObm5i9;eExFd^Oi@SdykAVqN}ip`qomI2wK&y<!*S`G4fEMGGlF`bDt+yi z3S#`f%qw@k;-UnmegUm1xgsnI|C67at+&eErn-7j)IytEH*)u^NvY<WCFY~MVP$4B zf8~?FPmJMqUgst!w`#SdG<a;>#$+vVEWo>A$Em|hmMy-l9+G|B@6buDlWbw<S#C#6 z)_-wihV(5fqnSRdZrDUgn)0mfle+FU?^Q9s=Za-V1$N&rcR9-$V=8uaBj-FV?g)_` zpQRuD`?BlsuUDQDE@o?{?C7aXIwE^zs=|jC8o9sc+JsH6JrX!Sed7FC2bj9m`+D4_ za|j-9oM|!Z#=n)@Dm98)r|RbOm2KF)SLybgJ2G$fYd)EswveeTRxfh<-NfqN-0r*Y zVm3E7-#vW&>o2bxhvy#Sy5Vp0VBZ19Esswn{`e&<k>i{4V$;SiFY}mK6}MeIoo{e6 z`rwgi%{vaw*>P#p?}{^0)?bgk{`K%+*&)I9;MZSb-fn77@cQ}9==pJ#s^T3^i_UX# zo=JaxN8VNL_nk!bobvqLevjV#mnkgU9^TQMe8EA@T7T<>jWQc!uf1Ay><>?)z~a>^ zS%phl!j?>INL;RSO{!Dp*y7i2S|6V})lROjW&MBqgv89}d#v+Y-#<4N|Gy=B^C$cB z<=a;8Yu&Zk=~sVLN4w;;x<vn@+xyOyTV<yDb$n?ydDnCC;r0t<;S1(=?-QFWdBgEl z_LKYaB2}SA8Cmy^E1D#4{(fC{_x`4{hTjj_%>LyUH&_0KD*I720lq&<t}i|tnq`_= znk;$PGR=9$j-Bpb6EsB6h<};X@cJc>ayHAEta~K}r#|~lx^_+d>8Cm+^K;u?K7F?7 z!12v{=P1}RER51s_lPR8>3zy_CFXW|{eB;|Rkk5~{9c?BmUcea5W;Q5wEF#&48d?Y zrHWv$1{-&lYHgma%uRcRtW|aku&9=KEMj4?*5)X449L^io$e5jr6K)xP2C1BZi!VJ zW3$+^^c^llEM?WXdP8$!W0j;d@9y3I<;{;R?3-7)Jz~f8sG{eec($0@*uO0^tk0Bq zos}<N_oVEDdWM(2<%_S~8|z|U^~;_3=b1TCt^VzfE8mvq{<)p=$4N2JxLW+O@hAU@ zXJz~!hZp$$vikac@7w+R=N{ku+G9qmWc<Pd#p}g2<}B^HV3`;&)nRdKV4R2;i+9Ec z&HqbIFPs{3$701)?!zZF&%LfR;L^Ip)L5aV=&^Nrg3jF5#NTWeox>t#EZjbwf6?+q zu9<30XLe*f_;D_&(Po1Gq1V1o6iU3G-Fe#3$RoSGU2TW?ljN7a;%mQJXdRUOynN?O zkt_SmUr$`a9W19m+mr9cY4wZoAKM>=XtCY>FiY;%^m$>ETO)ekKds8L(3zpzo6={Q z<#CGRmyt<f2-n`4qP#>cgGc@^+zlgAUVfYy8L;T4F=I-kguR}my{2UOl;tJo<33Ma zImIjN|6ks18fpKx>L`ZXSpD<j_K-c-LUx-ydiGZI_k?{;mbW}+nQr*2aY*U4<j*^& z8FoJkOOWq$KUks2cspC&YyZjW2d{Wse>sYzz1HM<@&2NqRib$HLE)0Wj^RqvE(kpd zOWyx%`sXL6p95<u#ku#LFy6=P7oNI)_T%Z7zD;GY@-uUrpLL<{w)}}FVVAFl>@wRI z;{8VKzgP02FU^VDy!B@=G|l!Z`YSWPEV+$yQd3`*lJ6SXt6UNLOUsLEZ{OV%zqUZ% zd|LI<Npn<>owhx4^`3=p?X)uH^+C$}d={Pg_FU!Q)y!|3Z0mUaCm)Shj)?kI$=b2` zy*Ss=rrL*5x3*ilpVT*aborQI_aVi;%pTRly7dJi6NC=`XGLw-?qg8U_{q$`&@RZp zpv54{5SCe7nwaCP?^cwW8d6!1s-KycoKu>Ts-ISrnhKhT(N8O>NV71*)v67@op;+p zp!R$C88iN!2MVONpAgFpRM@!on8O2(J~7YvAyHD1cc!{JE}8S|{r3q)HJn)sB2V9l zWtx^U$!gB)nHPUX7C+uoTIc55s~VM5ry{RsooSrG+bepjHdJJl$&`@FlqIK3RaY%J z-rap}ziza@Xm^lbu=CyR`MYzgYoD)sfA{O9*!txsA5FjTD@iYzYn9RSO}@#di5h<u zHc#0cIon0<GV^WIT~8&iEwjF2-?7Y5E3s^*;lnr%j%7kdnv=tg*t?rnYFwQ!Gc)SK z%!mo6HnaN9&^lXKEuFh8X{LvDuKDqx*+G6<hYdq3d02HfJS<vPK6g{=w38jhXLEPS zeq&qw+fluOCt>z$R#z=^qxC6vs*Besy#4jUb+&-x>tgeZXS^=AuJU-cv4^E>Mu>#@ z<SxtLlS*Yxy64NP{+!A4lh1v#>9?z(c-s=*XFAb;iWuY%EcZ1ET3xCloG~jvqUzw{ z?+=aka2~!Un3i(x_T(G0+#^MeYyEu6gHGzaTM~b5bDTic<AVx6p79@&X3r@!U)Hxn z=iy#+&ZI*MY7WsIlR{f!4me8{9=A;OIwJG`TiVyI`5PNH3;jH7sXt9M$#W|AC7n|o z7E62WPU~sP<j4!MSN+`=Rx0zxVpsNL<-iY?aV^)azxlERFflu>eSPryLybL>F<;q} z&j^@4Zz*oS7E@ud<^1<IKfZY@XRI(faZKRYT+YSc-LsR{nD8z+Sz&K$p89!#rrv*7 z-}Pz=wt_SFPKiDJZEA1fm#&gc|CZj`zkcPJ_DfsNTWO_kjAvP&%DrG=+bRv7^SvCa zoMZJ$=4yy^{@MBHW|ML1X0tP9w@&#ee~pQenRMp0X!|<N@V26~4H9yO{j)y4RNu7p zRp;|<nFlgey9DcYJ@Dw_QOdklGU??08(puz+jdp<ty=2;^5k1L!$Y3Z8AWNgbs1+a zWWJ$&Q141$$iZ!`7g}3RNbf0M6ZmY&)Y<F)BtCD=@$FHKD$e;?pAerfnaZ20#U(Jw z)aABJR25ft)vx6lzCF&VuV(O8WeBC*wk`;M^FTd&R#BI71FP>-nOY|$rIxbP&9k2= zt)5_zy=8gGBI6rpa<+*7V0WHWZqDUYU-O***g<oaee1VO6E-*^bX4upww(LTn^sL; z)|-BP{f*_X_oe68osT}d|NX7w_cr*y&b2+iE`Pz#dp~yME!uCtAT-o})}FwEKd1N? zJO3z|A%3;awQbuEA-zTY^3qPqMUSqo&^$B!<7%yI-dp}2Kb2Sd;a%nq@wq3A9=$Hv zVEVlOcJ%2d+stm*6x@BA$1LLzJmKPli~FV7)xSymN_PbX&byeIE$%;e$9tyN>uzN( zpYQN+!pWkYtkPe@drR*Y-9CEuJ>Txn`JhsTiva{42YxjJ(J-t{RH>4gSCU$kmzbj; z8p6rIEM>pQ4TNE{ydcv>7#J8h7#;<FHS1Jxko4eWV6ZV{U@#@k^u*GV{ESSTo$|L) zx%sy(g#OKocU&MpOQdi2ZRU3yayL5M+Tkm9vt;6q7kAa=buWsQs|I=peSF3D`~LTt z3st=P?ppNLy7H+`5I_AWqwV||W8)?B>~G(#sQd6|=8dZ>mY%#c+vR!Pj5kiV`rNeN z`kbHqIOOh%kUzUGepz|KCuZ5J8=_j5jAc1vLdw*XRrzLTU&@{=&-;D(?daeTv0IfN z|MJ`a`TOH&`TbgZfggXH>i;|Ytp4p`J=NSw?D3^%r}&OcovHQusQO$rt+Q-S&o=&8 z^1`}sp;3*wd|lYBJY8A!Tb(ogrXINO<YZ_pY!~=wZfI7FsF%pKKdY4FMb4(E`pgSU zTIKRG#O8%JbJ>A*y~}4emfd@m`7%`JlucWsibO_Q-sRw`OF^<L@2qUxVNq|rYmXf7 z@&7W(x%WbpjCNkHT={wDhc*$(7WZ)G#GL0lV>9<{-D0G=M@!AV$*S{9jp{^muL#xT zur+mNw>Re9y&?DfW%j>LrO=9nduL3|jLLN=Q0B6h(#f6PQ&OOC<eiFLdgkuUQ<wHK zicLITc*w;u&!^9`ZlYA=;^z0p6Wml9dlyI_wOQMBgws}dlXh;JPF~C;e{GZcSFL*{ zT1~wia+mdeoX%ZYE_QbRFFgOOg(sgpdHiGh=Fg`;KFKk%tZ2%%3ST{4zEOM*$8^S+ z3Eoqlv}``nyS!kYx3sYD7QF)#E{V=<)}Art%&ILKQ^it*G?bq#PL<l_pY#6krJAE+ z5fchmb@_w|Jpb7$xWDoKjFjY;s+Fd9YS!h4=$&YpUVZ7UL}Kc)h?+~M_ln5Jo)moU zv&?0g!>NhfEz;WJjf+B!8Nb9UXlFe&TOU2wD2wNuZEIC-v5(|USEKWsH_t@4Rw{&^ z%blY3ytw=QMzzeNMbd63ZZB`qc{W+-{6x#8dwMVBO=)FX89Bk+)ImloszCNi*)RJp zpB23C*4}>g;HmQG34IlRPi*hs$MxD^S;P#sphwY5j*8j0g{8M{Jkffh&g+-Z>st+? z&+6DNUs|3Zvu2AhcPqoO`zmV|`Fx$T@kHC7D_$O}?ebs7EbMwDdis<GW81m*A9>Eo zjD4~4vhQ;5YUsNz-O9E4Qkdmk7g1@Q$t};d-)kG1tBLKOwK75_WYHQg=YoJNrT1#9 zvzmACmC4)-emwb@(WhH{8Hb}Uojb#{t~07+Vb;4D*I1UzunH$J%-8AA&wAWBZ^kNn zE7ri((n}(z*gE9ot@-A;t!L4sJ&6rjugs5%`|SHNcgN1x>XV<W-Evv+%50@M+>sl) zI@zYA@+sHOT%5$bE9`Gv*6GvJrR2YO_mp;p-jrXKAEM%|#nq~vuEB3|Ahk++f`-lY z$%Ypg9?d-SG$xg0-|7v^W=6~~>aD(16M99obJ^0TvmeeA50`f|4?L8^7<R@}ZL58n zm*^(t`fXenR?OStlPIZm#jfIA16QE$>BD(TlT|at9G1OmZGL@hf$B!BAA*f{wr`PE zb~4;uIhU1Z?inU~wl*t1t98lC|1S98$?E5J&LLj3WK!_ltQNteR_kNWGi>NtY;7&M zWU5$L=>=`}fPaCfgIIL3g?HXOAa&pZzj2Fm=E}DZgcb(dv;BLV##P_AR#U?x)v96k zfnd$D;7`&)^?9mEsfjCgJc(&s<XT>Gx$bpRa(C(Nvl&a~CLi5${mp(mL)DEO%gc7e zeJCy3zK@wL<J!~KhRNn^Y}?;V3FTeP&S@#sypEeAB{b{SE0&qUadS_+vN<(z|7^zl zzMMw_H-xg7`x{+hc#<W!fbZ%51^F+P81=c<>2c=FZQtFXRq1GOrLrJEM=W7~+ph?@ z!pej*Zc#lmx?djrn)^LN?0fIacUm>C3_fY-3Kp+V|95oDl}sC-x|q0H^LcxAOZ6W6 z|0~tR^6=Xqf6~7E`%_e8W@RZGTX>qWF67FR1vB-P{e%4`*qyiVk6oF;w72?toNb%i z)33XY`d5hkC=|bBP~~k<d49|HxXP+C;vTmTX6V{JwK@Og`_p4(CA$}~F`apk#r9I5 z<~G}!GAq-)pL_P1OyN&GHM2ijg{5rGT;qv+o_A*D%+%Is5|?6m;8o3hGx7WaZQZ0Q zgO+2OS#wTW`&ip><$8r#>1|N3cQW^?7VcC%^n`uRpQ5_cmr7?$ieUQs;hbGU=q*0C z?w6H)rF9ctcg@Qy)s5+&u7B~wVwZmBiHDA|eag9_JtzF^{r;sAJhj$ludjXF{J%GE zz5SGb4-HC6xHp<`ZWPf`{q*$TP6Nh8x1L>nmf5>Sw&(V)r5qUtclFLrlj<ys`kA+W zXWZ7>7uTMsX)XTv@x#sZj2|yH$Y1Ea&d>L*PU7jwKIu>Ej)-0MSex$My!%I<v90OP zJ)2`>Ir{dg-VAlxw||Rl&tBD=mnST__9P;D`Tf*iyP|KUFKYTMG2bpTJfC-gPW*{g zdbhHTUU@D4RGSt$d7ks}>iw^N7A`$%YPo!Ovq;%8^Z8=$CQoS2oBL!#N&md-4`%Or zC%JCwHtoCHl%A-i$R9e<7(HD+JA1!i^6pdN9QUig$oIEM9Cox^^XS<A;!`(r7Om7v zHEWk$5jd-CNqqFIJLNz4H)SxFPFzt|J?lIF4%5y948>C{+p{d>yXLRV)(pBj^_y{i ziS@k4ul{yvUMlT5cH+X%=}U|>Pu#p<XH%85XLsNZ-CXv^W&1a{ZC~5ZyI;(3o8oVU zw3zU<b;`#!oC=*7BO&=;KJRpnid)s+B!}gjGHWO8dS==aEv=cDJmdB5cXsD$SM70k zO1=BGRsTtk?X?Pr#6_PY{$AX2hf!kR7g6&CEeYFaoe8ome_O_||Ha|y+dfaWtvs>x zBmd+6btW6tHYr7ZV4OE|<H;?Ro?F`sZ*70C@3Z<F@AQ2ps*7EA6jkkU+2qhE&}YDZ z*l_i^7XiFm54~Ty<nxxPNs0M0=KbEVUus+6?8}pHDE-rwUnMYKsGd#D)<&vj_3Nb< z_saYEsZW<zyPof_=f-sM?YwrKYM&z)@>14r%${7R?rT$UyCXIB^2Z$u#Do7#ySy$l zeXZP<)7zeI>3_a6->&RL^68s1{%jZjdfczVe$u6fv(7Is+b(_kduMiPe#w$`SFV*d zSGX)ayo<MY`8zrN+iwj6UKbzlt?(&$Uw`x9`xi~Rf2|dZ<8t@xElx2%e)g{H?X#1u zq9+*6wYqDYy_Dx^!sCis*NNYryG65Wr>{L5zW&h7w=X_zvE5nQv}93wi|2pSpo7m3 z?dX~P^8bFcvyCECdCMZ%7#M8i7#NI6Yp<o1Bq!!1<LGR@jV$!PZ6Wf1zW>K1p6;i; z79P;beO#85yDKzFS8L`rPjy!FLaF(eEN<{k`2FSkyvfs?xJ#7ozTL7}!B^(@^Y8QC z-mk8^d3)u$H@R=$I)pBD;qE=3v|lo`IV^DI;<*}$i!{v-vB&#eK4YMqvS{J5;CI~t zKfdj}_vhoL(v(@+hMhcH;`ZmgmwWSmyHvw<=4#t5*OjYlQ`hH8Jm+6rdUGnrfwLip zLYdu)&P;98SL&;<$z||n`f=!`?3_=U`)1oL_~2$zs=QE9#E|`uuOye6vw>jyyhnG= z2J@|)R9|>sq{%OmFlqWFXfzf}3fWkv@o7iVS3aO6&rNN;1GpvtJ_aiDGW%DRjx z))^Z=R4%Gy_WLcHUhvN3?s~mj&uaTls~ReubTML7_MG5mSaOeHrP#4p7vo~z;+c&e zOi}R~en)!NcHR(WKN^|9s(pN0)tXJSuewWD<^Hdoznrb5(V+YBpO31$d%^-YW`r7D zx^|6QaM3cwin#M{=gcYF(?4(fSEg*2L+`_aZXfC2+;F%sgYVePj^?y4@3w7wUbT1P z;~n?U$-GxKJO2Fpx%Phte!rMgGFR{#Lx}pnd9JI^Z4i6AW4fx{#7n!iE^L_KdxV$& zoc`2GyC~Mwb(zz%<2%1pp3*yUZ6nY5t#@O886|U-&z>?ZUt-IxvtiQZ>a&=FG=-SM zb<S0MR@}mMD&}%sQ<H7B)5E?T^AFE>KWXWQC^Tv9k>0*4dam<IxuqSvnO2Y3=3X!k zjh)atB_t+&<J_a%z1=&?g73%8{+p0Ii*L!p^K&olo;B&ShPnODQ!MEpyH?9MEjt^< zmG2OobYXJwayRq8M`Yw2_O4L1+PG)a2d?X>e{&DMaCs4NUy`rtFaNy{XWsI&-}|uT z^;h<F#!_?U%=^D6#-~g<IJ6<m@n`uCi^inA3Y?!gkL7HA?eRk}rrToKihN1kLkt>j z_tIurrFV)=W|2?syf|~|0d=K{AM<a{*S@WP=*<r2x$DypPuxB0BOm{?m+x4QJJ_pO z%BkCIxcJWBziP#i<vQ=WR!7~PXWf;)q^jyztW1IZvHJ|=`YjdPj4HNexqV-rtGp>R zef!S-qS*JJcRt?x|C!a?#Os=AuXCR4D2e*<@_Cjp->Mlk`3id{o_QzlyPtn;(<Vdq z(x4+@Q9i*o>(4*dJ7pp8dRdI(c|YCPdMSMm79A@)_SLrjw_eoSs2Lt<Y?4yBYLh%= zSFkO6<K`3T)BfGZ(7s)2-u*(JFUc3|Zpm_Q_A>j_opp-Y@n-YP$$R=L4h5!p>^Q$Q zO{@OQ%iJ`v1WO;^ZD(VY1fM@yq#3s~UU#|KYbX7sO_8T^1$`II?Vb|Dd@RH6NE%y` zA4kf!8Pa_VR))0oChzll_`f4L-T1g1SL-R?i|;#4#Qqe<{}Z@X(Y9=-zGmjPzXjYG z|9Er-!kz2|<7_&^9DfEn9?vm0f4}~9(sIe8LAmB~_nxI{6)^Um5iRgK^Y84`8t<K! zr`0X{9E-Ad{5X<l5OHJKoQFr%C*Jtou>8)XBe6FNBBXVabFwE-7tgtE^`QIXEys&( z{0+-R@~2<CU~69ZTP`9w+w|U^qd!iH{o8xum7sa8beN#VtGG3iH*!rA?yF_TKf1g2 zthceZYDLhbU1#}ykBFYztgq>NPiNu28zNhB?<aEg8#e_CuN3Iq5&8Vqhs?zfeuZQu z3be>{3)*ek*ZZ)v({!Rq)wDQc(HChOMV`OT-4++O&7o!K<&8goEs~lpdu^(NA-^y4 zRqgD9b*>th9{w(|*wC3A&*C!UfpLjhtCe=&=Q1Pb$D+-Z+-4hf&n;0)e{$ExB>w1> zv$LLNn>fqw6qDI{`mIvLyvXt|Hx-RH&YYO>{MZX~6-)PJ1^+KT&Ix`jzyA!2ADdRY zoAyBy?J^V9=O=q~W*#}xka$AWzvj-hJ2Ay^Yo>8eoHARG_4YBzZ@nQbu}z{IS*m_j z#71+!oj4);W+kum`sDkmx6fUEvtzzZ`HQc7x9%>yz3$@4wyG-&!tzd9%{%+xhs3Rh zDxI%~{MIgZuiDxd_T^Q5>8{Uq+SOadtEM*JdB5|{>x95V_g;QTIhxVEcS9cgt@UxT z+h+g%v8^t9%Eb?#7wk?EUa-4-|Kqsd%=z2~GCx%>cna1v-~ASN^TYY}=|A^=Vsk7L zY&R&=y`wuxv~ypIg~pjT*2i>>_39KfR|sft)V%v2ZOOX*obaB*><kP%+6)XPq*h-k zsY#{jxau#d?EKqiA9mLt-RdZ~{PUdSyTr10C1oz!!Wgu@;7;CQGmR}SH>ETJ1y-sY z+wgy%b<m_#_o7K|_ip7fJ-V@^V$b*PJ9T&NZN7W6jwjdFa*M<7nmN9|E{84H`en+6 zK923468;TG?Km>`R~vbyoJr=5om!yJ<JA8$;8^tE{ruaVXP&uKV03lE@4Myx`|sVp zdGjq}-Mg9R)t`M{`Ll-Y@lD?geK%ZR9M<qop7$+5<G9V$56K$KVq9#UfA`OM_F#&; zh51VL65A<#%N8~%h{$}XKO|r%*)Xrj!p~CvtPr24R{isN+dABG*o?%CC5lgoe6Q}l zp!9O_o{SlB-<+3TE|`<~&ROiYhXUg@o8FMidfXRWUVM!BC^u)Gj8(Joa{FJIEqf|W zon<>qCDNDZMF}a{?*6)l-DvHb=+<T4Ug<{72H!l_3(VELoR)G*&tl1(pKKdz@}1pf z@AKGtUEcEZv(3B=4pWwy0-M=5&Ab*aP1n8PcW+<4xr{82+xdqKHS6}6_?(dQY-#;r zCi-Kk;c6XE6|G6flY%C@-C^qVadAAbQ{Q%L?UOyfKFo62(|JdFlFWqJi3usf#UYB? znL-7!Te=*2me{`he7h@=w<g<Iuf$3^vEd2pgI&j!537IgeO+c&pwaX5lEz-yYNgMX zdpN$_v*2#MKY!nxe!2cThs&EEPriP1zd3jDap&WbfB)P&_|T8Net%Kie4abz=MGLZ zJ|f7F5~>i~FKun8(X!O8C#L(v%Fh=qOXoiPaCbt=4ih^mIT@=X>dZW?M_DBAopE~n zZ=dKwuEj1B>;uzQJ8&uLdmf%3`(s&D(k{kp(^%e$ZS5#GGg9t}%JN=##lNV;+VR}c zZz4-<PkGzPMQZgN_LJnAeOz)^?y?7yxE=pL4{nMtXe`d`y7;i@RPwCZp$j)ok(Pe; zZ>{ZPt~*gnx7cc~xiWKA+zi2*=R3H=H?U6Y*2~Fxa6T?C@!C3#eZIQyE3-B!bZ>K; z?;U-S<=>y=gAM*{%IOvsC(7N7)w15o$?b~qwf>X&VZp|~es}xArim=k7J3&r<yZ(? zt)ZIjbFHu2j{AIkt91H{nQqx1uH>4Yd9lH4uWqf??TFW^_|q2sd|61Um-=?0Ln}|_ z*F>^~1hn6rJpGh^(>1-kRFC=#Y+K3-i)Waxy}}T<tVB+XM_-rQm%~|!?OcLOC1W$U zn!$0sDZ5(Q4oe=_VPO_iU9;`l3`bX)?S&rywT@rjdhL$$y(K56aa_K?w#udc?V0_* z%P-$<-CBQVqT|)A4lkX*&yrrLbs+!4r)qCup-nrk9eJ@mM$_zJan<+yjqm46oLCX| z;t*fXL~o%PRg1W6GD<wRKQ{hUxS#9RyS9epPD}n(%Nawh4m^8nSI__Bkwv#{SET;! z2DX5x?Z0Pbf1luVqISX74^yVdojtwCUwvEC?Fp}SOfy9iTI7?T_AHzcyCGo1MvY7B zE_tr9lHaE0rJMGB(hH`%#jHZv9JdX>I$u<~u{ev-mvzOOiv^OeUQTL@**>kZ^HcxN zstUsiv+hsM_O4l+=a!eSOgGuu$Wg6p(a%W>8v_cy*nDX?z}nxj{K)gvj3pT})+Js$ z#xh6W^7dI9=_7Oc1H+zwUM=Oet}#EPMsChR<)ur+GH<@R^0PrN#)Ic?^zZ+_k1%%s z@XZc)%6|AWx<=`ur(EI9#5)NOvKM_(@iVH8e;oIz^Vpd#y_a`a#57$yv^nnmeD2Nj z0v<nK;mqQd%=pGo@d7WW;>ya``cBp?uYMn!ET`ewDR#7zL7ClDD6-*RuZ+qenHme* zwf$P58B;kvuS|T(-Ki>Xu=VdkwVj7<7(V>frt?H<%hk-2v4z<We{Naf>CUrKL{#-= zi1!7b>&okG4$TN#eqfTz6ZWwG0owxIe3vj}r{|vvs;IFo3tFS0tljeOs<@D2y<R`F zp6ZE~+0#N#g<fL!_XvKduH*W3cG1z$;O1oCz1`Yks!jI#*$3w4iObcQ*m8vIaesJN zjwR?&nDfECZg*}?e!11DeEIH(N9VX7%x!)2{nnwo$69x<7Jp}|cPD!9huOzk@2`pb zv83?f<g48Kb7OwIebwqOEp8XP_e134L+Rbz`x%nsUoE=zd5Lv-pnY}os@(fGg%_`? zID4Y>rP$xKKV2@aU-eocQcmw?q3o0DvQ^K1*Zj-cwjz~1J^ft4m;0f{-uq9=*HmxX zZ4`5M{_ii{uNU6gS{%c#`d-mKLgl5I%hi&}_cvR7F<521v?9xab%sE)UDJJ*!VeSu zGdJzb_~h|dD)~fwn^Aqt_b(|AcI5S+`{3{QQ93Pg`+=w1?!JslUO)Byrmg>@eRgkn z`+4W$J0|93=eQ&DZYgJ1+tdngF)PgO&o`e@R%rGoAk%)z-<O9U@v+CKMCiX>usd~0 zX4_egX}1IALdCMVZfCs?dF;3Kf&(Ax#CMMS@0&k$(RF!bxBt+rJ(4APDQ6p``#Z!- zK3lzU*u5;PcxB1@GQNq;N8e7?+mU~s?{5FO4MJb++O(3H`1b$e+U3F!=6mPQnhozJ zUA}4@EuE~fGi9Zw-#Kq*XNEso2a{YUUY+UfWf&WIX|}=Bmw&DZb$ia7^}FcOl*=ho z=RN4ryEn6~#g=m~*J7Phul-9bf7YGKy5Tlyljo7Hi+P>5iYqql{+@I3karXBV+}<K znW^D*TI)mgrEZq5d?hJ!@jH4)SEcmwQ6^3XhFRJqPfVnhq!eYArNXX`18s2wVb}!7 zQAksvx{kHIwm`_jZ#E<AEuO<M_Cd*=!AIViz3KMx4mlDk7CO=EG4Jp9yOqCg%h6mp zSEwV|`*`)F?+-ryDXD+_=f$5XZ?aWx#5{HR)97lOFMs2kiBZnuj*UO9QjUl=Dzyb4 zVm_)g{Z^06=?ORQJT(iAVNu^J{v=o7Q0bBPwytseYkxm`^XTg8>#<Dp#eaQP|NFB| z=la_Xyf2x{PuTP^iItw58?nh_qWzBdhV@rfO$tuP^W2}9y{)PIyT0bjJC7&rxRcKE zuU$k!ST9iSbg!`6qx>}O!!Nqlb#nYMjWiPSepYh&M%W?7=7-5FWjjIy<BxS&s_@AO z2naS;h8Ias6*8NDTW7)=?{(_U7fZ}uo&7(jIq%;3PG0Udc0>MmokAx(u1|<7@9f|z z>An%7_A=_ohBGoT5eNF*r`A2X$nK`(CVMu*Df)Eaa&z7OkRMV1Z<=w7KJ41D@%{Sk z5e2J7znPe9tF2nHc(MFW?n%3jY&!P&;oT?SFV6jXa8qAhOS(<M)#DuUH|pLPeA>KP zZ<^uvx%0kz|0}WCo|o4?f1Ud^c80e2_wM17SAI>rBH#D!0p|?PFlM2a^2HiLf;Lum zt@6nQoYzzyWXZ69J88IYzNW$TQyqF=zrVXEc2<Ss()<_kWe5G3rv7zl6S&u;dRXrE zIj%=jS#Ni)d$LYaUa;w4UxTT@viqu*J9V-iITkEm(z=i%VjZjU^lvjP^4q!6|IFtV zJ)|5USC^;0>iN{puxD?TUU7#iRy|$s%s-!*?av)YN%iTP*M0LQ{p_ploOwsUT2|v& zn6{*|=tY4KLh)KY*C)+2l#jW^c9pG&;m6CUhV;t~X;(9|Hi!xbHQ#<&QIvYOZjOK6 z@@sFuUYO<ceDUtg|5ewV#3!xnXF9ZI%|-XgT0(5c#q-;o_9`CvmXT8XwC~eAo72e> z3DG{kr@YhlcljS7IQdY&p>oBkkP|u~iCNOGC0#$dKg-uxwR9TKSAoDS*8&UsE>75J z+g$Nfs6%x3*?z?ZnZ|M4uX67C@7@!dc>T>4hro|5ca$5$&V63a{rNOIo9^}H-#4X| zD?baF!?<R#wA8Er!YUKGr|vPz&UHPkcJ;B$=GPrFlew3_5*D6d^(y$=ih2HfWZ#}G zs5p8he}bixR0uEo62)V=Qm4|_ZQ8PSo`L7{6S?Vs`OXC-Ecu;Nkyms#>d3yJE8onH zW=~i*L3YNO1)_!*((hL;XgvGmvq)4>-)Tk1no}&%M;vE!zHj~TwfsxggrmQ5JI)-a z)(WumW$_W+w7=zJO!Dosp06h+{gyl<ar@QuzX{4w;?A*|QOxtbDv!U(Ke(-ZqNi2L zrM`-ek1u~d604Y9{q)o=x5{eIlj>We9(OoCRGFIZrFDu~gQ->TplVncYYwN-i2&P& zC$6!c6TA1#z-Vu;<!9NQ`$dH~7ka(FxA*d{7M8h<W(zO$)NYGrY@awqLO!Kab=s+E z=k^KT`%=DQ<w{K!9u|?EDLcc~<g9J}xa{)PxqD{j-)}YdsVV!ktoerCGrnWe?T=0r zabL|mG+SGtJRtq0=8TOxIl-GtU9YS@x-I^m%!<8HpPy}zy2iK0JaWa8Z6B67?rXny z>(jT`FVCL)<w@sre2V>YZPIq}Yq#q*zEnDHA#3b#$*xfG?G@Hl?###2C7J~dKKp-| zo%OK#>>gG3-2yTnbIMscG*@K(J?!mWb$-fH?YiPA8)GkZI64WvcpR?0b|%BSosH%f z_*B#z*UeqQdy;$I^h?1Shc2C29(d`S)@rX^?SU7gqqJULbjmMOSSXipPHo$+iAnld z+DmMlre<>|FvwhB@c%t~qvx^-v%_0vZ?4^(p6G2XSt2sAP{N5bNc|<>y<2Lt*f%p> zWnHmUn!PHczr}iW5=TXgtYEUht1HQ?rLPoPC@r#UeCj5g{i5TQTas&rg2UWE@0=4a zcCM^+EKfdgRPLqLm&ofS4mru^rd&<CC$wzB<bOZderwA=l%F(_Wyx}v@A+}tAMt8u zEIKOf(^lcMNbtb-&F6D?c@!P;J~qEwvxe_j;O@;u*{|MC^~pFs+wR@v*mbSzURj^4 zQ#w8&>eV8hHVqyBU28XZx-PuX-ph46b78-zm2L2S-Al?1d<U70H+3z|I>dI(f1B0| zMQi61PmGuM87W>kaa$=grClfa`cXbTJ)`^S7bR=BayD76&9&-K*4eZ`uGQ7wV%=@g zKi4EC$i6eks%l?rQ<)XGZgr%<9KGJtJdrK$R`T3yIGf0SCoNrKiW8fBg3D1k(T^{q zj&S+#O*Q;;yrOqoR!^kRf<HP}*1q_=ZqcWNYDFX8UYp3P)r$OjCfAepDf-B>%&j@F z&+Owg_tYg5-KS*j$xzokW*(xS))le*;ThGbJZBqJ5_p@YZaVe0Ky+!|JCUM4X?tgC zeqft=?ab`c@`-VaHg}$4>Up=n`P{b8Vdiy57oYi;kkY&Uclfo6PtP+l&Z^b-rgez> z1a9*d-nQtjl+LB5?W-<Ixs`n~7VWBiywksPyR>3x-nK6aYgTXHCf046G+RD?QTqAd zAAV*23mS3*{c5Z;U!1*WTa$8KKx2pa^ke&&IQs1h1d{`c8?MflYnXj$<vW`zOe^a9 z3z*7Yf6bg;8Sc=Up0dk6FfVS3`_~PxHZkt2YPiA?Z+YdUq*koh3H20p-RY_awj7+p zoOWE!@>J00Jx!aA<gAR2bBuhp>5A0)MPC9Bx*o{YFirUVtYG8Z*jFsVa}UmD?XEd> zTI$6b*;x*=-BOwUUC~R`i@r7KOzP?HVMkXzohQCe^NMHc?q_=!i)1U#+`lGCx2(>? z(%mP5VW&cxa~I2Q*G0lRUc}Du-CF3rz+sC-!fCCu@7Ytdt@yQOJ*zjpz1iDOoBy&K zpOU@r`M-)^f33>iePphu(_)q7ODq1!>n~krB9^*1+kcuuREW-<omcz<%GDVss&p^P zImWKXrBothW65nZfh%kAyt;{d<}UG+^9?rbP~?`p`CP)~Tr8_~%(pjvGfVE(Elpm& z#$H-BeXm_nQA@azuE;&D?!Q~21&;3K>FxciRPcFj`>x-7xeqUU^Lf7B5&5qvcYe`s z#l<&kRw^>rzKdnsqii;dZ?kmL&nKU*8Z-0sGfM3Lk9IY@{Q`eUMK%ToB}p<`TIo6Y zi7B{RT6-g^^KW?w{Gab{7_?NZXv&h9_aU;i9SzPGCbl<h=`ERb{zmqPxo@{#d(HB? z>i*xfYy3Tij6v(PTW5SdlRwYe`1H$@AFpM;{le0>HOM6TTx?#%qOBHew<d=5nZ+9H z5a{uJ+;H$tZ!_zJZ9WdRJTqS2=*#qI|J{47|JvH)%@G!#TU)-}jNI)x-+uM^_$$xX z8+7wKyq4zgW4-M0!^b4?OuCQ9k4HPWpH=x9)Nt=JsA5-s_Hg&l{w*cD3Y<2`PG|hb z&lA#fTcNv=ljVQ+OryXn#z_zMNgwWU6fs)8v+r3U_hPr(E;*J9Mb7C=I@5Gw`3|8C zDTlbXdqz4J%TE5On0+YY#^rVDQQ5yryH*y+HJ_|~`D5ba^NvM9OJ;WT%|77jm?!A_ zY}zp!rsLZ+b_dLDRlIucP(^~mj6}_&K{rqJY3<jncJf?*b$;e1hbHBNeKF>BT8XPK z^lcHjWvCsr_S>P27lWir{w7&T+%5T?{5R-&wtm6+kCBzLU({ai)nR*|dvl&^U-nip z`S9K1!GDw1WM2Lq?YrNl=uh1`-nQ$%mR@_CoqUJUVjkymuD2EELNng02e~Z!Qz2s# z^P-tibbnyb?|s5=IkdNLIqwu~!Fct-^V!iCdb$2Z%{?xh`J+N?quP%)?wVy;45DII z*Iif?s}q>+Ywp|7q4smm!@#3?iH{eidmrYG(P8OZ&$l7-!ONps$wm4P7Ai+ZTy*=V zzCX73<UV8jvLC%ZUuWot)~lHRidi@HJ!{$e>w3S=wZ411A<`w<;C@OM$KP)m9A7q` zdf{QPVa7`-r-kn_b{+pV`-q-HtJ=k-B^t-hT=6&a^HN{wU$Cs?;}7RaW@g_+oDMH! zFJ|1Vt|GrRI#+0ls9wvgJ9GKnzHguY>*xyW3%eg5WU)8-d;07S`$*02Y5ddHfB*IT z-3veOo40O99y2e$Ub|@iy%)_NH_Z2}+&wq-((Ar0T<iDVKG*bPc1-%|?di88Z^hr9 zt#oeM`*{gFXJ`Dny0>nr@A1R;R30DrxZ+z=V)@okL;cp!g)YXTu3TC{e}a|W?#Tc0 z{C)h|nQ3!#zUOUvFymUn?qfD@reyLO)(3CBdCq)2&m7iiD>@AR2ngSMJt6A<G?AA% z!Di>TZ`x))vE-yKgH7eDC4PrPp8VV$G)ep1`H06m792i2ZN*f%0-c6L_rg`O9%T+v z#&g2TinduFku;L&TBFq<`akxW;s<4a{>70&A)@y09=!2<s(fF+AZ;C!M#0i+>t0-6 zb9PV67lmsJADzovukOD8#dqyzg%kbn&--=lrb)nFlW8-Hw+mm;IH~+m<m9O*J<sM8 zm%BFq^$M>GU%7Rn8H4c~*SW94(^OcleVp>S(fV3c=+i3?td7c-SZuX^ley6O;#TF* z9f5Y|R!6+B3;h-MbK~T`@PtP*x)-lMFV|Sv*mHe$cbApq&AAz+RTo+uI(wrmO@5hH zugUNB+{`w0wawc(5-V@Gsb4*}A!FIPQz<&{jun@_)tqh0v^HNOFzjH`j2@f1C@I#} zUP1GJ=WORV=%jX<>D86pP75ZgAN$P}mw%yZPpHW^5nHtjwJG*iC7G3drO8KkN4M=v zcy|Bf+peOByZSTFFaF7N=zziGgrp_^zg#x{<rTZ+Lw1=`{L^H%NvA$>l)SJ~2=@3K zz4Wq~@pjd6#go@hd89plSToajN^<w!2-Bopm6^$V%U6D_yPp4g!SYv(pIkdGuMqmg zt{K=~<#f4$U%sH}*Eil*D-svS`5Q{Dw-36RwRG>AsWTlo?4KG$hcl|_7S8slKB(el z_TX=O$U)H$tM(;J%>U+_?|)yTbl$_+Ha^vr&pn?%3Hbfs&4+VZ)n!l5o&8W{rD>(< zdxPo7tmbbX2X#zNeEF2Rb$RAn;q@`Cs}`s_%zq*Ep;nvm*V~g-6RdZ1_II|vGQ2!7 zB<Bj>`bLZ7goB6AUw^67x_;BA^gkC)P4BHbuU8ikdi=z`&|(gj!>6^hBiqWqi)AlW z?%Z`)y<J)L)_VK9Y8Q4(i&)kLd)&%;Q6aCgE&J_d;YxvY;a=Sx>=v49j!zRh6z+Uq zG12)(?q9D*sU0U}6}639XPlfd*DF6H`mcZo*MqC3zvt@he01^l*ZB;>Nq5|ms{Wx> zM81u2KKnpx5iQB6h;mbN^NT8R%??CE)*`-(Kj_-H_UTu(%#GXIU1u@nE!uL-s_c=) z^|ZnUE$@&uv7T4FLV~_uzt5w2`%1U!&9Exl2Rl4oO+DFuo+sVyuwwC@?Dewcebr0W zPFrMoXSrSXH1}?^3sG6wTW&T@I^A*UrqL1?A=Q17Gx)D8XKe2eJCby%*EwrvU-ry9 zsf}e{ba%|%Tp+oVpW83)@3-6Q?f2VRR$f*A@O$fzzuiCn@_+mt{_*$xlzn&l$`b8% znaxxUbXaURbCYGS#m^U2+^>GtCb60Q^!R9Pw8*aJd%*JTW~y^_@651R=g#>@dX__v zWy@-AVYfH_S%scg%%``o-kWqr(=#dS`{oS0&527t7?y3jJH!2*&BH5do(atj9A`40 z9KW4*azW)f*X9}DPG(fB>(BqX_~vp+o&UR4H%1(|t5Dd?en?X2<>{5vYY!=<#)<Z> zSB>4&vZJwAjI~5eP26AXnX;;&X|AKr+~^a5%gh!1&wR}Om>g;H<jB(_o;LY2%`fc= z%~;8~#Y{P9`R7BW4nge_$DY3N+CR(ZeJ_98#Y)EWcN(6_C;vb2Noe*YbG~|8|CsZ3 zQG4#%?42X|eDcSqAO60Y&p-2h+V|_fbZuUjJgC3-@_l>q<7T@Z7nXl$neZ*eS}fyj zX6%B!I}bH{-KJ`iv7kA+Htogbmnl^iQQWz@FIjunp5Qf9c(1?ykgtoP;Cn-!#01Cv zeVXjgmDb5OnKxzEE(<)eX!?_jJu$_6eLS^3pB~s<QfPMD-y+zXtnl5a?OdFbr+KHa zu#E68YtID5!lZ-DzHV9_>irT^5``L9E;=juS>r-Q)Q)RRFBR7=XXSm7EOqgT$cMB1 z=}(rN`5GPHD&ARes;6~LZBXrv&?$~4pWdHiTgLsLvvrd3rMq7)Es#FtxaHhti@W80 zWj|j13BRzegU?>rNcH=D+3mI$ZpB`HFXa16?3ePh+4g@~R<<)Y>K|j+(lCSNA@3z_ zy`YB@mnQC4aCh>rO<8yM@|gtApFST7x+ZEYdQ$wusI|!;MTk#xs;|>Cwh6h8F1uRG zbyWSQ+z=4n=~L?SNpiR0bJaw}ULU@R2Y7=-Cf=MevG>d`ivXU9JH<TZ6edKaoq4Q$ z@o&TuP9yIPPWqi6-Fe-cZ{L3S`(x?!mRg=^0*M~$wN+nc+Lt-|3Qw9j?^>nf-Wk_= zS{c3SJ)X?*OZR1Li+S<>-92d|T}RVoJ;NPWcS}4=_FK~``BmU}!H&esm7fw4qAFH> z`y#Pq+O1m_=C-yAL^oXS^9np?F4JEsna_G$#;RdX;x-eRmu(l%vpmw(wO=k_FV#1@ z@A!;$i6Z)1#YaU$Zb{t@v*?}{U2;<3sl(+1*I)4OG@T|Eu~$xds>vmH$#%c2oM_Dz za=q2jC-i6B*}86WpTwOxhusAB=zsN_*^nTm7=KJ`^UGsX=POMw_Q*f*`G-={$-_=1 ze`TaH^;n|KE-zm>J(%maQNOKVyQ^kf^KZp8RS7qisasELUE`Bqrz$-`Xf+$#n`69= z@impI-=Dpd+Z!L@{=&$qy-{p;d}bzltcQD*X7QrAW(z))7xR5p`Ig2w`_MC!5IMb; z{A6y)t@Ee4v>lz)aQzGSi_72Yl;)i3FHZP<U2M(YYl-HfCf6L3RZXrrDVv&HU_P`$ zszAxh_)`AV_<bosQrDTnc`XI>dk$upShgQHbnthe>8aVv)~$5hqSBz4bgedc+LCVJ zgJsW;hupa{n=v!iuQWD6<mZ!RQ=>oMzInAG%-3-FepAUAEE02`{W^6#J*CE6YVNhp zb^ZD(%}p}Ne;<n(ZgZHrmb3W5(i`5L(=@VItyVrz@pyf$$=M&-k2AH!^55ob_wIc) zz0o8m){$RqzcxqK+51PeI94sXRF}7}Gxq=9-HG?#qzbYYzVdmLCO`Xz>!-4{i)1%v zB#8&hiXD*fS>F8nZpq~7IpKdr!gBouxx2JduS={8OFq=ovwHW%oTd67_uby(bGo$5 zq2}efh2Jk<<aFSe#ID8eT)#9cNIrP#VVm1dZx1|*2=cDGw~Fs_&;F>-wTG6aOqc5a z^QGtFcgx;oFXG#ye6!Pn^UckDdDT}hVcuHY@pMb7RqD3M*ZYDD+WuUfrrM}i*V0&Y zXO~8d%q>;3UdQ^+s>@g2T)IuIR5&>9*3yPjyPf;uzxG55MQY7Cvgy#%X>zPvR-fGe zMapEp?WMH^m3!>JyiB=T*&BT2kf)`xrIn6VBAe}*eOtCXD(bwRVLAO%*rZ!476<=V zwk=KivuehZ6DzgFR~oh&O_{qgWL-hBR;os6$d#z`A=64W7(AXGA7lT~bHW2pyLm;k zxAm%PKibn(m1%jM_d~+z9;M>SDNQv;jMMKwW#Kq-rFzQL2M;AQ`0T!VrZCyanIGJ- z`)jbxnnQEbx)RyEZ9Ljn{wdAewqo<a<w<%v+qP-ySgt!;7VP|E!TkU0_GMp7bYAi9 zY~;%&xBefB)SLERhV9`W&i4{ItIA)_75Sxl<TTf#cMNN~rPr>i+^~#)(Y3atyG>^) zzWT_fXWf0omLp<&i}C#@>s0$xb)U6Y#5>M7a?0<B(GmB`ytSTDoAS@8y}UYaN-ld! z#M_jYOINx~j6Qr#f&Z^s^{n)uu-(?P*iODQ-?TRUHq*B3*xpN5|G%FZy5p5h+457t zo?Hu_?7yA8<!0!u)i*8|eDca!tMT*Q?tODZ1C3o*=9S%9@_yMIqYq3Tho`Aeotn0N zSDLcqDTU(6cFSu+o2PsJ-y?P{qp#?%O@D9bLh*oE+p@Gz&)Fy9pJG&dwdz}#<P^Ww zi`M(PrC;Vq=h&G{*>inLXtr|2wR01Um;QR(xUBeoPUx?9k^$Xb`sdZ8vi7<z)t+8* z>G%H0uWuF@nW-)2zEk(=^2dad+4d8rxo@3SW0g_D7h5TrQ0#JNx1Qzyb3WylbN0=; z&3>vU@ovxMWA1Nn9{$`R=6_^$<lAK(&-O?OtWFMFx$)~w8@IE6cGhq%ZJIH=+U9E8 zj$K!aBWtado=u$FayE~B!WmT)CTDH^Rd1>S7i;#PQElDg5}IUFzS>kPcF9_k&!UfR zetGn6mv>HJ!fMXVv#0G`lau`Pt<L(7rAuQ2S6%Bhj&9|dJ9mW%SB+}N(Ytq+9rwC! zJ*PkXh2rWK5$W$StG8bMwEXeS?xN}oSxct8J+S)K{Z$#izV+-;deE)*Fi>d8_NOyi zB{QF?{ay8ADxdX1!-#^ZU!y|yXk6K8Bi8@C^YMeZJA7@=_ij|V&Moo&WaBdbPRYj} z{O3iC>Lb+JR<1J>d0KPzaiY(K*qs}5GzvVUW|aOoajVEs`*n7uJ(IEZ{(bW6-|z(R z?M$2~zF6D#xZio^koc}OLe+;-UAA`psL*`>XwAQXbm5rI^)f2fhm&9Q%tv2B!g7<l z<g7FU!|C~Ctboi<%EEQ};Tzk(<&WL+_Wxc#V_)_Auy41{tt-B}FM9dxQ``1jo2#>P z(wsNnZXNGAG4W`NQmM+*{<mA}s~OL*r)#`QPCdDCwvUjzP`ZIcf*k`7L*3@>J3pO0 zXI`BX?CL1}?Bs*zZwj_ZW=LzXMb)d^sMK=#pQv<0g*U%a??yv<(@(+kMiVzinF-ce z@YK$0_uNzcBV@;1waM)!dnBK}c{~6ApLY*loSnV>H_t!0i}&+izMuc%z5V6;<vAY= z<Znst=ViV&f7wQl?~&$`9VY4aZ5KUU9@idw-0)Z9gJgE6q0R1<QqQ)z-I8yWlx~}t z@Zmov`;keCr(=()*mK)Y@96u<?EUCPBQMMBG^HEm3wtLs>}a)5eyVWhlZlK^vEYVG znF9=h1$vhX&DM*vM~VDWI(Nh_+tgqBZQSDx|5x&Fv8+s}6MCL#!~0lzntI2HeQ$mx z&R1P|bv>`HxpJ+?GMyggIiU^bI-Y+y-Ep658kd|v(yDwZchS2UHj#b(FYWJ(PoC3i zDebrTMIs;j^P)uO)&;pm?ze6x<`fI;SIn3#y}BjrOu`&dn;zq&1ckOlnMd0ii+kM# zH^?lDJF__H(#qUt7n-(t-Z69EK6kEti}Q>^=Vz7A|DHP;Uv;nb`P)B@Y?^oE7iPV2 zzwEH#ecR8A2~utcAHHz@_`34`YqMMFz3a*!{<)F;&wX+DueGIB&*qv(|DAd2tl6Jy z>$dMXeJpkP@5+0Z``4Zi7mr&VJpb*vE0(X#>Sz4lQg`=#%z^Ed=c{|)@o%s`kgOsY z#4&GP*{$bi`{SOky8mX&!grb53vXt8f4x?S=d-nw_y%R3#!DZbEcv+c<~Kd5j&I%( z%zIOGZuB-Nt9)78Ie+aQUdsz+ZL{ZX{`;=<@R`s*hi*hW=f}R>bMKYt))&&r`Dv@R zu8-CY=H71*w%hkmLjLv@zyC<KO*(JUb9G`Bf4kco;o}dk>l{wzm7B-(`<3LJykNPv zj~icq4mt4g&?A-O$>$w*dpld5SP;v`eqG;WxBl$6QjgciJD<M3{-&PU0}qX9tp<OO z7H}+IYwT!tzV57dFV6y|jtx?)KgNEOUCmo|^ZS>dwzc<4qpsLbjjmadk!Zeh{+9)u z*V0|p^A{X!%sRNT_3o2Ze7~btUw(P*#$UVc(D?7W-}Jw!&)!<`{Xs6LZq9|bG272~ zvFS<V{F#+_JHM}NrQ6P*nTu~~MV-&(i#`3!@AotH=6u6|&iA|Xy=xs~dsnS`?KGjb zw%X*j&%zZ^p=OKkJ@LBjSY~`p)Y4-|$+td-60yj0YA0nmY773zc^Y!_y?Xy|>fKKn zT764xo~dVQZSrJ#t>7=BAbp5IMJq=AjoKbjLxt*w{Q@nAWo<JHkFWbKW%{S!Zcnk4 zke0n%6QfGs8~077w{6QVes{NdYUjZbq-EgMzSWGMFX7`6J3Z6JMTuIe2{BO$mg!E8 zQcV(0OrG1$ze||wpD42<Wue{{p9lIqFRbm^IaxwB^S{Xx`K8>l?3R1ydF4WZ4$e2} zO6SV&JZ*W*wOL^gXYtv^QvZy5H-AtQJE&*$qG4~<=dOoL6~CX|n&-0V>)yLHk+19j zH2-~m?$FV=i}Ox@d%x~x)!Wyuzhh6T&l2CbqkZpty~fzf{*!wcmoF>$cC~u>Sv8LL z!ZUmv3{UQmoaL)7JW)?-%d0Oh?rz<xmU5e8`KLwO?&L*homqUcWA?Gsm<GG2dZ+e& z)|l59%OJ*X%CLI&-L-R?&dc1YQlA<+PwtlH?u627snb7v@A^7VG%wrfwvPXNRg<0a zy$)5(YlX||7e_u)G<qgHjpxJ+N7=`A{gbk%Ef4;|dv&t6-Ak_f+JbSmmh%|bFT8Yc z$pfE<9|{jNf8u`LbGx&=OE)C^T>h@fl{3!2bZOkq&glQY+I=y<!;|wq%r^HnwyFJ2 zvzVYC&(ZpSqeJGL4aV~)zkSN+!r?UWNO<!SrC#mid2!d)>nwDg9_9OWgE#-z#7R7P zhf`*~EKU)dQhs&S_w&|wz1Oc))!03`nV)OsVb3F<6DRfUHJH(OF=Kw&xmj=fPbYNT z@MjXZFMhD#$PQM6G=@3X{iXF1S26PJ)W5QE;j&v14SR%cNG-LNW$;t>oh(wf>TRZ+ z`NCJ0Cwz9Bo{fHWxn1wu^G-&ML@hVtH>bEO&Uw0MTRA^H`tpTNr|VATH%qVhdDi&_ z&spIsu<l*DU~I>7x3KO>9#;G(^upe3=6!Vf`lV%8p30S5&)sj;eKmjm#n)j>ua-t{ z`p{h<zAA0ess@`v?TkmOxfpA7bxUU-=?YS;o4<D1%0nThBA@QuJ;?L)hR=nN1z)E% zyHuoqW8HLwjd50Dckbs0%zkeoeH+vCG`V(7-nL_PXkMuCo{i77H!sTxb=|7z<>oy_ zYxPU3Baf1#4o5IwXu0&{;4Oy21uG@gw>SBm%QQ-}I1#?$UwUQcnk8RvKX$nnx_0LC zeDj~{+=KrdPFrB8bkb6Q@7Zn}_LncBq;IixNxqzU;*ZIk2kUnKE6}}j!Y5AVb>G@M z9*l<rTo_}|aok8VDb-rwY4~u$yAKbRguVSx#<47;M)`)rlX51LZwfMeu3T1<XRdn` z?771HLN()-!vE55rz(~2IvB=SEN{%s+t>SZue*}(v3vXLO-w3VxeN{)8t{i4X*Ais zLT*c;(&@=ldc@v{&6u`CF~o0KWs6f2Gq1jv!?RtTa%##ZK_|40XD}X^@hqTj>NVl{ z$1^TTaD4NgbLVJ8C7Ze2oliH!OH{>Ay|%m6d03~8RcP6HWxI|ChK*<4PMUBDB&cP4 zuPc7x^!mYC<#UP*T+wm|t_XZMJ>&W5HFu+T)lITF`gDrV<<gzInEZYDyLUt}`Wjcs z-aF@Hd?#-5PQ5KnSF<;jXWN_&mP=Q;>U=%3Vn18F?44I{Ui|COj5yG>{XO6Pea!Q^ z9vXacPFx>$dF!K4R+FQbdp;)W<zJOQAtkA5!=RwTFW{bVF5{NakAuvA-#InUEY(hO zV7igsGdF&-s6C@NlVGFMhGUPk3L6#NF4<{JKO3_vT=3@I`}>+6nf0zNjPCwa?EdRT z(8<=sBl*{EJ(9WeVp~wtr7huV<(}G?<DXv9b*|pG*<AQ#?u+iP{=a74eBB)2_FK`% z;^TMC9O+qByY%mzDbC)n8b8-7<Hg2FiI;a9$O~qk6ggDqv~Ydhtq)Oi&&97_|AqDU zYRO4?y?Kc|r|wFe{V~yflBTRqysHblxy9W_Ds~;q1GmI?>}D~MUwZOO+LCn%Pj;za zW{y3>bz|+{H9p&uu10q-P3_c``RQ98>*zGyZnDYFquk*o4ilT!GxzqnzxtTRa_N(S zk7KR3nv&STg@w6{f>S!H1Kt>&JYQguzU2S56W<y0?=MN!n6cYt+wse@C6<WhOZhuw zvwvd0=dtSi>djkKln-XGc`|9a`c!ioIBS^)EuOeW#ctx;fN%L_6NI)%@U=wmtTgVt zZYLypB}L_y!OUZA(jV6E_`W!kjrYqVZAb2>sv0v5I#>T#E3xxc<HfhnD}>y#cvq#R zW&~PzRPNg4eluy8?XEM%?9;bqWERhQKIwAiTuJeH^EUc?b@QARUHdRKu1dRU`>~Xe zb&0EFWV7G%hkg#~igMNTE@6AdAH=g_m1j`<N{+?FnSoXkCu5W^PTBoYGw*sz;Dy_t zKW4>wEjyf~ob$?-`@!3@H<fvLO&WwF6!?yPo|c%HtNr<-dA8UqSI>XDBQxejzEFO* z-a|?J*88-DrV9+0@oTL<u=9rg{Nz`8e%xn&WG`H*Bduv*ys_^XPsR3zb<x5sOYY>0 zOS}wax@5oVS4zVPk7K`-93)D=Jq;~9{L-^-`CR$i_dGY(NA90wJgM=KyZZW1f6s+A zx*d|)x$5@jeG!Hy=SJyjKQ!Yg-m;B<nZ@7f=U%TZY<$*`eolXe|AAIvO+Usk+sx^T z;l9cTH5P_Tt4@39mgmpxJ^Qfd>La=5N@9+$QdYfqra|fN-AN~GCTy{FGJ5=YQ|01C zAJ!N|h-TSGE*5Dkei0V=;=uX6``AKO_XJ0Z-nu?ja$cYAPWQKp)1Iy@*dDx4_-NY( zt~@<v54S$nRTHN&y_)8(<?Hm$qgjjj{Fw#ek}DUU)=Iwj$-_P6thutSdJ5kep-B~| zyprWUOAGOAZ=3x#KHy%uWOecXvU5{QA{P|pEzL~NT^Sr8SMK(1-!|5K)y&oIeGS%| zSI*4pGfG%LIZO4xtoTh#mNTM5HrxpEIQOjJ#=aka&MdU8oA#IMf?j0%+>P1Sl6vp| z{g77qOK0I<x6sR{Rc5#)@y;y~yTx|uTF7OqV<m?iw%%(Nv)fbrhpY5M>x%j(DMwxu ztiLVSpE6ZlYR{=BvL`P`=S}?^_$chh5~VC*KdC+I5~uuEKb)&`jI$)Bb#|4?(}k?F zu6=Vc7wvQ3@lwC_mc<nF{+Es_d9Fu})aoT&XgsWOMn2+gb&%q`V@26z!tM%__j~E@ zuzkF7wcIw5<Dr4V3k0@{M2AdVW8iPE6}4iKNAQV2Hu=Y|m&-I2A4}dVKEZm!%9uX0 z*K=aGd+Dve#2*oMecl0M-#wSZ_FgyUjSXOz@8A$!8+CSa-rnCkKYS>S(tH)NW%9<& zyLJ~@dzzWY`I_c@3%Rm}lXImMQ^N$GDQ45{^|}uQE@ddam-#)^eW}G3CVok;J+eMI zF(vlJf;$)dZh0%@^371ZHST|L_HB(5c3v7Q1hQNnZn?K={*06RP0Loum6l)q5%XQj zc75^PeAC;!dsqF-JggC#c=g?kxYdHYSL7G(JEIixW&6?tYo=yy-66u%SG1&JO2=ca zweqg(_(hASZ&lmEJ7q2B+UJQfDFtSl7elSGk`r={9kS7WGq07O>G-RPBd$u?(MzW4 z{OI7Gkb7~hr2n%1t68g#_~?i}x)UThIXC#sl*?vrw>NDvky<&YZjB;;vS@49&h$sK zC-GKz$4oH1K0DZD%c;@;L;u5ykGI=|)XmM0V5;$af5^w?q{nSfJvr;UId|;TFCX&l z%4=n-P&8m;oU{Cr`l%(I7r!r%Jm>bMVQ!<^-}WoBmapFVL|o)!s@xLmuG;pi`GUsD z@A=D~KiJmjbis$Eqlb4&n2#t&&{o;&F*oDZ?rd%J6f$aC`sSk5#BLY2bvF*0Sw*=W zeY#q-l-Wb$ddDo)v&MU$h?Tr8S(8v9@w_RPS#o=dY}K<1a`yT2c%*(wyfgN(Vrde+ ztGpp@_2u-rllPnW{SFnoA#Qx>?58i0PLr!e)13>KJ7@T6@!atFU={k|&A}D#X5I-p zp6HXvyJ2ICA@`3N_d7n#y_B<K)s?#!jX5XlT2xt|o4@MR-VffcsWak3r=C6An-l1E z?CMro5q>+C%nI#GGu4dM8jTh-^Jh+a(k^<8ag}AV)P`LlZH+~f<M!WP5g%sGIMe0B zN57dxs!_MUObMKv`YP1qf=MWE+Qp)dcZ*!VXKdD$nKzA%spjw6tbp9Y=Raa?nLt_0 zWQE#O&Qp^%o;bX5K`ra#xP#}MB&CjD>KFHI-1zp4i&&@~v+pxrrJ1LT{G8Xv9aVU9 zrbThZf=3DqGRj2*Qg?rGcF$;D@137Fq2c(GHAj|LHt{jpRW`9FKKm>(H?`+;kJvAn z46SwLjrQNJU&v)n&Av4^<ePVu>~(Ptz4B?!w;c?X-}-z$&VTh#@8y^|lA3NSql-%) zCd7BF%ebQK*!X3}1O~P*ZN04hiGTex_oaM1b8p$X;Jy##W#^+Tw@5Be*t+eZ)$Vtm z|MpGD_^B)7G{gFV;qnXImM!O=T$?lVOmW}!obVpaU}I_3@<-E}m>mxv7m&A7c;QiC z#`?YD!tH%iIxiY1m^(Gp_@0#i{E6|Y!{H4|a(6$n7k%fdm{(I;ae~{@Y}NNmbC#Pc z#h>l3TpisrH{x)t_|{9?63uvXXKhHim-qPodg;CUz9)ZPQy-YT@<+90>%~V&@m^OV zcyBe&vGKaJL3@+RtV<$M+!E8?NA|8UzqyXFR-DZs`}?ymUuM<*=KJu!?eFP}JR832 zb=>tbiZPibum5ZIB4(X)HL_M~oH`~h;Q3fx{41(ch^uX%=%jhqpX^ge=HK~VedV|4 zr?+Zle9!FfILvx^qq>rS!5(kUV|MSJ%`XWnQ@Gi9=6bM9+35|=PkRCrvZm=ft<zo| zlDPa7lgi9X?@UG1(z_0Rob>$PiWZ*7<`P#XZJyu5di(J6o2!jxrLJsT5LmxDIkGjO z)YRP0n>GF7qZRA??-*7~_9e8rUZ2@hbR_jBYjdU2Vcj#59|e-%1*!D<$V|MnaLH;B zP4ijK3#R&f{J_Pp&~xm@@fhb1Gu>zMuJo#&dH8qYJJGi`cXyj_d&ZbMt14}QZ)9E6 zoQbCeIIb=KJXxyARenlT=9?_d#3-KM9n0s=y0R^TBjjP$!-W=irZ;Z?QawXj>+Zw7 z{w+VFifd;b7T}fXpI5nQ`A$d1&zYeNQcTyl&fQt;x+o<4g~r^&o#ufvOV$<_AAB<3 zdV&_qv<=Vicv`z%&Mym&>{xXtL1liIci^7R;IF*ihdk6y9D6OZKuVSGfyB?|nYDo~ z%pRXJvLm)|`5R4K?=9H!X9D-uNmn_xEeW<M&Nwah_0lJ8hu53fvNs$5xV`lMvt8Z$ zXH3kSw*0(Ml;@3-J=Zo|@O2P3&Redu_JhC@ZLRO$7VNNDu|l6YX--<m|CVh%m20Qm zpLDk;sx)QB^2<4Xb9&{Rx4NgF%$Ctt>`7mim$}Do<BoarKUGW<^kD1YX`g5qv~-qM z_oC>_=8_qy+igy}T3#?-D&K$Cip$wwwR=kGo+)*6WLy6zynbb6ed^>DrAzN`zq5MU zxp3}gzMP%4KT6o7^Cth@kny<IQ28#XN4iB)JnyZl^T!u+PW}$wqr<njeUkk4>i1r) zW`~Wl7VBj{Z%|)v#TjGuaKT9q-`rKsGau|&Wq+LW&QYh`4f|PczZZMdr*ilI{o}F= z!y2D2;<4KPocrD%%l%DeI?mmxznT{EDQ=z1Zpg&yt75@vxJlGrd_BiT(SXV(yGVtv zZii;%-08^JwWt2P-`f-=SH6icm&0{KwKrsD>&;O+;`P`}I6ZaaRjzGL+nqD-#&<-o z6B68FT`P4<v6TI7y^_QF3qcK)hM~Jws4735xoyjgKW=aIJejLBue`qQFPW%nJgag_ z=&hEUm(3HFoGE+ee>o&=(d5e0Da-a5tZoX^n{@BIQuKVjgNIbUXSGQze{(6saPyJO zO%mHf?mURrl>ZjGEo9~f;dtiBOLk6`O7?5p6!dX&g~UCd;F-@I)ZSU^r%%bMd1Zdf z_Q#dm*SPs!Zl3Zov}@L?Ev8Rq2)btNI?-X1K5dPO^NCDn_ohopK_}m&XvF4RI;z*S zEo#|=O6A&`o3n+R)BUcoO3hxp>LlCd_m=}6Rz}9nxpb6konKnQ*+)z*llu=Q7A|y_ zTvC61!L?c3{(Ng$yDoFC@GT8mD7MtH0vdxROCMeMXMSi0)7uTpj2?Zvyz<Lo&Las` z%FT0U?>xDGNm0({8#$>qiwf98au#U5b7RmF|KcWS^;~V`fy;i@3L#uew%xj7vGd=H z*b=MyuLj8>|38NwUiasi>6c)!Acv4XS1b3GZ`ORX<hI^wKiO2+HQko$d&t7sGaV=O zN5~6%n(di<{_nBO=W7%%`^1$>OVpTuHcDq+8*gW`{&sk&h28I7<E}f|+w3nj#;OEd z-MM^Hg&A*#!BGK)qXIv+%&Wg2qZR((*gdOf4!br^ct3CAH@Edq*`F&K?W_3PQ?p2H z$)1xDPiL*wIM&yuKJ|i|8PB^2k)46OCpa~)UyRc~ayE;5)i$N$w|0Hw4%*r)zwp_v zYkR+N8UI>T)xSM6pslTP%E@-GjCOn1W4G45y&KJ?c4zzcR<3k&_O_z8u77*t%tRi} zzI;d{V1w7Br`zuQGW#1OWFFtV^!ddT@u|Do3ZwU`DB5X9=}E5KrLx|}N9^&o#-!@z z-8<EnOjSDcUH^p2o$WTfft?dJchns6wBidp_u<ASbwjy}U({|-37pm6qt@#$durvT ztrMG4`jqyXKeP8<JcTc2>HAkJzg7uqpD24B`IaXy@y#Q*`}5iJgo~853WCG<)as{u zMz0FIEtlsYC~CQ~N1JPVQ_!!>#K{xO*e7c3zASXdNA8os=C-BgNq={VP1<{5cM7Ko zr{a?BLR$<2d=lLSg&hO7Rp~Uc{VufSm=eUZyYTO-oenN{%S?8ZuGGwRO{p%pe^z;J zm~pO|){IRo=H2P5Hanjd@YI}<tNcYMLv5+Cd7Jef_P}FSLi4x(lB(d<4Gmw{R-~Gp z^zqNd&E;jjdIxhiE3^KwwUw$~QpJC9eafZMHLAzb7luyd`TXGbWhHSF^-lTwPI`Zj zn?`EKoi>fmaLc^E;?PY8&hJysZJQ~6L$~pnTHb|Zvo8nsE;cAyx9L^tq`(@{?7J2o zXLf7fl=8pW8oz&Y6W50?mzVozJKfgFJH?-rw8!&m&E);sE8m7Lt2nS>-n=5a_{_GJ z#swEz8v{D;FpJq7sac~Wl@RW={3GMB*SX=VHoAH7?WtPwB{E)Dbny{xVUye&(s!;E zDCgdHUhP(B_5YXgl0!FQUQAoJb>|Y+6<cz}91i5TsRnR<(^%oisHIv_Y_unIpU2^e zq0jf_9iAvP{hE^H+83X8g`5{!+O?%r?RSe(L(M<)nvnlXf~>y&dp(2W;gV%j-g8_k zi21y`^n+xSkmBj(^Uj(cpXh17v43hZZ~DENNe4CiPv1Jl#T5B(h0x2SrLxjX9KZMS zuaK^KJ#EV6P<L(7hD3e;V6K$Y>(%wv|42UMtowb{(!AnFJky`BuJL$kn5KJi|KFGY zSM8oPza>$l?)&-!laDl4e14F*<6~mM1YVwFGpyQFTv}RtPaOS!ci+BkuXh=;<w%t& zEq(p#*T-A`e%<@M_vwU<I~G4%V7;yCPQZrj?WxbXWONm;ADTZ&()-?7F=gXR!cT7n zA9vbQpI(2p>8IGauENC*&r_y<J^RP~&~<BxX*^;_Pkk&YyUnqs-z!qGVu2PzqwUwd zL1H-?4rl#s{s)(YoiYAA`HBX|jg?|gi$se1yX12J`YKF*t@$B8{?5!PqDpzJMVk({ zYzYsx+c(`X_PgJ9e!lES<t`TQOG3L{PF&16+<oKp^9QS>&hHRnectqVZ_k0{e+7BN z5?d1HzOB`?dHLedp_p~SbDnY<l?Mu}t_hReT4OI8DzmcgquNBvwIY@NlX4dK{&Adt zDE!5uO=s29{ZFnGJS?xaW<}fSMGdjsov9Hj0hXtI<|cpd%-q@&*uU@3BfhoEiyQW7 za}_Uq@7kxcwq?1|i{Fh4FDib&e39{*v$yuciIb+uhxl!te^Tg&m{@_^O!m_XFBWz= za)y5Y{BW5I*8!1-zl!Cq2ZUDso^K#|K1FX<#p=cKS^w_qtu5)V(tE(kc=`Xe#c^kx zpVpkx=9(<DePO`N(|=EA>TX+V@G)$z-r;*`f**~KO%<9y@wb?oF$0rYjcw!mIFlpQ zJHAN^ui7QGnWOmLkIY?noOlC&F+7?c9Vejktb(z9Mn6N?Oub`X?UH64QJK0ayPVQx zS|0Qp<Tlg=lsS62Te7{?VBdXTivQQS2{zJxv4spwvf@pN|8$i0ly?+}3bjw-uDEUH zdEDs5O<!5nmMv|6pDp&bYI#twpwmSA&p)(-ImH)#VA{dPz~H4z#;)_CwEUuMy$tYK zdZ2A&APn0|_BJXy|F)S(-TCzj7uc;EpNkze5XlWZ<2y%f?Q5QG+&L0#t<(B+)(Wi* z3NiZsd#-crn(nzjmGoJqm@;G9{*+X#yT9<ypEY|w{(16KGCMmZV_n#~koezm+8MgN zOt}*04i+9r<Vu>UAuYivZJc*o;CRr+JekI~yZ4>ls(&=|fBodQF>c;Z^=;0^?W_1$ z-2d-y>)Gkmi)x=4UjL)L!JchC`)285t%ubfRK#rd|LdRa|CJ%iTiJPbW!;$=dxp0C z%Ii!f>s^-H;LU0f?RG#(^*>wm_nsSy@kW|Ws<WBBlM1Rrw***a=*?Pov`;?!>3QK^ zHNO_-Qw-SwiF;mZif%cu-SNnU<i)Q)Kdi8NbG~l=!fp5TXX>_obA8m!dU+Dd%ccEs z-z0XOeYG>yBz8`TrtmZF_B&ih6^$?S9DmPXJJH&0!<(DWWL|$sJ13m|Yx7UX>AfbO zO^YWhMA$9!y?w?*_wd6&{RezZlC26{{+pLJ-&6NuJ9NKL$kpiUF?Nx1U4!HnHS0f1 z4t{Ild6IOpF4$;_$w@YD0kf*3?sA12Z)&~Oe)nYN`$gS5&TP_4pL}}uN%hyKHu=qa zI7NSfnfK~eS(O#-+t<}u`u{obvig14=IO?-t8AqGjx|p#{rvCohZ?i3>k6dL?U%3H zAr~Ef_~6lkCgYxkQO7vb!d!PntIY7!^a&AiSQy&le&xIFyLn4?Ui;<n+UoBtKb{+{ zBC@_SD;Z}k;!O=oc;kLd_~qi7>qi924Mb)%{C?H^n`N5(+<8_O_VRwquicncBgwnG zXYVPM{PPTMU#=}WwP5dFpBCS^uj_bCWJ>?aw_Q7=;aA1DaqXWM8xBuP@$Nr<`GuH` z&*xPocO`0H-D74wHgm^XVY!f(464miQEQemE%!gly+P@w*ScaYe>T6EZx@TSG#7?C zKjAfwK9h3FXVQU+{WImV&+D9S&03_{QNZuUp7*RIWsOT9!>>{?ac$m`kNd@HyZ+1k zFTHhoYp~;KlPkXU&$)fiCN2>1N}ZH`y~eCQ@5v73$`e~VglYp6Hgx4Q+K0#J-h6#M zcY&c<L}0hfE%A``xi{8X$h+tF>=E~Lt2p8KTHUm6@<AcvNBa!UoM_I{$hG)!(a-9+ zp#=Z^{~JVaYTVh)QWeFuxW^@=m@P0^c*{nfMCK^dciYo)q%ZKvxu)Dz`Ssy~*2%CX zGpDUF5a`i%t!;>2a`KRjp<s9Q`R#j`g(h9Ly>j7!yvpkpf3m0FohF>r9`xqN>5MC@ zpFEy=_cKq7>u<NO%$}!mA6Czut5dxt;)GE}_0QbNqMO(suFMY)T^zis?W|Vtm6<xz zlsX#?%`KN+5xBN$(}~7en?iYi-gOb{+v2xvMzwdC#;dcd45YP1w%*)fl4%rs!Nqv1 z%*2k=kWIp7Q#C)IVOq+ixg<_qI%v_tplfHZ$JuV`a0r>xto)y=G5G3%kQvVpDMvK^ zntHJ0Mr!$`@*6KbCo`94rcDWbv!~>{-!;WYhcctSd|I@tZtmN{sq+_kaP#Y&y(VUL z`^T4wBHcv=`7stM)fZ2l`R{lC&xgN!8Lzo^Fn2}$*n1&L;`r-wg|~fwul{8zp2~A} zN%}e8#<=u!mx5~xrUq`3ZVb}OF9~GLI<eR^Lv7{pOzDlR9fwWNfBSNM!QE>;RgI_f zFBQB{II;am_{t52kM4Ohhp*=Fmpv8S{>ekOtI|3t_1ymZmC~}O>W@rL^xs->tD)?J zMU;Qz%%=ux->x(FN|U}?=EA?QB~?*5Z)5vi<;Qsr))gXhMvQY;9M-Dcdd>W1!Tuwj zymy!U&Iq==*8bP<XS&}hDVZ&Yyvr08AH6Yc>NInKi6-+;|IGNEo4&f>PU7WLo9DmC z=-v6I`Pv~1D_PT-s{1<^yf!>%5+9&{Ub@sGob_wl8aMtIzwW*{b^E^MjXQf<k9rnA zO-r8NDr3yvn|)qm;moRxdwVCf7{<O`;B)`r(zC*iccQn+w>#JgF8q68U$jz7bI>Ej zb*Hb**<x{d-Oja*ARh%^_$F%pQkVN@(b=fSN-wt`*`RiI`WrFRId?6uU-)COI_!%g zhf3|=<2i=g6(o1QNc<aBE9>FCCdKiB%kQgK!#EZ`O=3&Cb9KRsxtIB-+0OcY%SiCI z`r>6dDXk1goT^KbRk_0&x@yj7eQq|<DY>-qN`VHi=4rEKr;jK^NSXKB&Sc@U%zvzv zf0eydLqJTjbIroL9~BI@PQSaZEAd<3!WEMI`&p{ixUE0(<NM1mW%*yV_TIbZ8@<)} zOz5uDYCfH}_3f>zKa?K3r9NkA<Z+WpOFn*d{n)!DT|wr)>gTY1pO2lH{-i+c`laXf zi~-)vEQm8;zbLCdoy^6+;BQ98ikjloqB5MdV|D)R6N3Na=O^(qW}Q~QeLZFt_o8EK zl`eJ`Y|`=AG?{_*h3L*L+m45yT$&R*;r+dtv3jnT7Ri|v?^O~^h*X-sfA04)=U#kS zvG023<1ZaozIt7h5!{?nXtbVv?XvJTv$@7aa)xHHZ9NJL?<5&o_Bf{%wnvA2IH2D6 zUT?N~y+Q6>g&4O#WqKz*&#(Knv-Q3Hli&BB{PzC&k9($Wxzp>5tlLkTbk>M%Jz+6p zqsIjPJ9CY%XA8c%{e<~&b;<#o9p%vn--bUdv3hP;xZ^a(AAU^%F$<R`qQY(m_s>)n zStu9l)jL5_+4IbsFu}9jITvK&jvY1YcRiBcnPBEwBQ4>Qa8OBq-L0h!&zfw17-mm& z+@H;(e(dCz$08}8%RJW{5WnNUqu$%4p=HaJYp2CH7v0%cX)>{J7mv`PT4`OL6ElMq z*PnUWG_fNvT4>rk-JcQa<|qAiK5YB5Sx1cP5Nn~(_1L@(*SBVv?p2AJE4b3pqqbqW z&|14N(OHgbEw$_!k49Zle`CjUp{urS*#lNVWpk@-GIN%^zRaER+0`V^c!Q2fVo6?C zTbq{{i!Rq1-(L<1#^L%L%<r0Aw@<woz&JlVV>{2DSxvSKej*z!cxtTOx|eoLk5FQK zbzz$3cfq@!HQsD{MNI8ZUJhG-r>)VfZq?C30pZzPT}fY<8}<A;k2f4KiY++3=s~IF z&Yw%Vuk|~sbR^pq2Y+DK5%fP6%J4kyg%SUgvu}iQADrZS^O}2t%z__XYj_?`nCs9} z^Res9j*i6F5eu$6x%~WDsTW)$y7TID?%rd@?;HdQJ2L0_s~`Jut0sR|Z+by%^II`J zGpXmnpVxj|XK!*}dhR^KY5c-luh^+PJGvx0PCEHg$PuRN*KPb(c<-|R=fQU|<F|s< z&#j(Y;wM|TEu5qkYgpv2oY`ugFwx9?DI>!UVTrsRDVDog<rWIXTex+TF4PH}{2_Nh zNdJgJ_RgN9MLQlR={>ZqI=}abvR*WU>VmZ;`y)KRM@n3b?titqT{3h1$?pAj|65HO z)7eTacO)L$@N8+L!jt)OTNgdp`pb!f<L#cyre{9?+mOD<K(Y5k^~<c;N5hUdKQXCx zd*;m9{3of)dD$I>AH6CMPla{}v&z+!t|*$_p&v1&ZQ<lUa(DQJCoX(k^vUY?Dz60= z9!f4psuSLn2{I-JJ)GFr=i2pWrccx7H4RE8*V-DZPTsZb2v;cnAfX^}dEqzp31M2w zo9`RzuVcHsukzwdpWcrxcg|Y6_-<fb#dL$~#WC-ggZ;Kri?ihx{QsINv7nQ~M&qH5 z<o^R5GIjha3oW0_)61(05Qv@7vFDAG;M6A@76>knT+%t?r~`MQqeSKzhE)sh6&b$b zS<lui$}vN@%}TwYW}TV6>-C_#%+@@i$MMR=r%TmJHA1gDF-5Of^K4qcr}b?nzE96j zetEQDSGkGSLeD+iQ<*t0-u%$Jr|RZzDTYqXhh1TpZ0x*!x802EH}g`qRb2MLX)=S9 z*Sgqyb>_E%OeXA<Y?|TYV0|Vw@845_b!OWew72Yvi)ZFt^U`4IzmGGYUb<gzZ?`-3 z(3BXhgYR8u3;mtlJE7`u*vZC|o6|2z+}6Ams8-pzYrc~AmV<t5x9o4}wWW%CF?O7? zPuO;_<In#my8Z>zOz(YSN&opwM~L}X@Y=x3VcR@nHB!`eMo;{ZSMYP2@eix5OiScd zr~jyK{Lm}H;aYr4>}OVI$<`^%p`i!j@}j&ytyfjM#<A$}d}SZiFk$ETET8%St-2Dn zf59^zD}Ty$omK0j`|HT{`DZ5?Jehc0{o-7s=ix6Hul0X(nHsXtx5M$+lUZLp#q9(y zHGk)<kvlw9aONcMA0{^?*NWYGH8t8cW9KU`F&)1LyAH};lU;3=zRt<$@}ZWQ0V;Q! zmjAYrT`sY~?dyYd!QKrs^|W<cAE@Zvo3DCjtEWzN#|G|ef{}jZl{!gt*D&Tv8lAb` zC6@V7c<UzilAf8VhZdc`G(V-jJEFMjCf7rsJnijF{TDvieZApjy?iITIOF!O%{MmX zh|BwA_XgiQ8<O<<(}Y=N%I=#F)oysU;*9I=z<@&?ZWg;IOga#Do0(zJ>zfK)slm}< zYyAY4G6d{d7QCb9*Ud>^s?~oU+n7~(n9t{H;pL(rXBWX(A^pzO&EGe#SsnFhZcX6l zg*+<RLdQQV6uuQvNJ_BSSJh<Qx~lj1zea@;$DQ3@V;9PV3G4QDC^wdbwaP3JwTKG1 zR_B(oPICWA*N4oH3=R3;Ow~-Zd*c&w?9#~<HxF2@t~=&3akj=;6&szCb2EOOo%1DH zI>_sw%*j`UGnw|iJ<+p1spOc&oz_MBz3-il*sFhQa^~vrysryHm5nWq-D;5GmYMwU z!SP8Kt(m-|A3WjeTldDkQ|icrM<Sl*FK^mBXU^+K65>f`dBqBkr(d$Hc_lah>GJ&f zO)kkE;o*l<WK>^zl@?U~e0|kJ+_oqp?cia7f3645S{FnWTNFRsG1KWJW1gGmIcG-Y zB)z@<>B67NSv9-PI<2UfkzaW7EW3^D@y_K1Idei-6ctufH23fJF<4+B=6T{RlVi~a z4b4+ca%o)F()P3DAC@w>r^?K|bK?BbjSJ4z6)($+SQPS4u_4QXVXg48l`UTLSKs%t z&~#}vNI!5+cIM&v9>Q69Y}1p|im$y{G*#qM+CG!(XZrNiFMF2Xk!RGLet4zjn;40= zr>?f<Iepz!-t52ld)oT@bHmn4&h0<Toow~4+?=8I1^@Z>%Vn0V+1H|;tSH$yCBb?@ zTeL@CUDN&>0evlVyOW$%!{nxZ<qc~$T6<-6;`3dX<xB4IDWu3g>pOb(@pIou8<B4( zUwz!dylLOm&?{B@k~hVRXJ2oe?&g)G^Rqy0cCz)|pNX@xtEX$*OHKC+bW>fqf9k?3 zp^?j%az%dDsQ)qNndqxIHg9)-pBd7<@=n3wDt_+eTP7T=3tCxnbM5kwE3dD){hG}G zA^VoY$3wRs&)B())g&nPzO1x^zg_-y7KWVFeXbjQKN=jLn<D5Yd-e8DyFD(I!B78% z_Ewy2TJ-Q@G3!mGQ<D|X7A}9cpXtY*`|J1_ukk<GD#;wWcFXoa-T-md-zx-K;ua{# zFPUmk@6q~`|7R{Y>+HDo+PRC@GVZepWpiK2{_gon$pia(kN>Ydb8GU&_lnP}Pn=}F z;(E|rrbte<;M=^nr*_F`N5&pocJV}dd8Fw!E5^ry>aT^LDTkkDC^igxrlfr`ZRWa5 zoSCHw6QZV^KTvO@v360=QLaxP!Y!&7uTHyo@z&J0M!(9gd@*mz-nF~+V!=w6^Ey?% zAzP>JeLHvd`_o<jb_*M}+04)SZgDkY`NyO*YxU2YOA}TLC-M~=-&mVn>>cv3)?~eP zbKQDl)3Ao<5AVdUtZn#xRf7Nb;d0kH^TU7H!nH0u(X2Ev_~ICOD9`Ql9<DW~CmPPF zlagdDGf!q+G%L`i^!>^!7dlrR2;1BI&NY1t_x!}1N|QT%?9cysyS^~9d1rmF%qA!M zO^f)EL+dXceNtmltFZTM#m2|sGe4Bnq<Wl{I$SPstZacF$Fuuk2Q^jSBp-6h324jO zJLSgRo^tkGD^k8c{&~Y7Ztt1QB<*{9Kfg*{YGm}$G2<lDRkOPMyGwflcx8<*FPZu` zruysUr+4^whuX929SZvMCmyxoYtGp6R7rq=AuNiF4Tr@gMX8CoIGVm!W3r2Hn~D8> z7vJcYCUt6R?CG+-Z<n3zNxIx;wrR@56`7mv_BnY^ILhm~s>b4C+UNV?;`~A?j6z?M zx1XM=rpYODr}`c9bb$l!zstY>RrmgP?Ux8~_h{8Zp~Ujy9d$fg+;<sm(VWV=_HM$< z>VvwQ9_hwaXy-pvi<2nf`(M6kZu{-nCwJEgU-|uV`R3-wix<a<PqgoUIe+<=^YSm| zr@u(M-ct7PUZwYwC4mi#^=7r0TX<bqKX3oBf6KZ%zP$+NIe$SQ|HS6#-ben6R&M^5 zwB=Jx&x!ld(>cV}1#CL@!syVAo4JO!+#cG0R7z~hyCciRT;HB&;FY}Rjo3xAhm&sb z=Q%%K>b~dvZcpJoE}0utxR?r>7W=M|UfS@inp@_`j_$VR;%bwv{Bz6s9zMIur+Y}@ zW0S}nHBQF~deT+bT@zJ$wHK?-T(;Z5HEsioz4D_qcU$g7?k<-QY>x>#_~S+hzi58Q ze2d28U-lnm$`^j3nlbg)zjJ3wFHXMk#nAZDy?e&_t|qYyfBv~N(@J=Ey=}ei{P(uX z-}f*~&v*Wv@Nl_zPhFhqar2eW_4%*sf8IU)T+Oe#S2vbaK75w&<i_N{dJFmezh>9I z^Evr=uWix)skNpOXX9`G<*s&mr{HoUs`cWrrFE~^UL0?hR<JEHuaL{TIQRAPAM0Jc zGL~<%x#Y*t`>*KR;g=^1-=Ekbyw~nB_wlt>TSfKTX7m;^8D4Of>()5MQ2XF6TSaBW zyOwP0pK+6Z{9u^;qM-Tk8sUqq^LD9xFq3}te(OKpI^{pjGd>hu+Q04j<L#eczCO5g z@>Z*`?UFIQZ@4cmTb^SqV{z`ny5pAe@$ui?#l?R0SaBST*N@j~c`2f@_uc-Do5iMG z*m~OYWsn=^9s6%ZvAR>XI@|wWBgOc4wn-w#g+=b~4OC2hzjeH-U-InuOMi}b+qC~I zpSE^0{poaVSP*~p^VMp03+rXJnX_KY-gzUG_<Pp8%h!`7KC8U1%(+o)As0Jw`SQy1 z!H4HPKJ9HJ_e=48Wzr4dFLRVirhP9F{KB&Qzw*(8Ou_7`W<DqOFt6lgf5{feGt2eZ zZOh6Ztx}a!&qQV&ylL`*+v=6rd_&_6>7n|oBG!8|To8O!^1aI-#8z1%V4}|+rezvu zlHR)M23Cb8UaF9FJ2~gfr(UbZ@)FZS923Me_HuDeKWaX0>GJ7E&8IJ2u6B&SIa+z@ zfuE*(QY4-!a7Af!bvp65ob+l-<Xfbq8nf1~$D?t_wF#3FXEbYgEYwh2Vj!TZDcNS( z(Ihgh#7DVs75Bpad)I8VeOPrBPKR4A->b32CP;pHKu$WZp6wg`&wJRXiu=2pJlv;o zzjtr_Q}guT4qX?mO`@7QaZ`>hyP)s#u}qGwrXXmK=<NjtsiCss`n?9CGemDJDQP!j z%$#>!m2YLNSFd^IoCCKxr&z=th%@rI_|hls`MI2=$>uX$MJBN=={iz*(CMPsI{*95 zmGZ}Q&fW}b|7yJQ_509ER~Me#eCL2%+yteU@3*yvJq>D^y_|WQqRFI7M<$uxe=k$Y z7q{+Is(YKo{tfMZ|L^VCFZ*|0i<+X*R#{V>;yHasZPjBUS))rc)k9~xEL^+h&HJL~ z8hsy@Hb(8#owQ-r?P<CP+1_8<ezxPmqOe<aYsD6S`x^bcHZuCfZ`VoFpY^Winl|J0 zrHG}EYc;RxY|*a$we{A_=?jHs7a4{aYx#(rxns%5x_D}uW7boxGizEFw|c%Ve36sa zq}(Ms*G5%guMMw*LAu1p!|E<`ZB%9U+I+Pz$d%}1{ydZI@t@NAq!!23!EB4l=KM4e zUv{tXPt@^=1yVBZ-Og`wo0PRqM;$-eI7`Nzn}yB%QTuiM(!S&){*3O97iK$t>k2<5 z5b5zrXW_fk@jBkMpFga8d**(+_uQG2vx<e+PORX1H%a`viN`G;sil&O174PX<$Y<f z_Sw`|F$?Ewc+K%y>$9F|^^(3fT%H=1Tf8dwEIo95ZKcL71&<H9eFFdHxV&Sk6HW+? z=;7nbnE36XTI||_FEV25Iwx^vdY|6^@5A+fzcoV|m&6HXY_a;oz?t#ia*fbq`=EZ2 z?K1*WKQ0w`^O*PN{~gbkx4T~tF;l&fpQo6l(XSgFd5!5+YGCF2@-?~3KhJ(zTBq;! zE#b+Z6|XD!q{OYJRed}6!$|T=bF||n>(>$UPtHB0V7yZ|+v@b~X-_RJ*DaVQlO3>m zo26F%?UkR586+KogLZGQ+bI<)WWC`<+ELY?8M9|{d1%~Z%V7AVt<rS+tx6ChXVa?& zt$i0<f-WXrQMzd6t0Kv4Ix$5rkl8b80h4!r?(g0eyxVJ{^fFZ~R5qXN-;fb~=IXE2 zZ&qwL7GNeMTNfs^|4p^AC&LvtrjW*j*D_j)5i@lI6)tP^xT#p!<tjT_nj~~Sd85d1 zJmp`GtCQpdmTOj5Mb31|OkvI|ix&!DU1Z7|+HuV#L@{ecg1+e4dmjvvzsY5tc`TJI z7P`XlnX~T2DDJI>rd3b!d3j&1yl!V55_DyvneCZXMK3OesCh_xu3G7(@BJ<5`h)rE zZ<#}%Cg%Qq{4j6b0gEh;XwlOv=KQs5(U`l{RJC8olxvDq)TZmV+4O(bZzymTpWFI> z$+n56Qa9hr><c;)cYD**MVI(r<veC;GT(a6F8kNra@8sgiRfKgjiC=N9gvuCJz3P{ zZ>ZSZ_36be@9P*3Pg&*r?+t_O<xe4s$JXqX={<Gb%gk7;*LU5srm067OBXf?sNZ$E z<E1nw<7TF|v$A<<&{?0ONv2O88y3$x9nfIsuska5)~O5gBt2Kn^wTMgxM=ci%0yNE z3lcH8OEXhWDeU86JyY~=vTJ1EgkKK3^#i~6nL0n*bnE#^rF9w}wHItHy`S#5%<=ts z{N=58k4nYfJSX$by=(r}MD~0hX{J4AuYDJbYqHx=`}+LFxzd&Idi(jOX7sDwHqH;d zQ^>9q_x-$ja<{HbcYMr>vllm~zggEhV-CB%c&12u;7Lb@mN1)3{K-NFHd=ZG2c4s? zuCTsv-$qOJ#*@2&r3w2tgjAh*qIXoz*jL<&ch%BG)n8X7pRn~xUQvDFr;9Di->ECD zTJ9`1Y1!3&dB4?F9>pq+o2><}SKL(XFJbu{r`0rduS-Jt6_yq5ldLsOlIDJ!muP=X z>VMqQgNw8)En`$95BBoe2>ZpItml2_`>%iQhZ*q?pUnC9q55Q9U&hlfSrWShSNdv* zB)r%s+;w=H-qub5-U~j>A;K1{OAPNaIWKHe`MsS>L-vACZ-{UPtICU5^$B)=t{6xa zW;Jb+Tkg6dtk-PI?6>QA5_G4WW6nCXYmt2WD#bev_M94vWy-#+=j!o&^Uu|kwIuP_ z+0PCe9U9&DYZy6;*LE-FShhbe^J&A~e{Jt#w=B-E`xmiEdTP_&6Q`M{KRJDMc0zfi z2UE-gF16^)jQ*4V79M-D{-jWbZkp!l7Xj&_5zbd4b#<x>P1P1mso!!aEWtN0y>!Ey z*h>*NoYF3JMKPKl*5O$7jWMc@`$1av$(_sYai=6C->I@c5hre>B$YW~Q-JQyXC_mE zgWU4V4)8eT+w78wIeR>R?!gKZ`QGQ^-%{(%MBI=4;7ii~Aawp~;_XG+T9ZXRjS8+Y zm%ZQhB!2r!{|Ap_=RD}maK108kojf#wxgc~*WQ?@^17m%*|RL6d%4BYCXL%kj^$Gn zsx}q8R?EJzpvOx8Tg55X&e@^D?m-E{Mv}S*|Ah2EWxZ|kG9}CHVcYxJY>v<WzA&5i z&0adw;?VpTn-`V~@0?gub~U|RWL8?W=cd5ULwY~GFK#;^yZ>8kpyNJ)^dCw(GuLbU zh<%~!?R41iVpHT7x1CF(eQ!MZY<V#7!LOeieD^(OWtZN=$*JpYUO4+Hlij*Z_SK7a z#2pb@S(480WS-aab?xSzF$*sH?sZz<Dt~N}*EJ)R_m>@KEKpV3en|GN?os))f0r_^ zy_YEvJ#u;CPeqp=`$hh7o4z&qG&pbJP43UT@hQn^-FvlrvTefcZ`OqD$P%3rY}B&z zE32<d%N&KOo~F4cCOk2bnfJw1K2Cy@PjPp_EuG1Vhg!Ze=w8xj@=cFv=~>yOv!`UT zYo+uttL!Jw@6MQ|6W$>f=WwDtajvRWL9Knu;`8478m>H@bWwE1n;9CaO;7YcC|zn^ ztas>2{Gnr35-b0iv<PlDFrQI;TG{nPY<~Sd?oAV=#QOs73H|5E%2_yh?|ccb_%h$z z*=e$`xA=IxQkphxis~!J4~H4u3b(a&{BWvBo^VK={efV%-Wz|Zpa1xFmalt$_*eAW zm7(FShh`p{KR4t0A?7ojs}fJ}CCpxNn*WT@Ui%Ad=QHh&bx%oK<+V&<o!v@Kp@bQX zn;04wJaqhITO*~=_tG=RVjW9+PX_}xlk+0O_){Y6Q#Wnj@pE_i`xo7k6)9)d%yN<2 zC+vJtlgmhd&g@f`=buEa`S>U~=Z_}S)W33>ouLVP`GdDPmcRQo|4yvU@*Iz>+w=Ff z%;QjAze7>w{F}o(5@+0k!rG>uzklK1Z2R^;U(IGK`QQsTo(9e}Pj-sv?0Obyo4zwo zZ{y8%uZ64%mml=fQ$NAtzid}Od%(T}<@Oh(cBiaT4L)<cC;mr?gW1ainfq+wDkgRP zSZ@Bp=Bet`z!Z(Jg`JEy(`_qeOxTpMSv8ZJ@BdDfvsETHI8_`R_sH0-yUKb+=h*5i z?Tv?WALVA$dLEX`JNc=o_Qc;4ypPs$Pi6QWb3)kTs`|#G-_K2+sCmDz%<dEOln1Au zn=~G1msJq343wO0ImPDn&lwqq7H@GatIT1QPVUXTXLoDW$7>g+o%3+ns9T)2^2vgb zgFOe&9+-Pi$#t_^Q1hZa360mfUbddKn>t}{de@TGr?jWv46@TY7hSM@r$=ev`<}X8 zPmk?>I$yf+!Sd&}JniDA*Dn3|GFO<f&tG1nVbOw<*Y5kWSXkBxF+RxSW)`vg`Duok z#4TNqiU}fBa$k&I?1}rGwc^7!&UlMF!B(Znx7}MmZcAJ^)jzc>XXystc^M)bH4C;V zX}vKyDb{&A%;l?*+0n3QNmIwK0mj#N{{5@7_REi1mItSttoDp@PV=_>n&dZQ#!sUR zN40;~rrL{sJuh^;`^0WVPu1VIuJZ-;O1pmOwce$mTR%tXP`5$UwS9h)>!kvYJo4(R zkz6n1_35p0SwzU@4GiK_gt|UyFK=7snz?X({f)P8D`x$*;hz47J3ceh>q)rinJe4w zNBk7>zH7Gf6NlNtA|pxvC-I^;7AY+EY76E6m-gY>q-#&)tSn-MM4G)foI3b0T~IqZ z=d|DRd)X=5VwBv%zOUVX<h#u`YbT}8`<%+w&icG>^6ed~uigv^j)+_R>ejm&Prb8y zciFe-r5uv5{iw^g^mweuy$k$_*LJMXtX4Y9!KSS|#q4z#f4#*wmtR>OCznoNaW&ME zw?1+Itk|>cizmhg_{F&io+_-odcS+)eO{T>t9(3j?q>Wf>O7G@%W;n9|2g#qOHYTJ z{X5O0_3_oz$@eFv8tpc%SQaj3^LuW-u9t^<_To<4EiaGU?6U~g7P~)7)br`RtgI<1 z@&;So#cw|M{v6-ZJ>NHV|Gz_%Zogpq_g5ZuBtp30+9N(z28K9cGFGUR6eT97;uwfH zI^8?}wuL~$`=6qF*2Y?t38#FYXH^)u;H+40!;@)2BB_Rgu8m9Ptk_@I&VO=}>$125 z-J${JvliN&oqgri;g{>K-h9Pub@gfH&TB%#yL9}VtS?@@EVQ9FG&<ygmiAeB<Ivzk zMQ$6?7C9}_y8ZLh{|&jiufjIvF1+~kc>i?n&(*2*|F`U~U%2J3_!j9s$&y}Dk%2oM z>|MN;y78~k$v7#_F~^<%%8Lu(ryRHU?)WpmVwQ-{!Z}k#4*oY~JM7X|;&{<5Xx0`} z*R3Mwr(~pS9AE3p?WLI|a#k!^N?dZu`Hr)XdNg$-Z)MC{xa`ycN9JoGMWWTGJHm{d zv|Yttyq^B`?cKj`jVgT<%;rbAxGaslI%C$wLlT<`*5`?PoH$tBZgRK!Ru|hwE#p+S zXCe{No{i-qo?XV-GwQd0RTeRS-G9j~_rIW1cJB<g%HU~l-*<hRP`2pwB|poF=gtW* z{WhAlxohUUl1^h|)~O}#-W?h&d(J;vYIx8#xoL(m$HeH43g-GppG3Ex5;^bBU3n<< zcY9^pWE)lcb=SB1n{S^j>9WPO_`IiKN+U;HcUM@HueflGkV!dX!`ElqG&dTT6`U=~ z4e>TAZ<KPjc<Qu`k6EDpbYbiEfNjnl9`i$4m_pqR-z)wzV=2^Xp6M{-#hi@-+k^sE zUohU;`BUPOmha&SLRJX^!qu<eJP<gdcw~jryBSmX6}B-IoUGgV(56KqlqKnqX~T`2 zCZ4Fj2G;Lc!b}p<U3J+N?!H~<&c?LrRFK+)+?&^0%~=)Rl}U*-M1-<iF7V)Soc`NM zaH>M9$eb$P->Jd8BIWWv{g0epENV}XNP8|2x#o<+=ll=LJYG!SU_Ymy>*?+733DYl zp6jh+>@aEeUa7ZflGa5J28Zzd3d@`SZF?sXC@-?Rs+ZGbXV#_S@UDgTOtgQ^n0%PM zZ7=64)kuX^CyVygAOHJI&v9moHOI;7V27u_y<W=|mp<zg-^ZAq7rW%#7B!jcwk;wN zvwkZcaJsWg;|XioXSt-jU(V+wl0pJKG!xWcDO@n?IZ(N>Fgfh;mL;bg&+O7@dA+^% zi)Cx<#1+M!i8hC(-3d%9o2x&OVTssX1I82ItG~~=xxu$o;`$!zwAd>`Q#aWzDL>-% z`|<on2~U1Y>GgJtc(#1&e)jGni<V^7ZSMAi<%<%kvt}^Fevv)G%dISvUU1vpo?+wL zh-&XkVZlm9uV!tTw&nH5yx1d?0z=h3?XBH+pYqvnZmVd_{w^irv8al`GVb?#XZ<WS zEZ>%ItyAqWee(JK6CJx>&HGvU*fB9YPG;)<ZoPWp*7GM_;vD`kJvxyke!f$}Z{G&P z()7Of0Vlt^7+G9AD7lxd_(91{hl~H$i00j6QWx8Bd+B$9SndDEG-u8<epA+<m!rz^ zV!@;-EH_y7wm(u@w&P9wYyNb1m4+vkD$ENwmotbMRvO$=kZ->oRc>mkFYs*jUjNtn z=I)k9jOKh^DX7!^^W>(E`8wSv57%wVdGnmPrlceMsoN#%xP6<nwwu1qPTOl)q4FTj zH>r}j_wTBg1@rUz4lIr2VV^Z=Y4u|>`?}Zub5Ga(y>GfUXJ2{2gOhgxKiN9B-22I9 zX~JUiK|$t#lT`INo)g<YXbMj`{7iJp;Y3xH`Y@~e*VoIp&6f|qe*NUec?ak8RIttJ zNMCSLb6%hI=}Cq^qdn%WGCEOjc0ZGGr}Y(|r;GfS>oOKu{NLB|WW(Dlij|%l)(U;L zt*I_ge)N?ewa}ffHc$E&8w0}uX)+4kvc#Os6dZ-_)d<jKG$McJ#XBlUJSxeXB>LB2 z%WVepZNkivF&6K*B^F!~O5HfsrE$rmjKlwapHo$h_DeCzy}L*_;l{ERhkrlX*=|+0 zW%uif_df)0UkzP+^xLfEMpj;BP1_b{x0+pZI<wlzAYEm9(9<(hTo-OhwGHkFIA&CG zxZVB!^=-kSAyIn5r{~R?W0TtbYW0P-KT&Quaj#-t*v($q+R&VzGONSnwedXnH@yq0 z-#Df0*na2H8}pAP^E?hG&E#r(-*nhO)OdDBX%W|2yN(N0&c<<uQ<sZIbA(9=el@>n zB&wKh;xkz}bIr8wOI;mPD_Ph%Z*a|>nY%h?!BQiUor1MxhL*CialL)d@}GB{?e1#T z+HRzux-TVcqGIj-lB?-n+ppy=zBzUIRIQn3lvnA_m|XDMO{h+HhL}xJ+tqAq`(2No z{V|-Dx7%N$>yS}qWX!V6t$Sm3Z{D!@^uo83CVu<&EtSVVS&ZfJ&({Z!rbx_TKX}is zEk*BLPg0TGvQ(8D`5S9DX{2&J`<ZNOHIIGy<<lRZ=<Jxquh-su(_qJpJu`UI-ZvFT z^gA3m5tqZP{HA?PLF3W=Ay2)3y?(=Zto!24Cq@?Xylsmm-Ci8LTlvS{;rB12pZhY_ z-)xB8z$yKxy6?T_?mvk+zl*lqefFi@rMTe1Q5&Yrru53)fvZ~|XK!D@+AQqZQ0Co} z*uU?a@YH#o1_{@-jykV&;JWpFUj5{|zprMln;g6Ntnk8%Y$l~#Cfe6y95S}ac8A1t zUor6S5?ri4uXOR-Yi3+(8{a3`akVY}_~7c%Ikwf`UOwM`(=1_{{-s^&Vs|7GYi{p( zt<7C|&x7I1nUF^tPn}+38g=>hMIQBOx~w96?)fP*AME^?{lI>T1J6G5egE}ZPDIY= z_@LYnSd_iRDfywyrzKnZL;qAPywDiC+w8BDcedZD1!oxDesWE{=C^}GTCR4v&KdRe z=kb%8Wz!C7PBV>K(sGi2&19dLX99M7ZHyhtTFE6bg{L<wwYELtu)Qv+e@iUq#<JGd z9#icpsZpYx;=vm}xhc)x`6*2Kori=$$W9**$%$KMXY{@`zoeF}$)UV)a>dLjq0*+W zd*q@s)@ko=nYdy5E@|_8=|AaC**jRzH9pznd4ePMYLsE<)&s@U?pue~%;qYTZdmU2 z^U}I*c_+(Wfh{g=oTt5#HRWXX2Wd~_n{>ke*PE4-x9tCBUhE}VD$N%1<n)|Xi$#`& zzUAMVJAK}^?}ttw%qg&(%VS?}y(V||rO3l8ou=rYN($7QenLgYCf9Y+^{-N^O+w9& zJ>AZo``E{`<m>5^C;bmp=>|k@+)=ptN~+J!h#&jhuf8dNz&7iCv(5Uv1J)L~CZ_LJ zOFd^uujn`|_ttu~NR*3~J=gowvA11RE()DB{PxmR?%=~m2irUN{L2e-x0Fqs9=W?( zxk3C%eS_uyHy6LGOZ#GN{qp|qmlmJ?6$I-o;r#bDVr3vVFR#+Jxcn&(e(6aT`M0m} zaqa1ytf{Z1{i;BBhv0eX>l?ZHm2`XTSL||f;4_}68N2oH<=&~Md~Q9@Uh|!$?m!(| z;a}a5JH-v{x<{m5@4H+&b?b(Arj6&eSgx74_~5mt6&qWhR$ltNtfTLS=iS-9osV^D z(&JbzRWD&s-;fY^EPDh0Qu$6+1;%GHY|7rYoI8}VU~-?!p5Darpx2k2Ds#_GeqA-= zT-BRtvPRclZ+$Mm>!Ncwm&oUXS68rCcKVg<czz~E)Lo%Cvs${_blPsqeGKnoZ+ks9 zUbg#9{>=TRhu?gtjJ@alG)m*pON-|mdmkUz&>AN1`fk?l#mgsLZt<GBYpeW$(1p*` zA_W_J?ylyIedgkK%JlfMQeke}9f50-dgX;TT;H3K+`0SUx6^C>>{6QOe&)^UbEWpT zm}=fKXj)#XpU~R2cm4Ul>`%h(-j?2PFzH0<ryUa=Gqp@=DpOb7xcB=y`|;J!Ek!#L zC09t@2@o@i`nmNMOKGy2s#D6`oIO*n2+Y+u|F&n3_oKT#<>k57v#lTRUHb0bg~snc z3tU$&*L(C@wI!bMA778Aap3nzuG7`#PZ^xJ5|7V{vMS3_nxJvXWR9rUGnM@lG^@09 z6oZOxuL`ZNd(-jaUD8d3y+&W^0!5+(S10EFF}$*J_C3FYGtV|n-+Zy+(>Cps)>~J) zmQD6{FSivtuq5K%x5$9yZCmr$Wxrbo>{_;Qf7I6tp-%fUX0hM=_pgfe{ifS76Q^I? zvvA=q<x3N<D|PR<|1#WQzF+g|&o6WKCA#1K*n8po%_Eb84a&JoZf!_2s4uE%ki7iy zN7k2{W<Ium)O#F`pWb0x_Ubp|vYzFe?b+|E$*kTyV@GX+V!HVIxOwaW&*x{Jl3d#) z=dij)%cSp-yp*KL--F`ETkmoA>$R`me&{!o`=uE<w<}!V-d9W(DSr9A9<_pvo33SY zn2CYmDmMeEm&<2D@36;F!|t6Hn}5qdr0xAr(eztKw`nzB@|~>ZJK4!2dfSu*3BL-D z&bgs@Pe|I5FY4dlH&c`{9`pI$)JZ&`)_?!{bD7x(J<D@1NY8Ny&-G4@2|QVN@BFR> zrB}+foD7pq5fRo>OtsW~n7eZsr*~wNsIUyn`Pb!t|F1bK{5on==(2>0x_>YK-hBD; z0^{BJrhnU){pTpGmC5Zf?_pS_viwq`$B_`N9jTRWpARvf;k*-M%+9F$<<6-`-{xDm zN@~yUW&gYHSkw#;$5atLm8C1<f+M^?HmkjI%xHYArX&!&!pm!pbChC7-yBIZd$lzo zla5YZ#G;j_lyku9nQLbB(}roATRu&)67aF9xBCA31>eiPl2<2itdm$T5#K1}*712m z$=ikr)vw=OzH%;8S1VTXNXm?9lM}D@q*ORNzVgXw$-SOev*m5{<K-b~yDC*VW3>~w zE@_>AE&gfi)N6s+8L{&`_R2YwA8~YkeJ<PC+9M%GGw?;R@<A&Ot7D#Vf^%zj1?*q` zN@rb!->;jqr@gSbbc|_7K)?U23b7gCZQow$Zz+AXWw*wcs`Z?{lGmTMPn)dyY4J*F zox>Ny?>m2fdiCI=`N6RZy~1BS_^2nj#OsLtsk(1VMUCAjzK^qCxFxw{YEaA#hwJ}J zCGN_zYGo*<<TCgEz4+*p=5kq=jF`1KGUs{sq|YepJGcLcminwaKQ0FD>qwE-%2g2A zIj??>zG|UU?wr#P>dLnAIF;|wUp;m6DOR;G$IsoGR$0xbrf6#)>CaO;U$gZ&|5Ryd zwOt&G^N;8D`LzDYe0*oe!IU?P)T^Q_rRNwYSxn2&ttqkpJbl^i&`53%&ChqE;-7td zsCeX%<U5PC3nDGti}h!nxo|1=&R&I#*hjCX`<|0~>cyXDx;4n?@6D|2{$j}%W%CS= zwK8*CHvaU^{`gccAY;iN!=z`M3}#79+S&H^<qer_`x#NQ%47!dm+8z53{q?)XO)8F zw35n#R9xrU)rQ38uXYoty&rGr758rIgvrk~uGC80b7XarLqq<$-%SQOY1(I$%4(Ij zzp8(K=9Ztx>s8ZwXBrznKg0g!Fi*mo=xV8@Gs}AzTP9Coops^WK_}yt@<oS!cOH^S z)6lx`I5X(?xkJ+*XxrG@*;SSNJsLYdp}ffFYJhie_K(d{$GIM5Wu@HLJ{DvtJH^n8 ze*sTP(WKqNZw&98I@T<v&2ZQ0Zs_H>ssz)J!<=rGl0Fx#qgOieR<BraOiRM;7GGvh z-rHzXPoBI5MsC+vIoV~D)Y_al7&h%o)Kzch_#E|zdizuE)RrpsuBlqarf~l%YyPRS zUm1y$j`^)p<Kw>)@cnpO){b4(r2*osUge7oc|7~stQT0>TD)-E`b9rB`f=fP?aP%H zG#1^H)op4!5XCp8wbtgr9o}<2ip__1#jcmXx>G`{c1h!{(;YmD`E%`R-nmF#lUvTH zy7Y9WN#7aGf2!Hu9Ie}Tz5gn`HSG1mz$+7fPTj~9d)4p%gmu$DKV#3`c%_(gOT)+H z)#B4%uG-f=cMlIw>D2=qyS5om+_P~<Md(+9S0`WI-Dc_jSG3)Rvpd}Wu|ko@<|nfw zKB?aMX?d$$ZckUz)Euq@9cTKxbyXC9d=&d9@bMD!Kijhv^PDFcZuC<=C@5SgkULGO zu95ZGQBTH+5#3Cl-7Fp-oK!3PQnKf<YMcCR?Qq%nHA16nhQ(nOX89m{ZI=z5e|RqW zPE)gV|EYTEm=d3H$ir+o@nVNamd1K#?oU(YU6&mF!#iz$V55M_OEY2p)l6ZYTb^*} zSxkGTuT*#K(7L7*;@SMu{@tp7sHg2XttartPMeC@!X}UN$MXX^RF>H_spuJ**yb2( z-wTd+J!kvDc;aQ3LpqVwJ<mENJCzUanK3^y<JyNzRSBnWYR})dY<N=F60>9ekIVm_ z<$OCJu{-?jg%e_@jCc<v&Hl6}W~%CLcOTwQV#|Jfc4pbX^;>3nNUibvy8jM`7x5UM z(_9>rXmN}CpVFhEqqQ<hi-WuSEGHfL{<fpvW`WbpUFPd}R!606(ldM||EKY>b#jVt z)a~cm^KN^Fu|L20f9<hL7Qc`A9y_|WKUjDE%+Hq>nl-;}*HO;ZY>&EJ`RR|n;p97) z9Se(G{{LH2#-C>X;BzIPP24{JhjEXh?=sn($y4LW)8t4tx%;0TH9OmVzZBFX#=y|m z%fMhn+C8TQ#fhaAII6w3w%Nsx%_iOdt6ea4*Nu5sE8g7PeJ9O!w${yQ#=CxmPE#v1 zoB8OHQp(3RCDBQrlyClgfBkNSfP$mfCQbEV$t90Ae#|H_m+Ey}%($=WVqDeMkFQv> zwLLR7pP7IEy-!rrwV+EEc76VB!1eb_WAF2i8vK(jlIvtP95`P)?di*!Dd&UdZJgp> zcaC|Q`WvN_pAKs9rdvv@7tWKsux*p1eCy+aC(29S&b8-T+J5qlB5%H$<?Y|UUayba zckk}q*9Jd+&Z_%2weFwz-#=Zk_Bu^vPwuxdN}sztW4UbE%$Uz6>GmxbTih@6eSFW} zm-?o~f8m>DZGzbgODs5z&G?khJ-9!Uze6>7n!km$pQXIr8H?FVPyYWHs3$P@7r##D zV)nALH*Fp}9&a=AWs>keqqdU6QRUEUORqyVd<_mPb3T{My81QAvHOr<zwy09^}mPj z-CVHUc#jlQKA+qT4i(Lw=ZQ7VN@mBcu6%WFS6z8=J*V#VDRwHwV#gRy$u2PdSbS>c zkL@xn*ZDaNZ<=3x_(=NV<fjon|NGr!RBTuj=eu7#d}-01HpATD{kb_cf_;sb3_tJb zcKm*K>i27(&Gt3)7(5G;yVm1=(dNOMvljKWw)~3|(m(l5thV{`EB)}jr;*=}Slj=& zfA3+zgT1BV{PlZYyuEn7XsYA;Pt_Ax-#@A`kdcY|rr&n&Vdi(H)wwwiKONuS{x|dc zw(GX9Vx9Ps-)?+-b=Csg(i7ngW-QCf`2DKhIz&ruFZ+3o&t%F(nJ@fZJ0kW=cwD}) zzwd{te5ESiibb`HMOQ4+(ck{HFR}8B3X64dy>8LZBNHzvt1a9sDPVhl3v=((N`{_F zp)F#QmVN0+Pnp}m`l+Ib_s%Yz$6GqIxI52IGH7$vKfE;S)$xD4*WV<ZG+kG9(@z$x z+~P^#gstYwEO|2|+P7r=|NH(;teTJA8Lqz?e?+JG2d>Vujp1J^wOyfe=aIJ-J)Fv0 zd^g|Z<F@d*`Giqm4`+Vm8;9bvJAO7A=rC;06KIe;n^dR%lyT;b6FW^Gvpuu^e((q5 z9lfLLXKE-q?{8)c;#oH3QO1n-I~HzjjrMf5zM>QIE0_6ov)~2q%PLFlx5X{c$jcY~ z>>G6B<_0Ur$I4>co@>lJUb*$h6o26xUpK7$QC?l&yy}ixqC&M(<mM_No?uh&ii0n1 zXYBl7bRj9RAYVM`de=#(EUjMsPhU8E5)GDA)=c(~i8wuRo$H_Esn_e@vAzlP4rh(x z&g|u$A=WBzHAu`ay=v(qU-?zbb^L?w$Qs)F7W!L+c}r&03rlV5&tI^2j^*`0qhA|t z`TZA;<m)s##j@41MOWoaVMKO^;-re5FZX&*-p%<vefG>W_T0nSnzD@Z-G%MhPCuOW zyj<q`>fJ89oL?rFMi@M|(965ChNb!r$1c_7r#~rg+@_jt;%|Ioi}6|W6CRa4-4D(@ zk#L^2aks#?kA^yyGZnpFA3i((=VF8U6%VE@EL5JTyhp_7Z^e{Pn(pq?3wW+R-1hz9 z14Z_R$(4T;qmRaKkn>vpZ!dfHL6hJqPHq-+{UdGM=ZjqGI_eVf!f5)n4(SC6kC(YU z<Zqb$ZU&F#&N49$O;v`lNmF8`NJMk4<2B#-hB?c0M{3I6tB<yZ-C5$6Qk6FI^=XMO zjX^Vw=lwc#@eadTujnQB;yg{auZgbAo$|;oKq0^X(3IzsRW!=lJxqRTu&URoPu`W| zvv`t`wVL2f{eNt0uH=}6|0pVFd0k_3Z0|-tr_b+qC!BO$7-7YFg)Jf|_<eYyW^C-C z^$n$yj+m=87hDdQ@%9$WbkFQle|Jem#lMY?F}bl~OIu^^LXCn*Ma7G|mO6ya`XV)D z&ZAlF3?65HX-O=KbhNrE95BhXp1Vi(-mHyZVrND-ZOvu7)qZT=v}w&|cao3)y?63r zL+#17=l8#!WAktP=5goN(`f4ptA4S$yg1}<JWtFn=;QZ&i;aG*oy>0&CKvg&+&9+f zP4BKR+l4~5&V6X$`Sg^N!k1%eJPGSs9<%@W%PgKcbFI<F%tn@ZaiUVf#f48^emP`q zZU1^>{f4`Ji`P_tTdZAeu;<PE+SfS+l{ZVxey;nT+-`D$eg0qVZ_8_f&ljKI6%tdo zl=yr3$uw=>BxZ}Zah;vHmzGE_D{uH!v%M{RW_7Be`}(xhlSTGtzq9UpY;d;d&f6vb zG{le1mEhd+>+#JwHE-|Cm-4#UAkuny1K%Y3b5{jb7<JMD4vM($RY;EiG=arM`I3ov z{LLN{lP5w#>b?sMbA7T?`dW4>6)!2vN;#)tZDDU;`1J9~+uQeghhHrGzp6YW`oY_` z@2sk|IyVM3U3%s8_Q9W3j9Vvt3IDJ{*Y3@{IWi^u`(NwK5pYv3cFJgbAKmWytzpiI zw_B0}{Lb<3KK$?J%<>!dOj&*BtxcaEf1d9Aenq`S&YBA>4<Bv%Ut4}-wRYKti0O0Z zJf4`Dd;ad>suk*cH!n`zxjH)3VvR*cab%U&_P7;UNmCs*r&Mz<|F_XzsQpj!kEKtx znF`PHJ9HsU;wb|+ucgJ)Nee`0o9Zw3Jg|6~XJ&@Q-e(z%0?(UP)ONAXOWT#XS}<fO zgVVgQtDQ;nPb#13Hranh%Bi$-iRg@1KADCWGgYTrX<PWpEoPXWcJgF-YO}dw@*RUT zSGS9jFY->hZ`NM9OE(~6O>~6z>saPpZE8o;HZX)9?6R3GH{-Qe?_}@8{V{pWcWOKX zx`p++o_t;7%Nuc#v3a>g+DEUqr&n?<3~7jxTm8zdl5<T{!IbEn{j&>Z@RuiO+&y1# z=g=OmSBo`&8q5xf>6rI!#aWNshx$3)Z#SCf-_X0Q7PD9<@wn%l?~e<e3{8%^$3D_J zQ06@8SFff=bxw8i;aA_*d~Y^?F+Xn37nj|-&n`ZBWx&5w{-5OHMwb6d2OCbDXDhCc z?mO@H>!y^{)vE>XKm1v-e0R*IuX)aAkFE_A6<U0*zn^{Y!)Yp0a<4nA&9r^-fAjVY zYneY!ouFUX>-MN{t$mr+;`P^lpZdWqd+pc>^Zu&dpAR#3K8?6yGOM?C-Jy@$qShJt zaUbhwnjq#I5O6KmH(1<M`&=k{N2vN5<|C^%Z{uX~i+#VM+~|!STks>+jk{u<F0dZk z_hXUZ<mE3LxjNDutN+$ay4JR0t73L8N3`^%XCm8|>z4NmP3zhca+c?gf^<`mk=V4> zyBQr8Wlx^=$#l%!Yh5c7=YPPrl69IxzuCj{rz{>$j}SBc6uhSGe((pOJi)uYy1V;A z`uBcVY@?mN^mQ8NwYuxSKSmlVyFX9ba^d{PJ(DG5wL_20*&MOPlkdy1YerWZCSI<} zDw?G`#onB6YjI{Jmt6bamlw17%g_G4u50+e)ca1o$nWXOk0!FLF=05pc>OmgwpZ&` zzI51C792jWu>OhjhUfb~7~V-1zkAy8{U*_j)sL^~-M`hiEwH}WS;k@7`n(xC*D<?? zd%tBdQ_Ai3NC}Moxp4KyW3Mb;-#RbTcxu%Yzg_dhR^%u@S~a_tBR$USv%Age>_=IQ zqAyph*(fbpp?Ldgr}!~Hwv~Pb?*;FDUXWpM%zpZVl{sr`=52n$$EN+fFt)&~K~4Sh zrv+apBpR2Cil#I@ROVi#xJ2^Z0_j(>DxNL-+2*h?GIwlSJ7a3ow7^MA8r}CjRMlLy zfoGzcfnH9@+k+~eh9<68Opcv(YIl44^2MEB7w?>uiJiTK^+IIK<~SpslWbSATW>MO z$TA*Y|LDdJt8kGc?goo__D-~U`qq7$?mFJ7nX(F;Q`mo-3afhkIk31{Qo8csnJTW9 zXQA)>)y|d8F?~6$d85urh2r$PpLViM+Pz}mth|;F7N7E`Ex5XP!>X$qaZ}%2U0E-~ zKkdO0_v2jOm+xg>)I4n--`dtK_pB9ywtW=xh}rkganZRNH}-SYUp6uCewtA5$B5ru z{sYq=^`dNNwpr7dPN#c{UGm(`({t`;ZJf0Go^2-*O&BCwdHIVTr?y4T>M;m1$#Bcw zyJO;2#~oiEJusZH)>uvc>NY-|{+bIrm9(E)+8q+q;p2=izw`T&<NLmZZ>8?5ZYRDv z>a4HiF!yxoyPJB;uD#p-iis;VqS8`2Jy<pP2zS(L+sRBzir?x^-NLsjJ4w|oD*30S z$1ShJwq+mI)fZiPGW~~fmD;LJeA6B=+AUdhcu6;pwcoi7p_*ZSVW0TaYrZ(T>`R^3 zGfTTG(XS(3%IC1sOmSJ4mP_C2V%N-jwO^WL(RcMyzk}6AYhKoEeZ}t`dOa{B<NLG| ztCH8M<-X7CiJfRMdzWZ|EsL=3%;mf%^f-HRCW^V0mR^$1EbqLZI3=Yf@|1a&O*5O# zWz&drWxv>BbIo7PZC1-Fonz7*H#c$pi;jacJSQ5|Y>Ik#`$eLeqzmVQ83+B_rw8tu zuHfrbll^+x!KoPwbGauUZR#>>dL;PtqUw&E{dW$8$ur5ye_Byh`*!c5UF-HfUz69> zw#rVZa_X<to$Bv`=1I?8^?`Bgl;zboCKyghmDGF}cjRg|^M>EEeiRB6a_JqLelDTl zg4*GF#)W&n?c<VEVP2DXbY<{1h4snL_kPXa`Q2IKiE#MA%%anukAxOId@k%8bMf`^ zC#Ex&|IwW7!)%@{SZ}mN?9#10Y(KtDtaaCzF}dX4f?bI(94G64>%6Y~L8#v7{9=P^ z*SFdWu0MEXk4@w!*%h`iPsQ?ew}?&J*{vPc&XpIkjbpRvBQ=(Ty|XnAKV4B+z0a=S z?GgK}soXnaV`FU@qjvA`^q+8y_orKBQ|407FMD>Z{AgUb`FM$9Rd(%FryF8S=3iH| zo;iG5<x<Q<3p?YyOF|3Ub^Wxr2bW}uo}c^mk(-_IR3CdOL%-eb_2ROVdjE7(e;3P} ztioH*n#cHigG9Kb)z{?c<L{GV(xz2QvM)TpKK|UHYPnSJ{qB3xyq+2<YwmrTDc3ja z#TJbS={yCdES{Lf6PDM_aXplEmn(3}aut)H<h9rPJ9oT19htgMxA|t&{S?XP_e{T^ z)C)4^{*<s-?7?flMGebtZnmHGf_;14nx6JoGgdu{-XJ&W`RD(qL_b(veB_qzdn_Yi z-IobBem&_ev)l4j=w5O4^)ho#cj2ICnL?>goXpGexC=LLD?2T?CrsK?e}zM4z0Ulr zZu=$wbcfd)&ntf*zV+Czgcp-DMb}iO9qpW6^yTkrW8-;;SIrdm^FDP-%D*;YgZoT( z|K*o|o+_Q>a;N{Q^^-07ho+x+zoR1l@44mT7d&h)IzQvxvC!qD+=ZL~|5=mlUJLxS zU^vsSq{H{QZTd5b$&bGspAmWVwx`cooxk@IzShQ;I;iF@-Fh;5@AUOGDyg=clJ{*$ zuKsvrneTLodzL#>H+B0x@pF9>QF3#q0Wa&yYnjtSm2y8ToqAe*>A8^LmQP(uTnmFN zybfpYU-)5R#wyvZGfqU^Sg%{P!ueQ)&iA>dPiBQ|v9~a|#u;PsX8WpjlPi7vIAZ*| zq~EvpcSXM1W1+9}XW=xll5mZXiMwrPw<I^84x71Bi>H6J<^kcN1znfjJg>JbJK+7* zk=J$B?x(&}Vtxy5E8QLvqq$r4t+1c>D|`9EsLUP5`>HDLzW*$^oRfFI+QBk=Ms<S| z-!i|SlHOyzL*~NUW=8IcckP#IR`2VT{LHhzsHu9r$hH@UCNEgfnAOsz7ym+Qb<XQ4 zQsO43j%?ar%eAhm^T)&6@0RY^@@#JW7rou-?#x?Uz01sAe7@Lz*2i9CNAtTZ;aes> znE{C=-}gB&X#P)?TeknZ+F}zg){V_gQQxj#H`s2mCMWq#_4J*GIR%ah%B!xp{D0<= z(tO)pkJDow8XHx)>9VWdko~r3%FcM<Ckn4E_U#B1xmH(v_{HK9yX;hRcApii+6_Y2 zI|dwCx$MkQjp|=ZU-sPU*|XI0U1R3?_ov-Y_brV0CRi=3IQPzssb{^txX*W`MpdM& zd9~BO&)Yv%EAK(*+9IA$M-NzcRJ`Q&zCPn}g_7=Mn;GlE_CEPhsP<k&B01#i2ixUA zsmD(k2VMUX{kXF{((KivW38r<8jIcpE?PQ&M{x|7*7d7N5-+=X<YPZ=^DxkzSTZju z?sbI9&C;K$p=wv&`SYH7{deEZ8}t5E8fh=$@VdonRNs1k(|noJ*W+*8`&}Du&G;>R zVOPp_=6Uzpl;6dsv@ie1Q?9nTrzP~A%!iqJH}X^NTu<BjnpL&xQ<KZye>cOk^{(tU z@K(P5|6YwoPtTVd{VZCavzM*mNsQJx#2vN7H{<5hr|xN~JJ};v{%yP08r=Eoz>zSg z_LFs6a`&3NZhmlo_T9uCJIt5neBZWig{u6itOr*u9(`YWH)^YpQKJ^u^VDls)&{;^ z{=YK*NcFW9T90oUb3L5vUfFRz)h|)~Y~hBq%_?Vo+e}_8U$sNL$}>yoXSwUX*xe?t zo%$Qi&qarLe)Zq=a6*;a-bq3~_dG3L^6ulyMcmu7kFJf~x0QMAu0ssd-)yh%=1J#? z4cxP3X^6?n{i&;Cix26B*Iz6<Xd6>0yy#xo3Z=^#S|(e6yhv&*mONg?T%~?JVbh5p zQx<Kw)qP{*l6NOBM0vd4y<2oPlgs=M6P=d)dAwrz2j>-A{r>suab+KUZE`d`_O(Xr z$H#)9ccMJfR2nKi&GPh040yVB&&>a)Yi4$=Gkvt|{)dpo6F%|eD3po23D&92Nczjv z_P*2Zcjq_W^H0s@@ZEi8!JU>_B+aIw_=-W(e}mGz*%R~qOm@^|*l9XT*L~Fwvp<|U zW$(Vc9sY~YY+jL+d0@ZMR*w~nl4`EzuPbLWS)TZJ(>%Ln>QOS%VW(fPBwr3aZnf{g z!Ot(8AKyM#EEpRXsbw#{I&IN<ZR0y#kEc(b&-M1=j;*J+mo3P>vRmS!`2$%uySjx- zKN!r~X&S#+!`wtYCD5&JlEsJ13HL)g`VE%v+?-*;&T3sMcJ^_>l5bPwWp~uf6G_`8 zQS$sdkJ;1W8+*QAyl=E_N5J&<Zx)a)r;InxMlZ{AIt!QSGaQ+n(!8<$=6%6iDx0(C zwAt`!1YLAz^%K-f=vnsWoPTo31g-pOGn%I63ksf2pIOoBJg@2YS8wSh;*0hfG_B^9 zVZVDp>Hg;><(F?RdQ&2(yF~xGv8=(fYW)!9+8IwDJ!but_Nm5Z-A4v_@%UXrcH3@E z_j&PAHb7ZMNBZ%*sg_SUk6#oqa%(#!G*A0uCG*!#kqvr@5ibm@y1MoqKK|e@!&<e# zr_+{8&hlGd{;lj=*;~QlH-U{_^)|Y^2itb2=XM9R@7=KJ+f!eSlFG&gmYd#F#5X+q zSY>s$ebHybk5SF3{8JT;Rkv5=)nBWh!gg}X;|q5`Ni0)avFFjL|H=z&IU%E6wM@6= z9~@3g-z)F;E8TWOk@}~dFLbw=&dS+b|ED?k-<-Tn_5Y)T)#n-Mcs=(0oan-sUvSYj z<ie>35A3HhtZI06$Vpr*_UY`Y(_A0!SXpqrGv)n;`?i4@S&w*P;zf5{J9JO!-3$Be z=CY;tZj|mTy!!Lxy3hAQpPTPK=N>-y|C$Fe3;(Przhu9){kUP?(}x>>hO*xJzs-Kj zjLf3X(g%3h9-h`eIzRux`Sr5NMNb=o99F$uVPobxKX&)|$G+a1x~lfY=I?o_^l^dp zi@$I8zh+@O_@|vW?VZBJeSzCr898Nt-dkAZz1Al0>5|`{F2B{y*#GzPyK0$Fx*uDl z|84bQV&VS8$n~3hZl8Mc8G!{7otMNGZqN0rQ}@%0P+MUxHL25CRwa#lrNWiQ2j1Jh z%dxLKV(xp_;`@Ou-R_rXKDo(#a7$m)#lneyh3pSB9eIE0_UadB?5scC`}V;*D9xga zU8C%NY-PT!Kg%))xhqHR|3_ND`Z(~b*+R*65@&fC7<7Y3UQ1O_oROJV0-L^)v|r?g za>QB;<m%3O@s0`hN6zi?dvxb5<L%wfm#^Jq^O&sgF)6>$!eW!l?Ojt{*LtXam3_DW z{+SQ1Q=UxUv2nJT^up4dP8q&-WB&BEWO=!q_f~hTZ4z$p;@Rrs_c-L_yAtgy+e$36 zp09lL(}Ke?xG9!<Wy*}>GpkgM<&HhJNLhQ(=JA^uteHn%<gP!P;ncn2sf|eGk>Zn4 z(;OBgO*ERQ_PK2O#)DJ5&o#~2?DUD__!QS^oiQ6lr0#v@+IsNg!v*PV-NDP2&AF?Y z@UUY4;dh5Dn(R+pjkS<_zj>pFXm`<qiKpMKd-}~U<+IH^AJNycva;nLwz{uZ|MDxn z>ThG*|3hw{O|RTz|8B^!{Y3D*@*BMpg%ghJ7aBc1>Er)Vyzl%C*7*lFdzPzieS5CN zpjTD;IA{6?bM6L1!(~$~PFt$io+$d5FQ;|(h0cu2QJW{mJ@lJ;%g1GbaD}wA`^Jz; z8!eFxr-@Cs1QIVCpBZE3)fy$#ZZmbyVZC$rzv}1zzI)J~O=0%-VzDNpBbkEBg+n$n z-M(<)GoSEI^L75dJ7=DAW&9<!@Ew!&WrvG%GZ|jZ{H&mK?92_5e%GSKKRsIeU)D=} z^4S=%v2dcwXI1STC8FC(1h?icdV23(`A3N~tF*%pzrJn%eEQ(q4~GkOe3!k`6&$y_ zd+lWdO{H`HtitvN3aST||N8#v-OYrGvdi!J>-N6mw-3pCy!P?K2VdU0%4aaD?)bj# z|K*=gKREyYQv09nox!%fJ7wQ>+zP&)uWCA>`2Vv{Uz+ZIS)c!F``^<CUq1NrYEtan zjq~-^-J2J8C(r3^=bqf~yxR-eo)r9cC}m~PVDNRYZnsxW5>ffo*6uu^vHbbg`;1@K z&VR1d9=(=%{lyQH?B|GP-pEUw++U+s#QWX2>h{fOy^RMyevta6%^*3YcG-PC#<DA` z;_ltJpgZHm_BDSk^741?;%#n`p0?M$M>1$N+j8!;CjX9@zN?k;TCzQI`OoJizf5{6 z7B%_0FY+_}c&FPUtK*q1`%;0=qLUQ0d{sZ)=G$ofQfSL>{f)aEB6*f8zESJipSR_c zc&FjXsbb-q7aljV>HMNT>*aqjqpOMRy|>rLFPOaU_5Axy(gzC`Gv-e>(`C3+9&Wy2 zcaGm%O^A25g%+(i{;PGbWAv}U{pv1%8t(18&#+~dl2C`zsj?TV4(?}|v&qCuql{DG z#EGW++<9j<eMsVwoz@_Ee)Gycb)BV!dT9>Fj#xZ2IngX26L5LUpB}zstCv+hfjZ0@ z>z64_%2S#6QD(2(#H{+Do)g(e8{Buh2(~dlaEMaMe=}$9#A$z;r&l=7SuFqBus_(} z)sFkX<Sivl1yY}@Q<7$NCmE@#m+DM%u}R36^!s^+<5pSa(RD`i4!sHf=g`tSXNB!_ zp~q$kVhhw2-K7re&xqfZpLTa^%bBJpGHpze3C_|SlRnRWYU9kg;5+v_b3XCqkqdX3 zmYsW`*xs3uc8sYeL;CyF*9*fJIp<tdme6=^B&=x^w`oab%3AA{KX{nk{#0-BXFMQV z@*qo|`I2{HZH?=~ml9!&rM{ayrW^@sJk)6F8F=0zZ>>Szk=Mo*(>YGsGOiIy?Z}<0 zbFen}X+@Pzq-@VoE452j9}WaAdRaTc;SGoG5(h6)!G;x0B}}qSJkxkf79ZU`Iq&!m zH6K64cYJDl?uKOBvaskLUE{&jbN-B#L@i&V;hy=oE!Ho)I>Td!>Som-o9}HFIqw!+ zW9#8hv(Kx}j_S6)#ddw+dCk)-zFfR=t(#7@ZOzNPeSKMBRW0AewVR{OI^Q4UlI2x? zq{`HMAZ*pH8(zyFFR+^)+cm)_b)ke{c)^dalT5<07X1z4NEA9D6q?PjNYFcZo9a^2 zZHcA(vi2)p__^`cWB2cpH#N5lryPI7W%sg6ZL@g;_tP)+qO7+<COYhxZ^Kd?nG~{8 zu|?p?hM6my6El~D@a1zzera<{+np7*ugGHiwv7T0E?8Zh^>fR7chd{oSrzUrE1Plm z?we$#{{PBBqAERy<QJ8kFBUzVWN?RhSK4l^@4S)GA9icLm9*Mf;s0J&b?^S}n0H|t z56tXOw^>?ySiQvM*ZZ@AGbgWc<=JlSAUuEfORghx#Lg~Y`?RpZFx%&urP}*rYmN)t zRkN8ctNWOtBgN_14y(B>%Y{vIFP}K0H#;Ix%)VLAx-a97MeADTjB~fWmoZQNe_Qa~ zxeM1lx8{T@ep(qjceDGW9cC}BZC}^R{mqt-)rjd#P;qVQbePpQS0%ggHp|5+=0U$p z=bkF`bUnRfXYZ@uTcQuy&HTjqbcc1uXa36;N7N?;<c1wcxX^OkK`(uMmHWJJ`(DXT zu5MU-aUXNRiZ7d3-sBmz?k$`D<Nbra+zE>oWljrHRgX{oUi0QGi+fXG<myM!6Q`eb zbJF}UGczLX3SZT-X%ouo&NxjGV(nV`W52%Zj|`2^4U0R|v?nvAH$Oc8eC4O!tk~b& z6aDz+OtsMunfHc4ThZgexlK+5TO3!%C0?>=?_i7y3)qqu{os6u$&+|tCOwyZUpv_E z?P1+3Z*yUGSId{bDU5GY9p`vUoh~jHKQ%$(w^+hP7p*T5K|Q55TawmZx}wUuN%P3e zpG8kI^Rq6g&riH8E&Vk-`Kq}@Ro?X_jS5>Yct1Jk&FuY>yZUI)M-!=_o)E>BDzW8) z|5MUgE(cgm+w@TNV^UM?cF!;#-f#PUM~E2B+}+Z}8MawxrhU}cJ6btQ%9mc6YFwjc zT2y#s+m#b6vRhpye3scKdvxW86~dZ*)2#iz1zGG^ex_oAms+<$OQqiNoRlNyk9)W+ zQ_os{R4-fk&;|x}t)#$-v-g}&&bbtR_mrn!@z?#KUu|8p?=Jf_>8JGFOTWV21?=Nr zz0p-fi}6jv*8dqc`8-z}g{;hY7MJ;Up8Mmz=SyDiEw|lfEQb?%eRSV1X{urRm3~`~ z@7Sr!t9N<6JTs?yO|8_L#)h?fycnbT(pP-4<Beex$(++?C>h(Yxh<zUe5KhZK3#rK zr%mk=!Sk$)GnY72E()2>TqzeQ&QWnl)#*ZR-femLe;?F2Y8*~)`XTI}a@qBev4zni znIEOb%LEL5^e+FU(P*^WZP9PDXs_EdR9zRwt(;t@n`-cQ)=P(JlJ9#R4&Dr575Va& zBV)%UrYqUmOLi`Df7&p`_SqMSV>=#3h#CLsSoI|Hs-L5Wy7%-aRrx=nSQc%~m(fh! zxuakCozbp>)$<Om)%tAl%u~hOu`~HwqNvk@o4$9KynWef*>&jf+^Og0pEX^#C|S1I zv_<1iyes?mQw=98rm5Zv&HZK{>HWa4P|R5GqgK=|){kpe8*Bglnzm`x{=C3>$7YyD zZ@sQ#mKyDR;mp(bH<_At>CVnx)$j2~Oz-~c=ml(7q^7(~PZQsN?a=AXGeRTpJU9}f z{@`{L_w$&`3M#LnxY<LmG__=&5|b*bSm}RZdi?wg)hqp11m3>+F0eGd`h4X43)S;} zwcPWrZAwfp|H>)EEi&Pi&V>DerMvGvf3irbby8dWnh!yXKS-K#6*Wt>#%*<5_<d=% zh*sGSzDBVt8amq_AHS~g#cX}x3jWvJ?=7=Ls!YQ(_o}?+?6`M`<;W+g*0`(B?>m}p z+paWygJZAL`iCm-Hn}a_Cm^x)o7T!T`g7-Ol37@-y?v#$ndAB<!8LOvX8Y8>F%o)q zNBs5__lT*=3gxF5HSYZ1+rb!IxhiX=Uhs|!8$-Eei_@(($4}j5F2D9(&c=C(Q-$gp ztJ;zrFInh*_#Nc;Kw6gLm2O4-O~D7|MH{BSZn+Wr{(w)r`h)bJ@hdJT-MB97{?v(` z-DYc$c`5&=^vjzP7TMf1Ke<h*cj}uAc2AeUrSq4jp633e7dp>>|I9_5S64hUSi+Po zz2t>_>AIJu%fH6now84?@PO8@FFpdl1^?X1RbEpXyhi?Pl*FSc&+ch_*Rp+QC9|!Z zxBWE#t~U>#KYFYuaZt8P&w^Xmb0Ig=#)Gz&$GZJJ9{$$|J6w8!Ggl@m;6by{>WMQK zYw0=%{S^`3o0_t5LV&3I`O_XvVZo~u!f)B?KGwM=RoLMC#pRh>iHgSdw+mu8mY2*F zYOdY9K=;Qv-GlqSb})GNWr-&HIjp<3T7*X~hJpLB(#jJr`krMod^Kg5s`~81tM5z& zx92_NaQQK5MVyv&xA(zgj_0BZr<Yrwo%^tQH}?tFkAbcHO_v1@={Ja8@L<(?d`^4M zlO{o}jLl11%$j%R{GY(oZzspwa_!P;3y<qk244>J>TOTxfB$G&ex<nV+6UJ?pMP<+ zS-bW;OZWSd8~e3WOd?s0Y`ohYKFxMGetCJ~;^#63y}f@}CH`j|*x{N|V`WlxZJ(u8 zo!qV3(uVIpQ+>K0zT=*1Si7$Ld(g2ELx%l5D`)-wx$E?ds;|Xoa#y~ec4|h`Mx&Q1 zlMj^#yq??h#_xaps_FkWT=i~{xz~BaEhAuM{H+4xKg?J4ukwdnb3D)X)%)t>xy!HV zUo~7*nRR5}IiqE2H?EwXP*A65zg^!~-|M~k#`Za1N=4@0zked=^@O(*TLZg2a^lXa zTv{GxZ0h&-Ta0P&*-c-ciW^_$Z`<NHeXGyeWUVmW)T}27Gh=T=G0&b|ptIo1tHo3N zc18C_P4+SkUOHo?9$U9?Pn~u4L;aH%wwc*%w?Do8M|nzzT$B2n1<uVe&M|?Rb?qK5 ztPx7brv2C+tG(ao?#!hN`h3%C^I2Q(8FB4(54d5x-#d7A($nRYv-<gMHs1O4$8MS2 z59Wlwr@y~@zJDKcO5bsfTc`5-G93@cW^}**58i*n#Q*}JJ|l>RVH468Nr6rs%}h=$ z)(0QUEoHyR4TNFGawFDafvl0&xD{x_#K5qHoq@rcOlykEl2X#3i?TpHR1k*Qwl^d& zf3|@@-ShA{x2CH&d2Y4+wvu;=YuAM-3(E34Zm?G{NlOZI`u=`zZSCp0Y{_afGjEO^ z*7e_O%hUDK9<OcPKI34->yB&h%5COPS6<k=<=%x!LWxTSC+~Bt;0e31=pJ{QuFoyD znI~9J_XHGK{l9-_+NzgZHN2STzk6qQc-?>PEef}}`8=1aX33jnwck3hdWF}TEP11o z4@KAVUyGQ$euvWc`5L}n7oGI9SgOn=1%oYTBqmF(-KS{GzNqwC^Q2II>y~w{@8&PQ z+7*0#%}uuAi&DB}a~=8SK2f>ABz>i{TKBYMl<Q`N=r4(~x`!*I&rM#>dG*;w_GL>1 zHwkZISga%Xf5NWsjxQbWDbA`4zO|aK<w@DD4!@a_>6)8un~wEZCmp}zcYNtCOWU;@ z^S&Fj^)e<ZykE7dK0iT!Veb~1TQkfjJ-^#EXUek)%WjKXEqYlzt7?0SfYA9I5sk>J zg;|-CtRBx)?V4O5Y`^Am?vBcZd6RB`&Pn+pa`a{K4}lix*>5|1<^?B+L|8OP?>d=h z)Bnrkagt=9&x);=Qf8g$^PGP{=d{oE45fXqRA&3-+|Wv{SQFqkf8X~y(aarD%smAw zj5qhlG6YZQaq|(Y-w~Ufczjd)%fIX)H5XScj9#=~<59EIxsDyK?Q1+!!~W+jS1nB1 z;Fy+bay;IBewpxMg&5buimWR~?mh@Esx5yIZp9Q3VCd&6_~+mB2MY@<Smp=az97G@ zq9o-`!L3I}4<^)1@GH%`+kDZcWm2!x+wcCUDRr{Iya|(-7#OrT7#QrxPO0fRDVfP7 zxDsoqZ~trqfxVx#-F8n`@tPc3eI~P9ku#_zjPvf@c{)tYJD8*;C+n^Hb>G^|bJiPo z`#@dSmYE-Cn}0r*X7wuHckWA$Us2Uts-}x__J37*&%AbdsS9^;%T6br+gys;x3t)u zr+Evm6w3;+mP_Vs-gRika+|)MY>S`#ck)uNYR!8pbuT`)wjuYoe@5Px$DA#_LMx7K zm=+x(C08*qIj~Prh|^}l$AetnpHe5!U-Wg$w~WMd*&daR4(GL$l8jhuwS1O7N$)9j z-_jE`VNph6_k}Andd^?;nmHlhSWc60T=voJy~kLjCI&RJMJ(2Oy?xW1g`z6^R}}JS z|G&m<c2A{-XQjEh?vbDjJt;k-3zq~W%U9ku^eCP5UBp*jJ2#a%MkQ@Qho4+#_Q}Pv zO@}l#9{IL2S9bl^v)6*NA8*@lam<VP`UErAi~ANnn633?i%!&h^GT0mK26c`ZQOYF zZ_?9W+ZCgYp2bY+<*vzFRv;+u>vX8?48K#pY|Q!_$D;2~Zp!hjNZJ2UtnR?Hds|<x zJ;`JsYuRRV;OoN+w{IF<(o#_^EZ-sL5|ZS5IP|c%4%g=;5=u#?x0^3W+s*vhrSRBV zL_PYX`?V=;=}FCV*QFoN>bTRm`u(P(uP)!6H1igNp3VvDV%yk=bF<p6eQDiR;pOSN z>|jTnnA*9e2HPBD1I|?{KYDoJ$l1j^q)$xw*E2Uh!&BPs*CJ~HGt14bf6wi+KFK=Q zs3CXqvXZBNJXhs$YcE!pI5$r;t10eUX4e<qt^3zr5xOzqoRYL`*48XZroOMc?%m<v z(`><Pk=CxrT2uN>VZGUXGl8wGbN2SwEaors+2wcsOhVI|H{Vwn6f=Fuy>@o>Tq)zz zaS#5@c;dapTh;X4=j6mi`<YR*zzO|Rr`VYp7&db;FxZlx1uDuCb8zH<vthUMZaE0l zKG$|T$?d}D68d|JI=f7Pb0$lkQ)uY5r2e<L(_&A@EshBNzjyO9q03IQ+}2&0dLSdM z=2=<Vw0n`o%dfwh>lmEgJZ=4><D$ZMmk4fYJID9d%K6JFk%Rk66@w%LR@kJ>IxVqh z&5Dx4mFKtFUdT~2XfK<WbU;~d!o*2)-|g>OyZ(~V<HAJ`&mKJ*eY$3Uv+GZ<E&Mv^ zvuqV=w%Omf=gz%M;!sECj+ggJ*6w$e-XO|<P}`_e(s3ngn$)|U9sxSK2}Ui|CRP%U zCzTX_kKEFBj_s^>1)rce#}^+-)@4c;IPJDtoxNht^Tq0ds<xwN;31}kCk(fIyEsj2 zNu2aXL%zy&#``o(MAuJHRLy8GO*{Q(#&lbggUnMbqYTP^pG$dGvUjKZ)}3040h27k zC2nP=GHtxJ&YQbqihtefjH>CGE4dyRnao*IAe6OwqDoHd1V!%E2h8@Zw&A<F_LTZ{ zx7gYyhG5<p=MauSxt9+v>Y0>iZBhFkeYl|a^7dO(O`@+vX0gW$UR>m(o4ByV$?M>X zjkf|83%m}~+FO^X`|90d-hx)ArQTDnioCg}{$-Cx@Ki~q%YKG`3RKtbPu+UuoGDvp zh||$j*|*b}0^Rt_dW<w~zgv5E;{#jonKg#?5B@Lrcs<44gh%klzc+an`!^r|cj9~W za+OCy^%Ey;<Z%(a^rZS<!Mn+KWN*xS-2ctw-I3yD!d1(c<xl)`N^+NQ{gWHa=~*`U zH51aF`Ml5Y{_$=BU$plhm&<>bWL`be|9o~dw|}3)m*d}Zo_)*LXp_3)sSq*m^Ml4| zrM!z=SGOkkvT__fX*6}>idwfjU$%$Ug`8M$*^KSFjzPBOqV}s+*HkzCe&V&6_p!UZ zkj}aJTlZ?2#%`Uh{hgb$EOl{I&)kz2q-$$CH**~j*GQI{e=hZPMqVgy+}zl^Po-Y+ zYhIgt=f^syyT?3kH5R}1o0BVi+h9)q;%2_cn)Ms%vpIAAA9$cD`Dcd>Q<&jHhI@@h zGEPfAu4OwqrNC&#Me&zHT|HI#9@mbks3w2@t&W=QT5A~gt1~e$d}m`|upv9!Wv3S9 z;mCEMM$#<<fx7eSEvAY)2!>SO@Sg8wXrk4n_TkpslSU_7D_E?HWVYnos=sd;z!Ef5 zOLz9t6DRNf-2MCAz6zT+dA-da1$ITbZ^_#4y4t<cJVSP^u+(|MG_i^1s)vL{SAAjA z+EP7L;mc|v;i)TKtWv)ue2LGlHb_mrs#gBt;kR$fYi93vntf`oSL5}t#k`4`*D_@H ztWY|hB;IsIbI*eB2bs#B+>Uwp%YVkFn9vC;nHs+Z1tqF6m)p&_G%J6`4(El|HybXx zGH18!I%KlP<@U@eZqLrzS%gmAoE2;Bv+$ax;Fkk@Z`bXb_LOO@g6s<}=Li>mow$vH z{|~J+pUft-c<!aG*Sn4PP53Zj7w5qnoA*4=cz0xrp{d5)s?0#koh55kr&qId8|89a zKg+A!b9MVP|EGI)*G^*bW<TW^Chl4sx;A{-g^O7ickP+jv|zbW(yT^-)z8(p^&DL+ z;MlL@^?2z-r_!J+n!HoHHJ+vHkM9tTw!8f0$m7=8`u4{Ez6uNfsoRvG{fUinrh1N? zpv3O^n^Fr-IrW84$<V6Vr!kNDP7c5MG2XdLUry?%nJaQ;jp;O>zlyao>qQT)_1RWj zvN=k<c_07mlS{6;yH!j4*}2g!rq*4*^^(S0m!)-ko(C-9@A4~jcB;=86Kb)U)O>Jm zy8ArM*{+7wZ(aVE#Pgl_YiuD`->rLqZEnH6BKN}mQ4T_})^YdORa9kFUU2@UZ}i@7 z{#(UqJtD8~*P~Si8-Ko8`<#h^L70ny!HVounF~9l71U@4VOYa`YnX5TEeCL0=;XqN zn2uZbEG8y2sX7D}*yX)T>OULyP3rBsz_qLX@7<g&GlxY;=;Bm{>auTp&E@4Tzn_=) zHTtjKoUGi7SJX~dtqxu|H^X+}PwkeCE?-WY9$MpJ8o#{c;1su&4V@h8<P#68XiSlo zThz2ID)~gRoYC3hi!cA`=Z62>HN_?}^G8|X$Ge92?GqyFgmRCV*)Z*&z_gTk`%j^z zZS3>b8Jv}oe$G70c1Dt0wdZ@^Ey8PcXYGH)mE>2s{JyDjVkOV6$QfJD)F-acUMQ)p zD4xmb-Qtw^#K!&fr;b(0XO3Au^77uNW8xOj(ZOVLAmomZY*J<0w4k%CPVCF>O|_2S zVf+8$@;fop1fDq+2Nq0hIM*w%e372)iPYxpoy+Dc>3(L~(cvRLagONaYnzg!Svqw# z9olxstgp6m^GA)`ZEw|i3fDGfcXXTR@`rp#5cS)lb4yb_Xm#ni<Svsog@`-n(+;X| zL_IG#&uZrTMD5U)jui{)9-OWHUS>Ckjr;qzd0OH=9PMwWzuRigulBCs$-POe3-0Gi zUSv4@i*vhes@E*TgF-Di)*}1TZZ8xtJiDUofWkv*5rNGD)ncjKTOGE1ojk+na`|Ct z|C!A8$+>P1#WN;Px_S4?_q=6!2GV*Sua#z$NGXVv$twN4=2)@#RYWb@gEOmEFP(dH zg2~rSp5n44OV6mzycN4^r<-iRx?`;z*14Ol)gJbqnrSiT+Py_md)qWtur01U^@g>C z&E4Rh@y_XAc@NFHBB!?NU0_XjSAI*E`Xke))-|F}=c=D!5pWf2snk>c`mQrmPiRs^ zrToGROCC=+qHJR3BDeOE(TDpIwJz$ZpNw1uYn3L-pL=}IWZRnBCw+T&M%y#LeWe<^ ze}VOr&&#*EW|;iovs6r;#+x<&x~@}MYHiaAsrX&*iWsb~FE!+g6S!V`PlfNr{=>#c z#ILRwIJxrRzw!WIHEXsrSBjo5UOuzb?}&}r?%g-TEhlx#oc(H#TGHDY#Q%0?VqloX zPDukRzXW#!Yio#a|1D@2L)<}g&8k)6ej8>8akh%4-29f(n&PyFt1QLZBk=0~dxZ_U zZ^TqqT@ezvXS4t3nJ>G~&aGR0zjfI;$Fpyy+;y$g&vse6@bfaUG!Efji7?hfdmJL| z1NJC&t_cw0c{R5~@Yb>e5lfWTJ@k9O|M<5RU0&V3X%9aiJ}iE|w!XFWYk$_`40Rz6 zZ{5J^4FTC##Nu4$CGPvGFo|=|g3Skcwx`_wvTl`W313#C8qX3X_XYQr799xT`nJWe zHEg}a?b-#mS1_r5=DNnQ^xzTe@Y}0eZaqnG_iNc0wZ^-fbBfVImbn{T_nJ=MGiT+~ zE7h47nrHq$(WLsi^}h3}vn!e+Jhf9apRlbdYOJWfK9${T{tw&G&G|FKR<S4woBN6Q ziQSYsxk$F@n8r$G>mTbr|A@Z(s-~y(*)QSa5fK7nmyFJ@=9b-aqqWU%?X@RvSzF(^ zdd*yR;AfF3fB0d^`9=43se5?Tv<pQZtDG4S?QB<{<oM%pXW^z_j}uS)_;ThQyJ9p; z$>$^YlxmLb`^h+e)596MbN)B0Z_>G$<l21T???B-25VRDBbPL4t#kzTEPj2ZtSN>` z<-nG(SqsXhZ&R|rR1tM*$K|pXPnXka%Zs9nP1Gh_ieF#4^2U++Z%b_*r##J+%RO_| zdhw}6KQC`AO<DK5;`sdlJ@b#;rNK7R!RzuL?w6YFlpZjB)|zCqkIZE`q0-MDZai~A z@!0vOpUz(&?)XyZ&=SwA?zZ05wqafV!5=9K6Ykx)GV^>}zQ5X(6YqYSqbAum2TDX5 zm>3xDaZoaVQ;=4Kvu$$U|2C*?5?|OfT`ZL~_flL%lUZv<z(TX;y{_wuGxsblOR*Nc zxaI%c&BCk1jzulw^7g&7`+WKRzc#j(cPx4R{2v4?-<%c}x{m#5;~Lo)Yt|mUv}oFz zmfaskcwS9?z)`8YQ`Af9#Z0c9Cs@<p)z^P$ywkQSYfFTPnBDxjwVZc9YoD3@e~Vd? z_C&{^>`tqem9rLa`=D@&>2xZGPuhnDKX&sSDt8|#EBkUKDu}Bx?bUWW62iC5K_dIe zl9d8lYwMJ@>t0mNb~w4I(b6f`fP4E|-B35y;w1KSEgPfGWOqwmF<Q(pH*wX^OM9NC zo{sYTtH9e<Ak4q`q>hw|z0j$%smw8++9|qEnAQ}z9J*F2+;mC0&V237(j~pC98a7v z6}zZ8<LjiRwE`xa&IrG*`EBuUnz?-cM!&c9bCOdXBVOI#lyh&zgV~`L7d~F&+c~l6 zLBtc0OukI3-OCMq*IzcVP-~p9LsfaflhnC^o|CU|Z&&%K(z$GM_v{ie-}ftLE#YID z6z>-PQDtwRp4-JMm9KRsKa-T`-?Q_!#>``fB@YPZZt?eC!c<)B624-?75hG=*sd*M zvt0I0?mH@a>$aHnvb~qyTV9w^cwfSD@8JjWKUF@IM+NC^_PM%ECF^(m3yXJq48;0P z<VzkJn$DTJ+jfn<$y?SJ^WRTw%iofe5f``oVQl4sg-7nZ>;L9mqW))|+WcqJoT9eI zSG$%>Tsz~*53NPtk8ECG+t6=)vHVoS;^R@%=fyuTU7R7~zvy}1+k>&|cDFU#Db}%{ z7mG7hwsfCe7F+a>X?x&WvG1!z_Z-Q6vfyYbPwl^dJJi>To1f5YpM0_EQs2aH@$aTc zJHKhnlNY>HYtM+9+U2&ZZQsSjz_5*-l0l$?{Nj?lTwDo0^dP7Uy!W@Z+u4OIf*rS< z`7I|V2&p_$D42Y2Tet18=$WzE<!?`{`t^S9Mn$GuF<PJwaM_<{XZLJBy`p}fDVJNV z#r0bYckVJd_xi1YJ^QVh*QBH7DEsIp-I>C{t+dN)jh1c3PS=8r?5PWy=V==T&h%Om z?iSDYpMAS^uvu7c5&!&k>+Sh}{N`RWyWVB?iKwLl;bDtq4_sPvv8p1_weM&dL(uXM zO?%jj?_9d~Y|GK)EyinQqvmL{&(sol5$UCrX7r)`(3ER`4jd_W*}jQ!aW~sFj;V)B z3VODgYHA)$^z)ngIc%+Vzh;QlQZ~sOi|_9GzDj1H=#u?q77ah&==Fp>H25cWIVVrr zqvxAfxL5uGX*Hu4UgpdO-xj=6oK^pNi=n8-+)ax+{Pb$2Pp0-J1TNFv82ffx|NgUU z-yW~LmuK(U^d#n~;_9wNmF@@2LoF_6T|8H*%zCi()QZbIEfKc*^TG<hXvnp2=xHo7 znb)QntL{2=(uR#QTnl&f94p?)HU0dO1r-W5UH99*Z}zZhdF;7^hp8dZKH(ihvck<Q z)$YF!^L3ALMK6(EvvKOPFUu6PJ#Va#`pT!STz(+CPbx(>RPj11-|pMbezWa;Fx_sF z@CJ{APnRufSIap)uW#SE=ZD48+K=X|9*Zhjs(5<B!%bf5HNuWcroxMp@9sNh(;w@a zQm(Ol%E``KKbWhQtA3As7J8ZG#j}UUjAxd#)r7hp%n4RmJe$q(QE^dxyYsHMUl$g> zUv58}BP^?Q`yAaQ!`iMS!Crai2L3<t52MP$ZFXtv{ZmZHw2}1<n}2Th=Lt_P8J&!q zpCGQc$fU5p&Wm~Ho5Gcv!f!I-?rmWZnbUGPQsiCcmxPDQLR#Y6yiff&Iprb01H-gc zB~6lBC*2Krw0`zEgWUc%OATi2vDDn*AXR_t_VI0RHfj3Y{PP>FVu<LEU697Yz@W%a zQC2BV&P^=9kyW;a-_O5oCQ$c1zAz(R=y2&Swi}0ecsz1cKR(#ewsc9gaz^Ji3y&!d zL2)e$|Nrirk`lOW66;!bh0KCIzu)biAF{sfxpjE+YQ;IPuViG+Uv04Tr-dE+t(oT- zbvq>QcphsqO5bp5$~Whe#k`3=s*~7`KAG3fqZe|{Y2Q=Dt2V;ZAOD|!+vK$O$?}bD z`t$AM`_H_OPYnL2aI5ECC5xjX>tyAKbZIryn#Z1JCY7*+xP0iHX&tda<bBy=^NZ(7 zvbHEZ<JxAE*zo_ENM~yFg}lU~nSYNu#R~dna?bSdx?!Lp((M+z#iV<KpIgop<#k)0 z%y!z$!6lg3z!qUVbJg`dB^QKr_66jybpN~({p+5^590%O?o1O%19cQOGS8J%T70V1 zvdPD)F4m;BW6K$?2TDeNTS}5vtyNi8%{J-c38B@sw=I5sN_!l5E9UlmgOnRPV-9cg znDl8X*S@G$W7+PqbG;@KHBX{@O1N8ooY$`ZRk2x#zlFzcQ4e>Sj$5gqnrlld?}-}8 ziq}uiHr4F?dw4dRU8RG~l>1fRKdV-L$V<C-t765%568Y=J0Fo{G=JjNaQhF-U;orn zV7tryW5VOMfHLPABWvGUhvbIU4-dHT6$n2}IH;%jS%SrP=3AbFhk0(k$qd@?ae<fM zHm0&UoLsSXXIuCEYueQP@RYj$RJ%&EU*)YF`uaZWS7xa%6z2BV`SWzi<9`#|VqW-M zJy-bPV*P10>!hDsA{g!`y;hXnb6hM%fB6!bdfv6nW|2xEXIHE7i_MGJkn9)gl`}m^ zvT-KYoEbmg^julP{pdAEJ<l$yv~bJPA3IrU=RLES;5*aqZ`|coTV|Ih1b<**_fFHy zDf}S&YSpoeC6m8g5w8_bTOKmCc8TS|)Ac=3(N!6H{8vdHD!lVRBL08V`Tl=rbB><6 zJI~AS;?7cr+!|m1h*M^N??=~%?r<-;Wfz<+Hc4^EB+veX8(XE1i0oa!bD-zQlNnMS zN~&pLt7bFnZ(g<b%EH?R<fp!1GoQtA_Aqz-ahsk(*Q}b8A_3*sw(TejJn-G;%30<O z>qN5W$megYUiQ9sdEWc=Mlzf=K?;jz^|7tjcQuz)KYK%dMdi&iJs#5xR?Vmtn3J%Y zXThmuYjUe2`V3-c@EkN)^FrlJ?XksbcAwe)`83?+efmZ%{cL4W+NX@unnvO=+xg@p zXPta!?w947Z&m(5Cet?fm2dENqql~-*^~cnEA&4VxGQ<q7VBU88T^d+cce;G>o-L& z`4)0)S;q2IgNO4%61!Sw&+c2}eevXr-9k4vWSZSNxTgJ}lJM?0F7I!P>bn}f6J7{O z+}J&{+&sSOtaQKMl$)_!di<}~yk}guG20?ZzDPQF`DeblcS6H0UdH(QZLyXt-*T42 zw0qC_WuAgEw>kD?M9#IlF1q@Qg8ACgf{VXf9*J%(YW<Xzd)0f-tZz;l`;4tUj?TRD zRXrv9Aj>A_+2yk~OqcoZe`({dxP12w^BdDzb<)qdOCNs!eC^J6b&O%RG~9AOf8QSf zzmE|#VOf}K$570~z;K<i7C>=kURpkmVr_4Tcm8Y#fqkE~-A*3u%$T%o=hG=i1e9G_ zB&TdyF4}f5r?vdzyClxgzwhV9KEBc)F;(lz)QYo@XXneE`TDft`K{giS~i|*SayBw zvqh7_ze;2%&n@4w#*ITX>DqRV&MRuVBKf=##})*xt!y;7s4KSTk!#)#5%KW<t+yBF zR3DwbwNc;PJifMif2-^N{*22tXT48YsRsNsn9d!-cCR8hdGjYlan(HwuO2jB=ds=9 zR3U%v65|D_rq=^LvNg`j^*fTnnzr3=?IimR2GWaG?_t-RB`3x)_t>TT?$IYFMWr6S zw&TeyjeRe8rd{ZqB(&uK+f}dmU7Omk1^jPylb^TvxPo8v>NnADTPt5IoN%b%V&O&> zWnIB~;a%SySIynAJL8${<+w7F<fXEji-MmY^L$m)yTCwScBA69(~lSL+F7$@V^+B+ z>#dWf0j0i|=f8MxQm>~(=GF}9lb_F3y3Pzc5b<l)l0cb#8zhtOS)SZ+z}awS_oA0x zSvkiRS#Ur5_}AFG`KNa2gtK;G>Gvl;*t~mr%A?99)g1E{%{bfiJJVphN?XQ~n@O(0 z)AlTh{AJNE)GfM?Vb0bq&RcFP&VR#asT}^wx_A27hB?ejmndC)V&r*Kc-Dkt8cK&Z z2p>IqB&wydvHn%$#p&<o>X<j?2tJDlkpA3dH#0h3yqtZba^kj$={xJPer@afEc$Bk z4YL;;f4g51K6>5ckot}Pt$*77Gi>zUf44)1wMhL&rhr@F2Hn3bLb5wWJbz!7Zs1$> z@<a65X&E=F1K({s=FWOU;<}|}gr#s;VR^&e$?xpG9k_Ape^Ke;_*1;=*GAjiovFNJ z|GrJH{_eaRF?q(Cx4-jI(|FIWRWsHxF)&ndQZnFNoR)`cqH}A={e19%b9`Y`JVR<g zZuRS6&1JnUi#RWpRc~@C^0ZMcdt#Asam)YObY|U-z=)$d6DRCGfB)~kiw}y@pY*a7 ztlXTK9p<ZccEb*y+pXugqeB#YOp~r$<>=0oXzZM>>a_Av$O###E7}tkzRZ#mp4h2k z=5+GkhyTCJmcR1r-ed6L<*#3x^XJDW+}t}kS7^NpSKw;ZEcs_yowp8b*5KCBmQR{_ z$T&*&%m$@cyPC;wozf4Bi7smN3Apw$_V|+-rw+UkTXyXgyIR`Y4AJrhDK`%aEzC9e z`u(QX)S$U*ZZrj7l+c~F_Mk}A%%Fy8Hx{g$l^pi%hL_g9oD1!d1;-DuO1s@xI(2qO zvx}#4O7`p{8m~L{o8A4n;7i}#ShLSUnaiUDjJE!Dc_*^5aFSA-Vn$E!^Bc#ubwAFp zEdFS6Y}H+T&kbe@JSn-6W$s!PTe!rn`rb~GKKXf_i`&Gs13w>~?9-@!aA&tt=Y$>l zDl2?WnJr!9X2YRu#-E>FbMTpei0!`(%ln@7>-_pR_2Y{&n`G`wRdSuj-`H{dWZpe@ zgQX{f8}s=#*8H6Ih1>c59MybuQ;JvZ&d%p+7-}}0{;)Xt=LYxx9&>Y~Jwr-6MZJ<e z(^A^?U$FJR>5Z$;?u_cRx~A3|;FG=7^NMuD?sGF-Z=b##ruKIptMB6@Ta(=K?^myG zVyT;>+11x`<frEwHm}Q5Of&or9iQuXJNLBN=?u}iPdn#2PuZ!tpuX5B{d<PrlANV3 zRu*T(V{Lq{OLA^j$*$gcdPec5Dbv@>eR4>9bzdtxf6w+!jV0WEOYG0TZ8~TfyW!}& zD<_M)IA^md-tKeek6YYer&w2cTSV@Q?heDpd0}~ciL;9)S}gC9cg_uFeSPw2(>~od z-<M6ibK};|^oLJMU#*`IR-ATq_v_SNRmH@&|Ix<it~YhW=P@%d+~=XBU0YIuuU#8< zJMXrIK<)Q%o>|jX3Z5o?UmGb>s<iauwU2Dus;Y$~vQjo`Ph|4kDJu5&``n2+?tHi2 zZJWv|A=Y+e=Iw`)e&^bwCtrLb(-swNvc2%$>7WotJBC{h+5KYAIj)Nt=4rLuxc2t= zk<?qv$9aC-jAryoKQ`@<_TqyJ?`m`&+?c%EC^Y%1)%Op#H>dAET>IHOWBVaa{eNyh z4ED}FR^OZ0nW<;9hcAx(Kkp}r+y$jme4IB1Y985oHAB<4xc}N=>(D0=Q<4R&TFXyV z8yuhX?b>~h{~9xo?JNS#-2BsaY@EqcGrwu7seIrsy$eAm2_+W~*gCy6kd<FFRV{R8 zlCeCfdwBP{T=0rgFHWNk?$NvQD=i(gJFeV%DDiCb>WqzDO+RXVw(iVvka|0H-PE{d zbD0x6itqLuyfN>--K_iRw`R<G=f7&n0^xa<$EU^Q2<UWe;mvuy`|RWF((KQL^S0lf zKP93vKyK46jamPFA1Hq*@p$|6fzzFY#8pCHr%8t#Tl>f$Jtj7E+0wHeN;7OvTng?t zy1vZdHQT#2n!c+;FPmn0=Kcx}ablPG_`)SM<P6WGl&@xe>+_bEpY)y7<9A}2iJjTy zLfvjF)ptiu<_Nl<K3Xzw&7!B#N}ff<8)WtGyL@clt<kxB`sWPS-HQch>Msu8>{=x3 zdpN^$+Fa#ZHxHgUq|zt+jnjWm{i$8A=UoVFc=*aX^J3fUn(lAMPu-6CC4P9p#jMi` zTJK&nWH7I(U8ZQ28G3Zhub(B=8+{LM-MTtgJ$H@HIqBaO9J{$xJLkMvR#?yX{i5Ad zuV*#(TNdujHOt_f_>3c)JC<<^%ZEu4<x{!6zt(<`%`yGS@K(`C(<EE}b?;*Zd(HXV z7w~-Js@;?uaj8sa_0}gBniiKnj7pri>*0?uj=k%SN<IAfneoD|>sRE8#meS}&We*4 zGMc5-=Oz5<Z+Oh|GQC`vz{SjtSC=)jXGr#HpZEC?*DVw(^~C;Dn5CDvh1|6Beah_S zW((ieM@);neeVo!@99`wy|QQ5xMVx^BOdPiBB&R2@%GLIk0)+DHtFS;J^m(X_e=}l zz7eUKvrP5n<aH-2zRcC(Q+YNgKlIRcu5(t;StQ)9Z+6`h{5<$Up+gr>`tLvc#CR^a zem*JJZ~U+5VrGSPd4-5ecY!^J--LTClJDjE=DahQ`O={NKR0UK$D)6EmLd}a!*n)E zhTuy|QuESrH1D<|ns*;nH+IN=z2NQV8DXz7J?xuRroT2%^G&X@mzyG-LjPB%A1vz) z`5t5>lr(eZ-)FPgjb-`OgY&K07Cz|+lU?Jwb$&|o0$!DLlX;3~c$D(JSn^)IbEsMB z^doR_<^reU35JJqLz8rZCEdfaO3f?N^YnM+^xR1ov$L_OX^H(DpW#?Cf%C&H4HLUH zU-^1l&1a_15Vv#DYBVn~i%4|b_V>yB4Ca%9z3H2pLY{Ga(Nk7h7QA74uV(MRzKw4? z!~&V4p7OpCc*P~Wzd!6n%d96?&RI^JYFZQ??Xw_^Q}soI?yN<-#Fn;C3w|EjYPV*Z zzRsNuoc~X)G&|3GBr0-c*2-@QTa_P`FO-(wva_SQGwu9Lvt4W}h0J|i)Vp(5pIpS; zbWkI+Q#N^f<)5{Axpq@apMC30*3tFg&Yb)F>{PzEw}%`qE#lod(I#Id_>>8&qS^X6 zn+x>BoGO%qcFy0jUNv3xd8t$G(<I5FZG7{?k`7;6f5m>|i<$PdeA~2_f3f*hmG(JR zL+p)aLiQyFpX2jRvnLpHTi(cU&pll_Wk;WU`Jp4PjqD~X&Iw+Vs_>)g^pEZOJ_5T_ zPcY=^<VtvNF1w#QWA<r_=vk@eUYj(Ebpj&W&D^#9vOPC^n^f>TIHACgakk(e%};MD z`%C{7xX0PwWqp2o`_|(6nDRq{)hher`(@XfHE8p4H`}*LD)#2SI<xmw`MD*k>E-`; zQ4?f<1at8pMh1p*Hp=Ro^qfjuizJVR_;%km5ZL=WoM*PT(4CZ*OWSQ#vsDcxf`#60 zsut?A?F*GTd7@}V^soEYMRp!u+ut5cWj*%n?C06$@)=g|-uvu*De=onee17;x9f5~ zdtPjh@_)YQ7<Wsn<CEOh1HQ$76!wQQn$BwWDg0!2Pp<T;)J|=knmzmfv)mSIdZJ+b zpf@n%U*4<ws>iKs6sM~)?OlB&;)3Ok*I{99^#`x~ny`ZBn<sbFRNWlGSyIOT!*bUf z&-7-uE>g?RezI-j49CSrCUZBqZeD-?RMFzFOD95l?OYxzcbn%Ninl1uzUQ=R>eN*e zv)IF|mH!!*zHT-PuUvoi&C*L@<_e)|ms=#ZdE~T<oMb$hFsbyI-_G4ub=SAAn|Eth z!S^MaVPZ>K_h_E}W}ANNx$Gm}6u;JI3P+yJ{G9q_mw>k79>&C=hwBY4hDMo5o}Jol z@GM96ywb+R*XdFVBJQ^Q{MGsK`gxxZH*J!nyQ<_47H{K8-k7wxVJ)Yn`l1t&YCJ5@ z4?S(M&bHsd{jzU{Ny07V=Tmq1PYkneYD;!kZHrjcYr-3owKXHeO3Lb%lIL#GlP}*^ z*S}jE%p1CWfpwJJpI`d+7SbluR!zGv;KqMW^&n$(i=nl+3Ck;m$QD7@{pE}DXDmCD z;ace=*YRud<R!dCn~UBi7ZzmRW5_&SEWTIv@<bnliFeT#IY$2dRV~fLz_5&>#8#e} zmj-Y9gVz2cPwejvIheN?l-RW0-l}#61ih6j&XUfUpcLj6u-UwOhT;w-vrWEQTW;0g zH(U}bl>2Sd3T4HFw2IGZ_h#Hov6#K_CQI8U;aRr(yhAn2b=w`JPuN|&B&2B6kr}O= zv-H&0-K`p)=@<J|Si7HTupT;bO(R9o_1TiJ$1lSRs;`x1KiOCE;qAkR)^Be8cZyDN zpXq!{qE)S7>%E1ASMo!XN;wpQEpsj&PiSTDdb>V)kBjsPzl=;xU6D;r3##V|8pbwQ zi!U?##oPM2Q*M*kmQ_(V6iviFKM;Dmpg8E%?%E=~wZ=u)EzT?qv^0IuC_AfpZ|GB| zwMsvy9%TsoSUe-=Q06b=r8jN1Dr_kVG7WlrFw<Y<h4*&GjN-8GGG}YcZoOj5xc$dX zaIR7D+~sHbIM_DtQ7&6`_v^>)J4^pYJU@I_mE{`WlIBG#SAA=1G7ptFVYNl^zemsA z(@j>o4WG}xHuHN?@=5jin|U=s54X;~G<C(SIW4}GbCx``s*L&QyQ5B(_2(z0H};E* z_bHkufB7e}?+9mnTYq=KTkiQ<0Z$(Pt~mHRilO}9emC!g_Y%sPnawtyr+9lWw#6*& z)K?5$B2(|UT_yISORv!5iT>S2jp2v2Pl#@)=l{|2a`#(?>lzuaB5&?JP;t&i+AFFh za88T-5%&wijfSrE8;uua7co?q>}j7J{OJ8o_9eV8w|sc3+Pzs&QMd5n;ps+SZa!I- z^ZyUhF`b~17R~opt=pLx82(c<(o&ITVFsUT0i{I{hAlDyEqns44nM!%Vk!UaRVJCc zSG~%fbwFxms_55Q?>H?BMEnz!lQ(^QUtY%Hy=;>$&)Fc6;(vec&fR~0-dsNOw8b|y zc}%0WW&Kv(yK~x66X~Yh1s6AN<T-e~V~wU@+?zMgq_nO?3nsI^UoDh8v1^9(LKTgf z=JLz_uiVzEC9NB0%sl=1bNR%}e}r#O%6Da2b4}<gi_=!e+yvcEJfD-8V$?Rc?PmKP zapBf$=~%f9ye3g*(>l3=CMsX3Ke^IiYLlhNvMaBokEMlY9F$(pk|XenYw}6M=!HT- zXWDcv1gBn13YPX+FpbkRqm%d5qF1Mjj!c`(pVBJ4BVKpUgOjs2iMyp2-*#BDL~xVX zC()iwtv+QdXLD-QPWV3IY{^`+RcwmFuXVK4A0Kly+UI)Vgm8Go?Au>IUfa2|PAhr( zUH!g|CJH=DO6Qr|a(!E6aG@Z_d7sDPi=7@TFN-XC@$%=<{X6;O7VXxMnj7Hb@yFJu zK=OI1)1gfnq6Ydr&%R%rEN(Zs>7wk%z(3c1Z{b>GoxkskQy0S-Klg1F4VDw~q7Q!l ztNp+xP4!yFi(eM0D*6|0wL70mu5q6=Nm5~9Z^`Z`rAf{&muzjnyQMyMiPi+ICr8>; zf);$^+pwVaQj7FGp^2#$A&WFlnx$B2?_hkbw@7d5gp_A5Gs-{Rof**myD$9oiFtk^ zXXI@fHrDo>FPl2=rr9y~*)o^@%h;WXJaR~1?)R?@bHmu(+D7k=3hC|I@T>oB=&l#8 z_w@c=(@dWA?U0<fY|pa#bJe9cpYGlDrd2QOwC&=#|CXL<z5jH1X8p{%8&hAl@7?fK z>jU$%gzQ~kUsbbyvArjGo-^I|CF|+<X*P~kvO&9R-n^Hcb*N?A=lQ4={>n9)W$Yph z468RWFc^}!unM)<MNaB(V{?mdTTJ@*F1~T?&xGSkHD=zqckgXV*{eA>{9;~j4BqxE z?VB*~#0f3DuAhD+Men@zf8Sl+2`up{fkK(?(*jKAb+F9hU2yTQ$pwacGTW!$li6dL zmaFQkD^*!oe@SfXv>>;)n`Qjtc0Y>S@rKXRHpNflz3Yi3;@t&Dau4<`a=1~Xk}KzZ zzxryu(mlIh2X$E9C4GAw|NqzY>+kRF`@8Y@gZI|Ie#?LPe*VjM`<L(IZxoo#zoof< zI-j)4LiIy(yFa!o_1t`aX)Z_kt>in!H{LVd-{@`FTK;%eR9V>NgD!44DzOJ2{AXl8 z_D8T=y=iW{6Hi)Wg5!(-!8bN0m7GdH^ZkybG}knjLoY>F`qr{ramy#Cxw{o=w0r8v zOsn7v5#V&b?zgxyUNfM0sqP++FE^eZJ-&JM?alul^fPWb+b+4eR)1QY(q6;v+LR^B z?QCBg+MDdl4(i@K>)am}mottFnab2`mZ=NZ=|^bnaPE1TA8h;TR_`m}qd#W-+ng(S z#OGMflpXJK{P@qkZJj0*m>sMvEAvOeJ>at7<~6rJuWtN$a}!@(!~ILb&y>$RznS-l z<J)JAI&+^TufM48f8u|h{o2v158ga`_2iP(-km@0Z<c;t{P*_3v-#=G^);58Kb+Tn zVr9{AUH+V1Y)s_*^L~Ek^B!;}zrFgIH!yoWd&jNw&pXo>C;Y#}X6nJ5q2zz;nq`J7 zcW1uK+SVyozl6AyX)s?o|2q8IgSRn<c4)0o5;1mrc0hj8qzM;<Chh(t9obs9?5K^p zR`B6ZAt6;g*<LG{9ei)>d(C9JV8NBCuMgjtZYc2Su%<@qjQ)*NJb5+u{&U^C{Xy;H z!no+mVnNrq#p5O%k>-@v{=g;`@<G$~?@RTJ_#B5HO?CHH+`D^a%F4J4{*Bv(FWi~O z9LqJW;SD$caV4{-OXW;Uj?ZRo(vbUHc33`Y3VY(BH+MO7BKl7XRx?NoGc9lYaAD3z z);&*|b~oKA4GY$v8D-#QDN!67T*35#b@eG(ccuAvQm42!T<l-vQ+{mrGj8DzWwIG@ zQk$+S=G))zkSKW2#(ee4G|dK~L=UU8f&mM+=V<K^->AVDBXo9k($pw!&DAfb%IBy3 z^~vg)*pj(6MLm&a>Rh!14Tg?I>*lRcbUpP~;DPFb@<>UwxhH3DvQL;AxQoH%*1sE* z@4L9zxbh_Keayh6rd%>zv(fU(r^31&ZH=12*@}`^*4akCxOT4RNsIdh-b2aX6DG^{ z70BONxW;=*@O9^cm}O$Ve~zdgcxyO&_qt0HnO_U}6!Mk!#a%qDxPAYkN#_l!G#32l z%~Ff$_<5oATRYov_u{t)gttWV*!FTr1-y~$3#=$9iD@ie-)C?*H?MT-n(uti1lfh2 z?^IMdY;13=l%t=PmX^9yO8n&2zlW6KgZ5U<$$S|8zFc&p_|XdGEZrsN1b*wjus(1; z+o7!GPGF~$*!I6KMMPFwPU=@PcvJo6*SE9Q1>b%qGt{&0_*r%(S!vtv^_MoDTNSbK z<A?aL%VL-0Hoh0EPQG_*?Mu0h>kr<R+qmAncWPi^*EPXYj80FKUz~ci<yv52-+#`J z5f>xgf4sqcBzgHh^)iP3xli5+t-H8jW@(FdQsBX`2Wtw=xc+KJ7*07@$GcT5D1An| z!r@&Vi=5WBesS4#<s+kDe5^Bj6SvH-%{8;C9doU(Ed9Q(B*->OCS`%U@lg++N#A}t z_HE(%S5aG9_wnSee?~iY?Ax?X-+%Me1-E5GgHqbBoRX@rQQ9N;&FfW`_mnHDJL@#I z3$IdZ40vn4Ot@0v*mh5WABi%O0ancJx0fsl`Sotj{P%Y=?=T*J^Zd2Sy_g4Q>||37 z0=G-|YMGvy6<Yq@EBDy#x{r@t_3A{jv;15Bng%htw8=K>Y~gFlR#^AGUNuzYx{t5Z zI+p;IE3qmS8UAY~R3{hSNG?CreR!rQXAY;mO~^;i@-Mf#)QUu2Z>!AuzJqPr3<mzo zN&C(HS>IR9%#YP5d+FSrc0cNw+4GYLaoQ*Eer;K4?w{)M$u#<|>^-Xqo~t>|cxLw~ zF56dDC0^Zeo7KqtW9x3VnXj47<W&YIWX3MIBAZ{mVT+vUHV&PiS)BzgifxA@b-tLG z*!}sOUFG1g%3#wbhxU@IL0VIjK6`AaS4wqlc`d+JubBVRWpkIJ%!iMGu_4umXKkA> zP5SSmnGuKYt<QV)+V?B}q2dE)n^)=2vp8h+c2lhV$7>s2h-T?7@q25P@Mxyg+Ed#m zyKax=ydha~OXNxE!yUJ*cH3$AeOxrp@jKJk%f%VF9umK&es0@ekkw|@JmWE+!MEro z(_~NFW-MlAmMD+5DcH1o>mEfT<!l#Ld9{7nKepSd#VAO2M!bD-Vp^+s;AOeUXVqD1 zjgNDFx1Y7mIb~QAaBT9<w{0?it3G`<=4QM7;EC|;BI_@+H9nlHIw;?}!LUT%h2eWr ziRIU1S&_wBHBZ`a{d-s;sr!sK`gwkRa(=j}|J|!sMDI!La=Sjo+ONZC(Q;<l#M2yi zKUK?lt$FM3e`@wjJvYtO7wW?I$HraTbZO4^JKcfFjaI@{u8K!EL>3+^ahrZ_dD(K6 z#}ll+`_H~wa@J)3-M-Il)wkDN75h;3tz)<4lM*eNlgSUy-P=52R?oNIhidv?4Rsxp zEA{vMymCe0(_xd{3n$75DwrG$d@gy4&*<EHR*5)m{{q`m{XZ*v<4!ESF5GXpJ9rB} zXPx`bqYZ7L!auuLrvB<ZzOw5y%P)?pb3J)V_V>Ta_Evk>elmllY>nG~P4T$B^?V_h zx9QK4eDwa5c<c+-r3-ew_^<P&uHjsM)g~dg--~iyPFXhTiL0gknT+t)8z;3coo{z; z&9issO6Pf>-<W5A;>NBSpFY0YXdnGZxc10X4hIgVkX(-$3b7TErz%b{m$96Gr}U%n zM^~r2<jT2y41H4{Y6nU0-kfmBS$Fon<F;4hkABvlUbe&LJWu+vLI%Ot7xaSlUzmRA zF|S&2?a=&mcW<-R+@B^GEw9`>*}#Q8W^c@~C(~}E`f=yK>@Ha)A;J}`|G|Vw&p0IV zy8Ya*OxJZ|pZe~PI2TjCNAshu)rw!?T{}Bvxtv)(l$C#bSW+<Kr}^BE-*SpyuROkO zhSb?QCZ>&gHnX;G@H<p!bTpBbZ{Bm`D-V~kg;ziPr!Od&w^uuOv07ZY=3b|@ty=`L zuS&lDG{tzC+UYYKO=l)#2G2FqoUL!NdC{)uFo_*YweDo>EnH*baXD#wm52Q6gL}2s zA3xf-efJ6fqdEzb|E=2AwYKB$HkO~YLRx!LG>*TVw}WYuHse97*bS-?XF0-S$}M*q zXQwx{q)9A1^lsV%#R<mRQ;oSS91bqtwakB^wUD&W+!JqtS02(ov(9|+HK(dJ)6WO` zGq~m6-R%0j?}&wSYJ9=oB_)1*&x{VrTwrv(@Y{dKYrEz5ixy5;?ou&P@16R@j!mu2 zHSvWpnIe(**5+*K6Xa@Oy}WTk8*A0ou#czX%Eh8NUgVwqd&*x<D8g+0)w#uIAOAje zpwsk_Z>8l~_R~`J{k3sF)=ckWx!~YlIr)j)%ZI(uw>KS~72r}QbV<*=>+!?9C*mtx zZ`mI%Rn~R7e_YBp-TL{hg~zVVFo|}_eQc6HFKe$<c-F0)s@0rZdoRzqdB}A4wxG); zPWf9sk6UF)s~Zb3Ouc>L>En!C$$8PiR%{b8>eVl;PENnQ;MleP18bLVD}0rAPAuGJ z*TwwCnmLbM&6jN})Vg9)e$;IFu`Sl_ZY7=8%X{7gS8hCSo1X1<v!ZV1EJj-|<ITOL zY3@Rox>iSg5_w<1utN2Pv)QCWr4kQUvfDLxIUlxKc6@oOtL%4`IsZQY(CB_X+0b-u zu-+N&<fzoV9Y&hHnMXTcdi}g3XQmNXa@OQO?;YbFy8!Kzl~!)Hw@c!ptJBR7Eo)lV zz0F==L7!A`u6j~&?15cnbEnSPsr&IsUgmb?Rgsq#NhQtxd}HFDX}Tr0S2@LZixo1Q z&EDhD+%?_wkMM_Uc1}9hZBvEWcr4ef|LUhCTU;`2LEo(nJjd)gj)c6=uUm9=S>?C- zzE3fVUHblQFKf4K=vqB>=Gq`P_V=Q#CFSYH_I?#VwE4f>+j;f7S#Bq9$i_=6_nuyq zlDooodtoBuMe*E{S-THs?#@X#Tlci#vdNk9jqy9r%oe=YX8COM^+^4g?YFqMIeiYf zd|-L@^ec6mRTne(zPH{ykai`?WA3^qX|FqMx+bkO;M2S~$@`v_+>$<Z#Rs3%ttZu9 zT>oz0fx}Z;nrCb1*=&6*c|dS$V*kUubek`chwRgSoZkNOLwRkI@w}rUi^P~57^Kdz zJ<Ra$kkxWacfHcE{86Uc+tj>G52vqwd2{dD<BGqVa{sQh+9i0l_TWBt5#=fE2h0{< zb9z;?wlLTG{=&7}zgjh(ysh<Yz45)WBTRai_s$er;d5)<qPm&yUi{S*@?Np=mgI49 zDeF!13-6q_&|9!=eql_%)a~;Y)22RWvyRA1REaRpQn`?jxyxy0XqkQciJlIRt75O; zu-_C~?It)ejloEE&E89L_x6U~p0WMb-HoeTdGk6$y^s2+uE_NK_Grx`|62CL<#|_y zs)Lemh0T<z{$w$0)u%PROCulhJP0y4t2NPN7L%mM*-IboKGi4GGBJF5dTrOE%U|E^ zyeVWo{aw|cNA4eW1Ftov$%Vv7?^TVSzx~KL&*z0_56iz=v2_AZR(#&dovYKu3Z+gP zZ2P)PsNnbRlGr<eZSIR6ZerF|Kl4yGKJ~*#o5}2)k%iIhe$%D2Ln|v3H(h+cX<6m3 z_W3LB7S5C3yz>2ti$3oUy6@#b*RiVdYtB~PjW2GS21kUIua*ml=2+3PaGT0|-LG#y z7OMT)ot?oUyk`66eLibjudH=GYMkKcZEX9^VB$BIm&#jbPVVD<n)9grlXTv<vX__G z;+B=^ABwp3LF}L4+Oq#Xy!pCI-re2&m4E4bt0T#Oqx-F%=uQ^cy8Yhw*v9nByGj^- z9_8rY_jYBhSIL!>S+~Di?cbNbefkouS9wPZ7?L~pJ07rgyX}1avHfPfd$GaIZgtGw zn?skiy%RdMmV>9qhvCy^mS=IXo6Py7KYugoah|q$&&1k%8M6nu6U8?r#I0!*o|N@_ z&Er{Cx{sG`PR*!vSbXG$P>qH~mBHy1%ULbT-|b9)zh}O&!-W0!wo2VjsnOc_{H)T& zRac@sVx{N*O^sX~a9fb|ex--mT+`Bap>MyYZ<PNn*1N%Z$^nm#^=VVKiJcNMwPLc5 zjl8^B@X<vv$DYYT3a2yvU2cB%;=$}Uw|4XO*TlXseR`@`b^gjnhHp0rE^;_AJ-=nc zEbEjOGegI@e91iXeA^2=znoF@iAie~a{pxbTRy1N;ko+P*&9vl7d_d}y{n#;^I~@F zv6D|V^q1-Q-BkRyO5=rhSesIvfP(hN=JjDsi}ra==gIK9$RoKjv%1tSV&U7(i`GdT zofehtwbs~9Yt4z&na-B;mh3D|s|q>0_Gd`8yIZ$oXOipE<x?sjos77?aY^|>#S^>M z+`9ENFS;&s{wIS^Rpz>hVRhaj-*o2|T$bCmP<fAj!PHF>OSZ^?8r590{Vtv6=a}_l zo$ylaErC|+f<6c<{wln5`(Z}o5)a<<eSztcpFM89^fS7(x9#>x10{(KK2_5#?(tO4 zh(B`W<;0KAD^B@dnb)%7wbhl>z=dBXci7t5O{%l4I?9u~A}Ll@u=wS)3kB`3;!86k z`*cry{J(_7WP|X+ubc`xH``>UK3VbYuj8!WOk1X1@=E=p^pQ8HK0j#P`PJuk8h)Pl zYu<|UuOG~|(a%^OU#niYIU#D7VSu{9j%hyGGmUNkoB1ZSRB!(7+rQ3G^V*$7>ogZR zL}yLfenV<&cxmuNp4<DcTStq0R}fQ(o@n`{fZ^f8-A(J3?LU3%(*#~&uB9_Cs&>2z z@tMS?WPHZ!V&<$zg0oH@&UDQ>yQ2MKuEZk6D@iNVuP~G!nENr<h+93dLvT&W##37_ z|JBk@sk=WxFYkBetnyRx($BvxF8AHcRwpt&C95utNAm>7`Qv|9sF&W`GQTEB{DNUr zrqkv1db7B#PRz863Y^0;yC_{`1&5kPmzC+8M)#E^nvGXxJfEP-=ru7;CH?&``)~C% zw`1l^@Of+||9M5>e)etB&vW_stao=O?|M~I^rJ5E?3IVVt4fxCJ>4F;a@p$T$8wG5 za4g?=PwT44<Isi6jvaqC-%s?Q^qKsZ3(hrt(0M3$+I3e;nq%YnWZT(~cCY*IFj=PI z_sXM=KUo?dNXgDP`}4l7lNA4o#Z2NR^Cn;P+S|VS&+7Immh}l2HQOt~AHRQ~pyK$T zeTnXJo~jw?Qx-Yg5OSM8tMj10yU_Bpp6eIAQhmbQ^_~Ba_Bxq1n>kC{mpiZPxg`Jh zb-@`qWkDxZk=M?NpIzdYNVoi(z`s=c@k}N+5ryMU^*nw}yZ&38%2?VOBDXp4pLXun zg$>hO?&daT@gEJ@Va#pyaN+vSlr05eI<_7TLOL5+nXE2-Gg_n|u|Yn?{ouZ&=PQD} z;@tnp)upxs1p7WU_ggFC|0l)f<@d|y_nvfn`=|Q0+Yhz(vlj(iz4v|M_hoUsr_Gw= zLb#{fhYPia=Kd41&Frf341DF-&bGwj#k2MwN|QJjg|6v1CA&6i^-uLr8oRmI2i_HB z`}=3^-y@zIeRk?z>b4imN^$?3y`I^q@4{V$mY^x0LKdtlV`njC;Yq%(#gij^fvK{1 z*4g;SvC?PP`$puc+I&3FqWytw`JwQuv5cX@)2E$Is_B}%qhZI36@3=_eYLMOpEu<3 zs(V`;Hc8jJH<zQR<-%sel-bAnd*5!9*i{z%GPLr!<l;RpCnctaxZPc5VEXFn?3m0K zNuM7F1~8p@^Iz*{z{?trZs&I^cPk&r5}C6;iSf((7bkTkSXOd8Q2Bjz<=3BYo_u+8 z?9QdU%;$$Tc}(DYAeeHb{=YQpP@|2Z^8MfJ3=EB`3=AY5@={`0Qi-_N4m8pT!mxq$ zw^G^tx6MB7u4iqm*|EE|-2B^CN8#<Pe|&nXQs=LI%Y4+)-TTU{?M9jtt{ls|_`lBh z%Hb*3&t<<gVV~l$=h>MI3w^$HjrjOEc`@ee^iQmGJ9u`>8MD-1S*1dG>QbWH<*wSO z*m>O8b?m&EW2WbkB)uIEgEE|4U3M7w95qRK^4=;{vA@zoaQAWFu9V;XtAkILO$sb{ zeY#}zkGrQPTsu8oU+?z$`P*l)*xmm2dH%Q0+P{A`>1==h*lYp6jZ)n*mSA6_>E6qD zes-#BPg^tlT7tddk%^qq%<tZHc%ECda{r@QM{E*V{w)(>nQUmN?dH~HSYqfo^^ZQc zuilGUd24T<m^9I6^NPsl+olOxNFVf&Da;j#Piu2k5f;?w=utGe_Une0X&xv4%nNHg z)gJ%55Y4mx&-~gAzWLrxnmpo?;^jv?M3&6d-<vD6a!zS%-m*(2+Qu9gIhuuzL<S}+ zYX3UWkz}%|Ni;j!mha}-SBrTUz5Q>HvQqKR1Pkv;Z`s+uO4d}J`g1MA=CNUh)MSMZ z(f{-}KUAs^X6a2YJHFXgBdFWpq>|gdUf=4OA60fm)$VWZ`@^s@y7B&7-wz9=vflhW zyz}~8md!5@#eaGJc&7Xw#s`7Bju!k=b~z@utHmnjm-$`EqD&Kp`_lX5st?XiEH{|L z+%n<v%s0ROH{8}d^yYKHZ2teH*7Nw;j~qK=TDQ$p&N9V7rg!f~`*~H}_O9EO7g?|M z-|v(6{6@6;ho-MC2jAXq4UEj#XU}UcQKv1@CD5l-XrBHsc<0=NkXd{)_(c6T^879- zmA$#kCHi)1*Tb8qg=~5>IgN9l%-V2><Gl^X`6VwqHmh7({(0qzYmPe>c?o}dB`V^> zqZqI}k+-=(%E^;i)$@qS6wz%}H^Tp~Shn42ae)4WZ`bwh_6XSZ-%VJ+=Xhq}I!#mG zC(&%1*=IShMu&gfu<rR(-GvH1nzy;QzVr*dtJ!q$7GubioaRlXtP8yo7xH{moSI}c zm8n&s{G?gz)1~TLDvs}%>uBb9y{D!l$798J<&Qj@5^r~;rp|Nz_F3%@cf*VCY?qRc zs&^er*e-6}U%2~)ZQGF#FHO9jyiHP_x>I4@|5fS_6Br^t+*r?(G5=4p{}r{J1q`y) zFQ%R{oUm<~RGF3aQGthFmp5<xerwv%M)R+2Ppm)fsg$@o_x$etG6!}4tTTUcj@|vj z<D(^)z8;Tz%~AK`bB@J#`IqgVu7wu;F>R7t^GriyqoA4C#xv*lNu(uQizw52?ku7> zMM31(7J+`{Rof~9BE*c3$}iB@_B(GfpVi~m$_SBw>5Q6@Z)(DIGM8@nSG?4~Xs^!= zX76uHR=jyUqah?y#o(G!waLykIpWN%GJDr1?v7o&dFiEtMiU>_J~wFP&C&k7`{kRk zty-Za{mlFB=$75ITHF;ZYi^vyF!yt-cHW^QyJtjuerfdGte%!xWl%G<Zca;ZLb=?U z?w2>7S}3=lNDR4t(zL+WI3|C2q?cvOnR8eBIdVL%elQogk(c#jD{H8T{iX{Zp^GOJ zuDPif`L(KO^Y&v!n&mQTLYGQp&o7?Kr@Sw5_inC$;Cq`N==Pt<n!cmUcDB0i9GQD} z|9(`6Sn&V5@W)(1rsK@qpK~_OJIxxlX4%~RyWaUr&hL#bFL8DYKChmfZ!-6O$;Q)a z-1T+0zvn+ceAK<jdToyX<Fcsvbu;hq<)jy6Ja8_o`Oh5u$Rk&DqxI3UpKCnSvh|v- zWc<7Bc*b@^HOunZ$^Hy#^@q~hYZodwUvZe5JWHX-ZKu_W4&6slbB}K*lijw`e|uj5 z-+!lNLPa4e%ipZ*yfWEH^Kii$MaE~E+mBfNloPbLZ$3*lR@P`wo?XY0efJJt%i#$1 z`gwKUoQT@S>74zY6CPdKJ=bT>=1aEs_U62;Sd<bY#kB0{^*=8EG>(}T|J#^<;LtPG zC+iPCntUw%vDw`I`2M}`j)aNd{Wsx@`rX!Q``_xPzM14L|N3(J$+r$p&i0oCey?ZX zjq<VX=iE52SmX4|k98XtlnSRXp3Ysr#3VF7G-Q<}+fGqW+bK-zYgGD+%9mT^8}un; zZnNxJ^wFwg#lld(x6b(m&X;R^b40G0gz8+`zwQ5C|H<5;7oM>En8)+gb<s+5sr`J* zjC=kiSV@NHuMtb_uhy=pi|tT8t$sm&$=qYc9#3t~WmkEuvhogI$s_W+>rP7N!^}e` zc(1l;=2|nnEjeeKk-3U3p>wj|Q4QgVJey60+2YT6RrC5x4u2XevMn&;{OL0VjKRNy zrsN)A*p+dvD|JJ0oZ%zS0NX}qIY0S2^{#tt@hwW*^p7$JFKhFj$`d(7^IA#7!>_^% zEVn$ot+w#izfBEWUi02h<?f$ay{%R|bjiaSLzbsW6)R-yk{8%_$}KRzW&LEe;Itdx zBhy{ChI%~ydUIA_;`<$@jJMgoy;b9S^`bdXD`dmDmkt+|D`u&R#5d|MjAqR{W#+f! z>n6`z@lW+n-Hx|bE4#I(=1N#`Xpzvo=JiSK-4g^0T8_oXZCM}n<kHW?wuvcfTO)6j zGo_>oE@kQ89@tm@>qO0cx%YDSci)_QcVF}hiLJJ^4AHr-ik7}QrFo?7$AjRnf8)L` zQr(r2Ha~AS^CPQc)@S~_nyqGWVZwHSsGyJ5dT*>7L$ZF)mg10=dMxx`bLx-V|3Xjd z@ma*BJe_sx#I+A5IrBwt3$Wap5ND)z;p7fa#@O8!$tAJ5!g8#)oaVIM`)Ffh@P+N_ z>@PN@4;O8XXT9NV`e!2Zg-752qivYX^Q;NFrpv&f5X4Aw3!?;I3*!y+w$10^3$pAh z(!!?6cRnwBoU`uF1lwJkQ|B-BG%7DubyiVHY**T;VzI4g>i@coJsbg74x6pqxM+cv zFt@_&UbYMRCQ{Y!S8G@2f4jGMRaet7iP^_ga{II!!vYO2_!WBDUfKKN%eN{|w<?)X zmLE#<c``jDdk={`yx?w<q9U2pzhHZ&kB!w5xwbI&C=s^H<!4tFtX`s#ksfH{`y%7a zg@gD1|4aN{Q2&2H<B$FAkM6%ey5IfLef~%H>z$il)?_^Yq5U;b-`i=D$%R-G1y1Mv z7ZQA$Je?=J7H7(R(dAQdJA=<N>t$xXPq4`nM#n$@4WD(mIv+X46073Ump{klzlz-C z4!;i}JknAEQ<fgd-*G{0;`w%|RSy&AFVk7r+#@KTy70U;N5jt}GnRbb_sD^Jh5Ml? zCKp0~uethi+pN9u)pN|22S0IDT%723STIRY;nIZp^UMOKMBLxH(D3r*%qbr^Umc$E z<VBC6uxaw2sS8>X;uV(d)BP3bW`1%06vxd!&VTkeBaoUggY{s^Q_tALGr~^ZzqjWn zx9q2Re1ZG#zy4}>f7`CV{eS<>-rw=nk8A6Pk{7Hq{V()8msy<1cwm0q{^?fny>;*3 z1#{nf@!ijF{R7+OTkpQy`p!x{{O|0`|1;)(T_9<|z*4pM-%a1=i)wG~-}!cHzSZB; z@xSfo-}$<GeqMh5yDGjJul>XKetR3by1w?(Q--7A9P%F&-6xvQ-==qa?!V*LPFB9| zyRHx-d-0nYLzJj+uI`0*QUAZLti5jKUUlis-8<W?KCn;P%szL!-mST2KJD*j6;>N= z$vXa})M<5cZm0oQl8VR{`Q17vZN3GYUZ{Ba_1rJ{og#`SWk1I8tZhoFs`3lcUud`@ z@%;OBcZ1h5Rs{+a+~j?AH{#2lm0!5p*ck;6Nd>QyXo~4=J3Pfe@qcW_1&b&CS^|$a zoAz#;@NCZZ&3~$$)-PFD)5`tjnNFUli1T)CFDCo7d2I$ZLZSA58rE%|(x_E>enxwl z!*s(cPQAtXdu^XS)n0DXqkMer@s+FV+axuXt<E&v`tX@+BnQ``L%xq#F0(vyUZvjR ztW%L^nYXTW(xXhRsYgp>QXBanH#@KUu(U*^$k(jnP#|;R+akU#><cA7f80Fpd3}4$ zxlhX`2&_z~JL>3m;T_}rFDJQnEVS@`r15mx!^tnh95*g_$-2hvVAT1eqGw7A*C`#V z=}Bmqwe-TOL%cl!7leWjp5>0&abEt%e)A7H;s5Mn4_0)9R;+og_d=P`G~Ty7c)i?I z<M%fjKims=B(dbq`*-5~+k?I|#y@D?l<({!|0U$sq?)gO2B)9iD_#&9kR=?pslL`b z?dun#@Yv_R-M?d{wI2yB&=2Xka!hwR_o`lQwrKAN{yfcto#yY<Eo20roch(w|H8J) z`e46CpPb6F_7}(NBkopizr04+Txe6uEq~4vo_aMpcbYOvIDXu*e(`=`Gr#rO$_uNG z`qpfm-}f@$M^nzO$isi<CAXBxDm~{|=eTFboOL1lo^Y#+%iJxTVo-hWoXJhwS(zor zbC=yznmfUh&nhTFmithP;N@<nUFt`s-(JjCl^>e3+~oDwU$zoU(q|V+E1zvytG2vs zT7$m)0sbFGhcjIEPYSqMI7dIijkBX6O>zsDSMH@X%a2HWm@0g)Rp+LxkECa-@3LRI zb51>2-sX3ntM``0{hKo?;&<J2Ic=C~<D5IocZ;X)S+;&@l{u<K%*tLJ@#@bfU&v$m z?r`GjudSE#4Q16Xy8Q8(xwSXp*=d<OEouj63O+S+aSF0iircwlUU&3X+r3H;J9<CQ zJGGB>(>GoBkTcU;cZX#g=JVuh3ES1ol7IcZ*d--=h9u8#UfZ92XQkhLnO*zXja%er z+bm`igUQLycs*|=vun5Si4u$4`?$&D|E(xZmMgo}bQZ?_(uv%n81&+ZkmKYN>Wyhf z4mBE0WVw*@w9Y26-#Y2_+kdNnY-Z5CKToV{+9y`dcPF1p{b#A{vE1+3sUM>Fz$x;? z%z(XlT~;Yl-}WaJ=xMest+xx9udli8UVrC}6Kv+f0eK=mj|+?Sws3W^<{r2jDdE-{ z?a-EEzSNF!PlU+n{a>A*N~~+2y(|07)0JL(!&*$Uwy(POLfSllaoUrFu)Ap=3?r=d z=PY)$Q{!0H@xduWbc)qaiMdCjE^YEKGF~a!skwR1RLj|{UA24nEWav}&ieH90)u_C z4NqnZT$8m?)ZK7-ex_O8IhFaM*W8}9&Ebfd{e97q_La9c)^XkBp6Gl|rQgCL@1(-M zf*&%6VkDed{4Kl!9rhn+yWheV%((4f^fJc4`st6Jy?n5iP3cT_Q_Xw!iS5k4q(A<? zb#i`D?mo|1ydn<@raTmEcXQJJr1|FEjdMoN_L{imI*W8#9N^g#_O>|XjQqdtNx=>u z=3cpQ!shNA=Cw_acIZ4!&%I;9wmYrAXM2|FqK3T9Zg;-0RB7e?+G|zV?9aJJVAJuC zB-7TynuZ_S^{05t+g(U{*tOSx*0p`tb*Aqy+R@vlQMb}keZIr3S8<Dt-RdHD+Quwr zPY=_}bL!|eEUj@feZ1^dtFm^V%bvB}Qu7mMWzF?qxBB#Kip~+=PtSSS=RB-?75hf6 zW<qyIaZY}Z@SBhPOSk5;O<D0`TZ(Szh2npqk1VghNnWNIzjt$8)y9gn+Ar7kl$y6r zv@V<?F1JT{!xE-BMaDcc%#Pe@5{`2V{8c4%aMhJO;eSFc5*(hEGj?s<^yjod&C5$Z z%0;J+|Jm!PvfV4^ljrOsS8}#)`X(g*Urjr^uQ=?}-=g+%!6??H&+cYjPAXgNx_0Ra zofp}2cV9KQ|89z$&E{y{ijx}4zCLEVW&XVJ*4g-1PtU&$6R6UD@T}_bzNPi?K{rJN z<||IG<eZZ&A;vr1^zpH9&4a?y=CTiWFbgZ6n^Bcw$9P@6>-2Z|Ex|rwJ3kaj-sGFf zdN)?!^Sq*E%W76AoV~X?@T_gIo~-KG7|$2)^k>YfQhE5gE$paGB)3WByT?ynoqx>W z4XRvj2kCwmTK-Y?$g@8exB9ppUb!@j>-Nzf`wgWEtxhPYTIe0G+-J4#xX*;LoB!qt z&-tt3ey8ol8sR?`)wg$<MT!6SRlmt{)NtmC0)D?G?S@~Ey^zbO5PWcv?@*ykz*FIs zzRDNp2Y)m=m^0;!#=?K^CK$1aelk&6yxU@d#Z<p8%N+-ocq~kQrSNh)ceeh;{5PV} ztM0EboL$J9QT6mx8?Tp^^fI<7ytNaAUit6Z{`d6mZ$Djkw_o`8_}@XF*FVoby?ZiU zC5nIhthsjfYWc-CUK%ZqHDG>PY;q>7vaI{UG@Z+gl8@J$oDy^0kk4U#)qR>k)i=du zR<R68PnWA6e6_PA<^{`&saLh1aJg-4y?KlI?{kCam2T-D8TzlLWaQ^~9PW5~PTXR< z&8fwG3*trk7u=7TJ6rknUES2<@_$c0F3YL#FAz8rn%`)Aob%?_MV>lBaUDNahp_pc z*2ubj*|}cXNF`UxET%0`Y*uc=Z$tH$=ZwN{wrxmWc(iL#x!X%+&Y(h_3EF#u_8;|m zxxJ{`i~U4Hmv!#7<DYhjU7wy<#Cr91@50Hqx0!@itW7^0?JIBcc+nKztYH5IyzRa} zWq#d$*I-n=xWx9&jky1O(QUmND(VLc7oHQimszpCdhX{0=^a<*`JTO&7sbfB&FBBz z)U9UyIU3IrKk-a)&`v(PVVz-+wag?}=6JvFHCBoXI|Q?)Jq~k>Z2$K=hINPE-|h3y z-2UGr7`y9xkbIt$z6R^G-BM|<Q+9BFi|x|duvIyE;(d*SZS$qLcHFt1xF`B_@&Cyx z59|JmT~3$FxnD7_`=YoXli>H`oe4@eOO}3d6j`t`_j_&WHz(J%Ef<-&l-{hCk<N0i z)CgLBaYDHBC61+>yDvOA@pDh{9sjqPtV_-K_?D~iynm*m*k8pRx25B;po5}B=hn9D z4@#4jrae@P4s%#%c4vw1!h*}j!kgF|_3pbU`ROg~;ja3cA=Q1v@aI2g&Adh4na%o* z6M8mO$S!-qQa|y%-vn`&%$YH<{Wb*^!7D==G8glGo2fW?@)=1z*{U>o&2~rIvimxc z8L!WF$M4{|*sOT}inC&;-ED2%yg7Xy3nzycUQ`bL!Fc3opG3&zu*abM#1pN)<=WTG z*MIhu_W9l3`+D+iy`WB+c;>wG?O|_c?DNZrUd3GIulaia1DSVhuNxj~Oz=F-cEz%D zwe9R62_B8v4{o#`V{Msg+?3sGZpiuekKoS#UhH$N_XUXGs(t-s&-Uhfal!hXmoiS= zV?6QOQJ`|qH<do-PkEj9OPos_N;AU6mR|DES}itV&!Ne?{u#Kw6xBWKyG_S^t=*j+ zx19W+Hr|Oh%?tQ0{iBU(<<}L=yFYJ;X3v}NU635Ohi7Y5p><%~d!aj1oNE@o44oh6 zFBB#dykhaaF6CWvckIqT*mkPpT2FML4{zS;o)^1xW;CVf-gKSdvwlPGf--@Ur#B_k z^_VT@-TtzZ;nb{ut_|PbSkJp1!jf^(?)!4lUz)x$yNj~_W;b!f-bkpO*Ywr>!rCYQ zJ{i5uI=gG?jcmyuGuAGO&z+U`)n@N1hP6#W%c5=l*RK-Y?&!$&{ASEF?wzI&(^3iy zcb?ha^Xm|+q>Z}s`R(^3Pwm_w=Akciw7F=drN;CbJ3^wwQkqna-cEZvZFabc%K0ze zIUDX=iPX9}*QuX}b;I5eCHw9RQ&d`+FU5N}zeyE5wa~$&A@%czS9eYwxU6w|PswzP zuN^zeR|c3UUpmXJ;+-2Kcx*k7Woz_38~L54ENxRCEjxTfjPv=eg3mkbj{nLOIJ(6D zP>z!jkLMi5?bfq|_R6ZuIX~LS_MvLVu^2{?<JIAZd)FIQS~^O!?w+!q;}z%8O%{CF zFIV~>%5ZXC^C>j^-sQjH7cP6KN1C>N50O1-cG)}cWW8$G^`opps~?J~3$nzWs=c5w zXSKxD?VB=gJl82Z^8dPRX?2ya^Tt&Q4~~6%wAa@|%HC3UaqevWQ};s-_+~2d73t-z z{<fuQlh&3<ciCIDoO$_o8Go!!DtteWJ$LFRsV#?GDipVbo?dmKYu(mOh84FoEY2O> zpT&Jut}ROSK|{egr(es%uPJX3oARaj`pf5E*IwrGD!j@s>3OFw@7OByBlk<od-mz( zt*@Ueb#GhusV{r13cEMP&-y#%{C59^26^|II*!LL>1gjr5l&KNG6_G*yVz6AK<f0F zzxQRE?gl@zidvk1aBGO{^QJGn8Qn`B7#SRMIGAow-REGJpWWx?8uy`RY3wvR(a4kT zK9d)pnzH5TDwmBHpRG;R*UAgYXzKiI-~K<kV8RZSt$&om4wvnAkDE}Hn0!aMN<86w z4&#!W3wQ;qmDcjchaZh8{=W9|>dkYFGPGU7bxynQQG7R1(KqPY^st(FIy_pw70O3! zw7NQlHyrJ|uBN6Cxxn#k#hs7B0jv4VKfc{}ZmZek6yHV5ws+P&d$uKC{hob9o3wbn zyFd4*b?cW4+bDgmUiIzFk>C@@dDeeEu<eMhmhVkA@lL5F3DZ1$uA5b><~fx+GHvhH z2>k36r0?3U#Cve!zUytvcJ6XMth(c*b@dn4jo<#gxYb<6R&r(jj5*)@Uud>m(mn3m zEavxWs#SEf|HCg6dRpB-SN*EZ^#80J*If|2;H>UCyNT=@_BjUhJ1otQEwQ?Nnfc=7 z_t)fCs1|;9`8H?i;tgqcSWeGBJaGzV^2xR!-;{+h0YXpJc$O7OpE&QLma=oQvY+Tq zxwEFT%%V=$7~4xPT3j$?>52)e)Bjx4tvlMDBWNQ(MR#ACk*N5*t~XPTewJru%jM%g z*W%*8<)9(I$2k|S_)Y95BkNo5?bWwan|6q4%UjRL4Ri18@u|F8cH294<E(8@mua4K z{}Q+9o>AGhj?)rX&2D*bC{w-f=`&B^JID4X@4ACnuc}td>{%dEED`B;+2+ryLub32 zG+wG7shHTiy8m%OepI<be3Q)nM|PW7c#RDm!w>ehBo~<adYlNVG~Mg7L}}7l@73Jw zoCp7vh-UoxUC{WqLD<j5^~IiFnpNJjV)m4sVD3J2Cvv}p)C+aH#2IWdru$S3*ym1~ zS=^vnvU-tDvss$Xzr=k1ci)`$NnZN0=;XcA1+TxpJMlrPy}JDRZ~1TMj#>O;@L6b? zHu=HJ3t>8zCO0GsW^MU?ps&ACGEKfmfKl&dSMsl#I|qL56UuA7F#Fg0r_P`5UApsp z(ql2(2~GEpE@7D@wCLRdg@}jydL!%Hn){BeRtgu->;G$Wa&qtNskfBpXZZbE{_CY# zY}f3W8N~*x`OVj*e5n;WKWAx^iQl4qSE{c$wDW$cO=gRVWVHT}?_aR=>eXNmnb$d0 zALnfgW#X9A-*9@;lQ)0MH65ot{3gQr_)(baO(RWX^OA^YzH{g1%{~_|I<f1R@9`P8 z<F6HK>InTlXe7+vRg<<;l>6w4m{&V18@Cup_KVvw2A4NZ)vKD|J@sdsmB`^o#SL1q zv!YdY>n;l^J{@Aa`Gex&dM@eSRwc1~L!IdUEwU4IUv0ZxX4kD&C{kql=jF4{&u*Oi zRCf7J%eLl?hD|!zkERIf#JVsgPF<szp7eBg^Ui8d?zF2j=Uxfheyt|Q*{S+Wvuk=m z^jnvl+8w^)54PRvyis~er~2qLweu&JALN-`qr=a0(lg+}tZ&<Oj%BXeKD)eZC)W@6 z{>u?p-*ZgA`f5uSuXWYoo2}R5PQJT&Dd(Vf;pzofj&-KXNTtq{)nPwmRsJwtMryMp zmsoPx>M0r$`~A0{$(|zQT^OA<^SaOWx>>wIZjr}Ym@Zu1uP}MlqBR>%U$<U%dFc+{ z{fv3Vx=u$g7oUupx;Auurin3gSmR5ZceA{^c(!e239XMa|Gs9ETgG<tyK&#&tgF54 zJUx7VzWt(eCrh&f*X`ncnYlIjm({}Dl}5GFOV`xz`2R-aqx2#lXLD7T(&gIE_wDvd z3=^Ey?t8-aPHNzyO?&Q@J>^~h%Aue2Y}eZ0s;y_td!{e*&^o-fDQLElt?)7PYVM8k z9LKb8iEV9@cqabk+=FFp`l98Bo-KUCS7pk6@8X5!adN*F)USGBHa$luT(BwNyJ;<x zxvypG?1f@?OwI@HIwqIZ8uw(nRs6NZBG2}$w5i=ID;IX{*}c!%N{8lbEZk%0lo$2n zr08ZD(UntI-j9CWJn^snui%`5jfG#9-zZq1=$>;XE_QoB)D*|n3nDI*EHRtK`P=Iy z$DXubj1vuYTLSr5tYa9rAF6Ro(PLk`eR=WBmw}q<x`|7gWS?EpDmt{7N!{jFo*zf} zA$#q!pPv;u9c2yGTN2aWwu9%Su($&#)^<NgU}*H_T$A1Nutnqr_YA==25O5=pSd<m z;fCA38!o1w^gPqnRb*_-dNT2jlEB0T+blN=MA`0;UE37>vvRU&k<;F!yK_ndMP6_& zsHuxQ5kBFEx1DLS$!tYSy>0TAZ{4{bykFt7^~#F~o2`rGs;|aPwy&+@i2c`9XSXwZ z{(-wnE6R(iu0~Z@A8q@x<(6UX+zV%7_wIcpYB+uWx1Te<U9~v(N$_5s)PxJ{e1}dh ztCw4yo&GOoi~j7IQm51FCt2=y*j{eFeeLeJ-B)Ax6qzqsezouA>lU>GjT*J<gTfA9 z@(F#ERl2rT?0CYBgcAPdHTiqflh;*WFu9YcajerWRm-u^y1i;jbd{QGnUruppX2k# zQVikYw?632O331yQpCKm`r^yCd<Oqj53ZQNBe+|8|91zABxNC|D9H;=lQJgVSLV8L z(jxxju9s7%njVli`Jt5OxNMU`RY9D?i{S5z=WO{_J1_6~-E3QF4O#cd2a6dUfA|0X z{hR%)WQ5U@Upl80RJJF-DUY1HXuH)PmORH=^|zI^uJL?tUM(x`6xmRq^11tkNozi< zq05QYYHbz2=Snz#Y-$URTa%x8>16YhNgi|VG;1E3)>@zcHPfB-$`Ku}OKeh)*DH0n z`EzhGt$Gr1MsbJm^bf_EJcrH*c1tSM_}uF8S)y#c+(fjrb^FEWnbRf)&iJx${|u)Y zu9HRh;$Pb2$eeq4@gmPzmDU8F%_=%U7naW2#oONzY^M9BS9L~puzue%%aH4TZwJO! zJ#bt6sa{uQ(>$9G(>|Oy)NgZq=^Ul1Lib083uDg*ML00HF$%Qk%gt-;TDBoKSnFDc zrRByMtM<HET>oc@paA<_sTXga{n~Z)<=*ID?-=)RD<A$J_CD@TNmYWSaL4Oc+y3v~ zDsxKFVWHyhcLgsO-#@tcCfE6Q_HrG4Q)ldzc>39IX->qi*uWntJ9Y|x*I4a%yxAju z)r@mST!ulvKG|EGQS3Z(o$dJPp1p|zSzj0{rfj@waLIL9pN9fttjMoN|Bh=gXZ$~< zl=d(zj=_B6o(IR7?u0QMzOSf!Za(7~OJ9y~gH(sUtulU12PQcE^poYP2%K>##2{$q z2bR9iGiLsg_FNR}CNyz-&kwN&dw+Tvq@Tz?<(qLYsO&4(m!O2;Ju749t`?UnTIl*! z^Zv5T!zQL*!?+l)a@02+4m!C|W`V&y+0TE!%Y<h}eBM8Iwc_brJzM$$=brlXYvI~G zY0svcI_=(>9ly<5J=~y9Ts>X4q^$JP+eM$Rx$eF!miA-&;kT+6R>@wz&Y8=+jkC(@ z_N0T?tK%Ai7lyvt@XBz-7v@Ka7C-!2BOka<<_uqF`P%$Db9RQStoq+Z|J&VdJL}W8 zU(e=9%hfukr+012ytRj)%7oYMT=ZQuhbeIb$4ZXaXGScK_!W<fEja#vUyJRcJORVR zT*oC1%(}A499tv=zBzbkn4AA?X?l9`!lRDn^K-s5eeZE?u3vU`<2my%Z~xV^^Q8^y z>sunf9O9k$$m}}nH?jE>V`ZaQmmYH#PqqtOYMB^2oi+N)BL}@l#Zy<OKdLM66&0$o z@Y~E_EEtgNI61T8vc`ms*EX<xN#wQQ6?2|;E5J(mimb{{apjdSBQ7umO<N<Uy<x|4 zQ4wRV18!P#^Z(z!xAot)UgeMPe`>SH6qI$DyiNVyz+7XY;Cnf5gKxCT%X^Qzm2MX) zg-olNG)Im5&i}eO?DH3;sBOJ;w(RG^44tl750fqC{48|)GW$(zEhn4b)XLaNZ&e$2 zKbXGg`2yy^nBE^t=ImNKvuNrnx5wSgIeYcnD%f+QHSCUyZ03&oYP|KqlJD*tc14IA z&vB{f2<0=~!q;ipyuayQzq!Ceo4~cJLjGvCRR7$$&0cfL)5oi{v_D>!*z!m?wzgd6 z?v$G`6DHi_3OcfoY4X!Ieq~S6!fHLWc66&)ZF0ICA#VNNfq%V;^Ox_J4{+`g-23;c z(-pA=N9z7;%kkRMbWmOH#x1c^2~1yXeC-ck68Ws)J1s~t$jq*?)c2$%|G#tvKmV?) zzp@v~PuoAc%!P&Xg>Unjtye?6cIfSm&&kN;K6<A@h$p#W%ikX|PniCxynUSE_1ZO_ z*F*X|PitqZLfDt+568?d@ci76x38{ihR38WJF?c5GP(RYZT3<;Wep>XBI~1C$yDyO zk-sf<FHLDw<6oZ3?fUh0Bv;tuw_k71)>3^q;gDYI#n|r$AMNs)%%m`5b7WNg<So;h zHLUi?rM+Gyc1G{I>7C>KKNQ>;F6#KZJ2@Wt!q_h`b*H!ghulP`L<2u|g-_qge%U7; zi4-)_T=31ZRG>U0<Ma6|zi$7%SK3#6qxR#QI{&4Qzb`Eo_%!RV_XNj9BJRu;mv3Fy zz9H+l^IX;DHEkESwHnP}Yo1ob_wexSDHEJ376tv1ES0*Rqix)r$(hz+Ra@)!Coyi` z!QiUrc?JeebLzewTdVenB{j7*PxZ3Sj?QhT_o$q3l$BeSXyE5)DcJ7d!r&3Id}30^ zw629mY@~AQU&!!h>pn{OeQM5xt2IXz_jh0Vzi#tvmG-atX*zHAh^HTKU;gpu$B*Ze zXFc4Vm#yaKu;=5mHy^%O*wxh+)|g$JoE~mn?>VU_Yv=6SYaI=4spMZ;CE)$Q?NCCB zMkI$=XlG)BwG?ZD-?SM=c-DL<-RUzsJ0jaH`*Y4l4{h@WSDb(6a;v)R-ejH~wEo`4 z1<TIeUcxxDFR1jo?q1%iUQuJIH@|C6Oc1%hcVFo=wa@J<qWxX(GyThoXxio_+H1Tq zWPR|Q#S8iZUzo4i%>H27k=s&j4XZb+-Bm4^qpG^Z?$9dPJd1wO?rM$N*Nv;D-M%Gu zs(jn*ya{`*ZTiZ2&tBzr;YWjm-$GPw2gY5i=?&NOm#Ye9&^*t*?uNVP@4s_TDD8AQ z$o_PVU-2v3hevOQhMZrl`L=1|D*oKJiCcIJZNFI`<Xv$5mJ9cU#gdJi3fvo~1<2|i z^_%g#fH5q4wUPF$=X37*J!Ubmz0Y*`>7%<P(mD)bj}{)joBMZDZs@eUlx*3Xa!#A~ z7bY@PUo_I3q-|B`<jz*mrTg?`Y*eldC*Si)*=dF^j~y$17Q*|)XU?)<s~O(5Qnh9A z>n<yGm~A<gQWMFtA#`(Kh-yu|q`}V*x06IFJS8`r%sAw=%G&niE8BlPGq~*hcAr}M zuIaDjT~&rTvcLDrDZVIPlJ|I1{gm!gS2%et9hDAzcyY2b(~6lw4qG!XKQzucU%B?( zU4^fVTW%&PP1&X^a@rucw8+Z+Pj%$opEE+s6Pqk@y^k{7+7{4rElOLi%kaLNO+ie4 z4d?&F!}`sWnKGIucU$xa2S2#{g3r=OX1SHw8a=b+ZlY(`|A_ana@Sjxe4?vUiNi6m zA;fFbqP)lX)m=9ho{nt${)y*SN|IvH#rDf;Ga}8lFBb5*nXs7Q=A-b?&gcfMZyGv3 z)n=?wo6A!q)VfZ`_WS`S-y4Yrhgb2p6rI|>F3pp1N4sXgm&lxQ6^>8VnW9`VUnkA2 zj|zCKG4s6fjqsyCiso%zaBW#;TwUYem%Buad-Zs9k9zu?kw`I?jC$OqBzn{0T$iin zeB~|aQPV25%D(DfzxgIAZ`lg%h#QRxx2`Y+HBKoNc_rMk<ju*gqE^c;`IczTmigFq z)@P^ug;^IWI1T>ss_uLxw)uv(cWB_Hw`@yii$pPQ`Pyab9Mf9(ichuM#8I4UmF)qk zhm}el+a?F^kgWgluPK+Ufmc_GFMY*{b4=mWq=FR=%~DlQn$`dA?yMQV60^=O_%*xF z{p3+;qhOhT2TXm$6PGfHd(19<@mq|~Gq9ok#w|JJqndx;7+LLWv3FmXsj$Ck+a|jV z`|a0Xwtp69&(b^~e{P<wM6R~1%j#}3j=#lzp(?E(uAR6X6>eCv<VsF|PL)+$Xhik~ z^<oblyMoJ8<*t|uK3w&sq2b!OV5WIpn-w;0)p`DUj?SvnK>|lt-aHhw+ucys?{v!3 z*?ZeRTUJaL-Qj4U&h|uTRlmW7=4%|x8N#QlX6ikZF+P`&aMWz>J+n}w#To)hB3G73 zPYX6tzBxxrroAO^#oVaxzSgCM;S(!8pOtL>J$s48F0I*@td~i>R4AJ^N6qlq!!7;O z61Qwz8o8qR#YUIgvej%S!Z|t4E#rA|g*!+&OXo#EMD~Mf)zwEiRa#<HUdz;Je!M65 zg>TkHh6KSSyj?G?d`+8}#8*5J5q@`bMb89V?q5HTH|JLwDb0~+-Pv=p_whLa&i>`A z*bZ?XSMM+r&Rk(uuIjDRePn{!y471aA5B?RXS=-MiNNV@oh#Qpb)WV9aAk9m=?V4- zI$M+F+&w>d1y?uE%T(nhm!rZ3Uwbavw3O$e^tz;pF_%&#Ckomh;qt1r`!y|_@ptb7 zNh|+?{QWZ{`r5xoZ_2PJP~*QoT_xf@s}si-YhUryqggH6joaUvw}wAl_xi1QXk^*l z@|*cz4^6%*`kU7_cFR(x*cGW)GfOA$ydKkj`Q+<sGtc_ZUg%k@Q{ef$!0hVJPusr6 z%oES>HheSfv&f0S^uJ-*v8gqj_a!a2g^CuhiP?BphkFyR*WOpHd&*8Tp8I8a*U50} z!6k89=N0dd4ZZp2r&6}mg>`47Z@NXSHMsTUC(k~!U$I|qXH6@wO4fh4u#&IpNp`cu zC-zAKr+*Z)<=)!Wl$o;gSlpDi%YRoJsl^NAN}S2l_j0ZNywgYO(7mnhjK5sw9KH2q zlI2#XtI{>wR`PCr`2AdD@3oo_Z))!_T&Zev*k<x>SD&Pl=@jcgA?pt_q)H5P+rKpg zwSKFxT3b5x{{0zQ-81LDdTwB()SZ05bmgrrOjp@2u&uP}>9KjYWrEvk2fvd~nKIfp zMWlrPzAiG8$%$p+-aR|~v)2lwTAhsXdHFP>p?%AYgQtS7PkK^ZpVaShefRq}SEuD# zDF#cZi7wmHylvei#uTo(@@w|*l=OJ_bf@)BErU)G9+gWK7k1k6FTeW0@wy~?di;sg zkGvM2J8(*S^UMW`nonZ-7k98%9&RYqtc%+reo5|L{))ZV`j<RpepxtA>{{{rr8VuR zzgL{Mn_#vjLEZAku_M+M-Tl#7zLOYr?OmDQ{a>vWskK`_rN%U8Z^O~@+&e}$0wi+( zFtU6}-q57fyQTh`%*TY=3E#6`Jt*N`y7>N;;@@*xV^vo7gf5Xa`uC3QBAZ~TfaQb< z?y6avRG+*KGwgkq-Sb@XnC9BcTniS8?u_sAy7BIc?5xvAUu9Wx<@oyjJoj}~d%8vb zQQzuMzxIgklhnD#yTteWy<Vfgh89=Pzx~O^^VMg2^;z>T<p)xjn^VKC_y(Q1Bz|S- z!LlVcO>g{ruD@!E&D(c5(V;K3?xb%?+&6Pl!iB(sxyfEppT00na1MRelm1Y+KCB|@ zwU!h2%1t841^JK4Jp68-fBVzzpli#vCl4(?q?CjRh3!cEUsR=?|GJAWTD)S%O!mhi z*InCWAD=URa5T_mUdKPSs4vgAXgvy@6dKf<mw7RO`D|bWXO+O6{55T?^BA|X@m}Oy z&+tFY=^E3G(s%6>VmOqfE}uB@<HdB3<u)m8r{WeWp9%evH95dLlVj=I?F%d)R0I`d zbNMqK6<_bfx4P^1l3fZ7W<NI_a{H~CuCQED_S&-&?xPuJdjeK;oqx5CuQiK*4}0#h zaGr`;VLJq_N7nJ>@NU$9SyEd%HB4rw*#9p(KC!*tUb@kXp>+DW<U*5dk64kvWt$Ed zOsI%$xwdN^r(EOfNn&vp%l9Qr>etkL{#3+B>*o30f$Mpcj))#LYZkb*tSRtE&x@sn zizl^*Ot}17ZKckELkV-Lez^Gc`@B(?JE8eO+9!IaH@6jYrtq5-k@b_`2lf1n3*hr~ z^}Aj<dF`i!)mJiu4lA*)GFxcH_S(E9c;|W7{d1Q-m>J9%v^ndajMAHXk&G+Z?M_>i zdAr_jovRSx7wLF*d6e=Sr_5-}muY+FU4C%w-RYI;`Yk+(yOUMg9^5~3{oytF<<5I{ zSaj8USq80HwIIK%&{Wy1Gw@69x-zDM*e`oman>8{E0~Zpu~OYL@K{Ua)frm<yh~Qx zT5!YkeZz$f%U2jKbg|^k+MD&r?Ak7^!@Vc3`Axpvf6kWw@w?+L&%RVVj_SAHQ!P8+ zp<>?m_V?$icZo?ke{f<nd(9aXZvOh^lqcuC7q~v(wOOb@;^?kj3##NVsaV=7YWsz3 zk9(2h^+{{VgpWb;(`+x=KAMs`Ir?=&y!2w`n`VV!FEUpIp0lwMG23ce+LQRR;GUEG z^sfh9{-^S7YINQf{rH&OwugtRj_x)-wj#$Q^UGwP9Z4d+-=17EahjUA{)))tC-XJA zQdV8}bzhUrdnqTh)LCTP#VX<FyyhaV(qEtLd)W3gbK&u(ID^DsM}3P5#k9YyEMM6; zXE9&7z}&oW#hs1~+hSugteyx8t~DtMwwnDjzinBXL{fQHk+#go+nNlwI2FYnwOrgM zT)(E@Z?dS`p>3Jho)j%f5$^u?{rUff%XV6`>yP=ou2EhSTg92C!r$81(4VW%bL84K zzq_~CUrx*29T^>-Y`%S4=&fy6^Rv!a8+vW%WXTWN(0*?E_C7tv8%sO4igxOkHPz@; zvYmLbB+inTX->M(&em|L#@Z6&PtEfE_gw39x9ZiE8h0{vxvkfF`cl2eYpqfEz17Ko zif*!=(MT-)=k=$;?<C948(-(t?%kg2qGREEIDg_@lkmwk>-XGzGIy=N>d|NOiWe~W zr_4S5^l!{F;i=#Kk4r`uM7;c8@bQ^th|L4#Q|s1mU3+QU+B)OyO5!X9?>paIe-_eg zsIk!N_H&2xX@z^9#N40Ae=6jFp4b)L$&c2>U(Vba9)0qSm6rb+e(7~{H@x4~w{hQj zsnWOWy_o;cGdlXda<8<s=0=SJ7ptCKoB8HW@`bAf5^brft88UUE*%rPJ?*Qfzwh<9 z)hgG|KRS5&$Ks0n>rU%heO{ir?8~ya%nN5UChA=Jv_gDyYV(#g-9`sy7#X^~Ry)1< z*|~4NN>9~ugI75oSz^8S@$&ET{Q3$ZuV4RAH&ju7f8Xnn-PM(u_EV<0ZP0!vt^CmP z!`8Qx^X}(*zc5&NTca(=ZDNtff1zZDMOE><4`%h6JSg73(fP`=B5Tu7o1ho_loBsb z7WkW_wWpQk`pl*74<jd~3aF^(9%zl3Sz}?nYg%||*qM@JubThvfAc?=fBm|Hd)YNl zeA=BcwR>~#9=V0puP$w8?^*QklJ<9%mKO(AKHcs1elum_M(u53PjA;B-7hom=$!U_ z=_@xj&QY0B@jCQ&&lypfhfgQfZ8+$q;PPj^VfLHJ^Zbln&tzk)U!CxgGxO@2=UaZQ z)P0~EyD)!#$ubZ9l?6v8ly%E}3)QVZ7qwkWa-l}rr(<P1KP|g^f9>t_;;WuX|Gc!- z>{Dy#+B<t}<F7{--oM_<TYdTZRIvo9>fWA1d8<$QPI|ggp|Uvi;{42`q1BgF4@+x3 z-*EL@$-Wsasd8pwFAx6X|E>Sqb@J9%9B(A|%t`qw>o@hxvR}&uJ&Lt2YWdzuX}bJ> zO6%(l6%N_)@g~b}cZ6kLDm!s}OFZK)&8t#oy6-OPvTT{vz;!(Ibm?T~z9W}!`8=+x z3;r3jO?d64CB4j60UuTB9zPdZa7jA5$e>-hvi?Cpko&329*V1qTIW4^{-&bkV!a5v zx%K3(WijEV7s_Vc(VBH+&94~uS1%V|4to)ooqF(Mp7OfGYNfMxDP{)$z2rQ5)#HVE z7Pn5Fx)GToCc~+uGBc5*Eh8u440DF_m;2nCf?HHGW&46JKK|8c%q8d6`9fU5TJ`PW zi`P`bugN+t;C;So(_4q$e4$CIM$gv0Gyf?)Cp07QtAM#oZb$Z#sr_4OH+(W*xkmW4 zCZEBB|AHKy`aEp19~rcKT8}t|&N;QV<J%mwe~$0j|D_kH-11-Ql4E^-tBA{4MI-;S zr}9>}UOQ5Gcb34U+@JsSJ928;np}6sANlRI;zZ@z>$5&qe%&Qu{kqh0+Pv+x>!)Ac zHSfnhyJ=~cWBr5oF`MY@>1-Fc$h!G;#>Cm$*Drin>U#BsOV!+eW@3HYrLSs88P_!R ztdR5zuKcrn`Xu4H|Ml-$Zg<a{xqn5@m8h2swb>+MJB?j`t8L175)opvNXtrj%g4oM z^mCueURb$*_q6tNhI=0?^p!l<F_^e*&Qh^^_pJhz=0CSQu5AA2_ota>%oXNMt-YX9 zA@%r2*_^Q6B|f`&XFi>zd3e8-&dnLwp3#fX9Bp5kq5m#?y_fQ&BPCJy%C^j1-mNxo znP=;===`ZEb<E-(yQBn`w=B6Nzl|sSi-FkU8-a`;ZLj)Dtq+@35jAJksaN`Q{rPqs zW8tkhRv5lhHef>SPQRlnznv=El_FAWgl`mxM5{Y<XxM+W|1~v?%iefdg^PKS)fw{w zUG`;LQ@3xb6bL<1WwvL<162Y0E0RBQkBDD#`XhdqMPZTmmQ?T0CE`U)*<WXwTF2`9 z?!09XoOfsCqrU6>bN%byEb|OVwNhM@w?raGwsubX=`$P3G#)ZG@fI=dt(W~@QuE{2 zkDTKMSB`u<di3aid%5|??T;FIos#{ydIk4?jH8xSR|UQ0VPG(IWMI%C>LjcZ!;-|L zoYZ2y46JvLzm?7|hHOh)_w&M$<rWh!pY(aXP59=t<g+(79S@pSVk9Z&(j=xQa#CnX z?$>4i|CWifaPFJZ{$krqne?RNEM*&a-!MO*zWcAOf7!e@oA%9<iMI0jsU(n<f0KRN zym?Hw6~iy3elFFy@qzR2t@K%O&p6}TjHU*zkl?pfI~<~7SI%0!BI%)5{4N=H-JC#) zHS%x2x<>2!_r2BVy56}bZduNczu(WxzqhZok}>$P)8Bsn#q;l9JTKlBQO|MPaQ{TP z+3B7dlNfh*i79#B%$C$~-5@n#LmanEa(WVL@^x9Io#KAay;siAXFm9#{7mD96X`F5 zHcWQmxb@JY^Plpa5aC^qvTvDf6VM4hBptGGtrEYPRQ%%<|5YXvyLCk6PCM~SxExs^ zrhRp*7i+Xate}=*Li*&zA4|;c&E7w=Ifw81nchPoZ8Le+M@lIwGVlFTbzsqvsO!h3 ziOpHJnCHr6=T?@YX*NsEz3Y@Cly<ncJk1uC&n;4}3+X!i<$S5@9HW^=_S{Wh-L=2k zzR8^bFE{;p<Cn(Z`IhHuEaYY9^`@U&`S^{ELb3SQ>lXGU&1Zz)xZB^2Pci!NZJPb` zeE(<XPF}6B`Tw=(%^aaJm%P1I3X@p2eUO$HQD!~LV9&8CXvIl^ZJv#vIw!CSesB5S zpU*Ynv_ruS!}xm_`KpW<Te~Ki1~;keJ@5=*t(~!}CHC0=CZiQXajsF4R@3gebAMF6 zQNhr%_P(>n1ts|%Y}@#b>#GMpFR`(bi$5rR?APs1^_I2vvWhwO=Nzma^w+;*mA28? zv~aR}^V*GHKZwjZmnzlq_Q#qF)3P7caEHC`ynK<#M!x*=+8Mb;zdjfRy*%TaGRH1S zZC0~xOQzgk^B=pbAAO0?Sd^~KyUp_Giv?Re11cU02}yoZc1>!2=ivRMP?6>A{{?Nn zyRCWrH^|SNoyMu*rNq>?P(Ue+r9(K(EA+Hb%;m1-I}P5u=KZZydHe8&iIL)$u!bKB zjR$6U-Kns7s=!fZS?u@Vz2^(}@Iy;8IM?e5S272G?0tAeNVFj{pLbJGq>TH7>2uN@ zwURmRKaW}Z<iz1E3oBSt{}xv1@0%WR_mXPlma8dyRJX~^tKNJ$aHZOmhDB`-uhf~2 zoir<r+;qOjLV;Id_A^ek)Ftc6&Md0nKe#`1C!0^f3F!lZ4)fSsd6vl;wchz^ma}wi z?b-8Bx3sr!NQ^nA;(dDUI&Fi8`>kF6++keHGM%;izC#xG7kLx5LmI7ncKno^9H;(d z^)|(QlMe1m{t%WhF?5f8_krX`%E5e`I}RUyy`aUaXOTm{7W*Wdhn5?C?xuE@cIGub z-C4=-a;30)mrc3h^QkjK&Nc2jP%F>1l<z|EpTNoI8{S6g^X>C`ZzM0q^nx*(|NP%H z#tefQue<LXbp$pZ&{0p)Usc7}X6sovO+9IavBn1Hqmc){$$2|{@t@$GV0SQNis}RR zI~k&%L-bM<g4Zm$9K9wzuR>|DkL2UULOUPDesW6bZaZmPHNA>uQ^~W}CbP2oHtTMa zo44Oa<#?2guHer36Xta9ZhHG!xlnq!txc@r&MTtF`A$v_*nVVFz`tpn?p5qx1wZ&t zj@Kx8sj%}}?0SP}%WejT1I?*UvRitCMV&U^I{x{>--Dc@HeWMx1V5JjxVzhJ%eIF5 zeDn8ZD{WYL!6@hG<t0nI-mw_7IrkUsoEjk!_-f(OFPFb5+W-FhU1*`F>I%*i!smBR zjoVdYU31;TtV`0{t31PNwngZP<ld#RcTCn5u5b%uQG3jlF31{}tZ{JJRA#p=MVoeL zCS*qnyxm;RzT{mQ=W9c$b6dA_&bfSrbxr$9v(>q6JGv`7F7kzNR+p+4s)_O_u%G#{ zwP0Oi_l}90$6{7SYlzN{S*xNTDzo>}?Z4%zdErvC{N8@rzyF*9Yv8UAvu-E9ez<eJ z!q>(l>q5HD?KyYsnsZWm;%mi?yPuyq=a=F&^{0_f8qd7q+xPO%rtmqI+B{czaDD#u zzkiK<*gji19&fZO%nI85=*b%~uIH+smvYz~t!PTGa9SAH==gzcTXrS$whay!BO@iN zJ@z_vE>(R}Q`yzgerWxtr#`>ecdeZ!v+7&kgX2ZF4hI`bGFpYF6#AFRZ(xb_Q?gOk zofHrlY~C`dJu+nL=8s=)RGQk##n1I!mi+uvlG#juy=8CIzm;4t&8)Ms{B^y=X7<%I zpJ$6VpPXnsYoCoYf0>zZ`k_PYnbtPdre$@K2haa1690VpqiFAS_q5L!zf_czzS%QR z=Dh!IHvi+3r!W6}?8T2eGkx8sOKt1C$&>x!mqnnpwbVj}C^kQJ^{=e{ZqFxgj*q^1 zqJ7s-o1HtXq^#S;(~nQv;mp{`(6X;9&&7Gx^Tp;?!7F#oY~FJ>Zp(K04Xow&?>hyp z>{=n*aY~hEMz&w(<%Q0_Uzk`Y&%T-?+_orxTO|8zjW^HY67AP|-D=soit}2_){>2! zS)pvY3$Ce|Ij+{+x2iF0YbA5ZJoa*j?ABan@u`;<@WpLy_x(^gYv0WTs}w&`;n$Na zBSXYh#6s>)$SCqXk#_NV>g2f_uKvB3utis*D{58myGyHPPtdNr-oqRE`r0%e;ip>B ziLu)m${7N;30|^U_@s0NThH_Dt6A=?T4d~LQ@4dzCXC_Ext}|WZRYvL`K51p_u=Pp z{bTQssIN1rGM*{PxBqpF2TKyGrK4P^iMN4n-tkJls)|a(ndcZk{|i>u-nBFM+l-W% z-5M(-Suc8?`!wUieCDzUp(N356D`(MtB0mPUfQtoOYECX)_n@6!>3*n-pqE^yLO7! z?bv0H(+o4Z&L?eL^hf8Ogn0aqugBNc?VULLwua}`oSwHjlh?eOyDWU!)q_0ucm9(t zIqz^VYU*~&s|(qWzqsPQckQb)yW7@$2|jU|?Zj2f_RI~l4>#DEif6{V&bP2MciJv( zrSZ}7Mtkt=Y>yT5S`!|<O!#-p$?Uhf^t2`6+HY;HvfjVK8P2iKLj16L`C6l|-DezD zzey|!Putw>TCzO$dD@qXcX}Hq@7n)8=Y8hI#f{emUMibAKR)`qM)0br&5wh3IvqGA ztIgitU=G{T!O$qJ8X#~aki(MeM%L<(n~#r|=0_@B@LI9()7*0l>zckyU(3S3@pm_$ zV$Y>Te>4Q2*!6hv>{_}!<cZg+m*GrXu3i;qdL0^b^XaNpHQKs!Pu)rk*46O(pP&=` zo9)->kel=0Nbs!Nl#*M{;V#UPc}Mj4gva4?oYsCgFM91@)PYOB-L4Ub7i!nPn{+*= zTQa%vKv$vYCifd_m)>2wr{`2H!>vW%oz!jCcI=XFKUO@sH?jVhW1IBf5MSTgFLRp1 z?nExut_tk=zv$|Enf@C2t|w)M0jJHPRi?3T<&kthkS{9nNpssV4TEBZ>qq);xi$9P z$hY(N&$1}aWjL2JrT#se|9#s)<w?4FmuoC}=N&s3tJEXSYH2Wq*);t_l9bNvj17M{ z+mpBcU7?~ob;{wXGj=uyhP|70Bd&Sb75(iYH6@MCyIZf73KjN>pSgbawa$+Vdrg0A zmbEY2T;g`;jJn6ou98JxA_T5;S4bVZaqm@d1ltq+9h)@rT^8&<W971j;qi&v4?nLv z!tC;yvHs|vLy22^<F32Eej#gq>QD*uTZyWog4>0nO(%~>e|%i(ay#~aV7Sid`E`4@ ziv=*<zVkUTzU%Yt5`~c9p8g%LK8MP3m@+L1oRu|wllf)FC13jYe%L(W*9H3v^Lu*! zOwnea^Wt=Zto~fhYqOu$tiLjo>4}%ap5|Q&Clg-R9{b$P`721*Z;|xNm#c3H>6cv= z&FyWDeaywiExN6Gr&MCO)4G%c!hcPLYNxT39_LocXW26MZ&l?hANS{vB{Mo^yD&Gq z-MN_VT=M*=DCbJPxhWgkwIeJeHd|ik-1Xr^jMwqar8;ZwTv1Rw)S*-?y?+9O&HCv| zXZF{gTFQQBA&1Dx1cxcRY&cw;dQv>=7E0eYuRPayk>%Qv2i_B-4lOTMP~JPKPu!?y z^OhUTLf`n0&VP1RC~J$u6o;ynNm6m?4U_nn&dZNGxid?zM~nMQ@BNs#n6vV;Dn4Z_ zch1gWdulyvhC6%xBB8|spM4s1UN&pZ@hDs@9ly1@Gt4Xe+Wnv9MLX9?n@r1Fe6IFT z-pvV5k417U(%EYGL232MM>`i}uCZa#>0EwprpGs{tqXtXdDriK>L&Ng`?6@j%-3A0 zk%zhsyj&S=j-OLY%}rB0nx`7kdDUQrV9PJjyIDugGcxqJ8upd-9Lf(C<C^QP&r<8| zmKGEhanwk?ZsU#ZTK|6>{$k|CX@9Kdob(l+A7N~b2PZ#~<1P3rEo$fK(5^7Y(aF?n z-OA?AYju~FJ(jrKa>wS?uMEld$_e?kcdmZAviVl5H}gNE!>49T&d-Pr<9_l!JL*|h z>g-a}^|Al%pZV98Htluf<x6H#QrTNxmaUd*ycYH(<;PsDdCoJ}hkX6M+9Kv}U-<d9 z>jsh-eJS~k4DWX6F)&nIBf2kDl9!m9nwf&5FZCogy7=~vNp<t%53c=ea56I5T)WRW z{q+?GA>E79Jb3jB--z?-UKBj<vBYc1ql)^!W)2_j`BtUduC&^^!X?S2&Y^tq#TR)D zKHuNxhwrj4{l9Kc=)|o@3m?3*t-pM8pKES@$fjFw9-rJC&o}Q-XULY$O&{m|Ine*t zpkqq;#e>nm{r}y1`akSY!uL=6J}=IYZf~Ey_<yOi_Fw<`dgs~q-h1HFc%J*CrO5p0 zk3KK{^y5<4?IVAm<%|3-;o0+eW>Q=KJ;Shff9_tp{r0?w`3;S7x&6z}?6tk~yKCdm z@WQP8zaEvJ%I7iNXBX$-o<F7HwdQqq{g-nN8~&NTy-(Qb`@8NJTu(0s`%T<#seOGL zzxjpKKk5HI9P59y_<u#$-rgcEvjYn2Exz^r?#Nmia{F9-wd0eyn#H+mUQN5TasLg4 z*%!Mv@ipJz_pAF5+Ue|fBJ$Fg(=&zSxZjFpcN_b~ADaA#U3y)V!?|m{NA;t>&t5KL zTdvG8IhWhcU?*qYq8aza>aS<N7tpR-V>7pGxA-FVlW`S`m9nb6yT4raum3#1;j((_ z)=jx{bwhGD%~~5~|JRo%bp0>mdb^1Ce$xIw*DtU5Q1Pieq52=^{`lLgCt6+oa@8kQ z_-aeM$kVqOZ@X^Y^Xpo)EmgwxpYn^-=H=y|9Lf*5G}ha{xg+s!<NwHy=5iWJ8Gi&r zgl2qW{@Ai1ed?{gdsa4iMn|{5&3;<`@6LIzH%`jyuguura(Vmf*6nYu&bMfM<oxq0 zx8LvhN!bRG-?A*zzimy_3ya@ZqiMJO<D#z@?LSB=SI;>Z(bp2$T*qSV^Yz)O`w6nM z!ai$fe5iOWC;sl>mupEEKF?pXT;W<}dGkrjwT~}f?6z|4nshDT*3BZz@bJEMy}g~Q z{!Fr6ticx%X19LBVa6-`Ix%T$V~%pxINp@XD7>EFb5Kp*!ZJ3&Lqo2hpyuV1t&#JV z|KZ|Qe|yk_bs^_BN5#fF&Ky&l760DlUXZjysLA66+uAFKZ=8NDbj>LHD7z)s)bFh} z-wV#$Ryh?V2q{0k_`m9%<J-Ii7Rj$`CS0E!d|tk9is<~1FxQh)Q@180`)=pW{+4B_ zduMCn+~s~P86UPbH68mmWkyTMr&r$;SHwPhY;$mmXlLhX)`^WSLW}wz%B>52)xc`F zv8bEjb57j!2X38li*7WZ{5<#jS#FW|h)L7;_@zEv-=8RAchqwC#7}SDmc7qBnKdnN z(#ir3mgrN)3x2AcKk3EtGbqSDqha&9qj$=0w4HajYPep5WB$Q~)(v-?`EHgJeRS$} z{kZGq4;@ac^&C?z)@t6mVWRW+mYb>S^nk$VcMr5``m$~bsfIki%JFtXoMSEX#YKyJ zVuf^9YPg4<y1=d4xyM=3PJ4p-+EZCMrX_!GY|KdxoF1I1&^XOYUPh2V(sZ_j^3+S( z_FQ#+#_5-N<5>Q$WYzrnH=S!oVa(nga?hqZ`lroP4ygXZrx<d~>_OD^l_8TphM7I6 zjGg&VZ^a6Q__E?dDra(6o_D@ou(aK7inM;<uNTfWGGeD1&VTy(;UUX{(DYk+r&xbY zc=LP<PobYnf9g}^eEF&l?@Q(7r}*dG>Hd7>e`%3^uhS3H*=Jw+ow?HH|MBR`b*XXZ zPt03!{mjhpH~lgf5)_r?&V94qd+WhTEf4nm`m65RFUx=Z_h{!dur6+1zdY7%soR1} zd!8TQI#^Kj?{m_Rzt(ppwjcX@@9Bq4SFWgB-&5Y{zlBY;Vd1g*Z#!IGmo0VspK#Ur zrF==1(~kao+!5YS=O)L`|E@pvVv^?JKi6jIvt=9=pIf)^(dHvLT6=zVGn(~e$Etbt zuddU39hdrM;oT))EH&n;r1qy=TAp<x^}f}kz=vAmGR(X9^mKLv>2e52@znJ_ke#sT zoXe3@zAMUmoaOIqm$$f5?Eku*=gS>||2G}=IL&%lFLP_nxW6;ed)ew~UH7*5nqAB} zd*Nn{>AcJ*#oOCf3Vk)6+`GlFDtlR<&sV;^rlz4^#r7s!O<O9MJM-G#q?9uktA)QB zU%okIrqsO!$$E2cOO}3SyRqTp?6#G6jlZ1pxVk*2Z*k7H3k6QOrSE)XW6t<ozsZuH zbMV<4xqo^Wc28S&{>GeF`veXA%iiWJoMo}lxb3r9dYf<Q#Sqgonx&H&C9O(@CFW$z zU%7kQwup0Evwi29Xsue?8!|iVz=h?<=BUNg9*CZ|`Fu-L{k4#ZIZ7RkelrE6*wq5I zhZfJgr{mAO)G=1q_Q}bd3DdpgD}|&#CcK)c{&dFrDcnyyGnuqfJ8U#{otD-(%=6)K z*&34+G>L6-j9rqy*XKaJ@Dr0+lY=zo8(0PJ4id7t=00<xrfuifz@$R0rTt$6vl>tN zC)G~5u{djPguLhPkV>J~i?75?oqyz)hI!mk^^JC?cq2c0uIUe29F`~hdhwAXp{E#L zD<^)+0_nPS;M3#?`BbruUsUY+mQ?D1%+1s8_D`y9x#9ch<du?X(eBm8#!HT>Z@ees zwpGo4jrr24Yi&BerX76o>?zZ0-^}{cPnlkyJtH%Hp3EPE?Z)RF{t9fL-2QESkwxXS zBcJ<iZXPU_o5~ZlIbEyrm&K(6U$-BNDpX>z`=LMg*W<4z`14ARu0L@(JY3!`G%09X zx6@Pp1tt%69^1*C_`FiSd+Vz&Q<q;8a`b$u{9To^bKk!m7Ds<g{546v^k2ygr5C=> z?q9v3_4S6u>0mdT1?P<yT|E8I@Q$Wt=UlH>pKryjv|^bw%kJq{^{LmLzGnT}xbkJv zp<j7c^2^@L)2ud+%XfV<ujS!Zo1BRfHzgdqN*9|7DZabEgWddt()t56lel%Z9iFcu zHM5UR{I6rO@xOl?gtH%?lCXH3yYyzMeSp|H`8O5vpR4nfw|fS&$SUXV`gOsjt+vEG zskwFc;TIcX|KH?o*>=`R;J<E7h`2}B5r=Adj-Yol@+^OC>6~%<!wbjk@;rgL3pT3V zJbkNUTV9W(wCUCo;k>)YkFmLkPBH6Wdv(Lgs(m|5pGZzsxf&8<Cy@DGH=g^mjli2U z<xj6GeeY;Vu<Hw~eDi7AbenLCkb7_c^4@Q|^nTBArWvOS!dE4Fmj;A2Ppw(9BsE~a z{!|-H@vpx-Kb<sMbKl?8X$t?>-=6xXiaIao?{f6x-77!6Pj3zDAA!&FQy#6hVyVBA zb5S||$%lQ%;|^SXVm~XrrH7k)&N)tF^{0_@*3Z#MvhJ?F^MsjowZq>{A->X$)%Pp8 zHcIyBSgJnws@Zk8mNn+&wQCU?*_Bfdt(q3zxgx8wOy0`ra_i*6kMDQ*yS_8H`B7!d z@2lGHG8_8uF5BX*dUx8St8Q=nC$2u*J3D@nRc^+&uUB_3UbS`a+B*lXhh57PU`xtX z=JG$jbvp0Wl+t^wC+m0*q?`{<%$huZ@<xgOOSfpAGV9~tU$Q$Xb;sfG#J%UN?v&@= z{xVN2?}DlL-qY_YUd!oK>X&Z&Sa&_(w)Dj?&Zp0O=70LQ%>Q}Ru3eGZTLS_Yt@E8x zqZwd3Q!Oy~>XA()o302k2`#<3M#@3lOV?5%Q26*V&Nb?HR8H**R^MWhwX#8EYl>Cx zs->(!T(cd%E}7$^%X_(OnV;_L$y1_sIV>tUyeBw&=F}}$g4l&xmn)>MRDY+!<-cK> zhL`z=BN<(bN*+gD&Q!cMxq7ACBF@Vqt}oln!X9Qd2}k<>^1RY?HrGqSgDGH9&hb4< ze=aIvR`L%!zh$Y0mwC#%)id7dEzr1IaK_X0<IL$*hYYT2@UnO;(zxpo+$-62iPuJR z{vwULGqS&(N!)s6kxSsNjV4k(8Mdu6yqImW(u8Eg{MDC<Ny{iS+39SZ@oDKTGtVU3 zvooU1j)~23?U`D2%20Nyk14O$%hxZD^Q1<lm|qW`DAcN-xkSUuJZSFu;C-$lOQo+D zmpY#M(6mK5t$F7D1traA-KU5#bzS1!$m6!iWB11emx`aVu9Pl*Y`pl)3)ZF5GNI@1 zoHklg@;Gkxh0mWRT;laMbzhRlqj|T%yVR+7gW^(Y<#fOPr;1CZ&#gUa5+pSxujk#> zosOFSCS2lup6GJE%Gt|2?<Vu^rBjkUUb0m)Tr_^mHbu}ea95zi+GF3Bna$6BJk``} z>(akoA&*>BBnob7^g4-8xb&&<Tf#)vRXna)Qw-;CcqJ6lw#ejFnDKJswfoejEYRrP zbhEe2d*(&{DQ<=J%ugH_fOKs)5?LB3xvF4l=?(1w)3XdBOWVEE&gL*H_b=Ay-NpL6 zZHw9TDQ<V2qPfo=Nv-$1rIGVc*EvwCRnH+!!)tL#X=F6x`M?yPBPFk|UCEJg{k>Oh zv*s~9&0Z(*m&PJXrO#|y)jfw*WU2HEwPqgIm&Yz$%s+7Kfk@qw66U+hCM?vr>#&_E zMdQ-@quZoXG`!3&`0`73Z85vS*1_X??DUOetvs%;*tT^lI#2v8zHOnRbKow+^eGn~ zfK)#Hwk0NT7bDvNhIA40#o;MFM-moD1kX97eQP^ouh*U<O+S4Cr{t-uxOGP>a7x~W zqdYQ7N=x=Dr7PuTWmy?Utkby55P9b0$5PjqZLCEKZy$=j{C;oaOt*vUH0~P6&ik%* z>zB*RwwESHPS4l4D{=mcb&%BjStZG*)>O;5zHH0V4W0b*hsy8HOTE^me#cyDjih7^ zUz@jkEuC=j#f+N=Bqxd}E)Lw-=Md=Ow%Flb#j^*S-cP>x;!5Mj*2+^%uAcMmezu&p zXu>!CT(_Ht?Ie4xZk0R}*kC8w>nC?0bNAeZCf`nGd}*sy``lh@CDl67>EJJc-mc3R zy!@A3d8`|6)o+up&;PdacydM0B;(je8apFC+?6?eSn=i=e^V<nmoU~h{Z{K|?6Q+Q z)78SjCb+`R<k<OGyOU3~H(vQD@~-Tm@%@mAGCQBBn=-$jssF#-|4%5}-p}`rR_?F5 zvoJ?-tKq{{mzQkH4&I&mfMJnFmPn7!RkMzRm(?HV`IhJ9o-H$Q-|T<v?%7y}UZxrU z_X*fCXk>|)l*`OK-RkJD^Hr_UJ2A_wdEtAW-`uAazr>$gL(B7SeJD%pSKeRp_sX{Z z`~TZ2YnSbt`-!rpiK1eG$CJK(k=;J4=Kh)LJoCFdVs78QG;Qr-JA3=`Z!hzVH%|Ih zDsH!HcklPL)nDfASuDP0@4LLW`RDH5UAMWP@BYSH_a>R?p7RS=FZ%IJ?(YW?%>`1~ z`c}brZ0|R-2Hn};b$R=ewT^ioPb>bZD&fC9eO+Snb2Gms+w4jnz5n=sm)REaL#Fa2 zw+r5v-g)70O>8dTpF8<W-F{|&??0|*&${zoW#ISi2NQ1Wef6zPHchwl*0+mlD?+w@ zmhXS}ap`N;=gU`AGq^r8<+m$|zsS9d%Q;LbY`*)n8`@iDwY<J8*S7n{!>d~p%<ffc zbGIG$;@-u(b>mrcahJ`Jp$eY`j?MXhf6=a~(m7!@J+7`R|AtB#ar4isxPDf${<W{s zlAmp<4;emAwD+wJ>-;lg|AXVdpZ(gs;_^#{ty`y;FF))yr~AqKYK}(&%N9II^?APc zVCDbE)sfMuw<9uBD@;R6IZQ5yxW2cxaJcGQn7ZZYoK7G9@VkKy{LvR?ovc%iVEz)y z9X0o!{>L|x?(3s36z94u?W?-~JGW-@&k)mWo#ijg_KCM;_8ia1V1Hq@FW3FL&Zf6! z`z|uaYF1r1_I<C{vdxTlk8LmYKjE|B_K$srXE+_L7exP#mNk_9KCk+|{;ePTO5aIL zT*X=<eV<QxQFdeA<LV=6HKyGT+dux5mYwl!AHV0m&86Gltm<p~7<*SJ`W){ESsRxv z`WLS9Zk`&Na?6DCbjV%5=)2_yw^+x-y4==%vD7nnmf*CNthUWJQcAO5e6?A$!ACd4 zyZJ;~=8V#%g3~f*9Jx~~S=^kxhx@SogUkO93vceJczw!hTE5uImUUaNDI_FTtcr{< zT5$EYW5jvs$M0n;zsytgveT9ce(-*ObpAn0MswS~DSPE}5}bZ(u5Z7r68G}Z{mBAH zPRY8kdOf?<G50~Cp~U~ETTRSQ+jW2c%+vZo_vr3l^Zr(>E;*nWSQkIP?2&A!{eNba z?a$|N)N@4SE@rxWQ(5(Up^l0=r$hF`-ONvxuhg3xsQXK_D(bGtyk`wZ^tNAhxhj6f zW%_*9UAt0kqVu0xvpp4`HB;n8e{aTXzs-t=o)#K5?aOjBKECOsq{uN3<EnQxf#S-C z4L1t1B`;xJ+jt>2bbHR$S+XKl{tI2-HPrWUR_iS(Qx*1^Jz@W)<Gud^<_Z7jcgx}^ zeP?SfpcnsX(uz&z*7_TiHP6_uH*vN6^*d!rY%GQbbK_057v5QRD=o|3bn!vOjiDRa z?}n|_s`}yeMK@w^=f)Ka*5A6|)c?aTET%W=LbBW1mz<_qj;~+cedU;Xf<qwdO4BtT zQEBV05~k=2(;nV1p6DU7S!&nR_tM)EOc%KDNBxv*wl|PU+|AG`e4|NjW${}^S%*WM zIgZU2FKp#>KB6|~fY_JjZ4w(V%3j)4z!ZJKd!NJBn4;J5?%ThY?^5X8diPZMWbeX@ zr_ArmcU9j5>FjRxGI_#KqJ7`@-I)nbqVxXw#hkcgt*oPLc|s|t`*u&<ig**P3rx2! zHTm5Vd%meOEGzcLG_fyN7>iH1wr}Cxwv^S@?7*CLuNFt&nkHsabCBcs&v)BD@uo?z zN!~a%D_JSWoBNmX8CCwiu1~fVtoMtP1JA2zT-vtf<JwtAws9s#M_oA6QhDK8$&^oF z`>t+0ti~pm&3XIMG4mT@cUB8*Tgv)&2Hy(lXD2ytUs|QBcKG3;ZCe(&ADgqEgDJQA z#;NUG&Ru8il_v>rTgu8CR`_TJPoz7DeYP~Fpl@OH&p4}9nbI{KVZ1)?f47J2n_aVv ze@=eN#Gu(4{nqAXJL^}}e0Kh~$!OoK1O9eyHk>o|+&OzTsN>>G!{}8%)#dkGUmqpE zkZJyuZ%+&qqF0!HzVdq=(_22i>C3%-n7{nd;90M7;ZcrAjp5va{j61YJJ{|gud;k` zOy5w^WN~J`;Y@*97kfVn`EZ<l@vLKc?|arWu|I5PfVkFIH??vHey*Oxxll59)q>X{ z&vGvu`#vK-z?IWqt)+C)%k$Codqwk~KjrSYSNPp2T`=V=zt3Yk&YKy<>4#LzmtK0- zT;|%eF?oTJpt0|4kDOA|$jte?YhQ(Q&Rpgy`eJWn(z49pC2d!}x=P<SUM48*Jb9*D zS=uLij+T$tti6oY|LyKhnL0z-dSl!ysoCFiW!E;JZfp1Q6wN*qr~3R$*sN3|(ffxr zb<VXpEMGq1NoZ}EXa>J~`tnDYv}OLfESS7`?jz~@6~`{tDs7#xD6{!!u4=2_c}+F( zl-n-%EG=WV1?|7F$}VuTxQfdD=NU@xbuK<y%gO37wTMag+%~6x{PRM~UdOd&%svsN z{-TXjEpxU*y1M64(cSFpUzG)J(qELTR2<{{`g=j3O@i7jwF@UTt^c*2KeZ`WNqFY` zIkCMy-x}VOiDf7WM>?oa_s|p7P`~i3XXPDM;p3Z+%{bJxt+OVsYL)h0g&+G4UA*~n z@*A$V`AoX~k|*<np1BmvS+sIm>TMP)+w-&H1agD<a*BR=*R7wxJ9p9B>kBVCtEYaE zy0EmiwJzk2m{9t9-|6d}`n$Ci&i^?tXxCS>oWs<#hsV35_7m^2do=;ek3DyKbG+8* zoa?q<iou(U%>9?RyyM>MGNEh68vC{X{DqHOd;IhEn;AdtV&Vdwr)pY9XWcn9{q-L2 zZ!9%7@-h4TlbS`2{h!^JayxkoZ~sQ|6sKpuCm*RUZ%E!3@reD@2K9Rfgi2p9IDX4( z{Ls}@kiXg2yz9lLrX??yO(`p?3#t=L)XXp!OkMKa`7$???+(jPw(O6j<JHA84kdeB z?EQFAwDsBYok!g_i>m+Otu%_OS^cCdVEza5A1l9J6*`g|xO}-ql|uy&lW)3)>U|L_ z`{$0S5w5pe_D`HEGBrG6lF)^g;|!Z^nWJ^4nC*1Acx2A}IX6Q$Z{FQ<r6bbXcKy6K zfsCYUZGoE4);*d1#xUvLS^v+^r*q7jQGUFb?eg^<3&k$pXNj6~WXf~H!cyT};m_+V zc+Z>5O?>Yyn344CjK5On>8Wwn&T1E0YQ4`NTPE&udrB(Pc{lAhn(NN*Ve*YwCbi4# zGuKSv7f)I|4wv;U$vw4BvNLx1^x3SlHu(J9`SFjCqwutoMLEk8*ZM5d=eV5|T{F2- zIBo&w?WAady;~M@-u`5N)i!(bBezNS|7ve36s*4deCEz+M=n3VZNcfuo9DpNB>DZA zYe81j-3<2ye2j9NH`@QxGFA=L3hms+UT?6iJ<mTi)%J7f&jgi&nJj7<thqlcU$Eyl zgk6}nU;lW1q$z8z=3?n7u?kx*nKvdK?3RDB{Afr(yOO)xKjz?juD*N=MXxY^USYCH zsU<9+-A0|aPJ3;OuCe*sD2-XR^HP##Yiu~#zs*!~V(#I&;$8Du<~Gd<S(wViEzq*v z@idDVn{7smoc{53C0AJ1-j8bw>x@*8HFtWvGi3d&dp7TdqV{D~ecsbtUB4&bWJQ8N zZcCaK!{WzT88gh~^a~6amo}_)R(z)1w<x?fQ!k1uP%5>8)g)NnASN?gO<eyRyUz8i zT%l__QXRzWN{ZaX|5b#iybn=)!rb`eonS|RYE8KFG?hBlibdC#T&m5Mzi;+WjaAM6 zR8eE>EUq+f$D^;rf6GLj%wfDWPk;HljHe9_(j1MSEb3WJ)JzxJi*_+Q3fu6?#?bv^ zuk8k9Q;XEXNk?A)|KZ<~clVjuBNe{yw}Q9$&G^<;=w5l$isyE)oFU`MpN+rkE!&TJ z9}dc#CvtGluJX{vYZi=Cw>a!{>dNoT>At{~$+-E#h4~zs)A^#gG8eMxPUQ=|Ao1I) z-YlouTQU2|PED!U5Q!~L*EAN)+*D`2O=i2?zaHiAn|hkBkEq_!x}C~5w>rxEOZ<_w zlZrptNM=3hh*o@_@T|Lgl9#vQ^MtUj(-*ib+cyQ9G%9a#;y(2`BPObtRamFET;ri& z)Kb=`lD>Ltc23%o^lqxRa`?t+Huq1n-r;%_asJ)m%Wk^reYvf2!R=y`c@BDpIzEpq zyzoBK_Wd@$mYa^-!!@oqG%mQfo?YV+XXO<B`h$m7Ja~V$_S{3i_g|!26i>hXXPOk8 zY`>@Y-^sfBHJte-taAzv?_6xZRPfp*pZP0&l8Y{V@;u7^_AtBR9xa;;Pmy;QJ9?g~ z^0{)nwm2Wv`!Hpe#5B{QE&i@^Z$INV_xtR2cxTPc7FMI0i!BK^FZnNyn5(tV^^e3x z)tdE&fqBxY`Wp;PQli!tl>d@S>iv3O`qr`5tJk*QlhbS5v~af(oA{pVZ;n3ix196G zmS>X)&-=AZ+x{IiUjF>j<8oIn#&h>uH~$o7+sL$_XhBiVQ%Tm9=Jl2g(;2(sDt_s| zk!^L(5nb|Q#(_MEX$yPH-Pf%7mH)JG(Q|el)r#snuDMHmS6|c7Oxo3dHT}fT#WzCc zY<aa&B<M$jcGFvPfhF6TUiRzC{|i>sTM+6qe-htXHGVM`gB1%zb9Q^|T43g(xTWdi zz2BFsIZo!QJ<er)+&cZx&7!!b&BaOXyT#S|m<06}iuO#uH0kMv1eOzr+?DQ&-qD&L z(UfPf<?+;4mp{%u^81b~4^x8SFPj9VPikyj&t3Mn?Eav7CaE{*+v=?j9Jh80>^|PM zrs}e0QPA2Z%NLV!UZ!5)%Ck?%+E)L5S604dOW4X}*Js>IAB#C@@2H)Zp83>h+WYe% zWh=J5vOPL0qF(+kulUmAJv(l5tbOp!^u;WTe(Aq!?z~_Pes}X*o?dR=#F+Or%Tf-% zd2+>)VH%H$<d&LadG|8*Duug9aWLDs`q<o9D|y@X^<lHRn+_3?ec$$)EluV;E_&*_ zUF&pr`G~C8?cqK9Hgqg_#<6};z;Bx!Ctu&pk3a1EM?(GM!zHOcN(oBcw~T_6mUZ7T z&}iMymd3M0|LfdW8YV|&c18Ysw{pSWpB(aQuGHyuL?1NK`26_Pr+01BeB9426!kgW z{G;>Ym2meUg)L2)2DiSSO#RaDb^c_9oYVIGCmkMiSV*-msF+p!=W5B49szx}RS*2{ z6`lE48dECHvG#$#bGBqe?+wAIgY(_YelIWl021T>SCeV3<etI0`o!cK(_fQ~Ggwz^ zESSCL!_B2T819PL7wismWPf+2)NQ(4mDSF2<!SA=pD+0m{pSC_q!-1<GURq&nx!hK z)w}A7y@s$D-;bBJweB9~ACIS(h*fU4H(2?jZDOHL@p82(i>-ej3T=qn&2@BgXQo1C ztc8Cp>%!zY#gEK4yqAe`d|{CI=<b!E@`ejqlOs57>mztn>pCi=Buo5O?GT>0dj9`# z6|Y9-kMBdAHSesRJ4;(aF!6Ikh?}O*%<B?@htk$6TyTE9+0-e%ORaG2>N3xOWo%Ct zh=xp_<o7K8)!lcOy8JIYe`)?Euy`wjXyF-u@vQf8o4=Tz%3JVk@ioKW@;rM4eBSpd zhRqGh<4E)OYg)!Tx904l!-}^IFE+hw{dY+IQP@7W*UHImlK)IOvVLFwCy*OhnJ&G@ z@k3Vn@53Ko9+`FT&$F5^*YvLCt!&EYDkqAZNle?AZBV$pTUFm?&6<}<CTgN03x5YS zeVVg0`qyuPDH(rWnhOb^ns&p4`Nh`dn;IkSE(oQb$m3i4d0zX5<^F+NQm=p7(SF5F zLnrC4;!}<G)16b<d8@7+XmvWbIO_n{gUY&f%as2Zr!}4~-mzDcU4~h+YVy*C!(Dk3 zY>kdHJYRHz?f9?iuDF{?h9>ga$-8g)>^#dNF0a$|?EH*tr>_|7d%1Sa(&zr-+Wc!? z$(+10RkwL*Y-Y}hC?h2<Kl8<>98H(j>K#x1)0%&C($+su&NWXw-@?kVSWl_*)~0Ej z7hGE$P`omObK}l+Gg=q@o_l7&@wa-HnxmGwA9dRxy)|We=Egb2p3AE@P3x03FjHT$ z?45R0lG!n@j7fTTV+)Rce7^eWobYQUFTaWX(C#gL`L9nha>lh)?cU}V`BAcs_ZF$% zlil9`=H1KO1P#gEE;sc}oilf?F1}v;y!iS<{?&SSuN4Qs+Y%Q0^89V%74seUF8A5e zbu3@;?5ckUFNikttvQ+VW}Vo(^LJdY{7(HI!YO2xGG)1q-!J#z(zSuYbFC^wyA`GD zyK3f?@%$|N7Jo!*R;6!3E??W5zdwr<=YC~&w!R$sw*OS!_A`?&-j$NCvr-F~`Sn}5 zhkm%cbZNQx+eJD)CZ{ZSTwkNZb-teaG?z~N=EJpnmQA{Q=wT$^vj=RPd8@rFzs|M0 zR`+M(*OKPfAOF5xTlkxC->$q=cE$3^W*4?H3ae}~Sr~M!a&CdHg;S!l2dA<m<D+Xg zd*^JFW?VEQiKWW2Nv`+6=T*uLQw&Xf#aAu0bM=?k5#3j866X6x>w_e#-CwbfFJl?! zM;=d)KbF4w!%S7XS@SOneQ*rCbMcH)&Vv#auAGKmQ-zoV!m7`fFh#FEkhX<$wrWDN z(EfwjJJ^`aJ?DE!NV)rnpGc`_mYni;Pqc3hdsoWU9#PhNWu4d6_B_&a3jN`@tG1`S z;b!My(+r6Zah9B$^^LADd#p2HeRA$Z(w}@oDHfwEbD6e!N@ta^T#3E*L$7<0enkcQ z%h!rxJIx<tui-rL@b$DGyITC`WUW7R_g*b)?2HfW5sPcj_dZ_6b*nv8EAG_l`R`wU zS(a0|uOqSSl8dCE_-47iDsyA@&xq+3+Z^ii?t9&e?Pg!EnXU3(%B;BA$n1l~l)#P0 zgnXX|zE%~@p53xs{Q;wvS&y9Yv5MCbQr$5{5nf(b-wBH)J}!0M^wIKK)0B|!(dLE! zeoDL5e&b~|+*vqPWSR5oJA%irPU_J<zDhzofb-qmwRUF9w4#E!7q!hk9(JkKu6M0| zK(y?OLq9_|9XmE_6=PwBm(&GyrQ71u88QzT-j>^+lTz_++UJv>;v!pD9tplz+r2Eg z^YTl@dG#%l$qGR>yrS(EHhYEm&mI?g&fIe7{G-V~9<g{xdGi)}oZ6jtIVC62i0#ff z*B!mWoRf}aIi{<)Rhs6`>eM}Rq+#{Wj!BPC2evI;xl5pZ>7H54vrak8;o=bd{xC1R zelfF2FY9CrlcjGA7M$cca`Hg!ycW-jr2o099a66?3p-9}zr9c+Q)s7PqGPu3O^@j{ zucrl57BzWW#0atrG#1YAN}b>K$U~;<)3@DQ;@0hmEBO6>kxBK$%m0rhRm;qK^y~GT zxVi>?LI3S;jOR0+s$6K8ZNqXnVbNcaywueOTb7ldHdI+LdA*zAu17|%RSIA2ve>mx z&1;T8k)X3yXF%C^m%!_SMb%;*-Q4Rg^SyrbX?DRuPa{o1?I(+bW*5y$E4*CVzoD{4 zx4!?p>ik_s$*(HdJf6>#Eq{G@;-rideay@1Sn{tOOv=<f5~6$5gDb1yl~oO=&_d2D z4JUnkp6Hh7s7+u!e*95*r_7!?JBv3RVo69nQ7;lW{nwPj+p1S;8BGH^7~9g<`#)Xf z@nq{$8KWkfHBIfEZ~L=__OGy&EcwLiHfhz5h5(b3cjYYfSF|fmJXq*)$e^c4f{)kP zCey<^;PinL<)&^cg5I1vzPLKvt~7A1(TgC-T?@iyIz%l?$xkZ2bE?31y729}>lf&> zU$OKFS;e#0cL&SIODr!BoieJ}C~haTa<1^T$ueD<Tk>-_xb-KCJpcEc?Y~)|xA7M{ z-zQp^_FnwDVf(w%DrL`$0;;aU9G_HLs-zTU6XwT0_`r}ld)0hz@0G7yn9MuBzt-?P z6w8w6D0<)z$La0wcndzwofFZ$@bo_kUWvJ%7jC$9XnwJ^w$|P@$JMDZ>2E#Pn6A;D z+s!za`@7ZiMefg?RCH?-w~Ak^az2`)a@v}U?OjEVZ*0A!!OJ3pmLpZ^mSI;u@@~?U zSk!l)>D<iQN47-nIkx6b&@ao_GquMyy8TdEpz^r2BVod=+$}zg@&=y&r}|xBs5yJB zXG+%RjJf;XB(d)P!hUMgbkQe&g(|xzY-fFPK=1BdE6;=CXT9RgAHLhsyQxBVw$bCL zWP65<DK^PMmxO}fU-d6oxmkKGU!v%A35%t3|E;o&?08nuS@z=po}y>ho=;S{s?)zJ zWl~C;!7ZlDOvcGuCYPLjqOeG4Q|Ha(`U6iCjM7&57F3<&zFm@VyNTlhQ{0Iq=W|O= z94On&8NW2WopZl%Ib+@2gBNCLp7&e%PdZnK(Pgs>w?*RDt`#@)zcyX5ENI-4(wS0h z;4<5pJ7Uq{ZEp>y=q)?^?aa26(-B95i`M8pe0gh5faQ;uakFzT#g;TI=5RCJI^!nO zH%5j%yz3(Gq^u2n6rS3{s%z$X$0YygY3@&d4bB~!UZ8&2u6^;&()5+FvM!ICD{m{= z96FfA9Jq_0|DpH+<=-9_p*QzMc--UDeH`%p+M!+bhcl|5X6Q=24Xx-}xp+-tmsN-~ z$CA1GmfikhnLDT8=8BNYl+9cI&b0q%yL6WJtpFb(XWzR!&go>HEs36?8t^DaQ#RyJ z!|c!ywPWXJ_$2lpTYQvx{f4eEsbF)?jS3I9HA>uX-+g@Xt3?bCcWj7QI`x>!$H}#o zMaeyT=VT>4zmw1qGyM<8yONJ}jOA5_c6?ek(a^DfNg9hl^fn2$sexi&ZmV28B{JXW zmcxF=>{9k8r-LFZk8ToSxucSJ*rf8P<^8u0j&yua7CPw>y}Q^>bd~Y~yMjfQCzOO| zUEb>BSDP-C{Yyyh$&bcs{Ew&e-tYPEk*8=jKlP*j1o4WU{S^V8p9_D5Ufrp-dmm%) z{J*=S_C30_g!|j0FBzAXa(?+<x59i=snxeok9m{xJC4tF&gR|cr64MMX;t*8xZh6~ z|GW6--`;KM)0v`dE{PqzeO;yRTWafe9j)r_@6R7NY5Zn<|9O4pp5}=5;9b>+zE@V| z&y$(#%(Jo2eZ#c|8%Nn=zc+2)(<EQXll+IZVqxtS1rOb}Q&ti$I+nWDJy8F>{l6Qx zT*aR3Sp|ny`DZ=w3fLjYa{Tz6$qSUkdgdu<6>HdT_;Kb~l&)gF%<Bo+XX{h^^LVo4 z>>6eEJ-@$y_CkrLH9t-5n7!<TRuqNg+@0Hz6Rfau%BTHbR%tv7Eh;^GNo5^(e#0-@ z9XUs{800hmojCcjh->|Yb6HPz{JVQ+7Vqn>*1!%=-Az^B_P*BGoN~zQ&g(C3W<iIG z*IkyDOju_eJh|k;wB+skx0)LroaDLiam96k9<52tvO4p6ujp5^pWwW|q;6B%=Zosc zw8OkBPkx-Gcz>y7rR}`H@TH70>{%*3YR3~diL<rlnVL#E`L&CP`*TJqdglvxx7=3Q zCs&a&;q$r#ktX9?r~UUWt=<!ImGPojE_eTm)-w&ao=**%$`)f{c;g*YP}G^b4KJVm z&<KbsIl7#)KhDZF+CZ#)NBIw{q?Nk^CwewJOMmcle-z!4zWD8o*b2tds}A-&lb@Sc z9N}5Jk=;}7-BLNjrzNo^uae@K{C2Xej(Ym5ab?t*quV*on{uw*aY|u1TlBGif>Xa~ zo_Q3Im(8hmt)eF*Y`%f<&IC<?`?5CE!>)_QRaxCV);slQsi*n1b&Jisuf#gN4Yhr4 z^`&8kO?~ftKItW__Y6H>m|qP#ysu8qvRlz=<um)jZryzz6-V4{&Wk?d72@-+%F2s< zmyn|QMk?y>!2`;Chxg6lny0smBj6A_=PaAXhDl0SVs>O$ZJ$@*xywPXS=d_7$X=4` zcbL*j>%57&FSlvWIj=Wi!BMp-(V1e-s}H^kG=F-p?B&_r+AluDE--c6bGxOJhu3vs ze2J@tb(Up|+Y;^A1=^E?cie89dFI^mGid>i!BLr|NtL@YieE8l7S5b9f1g+Fj87A` zcrR<b<g$A5rM0u0I=6NIYxc?Z-0xx}7T0n={!p+0&s`ON#)}*7vo-~GY+)`Fns>nU zK$XwtAFB6STb1<8Ym?vDrTK3C`}0L!i|Y=#W625{GS*tU+pIjJs@&)3OyK*Us$8o0 z@qL@ucfq=4teqFEZJm_f$xP_@S*U(@o2Bp;>AaA$Hml1sEM1KY_<bkM&Q-B)o^kat zuZP!rzFmP;;Vw*95+}WjyX5lDO-V%{NJ)#M#m}hgp75OXY6pckIz5wBE~P2nn6u>E zu5Wjm3^sQQYsc3X&0L}G$K!F-`HW<}%AyC(q3hT5KU;WFdPUx;EiYC@uf1owg>&`Q z<@Z>Qx5!l)wCX2L+IK?N<>9*>-oZP0zwhWgn5X^Q`r7m49lxc#u0N7FbAN}}Qri&q zu!ZGcv)8oVGhJc+*=q0B72Cg+R=p0$XVQJe*!W#|*?sv#E?(My3gg;c9SyXu#V07H zo%8ZpyomA31xX#-oG15g+C5g8KGP;Le`C4v@k^_c4z_D<P;uR~g0<bVwm3Y_ZmxT> zSVoah-EE-@44m8j|MMtH1~2jLtN!;f{*{q}$wPagN!xfXxH^2b3*Go?(??6o|7A0B zzMl1(^X|#KoW6IV>AW^eAH6-WU(DRrI!fU2d0Po?;ng>?84LHl@!M|Iuy4hi{nf70 zss>soXPu5J%Ui;I?k2~M8Pkf_F6q)%nmna=cRRb%XLB73*-f{derZ)}KjU7*|5f8k zR+C2OwHIfC<}<tsTp`Q;?uKm0U9T;>ex6bOEctttP>Y?{$%oxM#}Dnw{@^6UqnYB) zDD!4F_w66*9a-F$a$7Vj9<jVxU#am=Kd|i5qzdWgtJa-m`aVa!=kF{?R{VbN>T$Nh z2U|q_-)|9BN!$AOVAj&R8TEg)|NrinxVZLy*8gAP_vM;u_6RafiMHBew{!K!45O$u zH)cv&KKN3=$CA!bzGmT`tMe1&+dur<*nW1&6YHOA6u)ksmgeshw=|`0#&6A2A{QI$ z&)m@1Bcs%>xWe9NU)%Dch8ZaZ^&I}LOQkDj8J4aobGCD=;MsX^#hnNH>hkJ?k35z) zzU(Mwd$fJ;w@HV#$n5ZOR{Qk##}?1a|113t{eAXW&*~4ae9Z?(E}xWuYPtJ!wrSp8 zE-PL*D~)qT<hjc=(_J54<`+rM;@|f_&e;A{)UMqZule|QlxLrqH&s0IQ0n8!L4EVK z23K8)n=wNmEB-Lg+2R=vh4m@iQqwZ-O_y}BKe9GD_x!Cj=JKsG<8trnMXx@Q5OPCl z=NGHqX{WcB=loyR_xAmjurrsI&)_tgW4QU=<}<uM%}c!HPUpWCyUo<-?8P4aU0kx) zx%glCy`-mp3x6$ox}#XGZDP!teN3Ka5}`+ry{X@P?8E2(%&0eDdVA?KT^3_t@R~*Z zvUvPkjBT@n@0?h7|EK7_^woMQtSla8-*axvv9b|<<>X{IIpuraTqE0g-+c0IzD<!o zkdpoX_tY!=+vA(rZ8qFovfAmu-D#>@qk_DPe&4+O?$+k1>Hc%q&1#yqOjDZ0=B7+J z<J!e(3*K&asqlOMBldr!{ke*Iv!{JWu1glhw<w7Q&alvtu~PD>d}G{i?i}sC?2hoh z4-)sDxg;7?Z>mhcW0lEu%h6=+(IgYUxo_v!RqfokdF$4_?+%=o{q=KB-M$6$?X8+` z=3d~tIaR{yuMS`3o_8@W%yP@msSEa08bqq6)jqoMe9kA%FTGL~8$`T*Cr`B4$FYO? zzrUn{*iS#JXXgsfJpJSM_(l1<r9u}uXJ53jWPX>zDZfs9q3<HaGwN~24mwX<vQZ*M zQ{F1lf`v)YpyQ}YW|bFXl!A?%TFqTcTT6?o>(;m4{J+G0@6CA`eXd}^G$k3!%$ANd zr`^wAo2#*HUbeG0@6yd0%pYYI-C?v!o_1-f;qFI%XKqdq2tKc7_3DS)7ZuI2%l79V zU%n!^@^QMOLALHu?-`f%zTQ4{ivJM1SMBlA-+%wz`}Z>NeC_L9+V&TUo<BWpVfUpe z=fvFke@oIQbSCVu{1;yLb;o<Tcp2HR^|tm!_k~JW@?w8A9yj!PXkR1HBf`S`MWLfh zaB}X9Wh^cI?S29q73Ke3w?Cu%oH5-XdEbtOk}_QqELvUZeupC8FwT*1z0kfec}D6V z(H6y%@BNiDd3gKp9Ta`!Zt$@{+2^m?J<gyf%vT+*{ku4Oa{0U4i}xO0+&xwF_{%({ zd4gNsxwI_!dx!a1!?nNR>K7I)P2iu9y>1ix_vUMk##6qzN`3f!G4jCKh<*R!doS%} z)UbQD^t;lwzM$L{OE;Dm%v(D3`{oHpG%_z$crW@gK|M}q+4so_vx7|dI%9-VVrMYe zw_WM@m>nRU(U&7)IZ0$;W7n={jt&3SFS4xhn$ozlDKNw6V$#B$9xChyKU{qOVa>@j z-8@+n*0t8XUqUl10zALRaJx#r+?~Jl;R~iH_T0?XiRV2#$|KM8o@lB+>bR(Q?t{Zx z7pF}TWAu10$5G2FWzlj_z&BmM<@%OoT2-xP48?Pnsea%smG~t$DJZ)v_QjuM*5eB| zE9F^OH7t2`xBtN>#zniI-b+qstv<NE<;~T*%LRWdzrc6w&hI;?)!yCv@Lk8V{Pf@S z92J}Iv2Ew->%O<&vtTN}W65_z<EC!>Uj{49!t;!G7jK@W-Xz~0_dVbG|4KXGpD(T~ zw-ya~{><melb79_cXgYmzgd>15~uUH>X^;;>F1c@7CtiB^^9}Vx#IKZbDc~a9=%bl zEHZms`knK~GV?rprbjm4ExOco*7j5ipIMgteZtZ+Jq?QW&xH5=KAW{!L+ty-jC%E4 zwnIw$7To2Z;uo#%TWZ<1Ka9IhFRQ8a_L0XH`d!KMe3WnSAJE#|;A@fNy4U4?*fHOn zPriSbcvfxBGI=>y<L!c(krrxe@6O$$c{ft-<15i0aatWuVon<JzxH;z?VYeWK9-Hk z+@xgngEcE1Ute32xTLXF;&E2%Y<YL#UHJ^sR~f#a&s0fPx>%Adq$*OAs1Uk#L2tlD z%gY`uEAP$dns7kz*y(So&-s<=e|51+9-ZpKv7gH+|Ii`Hhtn@eWwHA%;ZXH9dcd3a zJeX%!rqe-Z|05kv*>4vtye|7wlYj1v-;5E{T-vrsd@#D!XXlh}&u#jr{F+*h*@JU& z?;kv2IXtW1fP25&%*j2AbtD!&nw+J^SSp^`7(ew~q;*D@_WSDdWml?NZG*ZPjUNWH zyq(pWnSH0{8q0HSuIDTEEd9v)*5~Xd{dK<-=Wl=We)}u-z*%m>n?FQ*>91&y4*%zQ zt1MO3?}Yn<y7;?ECHr1aaQeN@S!r`kn0SNQ)w647Em1WIvd9%VdFe+P*Xf(JhnFoC zbd`0=t~;{q`v)0=G!vPuqYGmNXQmov@l-{hlAfM(`~Cad7H5}k*_pX@+e9~Mx1*B3 z4DPLK*gko}qW72XOfy@aQ_(tO_xvLUvb#4do~oSTr`g(~q_gC{eWH2NB;PIfm*wSZ z?&a7YSYNGkL?t@g>+88=-D;P0p0d7q;n|XWBW(Xs=84C6CaZ6#Z`9@0i>wQtJ9FvT zLoO}vG`|OLS8uy>_j%8S3)<XOotqfkEI4}@;tYE=f&*8$mb~BUas2DO&&>f<jVGTe ztyJ|&wc6EqWqnIfkK|5w^8~Zt>Xv08o~yT3KP!3@wQh0L!!l2%{a!qiQkuo&9#}bV z<6SgceaSSjuRA8S{SD<^Dr>?$>v$61B|(>9zDbiZeAoUEdn~H|XrI1K<C~yoS5H4u z=?b6xZHMZQmPc>TNyXOm@>hzbFVwkEA>m~#tb1Wf+QYRidJdV=#+yyN^eYZM){a}H z=is${`+=1qbDJYi$y;n^^JQE6X2!~6x%xZOHXpgUYig<YVcjJLJAdCRzdvu~jai3$ z*)9ZX`0#Uh>g<Tzu669%xyMTTOOl<h^`6M>*mUwFO9)fw<}KTn8=Yv@(lv>=_G-$~ zkGdU)CR%T_P?J8l@{T7{&<EpL!aXrkd7N#pR-dr7%d_9#eW`jn-;Et}=gi%||Hb>g zuf1Etcn&Q#=MT60WDy$f^T6t2^#(OBN1cPF9KjDK-dvKU^0uly=TPa<sU4+u@2Yh6 z6f&D!IP~D)Z@d0V@BBSZne1!jq%0rW_;hH8Y&d*Cm&<)aRH<oG<onF7P^Z<!3w#$P zs&(H_Np)87KENhuafahiky}C4x`e!rqhBwiyjl>LsPFMIHafZPaz|8d-{v`YuW*{k z>Z~c5!QrsfJ->VP&I6~OWraWDIr94K<U4CK@&&qiy)I;LXWPwk_?~!<3iE75QGw9; z)z{e^`L;I(vL;$?-fi}s@d&TN`kHX>xuK3z{_f(E_kI`P{J;9Xe?^q<ye#p@+r>?1 z-dokXJ|%tivam)*q0|ay<6kd=w5K*@Dfa|L8av-RJ*Q;<Gj;~)6p{WJf(<pw(rpr# z7xu0(;@x$}A*yKx`=3*NmckoOZ%_Xl|8A0p_8Ae!-CailbiHoZyqjjt{q3}u{_L;c z&Mupw8(kKkA-m<cuc7qqKo5iXz^0uMUN@DF<}^$dI#aYfroqjBXL8X_r%d*@3xm&e zKbawKb##wM-%i=QwMA#vYUWPO&Ej2~o6Wv9w{C^(mTf;5POHhDET848xu`I@Z-uSN zWZzv&ZI8{_b|ONbVQucVm9ks5-CWl07qR_hgnnD}ygivgYTXXnOLt0#ctvMSb@6oO z`n}stYukINmw6X%J=?$Ev-iq`e{m}R?*`qAdba<zWA^O-c`NTnJ=-7c<#GDY_e+=W z=UX0i7dut2-!i-Jd(TV9?>Z@$HvX*4{J>f;*<$6CpL0@v1Wi8lHzVp)UHGT_53bzT z|9jU;dryeh_mi$OX8)fS=VH4to^$EuUth{C|L1P|cJ)oU_Z_{ZKkm(9h%ex;@c#FE z;pO|?Pxjw_c+Kqp-wQ9_yMDUQ9dPT=8J(Fyk~_DxYk2W`PLyf9G>hfIyM{7#`(0b# z>Hc~$-D>l`u1!6G8;@#)UQ|x6F0SMHv+y+Ag#7=1x~K8#1et%hkji{?S7SeKDRcLO zwDzdir`g3C!!%511iKVW-&<V#yIVx@3ftQMO0FFI9k;(LwY+!bsGqOY60<>WKZoM| zM`5c4uJC=BX4LXYEH~Uy^Sa^#rH*CWLshQiG{5o|VwlslO6Z8zmPqHqrj>pS9Gh=x zwXWag_we!IE1GNW?etj~wVXk?@aM-qQEu6*noqnx&0ZT^asT#9t|<1mg|9_EZTPZm zOR?59@e7PXPpw$B7xpc$Um@D|aC^eCaEH&8^4^=TzA*MYT+^HV_m<}-O*N}I9Dk-8 zKRX$_<dc1y;7aCN4@vIR7jmXqs4pyeW!v`roM(Q(rvy{}KBJuv5AN08H!ZYbTWK-R z+rF)yqF&Y+zT2e2Tn~C=x2`^MSNAYu%eK62+qP|+%PXKg!7w0i(v4lecJ5t$@!*W3 zA)FBxUq*iF<oV!uVA89X>KD4pMXgN}<S!eCN}Ik;W!^cf?q#R`=U?@Em;M*eJuyqs zq<;p}`)A3CZYGZ=9?tkUCoSdxPtCKyX=XNV<@4P;SJ>97TBZpLp1Gp);@;nxHsyt< z4rx5xpPL`)_P5!pMUC68<q-4H;)90-@0&HTFm2IKh|J5ixnGv!zvSPsxu<&1mz%}e z?f-l1`BdrneK&r*JbpXBCUED+<<q5aTmMh~-L7%vhxX@V@&}D=Ep>jFMz#E1a=iJ{ zMzft2@{c*2IXe7ytduM`_3GEzGdEO)zwSL-XI#4Yv(LWbv!}Q@i>~r7w&OHEYin@I zX!eeoR{C$Jp4~9#D*J)w#b#QauG}j%?(7KOXE?npYDw9v2}XBzOx)d~HJk6omMc?@ zA5HkJ!=2HVRrNiw`uom>{4(E}4SXL=f6gcM;$i+ZW9GM$y<E%kLAn0x8J)Nr>gzP; zpYB_?y?FnVmF>@V9_~<o!ZEd=+wy3F%}n2|6DFkEh}?_}UpJ+zuuY~}B>6&tr{#a8 z^L8v;hJwqLRe~9It$L);AH*K?`0taJYpz;P;<h}<Tp>4clS4(d1do<Bua&99Yvx%w zt0WnMAJ_8jeEZuYRb8m+%ubKJg*)?=4jJ1y&WU>y^6Q3g@%)|nyMJzb8?$u($>*{1 zua`TYX6l|$IKQU%lgPSdeS4oDb&!}_(i#13;gyL7cWw1ty-yun=AK}-_0Ye~7LxbZ zso7Y(EoWKV{O!anfy%(e%-R=j<+<E`c+D~UikU;;>W&p<RUa~3YSWgy3yNB@MCQuX zP0EYcUzb1Iku&LE?b6jZKfXMx)~xX&ayRc=9`6FVH|%l$mS5`pZ><0HBjY)-`3?Vn z+_qnRxX)305A)K`(YzcH`4`jwt?ZcgZpqms$I#clUj4@p=^Htezg&^>uI-^n?dDtT ze=dEtSoHbxd+xQ(+f3dji$C%a-79e}@St9)iOI1^E0>8oznF68>cS;TTY>^_nLLx` zIip%z(Qwpow(9KCol68v<mNxP_|^5i=RL2jyX3+=EDra)S`gC9KlA!=i({)ln^&&O zy8k3_tKzQUw!iXwPBF^;c2m2XU9h@-xBRo~5%ad~*lNd~+4)sw!;{p`eRsXCW?3Fx zHAh|}jr*aP+e5ZlnI)aN!oEBq=M=dotxz>F`Mi_);8N3_y_b%aSsr}5<B+dW^47Yr zX_nj)0v!c=pRX+xv$4H4t9}1fos6_A=MER8FH~T!*!p?vg*3KX;giGDA6#1VQt7u` zOa4xYa=pF$2e(@tj8?n<PoL{_ym;o5+tW|f#5v8&xhiD-(!7VY&Tr+*-NA1cZq0Y~ z`h8u=;rQK6X1Zb5lBQO!tYX`!^*n@^d75XYes7YQ){YCkQ?zbsU%2I0_0%}x%*`05 z>0U24YBgIu*(dhM&CB;>i0zhRY4yc^h9`CEbsCRu>5bukn<G~HU}fv=tv>tawgml- zSd;x^_KD+qEw}Ga%-=hua(@4pNei!?*v@kN+3W6W9@_g(zMYmRDB5~xncmu#iPOAR z{y231_p~`GXQ#}{>|NGT__|#2*{WW(J66l5*t82g)0lt#nWd<N)g}GY3(R*fc>dwY ztxblf7hb44ayX#s#PXGYzNF6#n)g8Dz^%EbHpdk6L_bnHS-q#6+j@Pn-qQ6gRf}h) zgzJV@$x9wq;#c2my78_}S(x<0y;|-SpLe-QX0G@mp}%jP`|p)sYg=v4+)@1eU_yS> z^}v#+uiP}mSFAhzP4d+*?`<39cBQgqv4?C)R~F7WYg{g%d&|aej{o=Tg1UB0j<1Vi zldLZD2X8;`ChPEefv$eIsFlo&<H?d!uNKD5jGg3ql!?3KO81c;51&}R@2NR(d#e4n z{Deo+YgSI{IdbFky`P;Qr^p+;TKQE{C~M2~`MWri+NPd6mz|!yw?OpTF_Cq7;_KZ` z_A!T-cZGjs_AdBZ`SI1%J--%Jh;BYy@b&nmQ2hg|^{=PaMI}EFP(I<x{jpT!S5@Jk zn<`UvHSbPcJ!RLvrmw56ri9P`xu)w@?Sj$^)3(LwTU2oUXe|2dCN8J*u;+;A_VDF( z?sF`EFn&I(mLY56{L<6n?7P_;HWx0|Uw?UbcCr{Bb8&$`lh|ILOK&e&Wwh@4_(!3B zv7F#etG_=c?D(tmbn$MRYjT<Ac~>=UQqjA*{Nl?u@)o{~YFyg`{wBxnwCY*T(Yr6$ zH{L?L?(D<{uacQ-9!^@GX;WMOF{D;=H_zEQZ<loCzH`rH&+YupQu{+bPjKB@^SX?w zF3i6^?fI2tJKN8)`>CN|pT~4r&B^YoW`whS*6o?kdTn~s=cx<h&3ksv3+JAt#O?cF z*H5MIyKH`Ea`kDsF|}>nF=;(}Qp%tE+ct+;2{&0bdWcniF49{nYtqEVA^*2Yf5W<! z;j`zhxiVve>8*r^UxE&IPK$G1D!L~$#Ml2s_WN_36<p_+)}Pz|)n)%8`>W}ZH!mEr zmbX5WJ72CZ`Qz$~pL7h1OGNgyid|?F*p!uE%&v4{&5PSpeFN$(dAB*<vSD`mbYz$J zzQE~6r6t%F`z_rY{P)u;E$1H#`c6;M-=BXozSH<X5$ExV*B@&Hq<3g8{UWD#{5n(o zmV?zB=P~&|JS4EMW>sU#aT9KJ&V?=C_3dQ9qbk3v^Q+!Phc4r|#3$50u}J;Nbv7ZU z<yZU5=e_-_e>c_GWv*x7BhN{jET%5M6tKN&&y!P9cHLQ?HAy$KKg^sT@mVBwrD<R@ z&;2Srdxi&(4~DLq%-g=;cj{jb^Uw1en{~WBm&}@wuevBeA|Rx^X;zwon}OLWx8yl( zhWjL3)r&Vy5mnJRCCFW2!E`L5WA2Ha`={8hJ~!oP&Y_pFKaW&?fB0p}y$MWVM~ro) zu7!9jXEb<z?zUDnD(&Oh^s7Q>-g%b^Hzq%@aA)jdEs3|g>ffH8x7PX(TmQM)K0g9B zOlh{-E2sQAxyf(ZrAg9GiKd3eUs$#nN<4O{Ik>b{Y{931pLV-DZ7wBBKU<oc9QO2x z_KMffb~T1f67PO06u4M9NzZwQrGLVu?Fmtm9aWPqe%kns?eY1qd)13hw#K~kZnrQL zwmKH5+;M#KNzb`Y+3)`R@r_f*>;W^|_pQG!gmsCzpDX#=cUw$0H=}RHh4ptnNw+oL z3}@B*msq#iTS`=EgGt%fjO;lo|4Vz%#Y}!BD}K#tk>b&J`$c!C?-mo7FwK<pW#{Mi z%{zCle0K86zUB`MZ*P1|=VaXaA<kM@>qu0wl>7qseQF_RCUfkGDOj~<^*h72FQ@cp z`mc1K+#PWu)uTmP<b~d^wJE6|!#UHJo=Xzdc`IX`eSMu0>)FL$rk{FxXoj(Xw`p;0 z<?Z76R@ZuL7qp&_d^)eC&gA-`*SxD58h_L=Uj5a&^hV(IXR?Nqe{Yy{G_xmmBL9M` zjUnNkJA+SkFZ$u5(#dn=@kOO)J|UktrQXK(9&gl_zH!b?*80^O;d`sso!hzDd1`j` zt0fv&FYo_gp|swX)wuC^MB}D88qXST|KqHXjeYKrAK9!rGb)33-U%<A?0fm~8~vZJ zkFZ^}Vc)*17Pk&c&fc|LM<z9g<#KU_dxq>5)#Dd^%6>}bS)8>N?K4jdRuAAQ@Z&T8 zIAz)$>-BStb9k>Fy|N?Vz|<XI5>+3q`x-fG5u3o_vmcqS{VkQ7`uUiS+p|4YS6R0l z+UC$0SFrux)FT%?x}$@bluA}|xD{G#{HNm2ci&pNz-mJi(;n3f){Rr`uD;(<JSmJp zWbdyhZB@>`k*nG6SY?>ripvVo-V%6CEBhDgbYq*kNbYOpXQM4DKjdAo%IIHNx%Bys zH5~h1pW457-4vw)ans1gu*KR_XWh9`x8-|q*RD-rp<bpJ)~J4N(PyeIf3eT@mbJ~U zh{&If?anuBoY%kp_WSSNzn2%!`+cqSX~GVk=8xb1vj=!HvxqP-FmNzD4*Y6%?q%fF zEEWcaM}iCtTErd7SyGaij_XLyt<!V!Z<`4mzyCbA;B5Dn*5@Y2%oZFlIIu0ndhUFI zjk({v7O0*IQtD)KmAtn7ejrzdySu8y1IZUhm;QYG@!dZgukG{ozwg|;>#vXA*UCs= z&7<F*8tglhCH`y1RgE{jE>1#P+J3K_gr~Kq1b^7`vp;F~l<7~BBR?o~PHI@`^2Fsy z=HJX8_V07Gx}wy6M@-zkKK}oY(l1X>-)(64yLRLL$+3Uq!-{Vxa&oRsIrp@|rbBjm z*B_rtGnU_6(D_sS`u>Tk=O1kU`{C?WJ!#Ee;T4XPikRxT*`$R90}a)UPu`v-5@hqy zVXO4nh`S*TZ!A`N$??UlpVld$wY2@~69dhuK4nuMDX#n^z;uOMTW|BG^QTu|y`=J> z@+5morG4r3dDct%MT(49dMXr6eG)q9eWy^Ba`UxPTLp#Xlkb1NI;C@qn5gHc0Bx>q z!p2v7j=VY0`9vqj?AxQ=orkAwSDP2~a{lak#{=B1LavLnd|%Jw`WE)kX@1&P@3JMU zSHD(i@=$*CdrIH)dHX;7U7aoAQS>j%=lq%GEnJpAje{1)PF?cQ;NNQ#tHuA`94vil zAALRE<n^o6^KI*PP6^n<FX-XasInlt(WA%V-2w;I6MfHBM0K7#)R*Vk<ZIa+<$7}C z%Genm6DCbC)wG<<xJG&FkCNq`3-|rfKC!^&<I;@O3y-UooOe@M@PxtXV*4zXzb*o% zEvALfzh~D!?34ZO`23-&wUxP@wSi~Jo7Erhuj5yiKgqjWa>DFpv$N)v&USm-)RND? zbrQBMUDLa~w|hY>2V=>Cx$~r?{JE-&(vG}3c`<Dn@4<OV7U#|UH=6DF+PNTvB~0V0 zTZVAL3ZG)_5Gf<~3ngvIvt|`kC2<*rl`M4dKkM_2izl*6dQbSB2MaEI^P8|K|NO^y z&tp#*ChfSM)~8VZ=z`vpS1Xru1#@qi^Uc{icbV9UYUWRG0*-7<P+q)1?x5RIyUk9m zX1}*3acsJxS+(A;I!wv+&DlSf)^+TBd~Vl;J1MtwSvzc&mZp5Y!m;O?+M#*dq|d*~ zTzz)gS?i`f?}fFmOnFfqZMenO``fqosrr1Ilf}Dy&9nHf3OfJ#wAE4F^}#VA=G4}6 zo-C=S_U%0*<FsdQzMSjPziFG?-yW@9<+bFKy6sjYqeEKtZO0GleaSgA@!P)XY&-li zZ-@VW%@Qk_`hJgc^yckL?k(ch_2rwDqa!e7qq3F%@@G|B<}aV>eLOZJwNEJby$j3Q zwEnP+RJ{gw?kARiCtRPGC^C7%iXAgg&f6j`uCQb;U(43%n|sO^-bvBV-g>dsWux<R z&lzbuH_u<*Ywq;@^06lm!e$G$Y21xa%sRv7c>AT$UH{wP)=5Y>mM(O9@Hu40o3C@0 zI~6V2dnjf0?XB$jD)|nF_$t3=mjup#_hRecMPZX{%N0{?OhxOqIfw=w;av5mD?rQP zXy~%1tl!%C8!r64()i);m&1_@oqrs@)1v)b(I%qm=fk~mbsN5XYF;|s{QRqTw+#JX zy*0LJ{Jws(xa6fhUk^x}xpMzMD{3(ovNOu<CKCh0Rt^RRZ6b@Y(!7Gi5*){2?G3%3 zf7w8w?tOe=4u9)PuS5@<1({LXmc2a^wo1sPqU+9&OA@MOPb`FgzTa8=E7@5@MdWPI zrC&Mq`*y$Iefr0m{f2Tq=NGKs=vut);?x4id)!g}$^B*reKMa;xoDbltm(Aip8YFi zy*hH63!@dEcv&ws57@r-@F&%p-G-srSJlc3{(XD<TX4Vqfn9(7w{%v7i1;O&-V$7M zMrv&{d+3vhDary-hnPP}-AVM!p8a5bhHbCzt>)0aPiGIFU30>fGjZ-@ZE<OPZkF@w zu1%>wZnsOp^yyRXpJLCuS{8D#{94PRdNw6aCAfR8kydtH!mC{>(-yHV?iRbIvRLZr z3(Kg?C8tDYS8fj3x;g9ah6_@<8-wMKMqE3dSJ@V}LZq};dB^U(onrBe6#j_`=U>-d z(suRMhJ?9^?rwLlzUA<E++IC@(azc>Ycm}(R|c(OGU9%&yR*V&gT|8boa*iUkNqn@ zf4tH+{qN*u5tadbo0e(ZQhsH1%E|xm;;%P#*_(r>1}>3Q@sz2L)j4c2Q~l(FkfP{= z_t)%+Uhb+asAp8ZFE2!~`Ol|>xyMeHh`N6Ko;u}>t(mjE;oL=AT^@M4Z7NXV&RV51 zWv|CQK~Gc9{;ZV-PK#<vH`#B}2@r^%`RnD+$)_gG>B(K_mKc0!qmDyfqh;ZldQYye z4{LI*G-Y=Fn)6!O*u`2_<q@-;r_?EpEUwp9v+n9msub~CBpSKEUy98|$G*UIQ~JrB z{dHV(&Zq9+dOz7>j_SPj3_<tFDRsL$^2IkFcI+(83Ozc%@$OB5vW$Hb8iii34$iU2 zTllc+VymcX&{3w)kjcA_DT&`%SFtU?F5llyt3=6s(>p2GxwDr|*j;zfcEb9b_2t*r z9=>uyc1nKZ)UV-2;Y>5SeU@-6bGpm8A$@-4G@p}lZx+eC5B=G{<;R}8?emr5>Uj^R zSu`zt7JgLUu*H0yV_Qnz;-gOv<hWa{x4XRW{^_MYvw!~AN6j`Y`5c8hObiU291IM~ zc(YB3QBrAU4zAPVwodiUmogM+d;h0vVv&b*?#&kGB_5&tjFXfU`A)jM%uT+Qd~NFW zxSz_W{{8Ob<y3IIy5h9QhK%D?HuCRze!A9A<Nw6{;<TB`L-*4PqVm^jFH~*fzctrY zXO~zai>6n?tY&BVsEmlzUg^5FZ%^e+qaqJ#N2&Mz`xU?OYm)S>8(Zd1U485D)w5^6 zZol~SX(-#5THe#|K5yZyo+{Iopn01|?u^jd_VkrmA->bRe)L>qFU~o!-74tF<dmo@ zml`K<HO|vre4vLR{_(b}YfblW{PfyE`dZ_~Rn4kS1t&JwMkVhMG1}MHzO&@ssnicA z6f^ud-8Q)2-jTfh&BZBe0<6y@*h%|~_g_x@xO%~@J7ocqZ<q1~tv@hZ!eiUMU8fJ+ zm|I<*`A_-sIhF~tPIq18j5nTt@5&p|gG!GzH=Mnz+3#HH{nJAJ?#tlN8&wnJTmn}8 zo^E(!>DQFbYtQSXc^G~vKkK{}zpiteXhG^4*XvSeV?$iuD7hbO`t)H_?CR&Q4>y$* zHEfG5xN>M_|D~eNFG?pKpDgyfv@+zu64B&858dXgU2d(MzB+s3BFohaLeB)NnfUwO z3RBdY_C=p1>WbaD&Izj%W-k9~b!V}y(z@~;r<<qcTZU@by{uQC)|Pp|{Mr_-|9Vd+ zr`(!<kFD8QGb4y~%F|dwt^E0EpFJz>V}0b)9)C)Y<U4ml(^T%OaKhzx@85HsxE{K+ z>*^NW3w*ETOL#IDc0_b3t9U$|P`_)&k^A)wpcKf(00M6VznXz)7#78r0&_Bx^uedU z>)J1J1L4pL7KRthj7%VNAnjO?IY0k@czjBefnkdpBZCSqb8<41(uz`3ODYRe^>Q+k zuo^pO4u6g4)v3qNFYb`|D6gcnNGa)BX)O1Qq>|V$=9UJ<BPuS_N+s3a`+ic}bEf*t zY;mD$Ti3nbwC?mTaY4a}x2|297UZ>Z>$D)RwM(Z(c}03_E}gRUN>KLNr6yaaeLFM9 z*!cUsox=9>zdjbf_xJC)nLCT0pW9oWCinhSw2%4h`C(rVe*9EFS^fI8J0*vGf9zl5 z&-GV2JAVzYo$fj&iBBvCPOW6%pUNP2kLAOQf@gBiWFKwJd&c|d<L()MkF2shQ}(D+ zDouFfu30x7Y%C{5dahwyc0@*f-m8Q-^=oE^yE~R=&+t96tMClhGm(#HlG5}y?(3^; ztk^ay(l=*C(lq0I0r|}IGQsm#jiNjI`%=RU)I0l2jn)gx&p(`_K5u_tq<2jc&*oV- zET$CBczi_tebP6f`LhncQLu|WoTFmaoAxf9t>gTYnaoF?v89QBycv}yyzyz#Gs8#4 zhi5!JbNk3Oo8p!qHQb+#Hog^0<Nny1l_vY~P{cFAN8N{K?w-l`=&0Q@m5)n>isw{h zDsJxoQN+A?@{PFDIcocgcsIA*Fl^e{Zs}UHb+)C?o1FAA;rP|baSCO=DPh9#@~0}! z6h3-dmL~qO*Ygb9qp5*sn9neLJe&8-U}H7k=H?&Qww{rCbX6<OvbgETH>EWGjp<UG zdw-l`NfZ5e%ivkwGu=nKE1wx`ELSXU_z@@knQP;Fv1hK2eqT2@FZkQtm|y5Ww~v1D zl#0DGZ#w^3&{)}N5pZ^mVqL`1JLh=>*muulKGH8WbMBFao@a`W^t&5rcN}(}`Flq2 z5&utT93P!vddBeavRj&TVTsLWfsgeEz8K{T9WOdl_b8qBOxdF!B5BGWKNp@!J|gWb zG2PPdPm<#1=@y0Bn_GW8Wl1yr_>ALO+%u7ntC@<YRAhsKrBrtF)Qa7+ZaVx)6Zy>W zS?^=tX&Lpp-7_p*=Hw*CDb|@!z3DV()`>Mq_mu16lllaixo7M>BL8ZpcxU<g<ZHt9 zGDq*6pQCaw`pg^Ue<tlWJ?E@T-6mK+???{c2?x{7^G?h;zb3&?(D~Du!bi-qXX=tN zls8YdSUl~f2hZ#iYt+xl9JV>ZBXD^4Oy?t!y=VLuy{bynE&Nuntl!eHC*s5&uQ|oW zo2OcQk9t=5Xb<O^s7HSc&qzILns|omnTg@1en|yA9Rv4{K;1KOj~1yt3r#9v-rT%n zM_c7Q3FE%VlXKMc3TGxCx#4;y`^eJmM$sLG!ZS;cq$<x8J;P8~X<pp3BT2A$g2erE zZ`9W9nR(O4N8<b%rFE;4-lh5p34cDL_~=zy8h@be+2aOj=X2*>zm#@n#!aiesb$5t z_lPY{C@<MH?djL)ItD$<e)jgBRQRz$z|}C9_w(#L^RzqH%A_T}=3ef7S$y_ViSg|1 zJ;#y?J(srJ-c;@7)}_AM_nJ{{MZ%9uZ{#+g_PV|2*p*XjBR41PY))%a>{=NTP^xrR zVoR5smu&Bsxe}-1p3UN0wa#$yi-@ERYr47KuDy3A>#?i(%I&vKv!7HlUn$-E{*1@% z*@i#f^*s4EMQn0PV8+I(uD#Rt-@j>G!nsM`I`#DB<t%ObrlQ5u4DT1N^)n0z`CF7d z_wCZJeM^=HPrhre>-23(SWr)Z*V|oE!4plbC;VPp7=3MXweR^Lzm2PYd+DX0*<f|n z>!9&7vEr#sp<<6q^<IaBH923@7vnm*CL{Rf|0gA)I>~K!Z))CZdLeFmd8X2>5I(!g ziZyO~b>GK?JT6-OJSxrKNbgGE!E3J#y^noabUAyc(|vD=MIo=Qv;NA8nRc8fviG!c zwN+Q^oTn<v$?DgZ1nYN3d^uiNy1q$l+LPQPlj1kLaoT%V{no-q^?Ea&ZkoIIZjtO_ zIdyeIokY!~-H{uLZ+s3aO1f>{l_byO_2WCw?(lU{8b9PeGE7YjxUxv-+M3>Hv6fnw zoKwRV?w=BVIATiI+SWzOdzF=^NWJB|Uh@0u2@k&3ofbxFhn-Ayw8OV9NIYqul3aD~ zlwM}B_Q6Ec<il3;ZY*m)(vr9O>Dh9x#;m7OImb88)hp%xC2?O@q<dY>wxpB#C-$np zGTf|le#Pv-{!rssnfJVfzb?#by7NZNyJGIQY@?*^qYExy7r!faIrxyO`xPnQ<*Og9 z7Z57-y0x%T)HKc7a<%_i0UpOs>z{5ZIGDWkUfJm<nhzHpyri=^CTNid7q?frxXH#8 zlbN>D^m=%w{n3tkr#tD?)1Ad1SB1Zp>q-oqo9q&(mGrn`+HFmK#wu%*f}qWXwSnK( zxag{MyZ#s0y4>Bw>Ex@+^Q0Wpm+suhs(vo+vS&z45sUBrU6YhEignL#-JI%M@}wn7 z`&%`;zV`CXE84uLDVgm)I7vxWwa9sI#J5wC*YzrQotsh+nZI#E<=rEdU8!PG*0OKQ zSYtyA>Q-93(wI=-y7%lGk1w7VIhJ~{$4bv)3$+Qm9b>#(<>?=-xFwff<en+nl{1HB z%1K?@mb2Em%lEB3o3Y_c%%Vck{;RB$)h~Bm?VHDW{rX?#T%BLhAE$RDwY}1aGH^5% z&#ipt)q9~b(V2f2qoT*wLQnGw))t1VheVg9pMCQ=##lG9C%`6Ea{3mLz_=@_GOpQW zYbU*2_Ew=tG<K)u<x0-dnQxcO{d9pRwf^XmXuj7zp7X8;ZkQe><gQ%3Y1f&DM>pGf zZg6&v{nDKj!jtxTS5mx^o|zJ7zGIiS(A2&Z*A?2kPN}XkRNlFEMp4Bg;p}xUr&xdN z@^w4Tm&KcQQ~vs6$@o25C2FTO%kHtfx@NbitY{qf@9tB_a`^I}JgJP#=XTrublTfR zi#<E%I2_(O(T3+}P{fMuvU}twUc1qyr_t$qwSBLZ#@Vt{pK_NjaZ9z4suY^~G+=?c zdRD}Wwx>T;O_S{A=Kntxd|kCkY}%El3pCnX--gU6VA8FawPfZYVZN+l-}C!zr%T6+ ztbB2+_D0(&-rb9idu^DfE&6Nn#*L4&r!w6O?sC*|k?&o$=wg$0Q;d>Ffyd<cbxw@- zk1E#OTXjrGykz^du5(_Wjs*qnoU>!Ci0jG~t7kpgux!r4h(m|=OnS=V&G*#I|Dvnw z=L(0%8&_QmyznRJsP+%;xd~a~i&J7lo=l9L#+ukRRrlMJu2gSfor*<T=O1la!%@=R z#O&kM^nklBZJ$q6Q-`o%pKY0*<-#RyC*<mC_Lr!-nDts!*7-!OTH%*s6+ChI^7qNR z^5j3q+%B@YJo$P56^?_Gug6Z(n$B*$cayG!iAk1`lk=p48<)SGJt1gvch35cAzK&3 zEcWETYJJ6hfBBK~b?-Aa`dsZ*(b+QN=9*AF_FTKeU(Qs{ox5X$h`7{B!7g`my;Eny zqZ%?oKlsOTz1%m+g5@Pg(@Be;FPttiAGPo7ycsr4)bV<6(4PYbx9a=-Ke?QN)BVDf zjj_{e56*x7<frbm4HvRR*W`S;;nfk;8{rieV4CE)a^4cQ)Vc%HIwqGm25PUoCh&Xa z)xeiVQU!Y#v2?L{7eALOWwlYZsDHrFq3w2FOFQz{gd1}br@qxo|G@hq=|=9h-)o!- zW@OEKvSC@|jFU#(y9AvtMrIy&tJ|;U(J6T6dv41Xh5LQe7QDJVz2$NCHj7v6s{h|F zU02@xgG)=~hw`^F?d3Pt{9O8gb+X}J1%2@pOR=<H;kkRY?RQ?PXu6eNoyoaTwQF8> z+T~yu^J`N@=PWsvD&sqKHrLe&OO7r2QsHeX6!iGam5lq7TxRiZ`M6NEbM4PXtNGK_ zS1t`v|CAIOC)1G>^F@69Nrj-NpVmAr^OX1OTVtxXCs<xaV$+lzwihZk-qP7SPx$DL z4&fv{NtabI`+P6|TBxV}OHa&tQ&@g<>zrka7OAiPl_zQK>3dz+#Xs!wu4OMyW_djq z(dnHLrs?}X=itiAI?<ZRO>d4>txnbTbepU-W%`RM?UjW)&%V80KJ|pc${j4?7Nud+ z-);%Bn&qpnpPrF(a7J9oo1Eyt$wHQk!d`lG^T|2}zx$99DUfEh^UJL6Wg6e73O$cE z5(;{>&L^LnjW1>io4(blSyx<I-tbOaelp|8ZPwh!ZEXswZRaCIPo4dDJ7J&T#g^0C z5>)2-u5MG<y6SrFnxvg)Mch9uc=G@4uk|OIqy3)p1|OPe^7QM}EEb`?mu7Btm^)v% zZ%yXBO&PIQZWsE-mK18c*5~MZD6c=(ebw#s%Sl!{7ajMSptb&@u-}@kBDOo9b;)V( zYR$UTb@XT7TUBSz+{NzE7Je0B@ghrCMdYot*gSWWfB@&t2Vx74zcMVEI&WUaG~df- z{SL3GIO=!%aOnKNZFk~s*Ke4r<ZgNMohsXY%d@}kuV&mUag_bHPuhzo8q2kJ96a+o zfA^mQlM<iq(mCb5`BJg>pKCb=`nJ1sO20;|{JBv&mvMcD^=zBCxiU{he9o6mvb3^1 z^U~1kU&UjoxuWXQEvvcQFYPp`dU2cc;jyh+sU=T7)cm^7lo+aeJkav`yQ6<O3pY7U zyy<st`<xuX_j7lhFpJUVZl3K`$GSY=|L*C#N_xf9PjB_o61n+OQud3fxz*X6WhVmt zw!N_0p}9M!MC_0FMJdl--LC#0K~FT=*Tq>&s7y%`5x%nK&HezMd3=Sfi3Z-2U)S@- z%-6D<<@4V==$6aHj?Xch<<AS&zf@IpDXiSB9j~P~o2f|g6Zh%qQ~xU7Ji(g1V9BJO zo>_r`CKFvfrc4gh+uL)^BXEuVyHCc}J5^ktXsJ%H^Ug~*IO@fEGG6O_!pb~;?^y57 zBHh?IQp@_as`Iv8dGD}jjaw(XnAl?psk&V{`tve^o@gvT;oo$%J7l$c<dvOjk1t+0 ztfpvqHmJyc%DmZI7R9XFANb*Zuh@_1YnfGZt_JH=RW6=z_GOt>$LgC-?;p(exb@2H z(&fv>wwF)N%=6oGLU@)y>`M-}t~LKJZ1FkIbNNe3m}bS56`qrOEY{!u_-WdDseiYl zt+T~86o1-$|NG~~Yrk9)5}Tes?X}oT4&hm9R#FWip2DxgWG-kVs`Ncgle{ic_Tjwe zri0f%Ee<y6Sb6@vN%b42`de%%;dh-R+kb4~QnAe~yY<dAZI1tHq0;@HrsqEFpYC~m z&V&g9k1LMH2S3q~+0pfPLExhk3l6V{_UjOdKXpo5Ypaa=$=6es9GW<H-30&D@^i)9 zwQu`s6snZ}%{b6yw$9XI{h92P%_23A9d+FUKQ);ux)jEJkg(;Od@6BD<jde|o2_(v zzG=5q2MKQ}n(_EYyqVXM7a^xKey?XpaaImoV}A3+iW{vlHD5ecyL$ZBxHfKDa3u7U z+&z2lzY2FJ8n3ncfBMa?GfR}y-J18Rg+D)ebJo#63Sm=bZ?5sqv3KoMUV3hxz@Z&$ z=6biNnf9%lx#*ahNZ*$x=b0+9^V}vcQh$9&onOe_Roq_HG){b;T<qe`b)LQRR&~ys zB^A56bKO<9=RfXuKYZ(~DbM5jr6El~``lFjsagSdjBbC_55IY-^M8MQ%SzsQ!DWWb z2BoSFFBKbn`I&j@MIOjKkzI28e=Wn4b;lXMDHn$^=D26gI}owt*8jUADNiOdXwP3F zU!tjad}7~nhB)_G*O=ZoWz9P#lXAzZLG*-X%12{{>WRC)GUzK@J<qhpZIu~=j{7}_ zTlP&qJ>C{GL{Ho(f3)U_%B7!%ci4@dKaS9Uvg<kHHKk;`#@mi<c`OA#%K6{@QhCQc z^Rs4ytjF2qjAlxU%^C0X^C<j0&miL<W%k%^;;r*Zb0?nO&S2BV^IPT`cct{nd{&F5 zEj4lvQlCuAWr&{eN}pkk^RaylA2^KubTgDIGke_cj>uo~MRkqvrVpwOwH}A3GnOfB zz0GK*e7%NswvgmT=JTvYTrdA=9Y|bKt9~GF$-C?uX(x`vR;)R3VLfxjiNYm+Q`guV zy_Bw~n-I93!KQ&n;qLt-ZxxEmlC2f4*KvPu4cXguylswySgmvdzfms#0kf1t<qTnp zhvN<>JKl5pbpPmE1@7-jvlV^sGgq+gOqD;-eZurUdj+55Uik+H|9)94yZ1!klAon_ z>@Iy^ZkRsd6>|jpl2`2&dJ`Cz{8q>l&-^2}jo0X<Kpwy3&t#kbCoUXj_^!Bo!XJMI zJ|*tH1ini@g4dWE{nI$$?EbRdxN4&L#5;y>PJ0|azu~+>@Q?D+V}E7N8yY>~We~UQ z)A_^tP4dY#;flP8ocoV#b939nS)gCUrTK@epEL4@*gWqg@2=nQpZIF~#<vp#_aEHm ze$VwzdBN@zkM1+cI7Rs-%~lMqZ@=xXHt$fG+dXHm{p=QPIuZx06u#CUD05v`EuLU& z^s4_x*a^>+kJUT!Q_jubuy(?&%N2i4EU{0ncRDn`*TQ~sqv#1u6?+xt;}iS%Qxfbi zS(q?ePrPMpv_WvD1yAt=!}PQVjwuW;<>oaydpwSm=#Gh>+PL+^ht0+p+UGck^_@7d z`o!7iDGAy|Z+A*o$jvN}JEoL;?)(9%lqaka;!jL2nG0?27tuR&KyXQF2-`O$U-5_A zCbV6YywP|irsuZPvEGvhyq=gmiksA!d}7f?$qL?`UoY|GII8uXK46vdBz1>;3d75N zGRYHN!&4q8T(Yxc-aT>l`ZEX8QvS5?tZ`bk?$m+3Cp=Z`1^Xp4_gOJlPsqF~S&_u? z&EA5!?chuUnR88A7Se79EDQAJus=V{Y9OT75?CPE)7G8H6T_7JFi3)Z`oX6KtUc}8 ziA*u9!Vj}-^y^u#ABaD^^@DkV>>u42e)$$p1Ic9vcmtT_n^qPmUpeGkVEjk+4pTk< z<p=T)!glb!O0YW9Ff)LE^8&`S!!kQ$r4sc_4%%e2SubFXTFCp%+4>GA_XGJv#XrJ# zSpV~MA80t5;KZJy$SzjmB>v=JTV4bc>kCHqu7IYc51b@zRygSEG~2ysfBHec!2FN) z9cKBq>WB9q*!?KqA^(p#>_Gh?<`3~76#kg6Y5CvS{vfe}MXvSugTe?_{{vYSLd#p0 zC+OPnzJ4J2ruqD#w*6bm<t|i;xHH__%G+|!C!dXHo8~dsO}^VTxmns(*e(gXdKiT% zd3UKW`zi1JeouPklJ9&=Cf@UK61pV)vh|DKzumX@-ZnBWUq1U{^~vu0!V%T`zh=Jw zR`&f{*}lN_A?t&#uLxg#eZ}=v*H>O&ZN4J=s`S;_S7u+0z7l=)_LbXLt*=;L-F;>E z)#@wNSASpmeU<$R`_=X<?N>`*Rh2gX>iD(d*Nk5~ezoihtPQI5s*S33s|~C5tBtF5 ztPQO7tc|?8WZ$BFw_X?Ig~f;854az)eMSDt{MGMQykGTx<@?q0E9AdfwaBlYzasjo z|JCzX&R^BPqJMS$mGxKiujF5SU-kW@P3i6b>)-!>^L4N9-?+bye*^z|{*C<W`Zx5i z@88(J&VPgddjF07YURE5tBq~E{srq7vS0mv@l~bo?Y<ZKep&hT>KC?O<Erxa_TLNF zzw-O#->;0n9BL=nMaVDWzuNxt@K?dAiFQHqOZ%^Ne>MCSvDZca>gg|qzba~*>;m<# ztG^VjS{k=B{I%WP_19l)t(t2WIe(G=)#WcQf0g{@vo|jPLi)?iUoC&d<bJ9ARa4uz zZ}Gl>{44+G?*IDd4R4Bb@add6+PPaadEct%+N!+`Rnc9d#Cu2Kt*`vqQrWY6q?gTf zJe*L((_E$RBRsivWnl1(s;eyrd4-nw@d=79>tb)Vl<}E6{h*0~u0+th1S<~#o(y9H zT^`nDy*USDS4?G_G3!VDcV4L*`7b<bzvssO*=rpj?)tv##e$0UJv;^Fsl7>8V=Hs_ z?97yLcsG6W#0Sf2UAAY6PRfmH3v)g`>!{1|_AKUEi=B+jEVY&^_rw-1ws^Qfg#VlF ze$_+ei<z`Uwrj2CU2S?+ImI`2!RnQrai*n)E894XO+y$~W=aTVy>hbQmEDl}Lc_<| zJwnPV?a~!i$60L?dzYyNUDQ`};{SVTmW9)MkIe}OK158m*tcUs*KuQAr&m7RFDx!w zT+!9@b-LzrxxnPI+O#th1e2Cko|v8~v?Dd^(8g6tCOb}DY4e^r?W6zIgUcGdm)Y^1 zEa_A=axs{2a8a$#W&yeNTkOP^Yq>wpYEn}2Qqx%SDE5+(LebJ+V*Ku$r#o&;S|!3G z%DMk|ll>thtsZ6F!^}p9f~+<j(qDE+dC&We6WA}Sl^oP}J}j`OY1V|MB`Z8L94dNl z+<7m0arf7~%s19mJHJ_Bes<gO*<rWu_%7Ccz3e7iN$}?RckXN0d50S8n!IPHs>JoT zW)uETnihX(qqldp;8mSx4|9|5uDy8oT13gl`rbc_zH;61DB+IIy&aLG8LzvpN0oI; zA`4&E)U~B2maV%H!N;wYD9o;tSXcTwA+>Vvb<s&X4qXb1xx{rMM3FiB%f^t+w|v%e zMTRtIoC%rKH7ih1Tr1D6HDr0mb&+c`+|DlBxMGW+E7u9P!@(SDPph&E)@Sr;O}Wq% z^v&PrYp0j3Vzav1+ZLXV4WR;M1&=QI-r3Z7+N3aFP3h#4sWW!`6AFyImaQw;teUyX zrDw`kCa)NC&MZ~Vc9q=jHD8^AUb#Dcy5aHcM!=m2?esNU_5H4DigETT<@qdm+p&dJ z@RRJdZeGu3#aCJ_Q(IOvUsxN_bhIOWf&eE|;It(Q0>+GHU;a5(*+)Eezwvw0d8IPD z8^_pBe|Nemr*?yRYE_3b|L3QPc{W~c>?_|VoRxjFjhj8pC9eJFs|0J=#Kp~Z6(J9! zcFR1P<h`b_be_cxE_bg71$U*F{#TO8>n+LUoszSpv{z`2pqgpathTO;D~ug~oHN)N zx%Pxk(6psRn|xQETRpX<N38d#nc)H1wx5Tx-X?6|S>yLp^!47L+2L~!aBnTWcxvqu z8`1oQi`J%vt&K_-S$E9IBx1(bRVyEN{p&684PCLMDI}z`zRSdKVw0wqs%zxp1Z$Dh zW~HnC9TA-YR#$J#ULen5HM4+ISTELz)q937=NGkyi&T7iTCyi-JQdV6KQza2%BB^5 zek}ieyewKeS{)_|Xz*nvaVn)atoXq`@y`W6`KWu%v#O*xD=#Fkh+{8%d1Xg&fUDn& z!<~Q3dH0xiK3>*%fo;Y$(+O7+tfXS>nmf}t*7oF2aO^c)sJLwDzoj-ef?fv6&Dpzv z^}mbrS+B|sy%tBOZ5LP+vUF{!`bGDs2=A^>+l(gtaM+u)L}$)g3l@ue2bhAyu2<V# zDmwLW;xwVAz6Cs&3s_uDSM@H~acqg;^lPh)PBm{Xj(3sI$lkc3uk1_U5&5ijQ$O@= z33m-?PfxF5=)0iB9)9oQS%Lbru(sA$%4<tFuP!_$*YYSJ_-LbUzM}q$Q_&Kfr!J`- zVhq0(r1pSs+b3obcB%G%?nl=?{(1QE=B_jP_7`+++!HnLU%dV4Tcsz5op~SMYgXoc ze6v~k?V~HJ`AvFlk58>#FqJ>>{nm}I13&F?=xxt<pRhSrX+3j#{Dcm@(4ALTKNZN2 z`LVd*x3peGw{70URcj|s<(<CnXwcRhv&3Fp<Pev7VAFjkZR$~-sZ)RcTj$^`W_>&$ zUm}l3yWVUK<6)opt$O+aS6gT8klM9PqhG9qB_!c$$2y^@p}niSwgoV*(_B3zYhj<# zQJ*QFHUGA6SjQP+wDjK6lsHDuDM4!mm$-V_vwHUhbq7Au?mFT!p@~C~*Kspbf*nIv zqrhMOS3eKh+D%!`zU>3Uq`6Vfd=HKtl(pFKa@jS1=NXv_|9x_1E{rkS`fK{?y>BNU zeRk6O-2N|%xY^I$EI7&bR5seq#;h!8uJp3{rN5(}war|=Zs$MIw1r`>__Y2np8kCC znMd7I|0Y+(`v*Rp|21p<=4t8M|2%jUx-KX2{p)4-uCM*}`{&Q+VRsVjw;!v`TYv95 zQ*7<JAC=vCGp_&s|1azLpWn8Ny>vr=zuP+b@64O?-;~D|J+>>ClASec#=ILgn=@W6 zOYJs`E4bLo^=tF&ztgRs-q$_xf7)L$>nHWy0a>-*!nS<(*5CP2@zuB6vc-*mBR_xA z5C8tv>*@aQVo$FZ)%{EL{<Z16#((3#p`PE;H-4Xe?)3las(_;P_v+L4E}gdZ>6%yX zzek<hv*&3{_`hofrzQK=wO%g@+r4Sc)0o*cd94ZE8AZMPr_Wm##g%8)zPq;8_ua1O ztaGx3*T3%G^rn0tr$za?uRrJSj{GBIZn@t5+dpr!)7PGFtG~PG)16gwb_b?E|9<1m zk+g8ZJN9z-zpq{S*WhbL^yS8q^s1hm_{)<Mp9xh@WqaWJe(uif3A^THtk*lU_4bb4 z*Q<Da&R3n2Ww0t)6@9&e^-RpI$8RMJ*ejy1M$M@1(K@!i<@DuszY<;rep@H+p(L(y z{{1<_i`|_Qp1fl!{;VrMcc*sZyG?S%;WMlm!gl=K>ph{|`9#9h+uK)NHL#RsEbBk1 z^S0uw){Kgn{%!6)JWSCl?#;HrMcd>q{r#h~HFil?<TnSA-pf1tj#%v8{#dopZti=T zCHYnh-S4n3R&wTl9(vb2wY&c#cdeT3hYfw3ely1O1x}MH|E519aLu%o|Md;ZOo0h= zv%9_=a{n@ey((sR<)+V9-#D*(cF^{kW8d`k^S!RUNpN4)^vET<tmE<1k7aYS-M*}E zpSDD6lK-bX3!Nu7B^*!wdt2b$vxwi-eXVlRvnOR2SMShxvhhsL%DOKnCWPlrpT38^ zpKGQ~vdE?GwA^PIr&lX^?7p^+Us7;$b<#%v<dxC#MyF4{`;jbjwr#JM-CNn$5rqzG zUkD!*YKVFl{-!Q(qMV*I<8-S}F5fS1<F{OY^T&oWML7){U+gWIlRS0f=}E~)J~Ey? zy4>@duKJH7O8XZ7{;6_oiLh{-+$z;yOLpB!-(_HMG4O-R{EY7p%J+4-XvaSMT#<J3 zgv5-wr>9P9V?XPCDg0-NflPeSmZ-Nc^e*hL?(e#zdsAlr`HK;5ysvg{xj%`)*0EgA z&~07kj-@{xzGPOcb^p4QYf^U0>!fAtvjyH3`+qw*m2;8x<Op9Y)ugaVoF~=i1>3G# zzWzmBzmV;rOgUro<c@Rhe%~`66r8QJJKvG%x~1pEjml-mOWZh5N?xeyPnT7>``Z13 z*$<m#Ta{Mbx72=E`Ap>EzP~y1-*`v5RPQdfS@pbHu=a4-y7M}rMw4C(98>-^Ny_tC zrQqbZ?^I?yclQy0r~C6xUE}#LQ*H0Q4^DdftB>L8%?6e0XY{}9oS44ibEMk5Q)X3n zj2^^((c3%Oea#b(NzcD2bz~$5svdu9ef*Bo8zrm9ySvZx#01XG_6m6aD$tob^!aPA zH#2UE1TgNO`eNq38;jdt>73kF)9K#3G-i_Wfu()YFZWqppIV_^Yu@m(`-s)%i5JzQ z&39QJTPKow_qgJc_;c6f-!p#H{vBCvR(S6{=SJI&v!1M|*Kgq6_a`B?bBDRZ)O&x+ z<Qrbv6i=%CTFa=nXJT7%>gzfM)9Ica>sIjoxD&8j-OB2Y{X?t8^PjxBmf*EErg72v z%hP|R{Ae|P{rPFY0qwmhi}DTHn3qje@7i`xupz_NaM9m~&l;jN<yF%qrnjHDv{vb+ zcJ4+WhhWWLJSJH?7cvHKO0Q^8&1<<cYf<jYM!}nz)~fgUd#Cznvxx4U6<r(kQfg|= zWeYjM-RBRl-1>lXe%jv^ld^>-GoGIn?i#*Z{)zC~D_e_yt9;w<^K*~4<gd_0YkjQ4 zG#5>cIX?emW{kCD$Gz0q=at1GEoO#KIdkE(c4gf9Ek5UeXx~~M8~V{^=7uMccjbh< zeG8xeo^a#vmxSXwEGHJ}epO^#U8L=O?fpX0$?4Ns44>JZ+2p0TCF6I^4)??628Dfs z;nhcaPkd87XZ=r5j{oMKBe(42XMU(CyA_!GEKn|ZpMUk1rLFr4PHvrc{D?~lx5o31 z{}KIK`=dV<_KDrNtoppYzrWLFHSdwq8Yh=EQ{GSdT9f3H8p*yi>GwPq0qvzbp6q%* zS=s2mmh9F`f2VXvo&KtNKhD-Pwf)w=ce=AI?)!Vcbai96_;t;4=a6+*Jr`{|&#=Sh zb!*7$Dm90%!73i-!sdx?jJ%g7@Y?&lUuDJdgS&+O%<0H6cI!Adb>3`)?i7(p#huSx zeU6C+HT|mTusUYgyl`H0T*AuoR%h+V`O$GNBJ>2?Gv<F#@;)roRkF{$v;34k+l{zY zLKk;__f9IC$Ld<t`*vwxM@-ncTYJ}}{G1uB^1Mx7zcbEH;^NMS+6+pM?@V}+8y`98 zu#4HG=ifsGCqI8V<yHH-LYL{a?j=`hwk~z;taX{Wo^$4n)Rfqp^|>cfI!`UCYPvqv z#{S~OCqD1L3Ql}#t6L~~|G~#SPkiqFmU|TWGOC~RS?w!7^`yJ^BrY|w_)Xe-f40r8 z`D?s3eXrhpe9r9HgZUpjYK)^_t=e~0`OwbYR+l^fw&r)g;FS`6Eqvy-ti6}TwMsWP zmu3488@fy0`zP$r|Gs37l4sQS&mL>G?mL|<`t!QV`_tvtv*zFQEqVIcR`H^@l=@Do zANM+<mMwmL@4T?J(S7mYy*}lWlz;qo);k}~nZ)wn;Y9JxpDxeq<b7sT{<FLox}U%C zOz-nkLH2V3a?jaZ{P$;9OH|6^$uZKq<kFbbXMEoKf>&|s@x#t{=E`$cRwj9z{CUqk zIBs51&?fgE5vR^fitOssk@ue&)5o{yYmL&9d#n?lY}htW+Bt6C!k|w-KTp=oZ+^3H zuK!Y(d9i6Ow||zL+OpD5HT&1hDO`L>b4>s0oO$vhne)~2AT6Vg!oE54{a1caIQGl$ z6F0}y<arKf&Gt(a?{(QRY4chA);l&w*QvZeE%?6iQ1VS*#q -__}MZl52&az^H{ z#EX^p!<9FAr|I0}uhUJtWpZ+o|2}hfpJg)~7RCRla`{qZ-EF5?tNctXbFu5~_vVgj z*X=}J)xOXbwDc>}wLDd;omw2&`TF<Ujx6Dl?sHE2g$<XMH`kayVvRiN`hMPf*OYA% z!H?e5*(b%FG4Nk>EwDbJGICn!$+~~-eZo)kr|+?@n_@6CCfvogKE~+qlFxJB3nYE} zK6%Q??dCIHe9qe%Gkf_xAKw)IgUK@IvyTM7^ml%BY~sh$jfqn}&-$mM@+@>p-S^+0 zC+y5jYI~X`<nObeqw`0%@wI>NrYnBEq*J@}iSUv2M)y=*r#R%-SsNFLI{)|DWB+UG z)7)ETbq9A8sC>vbn&#^fy`=E&uBnNvJu|NVGgCgq+2wluXnp!lPqvhck$-ZhaV?2> zXSZJU+pWL%iYCgOTU7kYKH-h0T0Y;$u)qBhyM3H=Z*Kda^3q{a_QkMo>8DvYWpsa& ztJmBSI4keu&%^P>N>kWkidcR`yY*h`@$P$4U%p47Hs|^8wi^$>^!Ioy^%Q?=_)qe} z<(5N}p8tyPJ6pAG<?gTdB?ZqZ>;KBB+Wpk6^ObA$GM&QZ$LA;<@{g!>xK-3W^Q?x6 zYl>|C^T@b5!{x@G1NXhY9hb~zw$Zq%?$Eh9leT9u>5&sA7)RTL&t3WThOA6wRzdap z{sbeg;NOeOw;a)3JUxHroE?*r<Hav(zfH+Z=HF*@-oVb_%%sa5r}(9W56*5Y4!LWo zXtd^`@ZbA-hWTBZ^~xLV^TSV{nYXs$k;94^lkeKxGH^cU_Nwm2-Q?W1X{#fCf3~%` z)jZ?Tk`@0_{pXt>6`kpt_UlWB#DvM)w;!K9Z>H3&J9@MC=ggnLZt8z+=J9=f;WjEU zc1DM{pL1BdMsLd<PU(#vzV9v46@EwN8H%lYvvpz8{Xa2l%-+av`2F+dk)L)4HoZM6 zD{*>GShA00cIVVKX4&%BM~<AC*0^!u!(Cb1mkIy=&hPai{KNdxq;r)8C(_qhZrxPZ zp?sdFkDuR<H+i!CIkU2ilXuD@?T*Txa$3DC@=?NypI;LV%Z>OCG#-4rUf*c)iBBD} z?@ru4p1!Ro<v`<^1Ey9c7S~=MocTz;b9GJ2)A+zWQ)bPOl9)Mb)`YVxdo>b2*_a1y zey1$_?8>%xj}5k7Dh_dcV>^q_ub+>%C-3Yef8M7n7wr7SyXd-&)S`U3J62ZP=B~c3 za&4wq`<IvZCTm5Op8H(Kb3je|+^*X{Bi!}F3?yIs>@ALbv?6lW!laaW&7m)s_F2ta ztHjs;C2h7a&-*PMReHro_AE|Wt8UnAueaEb@9fQ0Uq1F7-yP)D!=(P?$l2gH-lNx> z{Y!lAZ7oll692BFEJ1hqCY{&sQra%fvB|wZnb)uAhu+HNuSBQ0@6$_K`_RjK&PivV znfLq!b<08zO5Z6H{d`;Vk!N}7!83YE@0U!9xMsL?{e!;reMQf132ol;ug7X`E3fhO zDKCVtrJR{Lm3exuw5;^A>hqp=G_!R#zWNc7_UDN3-CYeka;wskw3GY2C;ERosT`g< zGv4y#k(v)8^JDA+j5c+eP7bau`>XAL?OV;PRQ~>yD?2mJFSk}QU9suiDx1X$e7$_e z=fgWbSEZeM6Kz^<yyUB8p<2GHwne(fk(~18<1wC&k>B&@J`E1v7}WW>dYk*w1#`|6 z+oau>F+BfuM)tFgOq*xBEMJwL-+bob#Iwz}kA3=nd~)<BOY<F()4tBV^t12mZT28b zALB<;7eBt4)4A*)c%u^+cx~zDAk>AX{0yQDVVT9Hi8;>t={afnc_ok~rc#cJ+(0-K zV~J@-;Y4jc{`-?(Ff%Zu^D!_;VwwOkNH3+h0KBfWC0EWyT6Lx)%&e#3x%rRW1pdis z{!cu2o&V%ZE|zzG*H^4#xe-vZCt^m-tXC@8x%z3{d$ZTRZTa*2+^^Q@EGMFuu3E*C zR9^ONX8N(s{nNi2B+V1)oUuINLbO!Z46hBB&!jWyX#QIi$7L%P^h5HP%A#FjEyV|e zd7q1YoTjqCVCUnISNrRJz5Vj!ui*|mSNlmp@>Y`Ee`UTYe`)FQ;JUxkXU2mMJFjJE z%;A?mFylal5%Xn<GX+&ui_UERw#9z;MxP7oB=b!l=6wBn+H%WdixfFeL5JpJs|qjf z2zYllE?)nI((Oa{7vzb}nYTxJ=C-@<W*bCrVEJ&^m5U|M^F&R@iAm=sM)RgI-I<fM z>dvE0GLeTW7#;`yp8d0sTgzMHSD-=o#tE7|ULqe{L<HY8|2ox^|MrH|vy6cG&XM<} zCSAz-U7PR1Ciif{kt@lctDn5(v`cqX`^<IVZc~wH=laaN+_Luv-Q#}FN|F|=iEEh3 zbY~@x=-mm0YZ&Zg7ibF|Roq*{Sj-x+^;F*5t$#J9c?dmQm8Hw_IfJQ~XU}Z0iR~IT zJSIyORXMLdICE4!KDBH^?7992A}#S<K_*%4Y(3%X9+GQb9$~uuStd2uozo=uxSfa` zr|u-ZPp#`xU&ci&)~>2Dn#KFI<LA?ytn$*AqRBkgFBmiI=O!LJZ+hWt^HGhArx&eq zZ?~*&v05A_F4cdw^4_@#J12RxoqyDLTE+XZPAQL?<Lw3c)jSnmsV=o`%m2=}-*cj2 zn#b&=$ItXlwmS7(GK7s$e3I4CouPu;Hpm<1NV^@Bl^3|OlfzYELEYV^s{i~e{AUH2 zZ}4S%92R`KJ^ApPn6KR%o6C}mav#58n_JCxWiMATdtS;OR-^bId;i`oQJZG@j=#Jz z**KRecd_f~FLKtma?K1jHGCBPb$6xMs%`u0(&Z$6i@j1j^?CU*{ebV+e`_y4{91PR z?W|XMk2F*Dr0TiN<JWeq4KM3GeDH^~(}HEX@^AI8C3vbXPh1^&*k#JJ(?t?L*2pA! zdFr^#@DEV?YoHO{QSbfely2mO4Tl63@Ai013;Q7X`SZbDb3C7^efRWQ?A`OIdpFB! zuRW|;AD%Aw`qkU@$NeW=>x<+<&TTVXQ>T3B2lr&hn?~*1eoiR~)$a-CzJ4_E;i?V& zr?1(q-`;WUXxzmrfv28Q|EDClwjTO(G9dL&yVm19o;&Wb{54`Mj?+yze}8BEfjR0d zXMWam&se{!?E4F6+i$UJO!xX^%=z~`^sS_%)=FvV6(zT?A9^%FY}zBOiVv5{4kRw- zU|pnZ^zz~#{i#h`)x$5ZTX{Xp-fM~cj7gK16;GXXEA<g?efs&y4nH*Yf81kaNL^*5 zo%Z_m`}+a#?UlSiU(HnP46atNFfas&FfhpAEHlcI3ySiyz{N(U{USFIh7}ucBkt!v zvJj|CTl!ai)eE_ITeJc)F3$DJW92NFxWIMk(%%7`mM0x*OW&L*+fiiy@4K{mqd=5G zIe&He>Zw|$WogGA=iBw$U;6h$Xwzg>4_DUhYd2@zwPJkN-SDY3*ET?|BmU~k$j6Hk zYybTGyZhUeRWmkp_AzT63;M&fukQc4Nw#;_Ds5PM<;jts9}XT0zg+r4e)ZQ~Gk2&d zO6lH+Dad`gFZ?_6^=)<eWz~PfmS42VE!(~J^5@T0f4?mMeC+1R=>0ohm_<KdJMHzK z%sU1%y{gZ2%;T2SGCtLwHeqeEb%t3_?b2x#SGe@vS}R7(H}Y`b`sjjSji2~N6)E!x zx`8upM?Dvl5MZr;@;WpxN%rWir9$QEPfl%H)ju=zSKR^A69P<LCU3TD>C9lN+4ilT z$<vgjBY`Doy_!Em)Xi(<_x<NGhR-r+E3BVkC3!^ejOUpxReSoyCb3+Yt~AGLZB^+? zC7y+sHhkyGd$xFAa`e}dMaAYafqu@vq&1$KJu5e9QT(bhadow;*o+HvHk9t-^wL~+ zGMKIZB;zi_RL6YInAz7?*5<Bn7S`51bYywY&*v8}sLqOEWIy6{!pM&Qfv<z!O8$-u zr(fm&>|=Xpu-#dVIq5}nkdxB6j&LWb+q=rD@BUtWChJR&sLLA}LAQv2{zMJk$2_}F zsq`szDyq%$kadqeWVo>DsO&`U3%2`~1bq;gcxS`Hq#YBds-7)$UJ_MxW7Vw6nQzq( zeDXg0<;s@~-8Qvkllx7}ii9(ryIN*!n>tZ0@}x$4-I-eB`_-Ks=c7&=E|Fuqe)d>u z*Y&47?(fbXe)1_e{nqTeJ=NF451V>LB^660D|z<ca$-NZvbgA(<yQ;G71u3!6FGA{ zetuqOo%U?`ZJwfrdj||Z%{S`r3ld1muw3Gmykp@9V~e8Yrcv`On|2GDYjfL7T&P$e zzWno{J)3G2Ce3a=BbT!}a+(Eug^$I&hY!T2bS&jx|9a2;(*6D?A3sPi?^^mY<7?XI z8(9*UMAnx4H#pWh$I5X+isKA!!4C}UExBe0nfdQaIO{ew@O{c7zU%*;opx5ni5p}- zuhwAH&lZ}Q%6?~hf}eV#<@<j5ce-K~lHB)_;veKHRZX6HN#L1}|L?;cKm02=%(LIK zuS~wAd-Wa1^5TG{6aK$h^wW5X;ajc!8Bt8jnp;0isn0q4uUmPM(aF+999OyLUM@P$ zm@lj%CcJusit}-&mw(HXc8Bfw#ebS#d{0H8OO1+|`;z0+&YC~`_+LzJbA4ciipejf zO^f6FLeKQA>T1bsxtsJX;z!V?r1fzcIs4~CdBonk!qpniKE>(aJNZ{FUP37c&gw5w z*<SZ4A^Q1$Ls`S$UL`J#TI?Y%i%VEHr!noGs-tY$b>y#_$+xgqtEWj?2fsW%A$mr$ z%c}MEQ{VKM$NOG7p29dKO(KCadC`1<gRhkTrT+NY>V3OnPng;7{cBR{ZqK%@Nq_TR zdFDZ>y|-3}oLch3tG4zd%jKWRKhgv2l7eSt+Mb_%$*<>&rtTY2VYyXnO049!Warm# z9{IT+yh{hNyC$(<qPD|EE3LN-3=Fdw85o3+im{^9;{4L0<W%S`%4ykhHcK`vaDx?I zrRM^(n+*imKa?MQU$Ei(stx)NeB``LHQiEcxx)07ohJz<Zx8%+clya=886>GeeiF; zwVvm>^kb?Et50#H9-Y>8TD5Nyi<Yg0b@bE52b}7^+xS}I-EtqY^6t9#nBx}DWg{gG z+lOhf+0PB^>YUp1u3gKy^TD=nv1!VWhlws%^(VIn+v{31Z{p+G*KE7*(Szq#k6vsJ zJLtGi+}C?sOkU*i@+oT?cY0;b5<YjTS)~0{=X9kB6SA8XnkV+ynIGi1ca3#wY}_`H zIxX+b)jJ-9PBkvdeQ4<W|M8lYm6eA#A9(-rgUVjpzrQ(W1+L!z4{1Z{kHD{HZzmr= z%F4pPaDtD4K^Q5-f?a&#OG?t<%|sXbMQ-66lU-mz_7>Jm?EG)=^{aEyuEQ+rmS=}( zF`9A6<{w&;xys{O690yy-=eau8|&*gn>|zA)ACp=bgC9>YI)hSnd#~2^3%#MJna*i zIO9md1LG<s7tXLbJ7NwvbnU;`x$vZIOaFyryD-z!FK!gtTs&craBhyT;4gi~Q?K&p z*XhUXwQjxc^eNeJSAhSH=gW4;FVI|aKIsQ@>Je9l{UY9~t)KtdO4Ppi>YgC=R?wF_ z{FKcq-sr{08#!+=^J}H<h^zTo!+gvr!LHn{tiqt3Pu^Q?y3`c0rMH73kDAU}`>M<0 z<2fZ>8THGDuKLGb-jt;)>}D*-_?K0QjqUuI$9g|<`h=4rTP8LXdRc|#JzQnvd8AqM z%dV~KpSA0*P;vU?Y#_dHf?-Lx#siM~>5bg4lqV->CuPrA)M(eZ=Zb66LQ#He`z{t4 zF$a-Fht<86-gP7#TF!YjGW2t5Tcelgn#w%Z{^<{dHkSBa{3<Cc8?d%PX{zG$*B=|a z9N1ZRB-Filc=vlic*pB~H+A=yNu(<*>gW$WnAT)1aj+%meO}MWWR-75yceCt7P4JW z{`LIQvw2+M>0i#D)x6O2kL{E7$4zPL9#3KaX&T&iaDzR=>B5}U;P1R9xySDb@_lC0 znYWa?_uzt86|OM}4_8^g3aNd!F3ov$;8Z`eWn12=HGKPQDtn}t?dq$KQmK0`m3*C* zdZ@OgZ2QfIOZzO>Hq6cKyDYi4=%sq$j3e6)s%A)k$?Y!_Sp4PUQx(qTf82ch3R|~C z-byc<b;Z*zJs{JcS@Ghzbz4qtXx)2!Lz;wSxs~Dt=7*gt8TMK;{awgZ_1gc!@6-#t zS+mO42VJ|Ac;4Xk_q91WlkdK;k1(lLdA^Ks*W}0VoTPS7$i1K@WEj`>;|TL{@0crk zzEkoVZe>l*wZ1VwSg61Mw5pf>f^z>l{Z-RHeK@Ur`N)-n3#ykqobR>2>D{`=#mgVR zE?pg{8Gd}?;w#p>nWA^R%<{|GyD9t4mg;!Urj-1B;`7%Ylu2!fTN<;ZS7Yz=)eo;c zT`ica$<_Md5~t?M*S_J}XKK?D--(^QaJsOieYT+YBN@Agc~%kAjlGUtH0rvzf3eQG zip~{G^W2xFp6l82YhCQmPnPL_^M%xA?rgEpoOW~L8S_x>|9m?mHs|$chxOG)ZRD%` z+YxtH?#k-$$a_mZ_Ge7p9VBKSJbk}~X3y^^?>F*7Yr`)*@3_8`lfP?v?Z%3^@|6*L z-k2Xb{V#q`Nx139bs`ONyOOW+mkYLitoOQj?ndvVo%0;Ew*Qqn^DaH@WL(4X`&q|r z%!(!?Mk!6?Teg3@$cC%?<;~7yeO&3eJ$Ff-^jnYGPq&wstytt+_51yieT)$`r|$nf z$NF$}e1mJHPQ=VlpHen|z5G)e(T2QHFj1TDg8lo~3=9k_nQ;{*<>01cd5)Y-`NP@p z9_Lm6gMQ5pB6}u(;8%{DYO-<fgrrL+f;vwKDHItRdQ9(fmAe`Hw(-OJYun5&PG+C| zV)vez<};_yyuEA6k`<Re9GRW5LRe^JUF?;XIZwPwT{RzE@3m<5|FrbN4&k7ySCW$Y z-If)0)l747G%0^j=wieCxrxW7@wn48!<6feU31jUGi`P!eQ2IAcgC?}KX!lqXf*AM zj@R1*UVA?{zCKl?`@63HZR;zYIm&vcLN|&$cpc_ZZnf`@Rk?e))y)h0-uos?wCNxE zF}vW(k5`@7M7LJW{y$mfKz-Jx96sB!g8l#M+AE#=T_69^Ie+xy=RM4b00T9;zcbEY zc*4lQz{!q1z>0J7zyStoXM-@T>|HzMY~CCLk=E;uk7RXrc}|g#G~m(Mb--*(_m-}% zD|t$xDF(seBK-%JOub|iDPFr|pHq*T&rBb+)PV3i^1tu+A3s)K_t&hqJn80%uxVU1 zBDvGU6@p_GRZgT_)l|%$(A5>+5Mp+}Xm6W&ZhTKpi_hb$8`|g1Z+>!o*TY=yn3kH$ zJF=dH?+aOeE!HE$MOf(2ga;B<e9i_beawPgg1s_#kG|Vm$`;40ojiU1RIRn$xf%EM zu1Bq0f5-3`hch>uWGsuo@yrFS6S(&tN#*36bmZ&b>eD8Zc2&%=6JGpRY5(+1VSleE z?vraWyx3%s*`U#!*Q3-?%YOJobifIvV*<x+@CJX1?+CkkU~}g>^ZAC|?vqS9V)?6D zGRh5{0^XM^IPde{!@$nC*gx`K$S1Y+K95s`Q+BQ3|6XEIrS&>!%`Ua~lUHknFWtwI z%fH0GDq>0be1p2nYwPNSwmyILOyl)z`HG{Tr{&+a-Wj)`vFzCUhc=J)IVeY)9-CPf z{6=uO?CZeobEd7X{U@2VL^w2Y@y#e}v9}v+P4nkHir-he*R#B8Q~B}LvfuJ%T{FCQ zHn8U8ZqNS@Qr`E4Tfez$vNn0o?8Ox~cGuf69sa*ozS%T?%7gQJo%3Bcp1ps%>9uHP z%}mwvd^f^;9y6k*lnKY0b(XL&Ff12iU=YJnOXKaB-OhV#CQ$p0={JAlg?6#-8-06E z>TL)U-<YzT?Tt!D@y&JyM%7+fGZD=RQ>4FtdN2Db$+b)W7E|WtTzQ_3D`yHSo)uKA zx%d3|gtxj5T3S1DWle5hlPid4nQ}h&b=xP0Ka0NcTeZu+{@kB`|I50SU7WLDSuA)I z(>4F#_5AxLo0gwWW!W}$)*H+B_acA1vf}@{@n+ua&S0TM7q7_P&$Qjl^?dT`iP_Qn zcdol#ep~)d?e(7pTmJv6sMzxVVs81j-OYX0FXVaI<{mz5-y@xN`Ndr0Md?m$r+T^; zN~Ul>6x$`6d_O}~ZtW!R_dy(HOL#5?uC^&*nSZfTr}LO>iuaUf^VU3W5<g$BAC^7m zs8!ciZ`F6cCzj@#<_pjM^0p&;f+EY5j2kJzQCdg0O|HJ*yhMuWh#u3*>6fb+*5<t4 z{eJyiK~T>uuzp9GQ9<mCi8C@wt3}VMawcfFR=kzjI-6TGkz;Dx-k<`r**vnhvz7}V zpZ=KhsmYT4O+|W1b)L==!Tv%!_XMT%ah~M}o*<?EV@Zdazoda0`-|gKSesc3a^seN zTieU$w`L26@O-Oh@oLG_Gm4mG1hf@j|G3j&&bo7foq|*U>GhxH_S`8<Z2!Z0<O2KB z7MD4K>s$1;mA1F+wK};*jX%Qi$T`8p7S^v4ZI_JBZOHa{tT9O<X;tTy!Yk@B!dj6r zLYC~d54g2h`2{^~*8bFf;ubc|<am$U+BZ{7O+Oo5p3ksapZ93+>A6cKX184Y!)esJ z*+be-Wlv1u(n1-Qljk_43+Ep_*mYe*pl7B_ThhGkCbc`c_sqVSx&5<d>xav-eRnp` z&g@(IP$f}(hx-x_PF0nadLFy14ANxn?|K9{e2`gjV*mN_#Ud>cs+P;Vl8t4!?QiG5 zo80_xCUY3y_Nb5tncTdVzg-*~tB$^F^T?alz-n;&)wN|VLMcal&Ap4H)%dr4ty6F2 zJbqa^ra@@qmxq;|=DYL0t*jJ~dE>nCNCf-ayz=W=5=A~go!_2I?D4h~T~eaRB=_L% zv<rgV_fkykMKjmO`FA!v-RM)WWE)HIFAnV!TXzRV);DGy^>Xun@hG(<^6-TN(Q9A% zPWN(-P%+|CR{YxaC-i>O;Y{P10{`a~MVL-HyF+gF-s`V=TP{nkh&uY~(W0NsR}9~3 z@6U;1{+#Rjb;|zilMfdwFS6Px>n_+OW3~7zpTIpE4_CEmiN1dGxtE&XpT9TEQ!Pha zQ~UtK%&pGLQo^iTyiUHVU->E5d+O!-fK@3jzp9U%S`}Q>HaB0Q`2HDwIpsr}>mBr0 zr1@Q6HFM>(il6h7kDaVvCzX_TfKyD>-)<uBGW+nm=2`Q!9(@h*f44R4dq`Yfpq=RH z{VQtYdbe5r-L}Pd>zC*&XC2>u-siZ(X7SB%&*`ha*GKLN+4v*;^z>69zcimQr728& z@Uwl^sfw>>)oOjj94;6fU^>^iZ~I!svYg_dca-|i=)Zr!x_(nl&;M&4XP@Q9vF}$= z@A+H&bnDCC0nfgQY<eqxvrk)d`>h)*jhgoatxbP<?dCBl)}LPHL5nBd+<tOd%}T4h zodI#-bK?vyF5-I`T$SKI<3m9I^2<jTT#x$PDEa(93#hQeJ_0U?RM-_~<d+jO27aty zqP8RF{r5MS85o@T7#L)+nE^8l-oXjZk;51VzilS)Pfp?g!)5QBgG#0)m%B>)Fz0xi z_59+Uc3H=nv2jwy%*`rXOGK>y?{h!-$@|Zw>1+~hjC?+F@8?xl*x04rbDUq<<Zb7B zaLIR*C!C@Q%V(aq=wbQaUZuGu(&M4I#Dos1S#v%fopO9-+cd$C&r}u|#2g8csIU3+ z`OllXng{s6BjK|^BjG=ox9sfj;JUwJLeKFJ)k~v7E#BX6wrn|Az%=dV+y`I&_{>!A zEle*m-{i16wQw(+`04ZW^%hQ4QT*)D#UK?j{p#vhQ;YJqTDy5l{1g*ZE8YCy&ztG{ zQg8S6u}+qp+%SK}a)$@=TF$h0oOvm7Gc@7Q!Luiqozjh*sxn!JFX2Ld%~rb{$J9xS z<XN+47EE-iZ)K9}R}%WY;Gc_FzH1I|vB`zy8`c%FW@b!1e6QSwx&MfQ@T-k4nT@_z z*rYnDebPFR<d!^DJ5Km6SDE|)_q3n09!U$@7$3-DbklP7v`8_$#^BHKVv>ue$NKmq zv5t9BY2R749QIJwQ!NfXn>MF1<dDeZ_j$b?$tK@|dow*cmq^9z`0;f0U)kI_rzd-` zzMTF@#P{|R#_rR<m+&n9SirLFx#g*4dSV&3`t}~T73%Y_IxQZxc;drW(OpZPr~mal z-!WtVtlqcN6!#?cWbV#oczc~&=l4>!w!%dUtQ&3OHz!6HD6hPnzkR{3{Bz~+zRb|> zNT^Wik7<jXm9jF~i18L%?d`?V%R^kQq*r|R|LNPo@q#OJ^Oo~(Ojb^=ndi7v`bbQ` z@*Rh@4vT%0JKUBjcIRV<Lx1H7X1-s!vR}@{FW}E!F#CqaUB|u4o*r(@G|jg<dc$$I z<({pDW$ov3g-g~SxzqT1c0S|G%SYbbe2~ZP{`m`I^o_NlhJx(}d4K7K9G~)Veg7HZ z<i$;Li_GfR)G^+TKR(^>`1RRktK*DgUTOyFS=Dlz$Ln^2M!)yId!X&KV8+?+kGf4~ z1Pfl?5V!h)+mxQ}s|Fu#X0=35;(VTH=UDsYaKcunKh=|_<Q2Ic7HV%VF;<F<I+T9q zJp1dSQ)i~~8!f$Pn)dOhQ&MQBx%0=p@2=U`YjOUc9h18`yw1JlsQ#1wODSJ-UT0Qn z)l0?c`h_1qy7Gvfu5bIEI=30?__!`F*73hop&i)8CHiyr!bv~+rylvKSy(0fqFL$b zo~R}B<SQeV%u#na^|QWv%KBL)-`6$I`=NJjR-E^&CI4NYRvlY5We%@T$mX}tV+(n? zy+1Co{`kY{)ux@_Sy!Dket7XuyeexhfBrGu(<?&ut>3Wk@wPc8b64fA)ZmVPYi;Py z^f3Kz#`iu4jo_X8leX2J`G+)O1ZsmD7et0+urM%~i7+rI;4LWdwy~n~A6bahr7ii% zAG(Eqx0I-c!St*XeF}|wLR&&#rpjrB`V}$c%UW-eUH0bb{`ZA?Ef<(>*3P&a*&DKQ zV{zWUbLqd8@A~^IT1Pd7gcRJiT4}yk`N2L8jrq5)$v$oTv8c~KDnI(#^7--mU)>85 z6*jwC=x}tY$o{7F@%vY$`d?qok)v&DS#)pD#t&C><$gKuy=fx+T*XCst3Z5OQ}*f) zcDp5aZu|QC_rH@LVlNl=NAG?1vhev^&*wk3{Jm#c<{!KL=F5^O`L@6Iz0%WyU&k3C znpiUnc;8OjxZYH#-|ghmYF!rTAhwq)0_Cil&cCpk=JHr*lgQGYy*A+o8Z>?^J`ujV zqf{h&x>wBH3EH<;-A@mD`CIV1f-{H4#SOPtO)+Twq4GVxVTlxziviQh@XM?XVcWhQ z?%#f{L)%y4@DBUC;K6T?Gh24;?|e3i#bAokp3-}!ue~8ntiS?8a1(2p@ZQ%STZ*JE z-FL7IH{8EWv1g@vXUts<qvK6!El;1SX)N8L<}Ycpj1AnvQU$lLdgnr0SX$5KtAkot zY@im_>K}I+%~^LYu~TsJU%mgSwdBsnhxj6SIu`PKaduiL$8l!nyuKs*CI6h!>XXW4 z0vn56Bodu%+ZJx=F@BSE*`iCOZAO+-smxc-<4s;-*Imvz^8c9Rb<o+R=xp1phi=!V zZ8>H-QR-*e>g;E!*Y-0AIY_NrevEy$p_%F8pKKOeyFH|%RIY4U+w<*&x0@wT^1InT z4+gtbl<ko@^eV69US6$_;O`#|%HJR5%}QRZD(5wQhK=QHGXqDjS51>#Wtsg19_;Be z)M@P1tiMxsJnK(MrX%C2?ia5Als>=IWL0FFp1jJ0O@`Z^d11k6!%t_f-R|3YPPah4 zt!+o`9KBl~&wT3h$P=0wdLwMNR^qo0(+lqGJ}9ao=q*35ynOrXy!l<X4;&2EnD$I1 zd)w{yO^F_tx1D<4W~g`d3U|{Iu0t^$4eS*M0}o7E_HM_y73D4eL1W$Ls;AAlV_nJM zZ&~iMPVl?xjI|ySjvo(OS1$e<ckS17Pw|S^GwzivHECfzdiimJ(;wD%J4(OZz4688 z;8Z{JLoazkR1eti&iKa>>ht@Q{_HS@R}RKDPvuWp)fBmeEZq|)vM^zxaa6ASgRhM} zNlBt%OP(zasQRvYBX`QXUw^9(v+B>250LIW%eZ!9;^)}Rn%iEFAI67BarW+;bS@)o zvLL_ysg9QTme|C-H{N+!B`tTj5mjPZIl*eL2A|jZZywE)?%Ip6ZB;qZF?+s~XYS!A z2e(=MH+=Zv!&|O)-MTjudDouGJ?+PLBQIVwcjMXX?@uN9Z~u3FS5mgt-#dk@#uH9_ z{F8j*TE*X3m0BO61yY9@ymzQnHA<{|deb(qmwj#e(Q7BP4Cl2cJ-EM%yYA&WbG!4b z7vJd{%)GCb@>_q_-Qxji6TUC_xMqr$s-19d{N4kLm|q6px@D|pBNFzq#PEe#+>d+h zpX-r2h3xuY%oweka;`HmFqCtm4t9s778Pga=jjzCgGUeEZCKz2!m!bUy`cy59vKMi zRsP6-`O77*j+O&iSCc(_%vN~{sO4yfcI`RR=yA|dZB5il`z`f5%~}L*E&UR3tzBc@ zOmpM9#~)w(GML+0GgqC};*I&~PolyOUA}Xk8KlqQjM^Z<68&7-FnPng&XUkAvw36l z&DI6moi;OM&Rw6cza`CCD{0!2IgO@DlP`R1%IMKi|L`%{MXvoXgK+ErLtDMwuOD1% z<ma-lCFx*7lbqVT{Kpp@6T;Xl%b8}`c*oBCFRos`_u-@o{Wo?n$T$43@xIQzgY)*1 z+UU78dvyb59k{yA<72OB#RScX3Np7fiVXI(UJqZPt$yuB?*#dKd5y0$F8ZH;KkF>p zwi@#-F)Xj#XYIJ5Y#-%ts4iBZ^;5@nZO7-{T$^puE_R)}>3jT7n%4B5<3_Tv_pR@` z-82&8)%_h5o_gwt)!CnU_j7zaO<a>7vDQ8L+01aN_gB7I!h^&RuLC)fYj;mmT)MdM zLCd!%d!1(TZ+JRsq3gSY74Ou3ILvMSwJ_Rz5}WMO^qaHxPL!@V@4u2`%9eBqH~#69 zPCn-FoVoM9_dD;2Oy4KI{u!hkF3<kWHe-o^=6wE3J(V^mw+59Ptez=l`}o|8zeZbT zJ-ZRGc4ezG%dENj;ZyeiC^@-BEW^Jv<g5>C*^PIS6TfH&KYFl2V^Y6B>c%NsZ!#@r zE&o)__26R@r{CsUt@J<1X3J;JT_5LS6)(aSko$mtM%zbOj##E;dnO#Y7@Wt{>5&>T zRnNZfPT%G?A~`CbDvY&P#aw=>mHc2y)7dV??qDtE{RV|>b@Sw(Snu}z8Z1`nb@cf3 zg*_&MQ`Q?tiTTDlNiJ4?xpL>-x>bGCyuaPNx~}u|HoGcz+j^-x%Flyj<EnptkG*Fp z#op(hll>;5w&%f$(5%ln-bs~upC`XK9Aeoc`qtCt<D`VO@3#E*T)zB+d&>Uh-+B+e zT=?Or=?blL|I<&NKlA_H?Vt6XiSf&4KR;@p{YgB)n~_PJ8PbdRfwqo@gMk;kzJ`H8 zfZ?qphzVO&6B@$Gz^v@J$St&jfdScwhk;*F&U_O@F~XXG0lqNDttd4$q_QAYA8eMG zJ*HWY(ae%WF{>V%S($msIi)F3Go^?yQwhb))A-DU9W4iOFgC-{J+FykxB?><&%+!H zH#|8%FD)}2Vh3uVh=31u2HD}X>He!O9tMU!69xujs2z+93=B&eYe=yptps8jXm*d4 zff<)=nZGXDitsToSVp7UmcvJakJ3sqQWH~BiwM}JF7~Uij*)@kA2Ygb&tyolEjK@< zGzUC$iN|kWD_h@8kz-)UT7qudDLImC%P%Ma)g2jF5;G#+_INm&FJxn2h>=6L?T9T& zwiTD8<YXoh2+0L3e-}O~W?)dTWM<GoNhPOUh_MZpBneoPGwWWO9t#5luMp^jaY%sy zNsK%@iL$07DJj2#fF%WGtvfHXGBBh{FfhP!6~vP1dx^9pC5?a`!hVSdzOpeem>PmE z7e)5SvBN~#ky(<PSU|uUgUnY(^$H9O)1QNmGDfyW>NIiIBqt_k5K7pW=KZsDWMW__ zlV)JhLy7$FuZgrJBe9?)wFrC?JdPanDDbP<wV#{ryyIYCu+>8kwVCgTvnaKwC?ypZ zIpQc~HYDqStf}RYZH#AUVECYdZq2jrL|c;&_YE#<^lv?H-pazjz`&25n3wz~&YJYZ zVps~mWr>H;qaCY-85qv@qNjjuER2}-BSsaGR+64mS&#uuXSi%J6l-Gk<YHhjF+{gz zzXXxCRFoy=5U|Bh=%nje76yg`0_Xvjrc9(QRhfhW%=_KzU1{13488h{4B9A(d4dLU zmSpB8ro*xft^niKPRshw#lY}V6FrHAgb-;<UUE@tE`bmW*4Aqh;9y|5CXQ~+rg-A4 z$w^L0%On&rk;1$3Hn1}=xHzCkjA90n)?^lgk56Z1V8#_>zU+koyIB|*76_mh%X$Sw zT2fU`AiS7`VnpAwGcY7Nq1)kFN}L_JiOB@)5L<Ow%8!eIVMhc5g9d5>t0mG7Lebt< zRAG|A%fMh2gdXjd9Yk7@pORRRNx&!nuO*31VP#-olSQ|NVH(laq!z(iX}BVu``1ZP zUp58?e`)l><@0RftjRAST)5aaR^MwCWMHtVMz>|&A|h=mEy>9v5M(bG%N8oLF)-9% zv@II95NAt48lmvIa44RmgPnolzZOQc>?Y2RqSQP@;~7`9ESxX$eHt4BL!>HtfIUA% zoHfOnRjIHlAD1mbfjgCr*%=rV)zLk3`y`RJ<R#`3v}T>o|D^(a3=9rF=+@+3B+{Ca zqWo-Fu`hw6WwB@Xy!CR-3=C^|(8KJ`eIl)?%qxM_#<*-*oW6Ra5(fjr9E>oFcucG< z#U=2{1(!8NPUlKw*%%mpE1-wj&DX?PQ&N<fo)611xUBKlxZE7Y$G~9Ijvi*ApNO=k zvH+d{aM{wfotLeWi-F;bD!ONQ8JUP`CzWUBrRBjYF<jQ{V^Gle$;`me4!$A@xk3Jv zn>cGK(k#rNg$$}CkYN?{aST`!1~RN-EkKMVnRz9tMR|!ikbwcz!3RVuxl_SG(u0$M z!N!n*!4#z)n@O52iKQj^8JPrwE;5z3ERv0Z!3Lv4>nTN&uhL4A6LVm-G-?<kd}lu= zyyq}G0|SpX1A_^Q?>H1mv@InysWcsHlp(BBDZPA@iIah0mNt4|8flVhT~THkeB=YC z_ZIj|DzY&!C`qE*H^+!X`_gmr6H{Py5-$6E8{>TTff9=)x_zpaB-)ponwwu#NgzB~ zZgQ8Lm1bZ#Js*Aa!`qoe`|^{rV3iau--$2$z_f#nfx$}`J+aiqlW1E}T7FSB0ndF= zR((2|i-E!44Bc~c(@3<gIJKyZfNkcCEl-sM7#PB$(4%fzA*r^N6s0D@8n3tlQ@G&T zBR*CJhB#sLz*J}=(Y}(RM96*uRt9EV*3DO&C;f|!f#HBOx^+|ANwlskF((szs|_CO z;-+hv9A;u*xXO(ln&0|JvJO^A6NtUZ4B{`-nHd<QK!Z&v<(T3mlI$x;P6OR_LMSWP zeZLgcBgVkc*UP|Qgks-^sifIgoLCAQslyg`po(sx<T{D7ybKJwLFjS!a1Du;fhr)F z-y~65Z`kWqSe*c=S4DS|WF08iWhSQ<<E~&qzLVFu6==i6z_5j#fx#LjC~L^HuDC1- zJ~D~wNk~luvURe+ya|(-7#OrT7#QqOY*pJwo+pdT(sNQWlVMFGTo#|uKXr<onSo(5 z7XyPWip81-$+j42R0)^8tu+k$)tML=zJuBpDE2NmLax2psYS46EiP*}{(Q6cITHhe zFc$-Z6^gZH$H}!e7go07veeEX{<kv|1H&wK^f2x^MXsgDooih7zBy1L(!j*PaE}8$ zDchbU*Iq<N7?-Vb+ts%3Vq##}#*UtpwJ(ruYkqM_9-&~4=#O2H#=^j$$d7Ju*k!UU zE>1>__v7+$VXhrRF%tvBbqpWt-XP!N%)GRGXf=b&;+|crW~^gkV5kDM@laB;;B9g( zE=F{xa9Ml3sUtp*nStRx4|+iB-6Pl9k`f{UnnnNeEJY>;hUskR8Hx81`4*?<!TJff zJRBgwT>OWTfuWoY-NW;qkZ*5#P9<zk1ee8;e}7d=GchnM!?2k9Ik^_2^q8ekDqTc< zr1}1;bvqLS!+(q<J^dxQ7K8fG@Jx)$;+1PO%h*L27*=m$U@$~U(*18pvlx+%aoJ^K zsC@r7I|D<bDtbfa7Xvd9qYtpgpni!Vaw83wb$OmOLDzH{7!-mS(K@#=oTOP-LX36S zRaXVQ<zZkjbwnRqnQ2apbtQ%+iAg!|Ask%3lHbViZigNNL&Y_8Yo59gWlafaq!8YM z$7PMTmrm1VF$M;&S?JdMDJISuqI`pTnKtrBkzO~k)}+H)w7C2dvJ?5LTVzYV_7i6b z{Nh_y24-Bgu;e4(42o=v&SZSHAl(y+VLGH${uXW3jwm#rLR#hPreZN2at9<U12g3Q zN7#xYNPz<~5B2s(h-*R1k={0b!)0DhCfZ$)7{)`Ki+Oes%y`h6C-DOa=Rytug7yzk zmOeoont^eK5X2<NI)z9~lOP5{c2cl1FoRAMLM*3(m<d{Hje5oi!pyggy+<%y2Q?G6 z=$e&*8L|TsHB2%0{3DEA(in0QVJz|q0IUqmpc4Sl-H5pz9@((AQwYOQHpjCvFoQP7 zqnn1gBNo}Ti|4SJRt{cu1KJ;pZW<{3P`8UBOnckNbOF;e@a9n*!3Hu7bxR?#X*!oM zO~V-v*b^V>YB|a42m^}|n|MI^4omXG+`fZw+>*vvY-Yg>g(pGKW*%%oh`QPzVeZ?; zw%b_T2sam}_aUhpb2To)=p~Jg4-iHpugzs;V1}&A1*K_LHc&Z`%8<&iSA&5e_AxU9 G0|NjZ`Fm#o literal 0 HcmV?d00001 diff --git a/alienblaster/project/jni/sdl_ttf/Watcom-Win32.zip b/alienblaster/project/jni/sdl_ttf/Watcom-Win32.zip new file mode 100644 index 0000000000000000000000000000000000000000..76e18560da9f8cd07c79a6b2f4c5c730ff77206f GIT binary patch literal 722367 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μ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[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�p_ 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%0AF;jrS{*S2_7>gm*#re%s!-`zD)7W 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 c^eVHU(dL)0F#3kl#lgRM9<(E@6FF2Ko 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%0A9Fp>pkpevVL+Y0>S8 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%0DgX-2F0^=T_;# zE$1%y?ODq)ak*x?C5N$6<{{Hw*#$p5+pX7#&fc@{><#-n&84zomKh<j?8?nE?Yozq zO8MDVv3FjGgj4_C2{WQM^qdttl_9V8R$}GEAMMN&nO5*?|Iy*8we@(bquG;lIriAZ zWn9Yr0Wa^#2qe8?>b=P-mvQCcvMw31duugx9zInUm7d(XjKzO*#^Y&H%Xq85UpYC; z*+N%A)M);KG{&%fUv`xDa80%Uazbg%^75XDFpZZ-jFcH)t~{f0>)GT@P8YX1TwZ*M zbEeXl>rG2IHyMB2zxafRM)AFaliLe-Ip}pR^5%_rWBX4@qNwZeK0h1&Is6|C6+WGu z@@d8wxh2z2eptBwm}tEan}fi_)s<rY|GAcni$otwwbQ@apu6ttwJEpFm_J`@{QSJ| zOMLsMdF_u*_3LW$?Cf*$oU*PmsqL?ZTj9%jiSI>DR~)&dfBA7;y<~im!x}S&!%JO^ z9a8Ru$1j~G(fn!I#|;&mnxit@?aa8|9v2lYI_CMgeUZLfS>knV+joZT&z_dnR=rnb zE?DMNt*mpHIi>E2@Z*U84M*iaFI7(B(eC})!+H0l*L(fLKaH8Q&F>wFoPJS5W^v?Y z`&EWwoTtB@Ssk2F;&Ok@MIo`bFI_cFW|aqN`EIjcT=#MDtrz|C7rj)Oyh5dQRn+@( zrBY75MawjIBzW$h*lzzQf4_K@>~sxQhGPklIbWu+h#B3>`N*)+aFWT-*-Hb3OO=E2 zj90j@=kqDw`Y3I^Rl(_O;`<|pKWw@;3nnsFRL)cFwvgN5IkzH$RqVg*9t)4_$F8n! zTrcT-ibv_X%yD@)!&>`IZ<Ty>3saUlmYr}(STx%(=;+y-;%>s3&U@~q>}Pp)UvTC& zy@v%GG8Z3TowVXq^v>(?+{K9#FT~|3Ts`KoK4>AILW;Vez#)g24kM8%+=q|NIBay! zY;M}iHxa&Cyo=_AygJG?FC?hqgU`l84q9IhX^XNw*jrxr!g#_RuZN=Q|Bq(PGgafc zzw2A@VXm3^A%c>1?sI-k`YzD;D_Pbs>QyiQ!CNUJ_V#Uy^|=$zCUQ(moZ)}_osn?( zKFRFjS5YC8mNM_ZYV+m7-AB(q+<qkYVQFwV^Y;$|XZ+$~+w8^GOTAeo`|g+g7K_Rq zD~`%?`!!q-T);k0tSxk+Vn?8n>G9f~1^q!@UVMHV?rPcYR_;@IKSQiq=fu(#@eQ`` zZff7RS71N%GWqF^=p_@ogqs)bk6+XEk7@Y<_ijPs(isxW|LWX+yfnU|wY>jh)XMlH zCf)0ge^yRB?{x9LZ0F$_Z&m-jJD|QwE#QlL=l<)8sY3N3m68QMB24-|pNl1zZ`dWY zHrvr4c=e08or|6+2ONL%jK6l~6oE5aX7(Rh{X)3qd1K+t=CfDzfBinU%Tea`N6~v< zM9jYJS^46+z?myraT?(^Rg$9DwSI5UO8u<6Z-sltC*BPKq3j`y#~l8bM>o#3_+Z}@ z<h{1YbjzjFh5I`6=l=-2%KEzULxCapYuUS}mS%TunkxOU;I-MI!;)czzZmb>9ueKT zqsk_`bltpl#fw(QS1b*F{)$_)NUZ#Q82i~iwnM@u$&YSFUbOY-?PPEL#-D3uA}}vu z^4UeYd5gE7U>2_5|Dwxlw|tJhOS4|ggAF47Gw)yd`1f&ksHWhK#cO#b=KIe}uP@T& z-8f;A!edQMMd7l?yuxmK7bXU;-I*5p(R}Iol{+(6Wic-C(dVk(_Al@KUDM}=AK7yL zUMLOmRoYdxr2d7+^2fHlSuU$LrXF{^T(G5b#o0Ay+pM%Qq|T`=OP(FC`sSp_w;KYV zMe{oj<m)LbrFmE0*i~xc8JOFddE%<%jPzv(XK@^V|G?nji92nJh5M#Is9^8gBa|U- z@$Aq;orOMehP_R#ANy9dy+59@?fb)H+-|9zzdmf?^{=yedmz|&o{LTEhc6cM<{i0g zToBc<Ol|4qfd5iOo4Sr|{<7yo1TPcYt=~^2{qH@Tdc4@X@zVOH<x_Spd#OD4#?3EF z{VLw5Y}K(<+9$s%MR|TfQfU5)N!|aGo>=vmU(vRi#L1ugu%&kH!??H`;(a|ICMHgp z@q3}SaJ7E#rSM-fKirVqvhL3Dz_yLyH;$h;8TPXA0HfULGJ#9^?jiavJ${E5)|E-! z;&`L&{55fFR!YkI<zah&YfX676FfUQ@xS54tLitMwr#n@_|UK^?6jHeEB?u6N_Ktt z)}yy^mAr37Yi*T+lhD#)$=JpXd=hUq9AUN3uv(if)!6l4*6X^cfpJgEoR~d7-k!<4 z5qEJ(+GLxE&7C?<($36F5<f;S{GndhRLf;&V&b+@z(Uty_ky5va-#g+S0irgXD(i} zS8MCVp0-mFnRN<hl7H4~NB_IAp>67xd+i(ZZ?Zd?y;-hln%_RleX`fy(#0E|N9_4= zlJm00@2&vH?T+#X!j;ktw(QPf(kk;ZcV6ptK0mkN*qT34Z(5$SZv1oO;<;5^hq&2H zjJdV9t#H|RcY&_HESF{J2bt+NG<SbAxghp`hLUu8O`ERY*=Gx#pG?qtF#q?5db`GF z4gXmUx*z^`x^nahM|I!iRf|q=u&ab`KjA4M=^l3b+X;?xgCMReE20#XrJCE%x-*#@ z@vn9IbEtjJp?U8nFm06oaQsHw8Qs<o^H;kjKByGlo>6~$RsNg_`!bDwE$j5S_s5c- z_p$D@w9CDdUIqvV9D5Rwe(A}S)qAF_HY~aB%X=_%u7S>y#PYX?r!4NC^YG+r(G{~; zDm|XPT9uSz9@+FE;h6!G=gn(XUKb4Z)$U|GTVAZQ&M$tQ&j~jtQ+|>47o|Exyx;F{ zG)`F8bUMwww>9~@j_~#$`$H#B3rq`1xEGgvqkazG8Sy6NiwfS(sZ|sDzV%J4KV%ik z_dj8wmb>mTVf)25PFtDYGvRe>5IDDFS3t$n9nU)2Q(P8s-|V+?{&v{Uq$xgFV!p3~ zNMx8xp0?O(E5o?Z^mw5e#RuxAd`u0RaCCD>Q^{q66YCg@*gcfPm?O_Q$1mUh&UNk; znUEHJN7o-_E!??IM_+m$xVUeL*1yTDHD_J7^Vq*xYn;)dDRO6Ch4;EiLft-k*3Mr& z+=E|TKCiK_>F<Y)3&U&+TpqsQ4V~LifA`4U$1Ss3MXIwbFRvE4xAxHEyA}NJ3asYr zNbPthzqhgAm*VlcIVln9R$+%s4Nfjv%y9MLkHrGIhd;OrdK7(F?DuoS;|n_JN^DbO zCta^HHD=sVq;)e`(*2uYu&LDTTU;rT>N_PL$Zv6c-Q92SCfqpSnMT{hjvMzLE=nq? zR_<%k-?h8V_4wBe#{F4lQERN8Eu1?q*>(zxpjY@>5n1UAvN|{WOSwWtzp(P@=4Kw^ zjmYRo%A303xxvL*&bepwj=E-whn?)YsQ=36j;@5{jsoA`xd)cUe7fyBe_2<)c<9Tu zLZ&a3uAaN|@<rQ+M?9<>)~rih_Q{5AA%EH_2{q%3e3J^Trak68b5Okg)Qh+@y}#{k z2I1<ln=iy0^jt_eJ9F-Cjq}kCZim+`J~Q<{uWk5Q7fIpe?svBE9PvHva%aoNz+}7Q zuAhD9C`L8x=lW<O?JugPr@c!`dF?vWLZ_1EPGdLonLA`krk(H2GcT<4mY;uM!!8-E zS0{TFvabagp12Yx$#ZLp^mP4OC7u#n_TSil`e1!@c>D1+rAzPk{VzNHrY~~(-#t(7 z8~-s+jQP7gdGCp--z&}YW^H}PHtQ|_{;ITZQ&Vn#`0`z>m1p+i<zJ7U&OO=|<sxYH z`R+mazc)V=)VBuy{@)(>`(47;efB%r>szP&KHW6!@YafZ%=Y`=Y^`usjqNV{Ij^!Z zQY2@slU4fT)$3Bu-TQF<OR3!7&X?1FTCrxH^Z5MmQn~BV7<2O-4lfUWURS_kvteW1 zwYKsmG1cF9v`_DQ*|?S?{JZ+Ied)F}GpCBoc-wgWPQ9IhbnU&<|HTjFg!fJP_NJn1 z$~6nCpj+-nK~cw9Ju>%CnRsd6KAR<5SfXakJNZ=7qJnkf=@qfhKg~!Bc){j&;6t_y zJ3GI-luVU{(bf_k$w{m)BPYxQ6HAx&CtjH0%)e>cyr&N?99+21xcTH`$*Q@>Uz<kt zIh_v7cz*l8u#4P6wq1H{uR_<9Wd!y4ENN^?HM;9_ZfQznLdXk~m^GR+>*ha~Q|+z# z7w3EV!n0KiuRUHFJAc;PT_2uZj(#O=5I3QG_M}b0jY{5ro;JT;x@f+S+rF-BveUAl zRoiQYu4KmqB`L}GF8zM+F>BOOVKb4R8Y}!V_sdP{G4Z_1(6G*Dq1C2IE9LG4r~7T$ zYH;&ba)^!L*Qle@FUL)8(VsruYpUWE4Z-hn85QkOk}UaiyjqG>W;N|x(Q~Hx250;- zdF%Qs=N6`Kyu8FP+)=8m$L2*(<(|No3is!+Tl?`nIT`p#B&O{`du&n6ro4v9rOe@) zyBfpi&py9E<DA=T!A<A7CzSSbL~fT=d_7BGQ(pSMp491mr_%Lyar^In_$6qzd!CGI zT>gr`o$IeP@A6i=9r<oW;e&PGgnrJ>xZeH3{N&-+q8FB3@m`(A`hoA{k>1`5nJJ4J zTwa+4Z=N!%n`3eF9>$M{8cSlC9{To#n91MX$1wFF`)(C88H>lWx*Q)H?>gEn*xCK1 zsL{B1x!hHankCcu=Ljz23-FqtJNesU)3}6|+j%)N?{AvLD;5&QCLOstbdtv0`*tgr zE?62U?xI^=P`W4et9-Q7em=8*h6Q|j`=`~-X1Q`-ah}SyuM4MLPyMX^+3;-j)#=`X z_v#wlxc;}?nl#;aj=}n`x4av7t1_PJNwDefPUC&Hj(da4Et4DOU+3QQ>6%|CcKml= z(6+o-Thq0@#~;6pHhS97CY{Q`6?C?J9{*z7W0_Yk-<kc-s)@^E>XVBFNxP$u>203! zah~T9*=l3Ym0q%^H$D3Hu)#KMik(5bs<Ms6mk<k4$0vQwS4B*oUlC`Q&^Ym%>)q_a z?YyOK-)HWK=~<ZSGJDaUQ`?qKpY`8uw*LN9yOeuwt#9UDP}<k&%wCcIYxX9-*mXzp zQ|_NIWp{q}(A-qmbH$|1em5RV-7Dl1eO{Wx7gxJ7F7)xbu56dxPd<Lqerv?5pL{CS zJyK2eRe#39dV>%BKkmh?I{aT~?v$i|tYVw<`3hg@UTxETSsm`s#l3djmlp?>HNM?A z_9CU{SgGuvQ#o^M42|xwI!;*r!0lNCk7AV5DqiC$Gu{SlE<Q5V|I`<bbBQXcHc_4) zRnZDbQ@&l!FLgK{(jEIOdFlIKn{`<w`U}oFMl0k@v75X0(Z&}m-~OzZ-E>^yQcKvR zXNn&eaL7Ih&#-v8pY8jk+VF*IgMxD8cFZni;gebtT(a8o^*u%AFPdcv7t$wK9Ci7= zBk7E>-1C)9cDuGZJWrV+v}g9z#s(Q*-p{YE%@pTbv~>3S{~v>@dB2|C-LU4z)2+p; zE`Is?sqdsi``?y5_SbcHzg)ZgTwuWT346nDesYPm`B@$E*!rY!qLhd6O^IARR?aJ1 zu6~=>V1J6^Y^%dR@i(uXiuv3b-}7|t7D!j0m>h7fkndj2`s@n=Me_sBuI;h#d&9w6 zVZDgKY+>F$(fYqaZNA~Ne_lHM^MwvWu}0~-qt60$?p%AhMXL0Xc<=1~h*fNV?N#0h zzX^B#Hjmrg&r8~d-|`fbEZfT$6KVt6BdVIOs3{gig<o2E^VsF(F{?zCij>zJiIpvv zkMh|+`%fEd$?+xnjd_{<b>Ct*g>{`oW@M_p%evEJ^yt{p3a;$N4`sq-@0-$`SoV7w ze|)XHyY2j}Ri-7|Z(TSQeQeVvR{M9B-xqK9e-V501#h$8&)*%pqs`-=_f3_FOyZmW zf4ly!X%7DaOlSY;INZsz&+cx{u9bqypYy9NXY8wBd@Q}L(Iu$WB{p=;(NpXf+w>eA zJ+#&{-xG~myr0wESuQM5bWY4$cga4{9O=EMr5*(9?X2f!Q=hn<J1p;R&h2MwV>gQK zkUyoIW@+|Y%0#HO;pCxz4NNg-Po+LJ?GNJ4oGKWUb|!1uEcYI}M;E?DK3i^f=dGt- z#EC%rNRJiH&r8;xUi<J0&kwHFJsYnDJ2x}VKcxT3tVS?)@xM!NU;d8&wvJtE)$23+ z&5e1Om71Fxu9#%>7-oe`n$d9M1Vi(Ljz{wYC%0|wSm2`7Hd8Undr6<#J{$F$x9*x` zn$5el<7L_TcWTR*E<9S?lp*euqhok;R!6SqX|o#-pZHXzO;y?Q=KJq=)yDa47hQH& zf18tMbNuw&>i4_r_x-*LBJF1@ZMc(oxnbvJvBtCmT!jwpxo0eWWHg>Wl9|z7z`9U# zOZlt`cA?*zw0_1u41HS8`!aA*ZSdpg9F}ge*$&mt|F)&gDi)e@|I$aj8FgP6n(_k; z*p;(9IJ&(y7^wt`_%<|M+bJK{*(BvF*|$v7N{)}Q^O#Hgq0YkscANhH<@~KJ5R<U! zk!O6x9NV8&CiCiMHJ!d9^0ab)#YxLE-oERV4DJieKe)5Z&$DU4t-A{hPH#+@cj!`O zUy>-hc+9~|Ical30`6AoaLM!rTvB;)!Ea+$jcAjRu(E8TVrwAJ+3G9Tt*o9|@)$d} zFZ}9a@_1v6Z$-rI*#;S3-g>gy)YzZ=6?mj<&f>L~74;XqZ#2<njoHjwEu571Jfco} zs=2!HVWBDK6c4LpbH&Z7|4=+5+bn+yTXFFBglp19zLyuu&G^^dEWIwJ_!`63)Ka;* z>b`Q*cYWkibFJ_G%k`v}qjUy8@8*ZDhh{AN5tG3n!Mrj#ah<-F<f@d1Qxub&JgwgP znrP^B-bi(dR+!f2?<8Ed<wN0_X7dN@<*x9|oYljd(9WBC=B2^A1AKwpM!v=mM8B%t zkeF3jBAnD~@Z*DQ(}Ud-bJPPTajkZbe!k%=|Dj8a%+3-V_P-x#T084~ERAN$cWS!5 zZ@+7{PC@g+n3rp7PkgoOn6%GdXYJ&jx8fyNy}hn7;q$p?dyi$MEMB`a>+6E3G~?)H zzx<YHs$V_cD4cwxYq##H=4BTd3fmM5mLFfZJ7!6yf9=B;yb&sXEYUBYhn(ebNJ-ji zYQ)rMHFufvgjemkVsm$~C|^lE&`{x2^H`=#ekaqGy65M&&gFa}{phT9L%rPOc~Wz) zCC~X7Z1T7~WB)wGluL`gt=s33WH6^9%Sxw8wQ*jmLPYz^8jj05xhMaqSe7X^p<c|# z@(fe-+|pkO+X^LLFfbgtp0un!k-J=N!uOlM7an~j8upBD@pDb(s(Xy=E$b%koO&>c zeU44}@72E}I&@ghNM4Y={jrck<?$j<F(E(4NaF)<YuG;s$@#Q@{+0MK_XT@HgXCfF z#?(nVESCk(I2VXF1wHtb7tp+4`9etYvi<XpFimT{y6_tB^f}8Pt=W{`qPo@aywcOT z>H6FGX3lk-wpvQWJ~Vy)P1B^ZI0NBR7a3QbcPzYW`l>i?!&U9jX_F3cdrkP(y6EwG z>0`$if4DcheB}e5*G^ZzZmV%(m0`QeW1P5SQl7`E@awa5r$jun&O3eCpz7L1nVyw$ z$wilEoJ+j+?8C&=Ueyo9PgmabNxJ`S_b-uas%%ceyJap2?DFpyI(+q9Wny&o`(NMx z`3OktH(nyE!a2M7<4Otb)YE5HxF70t6zfm5)zd1RS)p#ga82LzS^9l`<&ElwvtByf ztmN3nn4h_R&S$sZF`EC@hR&I-mnre*cZ|`um5$x&k@hdxavmz@hs5`LIklW{?RafH z^JDM*KG!WFI~w#?9XNA?>E5ps279`dS>MZqfAF4o=F*KbM+*Wb%*mX^tJxd9(0zJY z3FnRw)28DBdmIiLZaZn3*RA%KA^F?EDb9Lpu2#9X?vt33{^kDCf753EiN4$-7FMpn zQ)i?jB_&et6!hfOg3oMs%l1TViTubX7#Msn@Q!BUOu6%1_g+uC{BNyp{nF$2rrm$y znRj~q2bC>P%_}}feAILe>$aSJY1W?3So4pJDL+4FUV4zVW4Y=hlk^X+T}zW?xI12# zpH02^>EVfKn|#*EyxKE2U#X<4Kz+N-{AfM5yR-LPUTG_J+%{wZx1*$KUROwym6uX! z!T;yQx|?^3ot%7o+WteITetmrTk=bD+tiDB7bUy?)rG$KZt0T4mKw7!HPImcNW!#7 z>6%UY%DKXq<~hHq7Lh)bw`#uI&rIEZm#usLPda|8dSOt)CV_sL4|A`iys6sSd|G79 zmunZp3nK!)r%3bbEY1on^AB89@{u{LNa|B~`~s;b_HN%^&U0D%{ZaIxEOqa%_t#aq zPbr@0Rpu;}EvZ*6cO)a@vdv3@?kIniZFl%@=RK4YpHsGci|)Cvv#Nczi%w^$yPkYX zH%;)j<SO%wHNm;OQpbMo(l9^sv~BTe-hO@YM|N#JPcQUexca;B{r60+h;Llq4?kwz z<8?|UD)rK=r+uQ?OQ+73l9u~+%~N#VtYd9anR_=UMgF|it1UCtZ{?1ag`2k=+gVoY z`tnxM#3vfMcXy<{{d>gv=kr&)bnhLTmA3LsVC2R>b!$&pJ<mFB^xW;A*Q%(<jZG2x zN16Rru1aby-r2FPY+dBeJ6pFUJ?-k1?y-M2{nPF3$7Prv&pY>M-p3=dHrkqoC#PIm zRQ@Z^xobjq@!_uqACEEJn*U`+%e6PGFP3cM)7o|Z>W7P5Zc8h7TQ9lUcWH`8_^ei$ z)R0F>6Ft7XkT@N<sb%Rcv3-R$4`l9^-<e%}M&;<wAO6cMI-LVM+aH+L+4;<xa$v_v z=MC9TcT(*1)Wsdz^AhDgPCfan;PtlaX1QtGFFs0ax__(8#QFZg&D?Cv(-_a+_vhXI zEo_h8o~%nI7DY!EBz@-Rp3c9w=KtO36u~ftoOYJkIlnohE51eCIu-f*#*e3Izcv-G z4$u~TX}cxPduGcW=k(02Rv9++{1<=DzHxK6#b2MMs93qSeZ2ER_P0%at!!2DGa+it z(p@QMzHWbW(dvNl4V&bE+>I-%jd;?(rI_8HyYS_%Rk<~nidnm>x(idL|KWe4bu@Es z=A(wRH6MJ#{_w~>Uek4F&*oE_Z`&qbUEu!es+rw{o~yIJJNaz6eE7D<%%abFFR#=q zUG%;Gu_d|U`|S0ypVVYyd2c;wTYp2{(8r4Td?n{>MU7gvNpE8})y!F+Gk@<N&%KWf zO5d3}h}=6N-IX&*H_&UxQGL(jVNXtItgz6T`|m|jNbp47N!$CToJ(J{S?8;X^xXdz zdWG$0w`;q8y4P?z%H7L0@bk%U>*RiW_f1KDy2yEs&9jpZ^Y*e{Pm+{4Y+}%_+A&pW zo7~3U4pXIP3nP@%-Zq=$?5Yl2xcBw-kk|t}U+vo0er|8uS28c<N~gkg1D<qycFiO1 zx|3?}n;-p|JYR|PTgv_I?Q4$+*7dqPyl(EdPv^~TceQJ~<7!R(c77{-DkiX4A*V{v zti$NA&1bbEdCjIu`e~mkxmIm>_K%TGXm>z&qj*KTt8CWw(}9v_1cfsBm3vOLZ@H^; zrs&MIvqfiw(<~FF+ssqslYTQVML=BBD|xf_;vG)1rRSIBPN{izmS5!7r`cy)mj7gx zuNHnQE1eNN|B+vV?$h!=+D{Hd+oy>?f2@&R%A_55G~jyK>blorzAat3Yo<%NuFal& zv%yW~(U<kYUoHu<bF2>fy5)p)&i^GVOzPTseJ^GA)^?j7UUH8+!uIK8WqpUl&(b9< z8s{7GvzHpVY|!F#&XUVDeG;6{cW{@agQ!wK?W3)?tji*pHs3Xi;j(sT{=YD+&w^>c zg4Cqz@e%W$Z9DwQ#%uAMS+UDlrq0>0k@xM^M=FVVKhyr-|HL!TXcyb}`s`)Xj%E4u zJAZy`UDCxN>ofh5lKX9;Z3Y@onb-fzF8c8+W61}@x=%A!@8i0ZnkO6TmzgD%TitO$ z?f3QDCQf?yP6RQn|2;qLu#i&do+&Twucfpk-+UO6x8ud>wnhHirRz5E{y#KnZQR3& z9<^`cBNS^^KiF(vYd60$#%h|kRYbIvhSRT$p&a{q7VtR=Gj-%Sr`r5|v3ce)>*!nR zM;EnUDJ$svcrE#9->$c(%O1046_q^t#C|P*N*Ysw`=!iImwR4Q%}ZZ>6aAlPX7Q=8 zB3|d5`M!SPx4-qejf@{X-?#d1`JR)zvz~^^eUzWN|EAPF&X)<s&l+a_3TDVo{QuAJ z_r6@IxvN}%+Hcp*UGVq+C9e0swz;QnKkoHV>V56*!g)Teypvvj__|Nznq`Lch8Ihl zcLuGQ;M_B@!@glrSXzVDtXTo`GnbaHTz~w|PcwOi!|xO4-JJV;aqym-bN6$8x0sam zYog5J;uy(W*WY_Cjo+Z)Sh+#^;d;J}lZx+U&#K<&z;u68ww9C2(RXLJmaB@+`KA{% zpP~Cr-T75h(pUR`>D(dh)7<)ZdD^T^?CA<-;v206ixsZT$voBWJFQ8@=cW3F?g%?y z-ShkQB;LC7DbvgHYJJ9x`;*psUG=$eVt&d-Y4+)#=HJ;DHPOjMf9r2$?b65ZcHG@j z)q6GIsoUHRj*?YDz7`@6S~gw1zF8(_(SFx`{pSoX)W14(X<B{q`>6cfzb3h2XKsIA z-XN^k9J$ixSN5jz)T`g8Ej=0Je>3IhHM<)<x|>&Utz-GwdH4IgpKBR!obt<_`A&MH ziFI_|$KD$@+|1qyM!)m6o_S<F?}U`awgYefoW5t9G_jxE?t#2{S-(mN{|qMPKiQez zJEp#fc%XAX-|=p|?&h2En;z}rsSDuA3$wd8@BQ`Vf5Mc*yYFYjEA&=NcU6gZRSHj1 zOFXj9r}p?U(ap6RUI|`VyL;DzFUF7begsLk<$d-$@NKt_t9h~NB;6YS%i@}9?{c~P zDyAJc#OHkW`#mSNnD4IL40lRqOy6AbrZLBPYU7Guv5wW@i-PvdR6DXtB;WUHS<XuL z<%d?EO`4(n@vsc1<3sPGhjuhLuJEY({puJipZ6xq?)1A&v5_BhvU-$vX7nc;n}#T` z6tG&VMvGcr&Umzo{ZdtTB%`<HIq|Zh(pP27?>FY|P209T^R4OU&Lt<7O^Nu_H$SDk zWXnN|10lANxyem=&sv4Ig)2P1v4?5)oaIKo-ya++%*;PtX;x?$cWWhAj=7t`bC(h+ z?)NqPW_uo;e70w{;8ekhPi8V^iD>WGT+H>_<>=(4t4<l&{gq5vzi-~sdSkyMFJ_;Z zRhcp|<<PdxOYUr(b?&%yxb^hVHIci2{VQlHc0GCOQkUrIC3{-S?^aHqGJpRHhf|a9 z*=_PO%Ac@w$E?7ov(m1VuXjHBEHlUS@&d`J+-FzJywG#1J?)B+hO21mEH%H2U*{+_ zCmm}DTe|UosO|D?x0klgSMt35By(kE&W$zy=f?kjy!tic)9gd*uE)Hew_mAt!E1&? z%cRO>_xQ%^|5@?Be&fGW@vD<AKCiO;|GmnR^+J=Pz_Z%2J=d1}E8o;6e(lKDtcpzS zCnuhta-6Tt{&#;k-yx@()lcrPOI5sPR{M3e%Y@zkpNHsP?7Vz@-p+4+SImssYktlX z&)?6+x05ww%eU8mUY5^|Uib2{tna&@Tiw^S>wjJzz5mSovY6!6dGD9~+}gfw`PKG2 za#F9CF_&Ln{#2KByZ(<i^MwLu#Q!#!JmqBRzwG4ca{T+hU1->U>{i&?*7!YUx!NHc zTJ7#16?y8Ps=jXO)ejEO^8bEqoGNu;+TW#8eo?*u&unn%z0PrZ?fyM{S6A4JY|098 zs=2yCW}(#Al%6b+nvbfppYELRYr5)hu4eZx5BJS)qorOyi0IfI`?&FEU`ohU6BBp! zbmg5#Zog4GBsSMr)N-on+1p*2?9$JbQ*`rh6t(t$u#fZhHIcQpy=ZA(aPHcywzq|w z>+4gdUHI{9OMUsnbzV(P-K<=CW*R$|I2=^v<<gT3C^*@cciO~i>(?#&6`wAMeeUOf zx6C}(=P{4Vfx_PM$+weF{9@|Ac>6`>4MV$PDI?k5p5l2w<_lfOvbp!HaHb_2!_jAV zCAb&eU|OhbtWx}LIfDkfk)lxFYB8DcT#I$f9_*OKwpdm&z*&*uX8o1A#S-okW*gW3 zwAyz0qFJ>vSEH2MrdNA!XWw;7^?V|9u>0g(%`dmNn5xFfC5UYf(U|q}<*%yLjZfWg zWiOc>ct0y@>DhNyY_5M^&g@8<IKNP8lF=8H#UCwSR&u<(+P*p~>)r|JtG$<=ebf1u zlAI|!y(h$u(|n%O`;57l7VlYFvRduGm3QLQrK&rP-)NiP>R<gVDzxH~cdPo|IS2Oc z6TG=uD`3&A+Pl*Z6?u10-p?npBJID{<sYxqHa-r$JAHmp9A8^)38x|7=7Z_sJJM5A zTdh|t+q>h)Jg%n`*K&Mws(d1F)aJsf0|px(c+Z+O%Us&6N>KS|XjO>)Cl~v=d~dE# z3wE*l6m8Es#=#?d?S91}fvPJ(JB-Ub-XvB|msDs{PHk$wzv;?+#o*kFhws~8D_ShL zh|gVuL;I-i!}VXnmzM4j+LAPZTVRdTg{}t$%QRolmJrNqGnrg@#q?=U)~Bx#l3o+p zL@SE47yRcho-HQz?Dsa6AC;TSV}fD~IwBTSv}*|7OncgMNh*oI;KWT;|AOA6Q|J90 zw2pkvc;_GSRyLVSC8=%6G@GlYEWf+AuX@>~{o;16apl{&o`)1SOHA0i++*6j6_fav z%x!$~--PF3CD*@}*-_jj(eaiGE!ra{R4S?5IX`>r^FpR;XIs~b-`Uv`X}$81$hwFt zvn~a@ZJl=VTeurv#P|Nnpda3rI_<Y?6TaQ&{Ndi*tePj^{EPYQ#5U&L4a}!jsz^+^ zotngO)4FcumcF8SkEG^Yuv#@|WBHt73z6#|LKGf|Xr$;I@d#633z^gK@Xv)7HMXVG zZkueLV!pa{pY4^eA@6qSt&(Hp?5`D=-*Vh;MQKSy*38qtq{Q!-A7yNaWj?^D-7Uzs zxo1LL`vy7FFw26%dpB;(c(|}gYJVuFOC8IONh>8o<}uCPs^gL7+gKBOZMDOO^#aek z4t@z$d#DtU(9IooOMQpi4Tk#y$`a|!m0_wJHbQ<Z4{!a_DLL_pA?LkD@)MT#D~h^4 zOkj8|8+OhhkMV?}obAGE1~L*gVpozZ_^vY@%#k>>UGqef+C)F0YgbLGUia8c%1lZ< z{O#1NxouaD&NwR4-C#c<%c3Ww=Uws5=N>OMpXoU8Ld4?prPVi{$!s}x+{<a^YzOy- z$^7aKeJsbd*jZB*ij;I1+0VJA89DX&xb*QghAl~(wdo_zsVzxbOMWeP2+erKz2VKW z!->AR#fSNnk7qV~%Uqs%$K`ZVYKBN|w7%~dQI1<Bdmpd9Q1~iG$MbdngZZtg8S8yK zxLFcw<X?Z3(Ks)$);TM=FaM0t<{4^C#g&_GE}6^y=yiWkPRn1z_=(~V?uXbG=boMR zl-G^zk8Ik%aHm=KH;Pr+94S0`?0r&Wjec3f<weDdZ~s;Au=9QP_WC(C=WfdhlU`)S z*G$!m-<$N(z~I-y7HuK<hg{aI`?yN{dTuVC*>XH0QsVBFVxB1}oaa;Ke_HtH*UbNc ztM~s(Z{58(ZL-?rpRa%4yvv;Fxp&t0^1d094=C+Fl2;hiV<Ruoa57&uH8!gFMoGNj z84<Hb&&xG`C_bq>&g}iFxxj7P)Yms#+0$&?8mlfV9FyTYw0P$}!`0Pd99|k-3tCFn zDJ3M=KYh%cc_ehw)X#ONZ6B`FT+T9IWkXHM`-<HE*}B_B!uockA5s0ZXkF3IhO_^; zL`6%N9&0jew&HNv$DAC^*}LDi!`9vKTl)X^*G_bO{2GzO;r>QX%|qqO`AxO@GB<w7 zE}NF}V{vrF$4MHym}S=0@TA%=d3Sn!=55*E$?soQFYZp~bzQyVh5p9C4{Y0GH)-9i zOfKrr3X5t_{xz|D<pt?2zc*A(a%?u<T6;=Fc*A;2!!qfURzVA^c-1*L1x@`6`aZe& zSmc*Ah_)N2wkI>)No-l+vM~FJp!Y!!lUHx{v$QKLbb9_lIq>DG;*@p9Au8X4mh@B{ zIm-5^;}}ztQCRXGv9qj&PHb`-s|`8yo0e-P<S*U%MfUqYMvsR97jtTkwe_Dr{CnET zdmncd90*O-)AF*44@r4%F~9uU_lbA*tWdr9ed5W<k~7r5-!GS+dcvUln%CJPg}?i9 z|0eWhpH;KH*i-gv%0BjzPI)h1XX!n~`;xNLKmWRTYtl5;E3?Wk=3jVizT*1t^V=AL z#h92=c$w{v@V|*EpSAn`=0INgyWSarAtkTd`xYtvEP1e{NUks9u+du0>&;yg*f|#` zvA+KNvpn*O^_2h1-eoOVykb*Hc)8Fe#S4y;J2o|Vd=}<VvR{0xW69-`W_!gJi6ir8 zIJU{hx~R<cNO^otV$rnR*E1KdJ7?AR`LI<_yYe~9i#z1%51pUXz$5H-g=58vo01zO z-!{hOm^#1z`>r}P_G;{0mh^9PWLq|^-nHx1-S6*qf8YK6ZuR|dmwp>b75CnZ{iXbl zng43m=D+rVd0*qyzlC2|u<O#o&F?l_y|&Ym+sL?Px86B}>5=Bg)^H!2y77<L8R^yW zT3h*5#9rDQYx>f;Baq24=|I{C_3lZNZrJ)g+9BA&dgjeD^*=KAj)faJxNdbj>UXAP z(Hxa+m#01|`)XUN{`K{@H!8oI@7YfIS1B4|#WrLAv^HBe^&Kw~KK67=n)p9C>a+g( z&8J^?-FnFocOvuWtwR5_%;NcPa(5OpdHz{+Bl<#g>ia(@x2`SzZP>oact+^1D_?%) zE6$1F^FNv>%%^|h;n8n%Z@ilp+Q0nPbb&*;7b02@NjqG7w<(lu@@L)?k3aj|KiCml z`MWA8@_EYgKLYXVBHix$p4#?j;SJ?iACK^Fbh6Dqdg_RD@!VO*{LJe0UB5hV^x;=I zF5#wpog;8lkYX37#KQNp1Lj6(u=%S=mR!g+V47&q@M2$3{;^*v6J55c9je}Q^TZ$B z*Un<OQO$)Vn-1=fxOB32VnWY%71?`N*8F+x!sFqj{*O~7PfF`kP~*u*rWZdPXH!@? zoB7)n$+ZSP=@zGqt)>*N3{}4RD`pl?CeQ5~PKy({7tT~ax@J-LCDoHfPtPk9O0C$< z*xuXv&Cqs(N7@rL$&Wde;g(CnIyXGcz3G<qV2Q}{=HtPy&YJR{JM>}q%Ud%UHkj64 ziD*A?@9(2$oipqrtvvR6ZuYgyoUN)bS3>_-4ria(KfnK6-?m5|o0NNoe<inp(6l#B zlcVxxPqx-b(JP+M^LPH#Q>>kK%ifiiosQchz1QP#&7{;vCoMnjI4dR*_^NdFZ{sQT zFIx{3u`1M>2=(vvu!(EE9Dn)Yav8atle^`gWh}UL!TZ;Cf8MJT_N2-`Q;58^OaAzi zEGFmQS|2yppT0UzYrpaSFRXu8Ue}G@y=vFV2D{~ai`UyZ{>(VNp0h*vKU@34<SBcv zoym0bNbuXPTFm#NUu)t7&t0V=*V0uFegC}gLgHFk#^rslPwv?)X2)(=60`cLkxbsf zhlWe;+xpL6b!*x3*KUeEK|N>9z8p+FeDa3Ol8ZlNm&HT{n;M$mNjEh&TgdO$oMC?= zzWp%U6Mo?XvhR;g`IBQIQ+V^vIp%=J)6SM$*xy@ayf<#%p}qx^uAJGSZtqe5{BMRz zkfN)ztd+nwEtckmcdW1M)j5;=@bJggpLu_In>Ck+Z+(32Nm<3-jH5H3PFTO#p_9Ko z{^CRDH+)%Zx91u=JnfJ5X*2h0&sv~zNYb!QYHOR{)Q-=!rTQDE&G`Ob{EDh&^X1Bw zrm<gDR?O+B`D?l06Q`976Z^Td%`sk2Crs<ji%!Uj@|{>`B=uK{*)h4pudQIu>21dy zl}woY-Iti&OQ_mcHR)Hu@8#cExo<d~Vde~fxWQ}lx?7GuGdcoyU0$)LRqWmGNjH9_ zERHsmh?*su=J>w5TF2HhY;oc?)(jn+l;D<iOWgJ`CGF6t=j1zGz;WrJ?14Ya-2`mR zi`NuI{q+9CoNVyy>|WNo%>`>)pPjW`oa296p*wE!dt+yL(?hSB!@i3<+3;Kq{c}}l zy+}fMYg4<!l>ahv-A6O6e(ml*&aJuOE5o#cO@?p9ziQVlII=h3we(h3?#v0*ibCdT zX^GE#CfRX1o}a#}#>4UEwxv-_oVGkcjcyuK0$05ITD9~^Z<5{V%?CZ${H`|5m^VR7 ze#P22ef8&;j6GdK+U}csAFz4&gzqjhXT(ggYx{I1FZSlzt8uV?myxx*JjwdWgYpkO zp&K7Ap0V+apv&Y-2VLc77~9CT>!+<PT{P#T{6<4vPi5)#9UfEOeB{{rS+DTa*0ksl zp8fi>PN{Jo{VvLOM)~Vx>BPsZ{9E2%oe;W7>EB%g-pI(GJg+BcJw38r`jwXX71^Vj z`aWh?DvvG=U3Wy5SNc_(Vs_3Bi`+x4zn1N4|Fk9igKo*rmGAEDYO8*I?dsL_t9J`V zhE+bAIrWRYZRy*#UGeiK@93Hz@@cY^z>UAEY^;(RF9Uw(PktpeF^B8!bZ?#w7v}NF zXU;vnZQrZO-3cH3)OdCa&q`b#e`e9cDdO!f#5W(5d$j1XWb=$(*4pD;4;d}oC*Rgq z<lg7j#@WbYc_*n+u~5u#t}AbPCPV$5+44*Fe~zlSR#D8lW99_6whwD8mz<xK{W+MG z<Kan_J0ApD?g$iwGCn(5A(QrCLqo?b=9CRf6=Y8>46EKdVe`t*wokSOd+WD+f7P>V z^7l2@ueW@ErSXRO-W9pLxfXkJ?(e#_pZBiObT{o~Z<e^vnk)KhdrH*wsaxgJA{_fu z-534bdHvJe$Eo{V8x4%an|H~3-EXVrt;qFM-22zI&N^SVy)Q;eKFV9R(qfAJsy%bu zVs1`!66Kw>lJTMm?*sSs){FJq)^_vfzG&Y4N+q+VbotTAOW8IGwOvqXS7cb`-F>q+ zW_y#Y!QZ#fJ-aPeyl_tW*b&rkw|I)m+f5O78E<Wlwkm4bzES7g?LC@F@{4A-)KBWR zzmr<~nD6kkSntZy>$b<f&ENhmbB=QCiq|(<tGae=TXTlhsUo&rJR)CZ^2O!4@1iT} zbM~`Nz1`vURJOFd<EuFT%$ol%V+$j#rpV3=Up?_dw6T?t-`SinF{Z8elN;}(aXz12 zV%wI+A1Hkw<ZIct{U1vk;;uMc+B)~!%9Qd0SC+q-C18Az_i3<ZY}UK8{fjbq6=Eem zznnJl*;9+fS#Mr{*`aFPGwt%)D8a1oqKKTtJ<Ig}Y!uCt)7W!Z;Lb*YgR<ueG@GnX z9p3C5D(Tp?>g6KKRbL&W`wr{BDA<rYE0>Ecx31Lp=O5RpS4&q<H(mGOhnBy>hMb?T zti#vv#`GKUXkXWf4oy$qI=k3T=rNn1q?7XZ+Q4|PwYDqDTD9ud&EwKN8Cq-apQW_f z`fId#n_<M|-lHpI8SI-Lgs+m-wKkq}ciB;mqdN|UWxG4)T__LmkFEFQysiK8K@m@* zqHthnqC``GTl2f@68TI4){c3L4oC33&~~{Ny>rfiA7Onjwij0}v^jP7`0E!J7n&MQ zU3OZ2Pu$jJ+rRSnUiP||ufx?BkX_~D9cugch(N;pq!SXk1?R4YKmIsLWBoDruhV6W z_dQwhQq^6)^;J^QJC(rysk3jJi6lpAe%bH%UAmzuSEcO(ySR$j5no>s?nlW_<1Q|d zds=q!Rou>a)0azEO=RBot7YR=cb~O(NwQ)GvVRJntqz&|Xlnjn&NhKn3$}Bxwx=z6 z5FqSV-*#EI^_%9!Z*sgIoLeS2=wyF5!)<aT=;Q)ci{(L&=Cn`rH9Ka)t*~p!a&M0f zJ3R!gyJr?jzccSUcJZ^xil?#L>RcPb*9vF6`#JH}rB8n<?dl)>Dw%T4&cB;?!>^@p z{XXQ~(=c=qf8~5c)Hcf?Ad6o%KTY|kZ1`{MEZ-Kk<sEG4P9OeE>+Mtx6h6O5YwPQ& zbA?2k)0M5xD_sn5R_<1qdbNMeTkp*gYPPR$Ju9r<%jKDIJY>?^y)!jRgZS9u7}qdy zfA%};`7UyI&DYr1ye(;sh4*DzSI+;kYC*-OOMzi-8B9+_V))k_EbWh8H`n~0kFRE{ z*Ml9ca?d3#4E(m6_-<oec6fTj)ur7{s+rR}Hr}cEv~bV0%g@$zgnwzB-yQC9m|uOS znbfAIxhvaWo@U?|yVd<Yvujdi`rluvzHCbT4JWKSp6e<W28GPipY$l^`m~(V<&yD7 zI5$<cuAie|82jYu?Kdp{N{mjunDpTqM_%iKtKv6RXZ@W%ZQ_cqf{p`gg4NcFGtAo= zsCJ|G>5a@ejqw&zR;3j-jVa>Fv*koDNB3Qm`4RK-*h@RRxm*7h@3!dwurvGjb4jo5 zN_T(l+*AAMn|y6^hsWm3k6~=n_pG-0z{>u<cI)gfM@|MzwPo$9wt470cb~?6yR$k? zN0KgV@c&wRmi@*<N0m1ULQVIQSaOd(+2GD!!)TYi$8*o??gh$MQc@3hIB*Isxn{a$ zCiB;O;r0HLieDW|n$^C4N#ze?$ypy3biS9n6f=9*+BqB?-tUhmKEGJf(=N=_zwwz= zE@PLo{<Xe`JFFNw?i`!QAQ0SF-+8Z3bDi&sJ(Yii--RC%jM!znO8>6hgVPIlueC|f z65lH;m?UG&_WUsi<J5(!Qj1>I@tt__<>-Qlx$H4-t9N`~cG)m}!3{%xwkKI<nRkhs z^hjkJ^TbTyUh#x0Z)!z?|6>-H+As1`Z+s01dp+-f$A)d*b<?FvCP<yQx;{O+H_~$9 zuY^-``UPk5I*C2Jyw=EU+k?~(5!Y`lNznaV<##J#ZH=DcC%NtGcKvsVd&c|qT2jxK zzmi-Jv<n><ysPLDpX2N+`PWNk+ksZ`nJVYAK1fKX=S^9)>VW#JAFTf`o5kv!-7qg| zPts1yP1!9ybJaw*r5(K$+IY3pY+D19cvq-Sd)^H9E0ewYx2)dCxK_ua=nw0~8>`kZ zHci{TRymyK(?-o;X%pRT9R(b(?xoFHJ@1N6{q=2r{QnPjNZs2ht{lbTY0ekAY8}Jh z?+d-eBRStqRmi-v<48xJ<InTKlUlsoU3LEKESwo%Fl)xk?uKc~uj)#7?=qhe8fTY~ zvu(Zq{WDWLE}u4?@bRv1+by&Bc(2=AecN+;#SgnnOKAQ2Zou{O(}X?-&&R1RbXKo> zIa|8$z^07K-*rw=mP~=y@-tRt%cXu3?tI+Kkhk*iTe-Ds??xJ(xO6c}$6?byeaXeG z;t?;-PTP2Ey4Xz3_};76m?zF{`o;7soO|QiO!H^=>vFfqhz4?2W-0xeFmc}T1#d4e zJfCA2u)DeJ>yoPyqL=LLkDYj5UdEnn;qac#@bj{pna_Ba&wPHXrR(i+_r)PMCtPsq zULf>W)8_ZI3vXTvY2A6hV$$dLNd^y(YOD(0@H5eB&LuJP;Eb(*r93{~>rN>Vk(;sb z7vCxNv{&Ms8Zr~bIW>O#ExGx={qd>mOY0Vw{QNtM@$GlvNvF?q@p(R6Bf+@AednfI zj#WHO%ko+qdcu#)v3+&@%YlTqg6;m*Ar<x$_oq~3sXuD>p5hk})i$$iv&k*J#M@tM zcy2%W_=f42^qX_<-p)_$?tEXqA((l3=drklnF>-bl@1mEiQE<Qf&bzYrUOYV;? zEk5w!`GZJjMT4pzk2qt_96g%Y+3ntJWF%7^^yNkBmv0kOz4yAGcsASKX{K%4$}c>! zH&p8j_V6XIY?j^E@lj>g1m}H=`)<{)%eDTy%>Ej4!J%svre&#O-(r$Cn%HDlUCmFG znZ9^od&&I(tNW|7BEHR7ywG}&eO#f^pSB5p&N@np;-;R4580l~ZeTsdd59yH+wDnF ztNp^uNf*93i)2r&<Y!*zurb=XaBJMs2xi`|6aI1QazE(5`GNm)(Of6~f_a5M`UGDI zZ0BBXe~^E*srr<1`>gzzClYQ8i!o<)<W28nE;?z-pfz#lC!P+?c?*6oeLwBt`DG<7 zm#r>kcbqI~v2eP)V@ko}EeXYIw){NuU=y#3*wY;)yd|GL9SNEAe(65p=FZ%HlY`$L z+}KvVV3FeP@a?_6Q?Hmc>umqa#`j?!=cCdpZWF#vx%qjLGd1soA9CD&gsF9owvOY< zO#zECf|jRmGWh!0^nX)<iOZ6c{$@FcmM>9Bm0r4UrK}v2_=}Xitr`qhLgqB?U7nV7 zOw^{=u%;lXzIRsAH~SOQJT}i#>q_4wWqG>nZ?El!uQ!!m{+Pj#)D_sDE~c?+g7LZq z-z94{&Rn-PbN0+FEK~N}o4jjQ@@n_>XJ(~rUb-+-{o)pD-fbo;)R%GUofL`?@jkTL z@nO;FcRW=^ytc2xs#E%B<zJKa%j(}_{l{+IN89xa!z(PeOV}1@XQi)mxPB)zWBy%l zsYlg&{U3aZw2Hm@%r|zO*Zvo&n@bdLu47pAyJAuXpSi&w{tL0?i_a9Rah;soeXi;4 z#oa=4OVz8|mmEsn+b@1g|NUQ0zyHmC_PPHXHq0$m%P*Pp?%<{q&-NZ)`_Sri&%HC9 zxBAy^s(L>w<4>Vi+Izvj$HQLk{^xmP=7#$`_wx(7_ve<>$2r_~<N2sOSy*_}{fXC- zDwdqCJ0Rk<@;1|<j%}ObeDwa!Fo@eQjp4Rx#AWr`NAq~@Y-|p<E?;4~G4032BJQ`U z8q4Du=BO;1zw4oi&uqKX(Irzw4w`YMY&$a7bL0AZZyuDc|F*H(z4Hiv#LS~}pGsb^ znH%#ZIE3f2k)Ktl#mTGduilDXC|%^lyW4B^<UN0tUC#Gh$=H-_VmasTNl*32s``7Z zg7!|{+unQ?yS4tnr)Ls^Z(W5pB)HsO^krkmUl*Qb@oC$?GMW4@pSZz~*Dc)S<kw@B zrR%=Qy-YgI^6Gg<uWIGOKZ<kf-sx^#w*K;b-N$#XOkQ|r<E1@IKTgdMjOz)GP`LE_ z)|*BNmE~s-spVZ?(4OZobJtUi;PUc?wS33JLnkis5PvvVZ`bW_5=9r}<~toOxBs@8 zBQ%xcyW@i&n$LRcW^cXpHBIz4pWWH8GH&br(z|nIE}5AL{14t0Wj*Wc$Ix5iOYhlS z|LdPMn>%XnIg|Qb!kqj08*}w0<%ygBdaU)ZM|IoG-9L|i$>dMlSFRN;)WJJ_qG9{5 z_^axh>!zi0M9r%-3vIh^I<L-s&y+nTk4~OuiItHGUh-V7KK`@jS3Cctf6fUzPlUuy z<zW5v-PvGeu2r}A(*DE2Oe>Tg9FRJnp{uv}yV;7hraQhhh)s<-@|5HE%8ehCK8S|9 zJYb#utL?T+Y~|m!udcr~apzrFzg;Zz*NII`4tGV~?#%2m$(g(Asn9a*D**v(TFtYM zN(tS++y1^LN+tZ&_ifyUqVu(%ox61S{+fvMO81w4-D0Vdzp%*aMZmwLxdHXxI<84g zc2QCLY3$?fr#D~wvLp9{aIF`A%X{9fZ*bZscI$K=TkX`#zqT^|i+^<K?}4Ryx;joD z-n?C~N^Zv&!v~j^7yjb5n#;dXc>Xv3HjVYR*)E($+v94&R(M6f-jTRr#j4B+E3}Lv zLbjU7u42mDRcNJT&19*Y-X>6CHTmugu6c2j9%!cV&g(IJkm-EU`{<uZAM@k%gLiT4 z6I9(|n7rV(b9h?ej}^CMX7em}TWA)eWY4hfmz>Y$Gu|fbx7^x|+caiID49KbFCsZj z&205$r3NjN`}e9Ms&mq3?O2mDbM+&!i|(dBz9`sD{7|rY>9<d+pPs&6QK+P{MMuxs zDLM0S-8z<;(vz5XrKz%?DO3rID^j_(``G0pZ6VDpNB*;>)-f{mENc+x-<Pz9kzJ*z zLa4!R>!aS@@`gRRZ1cX#PWXDiD|hpL>1}g+3te*J-|rW@W&7adrL+FbD~0wJ+dWBb z`}a!nt7vwi>^0Tyut^278`fQ970+H}6|1}G?~dexrH%7ut$W=0YSyPCUr%Qw<h)PZ z#XFxfQk~_1t{dZo`9~^bb{FWpn0dzfkessRTK2nNR3A<Jb+0MFluh-mk=wm3GsQx0 z>%{i%j+#~e@zu+9C61n3KPdMx%iq&}eMrRi;6@4K$}6rv1@<z^rc3|2eDTtqgS;;; zNH=ucHep%Ld*GGP-c_d`g{D@0d7AXVqb0sL=8^2?3hkASEa|G3r3}p;s0K5~ZCY|w zX;zwpR&|fQWykb8Y))<sZCRZQy6m!~FY8|tRdqQxJ9qO-U7L)XhvrRtCYQ_*(Vxl? zVK0-J^Xv6rmi3YQ{(hbI?E237xa+@{hk4&^xL?fG6+gZBflf=U;QPs!Evp6g?znnm zO1Q6Y<<(7^(b2QE7X@!ymVCM-X5-Nxt7?~pzkU3CPvghkUTW7wa{uwx-fH0#{SlXC zylsm~{=>8!Nt@$2W@Za+UunqmjxyhFlK*Uaj@e!n)gqm&KAGJNB|WU1r&D}V1Es?g zc1*dk=KcyJ!A%n%Y|5~YIkwl%a;e><9=2^9?JKvbw;fMhm*4Wq{i<Z=xzi$Z#aWzA zG4`Kj>7UwkoT(&=oB3Dy^i3_M*W70<ZEv|=T&wcx$K@*@dDXA<b1Z**;*f&Mb$2Pl z6TduUI4s+8U)IPjE>=<bF5q}-)kM$Kz9~<ZF7P)r@OC)QEFr66nVNO)eD*75ZSl4H z|E~MGoxP_qefx*JMbnpRPrMTEq7kLCO3gCJ>GP!Upif_eyf}(ho_`R<ku&#HkXH*| zR9V_Z;luJT0tHixK2N)~BFd3LPe0`L!aCVqirpp0Pk$)hX_(QXyk`&J&FI$4OG~QU zZ|`V)WR=_hVcX*Aw{tWVPlj@RGPXObT&>9IRp`=JnmXr73*S}o-_QF>T4(yP7n$<U zxGr0^;%nYKiNjwSMBYF7Fv0JAitfiFvyW$YKJI_@GpG1#$@SjWZ<Ph<XHQ>#<Z5_D z^W|RA{+`FSB^Ao8uclsMzrK0Z2FsU=+RN28%08RKJ)N7~nJwAQ(#>#nQTVTU8Xk;& zE9F;<)`lM3B!9-jN4WNwTy6MMOO1aQCzvi~4is4{%R9L;ecy^-xgTU|vrn}ZKjxjW zAxq`OtilNH?3c&%Ux+g5p59@$?B6`O_-dE6Zyj?i3*B<d4bwipaN5nk+x8dZ{O8G* zxBi=MV|TCr;OFFIc&n}OWUJ7ddD4N|{wuZ~zj7;X>$ew~_v5D?U|ra?c;T&g*K4lM zD>@vfqAv30!mse^2lJgo_b$BkBD?PXo}a4<tEcRJ)W>tDP$#7N!`4@)T%TEQ>#*Kb zc)T+p_k8wK)2q*{<pj!~JnZvW@$E$Rzt^kRPb{zLDOA_k#=!ZDTflTT!?g2EFD9^t z|I@EN&nzA~_1)gj?UD%z0-YW!HP)uOc%CT@HtO7^GpX5Q;V~{1W){y=hk7*qMI-|C z+B46tt-W?_pT_Uc-$HN8hg_L=`i0%{OV<w<nEQBp$DN#grzDxXdsp?o;(gqY8~Cp6 zyI*~~|L5O#HQ(pG|MT-)`MJO6%J&t&`#Ed9u+n+!xJi~5gbwZ8zo%(c((hUkF2%KC zi8GuX+l*T{Io~+6M{4D|KJZ++%z4BAmM0fI9ooIK{HlUyx7$@NJ<dLty>(a7tg8>( zp5$g)Waa%3^sb56a9*jh-Sb?cPfb?Fqk?cb-<laZJs*7ka|+AG>ePy#e0k{0d_K?r z3NsR4>@X28>rT(vs~J_yex~Yq(^4how2;pS`oF|%n3$Hb?VOxnvV5Mg8UN`WpY`r< z_;{iJ-h5VOIptla`(HelxcFu6JkL*6o__j5cWt*^N{+dfc5H^;*SG1B7G85rkF)&F znN;5MMCS05^ftBqJ&P(n=}eMbsCC<>`}K^=r}!e7*UxTz;xdQPd5&gOa;xN*JMSV7 zO#gXtmQTSE)9ux!HhF#5&dk3qqb0F2!eh10ve3IXq)gAeT<P@W=-oS0IFf>mE}Lh5 zv<xixq1bBpVA5p2uW#+uw7U-+HNM8NC*|?ohmE_}HSSJ+HJj;P-nUsTj^(DGFLKw2 z>2Rhu?ti0Wa69GTgb7#oYD8^j*yZp|-MVh=t)6yyj^jST*QMGg&(ls{A-w1F?#7pD z5=MVg&-i?ueWtNu+sqw%b5A_npsvy1vTmBiJC`(9*N;VIE?Z^=9WZfn^q#d~ZzW5* z=wT1(lkbis#$Mjj<o?y|K;Yiw2P^KK$P?air>o;y&)az%<ssMmqI&Jp7D#<xuTgZN z%23|8Te08%@A_XeB>(>X|M#k&m>R3ar9FFoHL9wX{hFU4U0rzI{&LH$dCM1REsJ&P z+y1|y=HH*ce<J<_-2L$9@b3+hrSisCYR`Nxv--+hc<xL6Tc`9ZAAJ>$o7bB^H#N9W zyKhIuD-X6^Sr-_Ey}xgAnVnZzcI$-j%_Hw0*e)@gQORFfQt@7q>AT#gJ@da$NO))a z#9aBa+$9@F1AePldpGZ>h-}PvFq4huZjt-JFvU+jqm(OW>CtVetTktJ1$fRTw|qGG zV#8HufvD!z1zC3IYbDo|-U)XyvtKW4d+E~6i%0HCnKcGXUzD&fH2QM=R^=7jp3PQ& zQ}ynr$#mUYC-ZhX?+aCrcMM93<vt+0^H1Bq2j`nvcD^(C{l4M9p1*7hZ$&ZN{cn9Q zSM7hW%UtY&g>31&X76T!_?45LPvq|UQnIs7)YU4Tlkcyb#y8CwS1zBN!BHH>n{)Zn zq2(@C2G3sjZ+jzf<o-rqk)P#<mrp)dHd+1X5!;5>77q0f+~l`EkaLrGckXk>59aQ3 zen+R?by47F>}76aKVGv!d;W&gJFP6IUyC}|dqKXXE8~Hk7ys0W!M-jkn#^Ap%y4fM zbhfy{KHo~GEo<tfsvhRwk8B^*?$W+~-M&n0E&uNwOQv&t*!XUh#=$z?xmxc<ZlrHf zIUTW`-y=ZGEl?^y?=<7$V6}+8pc2lN$8HMbE?vmm5Ptna-v5S%zbocn`EtqX+=|Z* zQMpSCFFudvR<Kwf?qhoCros6TIrZhQX4rZy^(@=H$!E{JHA0`G^V23rzvxv>E&1g9 z{}lJBY2g+b?cA%@rNo-0d9;Y~S$AJNdF_wMfj=AyhA%Zz=bPUMl6<(PPay2ymB_Wi zGKsI+m3~L?A5y#V{!OsVb&GPwepYuLPt(F@YR0={mfh_Uu6n+`>v8H%Zf%F%e*zCJ zQr(bYY^`Nl)PACB)d?q^>bLuz-sC?Sd*_6gwfnWXpBPKN{*j27@OY7_;|9Cz2IW`1 z!DTW{`fu86O=l*H#_Me`FZwni;o083Q+K9+<Xxx3roQ&M!XKwIdWr4Z<2x?K^BxS- z)m|O2G4#U!v(G1PU-ZD0BP1%geesh+k-WjOif?PQIVD=YT{tt@obmeVLu`ARrZ2u< zCbsX=oC6EAdN)b;-7?k`(=pw;hVgYIbJ<0<H%fhWw-z4Md8Kw+F=EQEh3?&7|11n& z)4oUN_nU<`YBNsn^IB5(Z?BY>^Q5Gv&pGe=mY&EkS@C7@fnB^Q0R>ysB=|(Q8#jyg z6r2mwkP!2|YQ60D7Mts?+&O1-YiC_s-YMuj^EU&_d&b?X<*&0YtlT4TjCWGWy+bqJ zCRfzGUHGve>0?0tyVnYbFI>BM_{*lmF7dXdp&E?I&x~}}I2$mYdSd(3i{I*oq|MWv z%^}D6_Dw!re%x4J*Yo{?ooA<B-@lrhC3gOvTk7{*Zv6bP^Ut*hw^Nz;9;@4ZY-n8@ z9;4Q6$F0P?TE)sW@S5S{X<Gf?>R6BY6wGI7SIIi4Cd?O~IxBH~I!nYq-@9iM4*X2r zqE;l!BR0J`y~j+?%;{D}8<#NOxlqBT!wt({O*ks3qI&G6dRU)fKEv}1Z;FqcmHN=& ztDW>=$uWjnm*jhXtaWoHEnNKALUhi`!gGgqtX{vGHO6gDOuV0W;`47Bz5xl(IW0}^ zMaqhA%v-E(DmI0=O+|9!Ty>kT(GES$!6}xdN{Rle^S-W(G){<kmACZ$g}p~h_@Z2- zy)tjAc3hCKi3%3}V}9<kPuPvQ#o~XsP21<}ZeVEK{rlSC2m05iZ)%)w?)dldhk*YE zOI`+_d9A<r%z~yXQ}s?sE?cI?k#Dl=mHOo=URhUUi~g$JKN4+lvzh;5PrCEFKGldt zf6pC!^&|W!=i_^8GR{W)c$1Z5(9vvK^<aYjOZlo-+Anwu+~0jLSoHAV`X^sI7tPuq z^Izq!f12TSABCQv74DbSjw!^6Hi@>el<rZPb#PWo<BKPu)5QHv@^7VhFeyHhom2JR z?%y9ti}K}vb8|Fbgor)(`0cjoWJ_(s?OYSZwfFBj+1`JWCo``8PqgdK!#}q^S}<3w z>HE%*$(KwV*dLqZwiL`~dyuJpUty1+r0U6)A5ABFdkBZDamh;yS+)03;v3OFmaW@u z6MI&%Z!2eAS-ar*yZnVum33l&Hs4~O%DB!~pJDaw1-dPz;ggQ74M=(X`OE%eK2nPN zpM2?j#(v$|dPRTs<0(@jCdtj7BlrBm<S!NZH}W!$FZ*)i+~jrEB9^sEX*<42`Eyls zOUz@q7kt`4!8yWb(mHRy{<X9Gq#piFT>YGv&8lq4@pW5w+{#*D_tMHpw52w98lUOD zW4_rB_BMy_R+s<wD8Di4%C@zMv7h6vpPt}nmv`?ThvEdW{F5O!Z+XAGaP5m)M0KrT zcd{<~kr@Y<|J|x%e40_}_NEB+WzsKu&qyREE~)x#d2-4neTS{H-Im_E_3=}oRPSW( zd>4<Dg<qB*ulgP=!k>Opqs#HYr-l-qk5|??@qK)BLhRdoxz~0p=e}Nfx69)+<4omk z4jnZ|YW=kLrQVZs(tcr+xnObXW5FQ7+biF&WX{gARJ#7<^fkNFw?8pH-+s(=x@qL^ zzC%|QF8K6sY3S*eZ_}o;d~6Zi^>fF$$>;2)n?J8ucVqgiJLx9*{U-VCQ@tO~+Ah^! zQYYfG^~9QpLSd29?l&0k7XE*CJ@df<jfbAy%xCXxUdW-rBm6Q}GwA(IhNLCa?yi(Q zH2D~NBX5@I&NpXzKIc@(Ij^Yk?M{DscA*nn%uCnO<(C;BHp_}x<t(zYV*7QXLC2O? zv#?EsxwbI7TXL>!S5))QSC+4*xLTk25|_&QCr*0n>;8XwdH?-I)Yvz;--(V5V^mY( z63Vp{k7t~rcjem@*HE9`OKj@xcd;3uq7VFA*$S?E_xsK?nY3`-EYAJ<()mYRIF-Fv zE(vF}h1Ad8u3MP0Qs$eHl}K;y9LHeWbtiWz7OJc~HLcmEq3?^Px5dA&lQflmBO>-4 z+NQIy<hZIj%h74mZk#&yzkl2QnHH%noRy;XDLsu$`i+L$%J(TJ=cMafCVJjnm9%QP z#+tebA11v@k3Pf2bM2hx9+S3Pb*F{G@=x!6cxl#!Z9Rcps(n)~eOmhMkxTTIrAwou zLgHd7A8&DqzFZ!0|CVv%+WfP!b+xa#C$7!k`)K>VQ0r-H^Idy$YF9rEwcFfeKcl5_ zy6KEM$pj}h?u-plY?+Di5;K+@Ec4R0u$J#@Z!Ny^V2zR2N``oW`y6#24p?wM^Q^l0 zf_2^bxnHVg#r=N4`p(bv(FxJ=i|?)YT=q9uAF0t_dw=QY-Cyd&|7d*>s{Iu3SZV@e zVnn9JO))=_M*qcmORoo2T|Fr1Ghtp@fV+Mm^X8DMi#{#}X@PoOYK|3x9c<@sDg6jt zcsb3mFE04yRHyaTdNJAmPyGy6JF)!em9XGwzg*j`tPhPIinfItJS*;J<ZcnwYdrkC zA>+eRUbn{GJ$p1a^X@sR=)`(xCDZwpbDMOS^#u;Sca&)Vq5d(_A)?!W^`p8$tw5W; zn?&;u-wSJb_H;Y`&}uPP+}GS>&va2gc#*h7#b(Erpq7skA5&}0lyY2V^!+gQ=-@m2 z-ic$|dl}{ThaEha+HMQ_9sg3`BR569?V&4&y3)VOny}CN`8(pAZkOA#-RTqbS5(wm z=q+$esg8R~Pvia^fqiTb&vv{&B(_`T@M%Fmw;E}?*#c(DbJ~B{>BM(GyvdO`e;H$k z*((e8d2W3^2RNp3EKhW+cj#+Ls!%+XEx2EFzA49R!DUMOq&W=}D)bH&cGOEq7D~5; zE6-{Dari_>p+m{)zHWnKRV|YZlC<qs*Y4m<WP4OSQNXrM-$laL(fV6%!jWEyeL@d; zeCh=x6OVlmYPqibkF_T3ej~5Q8n#96FMe(?>G`24B-A7LSun2k$MK2EW<2rTAH<Hx zJNNY*|L~MUSn$7<UAuCPK%&~C-+z}JV>;4*u)O7DX0U+xzkNZEpL0w$SiH9`C|UDR zw!nW8yKaux0{6Op^#56M>@LT8hd*idD>q6#^f|I$nTLy8?bEHMiWZ}ujDsEPA8kHW zDETnv$p54MSx*#LZf8xK*k83T=y2nQ<1_y0+OG`k`CxVAzu5e%>#jE#h;-;J;#BSV zVP6-d%>Qs|NBtT9tSbt0dVhTXv*g%cj^zq<;&!WBb_qlY{+~MkO2BE!?pWq44Xh3& zEgx%E2DW~1JCm`0{*{2=pIDCAcc0I4^lRC!_%GRh<wxU|$AbU0?N@&E=a?+`Up=Ko zOUI63QT%fA(*_ER%6Z|lnG_u>*dOixFj=ZwAg+#a<wu4?^Amn;|GVVaUXJ>fAJacX zu6^OwV!xDu&-D7VMNS{m?N<gie8@WU!n`ghS@w`+$NvNVS!*0Bm>+$Au-WT{zQ8&6 zKikDGnEnan;q2(++PPufL%s#sTUaib+VL#Nwh?i-ZlS^xYN*G)=(h8@>!xv>3$o|@ zoww`QY{rt_`mdKw|AhAVDD1MCQa`oGF!u39hF!-dGVD5bj$zlao!u{_{%N^M3CJc( z#a;i=&#>#5F=I*Zf4&9THbM^9e=MGVB_Ootvcng7pXOc1wlVBF7QcV_x{vc2OM1oI zFPheb_FNXR;dTjciH*5lq13SMV;w{6<NM4nr0%nTovSM#D{U8Y{f4;1^$M$ob%jO^ z>pq@l*yXl-{*@1*hI<^oNI$fBl+9Sudw&1&b%hEI>ptd-UoZ_3J>31Y+hNPyn#9=0 z*BMKC7c-Xh-eoN5UGKgi`^Rbt_Qs5DSKcnpu3&m0b)NNtsU7En>_5c}v5#ZzS3X>y z<id23UGt(f(+jEiI{(<m`<Y%y?cd$8j`7F&nvfn>hcBxP55JcBFXV9DLeAm(k6MOU z=5JQ1FMpoi<8i*%r2N&-)8CD4w;$EHQ0#Vh?Q^%;GF%5|uP;kdsek?X%N-A9Nyp3j z*NU~z$5!c?PJ6M_P(Av5_MFwv!{)bE>Dk`;dglQ1OH&UIS)rm<FApB|BMXFtj&Me< zn%4iaH0x(nT-~H7yU?zC?2D|GEEN;A6xIAXZnq0u-L=HEd!l4+#evcc#s{;Ulr>D6 zkckHOZyY9_u6(b;nV)S^*kbYW;-e+b-IK+1{SLGgEJ<X`Inu~;VDB=G6ifg6?90`b zoVu2MQrJLex6~$4*N+?ie=eKw_*&uR%HJn{UOOVPPg}KB{=o#H;|E>%elT9soNPJc z)WH(I8CmM`pOzT(wwa_HdbXP*eYaoae+~hI>xE{O(syziZPOMMSs&`$5@x2h_4Gp9 z{>+CFt+7^R4RxHixgPWS6~4P_`TGoii$(nWBd-$db-i0p2A%ZM?cE~Gb&Hkv0dLW_ z7e;SPX0^IoD?eYN`g}@A=F>SsNxBoAZ}zQmD}U~JQ}_AP-S$_`yjd~JK`#BGZspH& zvuYNqEqN<_BT>{*(=uev`;yl|d)%M!edpxO>}#*soVYzq?(B)ARL*N9g4z3CceaYC zev<HftM@v2)0fpe)jMipvJ2i_KB;u}_;1NdmK_tns9n4uWxC~d@`*`pXFq+seP@0~ zN|n2mTnc;kiDS{}^VZh%dt}OWuJnB(=uokwaKrcRJATQ}rUo?GT(Zvbp6Thl#OY?$ z)YGg>ja|&_?XD`P7R0k`HZu^fdr<78_2*N@F85n!1h)%3NSXCh{EYn3s%!4E)@(l! zq?TOwoHNo(<&sY1u6Z6aH8+W@jW8C?-m+OO*l>M4|F`3w7dM$Sdpv${p*B--qSuji zDJw6$VG3O5@z}$6R&dmc%@t2-PnvEy>fy_&d+E|v_Suh;ccw*cN<MZ<yYuTWmg7A$ zYeSQRCoRnkO`MW^^}wsQ3B3Q5EHjttDW0sZQjjccT;$$#bn_<V#qaJ+{^DzxAH($f zuYlvWMzv@E0<`z(T5o!~`N+nAdDDOJ-8^>T8js<fNMpYZ=QFjI)hbU<lI}j+8)VVD zInvH)$sLw#&*z#+XZ>bO|FP}&oM~%3Yi>U(n}1=K%)>?Q+uZCv`}p&iw3q5m+?2Xe zUBp6N^jP^{))m_>zPqe3b8_*zRXn%!Tenv~7xLXSC8|{Qc3{*}@2u~yZaYl4pv0LP zqw-ep-fN*HA*bBdhTK(ov8iDOpVErN>q3pk78-VLov^j{DaV#`OWYK;eGb_)B~Vne z`p$fY##^&;)|$MWnZC!i#caN*`N_KqPjB(I`<=WN^FCe2bZ_<&$sLzO@0C@qedv_2 za`BP41K&=IaOiK{68O;X{t?b=cb-&!oPGB7@_=`0Po{oQvse^yytM9(&C=pjt$WE` zCEZG*R!bvy%`1QTn)!XJ?U~5QYPWcE<AaY?n0{HRu}^=!LVbSE0o!{5?kqnt>cY>x z{_2sSEmn3odp~zu-XyX0Iz5w@*4>zT=Ni9cO4`mP#*y4&Z`t-ddNK9>ZvJgo)%Tt> zKfh~k?R|@;LgQGDH%DuYqLj<_i!8mUlTrBi`PYKJ*^4)v3X2Sjh!F|jQuXuF@6$Pj zt*PHE-Yr|E#V7W@Wz*AbqTj=(h~MtkmpQJ#{*zI4;nPc>q$}nq-sEZjwtU%|Q~OGG zuC37EZ1BjJ)t2DOF-e&!n?EhQ@czAO&FgzEp4+$nZPjy`gNe5|A9WiswV2fWW?C~x zW4~cRg15*9xeD#)a}v{Ef2myJ&wf*0oo~Z^=biGKgm>I$F6O_*Fh5PR?*{8`NA>`j zK$Gu5HYYNlKVT2cn{~<~`dH=U2OBKTe++AUxw5?HbIks`Us&ec6=r4U4ROD`zv{=k zOyw=1+`QTuTQ|INT>6tY#9~Lo+Fmh{Y5e!ZI2{cdbe6y08<iZ8`((YwN81JR`b<TV zu~X6}6}uI>2(0{{|0b5dBsg?deWma0Exf)BLR>7J0b7^yY|A;$*z70mq04h|+YF_Q zwOg;aZmi$tc}iZFt6!-<{qD#2R__XB&zD)QGfKDKZQEeb{P(d$z&WngQVZtSB5RC! zU-pDr3n-fW{`;=lbF$gf`@5dM+4XHsd3^Ex+V6GWfA6b)|NU<H`}b^jGnc&Sc{6A7 z!salEvyWA0Gn(ArxYMwK%j`*8hx_x_w>4{uFU}Rx;+nSiz3Y|dI|D@2p4a+s{#4A@ z8aeOORI4NBRi7Dl+|03is&gP@YeK`x6RR8Z#qJleOMDP`G>2oGVus--&b{v?Dt#Sq zKPlK7dswGn?K8V$7wlzU&#mM)URiwWsVrNnz_y}}n81@oIm(-OJ+{?p>PHuSnfyWb z+MUvmlT5FRt4BUhxydwXaevg}qgfdq6V|kS2vl)Oe($>dSn})CqOva&V?wW8@zLJ6 zDL%q}{$j;7XY_CWzIkp<>%m7qPpH=~%s4ykP2HQ5SuzQ`qkn~NYv2;uz^h|XBmF}- zs$s3#KZ(Cj-9tFLOZ)b9KCFp0-jI59mbc+MmYf9}o*6wVcAmn=7p&FXb#y^VfymP4 z<Nzy)MN@S9)T~0+NI2+6mb%z1R*2s8)hMB?lKr-J!r!V**O$04XZzHBy!>~=v~L@~ z?k-Pd3Ev?0#A~wo)6UYB)-sG64RWg|Cbl2mzc*vgi|MzYoZWEk;rhe3j-6qbtlK{E zqWR1>o8m8(PFpvn(C9+lyqXQ`rYvV`u9)*D^=PD7P@^Q1o<U-8tmC?+3b$8I_1bJ~ zJ^k0CrI##c&Rw+l{A`~ozBPZ>@3{9T<dT_mlPbp>jxIq9fi*4xZ3~zjMOk0wvgO6> z{KU9_j;@4V^FH<^%?rOZ)RlK0T%5%0z0pt0Pqce$MZh9q+4tUj`;UIyS8Ql-?v8Qc zfv}a5yJva%UN|b6b<%K#Y2?<XIEgRYl7F`+7qs7%-}3$WoGb6=32fn&vsS+G=a$Ry zhV{OS-n?PnT%vzEAw@R*#J22ol`Y<?QC9;QDmuT(b)8{37JZ(t+WKkXnpr*vgMIIs zu2(N;(Dr-9`1NkV%a!7<6@M)i+R84+JaPS3UCVUq)Pk9+zco)qTC5eHo~0c0QD^Ec z^X{OhJD&%dtnxYUeZ|P~QTwF5>gVpAi{thXZsG3ym0ri~ukiP2xoJbCRce{)Wo3T; z>igfVzv(x(7xPrS^E!MbQb)|TEiIUR<{p>7&XTjvs#SSEyHl68b)T#{_YxOvt3HE$ z@`d+!_PyTzk7?V*8*|=Hd(p~qE@*4W(U5l&Wxpx+Ol3@3r1RpV+z-D^3oa|M)J_ns zFbH{YD1ue4iKWYfNovA;*Hv<^hYqe5c-J|hz&~J`O8mvb86MW@);R@dC%tJ`b}3U* zG1}_0?z^Z`r_i&D4GTQpx=gv^SCK7oG4N4CSatlg$J~ldAxiUm!}6WF{Q_hq_V;go zCC?xFf1-EzqwgOB|EM+fz26|u|M~Xe<EIzzxG`~Si2AK+RrmEvO%BiW$+cQ-;{5c* z*T0-!@2*(JbU$%MaP6FZoR{BBYqAVEeJRK5o!3&sPMf(E*JRJMv1IJ=oOR1=o;T;# zm+o@q*4L*L_Z!xjysB}U%Vty}-YtHl>5f6n%?Q~uGhE%$mfe5F(_pyQu{!?TN!cS) z?!9IEH8Wk)H9mfpqScCNjSqshZWmzI-h5|I@XSEVu)Ai-_a|LEp>E&XyWR3i{4t$h z(d&+{*EgDaBXH5uRSWnU=S;4A6!QKu<Aqn(O;lKO|2qC&5b*Z;F|8R>C#=pd3bs?y zxh8p|@~0N7uwv_FE451g^;1m?-}p_g+`8}Plw;NUkKaDMG)a#A=*fv+G?w>vxGxQr zOj0j+c-dL{k$tAs%dX`QgL;I;R-D`yBk<mDiih`1Urim40`=~A?<?LH-amag-<eC) z<sbj|KhqwE2A*U2r`A@|yLN)M`s7=YagEb5d+HY4xbxJ`#=EypE!ysff?ZJQbHzL- zjXvF6?e#08!sFI=`e+}Yf6Zl*^6|u<kw5(nwi{`FY0xb$)|%Zce_$~e$FrS<%I7&I ze=<(l?0x3E=;zI?yeWAviv6CIJl`^TA*1$Uh1nH0d#+BA`ttt!^VZ(hJv|8<B|Vtd zo%&mll3H@IMl5=Q-?o);f4ctqr0>2KUbgZ2k?w^mk`DJKdtH8NvM+CH{GR}w8O~|m z=R7wi{Hu`RliVD1M=i_1CawMOJonJjx!KNJ%#-52Ygp=b{dQi**{mY{@^VA>!}N#O z7bittOk4Aj+ubsD>(|hQ>I;Qpwr+j)s%sXnSIf?Abr#Og+g`P2%a<25PiRqXooh7F z;7tvW!MBVrGU=+P&9iNei~2p-G5chCj8mQe?un1L`90fl|AMIdyhp)P-o1Z0%PBKm zI)yuXW{$z<GYqNArmhV=WxUxq?4^8K!o&G7Cog)bO+Py8t<RJ-HzT(-I>j?>UdrC^ zAU9j|R<P@B&2RjY9eeNXyfWEz@4lY5+pisD4EnlE(Lm8a*~5K8V*+1O4$DrCXUY*B z3j7C?SXxCg5}Us*HF#56Ip^bzdy^7<b}rB@SkumHwqe5GLO*Te{r{Rzu*odA+OwEz z%@xNtOqcYoPC3)+FpY70tk&vje?@q8zBYt>n^w*~`?aJCOKGO9)Wa>WGUo3Parb;Z zzfziC`ee_y@)|+)KbCqk?rrHi*(Ov~QF%)3b8~WhN8bJ$7B_kXU$`#%|9IP)8@x7Q z&d**M+}h{#=#$;SKj&l5e*5-pQ@pA5H#2R8=OXOE3*UrKO3vr_A(OOe)yl?*bvtkU zp82{v|BBIFIk{QS_KFBHTA#RmzUD#frn3)Dde82WJt=)QY46GKzghyKYKijY%O?82 z{A(G>Ti<Y>>#NGf8FM2yZN0$w`_ZSMFSR~@zyHjWNvyn9AiS)|e7@t31(&yWT{(03 zB*Wp|9TiGR+jQ1vuQBZLu!#1!^QzY6@Q>#k6IrFNGi;m~e_-{(vUn*2Wy=#$vOiv5 zdUG`3t+$xjvch#g_DZ#Ww~69b|8bJ#Uow-=gJso0Pd0mfjkf3Qf3<%~@Z%ZYML+Wv zv88TI+p)~py<m-*+Wwt-f7CKFXOukUxVBws_A0?`w{w@2S+tn`G=Jf6PlA7aaml+k zt^2Z<r@hvZsMQEwd*VXU>--MoW6?RaJHDTsx9o<a>VfNLwtP*$^(*DM#pPAk%xnFs z4p_`MV)4S(sO4wM`-O^W!Amxre4ct`Y3mm@tE$w!iEqED)zmaFm2jn}afmNl@BQvY zw|G?=$G?}nm)*24#2QrpUTHVm`eIY)+=`_8N7Fi=2zHz5%9^f~ch!_?*nL&V=7qyF zFPZhHuK!wS$v^oS%k4=PzCRCd{knSftDWqD)AQ9@jvSAYF8&gIlz%UGri992P1l2) zUapYy`S@YYi%nrO56aehepz&3-L{CWysIO`mw$ND+#P;(TGYv`<@<bWl9o0-I`TB? z;TE@`&G}m{70FJOP=B@UN8E%r8UYdO=e{uUbiHLBF#UPYo_~MMl6@w(?Up{9{M;qy z<Mu<=L7Q~0RbGjHQhev4|J1pko=84%yQD3;%)4@zK-2NRN#bh8%MG_RJbe;l*tVRX z`=ymt;rsJ5R|W8WJS<<I64o_$31{{N8zDx+iMdaBTVE`Bx71L0*Ck`;i;Sn%Prb4B z{x`WQ@zn>DKAUU!)PHQs;dM8zWty?>hfT9xRc%4osxy6?!WO;zccpKhMX0#nhKcXO zxy5<U&75iW{~Mpu>xi!lrnrB~6t(_*q-O1u^}@dPU&AK#afqw$F#SE_xy<!Ff3&wh zb1*u5Byok8zO&8gle+_*cRx~l__?F8#_i<0?Kk`_-lsG__+jw>$WpcUt@#Gs@(P>2 z?iLn3<@)<~i15mfwHN-oyVXBlkT2hxWM;3iIZ;H#+_&(4NBgS!`*l+`Ep1O?zjZb9 z*fzcmy!&1sOuM^>Rrd9y6@Blf9%7yP`QD62w#=X8l|G$M-jF?4<@<iG!z?lXqIz_v zXJ!fh-BB*ID_l#THO59s_o8RFIlF<d{;jGf`cWeHT|b6hb)U4CeYukQ{kL}AY!OSo z&RTK$V?^-O!mG*FC)~_$C-yWR{PiX6_QyqOw*`0cd9S|WIwSGVUH1iX{%`jz(Jj_l zUAIK{oamxu{1Z~I<=EdSG>iL@!?rT!^ZtXcw{^t^O5EgM6eaPv-&p3=;f2ihH+nWN zzB-%LbJIt=u*04^&b1k5#R&dcrN#3))2+@%p*=Y2-^mmHJ37+VtDe5(`uCFF#?!wi z`t*jlm8@9mS}<{m#f+)l$IP^4CDu7vRYblns+D@~H*LAt-t|GAa(=~El^3#3o>`Q5 z^FPD-xA~b4R~8(7Kd*;z;+#vO&mUH2ub-THM)_;qqja7R`?T(_x1GMwBU|NFiqD({ ziy4mYXS*&LXUu1FA(y%D4o7_Z&aydNvQD8=%gl^Y+%?}A@>Yj)G4Ovq#CfPn__^O5 zZYhSn3u+{$cLl91^l(*s%Dr<#;PIU%?>F7+IB)5~e?*0=$j{3=_~guKUyYZ~bv!fm zfpxQYd(XsLtLN9WZkA7EGvL{x^3hpSKh!Ly+t(#jH!Iv(H2bH!vi-)bx>GObtywc6 zak7cD_S01>6?bt47Zk<qdNgy<iFHBG@|djV|Ec)fx8wHX*$nBz`ZdP)m)`Z3E&Fhx zIo9{Nh|!Dsr@v=zIC*Agunnsu*SuC4_b*vCtT~(q{%zUtUaMY9%U~hzCjHVAZVy8n zJtJcjOxSiDEBx}iCbD5sNYRwChN!^zy+5vPWSSwiy7$kL&|L1FDXw+fq&~51IrVM* zr-ui_1htE~j%iL*-DLlpPp!eKL)c#}fbo~_!eX&Kc{Qta4K@mDDTqm?<V<6_yzzX? zR~5%nzwP>U@kcH$PEuF9?0Lg|Mbg6<sRa|5yL?tIvY&mb@bdDB!JgOmU%KiX&h@cg zGdBCBl~?$Lb@D#Xcl>@?)x2)*Wzj2|YyUj-++V858xtH?-y!=p;mzNL6X)OAbm7GE zhdKVq-ZLl8zx12KX5VpvD+(*zFEk`5H~DgGQ@GKVz~1y+U{AvXQI_?AALOiV?N{tt z*zjxZ=M^D|c7G>#*6XdfJL~%t{jCR?-^^!9WL_rvb;gdkMbknK*5noo_8R@V%ceQM z!Z|nm#l>#truf&prY70sq;mZ`=|4FnXQt;K8O5cX;>Tak&wQTve}CQS5X(&-cMHRG zOR{ub+uArM>c3wyy;fFk+lo}7kR?J|pG00U{^xvsJoLdXpZQ1n7xhmL+r(EY82OM< z=k&`L7oU|Jzxn6+UB<!{D{q^g6gH2M`Ep~oS;x%8{WE`Eu}G^3PxvG#5$R?4vc|`( zWR9nEy~7`gPaCdU7G>q=xV+Nz*gGfa{qYMG;(_*}A2O6pW?oKwV`0K8cG)E5*G$LK zc#Ysvi_6W*##i6ZJK=F*)ghH5?ZNxaj7*m<5Pz~HC93o1%`f~4uPrKbzN~A!p!B3* zN}asJ`2{)>pAM-qT#8)L{fkR2**J97(_CfyuW}(tb3NG%_dN0I4&qd8SDhkjsxfa% zn#a<7spU!jv)>21f2m%<kv+v^&%*B?mK_pGJiYkIti*};r@Bm(@cVoIj>bCIj}_)@ z2X3!y-z(32#P^ET$GV^&f7Opw#artvPEp;uy29l6@{=b$?jBY2o;a;Uzv<}mh1K@^ zT7E5Dm6O@(U(Qg*C%Gl(kF<ncsKDNzfgitLSzKQF=jMi=#ufjq7e-`zvORaGGoQHs zCx1u&t1|VCt#Uaha=2b?Pjo)@Od-cBea{Vv51A_p4Y)6ho%q60*ZePXO^@I&o?mw# zxAHZ=no(E&ar!F%n}4;R{@Yq4AM&m~@ZIw%zbl`<3x9WC<2(1Mzl)0aHNJbtR@*(O z2wk&oZ};1&vL7GJoN~hQ;fas6tZhqPTwK5zII;O;{W8}xtokb}ub8gi^T%zC{FSyM zo#UUre3-DA|8;(_T;bGY`J$aRujGywy)9g55mq9<=-0fxszR3vBqWPOzU7Ltd==Td z_(OunPWHm^+E;7&7WM9!<jM21L!;!stIfpAd;fb+di8VtQO1uq82`+^T>Ed%kIwIG z%akpCOnk^*=IHt5f6<zqItygt#4N5n6|mROEIT3CzN=>W3?)mZ!+{LlSKJ()2R-Mk z-mSewt0gF^;0#}-+U16j>_aQ#mrV=r`SWE*dbiu+pKjMA4Q9<Tv^x69bnDl3soRRm zR03W8EHV}S`t*+OiwDooFnmi=G0ix^v#0#f<=*Kk+uyxBrnuJn;T+u?k1ti`)R~F0 z-!GE?-6LH$RcJ-5xtaAJuPJrs1=r*jOm}_uZeRPP%-G4wliuc~pUhj_9#@so@wK4q z(}ePu_m2e5E3}yY&rjK&IeELJymQ)v2Q#Ik<CZ;O^EuouqAum}b?pp^<2RK{^IPuq zhNP|&wEe)DbjQxFi#4TKTj99&5k9FMvtO4a%}OynDRI0tO+j3IW5LXsbFc2+dEty} zf=sgF1lyLvIr}3va)?G3+@Ef+R&1tOxd_wl?Fz~EJwAp{@BTb9OUQhsvt87l0(Hsx z?>FWjuX~}T^XQq<T@{%}i&)oBllnQ+VpVOJ{zkpM<-HU4b6(@+XMg(4WyMi50S#x< zsx?NEVU?k)OqGScM2I)m@`%KJ+o;CX6x`+-Cwa_OFV2SNWo0#s#wW+ZsZkmFQw~nx z{kUe*lQ(iA^=xWKAH<1VC=}>RlHu7o^-4s6)zv8?Y;($!a|E79FLIdBy3R?Gv9htJ zA*Nz0$BCxp25f%}Q^kdU|FD}IqZ`I}UP*HEk2yO$o_h<-GbrFK=kQ;#^Z2(KFWb@^ zzb)GR^q(~T_^7-sPyJj#LVfC9-pAYP46Wupd}YVF(66U!`u<Q^bM1uvhxwHnnv6I0 z)SP;;oU0-K_KV{af9y+plXdITGYRYe4;3F7Ej_Yib~IDPH94gOiBFOX9&Wz4vi+Ix z9pR;}R*}6rK3wlo)UKXm=96Tx5qcrHa#O@AfeXe{0*)rF6MAv;Q}7-k?xhkR9W;;q zz5e3!<K92Ix+~r67N_d^iPoGvaX#<n=AMv)0=idjeF`;J-m1XW^8NM9iI?Qs-uNCr zHo^MVn&}gLbyOd^O+B0I^8UjgA3d`zM#(qDj%~Vl;Zz5ov-W9ww$SJU4gcA;d<t#k z<!7vqOntJsU`e*xhw0C^a7aY{KX>B)1OM~0+>+GPFG>WiiICvm`t)d4_{JSJZ2=y} z^B;zkpLw)HyFu=Lcir21u`d$N42DT*?^BfR#qXcW%iSpP^UbvR0_Ii!Z=HDl<(kCL z%JcU5O<N^+MQX*h%-FlW9GiW<*e1>6aQvLZr_0WM4J{27)zeGQJ9j7MT<qp;%gSPV zCA)K0PJQ$vy|{F0w(r|lA6CDXTN@d>`y9_6oo!Ov_w8GCDRr8)sqyQFJ7#HZ%iAtA zqg?c>w9=%t>k2|OI_>I>JG-lk7VU9el6$`Uz<r*z_m9SBgub7=Q2xi2xBUMXsFx<( z{~&Z@--`LGe=FDTl9TWFwX=#r+GkPtJ6?kuoKKZ~^umJu_nO`D|NK_9JA2>pzkljG z|5s|4tDabP%01k^VTa7G^t`8cr?WG#@?F`Ytx(x_&g89i3q#keA9uf1h973!^-Am2 z+|Xj}-TQ14cD>gsc=26gvi$%1?EbArGk#|0tQU;(+voN4j;Zr~#TQrp^KMvppD*d- zcZMb5%nrZa9%N5mQknU@f7ANRC6SX)xJm6PuT}2Vc7N$>m$qxa()*9uuLEAz&ROLx zx#ze>;q{WUd+oel&6&WP8nSmU$J!4kyP~<*YcIYac!J+T`qiANS4B&UuUl-_U#7G3 z>;4mQ6?3<Q?znzFws?Z#BI~Wk)6eg;QVb0D7p-dC8&>}OTxIxAsi<@H8^7x&1jeTC z&VDPIu;T?!m$H^r&y0*ci;ihX9L{y~b^XXRi(9EkP>D(Mo5HLFHg}%eXP;!$C7(SS z<7be2Ym4dMmDjg4J?WTbVz|uL$7ikQ%X*V!|BO@l7Ya^AzQ0v{K8MZ2)N_9Ex&I|K zF>m(nE8So7Iy$@l{dTqIdxNGQSoHVFzhf&e=S`CS_|e2!R@{8Dy7UE!ws4;2Wp^GJ zh@8Im(9ULJ`uA7H`*&T`D(ahi{orQlkYA^I`+jZpGVHD>>nJzADZ2H;8-ru{2G*?~ zpG^H!ap>Gx;e4&Qi&=J)9!tOfC+Aia*&1=`*Vo8-PbP*M@2{Q|+PXPS>Evk}&n>6E z8{EI)w=JjW;>-N&>nmUX{3X8Ur@6WI#3`0Xh0J*7{}L0+5MI24_15Rw=mo61Y_B-n zX4bjzj{lih#{a5fv5c+p8{XYqQQa5tpUZ02JUgX^Jgx=z*Zt$Yv~>A$f8GVrOfNQ< zzI<HmDSfd0Z-j+sfd#`gR`&Zp<*(*k$@)I)^<*z@jaPpdejQ@?)yMFwmhnq0<Ci-O zzveMi6*By_ociv|!rAEuBKh1~m`~hGJlnALTk#4_mamr+XEVKMlnoPh;D58>E#sF1 zeAQYFayJrJT+J*IY1i&=HkS7joMUBSpLXuh^ggY(6Lu+_jSJJ#I~5zhz&2gfqF~pu zy?X3Fk~0t9N>ZDiqtac-5*o8>nojYw>C;8l=xd02K5N=C<qnsez3ujz!o)<^Mvpg{ zn$ky`xQzV&p6*zg>L<1<$hR(V=7|WFjn>{?74N>?`Fd1U`sd@Wrbk;{l_C|MO%r*p zI(?n4rovItvN`>!BHfj)DVx$3gkLC4e^Bsyqu1qMdQsnd?yvVa|Ko7!`CCWlR8{#f z{7s&_H0e*B_=LJ>hFaUUNFJ*MzB%j<ZMdFWK6`Uz&G&zH3RCy9EV(2YaC$xSi@A&? z%x^vO`4{kWEZ8sUu)p=!+Gh{SgWT&yOgAmy3VxV!K(l>wv*rHUm%K^~dW|<u)Y8<` zJ)yB$<JiQ;`{|W|h4*${YU<*eG%<QjpUM3R(a&NYf8bx9`pTeby-}YRmsfCsM+^Uj zlYH*)+{CU<44)7bHfjH!6M+GNN8~!zuCm!Ka`^1L+3M3QPZ(W1xMZ@ZkB4T`QH{DA zksB0vHFZxYaTj}Ex4NlTHgEBnNWWbsr;q&b<<4j^X6&6J<WO(ju&+bQWTE`LjY<u2 zCyX~Szi4NA@jB!e>zQihDg{12sW~+k(K`#7o;}Il*1dJfJq{1AC3V%ee@tb$V9qYG z)TSX$+(DfAg>~pI&*S$@PJ4W))@$hVm)<FnesRSi9SiM;AqQ_Bo>Mz3G1+nJeiqY3 z@~lgY+^2IN`cutNtNQVHd(ws3j9*qU#1&aJ?9*(hQ){><a=^PQU@=EXqSBn!0<Q;G zjGtdVcDrNd`=>=*pNoqOw-ldHxY~TSZ_d}9ix%(DYF~5hjPiW`6X%wuwH`a_-eu2z zVgAL7iRF*ESCs^L*gxJJytMsm`3apr%)8#1=jF%TcXHu;lUd-o=$;nG#@^4KCX<<p zuZeY7PAEw%SsHUjGxfDIpCpr4C9C=;wZ@*A&Wnm3tmm4)K-omHe=A?`5}WOdlALEM z&tEddf_vK2r<+n+?L|e!yZ)SfcV|ndeacg#<xM(b-CQ!7e*z=temQUT$jGq%AJ>jZ zZI7zLm3tM!OROZ=g}JZkYoFDf|GxUvqc^&$OV@O*?U%Z&C3?BCU8vqvePPh#ikJOz zG0rOz1=dF<7CL&?^(|KD4|Vz}ay7j-x%u~^1)YzYer{KlU7Dn|C(UHu3u~s02ZC?z zSs}0e)$Y{vyN*%zg+KQjnDbZZ?b%ZilJxWbREs~d?jcoH_17<ZpE@E}vPZilm1W9C znW+)4+J7I`e;d}5fB%Gj%-p_>Z}M$^+q-k@=vMG}XwS_mwBgjNmatVPF0B9CyvOU? zx@Tb=JUh5AtoZP}Fig=Sks-MD(sP}N2@n4~a9l0G6w}G+b!}m;l8!`3Wb21*?u>4w zk*$om(T)CVHgl!<NS^*25d772@ht_GQ(yOOJ3LLRU0&ze1pQan+3QyGT}hXERKI;; z_FF!?-)veNXV^r{I{t5xM(l=FNgLBOrhWUh$?IDkTm0|P+2zJ77CqKWjkn?2y?3Ag z^`PB*E^<h0n^U*3dPUA_E2g=^C+*^|c4sBW+5NVEc1x^p#v7|H2lr`*WTJxB%nHh# zEKw2>aOI^)ZbR_1TlI%!=X`6OwDz;asYe_4#(rkq-*c^O>9*?63jWV-&%3q#|Gm4q zwQH9NG3JT(YA2;fwXSGOS#97FS%1yJe#Idzp4{IXLp$b0+CQId`f7*R!+=`rPCm7X zD|}1YUb#v*&Rag=_eF!HQD1)jSYJAItL8pA{zC=-Kh8aVsN&^$)n)N3D=wN=&n$is zxTfA+hRKBKk8h&Kw>qX`o0-p#&6laaGg(M2eVgYtzLir|Ef((boqk&0^3rPITMXAr z@2Q7cOs+NMx#juo>89F;zc0*}&Jk@h^<fZ8V7!&8c`J2ss6^lF6Yd;ew@)rem3h*Y zs%kqcA=A;5@wVv--w&3v9@K>#%bU`axje=E<iShNcutmiX0gXKS{j}?er;WKYT`4m zZT>>5?N>&;y(i;1=lkw=k<aF=&TjIH7q-Z^@6x?I(S4`mUhlg4-8tFU-R9RW{jL}L zOJ=8X==Rgad(S(myUKbNrL}+i;oZX@e{^c=8%3K?N7W~+FZvzNSE+sJ^l567TX8_3 zd9CI;zvt_sJdPBcpVV43$?A-MnSST9th~t5_otWr*c^R6oG;_wnJ?eBpJ9JA*?Iq$ zI>nhwjH`Gbr@eH3*;I0Dv+%a1cl&1?nv?d@%3Dp_X`cAOQlF>t5_hk&xMw_N_-?w` z;z0IF+owGr{0im!zukLiXLs8ATI^P-Hj(%%SNgjrhdIB^PzhP<zPakjRsILNbTW@l zE#r`PH=JvD@QHe1JFBhU?cR5O%(Jh&JF7NX;>?|Z=MUN!^eEM8mL8k`DsJL2;dc+G zE?L+dHmBv#DfSIXTQf}!uOD7f_HpkXj!oHGPhL-+_ojQE^K+BjiwY)J6W7f+(Wdo! zo#X+|u=W!#!}t9<k)2TA7i09pRI6W}iM`)BH*OQx;vJexn3&~X**GkmGApc@H}S~N zO>Y-1Q*Bnid2Lyt{GOPgc)f?NuJblD9*Pq=opQ%S`f+|kXY3TGh@8xMovxFgNjA=( zCC<1dyehnSx$7c^w$1xbc2&t=7e5{KaHX^UsnDO7X8!nm*Zc7j;dh7s%$l&?;C|1A za9O_RWfsN{R1QZTnRDY8$6mK$o;Qq-rbRAa`-5lJrOzeI*PndRX7%l{*WTOb*S~+( z4&nOM?bqi#SR2>8Kyz($vv1BJ=Ut!UCY<}|lx21*qMY};OY8PqKNUsKWTwu%GoOEw zUDM26Wtj@|H+F9GbDt1%_nm3Qs(mwR*CuVs{uc2(*L~rWq7-j`y{9IJKU`nf8KL^j ziPQL!)}2e=oa=TRd3I%O?_-bnq5zdWKTd61m!SM)x6CIq16SQO7iRO`{dV=_z4Dao zq_pKX|7!0$vf=01)2U_eA8V}SNLtsrGcEj(NU`o3uIeBbzqZI5B9;|@B=fFa_~RmZ z{m<rEwyj6nm$Y|o65RUy=$f}qO$RI2e>whfx!4i&+Ml1--;16w<KELbyf<_|x~Nno z2??#<z3T9GX`vOy8l`cYw$I&bZ^iR5ar+yt_md?X($_R8eaa3?EKzgIbQO>YW=VdO z7}S0J(YDefRq>P9<KDIWYz!5Qk@XIZi{-FAs?Z~M{&VK3O=`D4@BF&MuQFO_gVHv) z(l4iOCrpU1`{erXSK8-vwwu>(X8oQU-+JR3-?9G_4v0(qH1}%CuYM+}dRsCt@omf_ zu_I>HZxWcJr7W^*tYwPV%=vm}!LLS@IlOM$q_hqjO71Q4Hb@uSaQUK2e&%z@QWejc zxt-hYhx$F<@csVI**){V9NV$(*?E?eWkFeqs@eZ0FVMfrU88HGd9&_#_*S!<t&imn zPvc`{e>QuG&4%VxHoJ9?{^^#TTci3~FoDzmZO|W0HM=A8r{}Z_UA8v6bL!A+{v84} z!fcOY14_;vKNWU*NyGf?Lt;<v8P&N>JpA5q!TUqo?icpIoxtX`*;LItkgdG?;%~t< zoEw@_w10ILRVlAlTzpz^;=9MkI1LW2(4Q6__#tJD>hTrd>*xR8oMpc1s#sNMrM-DZ z`jmT<bQwir{vPc8DtGKaiYPC0IOjI5WT`yX9$i7NyQd$7tXloUK>Y%L|Aw;<+dgXK z^eCj3pUiZ+UJ)&Rgypuhj`~l>g{LR{b=xGu?7Z{d=6A2uKE1fRc3ZcX>;0UqwTlv@ z?L4=Xh8)>g!n3WrsI9Q6)itf(-G2LlZ*SC%3UBL4?VcX7XHB|wR!)9-;p{EX?`$(x z(>!uFYnM+#cw@htl3t&^XuaGrsc!|>OnvW7J2suGeCouUCkCST+-u&y3AoVy=S;}+ zliP(a3WzZ8{_I!rElp4R!QJC!d%BkkZpeRckin_VvO@0J6A4rQI^K%b;@-td>EcU- zH%qL4Q$9gi`_ADT8|}m7*BxGFbI)Q&`OlN91?C@nIIXAP+KO8imu4NFoaob9c|L9O zqSu|APjB+hTE%$#MR#KM^)F}o#a^<0W{=Way{TFx`gWA+v0%Gt@_IoNr%FVm*>$d~ zn78YY)r*$3ljm(H6?`f6_RAkByPO}f$2x1ymU7(bTj2bon7zcqd9727v(B8A1wxF< z5quMWGp;t+cJQEEV$@%OV?TFF%$&S=L6W7N{_{136MPJ&@F&R3Pk+@sFPmxgm32?f z+Geg6%5o}gw+V7=;rMdrs*03$Tb{U@-`<#$(;H%rJA^wuWUF`@ckXfA$-aW{rdnr% z&$~|VJ~LH7o3B{4r7Lh<3*(}jQw7x8b_yvSQ3z)$yf<;ujC*kt?SAii9Jy7eNbGTm z?Bjm#^fOyG^c_=OQ@voREZ<2>u}Q^yLU-`~Ivkj9)~C4FE$6`p#pj0d+gpnq*B+f} zaQ&xhc9zxFldQkzEBcD}mR`wLFsZcPd-z&p`s<R=a>0-3F-HPi)+(*Jx2JyQ6v6sy z$+wl4zYnsGI(JVs{aw@aBjO$GpPnvtwG*u<e!IKIE`HMH+cq<+Q*P_YuAG?MQf~0_ zt-6<!`;MfdbYJdia{37iC0|@`Uoh|7j2An0_Bu~F+`Oo1mCQz+bYH_MMK?di%CEg& z?UZaWS9{@;35inoulmXwNjy%dnz60m<DnCK4Booz>A${0_UH`fQpY)}Yrd?xS7i2h z$=gk*-BXsRuHkezn>T%a%l<cBmsXsKzGct+b!X_hd#cvuvd30Vui;^Qa%$23w~qtY zdqk&w__<&!e|Es!ovYcSQpD}9?BTiReK6<o0~P1RHte^4?Ou@Z&qn&cn`oLzzu}TE zn`+dhf2iy#6p?&*`$co|T3yZP$<aX*gJ0;JO@1rb#`tNu!Tg`)q6U*wrhGq>zBK95 zskKFyUMcVX(H435R|oU%>5@02qMMsMwI7?X?D2VGb>x+{+gnY;Gq$rk9Pdud*?)-f zjn4AN?^YGM^n80OcQnB=HRij}<gV|53^rUB_D1H;`>}beuc^geIo1~!a>Ejp{?ECv zLFm=j*=rA}B)n9AYg-|uGuP1b+}9Abovc2a`V+rc{Q3LbFEvNxsSMxMKY!9a>p5OO zJpOaNc-{Rg$C3}%PONDUi?sb);nd%fy(g|*tC(k=w1Uo?1ph}7GsV`M6fLYi9&+!} z&o9Z_JYQ||I({?Z$+eQn$34^i*6xbm`e}KW*qXbuvd(us<N3Kyqq5W0?^#+;Z;ty^ z&A*b%HEd$O6)Fclab{?X63MuC?V!c~8|PDx%ElDUp5MRswqj~x?8;l;ueIDc(|6=< z%(dp+X2}=*>}#D=);(KLJmX8et?RmXQ~DLxE!=hY?~I8ZftNfhTaAKjw0mBet+{>e z;kK=__oy>Gwumggvz_H&%Ms82!orGQ^ws`)xBNT0C}qQLNA`KYgRE}udh5E#`EcbX zrI1DHr;Y00>ooC($UKXYIb(6$^i1<+89s*`gL?wkKXA;kvN(U}=J7duehI4VdY%&V z!2VNDQ{lOJhkN%l%&gEn6mAjs{#pp%>J^rJ*DlSHdaJ$smX=-IV!fkUA|1Kg|7q-1 z&tLg?hUKaPt<`fj{W=kMcgqx!o%`DSOD;^V_KWTePH2lg+?$jg-2L9n!stPr|C_mI z1Pcmp{5)=YB-yo1bYmOSYJ;6?rTn)ZsIg(?{2030;Av^Z=8CKaebXA(Rd3C%Pv5ZL zp{lHK!!IqKoy&hdyY^ScU3u1yK$qRFw`A0F&90d&mX7WA5xagYLrLo9<Uqf^jIHkb zdwe@=Pwlnr>fkKe<atl#=nb!?Y%#(2ck(<XUYV$!{rvB0sqM72hpwwz@_ODgyKcL2 z(e={vDj)4*z6&gm+~i(;_)cd}=t;I|lXj)=Wl;IX6*hlERd<<0l%my-m1*L;^myCO zo4I{F<Pz}Rja%@&#iwAC^i4<WcbWY-@sB}Y{Sdd^71izU6_=koly=|F*>CP)`LvTO zJslb9%;S^ti=SLE`5zs$u)0{PkWGBst;>3nT&d3#Z@zu=Ugz`1(6Vnf_2+*~E7cWr zKe%GvzgOAMit`uFv8j=otaD3gW2#)D=rXP6XC~jA+&#Pbn*5*1_A)t%cecE5{<7_Z z+@8ssxA)Dfo3r;Q?}a0of6bdFK4XZNvlrX<x9+keZ`S?$rORfTvfclze0cAN{cGzi zB%?Hb*~Lr|33sT`i+-L``-AJ)(|Gnr702ftoTc9OH&!eE@b`^}!t@lh`#qbOc0W6| z_wnqg8=qp<m*j59z9ypXd&u*4;u`f!?eqTf-kEmd{<nuOy5dz{yLWBuJ2zo<&%EZE zDfa7fc23>-m*q<+kG}((+5bnjZ%#aadYIwI<5HKKEAt;$@5~LTj%-eD_`TN2W=Uga zw4qSEi8k9^tI}grr)e4A6c%0ec~A7mC)2ua+1xn%?%vb;m&-SViyT}mn`L_Xw!^Zh z8@5q5KB_ZL3I5z{D)IT+d5axygg&e^+dFaj<(NCWRo?&GxG8z5LGK*4n|2a1O}$4H zA8byR5<9Hf7Tme_nXu1`nQ`*2O4V|6)r}>;XY1&`6q7x7Hs-hRQ=X`Qiqm)_6s?t) z$4}9{bncJBx%*3IDSZpbd3_*A%Qm*Dd2)H`KC_CxshiFH7dL!9T>D0S@98+b!Y*x& zxE$xxLI<v2xwR}y;!f7IT=Bc@Ki+Qccl-2q<(ntVUgS>SwOOZVTT<S?M?bc|$XvOz z`nkGJf_0zW3=8wxy=qHe+3(<KpHg+U>F+hwIhiYTR~&kI<H1acGe<tn+JE5DoDxT` z`zklJ6gThu!EjP%O3u>o+<pm3ZLj+&6SBn%U+3zyxCZsbiOgT3k;(nO?bg!kiEJ(R z-72nb>$EyNL))VF_sZ}Yw^Zzpp49y8?UFuo&d!xTceUQ%@ZjH>nDpCwuGB2>T&H(- zf-T2ZhHksE%-rfVhkE1_SO3gXIi09)RMT;y-&JF!t&7dpNR7im$=?G+uKo#`y!@74 zZDjcG;Ad+EY|jbrx%Yy_zjWI1pN(@OPyJdf`Rzn5zh>jE=~5qeJ`;0X-Cq55@fFkm zfy(&}H@!AKkv;#hDlhqbP|=#0-z@bK&kJwa&Q_}Ubx!B}vKh6%{g%vlk##lgM9<5w zX8U$Vyb)R0JZbZtiP2Gk5ziv#U%nmf$p83vSQz6M_b-jw2HN2~Nt^%cT-*97V=04I zaDuP*Ox1ixPJfk|9a}WKqC|9cy8@$Qc9r+--Zi0PqSt!SU8~vL!X;wAhXpUqd-qJp zf7#s5fScb}PjZ~5=6FMQ!HuxWoYhge*?%@Q=T1F1?dYf6t!smHEk71yM_8C1kZOKg zcUJAl+#9WDb8aMwzH7>;z5ec(;hzfoyOD?bzb`KFWh_)TUAl%VZ1s&bCWrhM*|H^{ ziuo;epD*mx&8eT(a|hOT_8(3EDNu9f#j1Ngb1pxPnsDa$B$kuU3c{^VJd1d_MP^aY ze}R|DmGds%&3ffmu3`6i*B*K8yYEiUd6}oRbIGje?b?^*ZhcD*v;C^dHbvvBDwjy< z^Td9)caM%#ALw`!mMB&xyjkJS*|yg9$O(yQrZ$|<S)Z+`$y8tXoBgv`nfcLUrW<P_ z^j;<NoOZ75NwQqge{pZu$;~pVx1a5r{Vq|lATpS%x<pjP<f!RRt~8_dB5rdNW@{Sm zv`cN$b=)MK`Yp|TWB5rq#m$x*_;nO!zr7}Zc){GWTsBW1n7lRcJ{~kJneol%*Y6zW ztoN^ZX{q$!vDuX>bxrS$i$W&sQqUFi3fuUxYAN%-gYhg0{XMdCH|7Kt)!m%c<at@$ zzc)52An;kq6H%X_Ql^tehSwFBJ?+|=a_3Les*fo-MYkSJY1(>p>4IgV&pTZ%-qkM< zSf|0y>Xh!euGzu1d&!h1&(<nG)#p`jd;aTZ*ng!kheO{ac9f)Ccr(|qMT+hDheMf8 zu5q4uuC8p4^#6)WZL9zDTsGy7eb5d)og@EGR=&K?^LLI{%=F7a^Jf+vewq7QzwK8~ z)a>v5f%Cnd8oJ3&{ygv3y9LMopUOC2-)Q>(eUs^abB|Bo+be&Izxy1&<NSa7!ucz8 z=6>(pd0A+`Y|1Kur85sKe==`L?d5%{Wx>gMvw!}O4SBHB^UbmqiRSV@^8yaP?~!q3 zx^9-c_vRz#J-X-E-@KmRAn{kd;n6<x74N=xZJ8>6^XJ{$z9Li0W}i-7zHy#(gV(Fn z<%>+@*8jM1e%ZYQ8&S@xDaww{Vt-!9D?3iDI5lY@gMV~Tx$n+{Z>}t}Kf1X&rl$F( z=F&eM?%uX#HJ^Chf~AU|^*-*Mn!$Ci;<`PzvQ_5CEAQt$xg}I{V_wXZ6T1~kzn}Oa z{f6o4wo_$t{ILbWAG_q9e7slaawnrsYfGig`<C5#EPL0!{<O#c^|K8bS34I!O24Dy zA9wm!f%5sSr%Mm-)M|LOeZTo+nT$2l)9ozZE?bs-Z^wI{2d-P~eWFa>rm1<|dzat% z+tzCS<GTF!(%-q??hjy|E8FmUt@Me){S(dGe%tPt7jXE3OqkDoaqg!_*o+;TOI~zn z@ii-#w|(ykQ+T#u)tqzo8hjTnYyU_;dR{vEWWo=v_ze>$HZAyA`RRI++Ly4W6Bd3* zu@rk6_JS##;o-uzZ>cjbms@)75B=SCNSND$Q9*cr|DuOiJ_RNEA1R5qpHsyfIR7}C z!kn)w`a11Wit|H`H|*v9c~bc3$;l0`^LQEZBt%)FdiZyWuzz7Ye%+5H&AG9FVe`R< z+q4<)R9w(%soPL&@%rNlnb_7J2SwLSQf`*I|6zMB{}-OmuN&uGyk}a%b1SHS-o<-g zOKhv$s;^%#e(@sih2&;^$*amWihUx_HSg=|L^)nJJQfhMD{SMh?1;6Ea;&U}{@&Vd zvBW6L;~B$)ncw_$_c~78w_)O5$17648@{jw%>H)n(O>CnX^gYfxH4vCEXYi1Sk}op ztF3e`>x(%aC2tpOTN##Uu*<A#@i*la_O;DR%^7a9KiKl+m`b)swbV`N{xy!5TRm8_ zbKW$kC2YA-m*M8t{knPDeT&wJ%KGna0&c87)<-r6*Y#D}FG-4ORuUBmN!YZ2)m<xC za{`-8qDRX8*xm|eol^lXwc{o%{a>Lr?b)lkQ%2(K$38cnFN|b;{p;96E%V1ywbO<9 z=NF0m-O0Qn-Y(nN__X%^`CoK;!mjY^Ub-YLv3hF#1@kHPT0xDIzM00fxoAb4-FHdm zXhwbTdP%8Ymf^ELhxWcc#JHwZZtEtAU+4ddP4lX?H|^?ulbi3jxVP_3Znop%yHYoA zpKEfH7Jj*Xqku<u@)q%(OPRv7Cx>?UxxKt^@I|&thx_gY|J`@RRyzD;&itV#Aai?i zF3**VPD!E>8{D`rA2T@?nRC9-Fko)dg4ScdvcIZw#io2wPYC$m-uJF|$#pGZvt8<4 zasJ%$ccpFKb&KDYu6WlizWRpzi`9Zk5wqsM$oQyHBJ$WN;I74THmL(lkt^&4GUQjD z$x>Ln^y0pmQ)ga$cDXL?LI$hc&F4H#y1BQ^m8FkloMz656WOJCV*Y^yv5ZvvPX4sD z9~11iXt+h+<<I5VwU_^v`F{=VEsaMxlXxW$g)Is&6FPKrm2tzJMyKg4$$w_tG!pb= zn|LtCQ^ILYibnGP!zT)inl}ELm?E;Xb>r8IPr{7aHh$Rn#H`5r@y^F5WmA|Qub+G( z#i+H@@MDV9Ouw`V)+c?6#AhC5nZYvY#IX-|Q}lMWt4vIp<P_v7wNcP|ru(zWtWV-T zF&|66d{SxCjFbtgDVmXP(<b{&at)g>^@&}PePx4<$EK57lMesL(u;KdbmFc?NePFV z1EZ!&wxqC*8vn%7o`-AImoDj<GP%98IYeNhg{SJx0}{8~Hg(z@nh|b#(??EOFUWbD zfcZ_YtdnM+ELJKD-SkU2R%P>q^V5Ba**87ssr)|{aVj{){HJ2Fy#M6%6Pt5_-m0FT zEG`jU(fOzRlhN!CzfWjCanC8*?^Wkicj`&k{E71?$4~hCr1X>br}s-H{^^oYU_Yr? zG-FSj)BclOwJkEL`4i$N-=C1Yq|;>b<0Y-WNB%qdO$al4={NE66J4`|b>8<B-)}nk zMb6UuUb^t}?@yRNDbD7WpV)u0(k$|ygWd%DN!?F^KS}<aoOR;y`6u=#{;Nzsk^0H< z<0S1T`cLXN>baeNHc{Wh`lt5KNq>4vCj3_kKN-Gc^7l8UMRRL>cb)jJR<C|nN6?Ek zYk`}TOLHd2Urnyqb1ve-yh{^B)=K*+zhJPMFl%M2+a<>mgWg5XE2i=-y;ve4>*sz! z!fI0AqU{$VtY+QwI)1^zYT7-w{N;~dR8+Cgbx^<LSz<KTY5AoJt6sn5#xLfUsO{}O zw`g-Flkbw^7k5kaYUgeJe)@^rESJfdT)s;)ueiM}G0*-Se$vKjzTSfGm*g+Bn#|Q( z)Sbx|>oomRYKi69CEFKVFkIM@a#6HIb#MPYfB6OcmvVM>J-cw#Wcs>=l_vAWE;#L) zCU!CDmq4t$_lv41uhSWpwKJ?TSVdP(4!gv=r7LgAY>RZq)AwRlf4jSE@9ay5W*zBr zdTeB~#n&dEeJN|+zJLF+>aX)}{`;A?HCD%U;ZcK6|1Ivn_?hjzF!}KQ+}RmEEAsC- z*W79U^2ol$=1_0!mnV)b#fpy}JJ<fdw%|hkcMX#@1}FEK_m=*ww>BwOyL0u%&F^1> zckupnt9$IYaP^I6&t^;TU-T6&ZCu(Fs*rl9fN`?Flv@0YWxUaw_OZ)d*_|Y-VRBt^ z@5}jzE_`^Bp4D>ZkzH4J=Gor81!BvOyz0Jq@PC@x@ALd}k58%B@SmHw+;!*D9eFF7 zv}f`^Y<a}BEm$x5@RN^99Z!|6dj~!e37INx;nHg$Q++kj%Bi)O_uDP4odOK3tBb;v zHsut_{<LIWTABJY=di5kGi$k^%U=SOYNo^-k5XS#^z_L=ub`tYC)ROGzn*eez`p3B z(#mw^T7fCfO%wNWYAh*>5V_31bIXFRrCDDC=Po_E!z|?NTO+pvl4eZ%`llW~abtOB z)Q$fh-|7W^+ef_o_W11Cjr;C5Ot?^RUF=)&P7YBPGiH{3Sr6u4JaCUydA4j|ZO_h( zukW)Bu5aev{_E{VuEV$IZRS#L@aSuN+dffUs{LzV^is~tQsS>}c`kk#UFdQ@WU1ia z<7P2iyK4f@Z_-M+UCvtFuvy}*L+_cUD7E$%Cx0()X|OKNTHob(H}a`aZ+_I$IK!We z;aAIN@jaZwQ|>jdR4QgUPx$PW89n=7$(~s><Edk(q}#=kj2<Btiz)h|35T>^tY*6Q zVd0d!s(Y2wpPVk;p&fAQ4U6B4yhq1_T0eOoYqXtQer@BNyJs_lycf!B^|Z>gtN2#u zkbQGonaTFRs|t~=(aTMaO-QWq`>6J4YfIPc7Z2L~#F-vU2z#n?Sw6z@K@HE_kHvEz z73WT_aDRLC)a@l<_D<1OmcQ5YH6OpHYi<4HmEOvkWskfj3SYSR_Cm@0(gT)e3e#S_ zy7lnpOQWKcDN}AfUB9Jk!$G5`o_^i$*_QkWdQ>YYx^u^e<(EP<&hJ>g;o1A!8BY^F zALLKDy>!-j`RfYumao1lC0iIQT`SQW#P#H(|C&P)-hY`JHCkuPv0J8iPMon{UAd@= zUtiu(AWZCB{#Vvbx*_M@n8@2)+-t&B^|GOAd#0FC&RegOhiyN+3z&NNcIRb{xu4sX zoSXf;)@^gDg8Iy3NzTV_J!)0^+^BZ1C1~@Px|;1%0)me+N<7keo7i<mFs-{oepOM5 z*2RZkk1)QAbTRRi_g3G%Hb{Ga->b%HQ>%{)$2b&4A9mStJ!*A9b@a|qiQ~SnAD-I$ zF;{5byo6kdB?$^8=}&SDdf&_23M9xr&#Q~xz~EcI(zWWnz(w9q8A~6mw9AO;kkOs{ zE>7(A?nAGgUmgmSF#kMzm*t-BPrFye-9P;AQQXQ|vTqzWwkz&Uw@dIWitjJ%`;x-3 z*?+ct`;x#DHnZ)GH`;red^saGZQJi(9?xC;+XNL)Su88Hb6wycx#LB^G><j|*)!TK z3l4FtHdvU;5tXcROZBLhPtDs0?K{L)TtBJzzh<HJpQEupwRIj5x0@IIp7CM6!k6!k z4^vMG%I>w(GWqu5yL`vut5ZLxi%OgppS+tzcT15-+lOq&mU`VQn-f<}HI>NLcYg8m zg7KPzS?lUqmsG4s=Uz8GRc_wYEzhjhXoR_+uggB1B6sV_O(&<_yI*>i2Xk^C`m@$_ zzVexH`Puvmjx#RYJgV{0ca@-+0o%(aev@+7pO;%-9hv{UpjvbHW$O#Ix+RC_ls-TF zB6@53(G5#nqG#W<owew;PtY&boxdh=7aN>+@VHz3zTEqIpW?G0{CDTiTKf83HuGHd zNWMS&P6ofrPCUo@&*h&_N#_?)^EF8>zNOQ%zsm*HX2q7KOVpOfR)x<9xvROfypn&{ zdRGhQ$c>e^9N%R>JlCrA>HPeo)9N-`h-65yvAy|o_mRd4-IFg@&p%=JWujzuQ`m_Q zrB`Lw<OG$rZx{U*<8nCsrYu{!``fE$nXlcnIvjCZH|fpQ->mL;uf?tHn{v+f?^V;4 zsdLwApE)<pWc~J^{$ep-)cGDn@V2(LZ!6F!_z?blFVo{=&qG!ld#6s${-*If!Se8l z8qvSMp80X_|F7wMSZCGrb()U4XZEvsUu!<#V8<sQBh0ysCp_BW^1S=&brWCR+*P#I zKXB$|C2?_;$1A4oOFVMpLh7UQn|>}@>b|bIU+RbLwPSY9#n$FJUHi6hrA+8OFkRrI zfJKkG@}bQYtCriGn><-<_kpZCYdtsLJ{w(7u;Si~r*?T$R=l&k`J}#bUSZT79WzO_ z`O8dvjt3jf6MJ}Rc~!&IZwGE3pTn}jtD$g7%3`~n9Cy1NcdymI`r@7h<7r!d_nOj! z*$MR`r)}R>owi*yao&Vk`-`P*zk9`>3RxH&!<rYQZ)Nh(mDOs~nw#D&zl09P@toS+ zXuE38tkipdIxa4X+xTsMLmS&-q2`Bon9}vEe#Kd=eqh6r&OB#rLD_-CPY;%Sy`$so z&_6l;+H6l2p9KbyHuL*?Hp{5I;tqcmGv8Uukatba;R|yz0s}Il^yOT?S3Yw;VO_yL z?f8!Vbd`7R_j5O_-n)KF`ewoDvfsXV7=HU?=&62H`^MB;%UwL4*Ua2lGv&{z#Z&%V znbWrN<OdO#c&_>H=K3XUOpH1_H!RVr?U2a=on?nBPMA38E;C<qG?;VVyp3GO4I*<5 zpFX%PbK=5eYaY{rjKu!5n^|uTe!i;qm$l~i{3!Y6JLj*jb99u^y?9)Fz2U)qTUUL5 zzDV|<ZMfvy=F|BP|0|z)A{J5Osri1h=HhCTry{Yzd4)d>PyeZ1UDQ4M(k`L)pQ}8t zZMJ=!_wB#yxBYQ{|EGVG*Y=-NWgh!YeXUs?`^+zPvtM2c(fq7*#vpZ@r*&C@%LDaG zht)Jc3(XeOXS!F-Ud2+eqOJ7|<DTi;o*vR{2<Az*ozp%uxaVbz*r8Pu|90N|YZ||S zZTI?qgZzV*9lw9+K3m&ge8I42Rzi06JCQqcSD%%e;W;(_{=wdNlA<5oq@H>%efN6t zoXJbX=H1e^F?B9pe(`RmS$?bS?ze3g#_O_={w}?-;@dyDNdX>NuTu5T=P$YZB+oEz z-+{B8F-Lc8d8^~j8CT~W-s7#Glz-v)wz)YEuTPwP;0<eo%+yJ>3a-1?yIZg?{Z!=p z^y#d)h|hcr|4jS&;kx4box&ZJuhSyV6-u1l$`<EXvf*H2kvdCv;=5ORS@%Afi#X4C z|BlDV{vTh#`@*do6<@S;cQH<Ll=^i(`_pZK*Ei+~8M+s+g!9cx{=zrgd9L%e+g7id z^rJ;?Jl3A@_*i7Cbz!MV>)V5pyjN!=<cN07=NBtF#UdtIW9iYUz*;>ibfMALPh}C^ zo3@^A|GuJZVNPtD@5N5dz^Mm|xP(9N-gbM}71jNEEE(rdJ)Y&Ob;|qMwphbYmu5!3 zWZQgcX64I0%n^P%!TAE`FV-liF0$U+J@12DYSOQu?xNuQE2-?l+wL4s*89)-z3H}9 zv*?@*n+Lw#k*;ou{CB@EWS<#pADEwbsa(9!-dr$!k*bz+sCHR-vVV+VmR-h{LT8DO zH(Iaky?=PgJWb6nTfTF@?9n>qswuomZ+Ea?r=`@|oT^9Xf4!NqvA6$<-qF=NLayab z2tKn_Lb)|(_2##wx;*@W<$KOuTiWvA#QkR7Qg5FezD?|(8#m9>%KCTo>$7er?u6T7 zs||#w<*Ow**NAVZ+#L1#_zT`$Uy~<n?mg@qx-!z(O*D4@68qD07}M;2Z}q<U+V6#n z&m6-<0kxiazjX{ItT1bN%k}zs(#u`jvOa(R{p9S%PqovW%1hZROIm(1<jsEL_dXyz z@iXH!BVD&!ul6oDnsr?)yE5|n-aB)ATb}RJxO!Xqk^h|2Z4Y(o&kJ>T<?UI-SsG+) z);0M?T~R8}hToC`F-i@;x;JuhMqCh<o)*<=x#QmVya=t?+|5(Jn^fFjGm^>p^e-o* zOCsw1rd!===Y?1cPizX;=MQ!3`Y&|ucW8FqofmA<{x|L&TM;g+-6OUAe7N4^=@P*< zH{YI}&$(;$+V^%|qL+Dm+I(Y@?ilc0vt873YqOu@uZVy4Z}wK#gk0TezAyc}iey4U zn?M_b;3Aft$xSO-80W-%6PR#7MNwdafT9Z9Q=!R{EGiQ$ST^765zYS^w07IZ<J;y< zyBy@WWmZEw!zD9?s~jstE>A15Sbp)@1CEuStM_HUwcXAl^84S%fA`MMJfFTka{AtD zansY+eziGYb?vi`=Y_rc;^haWvI?I!HC)j>f8q4|>RCMd!g@S(a@;>#A7yxExZ|Uz zNAKQ?Ok9?dAGXe@dVFHtk9k^N@kd*K>i)fvRpFz|IP1*q_#<86nFiGdo=mgP|2J9V zd0a@5PF2zG3~B$o^1p%CGgQAXnsfW*L@QpMy}>UZPbmKT)%~tvh{M%*$-H^JqQ^|V zPk!}3@pjs8BjZzlMXH<PUY(oxb>GXb%S)EL;*7C+-gd+MUErsU3M?f**|xuMzP9-O zVbP~^!wi{c99uK<x1WoGWT<NByHeH53SNdjv(;?HW=(4UWe}=6@$!p{c2a3fu|9LQ z{EhtJdhF@riTPiz7IX-xcX>u!YzzLB8qb^kuv6R1`}C^S-lujjwoYRI?W#6?{d%V| z-AXG9mH(T+_hnBh=)H3&S>iIMnva51;Jz<qvaxj>d*Ag1@A$^Vw_0t5zQCTHb^49r zsv-+k&DePC`HoP{FV3~;>C42DmpVSVW1O~Y);7_T>pz~iYX0`d+a!0XnwfOeYdz=7 zt=4*Lr=GpF>$Ek;1M?%rZZo<>a@n<Y1RJamYo#@v@i@M2`qdxBt1W&pJbRQmdDofi z^9$z&E;J38aA1e)OE3AXmOG1{sJ4Fm&E@#sDb;D7Uv@+5Gr{#$;*Iwc?^&O@VyX4& zW=hKCxxy0drBd#pTSfOg5!fzyZmVRy7sD+vv)=b@KYyA{b$=#)r=0gt%$&ZqHEz4* z*bn@hG3}@N#&vd=<X1UK$nR1ttG?WJL$WG-j(+d1^X4ic6DsAmC(nO#c3bzR!%t%K zru;pnH2GU3&!+hE->)m&7us8wv|RP;nQxP&e_e~awp&NmwC7^lotaBsuSmMSTHQj| zEZwQ}%(+D_@hgKegXXy1W#6=W^_@Szraap(ky>v4b5+UTJ9lT!d{#UClD+?tIns@D zPq`KA$yq#F%gnMcOKtD=$m@T?7soW~%y!**%>Ti~^~d%X@2Zqv$oT8a`c>?wrc19o zF?CvDyh)DFl)0Q+cGTx;zgbna+|gLy=k9tP-%nP(S%(wv$8NnWbMDr&Rl-6u>@N8~ ziD|Oxo^*Sih|0<siKRc79v<Aac%HLcf4s^26Aw=*EcANZ^v2{)pPRv1dzX7l|D;Yg zm03L__E}IMuYJ__<%|n;xqi>yxzB^={_ClSxLdZJQo8>x-C(ZLTu0wcI)^3J)y}Y* z_gY?2Kc_Q%rrDZBw|072{ad$c{cr8&nPrD^?mEo>ysz)ihvgzamq}cDbR%xA#FFWi zKP8_QHT|1D!>P(4Qfb{zf7U0t2i1Nwg`VkSyij}I=SJeR_r|8>$5moi_-tmsX7BWN zGXKYErUj)l=VdOsE#swn;LBHj?jV1Ux_OC)!Oe%ngw`+Q&-!g-w$15(^LeLEw|x`8 z8LY~ml(9Yi=ea<Ui|bxYRg^9=NV|Q#aGBJCU%F=&SiHHX*|5jQqVmeN?cblpJXKkD zJ$Og<oCBQA7xm3<ZL?-8lJ%NfYWg-|gYA#&a*sQ=2Cv-t!A$yJuG<>reX3u6`G5HJ zPj0>Zi>F^dnw;sDzjO8RUH9sJ(b1C~uCz=099^8Le)-%2b@tB>|8bg}yr{5zyZ?qR zA(5!1&W%0H+G$n4`Bq!}RtP(@KWKBw+Nax&WYzARG-Kk-m%q86p8sSr^UUvillfov zxrH9CwO)3zI#XSAx2J2)f+Asgzen<FSEAngK5)oAbxLcxZ&KU);I{d9Pnj$!Y5P+C zal)zt-n%Xwdi&<a&!#N%whud+-E^y@k5!A@N??BU=#Y=<5sRm7weJtEsnA!qw_JAO ztjViCFP?kIO?g@{B_;WDS&Hzp&C7aT{8{;TE6cI(e5yKc*BdgNT4>vObm4{mU&enI zSR_20aQI^5S>{EHZ$7-M&AcT@sXub>gvq7}IrC&B-mu;?j<~VR@h#8A^y5zt>FvC6 zUr9D`_sKM6#-<hRpUh-7-gx^|cWbSrTFAX5^%Uj3SKofFS!?{Bp+81b#pmyicifgI zjHWDA_HkE>-q*)cI$1V+`g&!P^!RR%<jp%LFSj{&ZNuZP57Gus-WzurluG$e5<Xxx zQ_$bkX8YQGna=UEj;=e!XCBY>lDW+CGDm8U;8l%fDQzFNdA#*Wu8-TacE{&~ozJcx z^@-lN-^%m)lI8EO3e5f4<C(JAG5&Jgx;v42`6|1%#Gd)|*HL%l;>gftDzg68i_6re zrhc>0{gQEx^`4B*(&mekq&FIbC1)zi6h(<`ShoMT`_o5}eH(0_?6^BE^Ui{F-CZx{ zYE|)m+*H!{AnLlx?(;#txvlA|FK0|$?YD0A&I24571s#%vq~5G<+?OzDbE!)ep`0m z(A8?TtL}>kL58Dsd-4_wMw%a4XqxlTw$5{fY5w_ZUo$RfUU|oxld(~vfBH#FuFw2? zJ$X2$FX(;YDzS6De1Gyv<86<EZ#BsWW=ZE4`?z$~1h7SRw{+)R+qThAYx>+}Tb6B^ zY<4of*7(KbT#Gkz;_`~ice87?=I)yO%c<&RVo8JkF~8I2<u}(@Pnq?2o>=f-Ri^3d zOV=Hg^-qXrj@Z1lUw0C-)5DrI9L^UGm_+?4l&G)%ogHSF&MIYM-<ZxJUw{AYwwV3Z z3cftT%iPy?o)y0TplD|!ugkl_{Kj+B+83TNPP_TGH2g+{ulDyG6V7%2?F8<mrLLUn zwd!Agz~L!UQQq<<JL8Uc{gU+c>#LA`=q=%UfA5_OtiE^soNO|kzq~vCw}Y7}_~?tZ z^S_rWd<bEA9kHA7GxHm#cy*Sq?S)F8P2E)4JAIZVykl<^bMI2{S$M%^qU*9I_j`|K z9Q;?-@IGN@=cDAt;_VhZf6kxy@AK#Uq5nc3o}b-&<I#;nHAlsxW^|dbWZc{K=EgeK zCF{hNZQyBqp!ve+jPl~pInC0d!qU>5`SD9XsvXiWd^kVj&Uv=twTZ3b74|Q>_1XOW zBkO-3*|In;M@sAX1KSrZvkqLHef912RjKRzS>p4ORo8axKXhxyMOV9!w`aKog#QKP z+ZMTquE?)^vP0{0HN$t!D7nTtMm*6UW^J)y`uRAuMe1aDlw9TXmy0Ep-#9+*Xq$K2 zV%mxcWrrT9U(3GpN1#w6$N9EcWV4p+!AsZmSMgj<{>G!;HN|z^1`qzjp^hIuTWORp z*Z6sIRiD`k?#pXt?3iA8FY?%w5;2Ff(F<MQuQ{T=Z@-WDGTpPa*3p4`^VK_IBGYD^ z`~UD1pT?eVc5}Hj+hiG}Y)e#LW;~EO8*x5(gNRo~mfSUG^G9-<yUKHKSU+54lE>c_ zaYJV1F>xC!c8QH&^5m>MWrWhY8)Q$(nsBsyyFR}}wMyRYsD6R%%r*0B9!4Ho;c-iJ zVe>BUe^1VueF%N)nW;W=seo^%;ZIq%ou3_;-tIEIJE8n1`x%!XPa~z~s<dlg`tASA z;cZy=x!hHErSeyFt-Wh?V#7jx=MC0%UENCS^}DA3y?oKL#rOQ-lL30-7AM+Q-I~M_ z$nSd9xH0Cu|NYqqzSkepzA4Epes5-<?LYA=Dd+F=B+kFrJF!3|<5*Zk4DX||JzZJt z?$bAiZ&rTvY3tt0uOq}JPUtHvS25Zf6l>OA=zV7P#-3#_gwE`qq+$5roA%Mzd&_U8 z@B8%5LBI9s|E}oSFT-;E?r=W&wC-5+gOr1jZ0%zAS#uWdvYwc!f7SZB%NOl$Vek8n zFOn{5nJ#PAzCHfQEB~+kdqpxA9E$mGV|=ApWf4OGr;X|H$!Gijbo72JtaR5pc<|M= zl`j@ODt4Uv{Y~zM*H7yc!ma$Q3*K3tS9BKTSZv4eI%SKp_&(7OwfzBS_dmF^K-?uD zqJ7yhUey}!@<s0y_Ni+BShqgb_UH7wEtMsYtc5uyrrO@|oV_f_+LUju&gwt)X57cw zITlXRld9Rz%--7Yx$D!H$yb7Zu`SzBaQxnm2NeOIe?GB4EV}Mz(o^x^o0U%6(;rK{ zvb7cCId1!@Pp?Dyt%Kpc<$u}IER>i}iz%MxK2Ti1bnv9_E$eOKJf>XMPYdfzeqMK$ ztZ6NMsdu*ESRZ@Ki;Xp0hwS`x3U=20^jc6fwVZwOq^Oihrb{Ph{NK|N^G<Ms$CuCr zo17x^7WI9$a_V0E+wDGsRN(u|yloFw-FkYpWZ&BtCK*v8KTmGIW5cvK`+&>Yja`)) zMRqEugBlj~P5W-8ynK1uku~gD_qdDhYd=+}VT{?BBC(`mnx^aeqB2)Ev;XU>LsxG# zcTSbMZoAC2^4<XpE@`z>`~A6ZL@cP9aA%o~ZK!nZ`NYFH_vi23Ey=QS&IF$6QGBnj zH`;8Nty}y`y0l?lLYKWxYI(ZGhQF;oZa&YGuAXlVdJ-eicp`TWOL}9dPDV^;-tO~S zdPf$PEAs8-mMV`v>KfoTkI66Q)MSUB>^$vHf;@gS7z*8;>k?j7yt_e5&X1Mxz&CSO zgZI0mL%t<9n!i_`b5lMdMrHd2i}gG9Z_pN<9hKY4VRiM-w#%1l?84$wl<qq`+dSj` zxs9{p%a6^zzm5N*?B%Uy^SfK+?AkM%4l~`Y2`b;&6m0NpWB1cd&Mj5tE4|Onc`=)# zZ&|Gp!#j=OMeFXCzjf`bvVSl+pO^jKkw9JH|C>MTXZd&B#U*urRoeNjOU*lDqN^CE zrv^W{wnL%s%lel-@ij;Me=A-WICVASly1P>ynFw|rd_#V-ng3QaAc6xkv(b7^Z!Jx z-m&9jWYH|cfb2;uTifC?(_=rcHf&n(Zl-mqZjflQomW5eM|(Bz?@LWJkA`l0^m`RM z>k=&`qp3^T&O18q+>`TW@;>|bXBNo3uIN+0B6E6T^4zr*mPKolEz?$5ep6__p_Kd7 za$ZQWj%(lAZI70o*f{lR#L{OK;+9`>cPL5t-+rTUrTzx*fe!P}M)QJBM|2vQ-R=qx zi)Ox*Hs#|T{vA^|yDXnuufMYQblG2TFWJr9im_p@`i#$Cf9e&hEv!4y<<q=Jafi?C zGIQ(Cdm!Jnl%MhNiFUVhyxSht)MPlPrS1I0v+i2utPcx6y50Xdw^V*(O?SmUi&N?M zuWNPeio14Ap7)9bt6;~WcFv0zbDm0?xL9{^?6opA>f0O6Vts7dtEsD%*OjUBr2l%e zp6^|~>^f1=U2b+tno4~aRU<pR8IB75<zzgzztlaCK|gZZDMOX+oTE=)taQ!sDA*q$ zJ8AZX-~|cNDvN`jr?_95>2=rUS!GD)SF!Wo#omRyS<U2ZBKqTV>hXx3rYoe1S60nC zQ2BmV*puc{9EZ5Ocbjhgaawqa>$EM4yOMJfHa1S1=RMQyV(DZx(YDLo_DwNm$z1{) zgQjo@6!!|SR0TfYR<V7S$gM83CHoH5?_rti{X}V<?Upyii}`GO^)|3RtX#u1>t!pG z;;k=D8{1#DGHtE(`^o&a<*jr6M*EUkjjp=eZ_i$C-K<+@v~Ja5hS+3Q-{0{u(V@0& zua-?zJau-_6@!!Mw>Ev<dAGgP=>^ZkncR$mzo*62IG(d*y{zZ;%(m!Zoo|GATbxO8 zW<>Wt;a4-3ZlB>`VjA{XEhwbqa_6FDnO7zA=4V9n1O%@-Z`r!<hUepDhR)j`%7n9r zJ<!=wv@SG8=!#c;aJ6X-f1u10MWeFBkN^I9g!S+GyJPR3golS%pZ%I7q0lGZGHb_{ zWqp+*H?owj^ky#K9{A$GD$!I?ud{WB#QF~{^Lp_6?i^Mdp3qaaM^9Ycz9O$ky|h^% zBInE3X1=VKx<9)e?nP|noSz&%?VG$unZ+g!nUy+mee3x>zJEBjZG-v!Ph#eRYvdU; zKWn%s&08S$$4^=Jut&#SiEV2Qrl`N=)qkeGW`^3*0{e@B{KgsDdjxK-m3uoi?B~X7 z7FX*7>)uRxwtS=E$(dJ9EZdcqAXJ*q61aI^Pxt=XKE_wMf1gyl@uV7^T9kELbIM`Y z$x<%s*7NV(%5Hq7VRE}+Sm8_Gj6*-96N6YIwD!$-xTI-;fPL|*NgF3rF4L5Bb&UNn z(|Afx>Ouis)h{Pz^8K3c_TTbK<FoQlvd_xjSU%>vS8uRFXuj9dCp(|c^DSHEVSl*J zvEM?K`R3-SJt@D$e$Mf7<NE$|vs>&36V(+F&!UUe5=DIXA6xKeLc#I=?|cHk3Js^O zx^&7{_0VaBS9UuDqaC)T8}Io1|JaKk-CpxNS5|t<HkMD#<<xo}W_PBCgXi${57SzW z+A0?61?GLcvd8<VgRevFfjzR{wq~avJmdK0i^cYXhPS`}>`9rPcuZycy@$WKdu0BI z_sGOFOl)qvJv-*FXy*DVPv>dpnw+1%V&`&UmB@d%`$=wKWX9qhVP%Ud-yJhdIi+xe z`^%jrdffY5t`vM<z3_3olUKy_imY=<J()k2Znit!nA*c~L;BU`BVsGF6@uID=<X<Z zVI#trcUf`!=>tYWc4;B~IkvMW{m8azJS=LZrg+8h_{-DDd=H%JcARXzI_FdH;yRw0 zX0ipB8m}z*b~1uD&waO)K#h=A<h<=&=Elk|-tJepA1HCH(<o&(_u|Ui8dn>f^QOPh zwOMESX3`baU2j>k=k;Fcv%YuaCClo`N&Y;c*%o^byzN=n=k<s+%h&wpBg>d?i(8vM zTzOMudAM)c^(GbttCc_JoQPQe_E6hbufoaucJQt|uRQgm@hMyWo2=oxD&rgfa;%Uw zo+0QXeO6@kjy1O2c8jv6%ic7dI5(q6__9Di+1hn6n_p&movr8ediF;{;aS=4taG1K z?YMe3ed*b*a8=v(veI9Ll&Ga2B=f_zX<dC*t8q2@q?z}7=bQIVy$O%we6p?j+BV4= zuNy@|?zJJaFT01_@wGVeNv15Y<?PI$+Qmuot0lfXo!9HO*ShcDuU9dm9GvS!XKtAP zT~U}*%EdNtd%bthv44jnqjky-NN_w}7I8FbgXXmQRj2NyJzcj#XC}XM)ES%m??kpe z+2&FG<w2j<`l;*Uo_`bDKdUTcTAZ)-${e4Y^2>tfx>Za1>fAmiGM#hl;)lj>rW;SM z+$Pn^ds=hv9Imd#_bRV$zN)YzbK3rCI~A;x?d>}!*17IAniy1~<9dq6`(j{yU`$xW z9E}ZKE2>$xA1#v#o9GsGbYn&&=NrEMM%EXGZ~G5+UF+A#D>~wL@Z^=ZJ2czg%1_sO zR%q?{GnIc`+n1k)4nNOaY;us`&aF!*`uT6RvUa~=UgAZqL-W2g)=Un%e&pTz9gjk9 zO^mJ1;^vxlIOv#?Q`3{fPj$<dFF4E?+!uH<M)kPR)W;8g^f0NlT%YN%W%hN;(6}Sl zuZg(}{*OMfb=ho|=~E{xu29Wh^F|}6_*QVrai=a*&B$q0Js(_FSMYyXxctG9OjpC* zdxX|*(I{mxR=G60Y4LM67QtH!^p?zbJ!Ys<ZvW`e^~(AWOD6;^doxk6aLoqG#ilc# z7UYISFHXL>yL7Rs&HT*0*W&6VE=rq-CAmyWXqSArzn3jqJ@Ta21X)epzRsp&pN`)T z`Dfny|LlYMo+cf(;?j#rOD{##cb0KlD{jwza+qhWZe(3Xn)F)Ds~dm6XMbc>e6~z( z!4Bu&tx<JCCk=D&d=HlB`uHrwHhBqCV{o|T=hs3!$rjB?4L#G?{a1<Is+<>ao+WG^ z=coDC)~_wueab6rUEIP<$!?ou(OZmb&fn*;^KXjNov_ikY>C1NrBJ&7A#eW)<x5`8 zjJV*aoU_TH!#y%7U|zb(d*KLc+x#TStD(Ig{z>Hs{Y>ykX`B|D-xOCVb4ToHV!^Se zRxhpu%B9)7*p>1lvM0+&bE4|3h(+^fI&ST72<42Jye3KW&Gt1+hnH+gzRr<Yai!<X zDh=(u_c=9|Ui%-n+kI8<&#ur}iE@cjRf_36c1*^TeeBvkn1+VMY(BAiR>*hrJ<D$h zXKjDRski&*T$#X|8B_XA=U;!lZxXk4qU@$+(eXEK%4|4sne+AW|7nN689!6!pBZmI zSyjCJt<JkFiC1@LY1Dr>rTvs~_lY+l?j4r03DTt>e#hL%RIuKBFz~SGR(n(FeW@=R zj5_{LH#hqDpW{N><cG^<H@81~sF29*wqEP-Th~&hJGGnDPOf(i51SggZiSY1rmNTg zpfB3*cfXqS$MDwFhIz8lMsC8lUQe7BcFCmergoQ?&QjO1y}MUEneVZ8OZls-_jhC+ zJjB5B{D05Ilr0wd?k7E0+@0Zmqbw@8(&0GA9rLYqVV!If4mqE;eR(L%d*>#X5F?*w z<(J+mHSPM8eM)J2(W;0%zwA|apNQNE`+4FaPkO)wUA>ByLlK@V%3HQ~?OIzrRjK*s zTrW2D<%+jgUawvIJ7eGS!x8UhF1tM|q3-yi9Fv!R``RDM^iR~;-u2zgE<sfLUz_Y# z_bvNg=m~S(o6D(Ty_RP)Zz+GsC*Ex~&Aa{I>dd_zAa_D=rNJt5(Xe$QomVuj-2S=s zm`Ti&oBZ$AJvg<-erIaf-KPv3`)=>tc;VH)XSJNIO!k5{n)MB`m!6q~@(0dyoL6-F z%EEUMc>=b^%7?G-lUJ|2b3#e2mS@LWpA!??`xA7vTE7b4vNd*pE32xKyx>ao{6DiE zo$}rCWj)jD>9Mm!&%NIjC~@)j8{LBSDTOAD(uS)(A8)M}aI00A8OAWp!@Pp=&$A6r z_)o<|9N4#Gh3x9>4Kcg7v}VLz6{|k(RTg$BYPVs0f$fS5?|$jrmTKRe{BpsTMDYxp zv_hlPp4A&2MNB<~c6&~JyWoXLV8*_jiNUGriAL^EdQXZ}Ig9e2W2)RHW$`&{1J8To z)srqf)Gb@J*(YLWdEA%W3!&OE+FmV!f|DoRpU(Jy&dGZrtGS*p*lnzIUGd8u(N~r? zEjKP*7j~6-Y0A=VDNjPy#l~x0e|Tf3YWBPn{L*`NzBO=8H5cSu{nl7&N`GM2?U_pg zvn#IuX$eey`^F@4Ysu?(->%I`-6Q+V_UT=N-mbc*Q^l%RWhHDlYByE9ZjPNsdSB=g z<u8$z#Y)K<zv~<3&CU{i-(K@d>csMOM|+o-_A|8CmDc<?Tl{@RT-MWlx~tqw@5X(P zd~bGz<6iK++^F7TpBB#1;FwjRmHVtYPq1ZwV66M4|14GS7N~d6WBqbx?XtVx|F3?@ z2|j%K(vSL?zxMb2GrzpKd0u~9fuT^A?_yEknGU`OPcB=xSLEE@f`ZRWYHjCaS@0jK z<Tz($A!pHlAn-vA|2g4;ef-ZWE$mx9CtLhyd;a{1Po-t}1>JcH9R0zvaZ8@3f7#=A z-m$9A|9s}wb@dDX>%aIpYu-i8#d%VN&X+zUb~>+V7JhV=`Pb}UU*9J87`|vVpHb&N zC9fg5CAlfNaWaFtpr6p36bsFQj<QQ{GhXOl`M25O`NCU!JkGC}Ua#`v!B6elf5)%1 z?qBlUw<_vI<@|a6FF#)VtZG|Tb=>ECLDjJf#oD&zmx{%0yI*Q9O}Dk>zxbKM*8jq1 z=c+ot^LABy7eBLCox4!{Bg}D!(|OjaHUR;<rFP7D$~Sh-ZTrFJc*0-ZW}?7eR{cG{ zV{hNK6ZF%Xv$9~>!I_N5`P8NT_~uj=%qb8%q}jBY=bUXp*uj+zo7wzSWyI(77Hm7P zvURhpAM>2p0=eeTDs$3L{Iva5^~>enHs>qnwzlm3SG!9=<>Kc}y}xE1a$n|RcXInD z^?CDl&1~8*d*1Vxm96vUetENWd9$3ot!df6dov=NCiwZE)R9OMV-dD}S^lZSX7!2x z8>FVa{BKwlw?KW~q3VC}FS85Qu2}#1%^#seL9><9qMBFP22J~>9kh7+hr5Tj2Bfd} z?A4pezW0)MCi~NCY4!0tKiu7N?b&J0%(aUh8&6-_{ceZY%e!x{M$D0#ddSWHvhAnC znpV0J#$q*p+rJyFTPQUt&N(WV>$7~|i{@{wn@Z-`w0BMl;nMu68hK^wL$TFc!Ua<^ z&$G&~Ec_h4=+`{Y2Xa!8=QeI|<UfBz>}BY^1~vb)g=Nk!EOKkR1WuT1T#}o;<@%eS zYb9UJWx6y^^5oTHlAh11xF<im{h5vLn^C&T&f_<@UT!^Baixr3b;|7c_Ghg%v7arI z=ZE!gaj#j%{QG2&{_5YtCk;5O7FiYOryZO6N@Qt8|JoUwrXOAXrRCzEUmrXVO=n47 zQTi(7)j6}B1^vr2d-LD+IDD<pJ?t~@;BOxuMg91B3;oUO-6~rP+h647Uz@zoTJzN9 zCF!{vj%?Nn=6Q9rL?~j`dDU;0Cz9SMWpUNt3S42gKuh}9mP-yA{fqaji^yf})2Y&1 zK5K7!;<5D`KK?DXaXp#)MbGra`Ava>*7yEf2~=>aE6MvGtLt1C66c?|+~WI*`Tf?7 z(oSpN?E97a@wIZ%!<CZCXZrti-kqJpwdBfiUxx21M71id{+&=c5M8+CYT=aMjM=jL zpVlSR$^Jk1_rbi<J%|4G82;D!{&>!w!>9jdez;!vf9;3ek{doUzFXG#M=~Lm>!6pG zS#s;N=jH_kU-`ny%zniGQJV0mcH(t`J16-%r?=^DQ=a=<J(KC<lleUVd+*rG{X2N4 z|MIpzyF2~LTl(sa=0$4nyY|uY`{7$P$LH^?XZrJ}XM?CuYv29C|GKk2X#HH6=gzKT z8WtUT<LkMXTMSG7wCy*V=BZZr-{MF7gSrKJvb%T6|LN?jde?sGL7(p({#ZHL?49y1 zKF7J<9bXyhuK2x~^P*w<Z^xiS!B%;;=T?_?$TOXlUA$AiczLqM_vX*H8E?Kg>G<%n z#?p{O><K2x!Mso2eY~=T>)BiX8IrTI>tt`t|B$t|(prRB>z(qvS;0*|FN)R}uDpBx z%IaC$pBpkRxaRn*-9GJl{r<E?zH7riACA@ebKl11$ezV>e+!+x?Y}s#vu4F3N1vL0 z8}oykn{5&jN^<xfRAp)Rg<4-LtXFbAv{U}cjkOJH9K#C#E?-bPZ|S}l5l4b&Zn+Wj zZu=qo?%#zn7Y$o~7hYWbIPIOgcqz~0x(BahnRnE4{ZabPT={;-5xuk99$kw(e*c93 zS;5sh(rp*^*By2!dK`PWmiuM=b;D_#yz@WJ5w11gP(L@{;A=vU_OzI}*6(x}JQwM| z31`)r{c3iMxu%6eM#!V7Q3c{18W$3`ay*&$Nyh91|L>o>&VFZ7Tzj(kT+U>_nft|! z87xXy*A&btS@m;I#q}NhHsQ-=$Xni(Uy-v|X>Zu|rloar{__f3Px#5D78?KAWG0iQ zKF^F3EIU}Pr>uIqS(tC$htu<uZ353<JNRw~bJkZst#^-4y=D3(qwy>~qIchnLr++( zH8nS!5IIvX;9DSn(KaoiW`SEJ|Fl(o#}j-fCuF=1`L_4rt>0c}3x5_*sasyt(cx8J z61YcZ+HpP)C6Rfj>f6NqqIoAC^%K0!Ejn>`d)W+EvHJph7S+v9>c4!;kF%1~{%$q< z{)!cb%wE^mu%|9D<Wh>@xN5L=g<)M9^NF}!Q{OMissCnj)b#gPtIYmwcVtaBR$emf z=lxqZRqoO4j5U2`ZtaYBl}t-}-oNF&|5GmT&DZT#>l{|BnKAd%%KU~&v#zt}w^?P? z-;z{1(sXjN#!qh<kDl#aQv-AZIK?7TljnxkEcmFpIwGuH?Ck8Wb+)Rr%5VBuL|HC1 zzP|ipS%7nH&XY58*Oaz$_Uv5pIK3}KJ#+tagZ-h8e%to?_53`k78m;Y_1uSBYp<VZ zU;QB@#WdczM(=k7^Zy&muiX0Oz0ShbUH;3_2kSL&{9-@w>jcyPRT6Itf~_U^p3axD zkv6`*yT@mu^Umj!&biALzv_+P`}S4+?ANJ(4Z;`wHo9DKcArdY&%24P@$FSAZ!;>& zS8Pk{)j4}5dsgcup^&dhq8ILeVp!)m{o$THGRNzm&R^)c{!UxDaMjCvy*W>+ccoj$ zbtQ`)wb=FR;--a1E*)x|<*|Il^VxruFZ1<Tzpz|?eE!b5^!R&OQO0fZIp4bPu~hdj zJD-01(!sL)|LV7V<CjV;mF>-#dXT}$Mle^RTP@dZa-Gw`)ClcQ`R>{)ynFVRb*`MA z_UZSNeez#(p1r&gH~Z$5YUBHFKc79D)6tvp?DpM82lH9R5@$V|CpVheI_CZoWOLua z926H~oF)9#c}3L~{`-q&=Cj@|S(~PIBujez!9Ce3`L6xnD)nBUxi7qbW2a`r_Qs48 zDi*~LbQ~xD>z!r7u;b?b`;EqX{CjeyzjOY4<Ik@7^}kMQZz)=Do4SI3$CCG#GGsd# zZhd+8Xu<o_yQElRcTd<Jp}29)1hs1uBPA9^U!1~PV0Nf-lFYKE!kb%O%=D{`efKly zx?%L)+4@I5ao%@gl|H+hr$%tWi||a*JtEg{I~BHgPpJ@pt^6>(zmYezHX*x9NLnVP zJ<)N!c53u{Z+G!om&0Y}u`95}w#`2IRQkf4eJ^iCzA#^>yLYWrh-IDr>X+Kre$0`{ z4ZSj}-gx%QDGSz3xfW;5z_oBsTW(y=&cNaq<yC9>r)~V!8!&xGQN~W~{5`_woHK4* zzOun^hU@RkH#fxpXWI2ZYc0>ZUj0nlI};^1Zrf~)b12<x$yBH?ZDkvG{)r0P*>_BR zZP{MRnrO=L&g4<&KgXOg$;sDfk!R}V$d&h(3EEy`GF4o7U2@uqF0WTxSEQ`f_{nu% z`MOD|&d*<3y!8$|`9Ea7#yMKDd^laWZ1uTizaQ4jm-@~p&{`pF&A=(PNuu?NiRQ)? z0UvhX&*Z%FYw`6o^%LP$FT4A0GhfsQj8b^3q4mv7IpEv=er+YTGYbM8A80pi=IdiW zxB1F8hOm9xSLW_*a8%ZQsT<jJ<ancm-igH??$2KJ{_17(pS<zklWp}35Bjfl#Mgz$ zD}2BFW&Mt>v*kZtKi^<nsPN*M_dN9l&ow6fEH#K0`>>vMTkV6Dmh7RGJUL4@Z@Tj2 z^>UBg2g{FSotDinI4+-Ae2Xb^U0udKwX9QlXN6AwI<;w)=meFOdeMPVN^=-onrg2X z%f$<=WBV(hSlzC<yg>eAuMh8{V)qrQiKb@nKg4rAbXb$h7T%-2pjiI?;?J^&&pq^G z-ehxs#hdgg-G`Uxn4A38?YesN&(zjQA$)&UFA%(;y)VfB?CL}6uZ(^$u;`vDP;EJw zc(r?#U&Dvy2|b~!y;?#TUTl~-AtUgn-$7CNki%y@j1<LVR@f--o^_a0Wa*3#m;Nr0 zmkJ7<^zfaMsy*Wt7p2o{?oO$jDl1f##+jxcVp3<h=<#_gz7HE^(|6>@<Q(VxAtpH` zqV#BL!IyVFbMEI~y!rG7^Nx?-f)h6VZJc;NS9Eouf%VC*hgLR|_u4M}5bK-9Yg*fP zs$-?x=|er=g~I-cO?a@mWv%j5!B3f{LD$plANuDPOFnVlxBsNF)dJP|-RH}79()a1 zQ?zE!35Vue9|OhNCb=!!xANG8Yfq#dJdWMj`EqS^@{PKL|C@Xb-z3zCrLxp+|Jl{5 zaru|=?W7wUU!<6*@U3D$ez0-YJ`o;|uR1c_rt^i5%Wm7*KSN%wVK&R$uj<=xq`Yi0 zf1Mrq$@u1~cfTe_Pu~>%`tGJH=kixysCM7}C3sn-p2V{g(!Kl6i>|C)C-d4`)jRgy z8isSv{I2yJd(^DF+b=pV-Pb;Kv7+-lwx`x}xwiPnoS9<0t5)8uUhS3L%Z_wk7E#&T zg536|k2kqWI!NDL=l%ac-;E!vRrOEiHYHS_aS2HH_D}TVRyU6D8FH_GypYdQPn>yk zl1s|Yw~2egjVA=IY^nTME;?C*|HIMC4LjJJMNX!sWeKO&?0M{|)nfI7+p9GG!`#F1 z%ijk_Y31@=zUH41QX?NEE^Zbi{(641OY>XH4vQJK58hSo^D?WRxvA^W^^QwZpG&<w zyYR)U$06B2m7f->iA>xOyv;yNnOpZx=7hOyN0q$SpY)5`c;@y@tL8&)Q+aa&->~g0 z=+}AsR^Y;+2iGUxxUP6LFxDx4U8K~%&>9`pN68#N%a~j5^%t#HuZTOkzjNa0YS(ia z+oV$`oL<lRtyZC9*J`2L#mBOKHCCx#zOL|By1(nc$+qRoV#-cg=FU;uB2fEprm<fz zufWa;Vv7Hy{X+bk6Hn#^=WQ|GnKi$>e$IkbM{lm@|MjYAU%To3MMvH1794+ABDX(q zQHazO**_J(_IZDmzf_c8aP(@Gy+VK7N_+o$-L30aedCPEk`A5!eEa->t_NO$uO0@@ zJJj8ESING|{EA0))1MEkdkT-6Jll9;DZ`&BJRBV#cRO@#Zd!gNcg_iY);g{ax3~4w z)VFMKwOy5@k|VJx<5H0N`YFpZ=LIKjJrh1JDZcul$<CtXlk5#Q>|he_KJ(Ro<E{;6 zH?FT(<W>H8*CVFDG^N(*M)8w==4MKMR-L?l#?K&)Qp?Z1wE`X=IaisgPTR1e^U3b^ zpFuCTiayCcd1htV+BnU0zo((wcKmvrYgsHB_x0;x@rnfz=hjU4D?9(?MXN76?p`go zPp)dVl?zOan{w{%{A!o&jo+*dx2|-&wQBG5&Bva`t@rre+M*n*Z2P;sap%5-_dnvE zWK>OGD7Z$z`1Ul<n`=)6zwllv);i<6<eVZ~?#)^k7Co^{58Lx&$K+Z2LMs{XzMr!H z!?pjdHZeKVm?!;Qsg|ENb$f-Z{)UBhx9kmFUd3(Rx$orOY0FzuL%UW_IaF$MDB9Sk z`?J`(#WD&1?;c+qF?G*+=NFIWJ51qxS@iJUEvXMocP{+dE4EAET5p%ws>h2aeKxEN z+PuIi{K<8jFPAEo7Hqor=xoTrnc9y-mT3J<jH%&Szqn+6y8U#u-Oc6-Y8CmDyC=U~ z`g@A4fcocaDXYvqw-oFvcixsiqeen=z5fzLXQif}_pZOyd9m`Q&k;ktSy{qGZ13Oi zbT|^U_7U5L8(|x(8PivCzIwBIdsDp9=G!VWPj-FbWL$TB?#sI=Nt<@Qt9id{NqC&) zoWv`oe`G&@G}oE_rSn$Q@d%Fx_C0Uf-?}X<mptsF7c=8zLm$V2X=ikKz6MTjZmiLo zUTwzbvBvDmxwRJyHNJ|aRTW>m@+`;jPvUjmH)TJVwr8KslIk$fd?I%-dqHpLhXpfv zZ|>k;C!!zpH2ssQr&N3EscB26#$~2<hsdcN-W{a>^faG$_m)Zfryseez5M$X@l#(f zDczj7<eWkA-`xj~I#o9AoXx`({d3B5X~{i#E7soB+Hriw{h7+w<nLNdx-j2@?_{CZ zL$=gy2QMehIjo#k{-2}8Z%t^8z$#|5Cikr}CEtn)c!Cz{Se8Cmr|2UUoo%@8O-kw^ zfn@G!CsqpO7RqPuH9vZJOPhG@tf(`!E{89q%X(&MaC*La8nNirgeCX1OH>v;TGu({ z^5rRWF15_*Q@J|ZWoAe|)6;;xowjyox+E5QT(<Qsza)LB#C4YIy<3}Z&kmZEb$Xde ztV8$Nu)^TS0Vah!b5<4@Jv0e8bUfqwe3g=?I$9Y`Cam90(|sr8P3Lr8BA~bS{3Ooe z>1OQtHL|DF*E}qI<6p|2z0uoJH`CXff9s8#t!JDoGu=ZoH(K1PJ@ebg?<a@KU9ppA zT{1d8ZI~&bxmqssyPxQeunR1yoO`F6Ec(auaP=bnWA6%n{L|TPcyMEdt4IFYzSK!6 z?Pf<dT^2GsEmxWm<x(guJmX{H(GyRXaN719Y>jF2E7RJ#{E>yO+d<#e3P<0Wt^D=f zYL~OQXQA@ccs13U`@3xzXNCSb`~2%I*$Tb=U*?syt_luif0TJD?3ud3sSiq9)_VNt zxw}HWW!sNAmGT!Y(=AJq7p^$)c6RvMM;h1HF*@15SgaR)P_!%U&ECevHnVy;oD9Rl z4HbR1iE8}z6FMc5+Wtgzx0>nAZrhoRefNZKCe3a-l6`yX%#QGNnbB&O7e36~8(uZp zS@_4B%=%}AOO8HBW7z-eql0Pid$z;tcD>wu@p$f6UzWSA&zU|xd8z)|<}6FMIOp>3 zV%t_G3r*0gTEe~P{dM7I>L&F|+rP1`*jIA=@{ONY6`%c4XxF{&KO=DA|0DM=_2)|H z?RUTT?EDvrduiXY3T9R{uPiq#I%qtr)6rGz?u;cqPrBm`rp*>TID7hn8{tQjH}4ia z^r86Sj<t`TmEHO%mvui?bbF3#_dla(-My-Zh4#3f2|a8)b&2b=Et6j^U#)&B_i>be z%!hLVsrzFt->vampW}7mXYR^(5(-nE@oo%R?sH#$>Z82))oFK?mxKpMPAk*&F3j?} zlE~DiS-yH-bCh*sRPg26NBO(>pPtSrOPv15=Yn|I&9<GtHA35ddA}>%*DT$0@2J(z z4Zk_>Y(AtqPgnoG(hIrs3*~HduK%btY0mZY{_3FB5a1cBow(}j^q57HG|EpoSC-c8 z&sSx975e7GoO!a0!Fz8!{5k*Tt-m)`-*`0Bb*i9Ld|7ewMd{Pa@7i^8fA(*>WT<%h zp@7!)@ZGDtSBHh~QZrnAjpy+EBR%oEV<rdWZFPv}sPA_Vo4&r7bLv%5pNU-);>*@o zpY768EdDzy)altQ(WT$H)#LiazeKaSNU3KjF-es5xF7KQ>LC&6yKl>F#TQ?$n{XEM zd+nSSDIp$barZ*_ioc03XH5-VeQnLkl*X;=tOX`W{|ZdF`)kwIchSr5Uc8VXGHYMl z3>#bf>brigB&UDazyJT~x~(e@J$du;blB8fjp)rf*^(Ll*O#5z<Qc5C+}F=LHY_%D z*P0U7OxK&6io}1<kNIWDoAvg*n268JNm-5Ge@34c4_Q~W?V!Syy0<qj7witWJ#p^W zJG$2+S8aW0cFN+#(an$5W0fDjDqWg=XZ3_!uEUqq!;hGIOnE=8&HZv(-RzpIKSoNo zPKV$3ei|~RG1+`)Qt{y&t>-!C&SsX!`CI1rt&85M_F`sC;K`^@f9uPa`u*A#yJ6cY z+nryw^BQa3UoWGXxjojOcZ=Mb9cMn(hi-p1?e&@SVvA0SCLPu}_5O^F&C_qMPpz*~ z3-3vDE_{68-Ie!dB6o~;E}A#>^Rsn_gZD*SzSfRieSQ7xn84$welAFOTCTJF*4C`E zucl7cZrj+$m=P0yT)-h@?fO;oVhWYD6_&j^`1(!c^(cXREOYudG95cVdwSJh(}>V8 zyPc2tdCc;njQ>|9a@SvJS|7oBO-^HG$z0JD_d?!kMO*KD<iCc=^W}TLo#(jL#O;0* z*R=M3)`=y5iod^~ZS;57F{7Hc&^sp?7Ulh#eVtw4przk}t)J{(^{QNx=Dd7=@4b&} zw4#rTNt<gYEZ_2K+H3X>(W$G|!$mf~v)Nwz=WCyOo^=rSv&~oYOtwBa_x^@(_UUWu z*55MOxoFzdlC0nBqW5Kces9WH;AeT>YtnDK-*demNnC%@<sRW#%<DOMU$m$8opoOi zY*P#O;7Ka_YXAG30Q2d>$=YQm7AxlLzOL^%_iOC!ux*!ovlnlD$fvd9R7KVw-TP(5 ziK_+LWGvOs{W>`%e{S*Hu2SuHb7Ov;Zp%6KGyVD7mB#yS-$_0iGAHrqp3;Q-Q{IR5 z>^j?<_|{<G&iA*sJG&ZkMV_1e?qC0v{Q1SI53f(wj!OwWue9db?$FrSBgZx+efsw2 zv31#!U4i~T#j}~u+H7GvVick~kKs}D;w%MDwdsCotFMR8-X4Fy?nP0fNR+R|?cf{* zGyT<mzppVLoE^7o#?wDHpFO@`$5DBI`n(iN|2X~|AL_JXPZfRJIj?hbk?Yr2mrgES zF7;)~<u6~(HYJ>hnxHGW$yhAyg)ukR7w+ex5;C8S#Ezw%KNlbHqDM1QLsYls#Z9|I zJO0b)akvGVZ&z%)@RD^`_`E*hq)lRH^do*KF8wz}a`olcakaNJj%>Q2Y42uYF{$?J zuJa#?IPE^AzkOO)b=QBMF;^j@;R1e%PxFLZZ#=E$KkSvGx&P<BzQA%R`}Ba6Jyl!+ zk}FpgcU4U_J{`I9&Aw{=r)`facLq*eHP6<?=+b0Yr@~bR7Dn$5Zo2wCEa2Zq{rl%! z`dX*Ny^uO>nlVp5ZiY^S*0n}0vD?03f&7oH*fN&(X8LdH+W1y8%#iQel%BW3Ym??L z+FSp?mpfGH#+D@~erVkiH=nXGZEf7rZH7}$^?hS8?q=Dr!d6i1V0EH~l7vX0XLk7d zn<BsFZFLvYS6=CElYH!Bu}dODP<Z>UFGo&azS+B_W4`U3dEZQby-)lyKSA{OBH`Z) zg?(S_|M!+NtdQZ?c^+dUv68z7zJ;uou;*~sUMQ8pT=Dzf@1GU-rEe}(cJ}S`xma~o zMyvb#iq@$@_m)01+~cqR-b*Y`gH!aZSX;vPru~XGd$z|(+*>R^lQ$^FM?*00#oo!8 z3l9i<j$6m~_0xfXi0tAT4Xqn-#TtF)&-cYDw=UVR$|yEV(Dbje@OP0J8*iqyzI+hS zRj^Etf0AqEN=LaJPu@8f?Q`r)w>$Qn?ffm%kjSinWhb_uI?a2+fFrVkZEAM=mwjHV z?)b+gdDuUDce?bfvf*Fu?HbZMFRgd_d0ueWi>Lg1q;-oXI$mu~n^^3#$$06E)o)r) zs^0K4yjgy>VU16iXWrCmIiHu$KHp?=cGfAf`?X-hCY2vz-52g9O)vd7_hw*FNVoRB z|8cvXOn86ZaobbHpUy|;EeMfTJXm<r)azf&J{@^Zk+S^!qR313<*F5%dsZ<r&kuY# z`QOgpm$xkbG;so>)Z#S#_0czHEaKS4;~dJk`N)*jDH4iP6@JdNTa*&9EAXwC)};7< zPLWAmPgD)RF2DW$@vW?_UuM3NeI>29u3C7>r@W@DGlAY^&W@f=6~TqAyLh4^Zg3`s ztiN-n=jFFc#sOQ@czE95u$;lNfkp9%`#1Az@8rK%%+1uPUG2VwnJaNdSgCh~$(E-Q zC5fep8$a*3!rb$VbK~w$hu%*5dhf`Dsqf~=zy0Z`xZvh|zAqnhywcKr>Qwu!Y;T&M zh<-C&GlBDEi!VQ~mr}PuJFkbsbLms3UI^<ji<MldzIH}W$CqoJ@wBvai9cJ)YVU|_ zF?99ZWVg06Gd;laS?k?-YG0Xar>JWFIMi(M#*68H?X*xC-i51XAMBK8Ru)ZOXq<Cp z-rda!D;G_VJb31<+E<?kS*hXc<HL)Tcbt`fE7d*w#}}~=Z#HR_D#-XumN$`E_?>G* zAa`1cVvp+Lhj*h6?+!I(bXP7>3#zYK^+e)z|1LM9*)e~AxO}?oA|>#KC3WA$?}mFP zE#mR5?{{<Y*Y^yOt6$$=6IH!_$L;T(x8|<-BfO#QjP5>>-&21~_}8`c-h{|FF~jF| zp>BVk9n0}qXj)L_T>P?s&7&Xx@0E%#Sgz7+)pGO66W&y}DvnEYSDQ~;n^<_2=TwA> zG0TbjulYA0X{eP;Dc|<PHe{Wj?6mY)F@}>uizgkQD)ehjBfHQP9`61_OP40(`tLdu z<+rueVnOHB=>DM7qSlk&U0#!Uvfaj4Eh^pr#<CsHHK(#gPdzwyZHQEEsM~j*8Da+Z zr5FDE5?{gid9Kg@19O`yBqX=p_@tAky|!dqPfJed?2j#O%R=l$qt>Mz{H4cu`^mOi zd-WGmhs<VN63ynY3VEo~w$qm9$4lOc%_nYLo#4U||Fuga&%tT^iAR$?b}sz>=!)%M z0ps2c<ueMl?&9)y*z!!S>a4B9$w!xS`uR?mWli2yaa#VOSxCy4Jd=~|J65n&cQ?;1 zTjR>TJJyu_Ph<JylirItRJjgrmz;8Ij@swRzU?8uYy2Y8*V{jSx4VA#HzspE_Xju2 z|4Zne`+Y{w?8BQYeiv7JS+XZpBpKQWC-PcKD{r1s^HyJ&$*Q#6sBQW4H>n>gc;qV! z^FNuF%ne}3oyL6QVv%{t!$9quF>e=HTAY}6+gI2yqe5r<<>^blEcEy;>ALHM?z<`a z$8-3l{<ONP?SIgAHL&Ao<}#+{yX6siQ^h4S6DydesqOjfyXBc?b4D5azWwgAH!x3q zs&?Ml^#a3;&?DWsp<8cUNLlzWaazvIvsZd=NVq3h&uM)6f%BF0jaMFjE8^v@9f|8` ztLByZ;3~+sUecuFt!LdF*IVn$efND!l8WN_ap@;Zz?$vNT1P{@FRn`5K8<H_R_vK) zCUxuqno**>>i6^Bw7K@qU7i{F<iy_farqw2zkX@H_3l{I81`;<!OpxKE*DR)rny_# z?jHDfGWx=e-^n{<<#ubDd{Vp`SU1aRm0a~Ti8B8m$8%WUhb)u5A-!zId~Vg8>u+uy zd@|<*(_I|~)#wc&f}h*=?w=>=*!(TOaxr6GA7|)^ttWV^ZybA=evpMtzlixjo?-XP zCCm2nzht!zk+#bg&0l-RbhWsON3Owa+eF@Xthz#SM?cM%ke<SGD4b)P_~!ifw9ZMh zJGx$l_-d;$9+I0O=l7t_`oe|Grb_G03#JFF?04_3{+#|urvLndpIQ&3`tPbl&p&Z| zx3itZiTNG27ApkTwhG;}`)tkf#x<+t#`nxMR}<CWe?DMPvf-kS%8lHBOLkienafT; zUvTJ!XwjbCA+Ng6Pur9ge)X5HYE#R#ebTEFKWwOqcoBX!YvoqUQ!QMd4A;hfT*y^n z{PX&BBSZ0JeKvE|wk2)9VdN7!`Stk#<;^@VbMu^Usm`A_EB@V03H_Yz%R23)LTPy+ zavN^Q8QA^^+_5Sxy{^$p`i7}OiTaaO3i5x1!nteYwA)0_&Te^jm#y8P$@(92@5-LX zZh=en&L30q4!v)_Kz8e6LD7>7TK=>wU@9#)-Q0Ic)q18|r4+;Skfq1|vk7l3D6iTc z`R^l__lqfWjYT3>f6@Nwx~W(y{GIR#|CG0KNB($TDZX{gKRD!7&>L5c-AC{J2@gD{ zbE%f2r>JaEP{qW>)7*dDVfvxQY`JEkSnbx`YrpSp&~=|L*%Yy37RQ!%3uh>tT6b&{ zYff2?z{l{#mMz<r>k2Ar#B?WyZV-`jxU}Jf&i6}qG*+KVGWqgmhr+(~%dD^MSgrkR zy2`@iZEk5t4s}JHKdGnbUNrx1=Y=C3(=Bv2uUoZd&l5?N-e*-yHhKL>SNg>DcZ1eL z=2`2q7rkGxeBt5?z1obzQ-8K?X;^zKe(stSfy`^M?{2y@T$}#EPw%VwY>#~ss@rdu zyM1ea66EmUBG07z{?;?a0&>}Jnu&%+cO;y6w5ed8bK6Zj`Q==hGk(wh{xl+|xO>&Y zRXX!>Q`Pr)_kMCL&E!i_DVRN_WA1XTx?Rj}0hbo&W=rWT>=CQ-2xrVloN66%PG-vF z=X1LkDPP%WxchQDXX=upp@j?9p3;$E_L_CACXRphOZMIXtE_K!lA9EAR=-^5)fCuz zXWg^&JYC7Fo=;G%Sje{O&C}Cehp*JcwQN0|x7&w%o=5LqM@^%v;^jj3qEn`{U*zJc zO>uR*U%7trhQB$XQ(tK;m~Ec;X{mbBj5}{OrElju<~I9$XMo^?>2ulo4{I!v+puRr z_M_>xZ#Esi5GcUGl6HEt)w@OYvkylEYl+8y`Oz!=ZXN%Q$y>d;*Ib$<SMq(X`ZdWZ zYuV=KHOl<q>9IVn$rKp3Pw&k7r)wOSPfaXR+WuGj{HHa>U1zrZ2=tvRv&C**i;3Xd z{+G{c{hgWX3tD5MpDvr5boa074%Tymw-WYL%X(XOh<K-XrFu#yvA0!Jnrz(g`j6<v z=4SoyH7nL#IOX|j^+Mx?D$@eGS`OUniR*g3*Dd^KgMmnLvGBT(=QG_bdCj~_<&S1w zn0rQMYJ1<Jg>LZ|C)F|w78u@Rx|0>@ba<VT1*2#<-?v+)-4iv_?>qQKh`qS}=fIxz zCl={c8wT3(zTO?*QygJZTekeLO=DAvkNGl*^PD<qR%?9Lwtkk#DYEAd4z}Og^;iAf zK2|TK>Ngqw->+7v)#xVP{%`1V?#}UR^EI|<`;>CuoYDN@qRwOKhm6+StvXrHN2df8 zE!%dZS4=S@N$XG-=WUj28l74@m+Kp8OkEk7$v89DV#1y?fzxJ8Su*j;Vd2i4iTfA) z)ZV@|MY4HO?Sc19m7Jdpzi|KL__4cY?SmMPySi-?b4;@ge|%dppPeWEh>Xlyudg>3 z7?)O^d$;h4i}#AJk=ds@&b)P#mR>abyuq`z0cM{TUpRGU^TxlA878T{lT!Jj;s4{{ zy^njD)?7IKN3iC1n}dzXm&A;nHQcTB$8zhxZW83=>p9{4H-v%deZk|98`=7^q;j8! zn{Hjh?R+BIXjxYB6YCQT)*lF2cVqd<<ENhLyt?;k+M0^B_is<xbL9bt2LF;v3NI8s z=4`a|2~FF%*=E8~N#UoByB}F<%~5E%`TFzz#`oIN!JMiu0@gn`$Fli(+Jt+X6UrZ) zJ65$i<NfLN9N%tOv9gC4yMOEZU^UDBSc|rf_|tk8u}F(W6`POem*4j=y=o%4OXyPn zj@u>fmuIg|%Hb9=`{Nfm;equbp5@;IbESX(at^h+8g^7S(fyUuhcJmdZpA{)UWwL; zQa9(V@Zvwb?R8+eeA!i&^{3V@mSKy|*(zAhHT#YEwo9j0=a{~XO4v2i>uoX5j57fd zCr@qdni>C2>dZ!dKFgLB8)D;sFl+qy?t9>GEO*C(O`dmMP7Akv<qxnC-)_FMcV3!u z>6-V-vv0Dt&7G7u#Z}dBnf>NR9$TME#MWjm4HxuW;iVq*m1$MS=~9<=7QvSba$mcg zo3(qzlBKL7)vIDIyH34k?_iy={7u_OhuI|yZ~1M#cv;VV_p05|JLi75e9@r(!@N6^ zC%l`Ak}|&U;9TXk$?n!(hTX2`pM5pX+#%5){&Qi!!mlieb0r!-Upj5SGO^#o&RF>U zQn%C5y`QG<yFBmkhBa@kB^Bm`eUh&E{hE2*#ZT804rt!)VcB@4_OX%ft<agtD+-Df z4!`(quqEa~jK!gu%wEqzluRpZEDAep3l$=dAGxx5SylILXPzs!8w~iT%;oF}&X_Q_ z(`(+wpZSF%Id<~u)|1tk&(7@pdc4zg7gK@%l(bW4fA5j{C|CNSv@P<~+sXsqzyG_% zcJuLs{DTa=Yu;CW3G3LBEw|q=dbjEBWn9hPP3u3dJl1(2`@!x*%Xd62In9t^qQoL3 zR<gNNnTfH?{J`J%IqR>p?YsAnrEI^$NzV;mOZh{KgmQ~{FXU&>dEm2ZH&1Qov*WX; z$#~^5MQbwdX=3{Mm-*n+`I+hSI{vx~Pe}VVcl-K-E1t}o>VKkj`7G-%FFrrowncdL z{rdTe6+L{{WrK_QSD%P0W)Hmf{K4y{C-0S3&*)9{$oju8^v!QQv8lyZB<^zF+V=FY zx!mHPezPm$l~$Jcelq;s%f7Mu@|1r8|GJ*dzT(H-6TI=V$lE5t_rYCP{JH}Z)t{{h zy8JHF@YgMkbIXd4HV2Bdzh-68aoe*zSZt}1?&TL=-wyrK-TvyC^pP){=5gtIw1hvZ zeJQhp<=HRw9ZFHJ%+@Q$>2F<scu%#!XTN2Y-!H72y>TbI<&HN8bmL4D4@c}O-Vu57 zbH-~u<IRB+d>rg2&t@#x%(^(1(IGzNRbuc}zUv!KyY6@weS<5QdHYHADW_5|yvWb; z_`i3xK98H+<uwZIYuUZ-M%@yBRaK(5=HHX|dei5gd{yKv?4jqyks`@2IMrcm#>UOj zvR~C>|1uZ%nkO3dGKX99hwbbvn8ADHxM9)vZ4a_0?_OlI<I$8Wycaxn2JG4O$i~d! zaC6$`*3O5HhjpZ8nnkM~+#yxUZXfEi(dAiUhJ%^X{M+U+hx?TIlZz+r$}680W<Sr+ z+gEpU#+OyUSi`!%cKqF5%M;pZw`r~WtrG%L#@0ODx0|<Iw*6#i^DO+$3i)Qc-kQ9{ z=7-k_`RSIO^Y}Tz*KgL;zZu<|H?E#oV<*O9y5zZLak@tFq^rihmdBN>eZ51zvB|$V z%%a#lrAM-nec7_PfpbpYN`K<#7X0Jh`RV+t?g;KaCHpb<$`%{rdu@N%D_5ASw`Xqp zqP=U2@$&_|O>?=IMILQA*4lDA>B4feyscf#QsoWXKibYZxVzkX(XW=?bGsKRayK4L z>~{NkzOSM4yMX-m*XQEQG!h$*eV=nSm31ATDpRo9rM!zfratDV-r*C?XZ=<(r?@%# zXX~zy72*<4OzsCfEt4q!*YPbfzw_Yb6#knpZ63?5e-d@Tuku2}+&^9i7Jhol&-zUI z?q9+0tWN_bny$MNVVk{JH}hS{`C}@Kr~M~c{oED(#`9I8u)&)n5AN9Ui$!*vjY$zL z{$Y4&@rDd<m7{lh1lnZO!Zz@%;`*Qa-G$eA-r-*@vXTD;Jei#)zW6;|@cB*A`^oPL zwP)^TKP2O|eVaaW+Px6{lNN<?WePJjw=Rp_p<VK;boHdffJ=<}eUdI~Z%>xAytnqI zO_~<#pHKE2*%S4vXH9167JAbBAS&qo%aCom-&=mT`&{MXx4G9s$|b}5SLfZnu>YM= zUfQm<s#%k!%LEw(&GXHcy`J?i)os%9Os(!{7A0k|-M=CNq&}~C6g#bUvT2Q-inoyP z`oO({mt+e&<n~recx(-@*L~K>J@JR}7p}|Mzx>*+{_%@zx_)7awWmn!<%qDxn$Y!s zgUYrQ&-k^%_h!x$Dc>{ueZK3NXC5e-FjGU>>U83y{gdn`MklQH$$Q$)r}g{=%bM)V zS$hmUBaNmO#N|(2X}2L!;9&M__gBwqCbG^uEEeDX=o|CIpkDJ;X*qwiE^cJ)_*byn zf@8xJrZ4}}ZtR-V{kz!wf71Q6S7O>u8cgiH^mXcNlZO+YW)y8%a(r`#57)&6Rz;5H z+{%aVEpEQ-xPHOn{^~ih@eZe_GO``EpEY6fiX5K}PgO!&H++3&f6>MJo1f{a_u89v z4<vI+{qgdhZoWO(G*~iX4u{+Y`%ts(wF|FXuFq56JuPqDf9>R$+fx_ie13h|_Uy@d z&L>-p%<DyO*Qj1IyBl-=ke+_NS-_Iq%?D%l^FQ2fE**IzV_kda>i2JbMXKJjCvs1z zw&OniDL+4^)kZpe=Ij0EPu++(cu4fwFZYNa+FZ-(Q`g-;;uJ2hD`{Q3;H0^;d3iUN z`Q_hOrG0$)>8EQqTAQ!Sx}o)MOSp-}7v9gkyr+M^In$G0AW@bUwa?Be+o@UE?WlFa z!?UKF?rb&<TVXisex%6nr<wB^|3AC_{PmgrHVdD`O<=$DX_}A8^z0vr?S7lzWip)Z z@OW4G-03x|yssMD7t6La{5-SVRXKW`%fxekv?nuX`o8&XxZ$9f$-IMoeRd0Pu8-uJ zwrk27$x|g#=}R?c3TS<B7n-5UJ6&<_Qmwwo>~Cv7i<KMwvCUwST~RHld#dhy<>wt? z8jK$=&%g5aW3<_W7e^1Z$JFUp96P8}WHI?tpV9^m(}<qz2l*SBbeLyoZ>ar~yn4p( zi+OGr+Y>~&<2emx@;hfcdoXDgZrEn#;^BC=;l<~LTNf%M<vKj#HrOxvQ*<Fm$t3&6 z>;JjGPT4zIId#V`DUq8m9yA4ZXNY|`r}=7~{pLg!zVoroXWl<KQgqkj*>&yAE%ocI zpJi^k^Yr(O=#Gwvk`Sh!!Ac5Cy912wuCx%!naQ?&rk(l0i5bNzq3mCEO7hj${Iy&g ztnYWi<BN<>o?UuHWURaUBco@3j#aOD#LMht5xPX<M$wkqd+#1f`GpEJ1}}BaeWTQH z$)D};Ki$bfEAF>N$6RK5_EuVA^&!FaXVlJ!xfL+D-n+xSpnK)7?qKI@$?qA=6S+8Y zMDsNArucr^9qm8m=ga>G>;9ZLJZ<KNhuh!SFmHJNJG3&P&PMS4MuV3xUOT%AeOi5b z%bOI9ycLf#AFlM7FkA7If&WUMEuk|nUF6(;DCdJr0q49eUCLhNzHd4exWcWu#orx$ zAs)c*;H7jjEVXfpi;=nd-D5eg4G&*>*?!08L)*9J9+Bv@MYmU_^lVL4+sUpWDV#g= z<hvUg3mJ2CmjBe+Z+h@IL++$imj0!`AA}fPJl3-1wEHE!%qL7f9NJS|s^ml8Cb027 z*iza3H}2|$(0Y>^!86&{8F&Am8Cp`eL3`%Im@_pyx{AMsb4r?8a5b-yUX+(>{y|tP z^`}c})Z1z{OCKw@DVJ}W)qAA6Z+id#ptp-(SQd+tq4)}>sTbS5F3wojF@I5tPDprN zxcnyu%>wmDHrmOFFLZ@B^jO661fMx-@3Ht#V~v!Uk8sXZg=}fQr>n}CKNqOIW|=pY zJ;dz){%^9X4f}Tayw+Lm_T>AN?7xba)~QaunQ}G7d!5$wn~7H?Si>jx%kob>cVDIK zmrY!hwCb#rOFa(H<of84U1!*`vDjp`6>o0CQn{4<lV_Hkw7sgdmGh6s9T#ttU`7Vj zusNGwuH0x)soP!Ur|tCD?#jLWOAoj_+HJM&LflD{g9nyhS>^G2_Wx!1cH+~oaXrmr ze?NWJqX*mizC3#u7|Bv}*7fRxCF?@<?k&zfec-}TK{;m0drTWXNjyGKGx^x5?j`S9 z${7}TXI6fh_GF94@lfwY0%<S!yci5VG03buR6NJ#MbeYTv?X^Gmj7yNw0Xf)S#WW8 z%S86$CYPk<_!R#&-138wIXLISIRo+bz`t#`GB=eZUdd_eJ`(ypFs<3%l1u%2z~iN7 z3}4QAYOi4xY32Pj@<z`|3(*z_J3*$mF3dVH4HvtlPhHWzv4nd|&V@Uzul{UqJXCh< z?Frl0nP$K2mPka)JTH53Vm(jdoxaT%UOo)}6g+WGX35<X5^^!yoAeLPuD%w%$DQ+L zLE?(vk&#)!nsd4px!O71FZkpKbNLJUDtG7H$@I|;*r7g+{msWYlNq!)-p=SRThov_ zPuJ!2n&!V7GA2GO*r3C#^)ovw!`~q0#DNVz7Ww>GSh7ld#^);~TzR3NF9gbldkL}} z+sh;I-8doV(SaXg%*XbgNjQA(+2_Ku;$JdZ8uO37<o?bq(l4yBPmJX#w?*9^kA^EX z2OU0~Ss-Mn)xyVUeVXC*r&@-oEnPFFX9q~`wCCD?EMXd7a@JlGMw`7cH>&<VsCX!S zU}LChmNZ}A@*k_;+8*4vmEFRr_lOf)(OYSQ8IuiWlrw6aUh_yP?cgDs7=e(2nqCKm zfQo6&$+NloauXliSk{yr%^`E!>A?*#7WZ2-<AS+vD<9bCJI!z9g9=418Fj;}`^42P zgrA13_+gu_FoiAovS#$51D{3M&;PzSLB`}sp2JhNrc<}3pKW@#_F<3J^99xC-~Bc% zylxp`<-DeQ`^G&{i-khuj=pcp$mwl5b9G&S+yUd~O|6fv>ab5VdG@r(asR66+B~9x z53ju5V<tcM|3~q6iQ!6Yj6uQ$s!0a#rbcX>!*_7+B$qqg5?$4*X?L_YZn<n^vZi)c zsLVaTmXsjtw=>MQq&vqt^L;wke6FqaM0CrZmKJsXTeVRaURF;}JG4Ihpx&|MH*<fV z?Qx6!?Zh%ADyDk-ZuMWia^a#1rX^>mcHZn4UGKm6NXN^cH>dtz9r);f%fI%Ihi>HW zxVEh*)N<a*rL5Pl{h6S3rEE{g_t~BIckQ|SpZ{ge4pDQd`M=Lj;k>`@V}MS;tsncP z#Q%jqKJ<UDl=#2?*vR8Lw~aS^vVJYKqAYak+68L4zw3SK5AR>J`f2@F`#=A^|1+Dp z@BGz#C4aYN*q@2HeK-8oYj^9cn%6!(a-Xqrz0uR?XU^+Gef4TLA6(XSW$ktLpf%gL zrHeK){#*7#?4@<7$ga%N%*d~sUh%Hkb6sjq$i2p=+wV{MynY&cYR>D7uP+j0n+<oY z>sy)ehj06j|9{2Gy6fxSZ~rmBKXLny-oWiYW+&g&{a1YdotXW^T~+InX4?Ody!!ux z#pW!%aPIp8qWe^}=7@^UlMlUjYDGb5NJVu>MR-KTeeUgC8(K9F{aDJ8JzeQcbk~M- z%|i`KIl8AR`Gj<B@YLM4-{oBE^!meBU!|s`PZ!aNG4j`%Ie(%yr)2k%KRq{tPCl}{ z$z7~rvRg&_uw{DUu{|4RRC0@X|BRGmy%qh%&9l!Wz3iNmqPDv7eut=tNm~={*=S}z zl#%L4m}4^Et?JyLn+H2;GQZ7fYW?ZmvW9i%&Pz3?_8!=&GJoo1T}vab=Yf`Av{<>s z&dr?Pc!`C%?S<)9>3MA>84=t6SZMt@y&^BWOR6n7@a6JFhn_FG_kaD0FZzoP?bt8< zZ=Wl#d|PD<^Da9^Kdw0|3pPE}Y1z!x$9=BM!v9dF%5&eW^&Mp?-rdhqJXQNxKZ}2w zIO*Bt1D3{{R1P}w^%ti+IX82=%h&TWV`r@A72IUV?zylpeQBylif2|9XX#ccjXCps z#kroJeSDOW?ODpylr!^f{e_B*yRPIvKR0vzuV?xv&WG-0Ht=xWwc+Q&?l&tg20n~l zWR>R@azjwG%&ql(pH_Zq$gf)~J{()Iq1}ev(8KLZwbGo81<MYeYz$^u&UDVrg12B^ z<7X|)`_(_MH+5K@iQh1R&9mT~=A>s+Mb1Qe-D53Y5k1p<y@7JHY~P=rqfy(9^N%cf zY<N-Fzq@x{O$Yz%29B&|j(QF+fv$$mnx09HJ#RYQ7gs%7y5hs@z=!wUTkZR}%3WIb z_i#xs-k0CYwcMrkzwqk0oU-#-(v{{&7Cbu`$(GJLN4KEt;7>-&Y16-RE7`UBaWLw0 zvocC7G*ECe$We$iFqv`i%84Th8d)2-i;Odr66ZAKUtpP2JblZ8f<z0I7NxC@Zw_d@ zUAXGL)K%e`fe-hrDDVua$PKCR4*5|X`0&_@4~;86ykB%kzP)vFNcDq9U-NzHYj=7I z@UL(V4VV!*VXFOc$!jkcu2{6<gOKT)DW9s-xLn1)c082KJUIE&^RqMcFM5cbNu2GQ z^5xJR%gFMx)48}JY61(6dA6)Q6R9%w!n9-TH3DrpGqbM$+`nj-=N0!h;YEkc-CNV$ zTDcb=(*8QJdY-n{9@|%c-@7jT@4&nLk9Kv)W`#$)53Y+?Q|f!Lsj_vCc5@t$gT@Az z3%h#rjafe%alBZ(j9X1bpj|F_+4GXlrWpkpob6NO0xtC#8cR9-{S;jLWZEWutv|O{ z)Y-~St<%!_dp_`?{^CO$+fEeJgjBeM{1D@s{zp4nY-@Rb$V}tKhss@Br@ObV=9#!* z%SnNo>|X=l+e?Y&^>B&TFvov=!~J;Q*GKlUynEE2Wx2j|*{i5#cJ78d@AtRquj~)h zeD$vnw))MwPc!yE?@Rvo)m|4~{+>2PU}?yveV2~%E9%(9M6w2(uDhCgRjke=aMQWH zW?HOjIxROQZQ43@o$t*L(q3Uck-7)dbt3m?ecih{_UiwW&Z{e4oVN)%=xk`wXEJq7 z^xmSUvo=lIs=eyHeD93^H|KhMHQL<&QJG)H$j9l@fm&hBlZPgSFbV$SS@M;?f9<^H z74dI##n@Q7A7(9eN?aGBrTAs$glz?h0Vz6{1<onYyu<Y7^9B15bDnEThkvC7cV1ZB z_s8|z1C5nh)dynRR&#~SKa<0LJ^aAYbf-kMi`swwK2>Mg+Zna^zL)N;TelsqnazFu zrM!M_Meo77%Lo47U-&=F*&>DO(2ay$eyWa2^*avmGAru09*wO?+;+iEitENPN5<PK z8VTObOxtcRXwa4Ax{;Ptl;XfWo8`WY#nFO00jI+9MSpKO9k%iPguTWsjv2<6za4sG zvQjFcX`-X3fohZF#F!&(ocB3y?ryt$!Z`H*)pe_aesPCKf8lcJ3z?{Pf^+Zs9J8ge zYv-!%IP+=av(JW)`)1xZyH%=QBmPu5Q+@v$Gn4t^dzUHBD>-QDcTw|@-|3RoyZ8TT zUA0Dj`U_jxwlC{f*@wL|I+OWt@`~T5%7g5LR_e=leSiCAn*Q#KYqG0^jRVga*!+Gf z`d&zQ-J=&TtQTsFeD!^I(yLJXon!fRp3gU0es18M&nft6`PxN4pI4u4>b!e7`la4p z`7FLqWnZ~3@BP9d9DXn_C+y27L)WW@1|HisSYN3B)b_65^Pu&WPn}}B8K1r8-?O@% ziBWyO_R7xl@|?RFR=td^lvn@Ib$LO^tV>KqiRM|^eDn67|0ZMhL$B@Kw~zcE&z!6I zDg2XvRgc(}8B6E-G`f__ug+)`Jm0vZB(3e_!Nwh$Mgm=pI!h0xg-_jRpZHL(+w5BQ z>1#%<{IxShy8T4c%hM~nck@de{u1HvB~xqNuNPBd?AOhD7`ACnazo~p8@g#H_O-{o z5igLa-S~%9Pw8m2?}c>-_jPVHc)Ns)_Y?E7r?+_Br3zlnRs3Z5jZ6QN$A_~^AIer* ztj!dclJ8f$y(X#Vanc;M_3bX77GK!@UFRp?m#WJ)eQL{dCnmnmxg&31@o3Y#1?8I^ zBlD~TI9S|H9liT<?YkX+cl>!JJ@?+GqZ9r;3=8}huun;Tiv97W>(9F|S^NI*)z3F& z(ZAySsrQw=xSLPR&9CaQWwS3wEOlfS?muj*X75;YOVv_**_Ry4W3LpsDutOR#T)W| z^|;G+(}XGD!}3Bu<<pm0GNYrIgr2>%*67&fp>Rw;smA-}wc~qoR_1ZH&Rnr|1^2Uv zy?tR};ht_9ZlNYy*bQr5C%C^@v*2&w#GHrrttT26p4e1+_1&sXleDe2v9m2+tsORf zx7W0U&>EHv-?BeF{aC%^=d3u1a2?}+LdSK}WrB3PY`%ux^7Qy58W(cs?l!OFud!aM z?$rkFyt_M6{d&pOb4^RDm`)z@tIb>fXX%{VJ1?)fQlixw+sC%~y-8}3!gSAn4)4Fc zKeJaMK2Jhm!Y<oOuFdc7XUfT|MMcRi(X5zxiiO>NO7~wMrjG8-9}Y^hu2j^BU1gtj zFV1)E>aCp5-hO|1<LJ^Ew_ZAVB(0sGbl)d!+x5QXb3?A)&NxuF^k2_wu~V<5;<INz zFuQKIMEFka3t8FS65HIjZ=U}%H~Q`TN3)oJO@7{UbGyv>Pk;HsWp7>Td$rW>XK>`M zjMY0czWrfyzg8Y3dLZ1n^5nDaU(eR<{rR>vx&Qr@<ws`Tw>!kPrmbOlt<~Aqmc5>P zd8V{gaQG)i=$LH2XCGdFVeR=(a}&$>dEXt3Tdud`M45BcKhaOi;wufF$zJVRS95{S z+hyaYp5ssaZB1jhyjtuwxr}d-)zx|Z$ycq)8XC{vzM0&=zkc7otEqNt#5dK*KXN_% z|M<Pz2i!yF{(SuX-b@u|i6V7@_6Ej9ZazE-i#j@+EsP(wIY`c6VPlj{Zg5FbIFh2a zM@N`Vf1?cl<5i{QZ@X{rI(n^acW(J~rbXHJ?yy|&mp(AxZ9&(pTT3S2>bPm(RQKe& z&GS1mec}Q({;mJFJND0svvaG@*?zZq{?zh(@wv}6@_Wwi4ashizh@!lZK{zful&CJ zwqf5Jt>y}uW!YPE`q#C6KlUqmUT2ue)|owRN;A_=_V96BH+_)wRsL6^Y4&CNqpzg6 zTU*~NpWAPlQS{HOuw2M}dRljDS^BAqzb4;Uxpz(Qe@~YWQ;OYLY|VFEcAv1QYNKa? z@haa;@tvQeXCG2{eL;w;a@F^ovU=@*vI_SEK7L!dPwva(vhslImOZMk_+BQ=d7L!0 z!DR}AyK&Lsb&o{f99dtH`n4<}af4sJ;}iE5^-DIhO~dyH=uA#3mT=&FcAB-j{6Ko! zsuSy9ChMMxzE`o<=;y)sL&1hEtNohn)$bXfn{Rw@aeNBzKS8;-YmU5|{C&<r&YSPg z-hBJoq0lYt@&@G^S;pg*uU-kTuPmAp)3xmXeTj#%N3J(MyQsOt;m5huFR%7I_YnTI zV96rx#RqkK-Ok@w!m}hPODB4(aYAU|uT8(Vn!VmP)AfH_mHN@GuO4qOJsS6@>hk>J z$?8|<8(%H1eb>6{Wb?gq4Uctpdfa_0`J6pAJyLhicc*9SG5LI2ZyVP>y0^sQ>i0C8 zZx5nhgx&u8?CC+r3Zq6_N0Wwk${$>^r@fn>Y>~FbKSw=?VfWLF8~O@wW-=IgY8pLy zo>=(v&4IJdn|@AEu~S)CEE!iZnQ`_JqjzG=pMqL;uAI(ub#nIOE8c47cO)=5PvcSh zWdHHadF_v9X4#&e{pP+}-sdBSO1EA=F}WajOO)w9mPz7;UrcM)P3D){+^PJfg>i>F z^Ze}Net-Af6aVDXzBR(m!=faNLrnUocz!^<$DiJ*KiHbqGcr%^a5267^-yT)d4Ex> z^aWe5`fRx}tM^+ZYXy63`CopCBc5{<48nWYyH7Lo`)j#*FWZjeyQ20Rt=uaZ^xJLX zt@b6~+&tcLPrlW@@!Z8HI+8b!OgVRZ;u4`f&FA*)o1xguFkSwhLL!63J)IBVo!nWN z-f=C7Kkq3oKWD{6i9LEX$yf5Wut{`eH8grK`}Aftw0z*+!@23V@|D*zia#IhxITZs z-;0<wmAmaNHZ3Z)yyemp{{B67;D!9+MzxdsfAHK|;ghYh`p4@8>E+vdBCVvJw1v6x z|KSz(;r=pBwJKhw`_r~%OZED6b+V&2NmpiPBna4YXs&p-wWyr?Yh>AF?x4wPrrb76 z7254$yccT2o~?7<|6AnFj){NoGVI-0FW*t<o><qrQk!2qrp0_hggnzbo95OhrnM{b ze|g9kzMt@V{^L1vy#M~rXtryP&$U`EKHG6yMXNRA!k$9M=mo}oy65t2{(t6H7h8Pr zW!VukZtLrc5!cLTusd~dJt@BAHdXFfeERjp=a<es$vI`}qUx?%o=>|Xw<IU7U}2Hb zb-BNjWlMiZK#Z<iv`5yoAcH^8wtQor?Dk%+Kw#gQijd%q8N3$UU-~~-TuIJ<lXooa z`Yh?7ODjY36Mt)7y*}}okDOMnd3F>3*QDRG#4<W1-YKs+dDV~aCwI=Fvm9TO>o5Hd zU+t@1`e9E->AeXH>WzgsEZ1t6Zo6u5-D9?&<N>iv(MOdFGTPWCwH5u8&A463AJ=u} zQi)5g@2-*;<}a+xR3_OlWn~+BwH;PDzRFjj`c~=0<r@_89<&)8m0z^WcAl;7$DEIO zT6xE|TG{<c2rl%E`SO0&Bc?aXk9WOwX52ri(6}={&SB!bOAGh5TN|nx?$H&joFgnR zSRuG9<?pn!v%MW}hJE~Kz2>!BNbC=@vRHQ;KeOAfI9OCn%ugu#$py_QT^#6KaOhr7 z`i}g&ygV&$h0Xk!y-L4%Rtfx8*72!&z2dBg?0l9x&lSbbs&1RI@T2sHx%@X=tolu4 zE4goV_FhrbP{}G=llJYbb;`~<$^P43Yd6mmcxJtNa@KRrjNE-9yp`M4Jum&spS4ud z{J<I+&Hw!uoes?}2)ouV-tu$yYTm7xpI6&#ZYqAh{<{jx^E2mH@7rotwvYK;{*qJb zx!0zIw5gna@0+vm!FM*lP0N_w7Dc;FNj!U){fp;Z`|uAwAD%C(;`w){P;Rd7kCWOb zR(>d4^XJx-Fu@<Z-?KyYd8?M}4PLPE@zva_i;K_OiN(0}9lF7~Zi`^*l-4xO()t5B zcRysm*=pT$BYXZMzvC?Rep=_Y6voXp{n2Uv+--e^YT-`bt-^nAvj;b3=F7`G?~Ub= z=l;hy@7Uq@(tE4^oMnkJOB7^|`CP~n8aF%o#k5=A^FMBudvWR6x?_I?|38Yid?5d% z`J`9(oFwC4k~@A~nGlk@>h7ARg0l)@yPv--D3??bxzOlqE;mEUR<P}?&_ji?3ziFf zc{_{#=2Yl!5WA?hb#3dfy7M+gi5V(4ube-+%f!dtZp(G0>;J_cG5`McLQlDG?Yn-- zn1cA(Q!6{l_A6(0%f7s7!zuXwP~Mxm+z_V^<yS6l-u*K2n33`iAttva-|jixwRPVS zakn(`u$b4KdTXt}Pcst#OE7Kt%Pg?x-GL_?pKttN=QZ2kPok;p=&Ah4ZM8b=vdoSr zx9DxX!M%r{<(ieC=I@SYDyt64MxWfhWd%bO;|%poPW$Uzdt5Kw(XUqE-)g1EKYLqJ zb;^IHOKfXdO9E%8&NfaqS?>ELa+^`-TSw;^>he`~&F+;hbKHd&HJp60Zt|6#!s)8( z#OK~WblRTT`LFpir+EifKWNa>S=zmk>k(&`QYS}g(2C`L%$g||-u5xd*c`ic)u6)W z_3rH)IVu(MjeX~3uYTOFz$W``@2#XBwH-`<<7=3szO$zr-(kG={h+klm;6H??jK33 zk(4av)ym)TLvfuXbK2g_f86W2lFTn$+|a&p-?}%)&euKZoOx+Q8IO{d&f&sWiQV4% zfAwY?JG|O3@2_zF%jp}nc<ax5OK#DV4Vz#-k(1SS$H5H$*KP;CPd~o7Hn#9fczdef z`+w1A&TyIco~p4uHB;%+>Dw2269wO0&f}HeS=%JWUcqAWC#Cqu%4ZVlvy$hgWwn?7 z;kR$?mdO*dj`5zFv^%%;P+Zi!`TLzX?R)2Zd#YQ0fL(-f`xSTBms|ADh^G}#mOt21 z^WnGA?KfR{9g%l47>@qh$awyu+tw&MC67kG{R_BmJY!Pd<@YV4#<pU0{lT=FR~+`K zbL>y<Pq4K+`}x@C<tv?MuRZZKcw&B=?Oaje-)2?sB7$#bI2Lf63)-7*?_T(+D(C0( zho6Mn?n-P;;eK6sNhei7&i3%@d5*E^SD#sw7Q4^+pLcMvd`ZcTiDdyd*RD+5yM6bu z1FtUXFDZ)uKfUml*`BrOrV@4qh4K&YPt?74`u@Uqo1YvJJd)h!=`Xu)s)6t6hsRmW z3KMQ_e|31)znYXLgI#&=N?Q6kCvu*1Xt_OmU-#_27a#QoSd{VH7YNEde~3Y}%yyB4 zamQU9?feg1>0weQ>a(~v9euHDui)_`nfn#D?l#oB^ZR|j;|BA&KSSCpcHA>D^M4+c z?bjka>(9#RyUX29{rDS^s<QCDY`c-;T#<+7DRn+kS<}+W@=U$A8x&9c#GJYKyHxAM zrlkSRE${tX4wWsxcl-8U6TjECtJ5d#(oMZ!-57P*K}+C??ac^%k^fTvmOL*M*ppsv zo?Pz|I$_7I8|U~R8yrxqzH%+))eD8^3-cpqZ+s_v$RmmO2VY0&!>2kA?2dn4>Zbp9 zUGb9M8n&Z1Z@w>|?=Ng+ym9jN$IHy*c;Bx-^ln+lgHJNMg7&kVEt0x!@%+e%@_q8B zzseoAESecLId{bxgNt|aH<a14b@JTb{_wNmtk`w;&)G<`FG#)dPn;>LT>mhWtgOTB zh?LaK`O?*A_ynrGY9F7op6z5<;^}qS((`XZ+l_Ox9)_<tdhVcJZ2y!{g;f7TNd}xR zC0VNcY9rqJd{-$BnC-aDTtqAT^ZSEagE(Ftv%IXx$yiXf?qZ1X>zHoa)7HitZbcQU z>26S2zQ{KBh{nG}p5uLOAN$@%JWmpHKjD>Ayi%8)G1~E>r<&R~bJZUc%=B#dTlObx zz4839_?I`_+>7@eIMku<CZHTKb#k1$R-K*Zr^M(Vhd+PKnHG6@MQP%f?@n7zbX7eU znpkt#YtF9(ChkKQ7n`Z`C;nE+F5ewo&dYc2wfT?TyCeH~HU!$toS34!BEu*7sjiFf zcKr(3<y#uAioR>`v59Jq+t$Tad0w+mi6ee8f243%Ko^UrMWN=W$uB0SKCGMLl6T>U zZrR~$l7GwQ#;>cNRBQJne$i+5UCX53a%ot_eml8;!}0}lBBuD1FJ;*JZu6rA?Y;?j zx=oGe8=P2w_u`Mnf1UG-nV0T;=}`0Tx#{CyvmI@=JK0soeaOvW4OrYA^whb#_tV03 zx%T`M`z;pMNqj$I{3A;1SfRM{zd1Vnfpxwg<e#OP220dhz4p42%60MRgc(btt^W(Y zyODW+$LkB5uf#9d?AEVUk$EBOg<G<~vQ|?M!}tR%R*iu>Z{~d5e6vaV^WF0=-Ofxq z_u}Jr=kKnYm#*)*QF!}gyh7LA)5=pN*r!%79POTcXj(*v$%!8ae9u@N*`D7dFn|B1 z8xQYp*|29@ghhkMzgN2qf4sV;9sYKg{@N%Td1IxF|26Fo>L&l`-g;ow?}R5u<Tv^W zwq9)UxVyfo;?Jf&PhZ32k8@tDTuWN7+!{P#hxCLUtr~a3XD>Z-Zhvd~O?EXG?azni zTI}^Y!%<?YW>|V@x?r-*+?)<CKZ&_HJzi$LerB$!{yK}lwHV3%QT?W}<M{rxAG4?Y z{KJ#CZR`CGmwRm&y{0`(HIDmsFjY`1W7)|KA+ZtJZa-|gYm@F;WIQ&?^5uH9(SU6g zd;JY#;}j3Bbc4-2o;J=xv#<WR!4Ycsv3<tfE!@SK{62qtg>B4#ZAtQ3BcXggLFUwi z0COE@rt=dn<clwLlPP+!?~QNAFCBT~6E22Q2ZW;xn)T%@Uu@nRCvD%eR<U_m_uB50 z7niM**jDnP)Ma^#U#-Qvm9`f+4@xeOxU5<gk#_9Ffl9R=*UKF{<2ujii66URYcWTT z@g3L9FFd;Q&+l1c$hM}Oc|Kc}&7Rk`9hY893GhC3_P0G(ZrZ4__)mA*RztoMnOrXu zI9rZ+X)>qH5Qvz~v&8Y)w?uB?P45`r?hss+z;Vp+;;s{lE}P{Tzsz%$jQE=@yS85F zb(!szxBe&YrpWkB)lm3rd?(k&z}2ALJnhuB5V!Z|YWg~yX03D&Ev;O-d`$$0%nrX9 z5`q)jKmB8C{jbTv_3-Zui>%G(_t-REEj!+E^S9--NmpNRTwY+JD47v;UOxG@iHL-! zW7U=X)faafDzj~`{P%!o$A5uoype2QOCN7o6k)UR*YP6-RyO^wj>x+E1XliM^F5b$ zlx^o-owM&^nt47a@~nJxG~G_DnC*QX)5^!nQ^FS-3bi|~yjV6ZdbxqryJr3ZCLxc5 zYd-L2ADXc>ye#3W@8VVSj<l?jRetr>|F3XpmSvlZ`K^h2dX}1;NppVp_~F_;&s|&| zK05XBxUy^B)5mrq;>#5e&h+?Tqf*Q$6q7b>lf>V-_3YF6`Dd6oum2>KvTSyDYj?$g zw}}%3uNq`^26gU^+t}=ts=a>4?n%2=E&O%2-`z^{!3v%otJzlvJv^QGMTOa)>tEZy zuCJ3HJHPr@QLbI&d2I3F^c}iBu1{)DR%kqJGOU^Rh3!s1Pv@~E)7j?9be%c8YNN%} zEg9EL>-)nLEYmc1f390nCcEj%UJaRg_SVPq89zRruw~2Z$SW;<4w-YUZDs~6bdhb& z-<IjViX|m2#cE~8s|4StTB;cx7j^5)maIDc^R^kYfrZ|ajZ9B$i*NRCzOdkx{G$zy zOI5?}Xxg`mv?xnAJi29T=Qeq#>&|;hS+9;uUP<~qVO4(Pq3=q1_0DCohj^ZB%V&(_ zt^BdcUVUmPZ^cQCyT&bwDZA>=9z9}~cKT|X@6*8JyBba?|Ca2HRsObR-t{f=OSx}| z*0R|<%uA9on{sI1@%9?=(yzx{{N%Pwmv5SWQ!(z_f~RuN6ig@Y+P!9??4;BkADs=& z&X)_meb}C+nab&BRnOHoE3Rnbv3Gfrkr`$ptG3M&WAzXE&TxO;Zh5!(_wU5^8`z}F zsEbu!xa$2^dGhX(iOq@=4s{3Joae?>zwm6=@w?4;GcJ8Ky47!H;ik)Yp>y}_f*V5a z@ybbTsxy{mTJWT9ao#oe=COM2odqKKl2+$5#ncqi=Nk8Z6rT~D{&7xcK8MToqU+)v z$sC#OTUF079SZ5#x^ltk)w+H@FEW1x$j4r=nY(Pq><c!Hn`cWaKiPR)<fNV87R8nB z2hCdC|J>Br>2u)T?2gNC{6x;bJMMZsd)m7Mv1fa4w5B(#d*`pBHlx?~2ItGuoZ8H+ zFT6fQhRnO6&6yck$rC>5%Av}A?JcSbiIXR6sMP3Kd(>Mt?jNTf^Nqw5tB#Z-lIul% z=59>2O1H5wbenf1-hy|(a7427uE_y!js~x4v*$|Q`Z4&BxXC5!q?FAI^dG$Ixu^4j z+g*6cI=@R@yIBqR7v2A>cm3h*iR*Sxc)Q;9QP;#BvL|Hrcb*Ycn-^1|;5uVb<jtxs z^C{D&R+vA$7<#g5TYZV(#r@CE9?-mb^4X;ZUh~s8<Ct{4q;K&h$KO@TI_&f6o<f`E zeVb=5cB$_<sj%^4>vEa9k&nc;98>wY`b?|h%sXw-ZW64kKIbj@AGl<{*vtQBJ-32y z%-%o0@Mz)EgL~^QZg5hlNch~oS;3pfUH;D@#V|LMn*#MI^H17Ey8ZpJV9mab*M3ZT zG4X_E_07(859Xh`;=SvZMOwXN&-1Y0_Inmz75D65Fh6tr@sioi)7cXvX7MlKy14Cm zXW*Y@$AX)r>pFM*v7LP?RgHVK%ho3|k7+B-yYfoZr0C+4j~im%n7;^Q;(e(!dqd4d zpKE-b&QHu4%g;~zx$^L}lAU$4jx3(5xFKCbqS(dyr-I)d70v9;Qtagq&&O|idg|g~ zK2Hnnvv!_+SxF+*tC@bjVm=YK;QqTee+=cS4^-K$S1&pvRVt<<b4)L`g84Gj$;EDM z-){(qt`EQY<K@HGpQQBWH)bV%kVv@p%F>~dpYLPS&RtB}g<l?7dM&*7=+)PrZlRl1 zhq`)ZPCxE7Q#+?Oe0wD8&%#FgsnT=QL<)>&Rf_!#Xtevj<GGl|<{q(G94~yfT$u4t z>V^B;<fh17r+aT5Uv9pEb$ao>c@H-w@jusR(>WBB@x|wukVU?<_40|&=bR|=d*YMz zW)7!K`lRP#CuSbGDSk!xS%c}+jhla5%x7x#R1oyvBP)4?KQHC1rX0Ifa^txazvnJ~ z>62baJqS6PCHr7zKkr!=PMec=wneSjs~oUl(z-a`xvLX@J?A~yVV=47QH<x>)fZ!o zE!O?(F@Gj%r(@W8#IV`w!n~>*X;lZ7mR7$PNGc0?qha&&UUT%E>)8(qJuB|b?h2UG zDJm$~eSH2oH^J2()P7tlUbF7uhmcpN>$V*<nL20LZskR;4>Ik4&l8)Ms``?{{pzQ$ z5!=MC_$=<XD!nJS)la|bG4tv}YWG%MVrDv9-RQLZTZ7#!;XcmjcAH~Kv!ji5lN9~* zCiNXGh`4smWUH=jMVsBO0O6#Ey$tiD`;I4Hk~VmBO=iz-Y5mn7gZifDKVnTeb>yeV zga3Ow&lYr_wR&Z|FmXPo$TOD}(Gn})xSc&RHFVqgq}5WPUiUkK%-Xzfp6zM*vC{Z& zxDCVAzH+A03c1{yz1#Fm&0V{aea+8(`6FYNE+jb5u&`b&?%k2oTzf<wKMmY-Me*l` zGWA(}b6xM8)m~R5f7D$j{?M-rk~VxY&Z_rvdu-&F8Th%Im9ZxJo2w=n37ws>dA<9K zk}{7*I|(1(dUex3J-iOzat``Ne7SM!52sDkPC3i_{+BAUKYz&dT7N6eN#OnD#^oC$ z+xKurOmXB%2(3S(y!tjb%lRD}SdEPp7x}v%Gd5O~;y)wU;+a*vXm5a`=|y#clMQ<F zyt#b7NQxvRY&>FqdyQJ2!CVo(x2G2*WI6_YlZ@c$WM;g*xj#~d+4SX=)8d;Y-l#v@ z^?`SD$|q(1m{Q|{8S(Rfw0tp}d->%QfwL#~zUZCIzxLX5)?QOX3D#xG8+>@?JyJM6 z%e$fTah{mU#g!RR_u1vobl2pG9gDH9TEwlw8I~qLrShb-w*0C~?3c57rm*he{3rj4 z<EBGC>))3>OAmx7PhM<e{%rBdpG&6u@YV~?^pxrgyB45p(Vdj$7UIDx95`FtxzKlI zvGX^{N3WLnCkjux>h|cBZBa+(v%OOD^tcUoGW7=U;cL6RhvNxf{kfw4H|K9Y>iqs( z$4z-kQNGyiGe%uk&ILWZDV87OY}yfZa7LS~Vb60O*(c9C_uCyZdt&;Rk2%yTz+}$q zT!Ays<o4d@v5rsHSbOt$z_kD23f-a4`NHPjTw_)C=Yf@e+ZTqY^25)iK1^aaoz%9E zOa5<X-iyUOTdX4@H%CTp->`}0JWu^Oqw^v4eoLQQDX8~v5nP%dq1jYmy7Z5_keTu$ zf$mH9>#AqC+>x5m%fOrTQTM<BWqBUg`VIej+~e=}Ke$$L=aWUiwY!HGFJqastiAuO zL+m>DgxlNR1^>Cz$7#D=Ipd%8_rE#$cNYC@G7sT#zAqkH_D<T=?f>1Caj~mSZqF0{ zvm(@M>*{@*o1VK}xwH7*;(eO~O|AHTraeqMaMpt<Yi6-w(zOCR#egTwk1w+xJSXO& zu_?V`qOEe*7USgF6-D<?Xnn6OoH~7rS55K*nT_hf@#5TCJIx*)-CV`|^?fq;qhP_U z(T{)lzwi9FG5o>p=@R#p#rJLz5{$7eWQhGA_|N~W%LyK~7RGwX4JW#$Zd)|<jb4-Q zrl#Em`cLZLe7o9I`_ZfYZ0CE6?rGLj7ftP+DthRwv^mGo)t|dXRMX==E?SyBhxMrI zw$yHg)~P4=9eTIu-of^=BUc;V-<ZB$Y{vbMpGs$+lK(o5tJ_v}_NnXK-*ji2akwt! zuQs0=!u|iu;kXvw@8MIXg^6(Mw_0a+T;yh)6VrZq@srjiCt|afG=AgVdMzsNSK8Gk zf#Bb4J^R^u9;>|UW!Ze^@Eu{Po!=RqUDzxw9^@T)kaQ~W((Pq?GCN8<KilrmRe8Vh z_0QAYH_H4wv|@A5c&<2m?(wOcycH+h<PM)&bL6g>Y?(-OgZg7tUVW}(`wnT;Tt3_u z!PC5AmDII0Qs=+<D)`DC&kUc&c*)jS;$q)~M4`K<mKk%udN=djvdzpt@1{K|uRM`; zt@`nYhK&an*nbMUl4yBs(Z?G%vc-0t^|%{o%=^Q2K|o0KB&FQX`ac5WJFZE+T(@N5 zL%Ap0_&uGbB%Sr^uaLbtjs5lpsdgKd*y$f5vdnJhxTiP#G=H>Zc7?XrfyfIr*UYN9 zvMcWN8}b?}9!~1MadAOf)gB8|ujh^Zjc4Y@Eh|2EN=`?)(>>*%LDQCZGZ}Ihn;kP? zHI~pf@0b<*WV?Qhma^H)6KRDJoBi~*OR+l75h(U%*m5Z~*!7G@&M#$-twF7Z<;xZp zr8@5A`Y2m)Jh|+7-X7(O@4`ENGk=Rby!P;^UiY)hUdHHbl<fcW_QSj@(;e+)e%@Qr z9_m)QTQG5MZdJwVHT&)x2j*o=txq)G7j%F#p`YE>bB5Y!-rN~#=6l#R9c8ylcAj;( zTO07=o!GYYpb5@~35EHW+jn_fzIRAhV6*?L!U?Y?ww&}h!?VZvcyY^~d1uRP=cOg? zGj@FbCjayM>w5|>3T!zYG$XXwT+U4R+uW;FlP1ajjC2c2d#xyJvu%y%=RRlk<I6vm zZZ$l+ZktrodfAndpMKkH>gx?$VbaFg!6Ncz`getQJgXG7UGy%W`r7Tf@64&M-#4YZ z&6r-kDZOHPr|j;t75Y)$B1(#@C#q~uGcv3e>b`EvZSMc8?QFwc-D(MELFL>nGTuxN zt3r<LRW>>&va?kE%rrKi?kM*?whvouZNB)0NFChs?@rN-tvkE-^8eW0ZJHsiz3zk6 z-`h)dEA(~0>xIlN(O<msNXQ(Q$^y;1)3tiOgo^hZ@Gx8@&R<=~`1?)if=?$VYuuNS z{iJrz=F^)G>K*d;%AefMiLN<6;k&HLi-p=3R>T*7xpd%4XVJBOMrGj#+xfmkd$1lo zAYCv&bsEdf<A<j8@O^s~{p~4tZfdTV`y7FS?a5k!w<7&2DymLsd*7X?w#MOu^b`5H zAJa4!77IB$9k6cuQ=on?_gKNqt!bHzN@wpkOPy|#cyrM`eQ}p(_oa_-ij_2L6f6{Z zB5ETZU9yQ1Y4+Hs5}GG5{db$Wz0REF=CuOeT$2vlr^i-IxAnLvx5o4O+L>3s1nNZ2 z^_qY4c-f3Dhg1Ek=S-$N;rCC|W7PX(9cC7roU@DNQjw$6yWRJiwCf+m7w9KXitM^y z{6eM8L6T3>;NP<iS;j2V1*gvnzWyzEf$_6Js?HAv(@&>Pe0{qA27BA@zt@-ZS0CHJ zX!Y@CMBc~yvut$|Pjvq4pYh?#zSpf!jQW>-$i4L_aaD@N4F2FH%g+k7tiN|I?}g2^ zOL_Y?nsJ+7yLB>C>%!jOZC}`4<xS@oyfZC0dYaI2hrgcd8|_+s)HU>0TFgA=s#_N4 zvbu<A-}WQh?W+UrmehEZ6xh0d`eMV!eUjOAxouCTUa0>X-<kcg-<UU-<Qsnuo_#pz z%hk<U%MZmjr)Pa|`=MPG9Q9eP%h5Qd)KNI*>%kwJw%JTpIJDO#_H9w~B~5dST^+T| zU$;(Hm452H?t4P*fn^a>yzZ%;zC6pWPc`~-<~+ISy{;#H<!7x}mn+!4t<nG8X~piK zA8N_m%hmUkoniYLyjLT%f3@jK@zQyo2SvUvdNJ2WjrH;V#;x^CH}1<TEuWcqgX<x4 z&$75@oeJ&-#tvt9M*g_S&CPPLT6)U{zodQ3QiSCGKWY4T`_P8Jj%V+lesZPam3y6A zNlw^?VBu%?niu`ZO*`4e-SzgWGyh`w(;ObHQ;P)(YJ5Vvmu_!8{*6PVM?If=zcJT? zN9{Ad=<E9ksif51jQsrUoN!UmyECGjTIKf}xL>HX{<hjV_P?$a&x|vdDp*p@l{9|0 z99+JfYf<0(z>NE8Iy+dp|30Z_R@?c%O!2k%0|P<6t!wTG|Fcg2%fDZO-NyYx`R^CM zZm-{UXa8UAL(Jz}C#AiMtFQhRp4+l%(y4aysn^a#{ujR1AiaJW<7tx%FW$#9i|l99 z_;+7CK<0k`+UmDi_wPUYn$xuLL;3X!``0h5|IhFG|6jM`%g397_LdzF)zQ9i;B|s$ zRQ&0Ce_uX+z5d_b-pm}&Ur*nyj+|sxVV>V6_=%&sRCVX9aPz4ZrxFj%Pg(z}g*W`8 zR+&uChv$+Tb^G)7awQ#J^H1jYo0+xxF<;ZKcfYw>|3m8SmOB0FuMcePcfBf$ia*|= z`#pwtqs8llO>5$h->dChv;SAQxnJ`8eWjuAnYh2?Y0cgI@B5p(_v`1DC#vqLa`<Mv zSyJJ5Z!+_y`-%n*W$!s0%0iAkDor{Z&YWUjBECZC*`rCDlGIL$P7hiCeM*Q}wb!*= zt)~VvXM}Cuw`-3V_qmX$=HoLC1^?c}`b|!n>u}MB=WFJ-+wcGIrRT$SxBW+(BEQPa zI)2F2^<Mn;lhLQP>bYbKtMM+a&_2C-;kl)z){<t&82cxPXio3VIs56;E<u0qRjUj% zenhBpK0C4b?9zF!K7D;?q}E>*w|O5+`N_|R8op(3<m=GumX^E0{6SxhOE-2;liK88 ztWkXLgc1twt-Q5g`l0;0lF+<$dIx>i=J=mnRv@|CWW%A1mNOsBpZ7T&t@&MP%^V?U zxNLe$fuR)(|Apc^52gxcTxM4?IK(sKn`MjTAI3v6@65dmRoTThvpqj+wCUjD`B}Vn ztj8thi>*+0Ke|!mU*dfcyR=1@ww`5BeC#mKAhSZ~|Cx?<nFkNNlqDDLFbz1eDAc5T z-L>oA-(Q*R-~8eIq1|88AN(`9Gk;$})t$~alXqWqx%a@h`}mtbWzXy1+7`ZA94tTi z>aPbS-%f-~uX$8FFY8w8%ISWwZCALLdx~Z9&tI46rlWgh%3c4pzkW^LSGYdWRIen) zBKCfSdTd4i&X`rczYhHAJaSRkfa`0oo#kggw!ES_2iMrN&hE2s@;=mfyX6Q+X{f^W z+?Ds%m}=LD1i!kwVd;*n)5|7hvB~_LpW*$@c-!mS%56=;C2L|nTKqY~A$YuDTl&`) zWtUriyh8EvmF)k&1l@1AwXA*Cj1|cWm#?-*r0r`w^Cp4m&$XSujBe(~ep?_ERI7OS z+;xxMc@H-!-joSD&wZq7S;B`RRhO7M|5O*`wkvu0d%GED=I^p#KD_<D4To=&`G=!3 zBv>A+?09a-w^2d<u<mp9Gm~Cc-tn(vFuK>w8zF8i{h61MXWNABGe5?@dpRq5;e%o! zOT};3<X6x2D%QEpR_5FE>ryVWiu>D3%%$C)ejl8xKRnr(s4&g1sB3Cs;n!<-T>U~! zq_65NzQMTk%#u(y?`!KM8RO#@oci&oTYu8E17?4uKYW|G?dSyFcg^{?o7cO~mRWM( z%<buBLVG7Nwoc8{ihZwnj(OX$Z_2_m;}2`tY46#lKlkZziQO}HRv5Zx`Cgf)d)PK? zn!=q^F;7(3OlLZa+ZLoukWUDh-MG%t<J^X|az+yjf>f+F8RVyLi~MH7&(b;Xrq}XQ zdp|v~t#7vd=6!Y^d!2HJ;@YdLxmnKFnus-TF?a7eZ2YZLZ1%piCO^p!&v~kn=M}Vn zQ(Js<*J}MqtNUGr_Me-y{=cl;_1J#)N!w>E?VQ{FF(+HJ>CKfz3$K4abE&lbo9|=w zElUH>in5lyvP%%ZwD4gBgQMP$s~b3W#QA3~G2PzK(ksXynJzVLvUK0Z9Y^;!ZM&Vd z$V>d%|Lq2DrC#A5cx}{f^*@ezd8NF1ru%D$vi(m3YkLJ>Uf#-;w9oX1`kjruu89*e zA553(cyU{zZRZ7-wbECfEm3rtw_9NGWJzoBSthSDk2l<!(Xu>!)=7!Y^CukMf9Rm& z!>tjQ;`-R8e^+9Q)pXj*dM3zd-ZbBt)hlF`r}RG)`Eh^h&ZEjR<`^8Yomj5ceRy83 zhQ7A;zUdGBA4Rybe_f?};Ooq***{KR`@}o1*Yv3U@%H$==>^&5nJIZaNBc6~9Xca; zWBrBLj#G6$v$OR+S*vdemh?Sm=l1@-fC+<hsJ(f`GXrm>vPXa1f0;-hvYy1^ud`K( zz5Bvbzg)9Pd=nRUvGf}=3)LPezP{itYYg)pHv61uTc@=@xTci8`*4oQ@1CP8*Y~9> zzS}LI8t2dUb3x#uV+?A$XMQ%}%aeE(e9^xs>$(4f=apinqWqs-cYP>SZa)_5D$a68 zaaT68u1U*t-do{%4zJaj=bfucTa><`a>Ioai|(nfzAc&Rm9fD<^8r_;KC60w;EaVg zy52vPo+;{~Ayl}pK;uuDd|~^7k1P?Q332bX?6-ODG2P|!*PZU=$M&AN5GuQ5>B~t= zwjBtXI_LJcXdC`La>wTib3|H5?flxHu#d~-?Um>MmiZ~|Us+Kf=K6ch0VC%h7v>$z zzU%Pni^;Y{$<wADxm4r)&2!`9sgZYnY1N$JTgz}bcDZ9lX3wsUJ^nJa4_`ib)yj9( z>R^)j+me9YFHiW_{|eUJUaM|*{8hRA$$dA!>}=_N8{?d(edSH=ikr7Z-=~IdNe^^i ze{0GTrO@k{7kz~#qbpR>I3lK(`WhZu9WwL5YEf4=n=8w%Eor#e!n>U3%AE$ko4l@X z#lrpXmTtH-;WSUJO2F-Pd2%Oyy*c_Iv*PhoowQ=R3|IFSgN0{G_wX$Idtu}38C#ge zV&){o_NcBEzsK#hL^P!%qUhBj$sP8gg*Q+1d@I(!>bu51QvAEoxkbw-u*qKfAaG$q z$1$D5>RUhb?+Ec}OO%@P?^9|*=E0Mq={-B=|MXFql+iHHP=B$%FUyli;{}V)MP8ZJ z*S-3+jMb{|0Z-?+zML4UEoYye*;ev|>E{$Zzq5a1?in-Bn;tlO<C#q-Ui7x_X4&EW zp+>>{hR~C?P)^CWOC;YVUMLSLUw&so{+SHU+l!pm*Slq3F48|;Eg<qe(8ivL)8uLY zVT~jm&mWvYSA@FdPq+6!-Pr&1@bOPVHt$dKRtCzSZtgFAIQ_$HukdBhT6k)o{}jE- zB5E={UwJ>9QC6_-y$R-g8i&&!E_veaank?8oW?~9zBsKd3Da4=f?Mq38N~;ze-50V zS?*XNdZ**hZ$Fkvn-`l4En-&GIkBah&y?}MT=mK-iJgh3PN>+-;CijP|ENsx#@cOD zuV*k>e7ZR6QoCf|sXQ5j$?nUi=P{V|)aAy+YprKvTw3Fu+LBz~<7w_FB!2T}_roKf zPHpnFsrUWJ^rT+A@LzssbD*44<F)_1fs4K`f41-8U;Y0{J6b)N4?UB95-hgpmyU<1 zsllC)r*roGX6QMwkaY@UKy@2qKsrCKXYvgPnMUTBGwl!kWtkIs;5^g0R*`>vEORV5 z?#QmHuy5VvWK}NzGIVMHSG!@{m1)cSnbKr;@UrHypHjAGTenTR)1hJdHXCL0z~jYN z3d%wyJp$R6&iyZ_F=y$`5>~F@+c}w0VbN78*|T+9|0gC0<R(oi)GrJx{JFVdv1D+z z=+<Rho_-epbou9eoqy?e|2I!L&9r`#*ZND_pRRxAu&Mo}mh#E_KYUFtdLJ=W<JCWK za+zIA;<ZM5{qI#~Q=4bCY<m3ZRgnb0>YB-|`HPo*VAIQ3xBZ1y^Bn>AnDm!g!j3Qh z`erTrnQ8D`*K5VIvMp0GuKl!^;n11w>ZfS;&0VPPb#daH+(mo3)HFlS>|+m`YqB$O zV#?M_p(hPq6wl7iTWc|Momro^v&5aQzApzhg;ZGnI$L?isN;$H<Jl_qtg9|hi*Gp7 z`(*j#farg0PyF6Yov*m@yOPk;vORy!==j!Ga6~EYmuYz#uO$6{cA<=^wj7t!JoiuL z0Z$E1UQd=Oh>)1NnZtI?9?ws{CibH3sj*x=>LssMo$&WepCHD(B|_iqvMXEDw@O<v z_k7<<$*WTr8j75~eE2>K*W3k{-7ZHaOjNib`bu+4W}L){2fj74TI@_)+tgc3?#?@Q z>&8zZrVZ1!b}kYyIV8_1@nOHRw7xt4ir50nCX*${7oY6vV0&zv#m!;)@?d&FAxqfi z6B_0mqP;IgrtWfE_S7`-lC;>;?P-dUbEj2rQL}sC!)|+Wrqmqg*w_!^b*sIU4L<W- zsaSU5soUJefq5P+{~C*q2w%C%SbXK`QnO|3{1-!Cn$(MNizb}1bCz*e-0f-^#avs$ z6<@&LvD~9ba_%CtSD$mXJ#Y^=GM9bQ`UAc!@<Lzg8x%5JBVB)UWHmPiag^j3r^UFm z=YHaQym~>bfOz_)>Rh3%OFzY|?$zo4RCP@ARh6u`$cdYdF>j;%V)w83e1vJcVDq-! zxs$$c`&spV`HTAHoiEpwC49UUBpjA-Wx^BhAm{1jvb=s1;<NV`MAe;Tb82~>n(^wL zs6kfV#fIJ>!CShe^}L(j#8%wouCac3;LQ3X3axW@MA@3zJ^Ji4HC(w%BXd;*&*8JP zxQw`B7cF;fyK`@r&#qf8%Pw5?OzGVhFJNo9*1$>a3%AfcPsiBRDyw|itiN6E+~CB0 z>EKC`t%lw?%g-(0T5YIp5PxcKM6r78B);5;`eWAf!lWJgK1#1SSop^5Wd4WfoXmL= zKdL_1?z)i?Iq9A4QnPf{+Y8G4V(J~&>^RuIbv`psVDOwqSJ6<5h38mTHcmOhbv;^B z)OzX9$ScaaD(~VxHodCuZd_(;*z<G6!qZGTuV3Y~+~!LyD132STrYLc`Shu47JXk( z<FO{(smS)##=mBPUyd9Oo%H=r=gcE}RI83RW@($R@#HubI9o0+!C{86pK!VOhIPLt zTdOl>AMs^NNS8b-E9D;%5qG-ckoJjN{*QlMyw_{U`?T$(!HE+ueRgcvemq_8(rYov z9l!TnTHHCy#j;(_?v!OokOjMyUX|vTPzUYrr+Am$3En61Ao^f=xudXD)9DBIy4G>! zZ{lgZ`u5fR87%re@xnFUc{5mq`Po!b&X$y>Jj>MUtyJ6Tcsx~j*C7!x|B_0!9Cu@* z)>@AJ-<=b<LfieC7fdioI<fKW#`?a?Usk>l+2(vrYWdp#7d5Xgt+6haer5A4urp_M z-txpArEIS(@9z1I?`KQ9Et!&|Rlj4Bw`geejmeiEAD^I5u}#YV>$Fqthb1=`Y(4AF zwz0fPp(45CtjHC?Xd$P@9^pd0vLeOC*NF<sdz`Z;8D|F-S!byQsQ3IT`Dj!4jqSh4 z3Gef~xw8L!f|V0A-9pZbYAPsSI3%*=V%)?zod>ypWhmZBn8L(;qUin~QE^_KbrZg` zeQPjW-6YbToDkk~?xOgWmk#9_KI*J{4}L!yxWUfg+&iBK({Al+^x;tu`gBvEZs*xY z&4*TP*x;(EAnTN9P`2!_)NbK-Rn49q^EgZc*^I&qZ8T%+Hr<-$C-#*so_*aJt{YYC z)s|bj_cH18zezcI;B;(w)z6HGwGI>abyx*2WWB-ijjtoWSnxliOnTUtsILc~Zl84| z_TAb`XMS|G7KupMc_r-7y->DcMP+ruvlaXJBpwC?&A!z7`R=2)D^G?+C%$~4^mDI? zeAvx>59BL$#e4gwytLK%E8`#TB=&U8nmT@Ib?#LD_m(0H_wJ2WKhd7_da7PN&mNIK zEb~s>zjLOPFJIn<>q+^6JDfUR$M+aNaeh`6K3$#h=D+1qEdP8@9Cz^Xux>2NkP4OJ zxcl4U**?|e!c~`M_RX)j{^<4RQ!A3Ro^KIq%FIaQQ97X7Tm9W}^Yv4V>FhgQW*yqZ z!!h&MyQ>;klP3EdYLIYvUE-FlfAT%ox2*nS?ebq)s(;R4n`y9nBkRBPxnCwJWNbLR z_6f`6R_0TgyONz<l>V{45)3|b>Ff@pr3($Fv`KS!MhjZ89aAzcc)Ts|PzZ~qM0Fi^ z@Pv(v!zDh>wcFI{IcxKdg{8M2vu|14vf<#zdA|*E+D?d{Uo2>x(&Outt9|-P?$o9~ zPh_1Jnoe`gy1i_T=!~=PwEm^b*8foWAAIb;&7tkx(*@lH1E*a$G}U3#tv#Bb=9Wu} zx$U_%>zks`{HEQl+m%l}keYILfAX}vl@=S4u1uRU!Rk?h(kAJnrOGD^b6xl*Ow(R8 z>HVRXcMk8l{;FfU)ea%&{~5EHZ}Wa_-ul?ld5ea1&4GjEZ@#@1s5!7d;pFW?Yxdcd zx@~Jqrk879t)3|pzI@w~33u~1sjl^##2kGyt=6>kD&x@)a$*;bCR)Cd-pl{t`5VWh zOCn9q3(Uw?+86a`?G}xxo1!{@PYzx7tL}V`_r8;}=iQFtHkukN<)CQE*vMk0Ji%dZ z<gTytFTPJ+^VRVOOXeRxrFETKgN{{xD*Nj>zvQ89=>?WES3`Gu*sRmq>K2q6BAw0} z&mFEV^=T&W?ZXG6f9zO#@7jT2`@_2b4$iRM;rKS%HRg22TdzfT?%9gUJ=qtny!idL z;P;bH1Wrh4s&6SgXr?gh_7o)@yUU@oYnQ!T)VJfhP`G5q=h+Dx=lV_0y=-~y6z^l5 zzD=SQ>y6I@En~hb#I444=$yo(2yvP9TG^`6ay?5PWM19wH{tu=DTZH+dfsks-c=S6 z<63Ii+$Vc5;#E|8{~haDc9&k>+4`lf_F2~6s+X6}alTqQBbII2_A|ei9o=|t`DWHq z5w_>j%A1cRUz1qTzrA_grwPGU-}xRzeK?}>zuoG;>qTqF=Mf)Vl>R@Q=@R?1*-Lfn zt5DVWdh<o!UGrCSl`B~9YA~3{oxfMYXURI%W{zLHJEy;Rc=4m-(}{V{N*}Bi+w*Z1 z|Fb)CTPk>W=mjmERNnpC;%dUqm7CTi>Hm7Xgy+}JXuqf1jc5C}l=R*1eC(L;xY5*Y z(Ves0i@7iB3&{#L8$T?a#`|&S1MYhf9#(vpY-2h-rtYrvTeWx{yY8gt(jmX>*2(fr zI?OiRMJ7FY?z1AFsedO&T+o|tyFK<_+~>IP*uM+Z<+fz`_gJlPURgMAg=g>Q8<|HO z!(|Kadc}TzS8(^$#L}+0S9$mOsw}$v<#nR#i@)8ImwxE2o49JtrPa+Fiyow2V_JP{ zO4hkTtw`aYKl@c<u2s9_nrzej`RBOIDx0LhXA1u!)IAb5$6I}2<A^^jK0)61!nV_k z!%l4$UZ)|GtE;<`<Fw8HnF~C_7oS@%?EBDmW?=e_$%dJ?Zn$5QIzKz>l3CBO6HRji zgKM+|lUF=iqVLlr7AEbm?bGA9Q;s_(#v2DNH9hooKX<>$I{B|V>iBK+f?rQ~o`3v= z&d*Snl~biZX|LS9?d2T5oP}Pw3mASZR%f(Mlljsfv;V_?KE7xBv{#>gs6YR2>8&^K z<xct(JY8%pcfw9tUMp(GU5~J(tJdeF#0W~xmfZP2=gB{N&q*ci{5n4-sr`KPOyJH9 zk>(2`a>kZk`?ngN+GFdMdy(Cq!Odo(4F6+Mmpr|!*9m3G5eBY5xmtqDIkxCBH+_D4 zfqC-A*)RB*SFk?4C$Nr@F?!aGtje?e+ZEDn_PM82Py94bzKCIJN57HvB4r)h4bnR` z6W=$u9WwJjZ`&K-yYT`8hnj)lL6&E4_FvVxyX`;U<`lgHOaI2NOI{u<CYoOFo93F# z6?iUa>E`?WsjqF9HQYMLn0G|%(L2sQ=lvy1ja4h=SgweYh}fmbvqq?3*)RJXmZv|| z#Hv!0@;2vlaqcbJz3kLh*5i|>eYn(7uq}o0<n_-Qx(eqHXG!+3PMnux&NfYQ^Z5ul zlPfXqdO;K3ncfkL))2HdmoImabM^e<x+A*1cJnbEj>;ou0)HgBgrEKjZ|TS`e{hoT zU2A%!Oy`uV?>Em|m{ifsZyx{U#e%Sm3rwvU{Ju|kwI&@>DKfmA_GP+C{53O{O=W9C zoZnhcKWsfy=|$Do-VG9E8Shsu44H4Y+i=E`wl(`Iww|6+=9lZkd+dPfTEV@ghWfD! z`<)e4r8N_utU1oT$icoYVOPOlQ5|oyDfw)Ttd%KuQho##ulg^2QfZ4tWMadwbskb7 zyRIyo@@|piI?h&e@6G2o%=+kA6(>DuqN}8Agn!5!e@=_d4p+=G^FkN+1f*NtJyup8 zq}D$1>Yce+v6~)rFJ3)Ke@@%eyig-K;hk2uW_)(~YdGOEcaZiP&6kfZ-dQ%w+ChJ^ zG?%q!;(P8LOlOR|BRNtgnu;EmTf?N_FH+~j^}Ffr#r3|A);l`s*GpdtGz_Y5dK}-^ zuy?MjXNTA_S+S4=Y4s<zyA4;}=9~M#_{4hAmkXMz{$v-HRy_Z`{qynGTaTT-{YZQ9 z@Mvc8vdW|vkFG4R`yTr~|Kj(4i>k>19TgfglOLa`p7A^;ansRKF%|3UH}9k+guear z)J}iRx4rj*TAJb}xy>ron-TonFGfe%k26nVR*$EhN?&%pXZ!Qw=YQA)l{-b321Rq} z9<t;JX7@g7WO%f8ThE%Shhrr-9(R*!_$pGT$yj^;NtMepm-iN72dhH3Cv3US=kt5f z+4_fdA-A7s9+G(bm~Y4Vlk0Dm>@Z*P#kFbsSBBl%Neg%V`ev1Q(Ej?VJI`0@&eZXI z>hieM-74nx8_hMdAM~+zF+IBVCg-$_)Q;b=Juj~=dmq=9-Ev7dwTAJ|wnr-Oq*Ko> zlGALj@e=o9eZ=~s>fQ5AT>)>-FQ_P=9C@ltfjh%tf_L<)qtn#h|Fq+tks|z2Vb#2y zcJ<S$J;N>vYkcReJa0B_kJAyIq}?(5C%*l*X2KJ;*;5)5TVMIV+rwY?;-TU!&jtVb z-7B_5yoiq1xuyHyyy(WAZ*Mrx+;RWb>NXzhe4CmIn@?8p>-jE51l4Rz>FvA`q*Gb( zn^*XxcVKi{Y4}2}8z!rTrRzS2IKBuASl6m`?T*7|pA9Qw%rktqtud=q%V_83*f()H z%X+r+E?WZ_w_Nx*<<sY!lQ*WR{#%xGOeagBZ+nL0)LT=QRl0S}zqFR^<K}IyfA$=@ z8(4oynpsHsOdQX-D!;mIk#-fA{7%l!xwT)4HS5OmHlI?3^sh55?3{kg`DQ%l%z1_5 zOiO<ro5UQvzM?{9Lqy%>b?HkZ_sDLlnxNb6(#TjU(Khv|-QxFRyKFq4Tkr_kd^s?s z=d#aEi(cQg>h6UnUj|J*9C=Wf<Cavx9>2T!69v+)W!>z2bWHP#_GXF2^|o3u$6qhe znj4#baBI)HNvAqI^D@|?lupF0H)dFN-Edo5uzyysqohQ<;5uV%LADKCTaPbqyjJog zGG9S;b<Y(`?kTbwp}BLf<~E;O9g%W|NsGx-$tSAl%Az@IXYw4qGXG1DJI5WR#Ybnp z`>VgzQ2WNopwv>vZu1Hgt~i(5OWLn*>i_D!NIfkeljjxN)Wx5&uP!?JdsX-}=~amy z?>f%zQ26EKn0)2@`I&;v6T{RaKk>@_-QVq~`T9)U_XG1cT#639aN;1#>NoR@Kgr#Z zT4?RFMQf(znPZn$iR@D5{NlX(&IF%3Z;K9>JgS?#>$dUT{6mxC>yItp{ovh1>1$pe zBJwoa?B8Dbo3?EC+#S`GS^A~lqwd(+$@Z9py|4(H`Y1kaN|RO4)H5rmzuvrXZq!=0 zg!#Qrb0_YS(p|UM`YT7{rL4INwp%#a9Tr{}{@qIbiM$nC(ihP)diE~Pr}U!~-tY9g zeMUyxnXM|jZsn={6`u?wt8}*h->I3L!YSV3ynoq`-)CGtJG`2nBAj=$^y#up3EM4s zHu;VJt_nA8jI-U+-EiW^JkD3!QVt3)Zw+clyz<xR@$|V9HIDf{36a=Pu4E}Y@8ELx zBl>OEyO~10wLc|p(evh7($RQ4AZLlCp=^)&fhBJmIa3QuPG*_+xBT?l)z&(_>Y;H_ z;AG3lg)=n{MihQNkT@;x?*3CccN=H?G&Tx!u(b3|R#@57xP*`Q^8=PVB@V9Z+Y8Pg zlJ&Z{)B5-4Nv`LQ7fgM!KfC2=`k}bg1DmuW>%Nu#OxRuX;p>~S^MN}Z&s^aZ-loH~ zAz7mB!_vChfnWA;?D@=kBJJYI``L^~3moh!)P7HS?)h)xyfZeBPh5Y>kT+q4?lJX= z%WXSs-d67TBawN-bnZolr{(rX%-&YbH1*X#u_7xtto%?y%Hf$7t2K1KuvYC-nJXgk zLfA(_-{6vZ-N`(kEgF$~J6=6^y<){})_F_c_P6TF1wSA2TAkXY-d2!eXVaJAEV+8I zuVg|7%lowNlfA|A=f8KGpp>{)>FmrM35us{7}9^Qk<3_Y!Ejo{?W*hv_FGNw*|=t= z)RjE9*lMZ0{jRy4#PWZN-MaA?-AopQSUNpb|8A7CS8J=Guk~Ywmzx&b*DqGFzpWx~ zb8Y^9PyP2ZTRAw=YaVa;&@OKEs=qQx(esnf8hf?t$tDaxST|X`>;0~+c2e27@8frc z$&<g=o{?*F>EGydyY!OJVQueKJA%S=z9?GC8V4*Z`z2Iq^Sr`z%HwX!IfvhD<7xV1 zAr@{uc}rT@>{q{UF1zxyWWJ<{)`ZJX57;kUUMt4@rJeitHvMjsW|e;r_cAW_+$-_E zTiJd0#d(2yXS_0A(fjf4)Hla%?!Ui!tn#jE&c4PM_iE+unMyl0GiD|nKM)Y%xIjy= z<?mdDN3)yq_1zafu};f;x6(QHz|pjx8Na2yY%`ulhDAO47<TwgeS*}jg7`+q4RZz0 zss6dVWp6{^va7$B^Luw@9q_)~{_>}w*>laiYo1mV95YBewOwJt#i@A@UYBe8-Pyuy zyl;m@qPd^AOTqKGCbPAhF8pQlmof7VH;~+QSbVuzlz&ST=l2Kmy7+IMmbv49%P?!H zd(uL!nbNjV?-FN}>~hnWkI6Yx6A-T<AG7S>xAjiG&+V9tjn7|BzxB~Xq*UJ7MWskA z)MR<Ubw-I76N}F++_6g{d3(5VZ^zMfRR?tLW=bt9?#*L8*!Ly%e#4^w`iU-&!%V*N zM%1*Yikh$dEiU=>o@hz7QS6i{wQL`QPApAO(pf2d#VTUj;}hv7_MI{7>>tl`UduKq z{X_lX741(>&UoXyWL<pFQ-+^Y0y$2rg?E-75f8e(sp)=NI@5=xLY(PS0`;%!yC-+- zdh*M0J>!>;dD@Rk-!)D8vQs>3(&42Oy<d9BZ`e|q6a99tw8_5S_!slmCDxq!+WTgU z=lq%cua4?>GW{u=D0us}=iT+rj<Y6Q<-5Csd&=R>b0*JEcKk2&AWbX$XxgT?ufDa{ zoOYOIC3xxSYi8D!|M;a&N*|biC*9a@a&V9PT*iyuHs{XlT6nrRy2fy3-{y)KwnM4b zw|6KXH=cD=ZPTd&Da%b9SKa0RTCY99^P)Fk`qQ=t6|>f-Zx-S;vDiC*^7#n{ak2R; zs+XSNztONJDR<5R4=1-WrIsh1XFW6uORXvyrRMf#y->7#kQ)7NZkF(*1%daDYQE<P zzIRabz0)bj-ViI}yRnk885Ji_gnW?MF6lX=QDqIAkY2L+ol@Zqmls!XoW13o-K3Y( z#J9?XFP~|_)K<d>EiLZWU&MkKY}?Y?yzX}jlzwl0S*bls&crb<aCWeNOM+F`f)#sQ zW85n*J5M@yl|A!GtcUf-%43-yU6wIly1&Mr?dAJtaz~qAFLsQz>{}GHqE6<UgSzvq z8sS^9Zxp(DZan$-)NSuk>wwt@4)vBFI5hb_<IAk<u<!RD+s!MI5Lq()XXU@=OGKAV zIB<B^s)Z5fElg9Mbgizkyf)k6E^}kPjYvRY0Gs;aO5S5{q;A}8DK=vh58kTUop<@N zQ|+^|S~Z=9ec>mqXYLDs&A#x``_;{C^Lxdlj!d4Z%~P^f@$r@9S)ZhBw`O~-K7D%2 z%)kB~SAsK}CTzTQpk+-&)Py-3k1dEZdn9<@;aK^k#APWp?9*KYLchicEWVcVjah~1 zPRjAjFFMjj%wiXkXUyaL#Bt_IluC}ZM}bk_Me~eAE_=N>hnM|e$-3OOQCY<2nBTTU z_0R5Sbx!p==BS%B*BhE_WS)H^ZNm*Kv!v-$W-r}+gqfcse%qm%saI2voD!=0#b|c! z&+NwV<3Z8vSCkV@Z_;Sbp7bmC^H;gJnRBc>PB)r}bZ+C}vv01CzWv&nx7YlX+ePb6 z8Qylm6wc_1rYC#nwewp@d49epJ~3hQd6vhYuXs;7A5?!#y8CIxvDMRE@+a*5xm#mm zx!|qGcXFrYIT~D);aNJfd3p5C-}Nce-mSCza3g$!*AFi-&iF*;`kc!giFfx2B??t# zC!7j;)^y_I#C7r?4f<IRg>0)_<-K5yU?=y^{L3B7U6)3m);1U67AlLqe%AS{rI$K~ znaejOPYs!iVsF*reyUFX!Q3xpYC22SAo-2^+j54t=TA0qG)Ol!Nwz(>^W?*Nv)PTe zZQV3ARc1b`?C|BU+~T+(?>hIr%tj~Mmp}TSzfbt)BF3}YSiX1N`<wH-R(O3+da~u| ziq8A_)7~9jn16TwRh^pwVcYGOb52-%howbYBJbN7jwrbh(d9AG_ssIb9xJ{L*r;@A zjakvhMZQTfm-8+(eBNd9#pc<WcB4;mQ}ns6+FzS^`AXqDJu?A!-FpIU(r+}Hs<)o( zQ2Ts!OM+_Y|3-_lfKPil66QY^Tom$X!GF1KkJ5jfvlHJZ@0h$}`NhQ(%1^9k=2`XH zzL4kerRmpaW=vbQ;B1;2+m4NI?<Y@7dw1u%Lh-l4DGh16*H#p!>UJ;beVi<M=8x{x zquQ&zwX#pms6SpBC^qlSM>U?cR#i)Kbz<WmUUAE{J^XMVtL~MH?Jr&9)<2(dvWn|Z zjrD_WewmblWG|bv2fyF+Z<JYA@is;9eBescxi^Ye)aq?Kzx-QM^(wRcNPYXXhHX>j z-@EN!>nrzOZ0A2F=h@cp?f0}N8u>3fZ>ZhBeBR|l8%^>qg&Es)EUoAX3DGpav)?n9 zuic};ELHlIWLoCKf4k32YAV$HB*<KP@ifmg=@k=S*Eh?FUQoOzdxgDKXWf#mp(Wvd zm)Wh@+U&KKCiG14-BKofH&wLX@#wLN)6V5*m#>TR(Oi7(lu^=rcFBij!gtOcWjMR; zvj(%>x8{O9X~LB~k^DPXZ9Loc<w9DIhO$xRmF4#xnd&B-+kD{HeLmL-$K$%H{-^Jm zyQA~yy#5G<bxJE(OT{l1PVmf~XB{zv$z1f@&&Vwa3oB%%*q7d}*|=`XuJf1Oze+rN zyL-)%qitul{_62R%J;QslmGIv<140r$WP|Um@q+{UwYry<`aSZKgFs$ZBJV8`8rC( zX{7eo@5{fZVU~WIVNd3-i01s(^1Dj9MgE+9`=3e%q!?F9UB8-O)x-DdKjZbI4K)#R zmCT#c9=u+9O=;_zkGq053d$vK4vIY9)^oKd{pYDk1!B2Mr+Cg5%D#8b*u0EC>4oFA z?fXxAPA#>u`E$uERq{E{<{4|bW?38!xGuCPgRx+i-IckQ&h6m-w%*XYTiP%olk+%t zuf;Yo?$i_0*c(i=3w0H`=4zeRIb{|3*N)qzTJF3{?RGXkqg!ht_4jqmePL_=Vk>*i zc6L4^F4_7Enm_gTtq8t$$i(1sN`}-Ut;Os77p<(CG1L3H(!8a~x=+Ms|H?I-WZwGg z9Q&T_Y*HVX1FZh-vc2#@=>O4Z&0tOCQ>*G`|67r+_;qSv`P=UWD(g(Vy-Ol~PnVdI zl6(1m>6d>g5^El*ZtT@sJ?q>{CeK|57OOqlb^Fo2-D$4`ntuG;pqbn4m}|^p->^wF z-%i(Lk^G|M&KoI(Q?4F~h*`a=H`hy5&+zVxLMPd+Rth<VMoAXdVh+OH?uJrEv1`x! zoQYvR^uF0q`y8jnQjHw1*t1_9uQ%%)^yu#CF4Q(>jy&|XqEamFiurfd{<NMs@!uZS zeLdx4^XZC@$~*Iikzbn)PFxX_NdMO_)%i)`tCRcJ;H5eNvstb>t8vtRU9cjiWm&+~ ztt(T{oZVU<5P9tQW9I4X?2Q&CTSERn_DtIzU>_%Q?3)m?|J$d|5xG8>X1u8U`hh>< zQR$bJ@&<++ll14voeGdH@NJEkJ@Mzuj_R!}Kj+=osZIXRUGV+qKI<EY1ahCuPrtuu zZNv<#BB8vMx8&j&<c@J_oaOrMpkcnM_xmB9;JhWLe0F@D?w9M6&64LcW#)tz`g8Bi zSn1;`lbD*e%xJFb!<k(l+osGsGSBVpue#Na{Tma`D}Vm{IOBB6W%0M+T@u%gTXxD# z%koc8+;-_^%zZ}rW9<DG3UcKRdMfhtmI>JJ=?}Qi_sp8P`&kf6+1$p4BV{Gxr84#t zbZ4|JQ#x_vMbYn8KI21YEqLl0E9QJ=+HK~j?%W%pzCDt=;Oru=)DnqRCM6<u?K{{r zzP|cZ_uit-vAtSk{gMr#pWaMZ-SuAQta+yU<qWGi^IP6+b)UV<=gFcfKR)>_T6-5b zW_@`4u=lR-2M${X!$%YC{(P`|^~zy7*Rj`fuJSLJYN%hGy)<<P@76tEFBCco?RQ{( z<tw{&^OBSQn^(@7dNSkq-&3<qzx%BXyy<tvC8X7T>zBpG?dhpvsU4nnZ1py_#($2! zIPTM6*ICxyFT11qO1S&f+E%8PL*m~!7FC<g>R(l=b}*S^$2q=rMy#oq#6Ha9eRFC5 ziT{i530%JCoVvTelg*01#rZ$`bhdESWQWQCx4Dcq=Xwu(+%BScATe2J?g__v(GTV& z^6WbC-r;evgn{p4{|@1st%pkl3xZ?R=Tv-%?^t)%RbMuWQ`S^$)xq-;tDZ`nU|WBV zulju-=fV$GYTo)!jNGFVQyVvxRmMH!V*IBUJMVdv;*_cOK^qhAx+UK3d!@V7^mXeh zclo-M-3B3I2F|+|{JtsP5V&B%AFE$q+!m-V39S6b#(ax2?c@c{KbbO2V#mstDU}@2 zIii2Y>Cd5^X_<#kEe~%^bZ~2KSs+lLYQVvhrxPRYr}6B9)*sU~vp&51&-UhU_J7W% z`aXl#-U1cZre0B~xUp^1oXX;B^*@f@=r3lq_n7FP79Tp(|BvWHyL0W6`l`4$KZ}z! zlFshvEsr^zzo+f~kNe{LKT7?3Wcugm|Cv9!{WPARX#Sk1{UhpW%fqemD^|MN#d1zw z`8zw|!oof26I?QLcy_t;IezC?Hh96(=lK2c`ZmY!hh+NBhDJ=O-L&swvF%nn7vG!5 zugFSVojxZ)u$7HF*i+cj@7DEonFo_solBXZEp9)TtLRG#FK=dPSy`c7TlPuzultT1 zX3V#%OEeM>*~pvr`QE(P$W1##R_s*M`FDQm|4l8H@xEcVqv9gjHW&Tf9IwN8?y|~( z)jFmB;wSR#aEO*&S5$dvR#NhFQ_T;vL@Io__NcMOO=kK(+p96rZ|~!5kH)7lTsczF zTr$U(9(e!1GU&lH11Ih6z7@LDs_%*h?Vmq?;>v}mCBB)=h`s+}u5Ye}%Djs$M}lKK zVkUY;d9ZU^_GsAK*l0!0K5FoZ=fz@ki_R@sVO;y&4TTP`z5nY=iOZc!M^5}crTuyO zS{=OvZyj-^@B0;s6@_LCsGN~{_%{2{<NxbF-OoMrX1&_VhmYS_zAoM$@yA*7o!#qY zZ&qu6Ik{iy<@@#NwR_as;)I?5N3&1fskZ0ud!c&;i9a{DZeJxOV*4z|=G>x9Hoq6| z-j^04=D*EMvhJ`N^R>6D)R_15H~b24U|!w1eN*bW>#IFOd&Rz`7-uh4FPnDfn|OvQ zkAr1;^4aSGh4rUhV~*cYTG!dV<NV)BrFZ*zJ9kK#{jknG<&a}h_2^amizRQ|e3#VD zE-6@87OEv2FMLJj%eE&*YnrZo3QYLCgj2A|X7joj7Nt)AfbB0Yx<7r9Fmc|Ng_<93 zZP@)_#jQKbM4!6&T;Z`fa-U_odEAcfc99)Us=lwxnjdtgZ;eUpSof@0Be%a@Da>{+ zSK@1v%-cJg-rv+~yLh%W*Q8iaW931SzNoEhQi?NuH!@#V>#sP?87$u$Gjr<IjpAow zyw=|edi+q0b#vh*j>+pdU;od3`hV8jsq=b^uYIrI`A7d|-0r`xxMF{WtNg#exbtqf zcEpBhH+~$>4*G7o^7pN0@3)@4pZ)7_d|3UD;^zKG4be>R<DWJ>ZoKq7=Sn@V<u0$3 zqA#bDPhVu3zBvBZ<|i*|%i~WjvzPi|drKnj=AOLM%XpVgJ$gvUq~iHCHh0Gr{31EG z_V(VatWGy7FD&F(ywtyfWAB`*lYwo$3S19==sPPK&JjsezR-4K)$(&!w`h3UrNsXD zv^Fs~ucX=ago26jIXmHhL0re?U9_1y%Zpv*(xHMo&OCWiMu|&Gcgp!j{awo3`@-bE zNR`<cQ}0Lrgf^?Z4L>`{?@qb+;qtAY7koRjIzaAMuiL+)XEfcb4X&`rCky}SKCsb~ zea)Fm`<j34KfX^q>&^C8uIp77%vrjwui<x&#M7|cI4hA3wbox&GgQ9@RfKL{`ixcN z#nE5JamKS&Svy^^HTZMZ_@3*Tj#`H;(JO_7-g4ipHQMbj_%`!R`YyKDHzp>|KN_^j z<#$ZmW#h{_F9p4H)9PCzyJEjNbt$ZCy?1AC^VXT>+cZVAZ<%Ku6y>w4Ew6}||9QX5 zH`?at>Fc>#^;e>;mSpj$x=M8%jhs>CoB1Pq!+!_&dtH|-U(f$p^qc?ty=Ax8Z@RK4 z`<r}J@Byno(<4@|TPbioq+|c7-rwsre^#$LEr0CbmJj+GmH&?(s`_8LGPHhOREh7* zpGK+AUX^yn`y}o<vg<#8Y3K6Kj&3r7GTDWxzCYW7eouSV!Rm4915bhUROXGlTX*UA zZ(REJUwh%^`MFd0&9=4F|CRk6dVfc7&dv)5MR+c?$o=0Ivg?>buG+@t$E-Ied1{L) z@8?NcUzWaTo64?Z9yys4kBFSey6j#jrCd2#j)#5Ykpwn%0fEb=4s+FJO=Ya#{?d?X z;ri)2ejPgC^QcZzZ~wjNhnm+{d1>YAr`>ArZG9Mh;?Res3avZ~4rHELW0YbwdBxQk z3%?{4h{o%$Fr5Bc?QrNP)m7s9*CnrZPtt#9z+5qXleFjNs-H!3Blq^4Y@T5wF*m0E zlJVMo7lqF=Zx4(uu-PfWw$gRMFB6jwjuEn~f^9eN8|ZD9IO(pQ8E`>H{H2`Z4817} z`kyJU2&om;KmXuqWx)D(F54emmFRd;-79sdDDcOemZ-^{y4+T+dFkmgizK+p*|$|} z@{@e9Ke|I#)>KM&r|uobwHIO;_qtYVnqJaBDe~)#nRs>4Zb9$1d)(r=M-~My>Yiun zc5&qm_KiY^zi(FMtyR|j)GOj^eTm`J{kFX0d_`*M2Sgv=D+x*$Vk<9MmU7_g)x#ea z_DTqxn>mFs{CcE}j@q{a2jnm0N{IAYeVuvxM)8|(n<YYcoBy`yUH5HV{bcr%UsZb7 zeH&hH=nFr$w{Pk{^A^qKKL2BV^N+ZlW-*Iu+q7z5Tv(X?=?lk=zBsliN3~5}^?uF) zCx7t=jgb{=4sdkv<{dHV*=Zoqrg~j*M}AJgLcN}=5^l`u8y}WTe9^T1b7HGx)A6?S zGY1+s3$~y3+w<n=>F$ESV?1rY6t1WSnbbwNi{?gj8R#T0Zd3hIyhzNo&;CZOB>Sp- zCh7J2Zp3%J=$dm?qVw@#ri($V<I>v{C*RE|<h`P|?B_{|x)9E%`+|+<wfL2+>{Z*S z`(vdT)3>06nG0Vk$6juK_`X8@^OOTdi^XoJef%kT=%2)rETy<*2j|?dXV<UqxBB7# za8h53<kvT)vMVq1yO%6u^*qwp5qD+6^xyBURft{PQq6z-a<tECo+rGI-e&*W%lFE$ z=78d_Bi~E*2^jAA@o3)Ud8rodt9c$(el*^Ca{(Lg&gI!bO#9?MnK7@d<WJ83KH+=i zt!{m`^MU#X28(}etFW=(kZkb1sP|)MrN7U;>~r_4uYXeD@m+k*^g;ji!)MpF`!SxD zk3V)eXUdw@nrQ*6izL}p*6GB@#{_R(c_;V`lcis$jm~<_bvJozqhg|V9{v5{SdviX z@!fi#&N(Ojko{Kh#CrRKk4q#c?YtDSr*FMHe|Y}Qs6Xp1BGmi6qW5Qd`(}O=`LfSX zZfXa2Z@PD(^|HFAg|)}@qAdD9zvg)IN#9q-WJ{E<(`?hs0+ojFvc>hgJwK=%dT~3? zfupaSX}8mbEyjyC?pm<=tjTmSsRfUZlxHjqoc`lc_u5Go8t-D0x!6Uo9g35msFdJw zieXQM@|2upRdZ#w|JGK5zdr3f!1rSRCNoEYP##{Z3t7es*Z-aMy6|OWL$s~jjwP8E za#C*s>%LAqd(^KdHdg1%p~MI=We(jxm;HWh%KI_>x$*%i9*ssZNdqNT_88-!cn@*+ zd!1LB{#b1|d_+sxb8VPsOUx<;Vbd1hWB!{yN*4=CX0eu<vQ6>()V9t3o0X^w&+Ttk zJ}$gB9giq%Q2UfEW>JxTC($uNn<e?d`F^&}OS^eq8Y|XD7iwqU=TYQ)ar*EH{ff<t z_H3$%(Al`(*=Tao;Td0^v&h8<OYUGly;l18H;sqPoZla?*A%|_-fxhw^M<!9v&5c; zg?|If<yZfTz9?GX9scLY^F@~yel6j7SHTvvCh>tm#^z%MJ^ruWweschY2<g!&pcY< zwDZZ16?-}ZOYiPobV)AY9Ggu3O~LzFh5;QP*b61T-)b-vKK{0zYo4y{hB>~|1(W5} z`Fmb#`?YKPvp)Q8ab<S0a)nwx>z#Dhm~Jbkb>^-;_sdPVZr+pmP|CK);m?6?{j>uU zK71>k&3^dBm$Oxl-K!Slc?*>tYn}M!T(IG99=7!sUCyRLiH_Y8_tH`yytYZ%A?6=5 zJ9q6hkw%Nj(TnOn<=nsez$eLYN!g#e>5)?X2h!cXFBCqo@>qt#6Ay>CTO@k#_S~)G zKi+dP$ZM71$KDx+k*A*NZoSc0SeRU-)fQOjerLwfA`XG?H}s8oxOq5qcDNlWYJcan zLPli0NAQ8n1*<2U8YuFtJNmxj#2qu~d>`q2+vqL<v7}y!Gw*A84@BJFw|v=~e{YgG z9=tY5(&@X^Q|I|!GQR#ywRV5u+V%F&W?s~nv?(k|K6l>EYy}UG)vq@Pg(s+sS-JD{ zUG6&bE?w{en}Jn%$DObI7R8Qo^BNMbtNnSr(B{RGDHqpl7n#nd&$RN7Mc$chdUwNG z56(+_up{uB<j#z<scj;67R}E}SfQM)w0h5-4bF>BR2F`1Q7vxY_mWw5%}ky-I_+VS zFQc08Y;X~}zgB*Y@5}z90SgyN%()=nz0k>(M^uaJ=eDOCqQWGfwpHx9rXeSMUw3i# zfBEX`%rc=9pWUB5)2Gc~g69k#MyBbZ7aW>|p4f;*m~-;5Okd-fvV);-^B+$ICl3x| zi7OwDE1r7%^kvY}@>eg{zEOL9S8RF3R8f%$ED=I6=Xy_Mv1F&3MjiCLdNz?uIqhui z{&#i8lT(@$!b|VP1x*eAyzBn!>v!*8zkC0CY5o553(keyvHf!G#p$%}a*MUMR8P%# z^G4{>lsUGa-*eVPE%H(=>Qmfu<aP0$XYVQ(d(F?8-5~dMJ>TII=NId_$sB&FztuBH zNzG!Kc$?vz-RYKJlWSb~wwc5^K6g>O=Y98=sL<jmiS5cwx=M2y)%{#w#Y-*YKef5} z<LWIOcW&kgR?Dq?&=8})F8`-=dIx9QT^+u=Gp23}examr=t;VU>q@V8E>}|nKV5cO zVbJ<UXPU3R)9FZ^3n^S&jqN^_!5aQ&&tBs0)rc?tYLZ^L^h4E|^2I-x;;P&xNiDg* z&tN9&#{TuYImMSBPGDBab&`E_FnO(~%ZHgR9fis=yus{q6_&IFxM{59(CD7M!k#~I z<-#blTCv4prKgun^s5Wk6%eRBUe{9f<IJg@`sYukbM+=SC`pFc2{b)D`O{2OL|Jp@ zX2H&Pp({7#Z!yX}?zv~poM5erOmRt(n9x;?%qOSGxqp-XQFB?{aB_d<65ZUB6K;E` zGV+9<Dmi;o@xU(AOE&uj_TP<Yous(;T#1C+)u{?;SGs2ue80F<B4wW?pP{RcTYCE& zo=Fvpb~d@Cr$4Kdyj^`aG32D>4+hcM@7_s%5RLlPvt%Okg_XkZ)1!ayUB9L6xN&#f zx-CVEGNsc^VmmCm(l(x}iGS~NZ>ri-Yk|Y&M}?jw>pYe@QXHkXru6cKKFb|C$KOuQ zc)I^W)bEnFGwgmZoXA+Po6+P)yG4On)w?;f<}R!Eo3<+d(uzyozFCfKI!!T)LSwIJ z8=Z7=*>^x?&m_f^MmZ0r*g(0f9_Kl`Cb$TmI%wioe9rEZ=l^M)lg?}X`1xqHiREXz zh5Qp{99gpL<XV@Qs&fX?YvtY<s5I_8E5I+y;hDgewNZ3o;amBp8PV;RmwXISE`6l8 z;<=!$<nmK0Und%fNT`aWdli(P=1BC~D%zrSFgH_b;%eXNq7nO#WXmVM=lob+_HW`u z>lI>4Cf-qAv6^#<#x>U5HQaV0szt8v1iU=U%iFx|+KleR?ypZ=#G(+Q%%GbrsHU|t z&sJ~tMKe|-;lkCA%eLfpg`U~wW`0#JK3DXNyON*w$=D_3&2P_fZDu!M;y17=y|_5x z&b$2DdCY<Ao$N0}7yo0Lb@h~!_r{No@8|LAv<A(YD|nMr{E&bAg&1+QM7v2BC8VV$ zvpJ<c3>U1+J+gke<FWV)`b!hLrbrmRonquX$6ZQvV%WLde7To_97o<qM&@2<_!hui zBN@Vd?m(?py<*Hy?uXA0AJ3SoW_o{#S5vZ~V0xU|siS*ts?QON=E-r=oK@qwL^JnS zVpLl2;Y&YcBEruuKgIIZN@DK8v<p=hx8`+iJAZ6_wd1c+zQY+E$4(wFGR?RBz#YZM ze(vDW!!7q#s;`d<d}!HmL_>D@F-AWfujhAL6V4<n8)<2s4j0X5N-BBEwoBH0QGZJ0 z%bQQ4BR3w}J?&ligcF;DZgxv^v5PCL|McnVKJBxN-S1@@9j~9|xSCs1mg$}TK*V*n z-@VQ&lV6&=-{gKt^FFJs$L!gsu8U7PHMRF!@WP*JGuh9F^1l46D{;$m*_WSTE%pm9 zURM-Yv9ZGD@QbZ2FOCLpXSUMIN#{9oQE8iL%dzSDixM-U(_@aUnZokpo^_#S>)sUU zj^8bZ4a6?gJQgy%?<eiqs#5pz-J7$oe_p!#FyHU!#Xk4Ez*OZVm5ZyAlX$XHR<j?P z_+oN<e#(N@G|k-Au7w);*RQvK`8LhfsN3+yO4-aG%eGJd5|J+Z@^Ogq+Y^Z@d)#@i zWleB@rMvax3C<<kGNg5tESSz7I+6LD|7=;=ar-*y?(i0lsvv0<D~9c&lb0CmFidIq z=(6hQgFhK6mjh?d&9!0iKECYZtl4R@>#E)@NqgzN`2NjY?mZ`&xbF5y<eU*o42?}M zWqB>Q<do)3wZhZqCVU9Gp`&*}`0A_8tJcTnJv*;+_JGaq#gZXc4JDX6_nuoP`@eJP zf%-|i_IuykwoOEzduEaj+w#MS9tVFJ?bBobqOI^tv8-j|x%QJk3ump7%kY@U7Jhok z;c9-5O>GXB;wQH}vSFOOg2P#L!adL1%jDmgnV!ySX}aaK%H(X=LU)yA9_88ZE-#sy zy-wKVW1G_^)=v36UYlc_&-7n!Ys~2X%ib+?W!VYw{>RhT2j5O&ypSEx|1(I{`zPzI ziLndpH%@qVXQ}K@%g2(7?CxGycz)k?MS?Nk%^9!X6-ubBxu_|Bb&2T#7BySut55Z0 z)>?hydF)W2yiqQ+&6O*(zFT|a+_ERGzZT|h<9H>w{MFTjoEztEZ0LPmvUX8AOZ>UA zZTVhTKix9<9vRiKXk&2Eg2s)Pb^e7O3kf|EQn;$Z&cLg7*46f1X2(Uk+txGB(C|F5 zvh=@8OZ<-S3sl$*W^Qk5S~5{dGCug|ftd5ltX(s>6DKUc=U+ar*T>4!U-D~&_y*ex zb59g))5u-b_P%(Q{+SMrV`WjCe6zkUe3jG5xcU-H8$<I|**AKhjSSrq?(}W)`%q+j zBv$#yHRfrt?O(qp&aK>@&{eDGIH_z3>&Fi@J}&o9eDqhUihFt6Bgtv{D?Yzvk<U$5 zK0SBL;Pb7NbmioGex|3_?dquX&p7wDc1HF7guHwEBg1}v-?Z7WST2P7cfk+Gf{J^N zXZOxGtX%xYMn>qsu8x!S6(8e*zF4{+Ip|^}YIE|4t-RingGXd<Ztk0Q(j&GY@MYVh zqfh5;-{8{Q<uSkeqNikk&zt#-@0Rkg*VIf>HY)16J|%C*_3cLT+1IbRoT`=Ivv)$> z#SPwRhx2TrG=8k`HH?vIjCZ$~pU+;MpS*ZO_iR2-jTKFQL(?w23O%{IOUOw2_3Kh+ zJKd1oF}6_`d34J+YAsK{{WZbt9N(l<^D3sj7T6VVi`R2)+uMQ_-w&->nRe><EIZ>v z&jJ%B>i@J)pKZi?t=*tAzf>YgO=iZG;~|blM_*lC!jiAI?oP;?$ao*g^9yI@oBBvA zBzc6_`p)87w#!FfTKLM&YrA{h-YDd5IUMk3X5c=P+oClE%cAZs{nfN;_2zwb<&X5F zrRN#m4&KjkV_SXB-MXVL=HWVakH2MJySK-0|K`(=^tq!pF|l9Gu}<<WpED<Wa*Fb_ z@}xN&&(-s~Pwd&VSIhC!u7%d>Df8M7ToCFC5r}6tUux&5u2Cw=W4XocKZDS9-`Bq+ z)mW50wJ&Um?_=sQzHmD;?y8xZFk|!;rs`)uWse&qDA{e9oBc}M+~@++={Iju=CdX~ z+#I~eY^{RjqtE-4w)BW?O<tJm`97CJD@67%^NxAlH5RecEzY-IcH3-nsd1;)ti2K2 z1KHLmD0(|yE)ul8t~+i0#Q?QQjZ<x89F5xS8!P<7jblCe8=lr@r6(EPHcPqfTmLFM zC;8yS^(Uf}?>BspP+0l$v4qcucXB(YrWnUo?t9bQ`1edqF_(Rn$jmDbe>;aYq)iI7 z6L^}ba$$$n3XYF6H~gyYcFXF~UZEQy<LBLS@9a^>boI_|mtWrv=1$JA-MCI_x@}42 zg2X!y%q%i1-tMqVzJK!4S7nCYgvRx6?>x%8_PVci>ocD0o%)=&-W)e9dR@lyu{-pf zVN8Op&iYU56nK_D6c=o)y!hwpjer|Z-z_}kb7h`|Y;e`fLct)Z9T!!0?3&kQKg;6w zRk{C1VjA}Co)^Tu)-9Y}Rmtjt^^^-=(icZ%Tnc(5QvM;-XXZ=3!zvQ&d5lp%bOW~M zwEr^Qdfr5Rro;Q`lQtYFJNEnWhRHR1UJ5S`tBsm%DAsY(f8}i7sIQ!oMlN3?&z8@! z^M2W?_EYBD#6ZpNG}AZJ)TJKZ&k6ao>(AY`A9Hh!CMVash}_CG@-aC#u~s>7*?ShY z%Gz25*V1`rR{kAVC$`KFTfEuz&em^1nyGiE{kVR|c2@VNd7PQ6Ol`hhUOwZ|znh6W zz8;QpzY-b$OG+i?jl+RG3484O<6gI>F3aA2<dvsT^U`I7pV!v4OtD+DKCo+Z<J!zE zR;CIaD}NLu>_1_9x>!`bU}w5@^X!^E0aLa`Ut0Cu*JRbcJgt5E=5c-Ny>#cd$FHm1 zJ0qM<OG|x}yuZr8>U$?!^8Q0F?)-maK4U>$596O1hbLUSwLdrM;iQzZEh$@69_F6? zt61CIDg7|dX-~D=+S)5u>x8tGR|(!|sa@yBebxS7;Z*r=_vX4jnVsCRzA}R2`4yhE zzbbQ!Cp4yIUoE}$EN|ALM1l3|mz&GWtPhpH_K7e1oz>GN&#LBei63;*dw1MuM)|Cw zid`$N@NGzEGUZ;BCbg|uE!k_9&H8O^vS;{ukMOQ`K4W>ynR!RdoDC08T<7^aQ`Yt2 zy+wcSRIAiKU%w#L%YNEnGr_NOSdZS@nKWy&tIXY*;%5KeE%y7mv{n19vf0}+uS&Q5 zo-5ndt^a@NcJs;e`7AT8x93DWE-Ae@!|ur6%*W;Xy5^<sk4swq$JfT_K(WpwFZUCh z4lGt*8Nji7t5&teHw9yBo$GfTd&9yCcd=f+D4KL+{g>VD3p!`XwrRd~<xmNJWRP+o zG9l}(y^=!B-opjIPuT8vK63Si?4Bx-CYEn+746u&>WUW5ytw<r^>1~Lg6C^qnRVrS z%K2j3m!5y`y>ec=M<wyX^DR%$SDaH$d#$^*d{Zss-@s@81)ehZm`b=-N?v+C<3ZP? zn`&w&m8vQjzr0I%b$!w^))}AIO))wC%JGZB@*`c!QaOwqH%eWZEA5Q=JJ)S_xhjmS z|B2+Csn<X6^845C^yGiC%Fk$tpFbB0E#-Vt-<!X@>5u5Q37)U7N1Sh0T=C1LT~XLM z&1y}?<=fjE&q=-bGwHCx^v>Xn=8OJSh41S;`y`#`r?H>&xNxuXUiRW`{K~pLZ@VQk zPq{t0?0tx*E$U}jM&;aDv%?nX{k_3u^+;&rz4}&_svwRS*{bqKOL_iPcz&+=@<Lqo z?6ZBgQqo!)We)wvKH2hhoGoAUa`J&A#RBEiu5G;idfGzuRT~yvU7$X1(djw1^~w^~ zlOkDu?{)ez&2E?7^u8&Pt)I2pW32W~|0f^3^h@^VD=Rcs?#T^3es!+>JAnuDuLnOl z-@ajf+lKjVF&-eaVSd{k*+sjppKw0#d(OL9>SEL8Z*Si}uuFWf?#6bv^7$KzzIQ&) zKT-Rrp}A$9poMpI(96iy7j;bKdk?C8_1-7aX0H`8t0d$+&w{F1#?pz=N;5x}J*ZMk zpZC#zj#lMkrxo*b+BRKZvPb$w_nVoDewz+6RRr08IJsbg+qYjiUIAafezBVJ>_E?~ z)AzpoVE+7ElP%`{0k=I#AyI#$yH(yBlzL8_l^o1HbLPcmH<%3F&+3G|(mb!-VDGhE znup_|O8;u#6fgEU)^$!LT6Z@bQ{KDhyWP8Q2b5c0e$7amu=wD;{pJ&SyytHh)i`+F zSv^U!H?q>kph463;e=IUOP7{+vPvzT8QIZi&k=mhU`N7|#Q2FR2|u6O+PnVIkmbp& zTd3~uVtjgfOJVf+3)wsO*SmdtbynMKjn=oCLp2Y-t8u+pGU?PxC8Jy4BV+cJ{h43% zK24}7Z03I1|Lno9zlz?nQeoyh+2CySU;>W?n0YbvKsC!=u{$exPE4P(b^lMkpa))j zIX8u3xqO}kJ+Qwcp}=qdPM66j>32ZLUFEZPc2D!J-8E&|9{;4cHwR}YX2%2+->VKk ztNC81eyi`Nb05NQtG>_u_bTP&>|-wWrmxcz_2t&@y*}NCY3g~tm3>QgYwzuI=-C%u zc1G(j-=<q8C$fw^J$~&LSoPah^r*C0@bRi?Ya-%z&0=*ue*ehclQAzem)E#WII9#N zWtO7(r|$NDqa~Wx)mBZNdUxBZ7q1T8FOdqIzwg(ZEw42`Ufi#AGGA=!m)WVjmzTvq zU*-4u;Wp{x0&<hCwJq7Ic;^HN?fhIH@-9Z@+LlUlt@5N<``=r0%spRxd9hgR3z?Ix z=bq=C`EsJke$tJ|O-Z8SR;N!LDpLO^C4J1R*{;BfsW&z==w7Z_hqBz^897~>BYn2* znPcnoO)sRpp!lhaEyqRKT^oy{o=N_{wqawD=Z%P;aSG4QawMldbvZiY<_UjYuJ0$y zO~d_fti5;ju-%LKtaHAL{m7aB+SlUh^GZpjcTOEUZhIc7<!^uUeWNhT!lX&gM{QDA zg?4K!KTy>rYsURE*RA%jNY&$@{Kl6e)@O^pn&(W+zp?HqZ}%4?zkf3lF76SYzIBI< z`*hCgV#_(nE)%C^Yj655J-tvahiU517xR<_Gd@@D`+6_P|6Z3bhgN)NliMrH$|bTP zRdt<PK3X^&y!=cwUn_R=LF4Uv_7s)AWDDXotGw~^Gv_10J;F~VH|rQQyBJ!&&eVGU z`G}9@BWI1&2g>{pCVs7c8{?_ze0BM>jjQq}>HYm57O?K_ztiCxLZ{_#|GzHZ!r<>O zuDf5u+y2)r{!!*!^k;(1|Gisx{ae2%gI`gVPm}3?xPf?Wn%d6&MX@uwBV&r<i*qMc zA2!tNJW^z5cf>M}kIzV9CUYT=N8C}rN`8;HotyS_9j^Rht8$K8e#SX(`5EWB<;@lD zO1sU9-}_y!^Wo{U3+fyC`PEi0aqRm1>(uY%`c;XWuH-2SZoT`;K;l*|U-L%Wn~4Tn zms|1}zLn%_-dQ{Au)uA*!-*T7n4IYd^1gS=kol6fR=0LoNYLSF*ZW>HGi==N&!E+o zy=YIf^2rPS9;uZszE{q_pBKWd^D5@un>AuHo=jd9__4J8)0%~QSWeB#4y>`A_&)OM z_brxbr+RCAQ+Do}sw-x>LPg_dn8IPv8A^9QIQtoV*N@)C|AX=I!wn{^)8!u-$&0g1 z-Xb)eD`wTpPiN*?A34~uNA#XomXYue?Q8iDe<e6sBtK-6+7!p{ci-Dy@a~f4WSL7> zS3Ny`wI=&TgGJP|v(dIccYL=IFkpG$xsB6&n*Q`x-^F&F581pnUQaaFUfgZrnQfDV zRvf>p^!DQ(hV|c%$sLOGN!VBQJxlfax_f)WPWpzG+n)~!nEb}~+Nz)}r(BtG{s*#c z`)_>NoUuJ@%Azel`*o`%)Bo$f=u(NvW7}{*c85jb$>pbow|?Gdo8sWYRNf*{aO&Uv zf+o4DSszTf6%{zRR=Jj4U8J*_`BY})rfoW|r~L)x{4Y3iznu1|lBs!pVDVeudNb|9 ztiY_x>S;fjpXPPXn%%Qx_u8yHuD=1rYbHlekqLI$VYIerZ`Q?C3`QQd9fHq#Yv+Dd zV1D&e>)(r(AB(+t7CwG)_@S^i^VZH^87d2S+z)M4lZzAF7Rlb1yjkPb5|MUA;aWDW z{#i%Urm8Pa+o<?^k&eNpMLt3G9rKQN$z*rTI-YfC0jv9!Y2OM{9<s>3xMk$=p@;G0 z>zi>i_sXw&dq>8{`tyUwa^CS@dAXH0Zu{WqBeJbKadXdN;kj4j7ESrF`1@_g8LE97 z&b!VryT7h_M**9bLe|`mQGa^N*1eklUG2y0Hzp5PEbchTA}_oAO?OT7M$7iV`09+k zVTtLBl{XjuKIOje;~jY><(#m4f&Z3x$q1C_{ozbvY%>wF@F-_e$h6CQ&untR&4JnW zje*MEvIRmX4unTCcP+Zye6eD+BSVJE{8{qJPZqu5HCa$`ZT$q3t@1oGEL_FwysB24 zB{q0>%YOdl$oxmG`pS_F$xkGBT4wTWJLM8yy3q6F)`BUk7#&>nD&&t{HK{twA@o9c z-W<6+(PX>4yHXRFcek$B`t2|+>h99qEm^nMoH-d8n-$ol^Fgh7`CpD1DZ4_$!}A+^ z=PkQbx_xPb>)F>Y5AHNGwz+)$fd1ETKIc!-Te(%*(+_wg%f&VCs!QA!9}>6kT=+xH zlp;MDGiw9awPr@~W_QDjD<yQddREGx(A#ptr>Xtc<}>E(v(Ka-*>zZXW6r}s*QEO? zQ~xpE-TXoKk)5ON30~);5?i~b%sPD~KZono)jM}zyzqXw?^m>`b@#6IFP-L0N)F|I z7HDo-E3^E`?FS5>@4t!V4G9jPSO5MgBY%%tfY(Rqty_)4*xr<cscmb%z<$fD>&A+| zCzf$IN(gGG{0I~(P_m9$SJ-yh*xEXMyY1_FndQ~Xbmv_SO<#6f=q1OBT){bdp?=xf zRbhTNY$a!Ni5z?Lzy3ZqOIGxeb2DS7&zU@ZdiDLi@9X})KmPymcYE18Iuj>{$L*N> z`B1=|w|9FE2;aWYP%m$CPMrN+Qpk#?__m2TjC!FPd74CLhes}`J#)rPE9CXZcd}O> zY3-F+`>Xnk?n2Q;rzOwde8-X3x1RsjyMpx>SB1QERyk>LbVa0Tf%5z7@mJpd7rga9 z&2WqJuNBj5v?jW{8Zm#Wo3nFfjQ{nnb+(;zeBHh!FM4g2-(3)U{l@ddZ4HUlUKyP{ zqI0+ZW9TXBUYe5L%DU}4&qQ4|_b<^(hbI5|@J?(}YjxKyrj4xsuIXkT6j=Lu*MgK4 zpKa9Ls^(38u)6n)gp#QAnz$`1?|zTBKlbeZii0n5Ca)H4e!6#+?~{K^Gpw|(mcRIR z{_yT}*CRKdTHLK;dB0}=vfJ{E2lbxYa7eaIxc^t#`FEA&T5Z*iw9Gs2r)_L_bCE&6 zCnI07?7qHG%g=lDjonWjW-Tf`$(9pw{A?P>L5rBHJ4#>OyL;%X;)z>*9MjAv8f*GL znVz}rg;}`p&;6oXIi|8a-J4<X?ARl=T;mf4nc-)9?k<}i*jpl3eQ4eCXX1(}I-zq9 zpS&sVIP0fL*NIf-XGYt1_B`vzjCEP3@|O9T7pv>xjng-;KQg80>kaO=o>u~8m8#Bg z%64sfanxXAl_bwOn<W`DBE<h_@hh5UeK^;fb1!`1d22NV2fM=`i<Jw#fB1ipQ+g1c zyE&#W>zrC^oX^v}@1}3iK5MYjS$vb>ZR@V-=IyUCdCrPTo{knib9tAqa^jDQGMU^? zi(3m!Jo!yc5A3l!nDB*bc7JHx2BCjz)Rq`pFMR(_I5gNzHL1jNjo@*04gTE4cH*IK z#W&{U9?`NX&JbH3DO#rH;qc9Fx`IpfQ5MCt*vnac*K4k}ocOb_?&y*kEfYVzJ*_-% z&)@6Y4lSC(^f7wt|D?!$R%?G-ul;R(wsqb!C;!*~{5Hq!zx6Ns{r;KxcmHvV&v_Is z&6D;2e*NSi4xhh2L?jN*?Yj42vUwUyH<$8{@a;<uHLmD5^UtGDve8|nMeLKdb!nMN z;KnbB)2GY5yA#)+vDWsAjD)G6vyIN}x$8nD+S&bCHI*g0kMB}o;`=&TgSF|zd4(Fc zgH}r}ZWgSb?^b*F@0LfBvkboNa@?XOowEM7#P-b9k691?&ff9HvPA#5`RZNr%O$pa z&Rgd3k@ej{*OJGJ_T`oZS8*(2FzcPkpB}xbOYq&Hw8-xp4lV5A?>@a&XZ?n-Ti+tS zC7jvZo+RSR@WTJyz5maDoh;S7Q#<+2nq2MsbAulI`o;U;dxP1%%1<7ze4lFGakD;f z_0_T0)#jF46P!hs`{nOmwmo+H`VaA8{_Vkc`9z*f7h56{KmQQZ8_}Cgb1H);-Ec`| z{P$8tb>qrAXM9rPBu=khdt%drw2k|D%yj?QJ69b2zrN?B$js<ji`^gZys^O~vTNga z`3Z(AKRi$LwO_g@Mr)48s|%BZU)pX>`sI0h)fawQ!<XUNLYMR{-hY01S^rAL<@MJV z?QY=rT%F$+-Q%p_{=cYF<)_yDRZ1Jx<}1yYyd=ZqX{=Mim9p^Bn$*WDS|?_<)VNqW zPYV%tRpyPXdOr7x&7*S{FSo>eXX`x2tH__)-6oUk+oGs`Z{~@49p=ibHN<6O{wg_k ze5m)Vt7>^1e|*Yp*At%J^Mx||wAi=yC&)T;1bA5{)GsQ}emrTt+IHuecUA|#*0++s zV}8cqo4kU!lgB){@;@;*lr-x7J}(au2>B;6^)c_tfU_Z5>QX@qm#yqtIGM|^l_UAc z8};{rk@+62yB<CE`?llW2Ctv{PiclM*!5JW#N^1G4>`xY?P4xXJpN0hL@07<-QKdk zgK{fk6AM_frb)i}cT1J6J^uMU_Ko{oI#%vvPRdGm^zk)0CUb|+&^l#*8;@#r*$GD8 z`}5W?7_hClcz(M|wLo5+kN3Zxohr`LT}=fyXnuZ}`hdBuT6f`{>m^6U*Z$#~vHpxf z+{*nC!j5PD?(^8eGvjx<#Bb4eulFrX*f4GNzSk!jD<7w9J+b-rmz<@%|01|UFRFMg zJ@++L!?UdR-h-EAJtfv`yW49&f9EZXVGA!+zdv!|ov@@WrAuyG-KdrH&WwMT^yA;z zRpu5;yF(oAFR-1*!#Z*PtM|n#`B&UHAXlV#q|X1_gm1t4W^w(NdDdRQGB54ngsKJX zZ?Co0ybdW_CBE3V**nnWXGhl+>63pP7fQElu>74qsZXuA{KlG4#Tluu^P-oQrtedA zDb)#Bx{KSR)P3Qv(--A0AG!W)(fyqQRpR@?KlA!O%$U3*aDCJf8>Zx5<24hrgd`Xi zCHC$M^JeAgXsCW3lXWC#;w7;syNXq$=6XLqmas2_ZSnRa7jkRf`n0m>C;wf%;n3#` z##gxZoIbL<nbYaavd3RJ3=Qk1C0+WXf7Z%)rrY};oNwHDemr1%TW+S)zrif#VE<D? ztCtUFDzM%zlfI)VeC$v_?Bkd5hf^jjUi$h-%&hWePDerO)CG%ur|26VjEbMt)Gqls z+U4x)Xr}*NF}qpMiAA!g&$zW@n`xKvO4F#Tg$xfbo^}+ERQ?uwcmmf%wG|9sjyzFc z=6&Q!bDxxX_qt%AbKEbsU-b6bTX&@;j^}NL`=txc{;&FGyO-oY<$8J7$~<eS!_Q16 zLw+fra2cr+hZ8<on|8?XI6kZ6F#5jvHbcuS=3S5b1b2l#vd@Z%D31&_KXZG!l#lI< z4aXC9wQ%Y?ZkF)bD{<v?-d>4Uyr+}{Ozzut<-ceQO!(y76lH7r_3&j2X_gNckLJ1W zzJ2ep+4c>KugzcZ<6ih9*0Y6I8Sku6xg8a-Z*x;6bGPl5rpNzfv)VS@H*B1JFE{^t zrh@(_Ibp8yR+c0oGf$T$gT*T|_pOqV)4QKm`+rYcWQSfrNzJ}jp9Q$ySX_DNSXy@F znP9+d_s@qje_ynJ|5Jae_sl1ez84SbRJ?ud-*CVE>`m_to_kKlOuyrnejqxmXs#Wr z-+ZR!zLp?#l%qb8_uYacKiItg&8cCQUA}e7O>ghevn=Nd67-h0_Fg#_xcz#C*X<Rr zHrmPr+1%Un)R$GpH!xW?_~Pl?ExVE`g{tlwNicuY5DmY*)&2C%$19W_?j3z=QWtWk zw%wqB@v_V7S^keF9<?}h#a_%&ZQ+TAb(Yr>q&A*yJG}Sw;?TVoJLg}SbXk%0NcXqu zk7v5(X$FM$re%b(MnCr8TlG03Ap2<Nf$ZK5>#MiFv<od)iD{h{92?TM`r<K74rO-{ z*Q673QnEay*Irw+-cM9hYAwt2L*;5UkFQq$(bD^L;b_6KBNO~(W-)%|n0i~<_|dxU z>-%nO4JluvT2cPj^TbbI8}%PzdpaLU+>gy))N){X`oB{(7u6q4F^<WuZD03qPEp)d z)BXIC3pW@1eEVhcF8TjqU!yhWUpKAp5IpxGeA@yke<zza>CYdeGRBELPSuRt*F61f zLFF5_sOSQhswTxx+k<cB3p{9G{O^|_d3hJxy1>h~cRll~u(#qmA#i!uwWNsMkB&Ns ze%TSuUBEXz>s@>BBYoTX8PDc@;mNuqU2%y^`bSylWv{~LZzN-8lo|b8@_MqypGKRH z4DWrKPAn+gu<z)~Y!g1C`ycO4U-Y!@e!bbLzt^oMFIrJ!r}4Y;r`P<>pTBbXA4ooa z$>R7#-74{Kc<amsCgShqbqi$brL-QIl?%1}wzuZm-2cz9?1sBVtZ~ciTNjP4{tOr4 z^F5p1vGcku|5W|Jlc&7@T)C0gQEKBQJNHYZZjaeNk^g~ee0;q-#m_z6*I(c>yK2Gd zOL~t!zSB~h@pgvsv<J2Obh}k2RGTdGp1~mXH-}3uPfV3V@Vsn1OR{O9Po>8GRj1-I zx8`gX7md``6`vt{fF*Q|uuMJ6tJhYNmoDX}-<!B4LQtlKQA|i-rjYXaYvm70uJFgN z{`I!?{c<U@rt6P5(ym?Uc3QmQv{<JKm!npi|LWDIC-<tYd{=b(uI{{t9_JHOWDGj* zaE53uY`f<iA?Dt&y7Kzd7f-StTx|~(y6|@iXJ_9;M}3>GvL-?T7t@p^k3Z+yv*h7Z z#yv|OKXu%*hj030_Gw06*9I1a`Y`TW^W)#5SB6j8-X1snHgoFA8FK4x%P!w|d~>2u z!Pbm~J6sldtn<S-Pba)l-u}4dc1_bPKJDTK?Wf$Qo=hwGQ(|z-l1K1L;f-ATgGy7< zYq%Gxsyu&VW_iFPu0O{7OS0rv=XWi${d`j1q}<!fzxvem8L6genRY(&C%w|QO3yvY z{Q9rO@>IpiPcy&h{M^pz^o2V@@``fnziX!3gMKH@SXHy}$M3(5-LFf}&Ue(kIQg<> zdDsTueIlP+TT}P8l<aHydE}L<Lxe^94w*W?@&`UA9&?)hntXntKl9@44`Y<e-!`*V zE;+}1rC{kniwpzS68pcF#rMm0tTXG|zWi06q<hClo6<S?7T0A}oOdO!?s#0Y<zvm_ zk2TFLmDcmwZtZKi%scP5ba!*?e6Q0rJN4S9ufFNi8~3mO$c@F;Vr!o)vR3=}KJank z-RRd}USDdLiP9)fp7-z9OSZlFlBVBG+=?ejtyQ_fpn0i1=hkbt8D4v4*51DGc*{k3 zlem}BeB}nA8>3GCW!t&AOfy@GGh^TUnAXaShLUBaOXCY%(#>8Ksc0Vl9x0GEU#~(- zBmPo|$IKmC3+mGESD(oZX*e&k@Mfjs!j=CUW_)<hrZDaJVvBd_A8LJ)wtST^`S<(9 zhh6C+n-pA9Rvf!?b4I7jqMM;B1WwqUXmxuztN2jZ<Y3D}re2jm6X~sX#YcYeJ@1L< z<5A3W{A5`q)%4OyuFZ-6<V2olg6WrbiU;k>4D~p8+G~%<;nt5z!ZVZ9*Tl|!#~U^E z<;~#xNwY5=6tS!>P|7%yw)E=XBZ@5^yEwgj?4+tQ`?jsnb=P0;*-m5qo%cmwigz_v zG9@26{NQuV!iC4;N<UqfE!mu@IIZOU?jASac@H&`@-j`fo2X36yZ)4CM(UOS(Um+N zpLpC`m{@o&Y+uZxz$R(=-C1>;V(gr*BRxkh6ie0ked5V>VpL-5n3t$1BGAZqXlLS& z_gNFA-s*0UGYyGZ|GOpr@&xHO+6Pn9H*>rWtDSDl>8APTj9U63?>`(*4wsv#r2Wvl zoWm)5<GF`pvb}!%tM0>BF4#tIDX}eiQJG}J?dxjpal=o>KVjwpr|?4s3%OtEzv4?% z&XhW@{7Fhryg%#7W~t!a=TA%hSaIus(yy4qY~Pf4U-BJGTJ-h80mkza9DLn7Kjuz< zoO^EOVr#Kx*W5(cUYXoG#_LY6Ow2tp+1SyeF!FWQ!M2sZC8Sp;<_ahoOK*$&F59># zRz5r7itZ)Z?&kTHK98#zUnP~aKi|g}bRefo_akR^=i)W0d-lk@sP5XzqP<V<uhJ!t zU5u-~w4MIQ<|A<8n#s?F!nZmlpDos&Q#|wC4Vfgnjqf+j=YAca@T%>I+vm=no?WM{ zG-57XFV&5Hl4~se_?6wq*L|gx`vj!FI6jvCP<58=%eyz#6HnQmSvb4o#DR~?7hZ^# zST*;^i3z%;1?vy}K9uCO)7*V;L~GebfzSLa+%|EjKVG__=&9-2;N0t1Ts`jXT)St> zg{U-6j#Y;~wurtCIP#-cJ$kEELFtdP=0<w`_fLMD^)b5Q&yqj)6JqYQ{A2&KM8xL* z*<bShQ|%{K1y`2caob~`)6le?E6i^b<C|@hE=_4V)0VUKuH39w8*lGAyU%v1#lvmS z{@fMvE}2#OV|u!5T{X}8OtmN5PqxfSldTheUC@<PyHqtapr_SGW81b337ecY9?HF) zxI+1wo!XaUVLoPwqCIE+%zY8eIs1cw%ABn96_%pcH;M9Y-KMs4k)i6^rZxG#H@Tx9 zTrZuRXBC}#vMi#KYu-$))K!uq_Gipg&;Ng5KDl*M(3Lw}=k9EpC39`Y?Y~i3r&1KR zNHB`koT_@ozroFK)AAcK5g%A@S3lq}y1JMBaFw5?UCHU$Gfpk~bV_zdK&qqL-K2kB zhp&A3+dbji^v#d{#2)k3ULGbBopHBh(?pT<()%hV>vdVq{=V~{DdEAwy}$Ff{Yd?3 zz4pd>`}~N0Y4Pljr`|-H?hmMXwzVzhgu&Yv&G%!gPyeeqwK^yDf>-_dO)(o4zh2vX zCoU=?h+(P82A!A1zT4+5JsWm_<v0IE&87Z%`|~FSbCoep$aov_e3O=H^P`w=kM7%7 z<ZLRQ>D0;k--dPK&1<|qDbIFoJdx9{Wc2$T%fy+nf-~37nR8-ICf}SL$+}`?FB~U! zF1@g?Sbg)`2cP=36&GuN=3el0wa)Fg6=&D4(AXNqb^5J?z%*(1u&GmWkDplbaboMw zsk^;S>3mzXD)9Za&-p)G3Iju3SMEJ^=&qsNu3Z}PmsI-rb#yg1zYnuHcz$o7&x$4X z7F!|&zt-MOH|?6?R29th$~QA0-^)d02}i!or;ozIEgJVPF6nd)j|)rN`t<fE@A3t^ zUrF@MU!Jy`i`8<%+Al7Leb&A6pB-U&L9FV1W3}3;RfnF~BnwS2OF64%*sS6rz4m>P z9#@`7XWPdzBawQaCz}JC>s^X-LwVY6=sN2azH;_V+oY20Z*Vrj^CPcy$EhjrcU`jl zt#d`mR`}BPoVEKStb;}Uwf-bX$=+Gy${>B)DND|92K(GyPoFvV+E_&Ogr&UFcdI>l zibau4P&ut4zHz_vs$WGOT(=vag}v9{JDQ$&ZB0$j#I3BSzUaM7e5#m!!ZVaLQuDk{ zQPki0*O(MjCWvx!iMT37a-440v@&v7sW)5BFem-Ojt6Qhd&3LsH9iaFpP2flM*FNl zZT%gO>s`4s&+zMYu6)12ljW9fc#GJz&GUOhf-boKV~gDMU7_P5bHLV5%lP~r9N*P{ zb60z4v9YoP+xi6_i^>xZSls;5E@5=*_4f~}-u_SC@P2E`^eLiIMwO<V+)=?18HvfB z;#`s8VXZtnRuwi@7MxqXEvoL=>i6l5%eYRz-t+26geRA=?x9yT4GZO!FK=cG-5@Xc z+WJjkK>nh3wvMB(-K3m9E8Gxc<b5pMF|U#9xWkvIi3`<^UQjozva57jv!5f-xJIfY zNHALE#H6Rq3<^(Vo?hCu;BWFt)+j}`^M<UR6Mxj&U0Rv3Ci}3-^G+Fujk9wtyN*eI z;lB68OYhnC@9YsTQeRy9&Lhb)%k9px1}mEtHZQDiPdmFS<YQ+~v-bJ9(lI4Mr>?*J z{paMhZ9J}<O_e==c81pp-88ttbv6I&;X^kU#qJiCoZ+0r;neZOE7S4%yNYvW#%q<| zDltvna$}2~L{L)ck!ZDN8+u=sXBDa5kDR5Lc+`G@sL)Hb@cxAnC2BnKm#(lKRySL- zJ5hPZ^(@J>*tnF<BGYs9*J<3}dTEoR#OG4p<y_C)j+{96No@0ivXxR(L%X_GY;CfV zxpKib>@}bF<s%1VRYj+XIl8t4Fc+U*t+Rjr2L+yMPTuVc4oz!i{pVl(o=HBmRJZ4S zaoQvwrvx?rHikgqP6-#LW)V)uxhiJ_COFI!m|)PN;=D+)^YeiQwr1xkhfh{4b<K{x zoh2O=y?1S{BTKaB0igq{_Sp3_h#6jYV!tgCEMYkP=lZSR?TphWB^<qX|Np)Bbx)U1 zF8*ehKL2k-_1<q)DZ6tjo_OkQQRNGC-FKjP`eUVVbN0J}TwPq1U&LqVyMM`EdP-2o zFJsCU`DK^Q#l)%)Jv_sl?edagmQKm3%S-LE?$lP~G_ZH)?cd-Z)z|rGu7t=k6A2Nv zwH5|q>^|Ff%Ws&n$1VNUiK48zn{D`=KNm_UzMHW{oR{}Sd)}ntt-{5nr>6h9I892N z<8X0pxAd=1iIEdbH(E8QZkVX!a=!oJ#MdP+ZO=Aat(^RA&6fBR7Y)n(R42<deK)YQ zcD>}$su`3xt3*P(|H8pnDaA&$U5l3mL@fAwki+uJ!I+AGUp|l0{(gCLCRVRj@9Qb^ zQ{5#7e3|jf?n}BGCw_jJa9bfLV%_95noal31rKZx|EoXA@J<9Df0%gp!*%U%k6-j@ zTY7R+)?CAi9fcC>uDN_(R>K*fBHg<8P}STm8b?>p)r`EnLtWD?aI#gVdh!zIgCA3t zZ?xC6*%XyHan5w3rx{^!vx3!SPfhz2WOh8?%Ex)#LAA+eHSgIREYZr2n{_$i`u>HR zU&reTTiIWldG=zyr=@0)d3TWbzZWqv%Wq!zyGU0(LHTHV*s3ENryW`&dGfBtRW7rg z4Q;z`NY#})qz0D8nik}*DO#>pbA08se;eAWkF!ayeX1Ll<vjE0MmFP1*F!9FW=|>5 zS@`LZ)RVTj3vKnTD`(_y{L8r7Pr1&TH@qb56U&TgOR~>-&CIZxvDM`4%q8{8p8vDv zUHG|?ab9no{IZ}gB^itE9}nki*}o`p{gOjdHcR?9ZC`Z1>AGu;xW36ezPI)j=Kjt1 z1LEQucgyVvcd|Yhb&)qmWlB?~eS@X4h)9RqyF+UmE*|C*SZ7;zaPFIK_8YDjdZsIz zhTToubn=pX!~SV?^Vex}DVBI0Z`csEqrPH~!Q9A$W*40Fcy&$N()NFuwpjVA(l^PC z%+IT=CUBMSy54lp@rUM;V1v(X=QeXpN>i*_-{OAauiR?CkbSwop6|CkqR!3o&G*yN z`7v#C?W9lMxyD{AZTBwR&aS^c=5U(%m%`raP2y@sKML9GSVd~iF@?-H`eO18c6+wq z&96-2GjA~DuWA(koS%L3!1Wx<Q?;^A3HvYPxySwZ^gz~R|H8VdZ?|=Puswb{asCbE zL*K>TRquLPXYxRFO~USX+-nT^0-4WVb#Hs`vF35@Z;hf4(=(n=b9Fo_FZgPH&mn~= zr_N;EH9j;=w5+S~-KNbYi)ET4#cqmZ-w^qndhOrm;6F>}Y9!pA`jtt!=4{ip%yO1n zvY(#reK=QBL+jXD?iC78yix=Vy_)7r=6ucT%ik&Vd`I~I3e%jI)3lXkx4)LJpBLA6 z$-eD&%>N(xFLEdSE9|MhUX;3}?s4#qbL%q-oBnM~`W0gLXWsV9n<9=|{C!-JQ75YS zzlra(+Y9;M!bUp%^^VdPU(4_B=>73>?zxF8>T8tu_FT)ak<gxYaoUz&*OIaxU*VQn zT9+=!f4+00^p~~Y1Ed$(^)C(QZWc+H@O=40!TQYg|E?-Io_qgUO?uO`C2KodFFv|6 zN8V9ax+>ae@|~)`=e91|5`VeI(W=RZ(M(Ck?tZzcz>QXsY`F{fcX|}e?^R1F7uqW1 zX>|JR-sy{2!k;WtK5l3CjrE(>e(~z9mFpI0?!EA7=Zg9_7P2Z{Ji7C<mm1!9_cMG! z=n}57ZK<Uf)z7B=JvVtbugA9dMJXb6Jp1G-+H5CXsWfA$zNr3?v+H61%)WW~O^T0f z*YenEd|;nE?bCz$W)AsE#^cGIjrsF9>P{@!;=l6z#=9qS=FdN9r`Tpc>4|l(S(~M% z?ul!!r#$G9m^IzCJ?Cf4h3)tF-sedb{|oz(JpI_5{ha@{mDvc%I!1A9oNe_j_Fb5s ze);>wri~68+Tu4!>1uy@RCLC)>(|ccYoA$anZKDOwDd1xOJ>Q=EsdReIqiDk%{40y z#>Th$Ex4V$<H*$LSZ~?V`<)N_BVJ2M$wU<CwQ+a8(5^ZjGF$%r{DVJtODrxC?0jRl zrQLM4)t-%QXTHmK&G;}aT>ARY^p7VjZ{+P;y0Dhx(Wg${`a=(Mf3VaqJ^yuo&GOH4 z7Jfd@#*lV${r{(NfA#NvSbjzSOWL<r`!io&-~Z~}`#(n%Vy1j6pJ!O|@2Elvm$<R@ z*ZXfS?7yYREBwvtXq2iN=Yu)Q%NEbPdtmwD8vCxL`3k}6d$mhs?pJF2+&1vp{$gFR zsn7hh-H8(XYEhxP(|&E4nw?mq8}a4NH$j)bGKxED>p4Q_*6;PSkb2wB@3KWkNUemM zU3|xX71^}->7|i|*;_7I+Xc?kdVQh6&~5VKvwvp)n_c~Ny<F=&xoJgPb+o%1U4vW} zuRb&RSMOSzD|wqMcHS;&iA<b*FW;86-rrOH-qO2{Cl;IM?{NCxck{zh`FhPs?vF3( z2rl!ss(jK_@WXog{tsuf_HOydr~lo1YSm?dxVj_}Ub~}K+gEY1Z=QPGjhA=UADQFj z`8rCE?<v>mGi*Bge(RT_p0f+34g0@H@=x(xzWu90*$;*8_O8c{+0%H#FZf39-{@wl zmbu?ZYeHI;d5kIpC%@!JPv%Mvw!%ZdCEl?%Fvqj4`4rFdE51(c?bKc7b6h1FlO&$E z^?!`|e>z$E+oR14vMcTyB>lNr=w?`_9JJ-M0ZW6*Lxb0n%iSz)UlQywaDM(>HtMI{ zD&7|wH8)r6u>9ouT$K5M_<`&t7ixdz@9WgK%<M7kJ5%eYY2TP)Uv2ub@>%mS&D3AZ zuX)!ftvL7K?}O!j9~{}|OKFN{>G$uexiZ=FOSE8};g{5ERlY@n$*=5~Pd`0)^oE&C z+m3LpD_RHBE*>%Q=Z=-vG|$pkkF|R^lhOCh<^5G&KLWC@T>9BNr7za*sc>T7>ED?% zE?s0$ej!=#<x~1X)!F4cZ>LY?-tuY6naO<>8XZp2@5Szim`Mx!F87hOi(OZ6^0RAK z@syHCi>`qCg0-rvx7;t(3!4#f>;3Nz{aS-BKWw9~X`NE#O5NRFxaZ(u*)J>J39he5 z`f2;!y<g^Bpx~A159UQ1&(WTq#(wb2{i%y4+^@1zJF-jmV&FrL5^saj10BcTdo3#a ze5rkI`q6Xy?@08{cr3g?a8c-s6MJ4<n4ums=k>pi<3jpTOLV4h5#Jb){`OuNcf&__ zj=Zh!AD6zp_<8q(?+X9Q=9zP-8}nOkxnwxw<@OfmOM*I96DluB3N}tSpP+bShmEV= z<!y0QF4}+3vj1nkGq>sWWV^SoZ#%{uH<(hvlDWDdWS7>f+%FRCHNuHMwfJ5<c{=%G z!-We^=e?NKd+4A{+0PUAHJ|=<(YpLAZ;5N$S5J4l^sQ~~8^3iYhc6Us$nPq#kT9Fe z)_tpAtgdAKKa~#|Z=MEkSa_n0DWH(?^t4G|Bfh0C%@HrwlX(5|ir3G*_ac}YmR%3{ z`?6)bL0aQ|^BSeSvF&y8YuyYNKCk}qx%fw<o2=y*1N|Q_SoTl3f8KK4*`IYQUq?7( zy_@{6qh9aC*}wDjbWQRmeEzLI?R%z<_>yOJzH{<f?qr|(t#;{mXCWhZ)SAAkC%l<E z!@77JA0+KM`&~IfT~WfseZO0K!KY6vuPuI^==s7SLBv3eGh)$=3Yil}I8qgA4~gC{ z;NAQ7P-D&!!y57WIyU=lbNLrsSf>*ndf55vxl>)cvTnPzI5Y>{d$D5O@qp#>y$=M} zMXua@EB0zavB{2r#!7u3cGLdw>!xN`LM;O3iZ$=K@aOH~^<T|)-Vk$MG$GC0BKL{# z5m9fRoVwp?F`V=7e=kU?e)*?PZcg0Zf)2j|{d3D6NZUOWm>a+6D#xiOO!w+kPF+s) zuzuXV?~bp2LVd*6OT7jUIec6_&O8jZ-?!dJ`|Z*lfv(ys*u8Y3J{^~f*|k2y-05n| zUYjR}FL}7!5o+W9zcNtf=aB;{Ot;l}=bg_!FTU}Ch|3YdPyD}JKAQ69?&hEG;+pq5 z@Op;V>pw#N6P|6=(7O4rd4<?(r5iERBc*dz8XIpbUTY@y(J1s^(B+SImf~0Uu66$^ zEw6g!CsWk>f}MNkSWnUUdrI}f#Z(EeS{}cHx)LX>*$@9aci3TfXvDYJJ$Ko{mACh+ zI3JLy<lTOC{i7)^OfS3_zqs{hMRuG$>$NFWAI`A)eZ3*s(0fkXobi51MseN$joLv> zXWBN1GiUzJ7vhuu{97nt$MoF~Z~D$Xe$Hv@(fT($2HNb+)!ffc-+nXwTmEgg=Gr5d z9aIEAOk3Zx@0IouA)V!n-VSZXhxw<ZYYA(;)pd(fPnhvI;!opI`BLNXqn{Y=y2>1j zKl)L(KYYDgLCuDlkK>m|O|NWBme03RDsld=tUsS+N_iV|`ojl&?m?n|rX-|WwP*c& zpd6LqUH!9GVo%4F*uzs7yDyn6!=xh1zc{|*1CPd1w;$)8o;S=-+<dIHQf14Iu96zn z9bKnCUhCT)-TO%5{WNpNZjIgF74k~=Xs%nk{cr3}O-3UD$#(YT9zKm4K3iu#+R--K zKUh=EMx*<&)VmKmqm36-)Rq3#3h&i5oVS{}qOfsO{kCJpjg8?Evb?J!*S>vRu`cKQ zvg1oPXTL3*Eq{8_1Up{u2FYv3?zDQ8)gDoq!zm`Vq0Q?y!|z)OAr)4=MSPon6!|F~ zSiRDD(;VmXEtl5*vi%sj^!XS6c`hK{mE~`H-W)5E-0||#ymOnS@;3!)?N@mF`cK5; z+;?Jjcee4$HAFcS9pc=%<@b%q{Li0-y?<}ZT|6&-dH>wG9exQ4%WTi<&!6snyS{ry zl6Z-<ygkEFiARgJ$l7te70qm&yu$T>+>1RYAEo)ua{KSbzM)=j|BCw-@k=-!>)pJx zIZ}IBW*X-^!3(16e^;J=#l0){cFoC6OQVx3=l#<5oR)X9C@MMgdHHhYpL^$B{cE-J zkLJ!TXR}}OsVunhZ+=M5`}3P(E>zd?UuWdraAWUm&c7RuUs|92HsW*d{0BFaO(*2` z%eS1;<}p6FBem$w8JC0;y62NTq&AD0Rc1<y957coT^x6Mb7Rul_wLN|Y!}#YmwPDa z)CcVApTtooRO|O>q4M!_PT>h%X2L7Kxa#O!lCz$@tWjvrluOeCFVEDNzWwC8<$IRu zSLw1db(cI}9v~Thf0o_?Ra>93M;>q9G4?)nwG&={a+-aHj{arqr*E&ToX(GA{-M`5 z!Of_$@b<RPs{^_Z%D;XlfAi?F1D6*b?z8_`U3Gi+O`QXaI(}V~%~4>pD=OBPuVR<2 zlHXrF`QFc;cN43w*S|R<Bhot~*Pfq`Zw1G(i-tnV%m*hQ|9E;@oS@y`3r`+w*~hf> z-ly<{w7pB)6BY0HKXiJs-E-R8IB)laz&Ag2N+M3>f1Xx;d816)(S0`rTtt|+7BCBZ zt<Xt7((rW7&p#{v^RVnNexKcWN-gQQ>xR92yS7}Z_x#9_vaaxb*}SV&(=!6Uyso^b z(f8N$c8Qdsy-u&EMpE6S1|HLevrg|g`nu;%r{0uOmDv{q*H4<yep+qefBk7kx!j$X zE@s%g?Tjf$nWl6>=KNTp9~*5RTy>5(7(D&L=HGnfDy58!QC0JvMruVJ$=I?wV86Qm zmG_=ZmA==jPOUYS{rYs9T#UW2#NU^@nXjzu397uTy7J0@Ha3^8BZvPO{xD{(e`nlv zvf@DfVV0OvhKo5I_pb>oa$HmA|LDq^p#Q&)oN+$e*0A(`*4J7S^Une`k0<Ciz2aDU zm|e7sDb|o_w?O{%&o0&1Y%Z?deA=oytVes6^%|X<(<^VtW-dC#@W!}JDr))LKOW6l zreO;vUw?UHu3uiy)aysN*k3x%xv6m8*u#?Tyt~tBufw6i?q6(}uV*|7bYB&yb4BY* zqScqgS4(A@A9#IxlPWlQPxsU%4)>03{PT);>S>-<g{A$kR({(naVmLH$NLipuL#P8 zo?OfCr{~c+cc0DQc{`OFEO}1NUNiaBZwHmBlb4hS+&l93#&a3{^Al$MJ^tazxsLWS zO|O3|=bdEeI~slO*{szEFLq24p0Fu~TVbu6AJf&X?mcs^v3~w`!6PKS_s;}Now?`# z1kQ+fHmf@E{t8C@i?1Gf#^~B>^q-Gd^OLt!qIvb2XaCZ83ob-H{g>7o^KSa=Ei<Rj zc72)kZ1-z_kNLm*yu3>%F&Cfo_?)C#m{2!S_{z%Y{po8ta$l6k9emct8C=w2q<d!d zd*OM-ZQPbSLi#5xcz3JBYyW2n2N8xsQx8*~b&n@ZWBgbA{cu#H&y}B@ZWc;0XKWt% zTvI46eVpO4dG94_2c!E_{c>(UEB)^EzS636p1rcEb#vTbU#o|!mhH6vyvn%j^Ov)W z%_P^(ei!rNHEY&{$=uavw=Z3KaRG1o&Lw{@{SNlK$YQvX>y*=L?i+iu{2rKo`93Xr zUUH520f}{cLssPS?l4;7{Ao^P<I%LLoHx5(PGe9isXz4o)~B{}5y=mBHaM$(T=n(Q zN~c4M1j`ijs=3t;*j|c$cfWUKX2qRt_c?;5zn49AvhPmCDN**nl6{`DF61a_h(6#j zILDx{Si@{t?VW`oTK0E773_J@)q0;JT;-43uC2O1?>23p(`m;()75Qx2~XQJR^j61 zR)sMe!#sP`#9tdQ&JkGC**a_b#Jw_ol8#0O<|nci&$zVjq{gys_PzG@P4i`QFRz>U zF6|A2K-`NJYuB;YZQQo-o|_6w$JXQ>CW>FYW(I8wvplshR+c?>FXy*ib^VcVY!-j? z6E^z)Oh$3;lM`$Qj(wm0;G%!yBr(sEuH|)W4}9=yp7e`HQ@ph8pC`lSCvzNs3b=91 z5i)8MSMlzz^N$I8$@+Kl<_YdmLaQ~~C$aFH-xjWC&nvUAAV+1oTF~v~l1FFXUfug> z$Lw2^LSsHVT$`%$_~peP8##Wg_ngxHraAXvZk_96JKoy|E_wg#yS}3LrsbK_SGXm7 z|L5CYc=#-F)9*Rke{Lx6Jty8-e|P;uW_C5ExA}HHJG<>qyn8IHdt2R1p5YslubGwF zuKx>CDmIsRi>tcw1sw{1w>U>Ye^2*}hsKNFDake-sB)gZw7K<Do$&t}{);b}-3-^( z>i)Ay6UjfwQLlWyu)F`@8ta|1hL<}xnmA7sQY_woWRam$y<XO-#`&*iMAWHCtXGI$ zt@-wP#GhH0_)aoRR+|3LG4$KA>$MJA7n)2`EtfC;Tq3c<rT^%9Yx^d)<`<tMsv7cl zCfNPI7228~*y8>m&WGL5s*?K)(~Wa~>|7G}2dwD%cTzrC{!~)F>rsZYIa9Mlj+^IO znl?nV6s`Vi(%Egiuy)_FTZ|!3T!ic=$u=;&lRxVpc$n#$;rH_$hB7DlZ<&|(KRk5t z!IJ#h$9Wd;IIh2ZH{x@u^g5Qadh?I7R_V-iQ@Qfq@PzLH8_sZ}e#^BCFBl#Ky=2|_ zlPMwZq3wGm<_WE5wE35MiEsA$Eia{f{!G@pT)D<wbCrvV_dogOeYSSqUaR}=4eyJK z4Wk~MKA;e_>C@l52}gg|Nab&nZ$9k8kl8d_)#}QmiJh&tI-9tDW;n6V{Cz!mt-(jb z=T+<M?{slrX)@TsS~o94+IRUBwP!Q$H{6?QaF>6ftb%3B;nO=BCnPZa`t<K^Y8O|l z>IUbm6Ps6Q?)rT6-Z7Wz>7p%bV=JOk-IFcyFK^M)HZA_0BfY#?VV}4P<Ku&7leQaJ zR!kMz<HaB6`!GEA=9vS1tsPVNJ}6AInX6PI_t{|UamDi)&fAuX)z9(jI`d8a!}H^A zAFuW4uHJcgW7U%r6MXhGI^Prs-t>iy&--C%McDnKW}$;|p{_sszi)i@>D<Q;d!^Z~ zq=(;qU$!e@|MhFT=a|{s{V+Ms-n`#oS)S+NB{j@i#j;m7%w92f;@K+YqK*uUKTGA4 zcFmmp!BVv|WR7?QuO44Zk$d3LUvYou87;muqowHgp3Fn-mzo(~_qy%WiTrWq@<a{Y zi;T(qb2c=zOYk4tw#Hasx?E?EjlS%Qo(r01PY0X4-0;l%(o?5~=o_+H$)+z4{L68j zVX<dQWX0R5pYz(kS=)C_ID7ICqvrAlel82E7SA|$<5F5oio-%-zBh9iK2I|GGNJpf z_R7a|FF!kQ((;a((iyvHDawwOkKEFX*ec$Yb)}s4_io?&T6pRHN~`6bKc9c87V8SC z+dikB@BA}O=G-F*l0WYTWv*BIzvJbK3!2eeJH&OxjjXR*?7bP7S;4?A?7)0C?t|Wy zLtA6+DMy}DNPNlL7kB@c?U6YL@|m_V{Ms6@eAS@^9J;R)-P{kZE_x|hli+Ao`{1{S zwRG>J+_y&m_VCz;7aYD<DLntGm%zOZyC;c?`S|bVX6{_}*n&?ag4yS6^d?c)hBJBT zyS7JMF4`u4VzasBz1bcHhc>U8{%&GLQ3mTNPyREDr!1MiDx|BY)W)rtvubVUy|0&_ z>`^&;Nag*Si=RG4T)ue5e%(x?<FlvdeE;(@>-lj(p@57T^Esp+Ev~d+QTQ)xcgL>p z&*7;mrMbx~Was``$)x&GpEvsBN8dLF_3;ym9w{U(iOZ~Av+DWxg$LIzPoA~+v<{nY z;oI0P^X$dWJc(Sg<n#wIzsv6>l@k?i8uiF#PoLgZw(tzcg{<kvZ?vjZW=?uJDPUTP z)zqi&%GFL-ZY-;u=63nb_FGFMXWfapZ<#uob>pX8jW2GGb$ZOYgm0fU5Pe(x;T5~v z$8Ws3=93(6%N<oowcp?D{BOI6(+Y)%fF<`QC%1$)*moLPGu{=C@!=N8`<}JKHTdc! z?hR{G-6!3dqO#Zj=#4*hHz(?tt8SLw|HfnD?4T!?;vOpS@N>Up^KUZ0={LQxVXwaR zrKj$fciOIs)e=a2^>&iuPql_~2L<%CN|SzhUO(Hp<Ab@>QO~#cTQ1JKQ<S6eWSP{{ zv^)FF`MxqZ9Ft*_wBOqq9l^&cxl5$9Z<j(r=*?vbM`twZHXk^-|4!T2#c%YazYA<y zIC;g|K2JkQ4V8sW^R2FiDtvaFd^0TR=ca9%UGG~jKV8vcpTe@cbz98$)$d+Qy$Zkh zJL$;T$dxAQUwh~IJd)C#JB9V#TLy1&Mf(+BT@`lMg}plJ`PS&T*0;x%Rwp-{znmCQ zqr9XkV#ngZjwwp1%jG8ivj{j6++BVqH`zR`a?0|6&+8`0ZrJx#a9PQ8smc1BP27_! z?)B$Muq~c(v3PsnoIAl8BFnefvvTaJK5ewcf`7JL`|f+sj=WcE5e?p7d;8awg4YEq zC!>Q7uRXl-`Jqp<7k;?7ZB2H>%GL9aC*4k%Tq@Li`&o>Zm%7yguQNJH-&7r6OZ7Tl z<C?m__U{`%ErTD&;)PtoC#CB))Y;sMC}246wsnX8jKC>#Lyok`eQ@3Ma?wuD=AY#j zA5BkHo@tYu?l5(4VJFwiH}1M;?}%;?;?;0+lXMkM>RS1B^8}G;kNb~n+-tPCyJ6GZ z<e!%6ho_hF>ak7IwMd=6Vsp`|A9Axcn15l~HB0m0eh+THE7xXc8su>aTd3cRs?1e7 zt0v;KVRB(ZzrFkAk~kyoMb$fAo#FfZU{`y!oN4f{##fDdMYxNb?w_2(IsHu3K~u4) z?_$$VKGQPWFLd@t?83cVA-lA9`xt%<)49iedYVSi&*~MM7W4KxmL-Z9an5urluBk| zyj<gaZxhq9=eHLB{gPI<O?s8vx9;orZ1`sLtxlc8vVMNg*Xe-|^V_s5eMM#cb$Hwu zS#!PTg?-S|<WB1gTcTq(>$>3Wip`Uqc7_ROI>v5TpuM}{@67Z6raYMc_vYz`o4Tf6 zxnM6HwIe^`dRy<o)xHN;Z+mcc^Pg9hOPs3atO!|G_1DecEbWO-)BN%>Kj&$dIWMM` zUR79m&%ST*fdJOCH|O@K{oK8S^S;8q8GpD8@5Ucbtp6ObJ$-}y=7{z4xW46U@8^oD zev^9JF>aEE{ff^vHqvubyV8r3blu}mv0acp`{{TwFVF78IDYAGcH*b*?z1^#BO`l1 zqv?TYOLkk$>Xgr1I~4-+E-e(@{6G9e`CV?~%li&#__=4+MZEsTnbPsr?8+1YdA?tk zGbDDt_%=bN)Zf6rbi<jc9lt8-7M=adw=cxzsfNx(t`%pd#$KvAY3kJV<>-O?9?wct zO115TWOkpKdNyijLaU9x`fTqN@>k|YPOJOwa-;ijK#R%iC3A!h`2PrB{x8LYZ^Adb zBmJ()22<b6eJkAah^M75@$LDCq8uTIwFF$x>}{3e`dwE)q44qwrHTowIHOlA4mLVo zw0QTKjQ0*N8rL`^SU9ZQ!x|ND!ZFh~N~*bJUfB(sxz>4yeQFNL?oEu<iQAFzU4?t? za)&ex?@6bG_NI33(|GBeAFQ-zlEIn?Z+U^xmuGKSrmb1Nvgg6BX#xtxk1b~Y{#~Xl z$+h65?TWZRzjZyF_>*(~$uv8!{arFeqr*P^sOstEQQ<wc&i`5ycTIc69sgiX-DlTX zvkvg9)b#w_^t5T&QCa=h3|g$=JgvTO*R#&Ic=}>lvULBhN2!OG$}F%noUS7t^hMfG z`{1$QU%jg{UL3HCJhaleY4g6GW6iov|6)#E>|DqBVb3{RzjON)rhh->+gTKN(>X)W z;+jU<Gv?Dq5i8}U?M~C-`*{2@<Jx_>ZaFax&)E&mzs|guAKrN94gU`P1<x<r7S-to z9dH+3+Wo0E^@{Rkb5{PIDgNGjKNQ|;+4ohyW8Iq4KNIA<{gmUj#~3i|&X{{G)%3E| z>zw-qH)q{ToqIO#tifc>cPkI*#2LM2xz4h4<(tx)ptzg~YmFnauSw2VxW40v#yOYU z&1=}VsR!>mT4^|q^@iXTrTurNIh?GE*pz7`>$vqpn8TViKV5EGb(`CB|5{L-zWBI2 zYvh9BdCO8B%{p^^cF^mZFQ1xLW_W!mQLFlv$=sdK{wS2osXx;4T&C@deZezN^6bcn zxf}3u7wa;I*Sk1pzSCwqAGx<$qUP*_t{b{-8w3>=Fn5`Y>$r=shTdpwpRR1$-Kx0w zS%sL|rk#?Pm)r^6y>#O4FN%W8m37=4>I{0dFFI9D&-^K#*%d5%Vao)qH7~@@l_|D8 z6E6KCcGO(t^os7o%MG$qYH#c6u$s(UobWPc#$C1B2d;a{ZEtW2uWI|7)to;0aRKkY z&tWZZQWvV+Iv^kukYj9NrT6yukJalqUKT9yP=BsgH7iYUdf%?gtX*jfONtL{HlM5h zk1u)d3h~V^H8>KzFU@LP=rMh(((`MVig#~0!<e!DS~=TSpS@Y?Mqdx|m2%s5W_*9> z!nsj_BeQ(_ap|Mg0d~^Y;yUbk-7fZA3pm_$+l|lk<&!#_DeG3TNiIlSd)6~|Ufi=Z z<A?KRJP}wnC1~E7mYc07nK{p25VP-KR@;BT^G~GJFGEwoa1*9wH$^pa4l(CBl&q6D z@S`WM=GDs;%+vmFzN__n-9Noz$^D;9d=F~glh&BkRPt2GTCk!-D#2&Y^P`s^e4k_) zwYq+n^M5Vt%=MgGgBEZ3B=yuh=I~zstt|>t;i@wN*{?ly47s2xee}(|+dWBszf%^^ z=$>q``);m??%VT^O8#-wv3%{hsqOGW>8{0{OPnnM)&BnOLbAPI%y;%EKlV6P^eQEL z)~rpzWeW}OmT+}EVY)fzTBVyvmF@E_Gxzpcr`~Pbdh67!s_nn^FWK!*U+ed{ugTuf zP~pmp5A$~X=f9VI_x%Z%Q;}(}7W6JUzH!aRzfZS*JeA(G#jVhdvE~j3PjkJ^Ek&j? z5x0d4mOO4q|G}}=?d=NxlIz#Q%tAu7U*{;>JLFC&kpB8Ia*o&&)-P-M4b)fNy&STF zNwVE_g+-I<=Peo&7yedJ_@<E)5?GvX|IAct#l+M40e&(9e?@*h;_bR9QfmIKzdUnk zt=-(1Ssm}Y3=Vi+*&4iYeN!ll0f$~@z=w@0WrE9kcXi6&y5C}7w%CH*{K%Vc?+bcg zZ}?ueEkSGX244fA)Xsw!;<}DL?EY^e_A>qRqMIh~rmRh2T9w>B=Ok~0=;ekc`P%<7 z_tNuDHs~EGipf0sDRz6|T!v`{7bk|zIo4%vaK?O6U{1T(Wci@Ydv9AT-Wu-Cw<KVi zo2A<nFZ~Md^CgkzGN#TgE4Z&z<Mu0{N?Rp4`J7or$5Hmasb19&R8Q9S?R5~|)o8Kc zTi(^SIc2*yP2Rz9g#VwvNBxw9_s^v@j(RK&%Guz(&nLg~zGF&MzF}9ThsCEAVSj$U z74}r(KA)DnaB;)Wg-L}qwr5-`cqOljxqq~N^yg2TmU)zcS|IoSPOt4VHZ`=&nRO>Q zApM7{K*z5MInz`V7cwXu6}rwEy3V9)Z_m19*4-Vm6q25><Y&%bA8{=C*<&Sdxo4Sd zf;NGArXG6(B!q3IZkRLqv#{a(*q4Q&+y`Do38h}zr1Y!1m}8}~fQRET!-dO|@~USB z&S_6){=VpDTAbhQwaqp++e;2Bw_fSs`}MwidG(R?Y1cFr(>0IeJ=Z*<=ke3_LiDaz zEpA<AEFVO!I!xTs*r(Yx@8+EUY_l$z#v9Bvl0BpKK64+lz#$F0LytQI9=YCWKP6#% z_IT&MuUdOvzU=r?l3Cp9cb{=f$fh};#kyX7_d8^~|LLh?*0*?fScgj<{rR?E;^?1m z@`tu8Y1<vsI!EGUdEwsjyM5j__s-w)V11;(3;BuDW}5z3e)>{BpU>~c?e~>0wYD$1 z{6=Go{{mA%3A<UzUOlndAJZeNzTC5TCd=;J8(uEC_xY96C)uJU!dBhCd9W+p>EoT9 zbL-|#saHFF>G?HXrwi*3DXu%J$aH?o1AdKpx78bMCf5J@6I{Ywmak{KSJN<9&zAT4 z-0+gwUPi1>k1?1pDw@n<F4b?}bdy8bW%1K@lD?JY491*u?yYa^e0e=$!9hEXn<)w9 zzrtt#epqI&I;G%0|GLDdpUwwN_wu!rT5Y)QQ((&bc%!bv=ath%o$|_TOv0Qt`@7DN zndz9$ZzZ<j2dnr0pZ%Fz-aZhokpC{s+aoQe@xbrS6baSK*%G!3Ci$ucHWlSB5Rvn8 zG3m^C_wI}O!wb(cR&Yr+^qjoAPcUwe<?-#mKPvoqE%8I%p-^qsp&F6)pE}(S1KB=E zEt&jT*j2DsNo?DCXZ7kO-+w2lJg@haHaXEbufX=n_QOB8S9UMc&$;Wc)|Y8r?TYOo z7GD3{c&)P+Hu8wQ4B5ylR>gGd>&lGxX2}byOS~rsJo3xP6!N}vIC_=|_uYk)LuP38 z{5w>TeI(mZq=v^KhI@%V!`8n|i>Lqec=b7OqWtB3BGcA9&-9u3SLV;2OJ<X`W_MTQ z$h)kpG+FodPE|GY=Fb7w&#o&7HE2(Gz<fS;e{;{N^(#^Yjkv_b78g9uDX^Yk)~aQY zGksN))B;l<zDFMOrp#XJCsh1->V;!dqISe<e0VmWo6F|cwY03D`{56^eh~|p_&&zh z^W&kW1^>8sSq%+U*5p;LFHwEKmu352=EJPj_uldBbNl$|tn<DXtST2~wi#<G82A`< zv7S&C+jc)+r29g`GJ(jhN1Hn)9P?XP?cQ3X8F<s>M4P|7@|oyBt$6jP>!(-wx`*nB z&N}@rYhle*QBji%Rv}SaOyU*aaq6Dk+*uvt{ki7RzJ*JFazBz{-M^Cm=vI?-q3;HN zS5MQAlJh(+yzzR*uZg?Ate^JG`6W|HnO$<nJ?`t=*5_ZmaCQ8W=zn}Mx1eIC;730f z14hlH9jVp<*LV6w?7J}QZI<`qPmTg285}DbR~2p&dd}cGlj+^pOx>b?R_`}Y`5ERD zTC?cN+q-STf#-@Y*m2K(eEF+^_ESF1{rgUD>U;F!y}f7VB=h@Pk?+1oDeczD{*W87 z$N$OiByN@cFNL!8%n~9W-(3IIWc@|c^&e~|33}d{Ulw^xxtggwY>Gr$dPMETBJJFZ zGOu;FS9>4#p0<)Ja?6_Rw;snV8QOL%sa+bVlbdhe)xD_f5#xmkGM$M^r#3b3oRpvN z)AYlG@{RAJte;-HeOT*o`RQUw4X*a}Zl_a9RxM4nR9NLGu6Ah3<P@GKC-%ig=dX_2 zyJ^>|Rl82PC2zcGcT`=)M{G%5zfC{)Gc&<Q_e2Y>pZ>|W^NQZjr>T<jHIz1_&du4V z&CV3<JH5tg&WF{SddjmO?yvM-yXk3N<Hyi_o98_%WvD;p6?Lt0_4Vo6w;jZLa#()P zu1`1|nblwJT5_D#;G@5Nl5?KS@>Qj-73-$#n%r=7mr54D!fAni?lR#|ygTo#NivkP zm@?<KC6_Vt#gh@dlfBfR*b09=H225T$xEJHJbBw=SKd4>C6xy(^@1DvGFC{OIp)Pa zW!;;M1o7%hBffKSTjWZzqy0^@qxDzjtkQSwS|`CTw=g^2ac(qwf$QvmW1$BozWY93 z`MIEKq+U$dm7QFfDb3ZX*^B0scq;Euo7FdqFRsgkAw%D5nz%~kX@7C?i!sV))Ks|| zB?Iati-Nju)#r&!uj!Mvs<De;dU`ncr@Hw*&zJ0>-<Z!a^qi5hwrBr2%kt!lG(&Yx z;lB+#c8PDEtu(phT;+D36xn&ZeE+fUU1arS>YXn^CGJ%^b!+ptUs*flz^7l{cclZj zhu_=IaW6<M#eORP<I3f3j~}=#&fv2y<@|Kq`|<5%EyvlFo3Hx2Ox)D9GOT%5uF3s{ z0t@0|X7bLzFfT^*>)OvujSXLJ{*3u?_zZW$`HYj@*Q!pRf76$G(k-O>=^~RqJZUi} zuP!Xw_oZjKa%ZvZ@=%L=bKmQ}ZCn&^Q0FGEj&Fa8ZgY~W_S)1{8LK8vJ5>@Cxh7;9 zN0XQ4p*;=G^H1hpc<(ITn))`oC+X+GZG~sHikjN`nDi`8>t5G&N{ZE4*mm8|mdq0i zz6*uhOg-W6t;BK5YyFD1e;6c%&c0c}RJlQ8Wmj^s$_n`}Q&0J7M>Vdl;_Y8oQ*1De z_xurWcU#{&laF6DR$bC`UMo=K(|9!Xl3i7wWUu?Inqq^u=MrN+yDZ)zGxt``TfK%? zbGBV!Onk(4v`*Q6(YLP4Q(WJL&E^j}%sGMQm|?FopWKEWX(v;)_wcJH9<jZ-lAE({ zUEx868pY7&5)ZEOwB<TJA3mr}%jVu0a`5h+mxAVXpZ}QE?fWH__2XRqY_|WAj&}^d zvx@)pTfBp5Wg+Y3m!T4_uRTJJ+kE47dU0f4J(G0W#Q>@B6TYFJX1PpQyYO@OCFjYt z`nQyiuR7wOGpEl<-)-iEQ<rRCr*G&GZge%y5ZZRp#M5WKO41F()qKL*>Bes>Uu%Xd zoog@>_gb^_!_K7_U%&8pdBec+JBy5{n%%L$qYBIR^|!gXL@!Kyru#ZTSa{j>8J1J! zHx@H&yVlfVpDuM>wB7k@^JS6k?-btD+w`)}<;bf%ZGMIS;-ZU}7rs!Ob7|#eLl1dV zjpf~sk7&kjYKlq@7FhRf-P*%DGQ}Ger~aw&b^fNkPDixii{_p9Yt5;7%J#C~)~t2z z%_x(dmz_Gjb<3=b)o=Whz1AxHNqFM6(_{Jl<ZVWUyB^Qm!l!8+rq{CR&YohO9Q6&0 z%N2T_DD~((5HVm6owhQgZmQJw&tfyKr|drcY=N9$Uij8tt7<0E6=jxL+H<$ve<Wh# z=d5v1wC?bMeTMz@=B%fMo;vAHIU7D*)lfCLBl5Y2Q|-2`PL{W=>Sun6(|*F5y2<k5 zWy$W%Wmnct{r94~#q(H-{fmIk;EC>A+1aX+7nm~^7ax(ck^ET082+Z`$fN%<=VRL* z2LwM{UijPhi8s5K*&~JddxRI;mK@x6cJaMG^ZK@&eph$pVg%2x_;=DFb&N~gCG?*; z-R8EC*IW6>TOq*7*N$~cz?+~sJ^ODyQeEv=aF<K}Wx3w0vj>!;x%J!f_&sm#TCi@@ z`O8z>V>&g87#It_Gfrj<I=;weRg=T4CC*36?WOeBADthzct;Ua(ubMG9FBA6G@VFb zw0p86<HXPO<t+yPy<hx!-@Vjsy}|$KiU0Hu{+a)Qg(dxnT%(Y~jzyl_<}3y=jmk;< zylac5-reJP_=JbwMZMJ6Q*95^UX*8jvF1)MpVyh<eCFz_@@HKI-AmWJcw%0-b=xC} zIxhR{iR*t|=BWw$Xmsd8l<((>7n{y9Uj88I<MQy&f|M05*;DVb-D&(;7p&0Y_5GrS zL|5_wKDMk&cP~}x@@-q$^1}RI17}?Q;^pkBLE@9%o)x)tL2&ZRRlie<XT~H<_-UXt zb&|`?QyJl!>)ce<IR4%)_^x5S*W5PcN-N?1R}L&6xz`DOn|AlIi1jVW|GzR;acOnP zUeE~Xmw4+FvdUc}z9H<1$F_q?3wvTCw+dbNExOM6K<)U);Dx;5FA^QUSU#QMq36-w z+MCACSaE;GwV$0Db587eA)|RbMfc*a#Y^|3=0EbtJ9c=t%%4oduHtL?m0k01i)tUw z5b->Af8~)sO^=#xEqi4Z^=`{u)8^!iE1Y+t->z7{Ha@lce8{5dq1QvhH<bnatyK-) zIAax`sNTGl5&EmSZr;56eWO<CbKeU~v*+9>eI$Hxg~jQ)Czbx)+s^NQ{-4Xj20>-5 zi?44?RP|}KoO`eD`F8J1R`z18wKMOYYtd=8cC*qE)iahomS(kO-{&oos<-5`Y*P)j z_19LiY?(B5MWJh2^|#DgJFzqUH_c9LIOB3|^`hs^U*@dxSZ>7>vrENA?!EiboBRyP zzca5ap2;!iM02oUDOb(usMeX9zc-03dAV0&s#Wy1W!^vkM!x9nI=S!(Yv!ee=Qc00 ziGK54k27HhW409!`)7%7nqCuPQr7g9)TyNDdS&}fT$@=rv-+cnmaOhK<&XKB6m*4u z72C{>y1(*3)0Q<~PcyuYn!a+%u{kOS&&<nbC^<0asLP$RKQm;wqHp~%>3i57S#e9H zRwHqff4GSOm*6~|(lXC2YS$`GR~LHEUj3xPvoo<FEvjti&T{FmeT~O2cofVP+j;p9 zx6vudy%L8d<+an?@AlY!ELnE?`_hxHnL8yWK20{fa_eo$<fRMswp`YEy6oh+k_?wi zcAYM47ISNC%B{MR4HS((Y49wWFJGsmqPHUNk#xhC#}}TRZz^NWk`&t#_4LTO@>Lf~ z1kPTy^*wEHY*XdTIpWe9Jx7C!tDdaB@nMFa=hGKeWyZAzkrO#rEX!w^^-+eSlXH5E z;6py1ErK?db`n{RMc+5Cf9M#ou(4IZO!iA=Le~n_G95Wa@rO4JIyk2CD}Vi6Blh%x zi>9O10cM>*ZquxPyZ%hFj4GLGD9O@r=kb0n-m)J)S0v4=TXPKNep=(LxGv)5jl7bz z+#<^vW?$lcV*Tjr>KE%ax4x>Jwk+7uzkg#>%*9KhFC7*{aO*hfrwTZ4?EQOb_Z=(2 zT_RVj3VPG_vu)T>_gKn}chj1-@(Yh|%+lz(Vv=$@w!v}U4tZVkH5VJUgg+?m=YR25 z_R6#KyPU2u3dVEq?M<xJ^>MsyC$;%!hklay+xNy>_J6)4$v*uBqh16*lih^G7k8dB zCQtaW!8kfib&to)1yerwA7W8Gs4l;3{+@}x{wB+&%x=rNHvf?S>uHbYoIZOt{L|sN z^H1IkiE7#Ns(h0LlWfA709)_SytSnkm2cZ3=cw|v-_iT}nA^ZXHe2nHUZ|yU_kyjy z<(g%uI-W|;(Mw;tc-zGNvud`#TAFmlcWQ!%V)W~~URT~c+P!j7hwlf&cngOm7X&UH zE~ryxlzJp6!6vzLrr$y1W!`CX&zTBJiZbu|ue5`A`n}t=?B||85{a4c?B6wphO4d_ z85_kOzF)u;Zez71<lXdpPLnNjyeGP+Ur_U9w`7n%xS`zk`@uynN-3-hzQ2)XP@CJ3 zmMNh>#lN<&BI>W5lk5Hx)(dF|Btrfi(YpVdyG}PMaht~a)PO_cn-gV{=WF;S7990c zS^P5n1Mi=<c(#|k5)N~jN^;6R91u+Fce<S-Idk@3jz}h_Fws9X8;>5YZC|mqJFAuN z{#t?e0g|Dw((fFWU934n@x$5mE8?H7i(vh_IXC)U;FC38;cunB^e$d=fc^W2Yiz$x z$1N4*;P}rMo;c&tJB4LG1it;$^x|iBldwGX^$h>KHi>r5`yPL#GE#n>Ut#fYWk^8U ztB9_L=lufim^Vvaa&l%<&}&dL-4uCR=kUU^o|pxvi&S>D2g@v<*yq8naeejIxl6;3 zN;J-l$~<@VRP?Qte|(#zc-k#>7T(<CxQ*f01{2NII_FKD^iD8uku_nllKCRJ=-%G0 zx+3S@r}(CH|CQLXa8G|`*D{6uw^m!VtefiY?Je~5j>&|D?+#77BmCr!q)6;CkJx*M zB3E!<+?1~F*qdYKaWl=*JoePQ-k?f3Dc4g=YXvPt^OaZiyZ^u2`D3%hi<znE%;xHH zw>ZuwJ$rT}!zJcrnM12~$nOa=+vlxXv5ISI-Q_cDAIth|6<TxR#IlJ?kHzhFEMoS( zGgtP~qz}wV3P%lBI0m#VobYA!fxR)yrt($VUdi~@CvdQ2rcHJ_W64Q{>0)OlY))tG zy0E&%*5bgC_Uf004%*MM%i=Y@9_Dl~j+w=O`c5@xa0K^?r5$Enp)2xbuGR6Mx>Yu1 ztMtcjifb4;-y9RX)9USM=uk9K`>(Ir)%PtD3hy_cZ?!ryXX@WCXWq?Q@cmueS5FZI zrKNM<mh}BPIV&XOx0&za>&lFtIu}nBHh!0=aAEoMyY~OVWqnc|l0SCV&7U**czdb% ztv@f#>#UD#NjP(h_w}b2)7=^iy7U&7#Q&9-`%~ch`>or?Uw?H&8Qj_Wl$)w+gSQFg z#>f6Tn<K}ecxIEK1c#z(`+kwIzk<`YZC9;7*_|Tnbl$5X;NInPe9vpy9w=?R?OOR~ zil|#xgb2rB*$xMNue!?z4?Mc*Q#yT-#qZs{fA+dozGyvm|EuhhS?wyTp7pk?xgAix zBs#Tt-~8$+fhWC}cd%xJMsIPNx14t-htUOB&ji6+Zhc31BRlN<O4k107r5pAE@RGR zCK;wj-i9d^KYYu4J72b_nRk;RlMVNbEEhekH5-I`t^6l5_CEc_+GVJD)Z^zy@t2Ne z`>mIC$9>9GpX}}8VjKV8GPF}b>*E^VXGPwLn@)M;aa5PQTUNZ!?SYk#R)v1+Zr;~C zOoAtW&A7hh)Xl~#tz!M2$%4UWO}bX!dM<rbD&!u&_H!Te>({l?Z1VH`C3+f9tQQoh z<33#W>_mkW<KF4wFH<(_J?S*@OIx}zl67PMu{~mfJzg>*hiWG7oTs-ofBKx4k+Y{f z>Zp|MKXR^qK0C|z)7@LNw*GsZGi`?Co+~c8cb2oL7q#3nyBB-#^wxD5H93d7-^9-1 zQ9G!Sw&lD**VY$|GMDeAiM;>M@U&~z&5A>v-UZ6v4AcX~R_<MJaI?AZ+SRh}Bj>lg z;1f#=6w>vavU&27y=e*xKQ`Wsp0qUY{+$O+$1aAo87jVrx$#Op@b;<57i#ItP6*F; z{L}gR?D_P1;jSIJvWsoja~{Z=WUjxHcY1-&uXSr&{F~JiIahwY>A`Ju#B*-C%X=Ng z&&AJqHz^3eOu2C@BURX{Gqbk-$)tv)*W!&lzDXyNg-f3;>$}#xj<rbUsZ!FC<V%b* z6douom@8Sd@Y-&ZNIfs6mFKN>9gBW%KK1w9l{JY5JFHWbYg1V^q*es6+bAb_PPyW* zwfK;O<a?#xCQ{Q=R|W3*{^eVRQGq|x)uz~O*PVW!GxA(K^J(DqyG4nUmMcrz>Ag8? z^JdPRsVuKQr{^Z*3Eer$P_LM{p#Hw=%GsLFDwoNv3$2))HMx={a^Kvhs@)4T<*qEw zd^%f2<mRD8Kem={-P7di&|m(T|I`k4vp3a|m0$8=lr{&}Ff6?#5fXUxPAAtpH*NN1 z5n55RtZsxiNjIOKmBZ^Z-C<Wtr>mh~o>4-GV)3FYK9ScJABggGeL1gf)8QJ6jA@zy zOh;^OM2vQc%+Po6v&uWUdhv$oF4vBnU_E(<>&EXZrxnlhJ$rqSo#TJpp^YkvE5AN^ zR>`+6CwkY%gz2s=q1Uov^~^=XZ!&d>iPoP!tr57;eSR2s|B{`vuC7_dw=-y3l*N1L zzNvND54m(iE<L-xuH?bZ%1NP#9hC<cWwi@0Hmo^)>ZR<|Pg8CkzP6y~OzLc3<Nl|N z-D$H;*iZd;+8le9^BkMb#h{)wPmB)a9IslJF*op1v45`nbWaT#M^)9ib?M%c3Oj0- z^(~Np%K5T?_so#B_kXY%&$#(Rt2FuY%P-RL%eapF{s?+zUB#cYk6lmol)s{yxZe%i z*QF_Ei)`kWO|P6T{iI3jW=!*@T}$Kl3vbB1;BtL#--_fwovs~krDBv#t}fp7a{Kd^ z1JmZJ9Nf)aVq_A&B)H7>S>{JQqdCd%&W63%5!<)LJFx7g)~%(MN`I~%ir4+q`p9zP zrmG5P8y`kFuABbsNRfGd-fGXYzJD)ydOi(YldpTQp^&ZXR`r!*p<6!rHO?#g-~KPu z`#fviBQyEO)x7TUixOAl&F^oV++Honzvi^^lFw@ve)bVEo&D2g<NTk&UlLz(9ou8# z!Itq>Mr3aI&6|HBE6*LD*Sy-FareQ=;s!5%L|(fUKV|tpsoDrV(+n4tySL8hIk0y) zu2?H+Aeor#T>35Tbb3iexb>c=$IT<{_@p2I-J#e2P@#^iIij!GWB%zi%LC?mi2l7K z8o%V`V{?=KtV)%?7KNS54m?YJc|2Xu`+ecxlO<Qa7iKrG8UHoU2!HkU%~e+ZzdE&! z+V1veeO;NGdOou-{pvmK_~|;sx))Q|t@yKhv4HoP1&Q`EzRYpDuDd_{oIjJ7p|Zsu z;~Ph3UYYXAM{`r)_Xi3MsSyo+yq^WR&n#c~$o~xQtS7I^%NE4@e3q>0seD#r)LYF_ zW9zQ{Ji+a2T%)PfERULlfAdy!m=!lpdlxiaZkelnqheYl&#!Co8$Z`?E(j7jwEOP4 z2H(EPe;nkmn9k08v}N{-u*e4Y1wSPc6Bw)B=w{sSc>IeoXZ}tN^NMGIju%U~N)w!l zP3QiZBeT@>t8Uq)BDIV{?!(usy{j!`?dzFOUn}62d!*3w&7*Tx!_o8N!Q3u^nU}Xu zoptlO$D);o&217a%l~a&-N;~SaO7*((=<I+*Q1vhrJRo5zVnxjla;%g)qUCtU!LcS z<>j^-%Up|N-fsK0bJ2%x-T!PA)l;HcT}-`q^5*S0Gjs8!#8xfw^AF=bTsQEUGwpct zqnOhcAEy_KhRCIDnpU7MvVUtWo2Q&s|KnA!er37mF753J$_fv+3CP|2_-C>0*)I-< z6@2%KJ0Dk&e&zQ?(q>wnZkwf>waNZ<mckR0_uVhq(rtXd-P-=q2LaC64?AN1vA>Mv zmCBUUo1%OC>7RcNC!geLUfMoc(veA)cSq%>eX)VZINJPACq8evDp2Zsfrq*5^6TP| z<9|br%WM^$cqb)h9(zxc?5VY-w)b6MUlZ?nly&@@=aX&vCzU<l-Uu=NpgpINKankC zo#TDoqMeE@3%_lCdrzNp-wc6hPv0D;uFd>QYi8ZyJ1eU5kCXlREGxZ#k3LP@S^eyy z^QC~s0*-HveNO&HPoM2Os-NFA%eZ^T-)-g}5;Yi=Hdj2HGp)Mgx7UWgoB9zvIjjO7 z=RDqb<m=nVh9wDteEY=8V$UxwFfDxk-tgAp=_!Aw2xjfm`TX3h=7D_L|2xh8wUulE z%vFK>Q(3=wuGx{McHw^FTIs;YX*;6MHMm;+ta3cT-SjCfjnCl4=LNybmfQUJ@oD|9 z3W)<(`IvURX6)Vc-e1AiaEC%6L$B@3iqvDP+4e*+hfC~UD3^J2!|e>8nKe^c<5r0C z{|Vm9k^RBNgX!Cc9-Y5e($qgU?E8AtKvtOdZF$?{(B@k^Zm+d5mkC~@_8{TdgM?)d z6W+P<ME363Bw9bOb?;BXOE3FBi=GzBvU^u|mG93bq05ec&#gOi?pYJ#{aUfymujm- z;(lj*{K42SInmvd>5H9F&y4inb#60x%)U6~o$H8t`+a9bliKSSJXh|fzPz@IWm3w{ zEAbs{6Yu@`C%q%_3zNyw6Z!M|>??mb@0Hn?E+T&OcF@!vN(yO~TG=vYS8HoiA4f@7 ziiww<W=j1q_n^WpcD_}6m#;kKSEb*g*zhy>A@>XYMLl+`sXG=`?6`e*@=K-S&M8_~ zgO}*NeAIIKMAxk;4Qds^8gJ&ystU-@6Y&!N&doAe$?P}#;~8oHt>=`B+-hGa`AX)9 zy2BOes)oiKn}1GPg72a_E|{>?B~>lGGj~0on@!@0?}z>zlt^}Xba(fsk2-%&uedq+ z$C1(nKUBFt*u0Pu`LI0V=C?zOTfBD6_<z$y>uuSiq8*uL8BV6>CL3^?W%A5Z_1$EC zWw%-)Gt1lA>KnI+=v`N_xl=xgM|$R)0xPY~=GzwOH)Q#J)Fe;6O)26&dE%Jk*=4r# zeA@PZFj%;&e$x_0eg(CO^X*LA&UDH#7KMmR+`m-On2+<xw*LxGZu2=kOBebyImM~V zUBF1OYr^t}p)1q^d@tPL<`prxC#e?ckgLRG-S<A~<>dMIGL@RrUZhBWnfqbJc~O)4 zL(3#CeL8$<*VMjMyLP!%ZN62ie$Qie+d<!2=dW4cWsTq6+2ZMLwQicqd7W8rZ}7}5 znE3zX|0tsqZ{u~<E!-BKSP{d%IQ!?%LyuMlFPHf6sk;1zxLH_j`s8U_Vz%zvlqr>I zIe%~V^DD2jj9Ztf`~Nuj^0r#-)IZPGt<=7|wKP=H^y6%u5BHw<`p<f|Yu=t0Q+dCB zyA^uDk2lrbIO|&OEata!&PnI*dY-+sDqPPfODeNJ=<%=RHGAbYcK6H*yLIk$?(gMw zd&{Jx4A-T&on^aquJh5<_|3A*SFc)Emg;s^;?}vgnd{@@tq)2z$*tXUe`erhALE<q z=W2>ym8NY<U-hI%$~-q=^U|zOrDhv;EnKx|quJtRbIbxJZ2oUmeL&wRD{mpM!iJc1 z{tOqb8O<TL99kYPTzTD|B|~}fGtFBEaz8)!-}z52B=oj%*1fwW;wA;fcbP7muUpUf zhgtc@oU(+kdAFCme$!CA_HyW6tHsZhZ#6zSW4=5tojof&d`*+-k16~9|7_cJ^7>D^ zrMZ%(O11yb9J{@)oaw@O8MOpPSBdQm68ArwZf7pGJ+&fpp|0%x8)iRWZ`;Bp>&&2a z?$Wd+Gv3#{own+QWT@L&;VnxmZ$0shU%!-V`|5>k?~Jl^L~@^G*Ztdikxi@2I7{w+ zN^9A>><FW$@77zJh1^KHB9Yl{W*7R?^rK?1W%`vn+dP@y9<ei)i|D=6x>@(u&6}z> zXU%z(<a_c@(%RCxGS4S(EM2+1xs`HMr)`?lzF*i^ZGrMiKasj^noJ%~of2;w2dXHQ zKWut5>HC6j=^ovSO%HXSf8n8`JNH+zj@wUtH)Wk;?YTcD{tu9oTP9fdDOR?VtAo+k zA^Jz`L>Ik$YX`Sm1;5^Ib^Kb98ryo=lgDiO>0@FRAxT{NotqiuCE}(q@P}Rt<E>eD z@ts7(lUZh_do(VxB^j=2X4@BS`9iw)9M^-?!@sJZwep;kt2<gRd4GTN7l8*)tGBoX zzPTvr>g&HI@Jf=z!H#(@izRMOP7zsLHK}*eI(62?6P7aW-oNW@?u?CY>PFkneUOt_ zxTDP}pyH=Qij=Hq!wH#X7dX{dcc-7LPdwj$?D^c)(o!*|%<}skLqo$OO*i~H_TiN& z^Xtbsyz5LK%13`XRI$kOKi6ebrq;5iRU$LiMa)_E&>~j3VAmImShhLqEat5HVOnu1 zJ37)d;qEGfJECQR8D6cs{Uo<d*2!3{&g@tDVy~9Qu?2@Evi7y<pLy21QGD*UgY1T1 zVxtzBe0wfFFJX?|S?g1qcBMXYOxiAU{P4x>+WA_IjG~GW?rXOjDBN5);p@w@n=YjG zEnU}NkSOrOHOWWgoAfQAx7vr2Wo|C$d)0N!FFPPqpi^>p0+;)ub*DN$GPy7O?=Q4W zMzXhEIQfo(rg8793C?OUpDo27?@KJ0C*<I?EoA8o%TpRhGlD(u)g`iAe6sSIxsdPT zgj!*-H$H5h=_g7TS+)G1>U4JhzuMBD`9?FpTum``bJEWLS;Q!yx>Mw%=jE@azrOuf z;`}gwn*P7-T@(IKn*Hzh(`EmS?0)_Fd0*q$|GwRN|E3%K`@THB_kV4o#bf3ROPKyi z?^osL_0xFiT+J)yKDA(TzYu%W<N)EUstKO=d-zu`P@icMHtp}P7f&P>OkVe2`$fuW zkx3t~2AHxRI(1E7o#8U0f!_V=Wxq?et@=Bi??b%}(|>(ux&J{2|LQBKUiW9r6Vzb6 zz~{?o(!-SVd%4B|Ka=YIZQ6-fG`pnTbT>ybo+@-ne{OioP**{+)Bn14_Tj}WO9kXw zV`4*ZCpZ_oe%fueds0WD>3;!xfzW-<Z5yk9Nj{CV=I@j^oj=z^EFtH^$*xrwWO-AZ z`5tZ5nrzq{DdFeE-gNz7(3yhdzEGuI&yQ@f*EzHJL{XnkluoV2UhU^c7sd0`Pf{yB z(40``Z##WPyrOBQZ#dJb%@0=8J!P22+95FI)^*oc73)i${gzy!&J=1`xS~t4d({li z6<wNcp+2gslFSx-znpgE_#TebcV@K(ch<eyWhI??b6>)WllzZF30`elEpEN#Lds3< zexZk{UlljKobqzTl(oF~KC1-8-t1hpV#cNBjm!8l*EXt_SDqE{s&%~k=-4Nj3pSZ< z(`TAG?wHlEN_xrOMyI=%RDZt;cr4U-YxzVA-p2u~rPA{(&L5k3NI}sybw$@k$)gXo zx2G&#eXwDUaL6V31s*?zA5L4F)p{Z$W=45@N1FSdzNt%|)@y(Nw7&lToBjL$F8{FJ z^GE%U`?v2$-Epx~<TT#zT<7fZovBIE_SpMeb}s9#37t#MIeEA$FnztX^894OiVTOx zmMqRHi}fUwx9?Gz;IVsk-d*RFJC!84JN8^+)2Yi{dUmJKXYtUGYaiO}1sqSD+Ilv! zVf}NnHOp>Ju@eyN)?6C$@n@rlchSq)dsO(mKWV>eWPMm^Zzmv}G4t@+KDn=rCqDl$ zv1!Q5ysD@5$TF8dW76Tv28Whz-nPnW`N772+58z1M$#pVw~5`{wE9}em1d0{fr}rz zx37%8Dg0AZ&plT-&A#BO*|oJ>bFUt_5gv9kxPFD?p|sNWXWl%C<r!^XPTgH7sU*N| zQ~lP**xDq1T2j$*Q@>!fJ)d~geAHc2`zPLC$5P?(;^U>Rt@<UCt9ay{^5zsPCQe<P zq-+26!Ephz%oUIOo^wjdwoH7r>{wR2H?Pu3=7)#kHtrI8*3ZngFxyhx(r4QnkC%1= zr6;ys+np7(+VqP>!%oRfSC5)XpKSIIto@-hjcL^_wam7ncQ+PFKFAT8^S|KvYuQ<i zjQ$C(Y|o!IZQrkR`Uc<G3p<@6^+Q%>ER^k0Nm!emQIO!3bWc0<Mv9bVLc5!&&&^9A zuQyo*xE{RE*LLCd$E*G4)N)mic*Ut450+OsQm)ZB;gIqEd9EIoKlv0tDVw%@+2_Y} z-R{UF4<$L>M^&?zwM~<H@W7kzl$~NlQpTo0Nja{!?|ykb_jY2kjaafkIOm0|;>1Hd zy&wFHmuhY}w1J~pcwhCQjUF8KEQXHjs#9}QJ((HKHtaRpZpXv>;MV7u4JM&Kyk}|L zxG#F{Rmir}>r%Jub2h&5v%_(c)j7Tg&DqOqnzl;Md62_lu_!XXJV4@kWLD;)_&LjD zXK92ahibg%?J%*szldqVRNb%kYTg_#mGA$P*tY9u`TO@%>s?RGH#9vi^@)$MVTPUk zgavCp@_ZF~o!je|X1sjOgNUjY8<WP0w#4^IyUe;*XNO-^aFhSF=U17pLAn+%gQU+= zZixh!2sa*wz1KUOwm1vRh4!uWtw`{kv0ri1v5m228b?KZZcXUCFQ^@F++FkIRO_VM zn@zRWt>wRe`9elU=OgE*s(o8ccD&&```}D*K-<a+uFaYfihpkGI8<EvH7j~*_19Nh zbKX3B-WjgJb3pI^<d@Cj94q5yZAlV8p~t<@pq6*dZ^Io7kN$T(KN&gSZR6hgT7R33 zvpZifs$^-rbC$lgbz7LCT};o+{UsZ9!*4Fn(#hut{2epP-1FvR#an%bTnkL3rUva; z7%cCwi`zrFba9(nu}jTfj<~t8Z`Z_z@>h$SmE_vK5n2A$lUK5}_PN?zn+;5FzlM2b zOIomom#$7*u|iYkGMn-~p4R`Nnk6^yg@?`GJHcdu3#*ojjF3dwLTxLJt*7~V9W`fj zzc)@fP&8LN;e+V^(z_eFC#-yVe&YN|k2icgIVoQ?B{lr-+%NxL@px=pGH=a(bAuBR zPt2T}EE2n<)Fqm(%oht|4sx&w%nTR(7u&I{?D*8Jp)0d*?ke_ppdtM|xZ`~C3z6?1 z?%ZVlxmV#)fAI866BfyLm=|=MI4>`y(A3EtI;B$kuI8Nmv!nO3NzPb1i}4wcwTW}< z^M|iR<W9S{wszgz6>BW1u&2J)=OVL#zkqa6jzC+bh{giR_mb02<`!uET@h<sd+XHJ zav$D9$NN`Ueqrkg`upjTDNAktD~_9U+%|DU**?GTabmqt9RIqnCSRjo?|A5w)o@_f z;bZJ!_av2`XIvJHa@`grB5eH5rlnPU-I~?47h-u&$Xe`W6JPK+q_eo{m4RqY-QmOS zMqCyK_qh(2KlEHF;clxiU1*D?fuK;f;TG=5eO<D%0<*lhI8H^bHHa^KXksQkzc1<7 z*_GiY&Aw*qGXAl1HthHNebC&4Sy5hYVbs-a%Q++e?cTa!ulkgGpTjrRy<>jD!1;$c zSfz7<#<7=6>xy`*S1~;Pv1-*sO^&7$3Bqc7PyDcb^-A{G``!hc7@x{X9F*YN7qLP) zuzS;u&_a&QOIItc@tItE?8}v)u1?W&8yFnJZ+h@&IO)CoIc0&(NiPfkj{EhV##78K z+SRva3ODa&RNNgR;UcP@)1H=a%UEM)*s2Gzv+5`8oAFrKbpIsbBPOTzzrS#QvC2d7 zmXb+(?zZH_)D_GAG=K2_-Jg$&PF*LRpR5Z`ZjQLiS+R80p}?inUM0ANuU(z%6RV-d zKkevDj_yU`Yi9HrSFhZj-NE(SOhYz#ip7aa<1fF3s;5n7n|R-QR<`>*&a*qUZb_Yc zYC6gC{RN(>N2Xo8k#NmfgvEmIk<9l$uYQHDn^n*wc;>nAvFhjz>0J8)j!P%WG)0wf zbZ(Y$TR16LE>Y<ZOZ0_*;(7m1oy!*%xOT#`=#6lam&gC?zcHW06pd$}I4_=i)AIzI z)1<sF?uOClLK<DP>zr1eW_+%!Ssb#aw8+w5sb_ui?kP#Z>y9pDUHY{z%X&%==kj-} zvp&WiV_@i!$Q3P<_Aoyn_1U5<MunqwhxWEe=>}Epf(<{?%zS6`Tn{*(YSX-GO40-N zrW^C7J(M!;6?iUG^on5?TT$<UTqCBrza~ZLE#cj_L^5UG4(H;t0X2%NM7l1VI%Q!a zYPv&0xqZv7ACB#(qi%=99#vGk9~*wjpf<`PM)ON27muR{Q|7i=m)0;YXT7yhfn8;f z8xzO=t_jcIs~zC@v+c>fd_kVlqQk;1XB3{K@Bj5T;rBg3l}WSSE@PT2@A=ef#&pI* z6)_xQO`qoV$tKPU%H^@v%uZanp6N_z0ORe<16mJjY!~cwJbIUZt4}A_KDVhd4B}Tq z3fG*Sz<hWAfvfSx8&2@4d4AfuVUfSA=*oqMEL^y>)fV&myghnN??|hWkI8{0EM*@K z9F|@CZGZcp`!4SkyzTzJ)qS5}(4cO>c<hvQz5l#ig<{U1PsNfvGveL-;&@+H9GX!p zwDyL_@@-s-d*hehewh`qc9}rbl#BNSJ%p})&`8`Xy2|aUjSIJv)2sWei>?V?I{d8Q zsbOGd>&_hwt0#v)blD@Iw9(IjyNkv5VTPSTVVBs6txl2#HSsnL&yVb#9vvHf{7Mn? z7fnY&UAr9rRWE%5qS=`eQv(v0^XIGYS@NUt*0B%yD~m3^zwja;_(a6j>|4I^7kM%t zFX;{QVF<E3vef?FpQ9#4Z~n>8-}SJRX^-5W-9NtAK1tqmZJNWgizyFO3{KQ0SV~^X z`>&d)5^KxG)?D&WQRblKjvo`;JW7QYOyk)3Xuhpv&GdbOSNK^pIj{4-uoOSk!Iz{Y zVY)oQ+j*8MpQPg5|2IAuGlvP<SOye#TRLoc75c-gHfuq~PqVBZ5BZ%1;>+?9isU{e zZ(ch^EaAB0j=u}jP9)szQRYx{eqhy+aLsdvyzvBKmKgC6$H|R*d}nm+XuacQCVF<& z(na@^T9q0;wEx?}GWWsqNxIFkcJ~C?b{GAL^$1wszV+POHIW7ZX3wj`_8RNz>^j8! z@b}cy`vSUlU7yP9yYlU<gNeSD`*@#;r0rIVX_L!pFB0oLa!BYZLvB`1MaHV8^H<Yf z{*SHr`G0%;eBX#4kC(V}RPJuKm^ahSZ$cr<jUDyvv#Rf{QA_#GzVA|tgUaHYS!?}g zY>IbZ`t8=Lki9GHwmYmbWmjRo?Nq4Yzi4Yxkw<(?EdM0MchXZ2N$^@|h<Ucg)*e>a zB~Vw9B2!Q%VkNxb$B|QVVINMe5U`V65Wnb;`t;xloex61j@D0`>C?lw)yyI+oI!fM zq|AS|infK$Qwrz$&bV{vq2FBH){D&Nx~FVfyi8)*!H3VCZT?pMkX1{5{$nABK)C37 zStC|;S4MjeEtm2ch4))b?S0FBytP;644!`Xvo-q^yP_xSQ|wRvp24!H;O}x@Us=JZ z|1V#C4WIk9Ciz3;dDEDcQLJj0#aE|R)vjnc&Cm1sdALbiVBd}lzgWeqmPq|puq}Kb z$$MQ#`-l5azN<VfC6mH$?h4NR>9Et;GCm?EIzKkx5PyEIw`taz`R6NV_0Hnho&ELI z6?M%xF3-QwrVllXB=Xmt+I!rTscXy0ht0|F12l8wR(<M!D8v-}l=p$xnypt$L(hH4 z7YR^Rc$yZnNVW1|r}vW=hxdMKx$Pl-^Xq#BE(ULpH7Sxmubt#c_}9(AXZKS6(oBDa zGyk<$2qiFl;JkQfnP07&%%O!JBnwMk)T|R(B65ZI!`zeC^|xG7v}7``v)#8Sr7-N; zl=WMs)TWd^leTp{%gwTuS?KE06)Y>3aV1Z(a5%I?{fn8JaZB)Of$I}iEPBe?$7b^> zu6s(&gUCR>d0Jbt*U9dPw)`wB@OF0Kj({7LWpPIgo1^x6nhHDSvc76sU@+@rdr01u zLg70hQ`sK=XAbaYW)WdvV&Gud%DB$t{j1n%h3pIrMM4Y={0s~X<%uQ9`MLVJiP@=X znK`LzBXWyxpWywMbN+|@1DU1DaeX1@_IVo5TBRI4MR@C`C4x`YX70=Qv1w9;+D;x% z*D~wx_qh{x)&xHJcG^%bt-O(S!vW@mmEr5_&Od)N=U>9SE*86;t@_CwcilH~Dl<yY zY)tmQ?z&O)X4r0n^)K()^)$)YwVwPcS|c1OcS?nQXJeB37q<>4{o>8f=R2rf-0bS4 z#`@-tj7_5!_e60e2Psd^CyMRoxeLU??GL(3au-Zy5Sw|YV@}HMz@<mEcz4|tx1Ra+ z{JXnn+FLbT*y_7t?T=n8khYI({84;z=Lr|JeeVw2xXi7MVyx56G!(8p&1xULpFz&9 zC~yI5tUJdIQP*4Vzw)&=t4{oUpl8~dZEW2$IUCm%Y;C;7J=>?_k)`NX=@Xf(GKZ3` zUx|>aRJiZ-FfBT8!4{t{-b_y%kGyM%e)>gNuPsl(?48_FZN^gu_Ck3~KYB7I9JXWS zisOr(*l|Ynef9YXX^)~czFVeLi#ly<VGZag5(>z=HZ36MQtd(?MKuBcL-)nkxnDZm za^2QkTwp={U#GP5qBpoiec1$#7;%^@{#t9Lv!0*n;oI#gKm5F=Bz+Fa<rHq|m7cKB zyYcy{RyG!q+erd0f-Bl{*{ZE_+1UPGo8nORtTno2-#3-RUtY{S8~)hN%233UF>jXJ z!uMi4KPvjuzq2Gr1b@k4_-*5}P32pQ#Mc>dXZ{)Q<taMSv|sqmS2m?DjmP}+=C~~? z>x*TZX?yYd^YsTV*l`|Jyk8y4VzPVN8a`utqin&FHT|L4bG0OTQpIEIc$(^>C73<C zv${1FFX&afeuCv{_X+ieO%L+=B6mnxYqM)lnD6=6<B!>`6H8Y3uD#fFiIXvEmm5>& z#kBcbwzeJ?3Xif&7goJo&Ys!S8!|^|{iID|CzrhQ5nHtWQm62a6mFF!=7;PvJD!>! zG+QpDy=Zy%hIJCFPGnVD=@+NE9o}y$bK!7P>>0<9=Ua8W-#UCQ$XTKM|6J_zM>Qr) z5(f@`Uw?o9;hRa0n@yhH{F~La*@EYSrFXi^lrzhH#h;%mO7Wkz<?103#VePmq}l#C zyz}Sg($d1Z?NQTncClQ3cCyFJdPkO@p7q_L?H9R)?QgL^3esJ@_p8?1Eyv3z-<(l? zYrdLsPQ|jl#~N+_KY37K7H_RxZ4|G6d`GEG)YK=hwX4pDHE;LNudn<q7Jhv5?AtFZ z*6y%lu6~qP^|{gY|8MOX?~M$KUzB+FvhjIu<~>@lgDtov;UCvCwOaS}AO6a3oFc-! z#wQ|j%KVUJJg2ra)Tr}o+3THKJ~?`kO_z?~#jjIaHyoIyx~ZswW3t6FLDOAppS>uF zzdiq^zQt=+|J$_^0*)(xE8bDLQ76)(cg~jODFb7)*lc+hm;WoT`c0q76XmzzOE}Y! za0R||=5bvc-|vpr`8$a#OL=LhRlP&I{&}{ny@HE3n~N;jYP+xY$AY=1vxT_x3XaNc zc-}qLxw^B{IBQ?SAIr34uk8KC3#Pu(6<)QfD&@$VYGo#t#*+CK0_(TPdaW*Ni(-A^ zw)jI?(^LlMZ7u&xc8OR$-oEU(fp=p!$0D(n>FG}rdJ|s$o%OwhY05>dUbTJZCsr*x zHtST_@hi(NmGp)wOn<rX_M6-7C$B8K`pTe2O8@dRv$7V?h=BT1Vfk32S^E1-I`;X@ zzn)QW&f<uM?v#^DW%q9CkE~htd;cqAS&k;PMe_GKOWHmx`}{pobk+arveGY;xlYTa zyPi~Dd+*;-!+*;kDQbmfO<2sDWHQ&(Kt<}R>s`_6si!7wH`{sd#PjfDj~@I>GfG}3 z?6Xl?&FZg?|AScBzXfJI<`X<#9a7wO=Jc;AbKkv5v@+FGtUL1R{(^$i$Mdf3v;Ee; zZo1;#fDOAHrbo5j5nr`^#k&RXTWUAV(f_{v^UIVHr6r*o6G~J2wNq{$*5KTF>es3T zQW4R5)6JUwwExU)x%%;L@$;nVPtJ4inXe?}dGw;~l+EJKycZe{*>73MA)933sSuqf z7gl`aVnteT%nrq?HaC`^v$}h+gKN8&=;BlIyDDc%Tkd$nqi@Le|H$^VOPYsXIMkb+ z?-7dsJ@de6t2X}3Y0t&Bv|SHiiQmgs_rdm^pV6x9j-8Ly?!SC=TVuC<So)f?C7%!X z*2y@W&(}Qr=-HHiE2F(`#}s$eJX^-tBtJFWKS)ACU325?eOuHkYZ?zteXPRDy=M`N zu2=JKckdL*yQ&2rRIW7aQ>!>|JNiI|leF!DuQRoJ4oU>L9<kWlyyRQyLCw3pTiLoV zym>b7RnO<6jY}2;c@{;RURx2yvtzc;O2Z8^?ys^73|lV5Yw~1Spy>U_1wUWD6go3~ zjrfTdeQG;HuBgZJWUT*aB)VNI>$34#r#tKGQZo|ve_pSsYWr8`qtz1q*?E<D%<oSa zT+whht4Q9*H?<^GCrWh5FGlC-x@Qi$O<uL=VEE-UvEpafRHqh6G+va9vb!hqw%@#7 z`tiSyZw`z6Yxw<j`@FY3(;k03^V1?e)G+Me(*SMGmTgumZhU{w?&~{+gLk3G7qOXK z!M<+p_ciCg=1bB@xl(Z9vv}4Q?H^*te&|l(zZXB}zj%N*Ba;XNsD5T(c+R-agaHY# z!`TK<7PPiT)}&Fi7DbZ)R4D@kNRuj}icc#_O)aS`NY%%uTLMLQFc#gJdC57YDfmrM zL@}ikk10esN*%?x6T}#ooS2+}>_!fTJ-fCWZJvF5$pUT$hG!NG42Ez+6&M&8cp2eM zA-I!ZK7|WF3{5LZ1~c?B5CO@-pl$zCZ`Y*-HXGR(7|t0$0v}=n$oM}zBpIKZSb%DJ z;D*lzhvc&>Re2Z~))}HZ{<knGrl;pr7G$6r@9aEF|6#ttrVthehDChn#^)=LVti(9 zVtOj7@lONH41WFDYH^yKfk9IV-FP8YQjE_{%u7s1HQsB-cB6u%lX;uj85ka^Gcf2w z!kvME0TlE)x+EE2RElaiC}>KB56AT~Gcd&Spu1hiloZ2@lQK(+k&S0yK+nAzaJPeU zFNY;D#^>jyWu_zLY7PcP!9NC$JtvY_c^DW>Oc@xA;HH8?#E%41(@K)T#v{9$gF(Ne z&(Lh%=^Y-t3=Dhv(am4%O1!JnN-|OtQ&Nji&2O2IY~=Pmie(N11H%R;bn~r)Nijb+ zKczGWEkW+?Ic5}4UbFP61Ovm*9(427Lr5_{zn~;DKM&RY*MgIbKAc`P@gpk(!zW2} z^J8*JF~7JZB_}fp)%*abV@6zu`(EtKWMFtL$IPIO62Ehci7+2lsG%C%<(i^@)^X0! zcgze7azYFYnkWX(ze|k4B}qy76{yBOXwfn}a%1ziqpS=Jx{?eGh*S<rk5?WNXKYFu zs;ORe`;3Y&$m}}K#=yX9#DEqG_n#AIYGw&WX}ify#qjh7J=+>F28P0u3=CQ*q4544 zQ3hkFBS6`PIqIeBdqxHZV{rxsT@-USvogYZ<FLrl$EbqRN|G}Y3rbRpP|6Vw1}z^S zgDbNCmc()}FgWR=hs9fVqKr;0DoRO33*<W<YKC8)HO|y#XJFW;if-^^0b&i#M|bhh z#vJ|AV$7cx3NbL8=tB==b_t>k#!{Do(wgG@y%V;uFfgzQq9@@GTEv-Km5EjZ%UB*U z()wEV!cmKXfy0;)Els@EC(2kXbt5Rph5TbY_nwo1AzuwWd`qH;GdC}}C^Z)~cYq8& zac{A8Dmw$i5=ZoKSd&7O!8w`5C8)-Ng4aB!>iQxU28OQ!=vg@;hd5)a$}vry^2f%c zot1$hKpovwheD!E%}q>3HFZ_g76Vh+6Ou1E85oSB7#I-kNKmoETTYy*Si*Ic>>N`c zE(V5s9_SHf-AJ6F`6-D7nW(O1Eh;xs>a{#x%*w#9P!`?b3*E#ToLYodoBnk>WORQ+ ztlU#p28KzJ=sB%tB2fnCmy{*upgNeXZlBQu@6fAT`572^%F)f;Ih{CjOG|RlYEMuS zGrIA7r#Kq}gE~fSv28g~<`$%(g@TCH5u;Fpe=afX3=EsJ(Suib9Z{whrRHHYRzS`T z{i|jZ%f`U)Llr$3c5Efe;Nr}xRJ0-;lz~~=tZwdSV_>+4Q8L8tA<o>q#9VZPK@Q&3 zo+r-A$H1`D4?QGO4-;o_Nl|__TC)n|V)x%V9sJA;3`cm-Lt^tq;ta0LD?#g?u;m!( zw)HP*Z)9a)SSf~XF4t8e%`MK%M@zstM!NZ?eF;je3=CD0=mBy07P02$qL;n7yW({j zk`%;`axgH+Vw4ef4~R9m1l?dz2v<BmDY%A>fuY75-NimHi88pPC^H?s#j2F!XXqZk z#lMr6fx)B`J%}AY5NB{@0k*Vu+w};8Cl>?5c8o+U^p7ZW%QN%R^3dv`6QzL$H@1mv zRApvhaOFX--j;AM5!05cNV70QP7;{?F+|f3)E^VzA;Q?qypq(Syu=)o9+?-5jPBew zlUT$!85lT?7#I*kHlV5~f+TYjOH1-IGSLG>fvL~1%{9o9kClNTPa3_?aX^$5m#38^ zC+474rqTJ41}xih@_N}B7&vqo7>rRGuX56)nV*uHREpM(@8p`PUy~~AUdztF@JS6l zi2f*%XhBhC8G5(!N=uJ^zw}&1BUT26>7wX1oYo@EhV-2L#1ynjM%C(w(HtYw%uX%_ zhSW%O8~hDOvmrM%H@~P7Ie~I8G+OO8s-KY>azUJdVbWCeXx6eO&4&D>EVNn&6wMYM zYdq@M7#NuJ(4*Nam^AZ?((;S4Q9a<xyvoR{|9rO|7Xw3>8M+4~qe!!$IJKw@)%*>D z1x8Q)^e}$qXJGJ*MvsE&DI}U-Qk0sA)&g9|k!Ym)Agp{X3j>3#5PA^ZD<RE>lA^?9 zw0aa&L9d9ZUcZfvfnl>Wx&?PCNwc6VF()$xHH<)=x(_}ZuIyoAU|<K05uxPe#|=z` z3r~0{2V<bxu*Pkg-VDCN$Vz4gh9EZdSoqjXiVX$HX`pdyw1mn~vDV;RlN#q{AqIwX zmFNR=d)i5|p*XP=ZOEcD@33CfQ>E1|{0s~QbI{{p-z?IM2Nl;S?#HZY5alVTrU_m} ziUputkeQrXj8f%PZH?9UpHLZQ#l*nymYspY3MG=4kY_=0SrYm%jIO_d{&$O*gkB~F zhBOWa23r(+%+`|Sk>axSoRrLDv`YW!#+e53Ia)?fm>3w6xEL5LQLK{NK&Dl>Xc-)o z|DrQ;`Q@1y7~<F&7;I3iiQG)4HCVb(yW-6BzpT6Vwv>s1ftM3KjxKE_(<Y40kKq<u z{Y6V$r+@}i-?O8~(fl3c+LK>gl7|*}T{VgNm0SsPw=y#@%;811YSnIXttw8&7^e$& z$T3`BRL`2v#K0hok@9x!C)=vbyfn0~f>vsVk@=VTH`g&SFr4OOV6a9>5-o?ww5k}R zUE5tfQUB7KH`7y@85m?Rg0K51nHH6lU<My3@hOT;&K6~2V7S4C9#h^Y$+QYvYaL`& z=<y$_ZA=Ud<`^-x`!tzWf!gor>F+X2qS5lXIZLbg85rL7pijijIY*LJ7|}CjnYqE& zy1awmSQ!}lWznmJ)O)0uUSf!)TASgp)TqVgy4M6v28PX^jA+g5HBU&gpahErpiILP z`8iCUhk@aa9eNkCmyeln-Ctr@l9-f(-qrhA)na(($LBsdT?U3zH_#3KDn*RJC7|I7 z^wx?{YOmpjjXVoA#26S9W}q7!<3W_c*j!v|EoT@U=zjVmGXuk3e)K-%**GE%PDiQP zIT%2l^eYJyuAFCLV0h1g-j`-gCd$~-yn;lu+D~}i9j!xq*fl}b(gqF&1|^g-NG1)B zxg|zPrI|S>tw78ch$!4VPz$6w1JgWEcLAl1vAu7ON&S}KXIpnNGccHNFd!!WLEYMQ zxQu|!Z|LP@CLvFvH}}mkdCB@`+H8<<W*lffT%^Q~kv73Df*F^BZXUJ;j}T9SoL75? e3uYc{`D1`LD;r2b977yKpCSW;^b;-y1_l6wyKBz? literal 0 HcmV?d00001 diff --git a/alienblaster/project/jni/sdl_ttf/Xcode.tar.gz b/alienblaster/project/jni/sdl_ttf/Xcode.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f3c6e306a3f63d5877eae1cf393f073bef47cbec GIT binary patch literal 1825366 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∓@c$U%a>Sz{7txlMFp#Co-P!OgUENth~0r{Ytu! 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%0A#K?0kHlvsd@bw_JN=^jVF%*VUL_Tt53;ox72k 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 NEDLNAYvb$@a^#>PnAy$Q_vUUFm*@!?JRp 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∨QuKScRvvYz` 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�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 O_t`C-dEy| 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%0D#tS@NLyv2R^i_Xp#K{h2){{h94d&OK3Qwzt3b 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�@Io2h&4yMAWkos%)T zJLm3nEh;Zw|HR_6#0TDpYdd7Ne!VOqxR(93Qw{T4_Ua4%kDb)seV2T8-00qfYt6l? z-`k$075Jx@uQ3<f^xG^ae{!|S&v^fL<}-JgRcK%5|8dXe)8(o2?z-3Qnz<wGhs4hN z{^#c<|Bu*rt~j<a^&!(w`OHUANyn28?wDpVN%Fe-okKm@Lhlsn?i?xQ_;_Xq-$TYn zfogrtypcNhT2m8WB=sEre?jVs`VHB)xnGjj?N*SVpW=4gBRc1J`YxgQm0mSs+8-<3 zI?r3F+EseheEU#+@t)no@`Yzbbhmx|b~h<Hf4TVWs$!NSn_t+gD9m$}=H|Wev4`u% z#~h&zk8i3a9RGZ;LH2wcqxC#~);AS)C*L3XaQR1U#_D9IGMndYZz|St-1u12Jm2+q z%<=P!YS*RP@&8G4s1d&waj5P0rr*(w7t^fIZ@U|o7^9r^dHFJBwG;6(wyM-;UYl5R zVUO=8#m#e{<e%*`ESu5qVVCDO?a$_!%0I(DtDaOp^L3K{te=zWjrUKfIrGP>sQ2gU zPxmfQ(mkCa^CaN(q?%i6lz;X_#(#?3yzz<s*=v)|&wQ&IZ?fBD+u`?|d)U98sro(h z(~1e#D(7(~%>7_^)A@wZ6WeFg518v5w9!?%-4UJiz5iWm`IgD=&Sd1*PEVNOI^}); zq-w*P=PQcz6|D;=S9f+MGu=Egf7XrV5w3OLf+}lze;5nj)_t!d_^r9HuDo-@OvVY* zdc9lD+N}A~eX;hkP@*xj)NM0khgS>Nr54v_PkGXIP2%LmYa%Cm*ZiFHcunf0=&04I z<s0rzs_EYv`f+n`QMPt`k@RYpqUhB=pXOfEJo$D__oVlmUfmaZq8oNN`ppMv&wm%X zrv8~+y8F>{zoX~>PWm39chWVi>q$~}!;|xC5-0ITB&$x33|6gAJv-@7vuSweVWp$B zGav19`t<x-_oV$B;sXDynSAHsEfvdqx3qRn4prH?`RmLldDp&An!HwcQg!sflUL+^ zNoc!$>JD4<<p0J=s{3=kPX5zn>h(z~d(M;awL2&MPpwqlpSE_&o@-IMKV@I*o|Inu zT_u0hC)NGwwVFR`UvGGF_?rHt{Tu71|5;n=_v!n!)RXy94>vmIWm>A{Z<O+oOE~H& zm$7w<&5c)DKRI7Jp4_{Z@zmzSQ_|;$%=_w5cjVM0n>$e|KLcO0o>X2Fu4<pQSG{t{ z*2qs9t38VRUvGF)7`F5Y=Qa6B>X8q(vsErD-Th=~82d@>HGY$-qn%aLBNnTi-#l-U z&HY*GmX}XW-E*KSaMSfD<;sa$y^Gd;-Iy}JG~m<aYl$bj*9v>h(bp*4FzeR)y`G<# zUY}dG?LXh7=qP?Kx%8z>?_-^Q+pfH~deN@E+qQDOy4`(5@S4$sj-@8=(shs4eGghQ zdG0mu1G+N{_y4awv*WmZr{wqk@9KS93jY6C?44;h@!!6W7HMlf+df%7ul4O2pR}B4 zJ>_-ziPc5CKle9YOU_s6Ta><CU-YZ}v3mBO{u?&T{b{&6S@QnoDc|=r|E*v2<7d;~ z1#{~?6TdAKbKCi-ZpwVu+jh%-SRSssaPIsj`7L|xHUHcc+g2=dn&t8K^$(36%D+{w zn)#vsXT@cs+x6T>>(jsW|GeG$H`%T%^;pfDZD;(v{lE2B-s=AQVCG(ajXTvdf2gs2 zU;Qn${Ll5UhjLX*Q$KUQ);zgfXZw?^>}^jjhi!Xue@$!GZzI(?qFukW9<UqQ{aI&t zIzygo?d|UZ;TLxObv+&MJn8y7<J0Tp%WK0r|8F+>^Lg6Y`pETO`;zvmS{~WxSrmI* z?BrM3-6G$aPMU^IeDvJ==--A<>zuph=c}|^)=iOl_rtYF*L~@eTYbR?&QJ1l`Ey^{ z_K&C4P2ZZnlA;MEMUDTI{un;8Ul|i3Jb!UfqOSP2hKCl@K1)SCnDBIuzvIP+k*@9O zsWppa&F(+hp<;P#p(%G!vipiB5yyQGER?Xbzg=Q^Y-c0$<NJL(6y@00l*adc%y9^_ zXxO1B%WPcr^Xq5U-q|+`vvuy9-bnmx;9h*P-)fha+)Iy%Hm3}Oie@D*d$L@HTgAUj zC-6?V=e#EsaUVB(ehgN*`Syp;C*eM$ll<0Njq_FJc37lOl4G0XH%)+FY3`r%MLMTf z^2yw;X)ZBpDcRI|r`@7JXWfK5>{bT#-j?--Xa3IFU$O5y<F$u@uI=F>vT+j&XTRN0 z*{7_ccjB{*;H2l)b0!(fepRiOEu2&=Bde-kQZnsL@t3ea-$U>GW|jw8_s6elhNsof z*%e|hkL+xE_V=Wpl<;}gJl{EvzjjWyxZL<{zKhM|KVRY%zcfGOk2v_d_~BmWaE`w$ z=Nn#~e&_g?XWGY@R~ss4ChvG6+7~!!ereD2KXa6wKXvy_ofKcTN8@LFAMd2=R`;g= zX-jT@QrZ`EQd;I|*Z=t<|3$m%KW|gWFKO|-_hg0Y&)W9jkHwQ8EnoTQIp0Zr>s#J& zuU~N4WU$Wlce0wfrRkj9!auXT_q2S<mV8++`SkSZBd0a>?<vMPmhG-)z4h6P{TzF( z-=7}l=bro3?9T_;$*F&TzCve?+INQ5;KP+(KQ{$E(VQ2)e!WO#mDkD3M{d8d@tu-+ z^Vx>V-HVq$ncF9FQr?oy`&{`FMrlx7SEw#4*Iv3;v`}v8-rHV1&%?UX<saExI-IP% ze*NWR+J(~k_e1rMJbNL~|75mv&7@?fYu<T6pE{pJJKIgZqw{3WlQ6}tdHhAYC!|ff z-M++QpLWWuCwz+MJ@@H9iJxTMnltf^>XYP?-`l7Bwcqs4dS6#kH}j7-dT;z(x=dUv z{T-tkF0=%Q3QSN6TB@nUAvAG$gj3)e!4`%tCn?TGfuIbh78MVZ6)f5cvaF7-ETY_@ znq7Nr)1UwQR%7>U{rhyg&FSaQ&AGd~y7+y}j@8vHa?j?qyf4;2pnNxrS6S}qJr4U9 z+j1nnz2`G8{C((up?vG@9h?RH=Cbcz={3GD4DYf_E$}awzH|C6>-WO_P4COjcUe4@ zcD-|cujIT3+uCmL+<tibZs!LN-z_e%HD_G+blGpYv!$YEewVCUdP?tVsM78(@6xHq zwuW3?TC85JI9L2?Ox5`m-R<G!E01~Y+}q~;e&(Ae-%jbxb$1tId(M6If7@@9qL+K8 z$nW%5e)qXObNS~$)z-JyB`??I`*HocP<cz`WX-&5^Di&Equy4Wk?nK5eECb~uh(=n zE&Ma(c1vHj`R2j(`K9_dYa`7w>V8}Ng@5kR`V^V)&GqYsfG3+>o@@^K5}8`GU}v=M z9=9jKD&L~jKK*psQm_5#r|*;ElW)3TJ=}C+c}>v_|EW(loG(4;$QL3V+PYfua(+#S zzuEjyvFy0D##^uW+}Lkl=xqNsuVwkJ`v=eO5Py(<SL&jme|hxb^ShNFOurNOLHpf} z7Y1oEHm7Ta{0f%;T<2&xyCzC4*w+5o*1I$RT3r9;AU9dP(#LJ{{6`yWO=ceZoGEwy z`3~E8$1D2`?|xq<arwrx&GL^eT+?zg_a9B;dAU8%Y?k4j#fJ=QEUjb?PoMZdJMYEM zJf%Gse4E5~F8vTy&K~pNonS5BVaa!z6&s^B79N?I7hJK@THsund_(aa!-93z+X^NA z7gntOEfe!#pU$r{U;px*cP)siuKe@-Q;baN`NundG#~#^DtEX@)8yahpD`;A)-}KW ze@&!L_PJ%(!*8uN?sIqAc0PY0mpp5F;G3N?pX)Ub?g`-QUpnKx^sk+^^MuZLhkmqs zd+6B1Jvv7=itJu!zUyT{=WN#fub&;Beb>L%f6<S$+m@Oods=JWWWG_d`*w9sy5jSl zov}xb@3{L!>}ROhsoeGxx$NIcukqF%{L8iP%|D+1Z(pei{(pSzz_#nm-}d|~V9j5W zQO~jOShsL(oIvfQ2U_=(eyp0!8((7n>)yd+p(lTg`wwTzP3C@MY@?Q^)qB`--es*f zpKX@^_gz|P|NhcvkK{c2v&mQWuGUPy+<()~bVmFy+r@k<4@$&|ChyqmY0-9jVzjUR zm#_Eiez?6CsF_^OvhHmy`~5eOzRK$!Uu}L}#ryDAT+ZbU_3Rh#oh)}hb@_>b&D3KH zcOAcfGx7R|AJ*12d#-=xGFrbWKS6zScBP4(_sy*@pD(zQRaW|L^T{6mqxy!Ao%etI zvQBb-g`r*SthUFOSu4#xI+=g1I%pVYzoXThDet9k`|XOE1=abycP>Wr-+w21xV&Qi z!MS_)7Kp!Zxbbbljc+?{d^5Upb~o4e52uc{{0wQiU2U3lXomUGmfP35Ik)%raX#KI zRC}w#PPS(M@y`-HSHo?}FWU60-{`HB)Bn83<mt~#nIY#5<zkO#Ee)(T?vIO?+Bkc2 z^v389lM-TY=vLPK-nh83&VAX;^UHt!u2nc&v;X$_^pGfn{e3(3m3DJJ-!A=W|84HO z*IzS#|IT)Rc~9bpg#20W*){jwEUS`|P0qKw=Tatbckk$&^!#(hqPzL!y)$p^U!Q-z z`_8=M`-1jf$h@axad<X!dR6uVo%IL4r=8Qi@r~j6<TE?}9`Jj3=UkE9$%94N-9IEJ zJYRZg(TD$?r7hN+_1iU0?4NsLzsHmKmYPp{E@bcFf54P)zUQDduXv^DEZ3M<r7iZ~ z+78XH6n>C<@A9JmJU?pnh5sG+&GPTUZ&AI^>$2rOhP}5h*m!+erNn0OJ?Eu)>L2yC zY_I<KAv$i+`^DWqKL4+I6E61g`Txp4+DkrzsC=L0hUcGGtveof@bP`ExyLG(x}O)h zyTi8qc}7B2z;lsef$y3hU)VjgOWx%#k$>iO!^dr^d)|64n>+9I^H~-q+df}v{@mL4 z-Bi#x@<@zY(mFB2`=W;SW`>z-><mGKs9|~MjCR*E!b;EPD=nKUcw|Z8HshulCfoWx z3f+HdbY_;{BbnvjK1n|NE;GB`bSF!3$qnw>Gtr#$KbRd--y3wXp8e14a-M&8H%GhF zoLbF1|KqL$&-d>8F#jIIk45GlUnIHWza2YRU)g`KzS{r5)2|{wmVCE~@!PNXYss&5 zj*pZ3wtKQ&y?5Q_*<0fupIc(8%O#6@B`<F+_hCDG)Z9kgf7AZ2FYY~-eD_&4{&L!E z%SAsrCsuy^Zhibr_oUB{wx91k<IQcTf8uA9?5;_1?BUm33q<$wuUp7}`2R)wLx#V& z?)dE1Ro)jG-uC+S>xXQ+^zL|=H!uFGu%mMx*Y<1YJ7;hfSljZyTP1$rZi&{N*z^N? zzZC7*9>@CqB5Of>EYJPb-VYLgG5@IB>$~N>@LTo=VZWkx%)ho)Np6AmVdk&A9|CG8 zzqeU8KOxTU>95X9Uv5rfev@rd`|pX$?xuUMe=}WobM^iDSnt_?*DR~=`3d0{OWwKb zKl^Y0Y0~H1-j&~W70zEZ>(%D@hF9-#B(K_A*zLRb=TDnG7Awqu-97)YySb{`^-8pC zvCi3+-O<S<FWO6zE7s(_weEW~!_HXjvsBoub+@^1EH;hZUTpE4y|Q%A*R=i59{=BS zKVswkh$HhCINPt=eaQdiy${`026Gm;cYR}jSYgXIZ;kq);IETEn8@lsvf;L0953+J zxHkX6W8R|MCyz@UKVIGPmqY%&q}{zvo8{p*3vJ>>jZgMx>=L+glIL0Lqbp}ku4mof zp7yW$?lTudyUr8o+xX_LxZm*nrN|G{xt#kKn*Uzs{_*U#SR>8n;g<jF-bBv%FLCa3 z=)CowZzAW^J3ZU~{@|%U7VA^kuCFkfm@fJ4cProCVELx<m%<<9Y6b7DUwd20ZiV*Y z_}6I#e^>Z@2)rw7w@m$j{cF|_o_po~xxR0#zZ!pd|I7CegLhTE?l}KK?L(w2_x#I$ zA9z=3)I|0->A&Dy^k3!TKam<A|MvASWFlPGw#{8(Tkvzm`-j<!&mF$*dNWsPo#a)C zzOJn2*1gYdXLKvgdo8<5eC_1Pp4YqP?$Y0ze&XIz_6y%-Ztnhh>uYpcg?#nYz3!Ly zhFzJo;qNk4N88{(x9-%%T>k%Sw%)>DmIt3ZxnFL7wp94L<>Bjx@4eYP%WkvzoLaxj z>DG^LJU6X<R=nxvv}Z}DCOxQGSU6kD#`jJ6wj24YP83fqSouNkVep}EmoAvLNOMl- zkQcL4-F{Z+HrIDyIc1soqB8nd4?kH`utsRpp^a6>+A^!xtSMM?tt<C>;qUuZTkgl5 z+PCPX?a$n#`1>651=sD;`I7Q*N^0Vtki7LGuInQ!7oAsoXuHh*>hpW42WtX--x)8v zuYXU!#^Hze!}Zfxug_=QCTV@yul{Vy-|GGq7jzfBYmav86@1J8({4x4{DV9H?@ax} zBj+k^r#^fB!No7CB8+FxpIhmAn(d||-_+0<hb<;D?@TP);CIpD&FY;6)ux>97R0sZ zhjTwznq_z=R=554iti8iWl7ic-{R#Dh(FYPCBI<VFJZZr>kja*Tydl0_^13Fwz>$@ z_T#I+eGo9^kz4pE>F|un$%khcyPWY6+{{qtGWCG)Rk4amx0vmh_8p#lwX$N@E}s2s z=4=yGU-9b$&s7$`5ZwosSpqiUch!IS2-H67wp*$6OsS$Viitl^`=RSAVT;(et;Sap zD^~ux_&sBlYOwU>o%fQOO2coQt++c?WZm8e&uq+RpIbR?&$dLv?b{!fCfhyucKe69 zSJ|d$?O!q19Fupc{W+9(I9oB!WLb8{_Br?6AC+ci>6yQN^YdrS`L~C6*j8D7l|S}c zX`AWWFW0+ow||!EbiS!vG52u0kIbr#8&97tU-svxlzNh%pkaE)jFU>wiUf=2c6xpd zJMcIDf%{T^U+b#}#PaH=9#2`HxxDgzdeMTNxAT2Impc6Letf^Seyfee@#h_{&%952 zH;ePK)%=CtSLPS2+;rP@k8f!6_7&C-jjl5P^SP`4%bv4-;k@?p)i*!XO=YTId+mVx z)wCZoezE*>%x$j^vVJ)El}?RU>}9*2;ElBs%fo&f_|5&6IH&6EVGG;a?S;P%Ex+pU zW0Mr)|Fv!h!>>wQOka3HkykI|<)V7AKdWzXUEfl6c<UPdhe4$r`;J=a-qP>>cH;ca z;5l5fhwP@-$S<ifDE@oA$jbcwv(HyfDXxG1d5cvw^ZLoxG}>Qn>&UjA7JKIFowGAu z?X2gkf7f)rRnRi6w$%P#?Vab$ao>w<cK2LgG3U_V?L~3MKJ}|s&%Beqf6?<JBA5NP zPCWJ2UBp&8ZS($zTmA1F)voZnR&*wLjx*<PcDv=<HuY<3{hzzc{_3T5a~{Ynymdo& zo2}BezkxZ`*K)kS7N5)UHZ6$z!9Q{NDc;X(CP;(0xp^1nKiiv>cjG_X#s6WK=f7GQ zmp3E2`;NhOzMYAAwl4p7`_!zOKkv}qmTKu>-LEHkpJ!y`S-3wgK5W@#{&D3rwb{8V zr!A8(|6pr+eUG}%I^!#Ly5<%0vJzfxm{}N=R}g=Z;cMmWf;Cy3<pFCS`mNHw6S-I8 zR(i*`n+4&f;`@SA587Udy0~B9-O_u_@5AJ~f9!VoJ$+yK<&U%G=s&yk^U|dA%KH6x zy3Q}2Re3O5Y_9Ux8`2hTxA#0S?LPMBoQ>4;gt^E59V<C2f3WXqrTqE7w?Ad4+H7af zf3|0m_@2B=_nY=4^l8j*tvt9#=Ih)k;%83p)|w-p<$sR*+0zv>rZ2WQ=6J~Y%K8r+ zrCj^sW1HMpZj(Ly&F@1-DZ7nZY5Vb&j<Sby+Yc9JnfzH%6>_9U{O#ph@r#8sZTLUW z;D7M(f2-|;<NuBNZzss5&-LFoJ$rYQUGMF^HF9^8d>-GKVcT+izwUSWQ_1(5Z?k{+ z_db<<f0m`0y+rY;#F#pRXU2c;$elBP{j|$)`L~Zh56(FMMxyVhkIZ$RhcmTg{emJ3 zHbpU~uk0?^*7Zu{WA!S{J&~o2r>}Ta%<pRFUp@Uneu&YZwWk{Y2d#d%`jzgFs?`GP zQboJ%W+$G$#T34MTlc^C!}Y6@3%2cISRWqlYBx2ne@B36)9Far#Ots4+#|~mi>`fI zpqkzNVzaQ_`hP9@E9)QZ5BX_*=-cdC|HVH|KYvZLyBgiJ=)G^srue|uwd)`Lnz{1D z&%G-4JEkw*fBwei9rwO%65jdO{hfXL`|7J)pJMjC-`i>1|Gs+mrufId@2z|Dv+G{D z>>0V^g~!%CIA34%=ZEOS;@3J4x3``Sn_(*XC;8^7w|whax3oW=^0>69Z<d|Ox%=xm zUd=i7YDVD}do}wtKfX&{yi!-w`tz^mMz<1^W5&n1=BAf6T#t->!1P+LV((S<dkMWw z-D^L7aC==}&}k|vmvpvWe%qx7AH&RK($_YsM;!g&lCAw`$5+`s*R}3jJ~|neTCpmW zyYBKTcKr>r4tj=JTU@OY@Y{au;L<ReJx6D8)Tj8ievdMK;J^0z!?)MiD%!sa?m2yn zaesnrld#Tq?<2-*cR##&P5491>&S{`Q}-{PO~Pw=F2+6j&2_bH=4&bKmoky3vV*QB zr+=IkqI=_X#ocFlZ*t<cS87ySuD@+lr+PI-Z~aA+%G8L%n_EA(?0^2Ra?iWVmSuM9 z(^J<fr5EOg$B14rdm7ex+xy3Uj;-OXg|oQtEB~4Cp>yj(ea`D~;=49~P<VLq(B{@~ z&goq9MfNGh>{lqUemL>a<d(^;=A8NB`!r%6zP+%vwVKOb)h4)N?T7Y5>Mi=5_xIS9 zXg_>-NVrv;>pACpk$-VJKDAvaZLQ|IuWl3ggY}_#YjKM?SG``1%a1J^f+cn>E7($? z{_x+S<d(;+>72{OXPGYeV|8AGXWi`*+n6)8Z4qB)ZR)a}vi|@34ecNE1?p3_E&V4y zJNM<T@0~Zw_TTt6<HolwH>a)ZO+T}(#MfGT+gEx0jk!w~72KZP)s*{EDs=Yk`5RwY zZrPWSA0TpMNp_&~LpRsNKM{iacX!xdII=MNx`N>Ux{G#~j@)_noAF`bA$~E|^|d!2 zZSBA1F3!5XR=@MQUDopb@2=es%Q$VvbA4ldQ}nHW$~_-*w=r+umVM~$8|jC9WzH4L zi>2>eeaCS>^Lz9AO~((|zOC4?-j@B`mdOv6elxN-t=BO9c56Z3U&%eE?y;`l)_*Yn zru`w-Z;?AL?Bf!@8T!7bVsWhay%hJu?{94^Sb3NG-vv2_={J)fo`2i<LGHKbkA}ZC zH7EQU`fsg2c>Jx-kMwHUKfC|h)g1dLYnLD2@_*C+MqBst?j23R((9g>wB#2gJ&2xj ztswS!+>U+5Qtz^C8Ot{>J8Zi~{NcQ7HXGm82-Y*+ITy*c+<NsxpLFFtS1RSt71^~; zw`6}1^W3^(YcXTo<0EDLI}S*4<QKRdYCR`XvG_C7pFU&my6cf#`=76AxnFK}AbW05 zMfYdHm}fcduWz(J$oMUD=g77ympfP1F>T+nzWw*@uMZf@(ktfN6|Ore$8vsy`vK#( z6&3UT%GlhmldU@($ELp_{LslV#hM%U7|V<5n)1v4HM}oacWCb16}y$*Jql@-FZ##b zUpng$zjf|ImgVd=hb0-#m#H1<JSXx)|99vQd27yXb98Q$g&k;q!&I^1FRRTFJC5?L zeTR3RTVF7zmUCW8{B7eipV=y=$?~4xR(+_mtiEEkE!Vvq|3>v&>wnkHTKD<cF5B%L z@4WRt)aF?IR=R)u*+%`3wQtnErS9v$d+uNN`(*yl*=I%TY^_fIJAUiIZ!f{S^>I(D zuVfv)l6Uh<Or^Ks)_9I<*Yx<}W^1&I-T7y^{{OX^zyHr)Yu*3;Vbp(yx^rhFLzjv# zwbwoB8W<Dht^0QGHLdO6YO}BIySDD2u4{haR{f=GbvNpZ>rS08!KFz>$n(u_J&mZf zrc?est9({t|9nr}to`@aKmU4Wrg8B(oBQv}(~N}w9DB2%c*V8SCqJ_P<g9pS<@a?7 zyMA=jd`{z-<14rIJot0{=gh##+avF<xA<SWZ*JMvbIWIKK6dJ)q^I85`}4isX3Ytj z`0IDu`|G;XuPyr(>^A$A|4om7@oaT^zNvY|a`yXIY|EScDoFNR<f-#ZGtXI`zO%RP zoVyJF^S4rGK62EZyY##&a#ieO%k<(8aUrtHqfCOoH@-Tile>z4v+ntgHs+V!{O7pK zC)<Czl<(|w(Xex3bDfJTvX@9spBq*azC?05bC`|orJmDAJ&eV^ubsnQwYMb3X3L!1 zpA)y{hfcY<{pX^lG7a_mDL1#*_Z$8Gc2;9^{%g0HwYM)tZ3_+Apl2l)9i5lFGk3~O zb=$9-O6GjKWLYxj+qJkyyZu8x{MGuR_bkoIuU=Hwe8TbA$HMQTek|F|Y4_Oe;Pbl@ zKbmGU#FtHep#4tpe(mC>&sWt2_49Wwvf$sZx#@w{BdeIuJB|0n>JMFY?Q>JSE>Kyc zfBCgm!w;#`*+->6SOv1i>Hp)*7kK~MZsG0B&L8>fKE8h^@ME4e+rIa8-1dda50>Yt z%yB<@Sbx>$g1WEjF%D02WQrU^+3F%qTjE1~A0En5hzaR!`M>ViLDefvKT5Ys>aCsh zaFZ6Z-txNE)2nmt|J)wT%m2*t=G&0T{U1MnUzNA~XHC=n=9vE4OG}IQpWS{r#`ak8 zzRzW~{}=Ah5$~J+y!hzfZL_6*$e%7QwL3ex^7h%S@1I)veNH+0En(i}AM3X4@rwR) zd;Rv?%|Gwo{Z;E&_-plwy=m13*A`mDZZ=q_9M@nkVEW+PBE~z;CM~bK-NN>?PQ8Ds z>w8Od_r0(hfj|2sl8(9`JbP3^+m1I+KP}>8{u(>|Eswfu;~y3BZ2KtKpR8;5e||Fi zPg%SF@k#BH-A|{PN8Q`sd`#8iW_6S7oRIUk1bYOx)|a{)h<Vq>-xlmS8kBe}X{D){ z_r>#!)7ZPten=2x<rn7sP%x3RUh7=s&*^J^m{u&=k$JTKbM4$;%dWq6nf={+pG59G z{hwJ|D)*;kmetoysoR>dZ~Nr+omW!7Kg|yEz4^B(d-t1vHqU>%+5fg_ufA5dqkZ4n z&3htk8o5uz$hXL-#x<39EDHM*Td_QY<9L@@!J-#@&nG7q)LBaDDX1U%ee`<4tQqX` z0^JWwHgef%C_Pk860h-zY3uL4{UNiE-A>)hjPvK76+H0*rVqLonaODHIuw4?;Kwcr z*82j&4`wIzP2DW<&vi{>es}K&+l}0H3X>kRD+!+yOMhU0B=v`XA@j6POP48XNAlG9 zZEGq%)%W4^Cha-ieNCTFNbdW6G3L_e6s7Ygx7y^Vf2fH*|G8kH+1b6N7fb%Ed!DUi zZMm=Ud3x3s%XR*4ub)r<l{@cIg;c!x&T~K6cg$s%@qb?3K1ZU6E&ly!>BZ;&|9Cv3 z|MBr3|Jsw@Jg)igd{ZLpIm`F8o6ar&8KA1RLe!)$R5!fauy%!f@~;a<$G$A=zS{n8 zm+vfQ<~4Rb+kP2be0A7FyM9-ke(zVF)5euI*=ua84E29c_`PA?<C`^eOQe4bepd|K z?)f=||G4V^G|MHAP1yNff7}1L_Q<Ee)5nvVqBdUo_2-x0`NpnkFRi*iDo8T&PkX)g z2iyJQ$vdtU{+lbYF7r?HnY$-Vd+WPJZ%VESw^y2V{de=$d-4~aWn|jK<$e7trMvnu z?~bz*@6>UBTYjf5yiDT%HR)q=NB4hKd$;A>#^`^6-_@sIou9GV{^E<nDVa90?>_Bq z{VjZ?|MRYYr~mFe^Ka7c;&$84-;du_mBm)CDShksyLjnGr<qTpFK)7m%M#yeIs5uo zwQ9cgtG~r>nV+|HexI4R_v59X7QDB*Qz!7h<95uEx8JYlR)x)OUu(v{c<$Xx7QS+y zZ5wX$Jc=)#U3ljiQ(4W2+kf<b)m+Q^uXD>rqqqMA_rCDr-;Oo>+h?A9oBq#rzJ6qG zoRjtPr5{~qKK-q*UGm8L!rAIOeE%mO`0n}cbN8EIn`N#^^WXm0&5qrE;h$+{jrYA} zKYdQWs*uey?!JDtrFQD|tAX49&$;?9)_#9*PQm>{vDvXt9&S8Xer|Wf_55k?J7vx~ z)oFAcyt%0FJ@1|Q3ii6wvM#QVIqbhVzgRx+$fb>+t?zH1C@XzM=2X3i^p$CDb=Li* z^KVDgF8d+B>wNF5nRez*@}ImPH*Hdm@hEHMK5ejLg$(!fY4Hd0Ppp4Xe`4~7+n;n| zoa5TFPtGnVtYp{IJZ)~Cdo3&P)*AlsNxl!Zr{wS0B=h3;Qj1&j50-`YJx;&%VQbH> zH+yRKE@ri!za*XGd)MOH-;<VD+1vDet7Np>Z!+&O>yN)B!CPJyC+h81xc>ix#ozz) z{_RqF)U+|;#rMR@7y~igC6e4->pQsDHLsZHbR<Lkdu_<>a~{TS+#6#bUb1k?YnXmo z_XDRS^ZaSm4~;)r)%g8m+g>7fXzkqNA6#cHc0DmYh0(%0tY!VF@&~Us8P)`EYs^2b zSKz&z{m!kIyz{3zuT9<G`u;SBMRZ*2{1dk~l+?9PoxDHwMCIJ;51RZUe~2zulF^es z<T~eB*dFGXJ1^O$7llPzrmv|Gi@8?G5MDO#(A7E5qg(%Mo6NuN-5#F(kEUd#-de*n zy*TUO)46U1tjld<PD=7jFSXlx>p#=Fr#`L!pT23#wr+oDbxzeH=3mm$_lLgDVK2~r zxrJ}%+B2N~lT071++=p=z)JT0&-bvKm(4nKb*|ZmjGNr=l-v)<pFaQKUJ=(F_j9ek zPvt-OS0rc?u&(j&(?IPyDLJL$t%e_)J_P*qlAauVu<Lrm@l$ypSS-1wowKrNpUm*Q zFlq~Lq~+U(f}7UAuPzKZ-jr;gzh`Io5)TkjV>7?{NmR(>y)k~D|JK?3-)}SDKL7kj zr<l%Po5H=Smc5hsrsaA5)?cf6_pa`93;O$0-a0HO)+=$j*Q)UFM`yopm)YIx9i6vh z_W9{We{;4*-+%r3`+n2o^9$;Cy|$1&ZCl1}I=S!iyg9)W_Dk|#w-k{-`0>!6xEcBt zv95Dk>*lAwl(DKye_i&%Vpj6g_UNC|rFOFMvn}pTdi~SyT>jDT$CkX3nRPpJm+!3Y z>}&p94*SPD*T49y+HvcTwwC@|SMr}%onXB=-g80Ot`k@5td|NmrDo<$_vE<d`g!>p zv$HeJb*68Qu{-$YeAF)4uKkOPGyd(Fo$&2ByH)!mU!gPqUd~DQ<{z)UJih7Xy$vjz z_fB3j=OkxZ^?qN2+tP`-@58dIAFoX<e_hx2X>Nk$#ZPjlt99RdbJ#_nf2}|3Y{{H| zT2Xll)fUHW=YA~Ef3Ce_yD|T}=WCkSEnYt;JSSGMXEL9Ef#2c8bE*|nKC|20(Y&Ge z<iExGgYzx7K4A2d-O+xT<KK}?HvXchL(X&c-unEO|LwP^cG33lPE1$Z-~D;FGkVYe z>QB4R%YEMQ<x%1JsU9Ei@!idjH!+kDkJ=WY^t9&Dg*~fIST_HN4gXrgmz(_8<?kDX z`n|ks{#*;Ilb`GV_x<Y6hikrXzGMIK=5wRgt;UZf+H&VSlBj>$)4JTsyN2K6$^Y7C zb22;sNKe>at5_|xzdT>HdXw{h*+o0g$A2o^*l*ieJHvM7-{M6pGyQeM?<U_pol<!* z?(yB~`L*|+8D;N2!CBpWpZoL%-PKD!itQA;r)7TF{$%b4Gf8ImQ!Ev`eHs_1vdJiK zuCZUb?`7%KTj{@IP8O}LJy_eeg<pD8_=j}g=x<*C{$8EDx2yhf|HD-C&*>MGR?pp0 zyTyL`=jVQ}_C5IAQIi#4@LuWt^V);8oqH}%ZnAW)o$PtgX6Lipo?PG3m9y*PHh)vU z>C5%)xoOV(oZ}VyirM2{*tG30o|i5E>ARm@#m3KEdyZ&wwp;&i2)E*WXzCYSvG4Mw zuI-=y>V1v>zC2pUe)Y8H&(+_|w6Ry;kpA({oXIY~Q~2VAdHjuj7i%9+|FHYgqZ`J} zm8-u?Z>@KEzuoU&RsXBMW@m2Yi`Y*S`6Kt{%Dp#-{a$>IJ8p4Rl4t*ewu3wGZv1fn zj%L_D9gEA69P%a84z$nV{ScULTyy6p@BAXaL+Nw53#J9Ha6U0Fnr+{Ukj8xLuMh9f zHT%H4eEHPNw@*p3-7h^B_4EJMqGt!b&&jWee{9J6ZK}_*jW^DkZcwmpJiboEdgANc zt0_|VZEfED_giLo_xRTB&1P56G@eXbW53<z_@}VEV*c}uQ=TN;S;_y~vaaiTwbSuT z`FT%%==Q~5D!gSseR6Z<raRw7Pe)E$ug3m)`Npr(WjpWji|Ssse%X_~Gx{O_o!A0l zbHTh<%MR+^d3<ft^9S`i?GKmU`CVXp{k6oW>UW>_tq-&>l@H;1``oKW)>!|yZ(V<c z=C^1)*?7|%Q)5@f_TC7M*(JVIdG{*s^)^y-4*f4a;%_ZGJ?YzjowCw>a=TiJwF=K! zm8I@8+tnO9^}Y5956*9vUv-UDZ)|7%YbWnh`R&G%9}A~EusOi-+Qz{#=e@!8AHmyo zY%Z_mK3`gW;Paij4>jc+e|n|a^b3w3yuUmCQ1_kn501Vospz)8{pxV}hbr?sr*5+4 z7bLH((Asm!HtA^o?|sg{UGkIn{WTG5u9WHC-2TBLEQ$YV;hN3!zkUAjVBhq=X+685 z|1}l26`Yg#79h9y>F?&kg{5mB{Mq<Uw%*5hO{(?MsJBZly<c!XR%&|a%7dG>oDW~l zmhAOArMGO``>oeDom_b^B7WPkSw%rX%~o^nUhF9~`*u<^b<WbFa;~4Nv^egEv_1^H zcl$%edbK~RSMlEui+%9>Rq~IGubBTYY&+zCRU)E_JK^|mIlU)q8@Q`qKUj3nZO068 z_UT_HJ+Qhbykp_@mBlA|_ZsYIH5bf#?c45N!Tm7sp4yL<xA>la{dVBzo)nAr>74e@ zWgAadPJa;jN^Xxw=u4rZ9aZ9StL@qrU$L-=^liL+HE74|8(ih$)(_?-so!y5av<>$ zk4@Z^e+EykE@Jv)|50s^XGpVo_p=ZFi%exS-3|pN>FjZ?VRi5RS+FL8<GtYPhXx;o zZQ_m`7Cu^6G0%eQym;h??~nBMc%&TmJ}O+Xs=$t`a@Gk>fAOOaZ!QwCaSv$_?>hCN zC{TFai>s~iAFK}T+{^#4d6m7)db?)#%F7Sqk{I`R<~G!aO#Hwm%D??<&_n*cp9{?2 zPt3erysORTM)tL<I=A`qUhp>Ae`q`GyN9zNIA86~jp#SOMXt)n`oCND$yCJkdB+`- zRqe}v#_ImOtWoFY`|+{rjr5;$_47BM|7acmYV&#RReN)9h>O&=eM^cD`66l6RO@*$ z{l)Y*r&sNGzcVw0fAf#Meh>HDTm5I>j9!`j%U*moQ9FC(%$F?-js?v(w)nqr(GN-4 z<yEC-x+}Ja_@Dc@>3v0s?4R=0bNSeN*dyi@Hr%S2e*f!+j>rGMyr}xp&;G?&?~mDb znG5IbzrQ|kjd>aWN2~T%XY%Gcmnt_FpZaJm-d8;Psg2e8BH!o1wmZ*RUfwacJ<MkI z<NL)n<yMu3{oWT#YR{co&wSKkU)ST%k~y#ZuYOs;A5y%k(9dfB{Z)xp@&4i7f9*=H zEc>4F_2TIu-B+i7%Kq5(Q{vo9jTe6-<2Uc-sH(qa{)YeOf5Y&I)9ar6$oO~v%-K8V zB=&`E^?n|(x9e){;wZuNr|-9a@_$jYN>Tmt+5hcvR|{7uUN5l@kzW^W`Ms3yY8Sgz zd*Ao=TP1taqw7+BZhUI5W54l_$=#mc+>!@(t;l<Fj-zNr*prh6kK>dM_f)6O^|uT) zI<w>Y=0{(R&+OQK+TiiM>!)5WzwY{V`TnPj)7YbGXC!=0+?Ln=>Z;6Y{)b^Uhh81_ z50n2EY3V7M7B}~V!RJ?LZ8O9B*ZesynHKl-q{-)18Ovsd=cml747I(i6Rm7~LvPh; zQ{C&QOg`_Qd2V?{@my!qZLLqIO^c4qo12;C`rap)-7RI7l|krs|DW;2du;b}r*ZCX zc7JZQjpg>y_kA}Pe_pxm{ngitcJ1~5&3@l=+GOMA_bq|fEYHZ7++CM(^Z&dzlKEef z9-h5-{zKt=@gM5%<@TIC{lD<U#CxX;ri8QheOq<ddhf1+HRghTAC?_z-^2PL)m&!Z zqjhbY?`-{0S}t63xwpB#^!uUhcbUWfbcovX+ZV1s5OlX?>aXbS6Kq2{&Mo9RY#AD8 zvA>F0Z-Lg~)DYbrt5$J`2lGC7wTd&wd23_#s=hG4bnWH*cY=9aey^NZQ2$lZ#=*D6 zK5+8`$1K&FE79EY->)4$d9S}<mN>Kg2cw52?~Q6sRCDcLUsTG!bLlDO>tR11>{=yp zCt&K^ylJ)Ed5c~h@(oqqF*7Uo>GsXnuHKCb&)?B2#kf86f8*_yoduw|!WGL7UB8?9 z!C<ST+`4TCm9P5!FrLcTAFBSa@RiM<ox8Z?zvmrfy%PK5|CQt)p{ms_F%gvof>T$w zpFElSbPvn)kk$v+Lp^tFS;a6taO#7kRc0{`S3l2n+Uk0}S9<0b*&NRO+OHU^HTP@3 zYHhCJy}0;&(a{?Z<!Yy|KGXN%#qOBcZ$)*vrN-a5*6(<~j(sOz@l&ai3pLAU9f&*o zzH|2RxYMS_O?&%ZKS_%#<Gg-b;#*Ljdh_0%+L^Kk-@n>bY_MYW7Tt2ox~B81PdFd6 zeHC&z-bUok;&bn#?T<V^_+yUGPv?W1LKbTk{9!wu{lenvqFL=tvwXHL72E!K+M?gi z_pV!puuFm3q0+_Hwm<i_zrDHlM|F;VS^mEonRU~b{t>K-v`TZ2`ZwkC_fOBis?7C2 z{yt@{^YLd>oYShGM}u36{nx%7dsX%#qHpsy)w5ml4=Q3^zaN&lyzIBSezEn}is-uJ z>(Ada`>#oz|7u^L?~lt_>dzA|`yD*IY_3qdueIp^`J0UU`*&OM{it?0Amho&DAdQo z%<0;v^M0@PY4#g#Hxwk5Idg<hRBin|`OD^SN#E5YjZ9?NV)T-8`eqzx*Ot+3Vc{x0 zeNoE!k;7qKZ=(pIZ8a=j&W#faRCeS)+dJ2M_pLg+wf`H|KRdho+1WGs_p-`O7aVVt zG2(s7eWA^`N9NP9GmM|_gxH)mc+zsSP4Sq&^oDQo771_bA2w|LUu3Lyq;C65?vL}# zcs|aS+^{XyG9h<&)qz{zzA<Lso<G}A@t(ZH&x<?OAD_6t_w&Eq7aMIhoIJz2@sG{r z`qr2GlfNj|ZI`a?xG#9vTcqDePWpoBVdppb291C2GXAx?Bs7`*6;Hj%f_n8$EuWmb zx9kboCLFJ^yF-6cxUl$>tw&BjiF&kTPw$T4e@!>0`U|E%O*1>^eWbkmdgp(~9OXKv znzZ5tHX5Oi)PC|lTKr^t$A0a8b-O?_f&Xh`Jl;&^7d}66ztTKyb0K^6Z36cCYSyZC zfpfh6tl|)QFH+oD-tFCCFM3^|UM)}IU(6cye@=gTes~w^e^mJ?@$uj%%}35p#2%^b z?6puR7ifPP_h`kRmWswdO<!%-9DeuI<I(mbCyy{EaeZ9yL72aj<Ku>mgvWCn|IEoy zzNb^?@@LNp;rC+G1^4T(Q~wv>^J<HgyU_8Jh8yb6M;I+<Tj)r4e(yYbB!2Sg4*m(+ zBK|kK?oVv}XJ4*;<iXA#|5}Q-Iqli*_2bP$SB?DU3nH0MK7aTtIz8uVAy=)w>)+iU zclWGw-p77l{$KEw{rva0|KvFJUVQdLQ{E@+AI|+&`_%j+?(g0cs|$PQ&-|#UXLo<q zW7$9dyVw4zZTs-=uxIlD_s7*D{c<fk_cdp)cKm7h!>%{7xk~1RwRGvSNAE+$B`l8| zifn%Nc}CZHGoF9<O)|ch9$auY{Q82s*HxR#;>~$()!sGF_`dbx8P?=~+^6Or`~K7Z z{FB*d_Xq^*Klq{l(DtL~V&+fby?jS*Wm}w^Q4!p0oKxbk@9YbQJ9~Q{*K~cW$-i(- zr9Sb`T*bTMU-~64)hfR0Gv)bMdS}Ac%Ci%;R+gN&^=FM@_U9dv!oT#SH<`ufJrP)b zSA%~+{Mv+1cE<WgGVLEvZBz8qm)!Kc=<NjC>9^b8?ELe1g6;J5wl_QX7^a+0?Vl-r z?2dIx?mxlF^*x`iUkr<vw0zQDn`SHV{_rftd!befKHH|;sL6{u$!}^U@V=e*_Gar- zFB<-2OnHCweBqpoCliGIjA|A6=j2FyI`Cccf5MG<fdx0_U3_`?ThFbww~{;4YF_NF zxiN3z@h7&2zxAw3_@sSy&xHCg!@0A2_?|4<>c;-*{MnxChH>^e=Re*{tnS+{v+eng z${X_@M<4zsb6<Mf^B+?|PHZpIyx;a`!`VG@E1t0DU;ex<u!iHYv!whs-|IpXnM-nX zOp1PlAD6h7o>V#cj>Dg(J<}_?Yv%meUZngn`;+7&^Czc|<e$9W+5S}EV|&q*AKE)- z|2XjXn^6ALdIh;D^=Ve@r8iA$7N0(~-}TQ#n`uA#Kczg<Pu2YxZshi7o6Y<Rmt&pf zC-olLZtDMGTWR`{{ZrK=`;+Y*|8?Y*<tCpO*spCaykFse^N-q{Q!6IR1pfJ&`{O&y z$Cza~hu<$h`u&y5g!xClzdGYs$8~@8<xRXbIm*9slV+c7cb)QI`_y`uI<fhkuV<cX z?uk#cIaIN~Tu1)sj>eBp$K)Pg?U|qOC;OPZ(Y^fLPo<8n?Xi~lZn$sW$JieE<UO4q zXWu@k_P^z4O3Cg%{S7}QUe&Z%KHooMpTx$RKOH~yn3n#(D=1t3;P8FvjkVdmd_SIq zEN1=})^3&Wy~FyvftA91OQzR1o1bqzapK_jbEdTik4H&t-?UT6P5#MSH})F+lh1bD zc+s#Yq2vI6x6gB~#msh<s?q1y`qa&S$-S@2`tkf}Zx&P>?l@=fz4Rl$a(jJg+k1(N z->2_=^55JjPW_+5o;aB|(|(A3EPZtQsAkvpz6bZ^j_#B1cZiAUp1<-B*H5cIIv)fV zAGrQFz0u!gAEQ0Dj8yC1^#@~We`)M{&Q<(XDdlhNRB@&F_Brxb%Nlm-$zA=uHaJ_O z=hfd?>#Yv_y|%M#|AC`{d+%FC{pZTu>3>c5`{|oU>eZhM$E%%J-RGpI7N=eBv&Yfu zNcoApN2Qw_YF58d-sgMo%&&U~f8BH5<7MZvC+c6<kM~dCcdVZr-I+h-cIWjI`ZLcp zp7yTUJ7>$CQ_WrStkP1m_n54*ujY8ZL-hO#|3k06AD{U9Vzqqlt%^JKXFho*|Jbem z#m2r!|JmM|$-mwt{E5_vZ{K)7=Sjl+*5qfK=X9MvXc(SY6Wj7D{Gr8MH~E}PsbA7p ze%;+Oy+5<wV$RS1Yo1<{Z`gf&i~SiT>pMp()<!tgY|c=;r!Y<6zmH1Cd*R4OzmIY~ zn&0i+DKB<iz+UN{N?nMJ(;x4R6MqzLocV+EWA-EUqt-`e9}z#|-@U%{c442&K2Mp; zxyLQ{-R={9vF)+RrhR9R%s!g*NZeKZV|};G>)YOcI)89}T%IKQG5<*Ek?13bkLY)Y zcf^acFZbT#KF4WKxR3Ha?=uQ{BE=ogyIYTNyUh9_eDU~`aH09y?^NvkZCq>iRkT%X zlu+0gP~$g8XrWK1tl{Jx&N>QZuG}AsF1pPT6c_m3k$ObiMgQ{7DHTh1H2qM26!mCr zlI+I~H(d7k?s56EPD1&fVx51@)E`rRWEBR4b^KP0>-nEAcloDe(*MvW(uVEto#L7; z{|NV--TGtq(OR8v{T0`XCVb2~*8YBjOhOIkr?U~0*Qb3d?RkHzv6A^`;FGUEtl!nU z&5hpBR?qk|Y>)Zg#v19mXSL?9?l+vD-e2}YhUxcTiPCuo&adj88^u?sUOvlu@uR<G zQF9N23Se^(A?TC7>0)Dq^~DzsHFLKJ-#^`zJtM6|VPB0K`=b-*OVT7|JLcZh_|JP! zJGyY4?hngfsXpq7#~LLv)91MS-TlF?V&ld38=4Dh`0VQS4}bhB{$g#SmHEs<g}!S> z`)2l5Zok<6V^@3cPj0hkn|+>JPI>*_^?uW@=a0Yh?CCA~yWQ`edtBF_oiDiyf3-$3 zA2~F=O;POMp&#qdw6*uV-lt$+a_82Emcs1AQOk@=WBQp5gN|3++Hv>2&tm>hk&nyv zr}y9f8+V|jF6Ee|-_cvGJ^D$19vA*SBbB(`zFFqqRmr~o*Xd!NcK-hYqWVtA3%RE% zf2^q#E8Lr-I!|x&5#yA`m+O`0>E<ig`QAHJ@-C$2xWzwNjhMs73QzDaPdfX7sfhR9 zRJV!CAH=>a-V&;NjlccPC7$_nE%T<=-c2~AC;i?ypib)==jZaw>O(QyWtqEe7yMWg z`|SNWj%@P@^VdFE{^tLMCFP%;mQ474^iOx|4ym7fhRz?GPq?41?231>bNnUp-q9|) zO{Dwo0q-RNe{!GrKiM?r6Z-?^II+`H_IQ3w`KWO2ert_Pj%!TopV~irZ`+>GSF-Qk zBe_2{N21cOPUK(kljs92k2-7*co)uDS-r-0mZW}iOiB&!W8NP5)IZk8l6$@z+9j=j zDsN!dUMT<gx5WM<KbVjGmYDyedfIcz_o*?z=RM6kHe2$2+8@cs!uQh8OC9r;C^wEf z{)6$@dc%7se@Op7`R!1J+~cD?`ssV-eKhXj|8?Ng#-41+^J#YuSsdLl{o~f2_aSqP z42$Of`q{#)FTOBNah}<m*H`QPzUPO?&06!PruU(5<=>gwQ?%_aZ3x(N>4R;THBbDy z9Y;SH9o@_`f7uTf&f*u3YF^b%+kd=5=&@|i_Rafxeb)80{#f5L-RN)BvDlva(-oqR z?Tzx%i)~N*;5}wM;~(3x`zd#h{4l%r-M=T?pl<Tpr=Hio-=A@=@pp9G$&zaZbC>qG z?zu7X>!X=5tJL2fnf%gaqsF6o;{ItumGutXk66_+TlZ-liV%%l(xnsP8kRe0ljWmA zbD{1lrB-n^^LwgeZEwEY^=;p)PfI41SA1L){GxQSpUqpby%ko|U%xxqU6CBU=c=|v zr_Uds<JqTDt+id&#_nutziaHLHqT>uvFDW;x96NVE^ej0qpEwd$H)26yYJeRzSXec z%a56&9rn#O)^|yW@y@vAn^s;dy|hw^@7m0F=gUPeTl%k8yZ5f@l*NrJvpsgNY?-co zWUiB9_zIbnyzoUnWp4AsJyiA{b5b%+JmeKTXX4j6O;>aLDo(DeSiL*w{|X+_{A>3% zF^E_Tc`iRRq3YA3@DpmrKTqA9G4-oPLEW=GA?nAY=WU!8viF5VM$eYX8dhnwsnZHJ zuM02J=(`-7$8vr1--Md2$5Qs$cc)K$qt%i5eC1S;<)xObOQNC*Z`mxr@%HJb%MV=k z{@Y`08X&%g+yD3eSEAe}GX>&)%-^*{VD8B!Mc-r8-Y=UQGIz$ixvy4#y?*A%|5+X- zYXd)~8}LtF$-vlA{%lXo9q%p6WnVpirS`elYP!eA`N2Ea2<yu;hYH>N$Hlp-eC6UI zu2T-SZ$-~)hPy5`DzD#qOs}WAXyT;Mj!7?$rY`bXv_5ExHk+2p&zOs=1yVm+cq?tF zZ}nKOIQ8Y~2)$Kd6BpNQU!3)zC@_6d#LfdXMzK5ReA8=xyPsp-+9t6-XWo{rI-4@f zyU0A-B~R_*%JRgkMtxFhk!#GFLbuOeEg`j+ttfTltcyKciaspiN-d4JniIa4GmYW( z&I!S%+FqS#6yMc)YVpa6T2ZCtwsY6aSQ8VHc-^ZxBiVn0m`*SES!KU;-ft&@e+M0! za@pK*R_U)(A-=B)claF7cJE6O75=fx@4;%b#`ULI_H_y$S=B4C+9)CCQN_m2!>+4% z#a9}|q&zB^*m=11)OYz+W>qUry;#_}xLvI;?(2?KbHk<{UR4wp%D?>9%@9keIwPBy z(16$MRVU>)Y-#j3?2;{4D{B8rzM@XwG~mZH&y7I=7pH#FlDZWvYhkQu^<-+=eNmyR z7YCLpUWl1?!N7i{;^UuAdgn{Ne#wbV?PQz(Vd`(kZL19)a!;KV`1`+IvMv9jc-z#~ zy=HrzZIhWznWUEK2g$4wj9VmZ7^HkD@7UL6;#>TpqxbOs+G26?#}_lz?yF~XektdA z$!^WA-FndB@Etw%n|E(bHr$lJ(DJ;bL}RjKpbE<(HTBysOC<wqSzLI39h6@)(~{MF zxn!WsfhvWF#ZwPOt(2Q8mH1U|U7gyt&Mm9%s(nxC&P%`M=^IwcWagfoCibD8cOP54 zf!BYj7Ol2(%~kwYl`Oobv@PSkzMA(q(?%z~_Ueznv(mnaN_%Ej>7F<=k?p+qEGNdR zObf1EGc&i7PhG)TwMzBcg^9ub+!o&^iT?d3A*FG9^2PL!BaTk1R3C)bD)GKbJQ&4v zL7>Y~+$`PYeCDz_e8HNZTatKJohb=l<?g4{TeWf0JfX>XCJWlQ*`-20GRoauxXNhG z$@D3+g=@QeA~>%eVBDG+&?e+}H8^s8hM6!2+sBORxlPa2gfmNWWV9K2Cr0G<+zOB} z3ZApRW$9NICp-Cd>^@EYk0-e@T`XYGVRCwW!N4Q)GxyXTPc~)ESYfor{!w-StH`RU z-|GCb9kyO;ciL(=e?4Q@%A`#Xo_*|TUTUkq>Cvr(ke7$%8QNdi<G59QYX}c>j^?V< zjfO5KmMb5;w)}=Nhpv@^kmuC5U23T%4wijVi5D(>To`jyO?0(jsMJ3Os|Ky-!OQOc za@rs#qGT7Ov1?|{ttW1)1LPH0ZH_H^9r}ueX-ANUwgUH0N3mmDpLUlRM9Ey1Tgl}) zh1IKW8B2xK!UP9NwJQu?m9wV!{qs>Zkb1Re3fq*)D*~;qxfaj96|(tL+Lw$ETw!0Q z#ORA$4qKhWbu=V;@3!f0SN%EvZO!##t1>u$FYugw(yFucL_xz&u3vG2-vz&EZgyO8 zIOo;1X&>&yZ0q=%c(VU+-P_~8UZ}ll33PwXx<))Sq)dzbft*;|n}CaPpH6M?6gYYB z|I+L;;TL^uoBuhi?EKEr=H%A%n!8y;O7o_O*4+xbhhke27dW42*FG@qlCfW?@HX2g zi_2~sv*`xLFvflR#CrU4oNVB7LB8JwqP92ptg;B%tu=e<tW_JmHPvLoeyU%4aKKc) zn$_o&-Q|;3tGEJ}3x|1f>{;{2B~WsWoMGYYckerv&&|pFFDScZ<(yldX0DfAUnN>i zay_6I_%>VX<2s$Ib}4sPd^5QhmiBB#nYqVA;a|r}Og?Sfv~Q!qT=q(lZLSLgkEgdD zzIfv+W4va~>Ce$S>|`|ZHD_;*`>nBU)$4+F3@4YkFXx_N{^+vbDba}k9r_}xulaCy z|41@3IV~pkG24BsZYuNdt^1R--E2>bZqVCb7WaCdNnS$J<4=Xmw{lOud|NEp&YN-n z=rWi5L%xTzLw7~0UhxR{t#7t^uT^VT+TRZ$t*RZ1mbzb@Q`tKsLg~YwkjmY6YKv00 zhDBIM%$yvOks*FqYQ>scAAc|0$IX_IA0Yo|*CNK?=ZTu0iabfO8oT8D)U7;Y-Mucp z_769?GP(Yh_!qCD&jznOQtp)4yC#chDNLSGxMmaEUe1_Rx1SrVZ+wz8FS>%Eq^ZhE zbOEEZ`m=X=)~_@kKGG1|x}(Q$vU5pXBNwZXXLYsTY?Z8_vvVxH82l4zIKHfijyIea z?q2I=y!5|-h#GHaQqWW0x%U=*o#0y&@y>GUCyi;1v3<91KApHhZoWc5t7_2R&NWu8 zqIq87H!iGGTE1y-O@jx6_(f*prFYi|9~W{+Wewu^c}jGTp83tWp|0GSEy`a+m?M2c znFM7Sm(J*1*`>Z}@4X1orLQCw-MSgfx;;GKbQzO|)IsJG7BgcO%C~0CnsL5@aZeTJ zp(;~<9goi<AHU}2aLh8!2x97)8Nrg><<dXB+1>T!n+0+KNnhs_Tv>WB#YrRO%x5`y zyU5tZ*H$0>ReNh`#g!M~y0yPjz3uPFMI6m{(&`9TTmR?Ol5f!_W$XH<J?gl$j8{>1 z`;INYX6!YYdSAz;`0<6!ol1Mw*nCub68?Sp<ttuNT))^$6}wiXr$*dw`LH!(?ehE( zFXs!XhjLtZmK(|({3NxibRYAbP~|I%x_;}e3-gy+C;j<y<<q>Rqk6N2=jIvh+n|0q z&t{&HYqDnLi_-$XK37Wkb)PzPa{b}Vbw&K4LJzKdwJKksoOf>N9lq;bisl-H@teK- z_yX7e`fe<!lBN18*j!$SwI-^&v+2eEvz;k>M1w*y9UWuunm!G)aNXc(v@c^~tX|s3 zj&0X%Y6NGp#tOXG;pJAic<gr3$7L}__d3FlO=64bn{sUC50&}TKL|~I`|Hw;1pa{e zYxX_;_0{xx-2XE#4~3eGtSVc#JUnHw!n@qK)Ja?qm(5b}pR=+#=DC1Ri5jDB8;htp z8%yw!0&Pii>HH$AJr%2G7d<MT<8m;h#K5U`$&yP<H&?IXo5J*L%L8*8ziB;*d(>tI zl&0)4oqO6kYsMnyv$u**&8mK(^T$g5b=dDoY-TT~+<A21wdbv!fA;-<_%3(B<2~yR zA7JG0>|n{x(7&GMceCy7r#Ta{kInp9m-bBAN1w5X;gFg~2ZM)Yp%I&7LlZ00hd&>V zYkMqe+wkS-XA3{2rz_UpUbQ>x)vb5yzK3jkayLLJ(rwCKJH91XkCmJ<+u~i>*x)JI zJ~3l`*1Nsm?|%PY%iOg@WqIse<)nS(_utokzgrF>rVIWS3YdPQa`xFi<%nk@6Rks{ zZrxjd)MnwMOA!|qBziTRm|ao6NL8-=quA9<|8+BdHqEF^w7$4&&x}g;^4jZ`S5lrW zoV+({vD&Gr(dQ0)VR`*$#+#FK)3hgiDOtOQA?X|E0j_1S6PDj^IG+9Bro82+?90Jz zi7MLGMkN(VLMIQco1QNFp!w>{PbV0+8dUCMybwHlQR(*FoEY)bC;xr%J(w2kop$1R z$X?~e-^JCB^YzU<yGmEmpR>GIdh3gqXGP8!E`F;L*Za8Qqt5MPX-Cfa6>QWmzqMI2 zCoRdm$<lYFF2nX%#*#vQjSFH7`xChfYBn;K`1|{J=_DyLW}Mn|(qQEedw#WzbC*nc z7L$}w^-On$%lDG4R<$3hVjjJy?~O@1Z+%{sr(4>0?~R|b8$ZvUW-_nl&i}b*cDzzA zQ$D=+$eZ1swZW?dy3>>XN`8B==g#-7iTabLTJO_+v@!02<ogLP*55cUvvK}gsgfPD zcT8lQ#9Oz_s%pvW3ye0C?`NMnnY4XP=r^I8xkrsTXWwPy_#7?Zc>M9yg^P`o%|zv8 z*Sr-@YprIFWI4w^sm1ieW3_;Q^?^oiu0Gp$74Yb-5Pz^B)g*KF$?GlAXN?)7pU%Ft zG1OVd{XngXY4xr!Q|W|x%Nv;ueVZ-gmbRNXv}Q7KrkNWXnd*wEcsxp~6)~E-)l-1o zefjtPw{kPB45p<@-WC<(mVV)}z#!s=!}P{^24OcG{Fz!;CZ&AYXM5oCuWg;@7C45_ z&^V^uoIE*dhH#qQvIX-xi(2nE{#wH1n_yVD^;F-)v;f0gkL1gR-%ia^Iw<5b?W!x2 z(rQx+UF}|vOTi(_qfV~T6LPt-!f}m;Umoieo&#CiHp~@fn<x>oC_1azeOvUd^tg`e zQ`agR8#V}R$`-v*=AJdVMf7I>p3~l2rDq)ZD|Y00;#Y1-mMd1QLWj!KjX4imwKzQC zX!MZ&#mZjT>YyUADds`e;@K<ueEfRKd}U{ZyllFxX=>?r$1?h?T$lF6CQ~1VUKz>T z_6C8nTlr5W1izNI?)dvbC1|F8Q^SM?j_OW5<@C<Cs=GQ^EP~c=?YDUm<HsS~z;Cy_ z_=seT+2fNU{>wUIlaHHla__x-HS^I`jg-!wbt}9?&zx+s+^pac`c$iP&aNf;Ue8ia zHtEbX_ZD0J?f9vut~;5ge>U0_b5N&!Uc|;GM$wi(F$SkuTkom#8M7>{SaDZ;)?1T| zXsy?O1Ku0EC7B6(+<IxUO01X5@{Dki#JmXw-Tz9Xmb9jGY)+YV@UZCId1s@1Pc0VD z3VQQ@-V9HhqK9g&_x8^@w*G5b>5tVJ5vv)FeY(yxcd1dgt$=254wGTv{UnjL4*QBP z5B9x0dC+jK-i~D}GD1S;msU<L=9+uL%*}0ea_W?|tq*iRRX7zfZCt~?<mKF)>@#V# z8y8lvzR0iq^>5?eUD7w_TsX!(S4Ghy?%>OcE0z{v^CYf6K2wp@uX)79$)~L};z4T1 z@mLd8rz4G$2|+wFL^e0IvF}!2rMht?*Nz9-6MD~|QGL1TmHMa0Kc_Kte|?)SDjm`u zk@TuIaj#Q(lVRzT#=}<^No&Yhyms^}7N`|+>*etJcGc2ubI%@S;U6jT*F3zUR@d0= zXx~3~|D%+>d%_Ef4VYgow>bEI@=exxHJ$45k4_3Y|Gp7XsTC|GF;igDI{gbzyiJ~} z%#wNd<wClQjbO|J&P_|dI8Hhc&}VU=PT;}P7G0OdPR$#tcFK1dWA?u2nXIuYDnVU+ z<K)RaqDKoRDp{(Y*uC;zwfEhUD=q>DB^8~u65pK`Wnp@lAAFs?bLX4~lP378?M~`G z!^*XQPvOXf&pT|b=9Q*7HH)RI)(AYaieh$<^^t#3;kL*wlJm^v#v75m`Q>JkkE))1 zJ#<|8$p^({T)#AIoTeyuoSvufu9VZOvgOIqJx`wQd2)4+ht%ocMy~G+D(9_i@;`AT znBmxr53?tV9oIP_%arVXR-{okvtWrz<Lbp}leRFPPG-xB@KG{3d@bJcmD4eUUx(bE zuiwFU!g=nG^%5J*{yaO{BK~As_=MTE9*izqcX&3vJ8jCHezz&+2y3T&xQ@`If1C<t z|C;Xn;GQ(6QOrPj)8o1c{;Qb^XS<4>)81Y+LC)a4Sz(Zag5i^<Bee?U<x>nUgh$Vj z4+t~d;J~L7z%2Y(rDhSUM~{|3>|<q?Z!Dh*7B22*^=+LU>|$@YGN{K@@4WnqsK#c8 zM+yNJ0;l=DYaT55aG<e>!^gp`X>o$arO#%OY(0vd8ySvSIf>OxNJ@B^Ztd&Wy^Njv zO_|aC)D2IXy}midp4Jj9S!e##KBRt<>7#${ELB^qj@`6L4SU2Q@xa1#YN+SVl%RQ& zL!1;Rs%xj;E1uF2HfPnRCyRTw&fI*Gspuc?!!8vSw$0L2VTroZ(#hAto1gH^o2w|_ z{@W~OdVlnbO%*4Ud`o^@{Hd+6nc@1&Dc!A~HyX}g`?F0UVa_w9+aI}9y0kbiOmFdK zf1K)^^hM=w*O40wH(DH+J#UU)bBuMKrpAi|wN(@TSzVF6VskS?RpvoMck_$}_RB`* zn(`CE95=@AmgBt4-Py5W_K{1id=*PfjE&0zIQ=yih+6d@6UuBqkoYeA+GQU3{UTOZ z51M#pzc_Vhcc<7So{&X>CpBj%-<{#v!*)SXWmj8Q_@Zn+&R(VTl|i?|SNeryUo~Wo z3uv8nX!D}oi^?;;tWA|I(<w1p<ji{6^5n@4yOl};o_*GwKY!z=pL6(+Jn)MyxpZTJ zaPyrfH+JN*=|n%W^u4@r;>lSrw!Zf$ma?v0v_Ulfbl)A<n(IPatEO0}ZsM%#x|!-2 zk@!8>ajwe|4OX>RHpRa=?>#QmzpulsxO<VeYt`#hn`SD!?(St0IP$Xb(V=I@GGu<G zWgI^5<M&3pza#n0ny8A$LE4V->Kh*|yAkJj{P~tkr`oC-lqN)E8vbuyV{zEbXV1+! zUjjszH($!|3F-LPozWnn`S@qR^bOm*Yx{bmnfj(Zw1~N}!>uGMY-iZph1mwPPuybt zYp8QX<D8si@ZCgdbIBDK&bA8Z89iI_zQsfM*$Rhenx09{I-ATHoL5~o=2F;T8N2$C zfy-Xjb>-sflk6FOwM?25d3(8RpvR>r!FAjd&MrP`r##2a&GD(OzyCC!iSpZ)HgP7e z-?+#7mUd~`rcL}iE-cY-Zi+F}UNhyXnn2>BIqUAJi*RH$&;9GOza{5h0qeUdNz)zM zBCXbK<XE>-zFSy*@t)%uhq+8e8AX|n_kC4NpQDx0c<x1ObN4~dZ%H{>B~|wF=TidR z)VwrLg~Ul4PgV|Hvf|Q_y4y<>x}_Ns!(Lq3wCEyt$dx@kpPuNQXjNMG!81Kiq37bs ziRWwFo)k`T?7g$lM_;(IWpar^;(Mi+8Ovq1aL==v_410+s*BG3Gu+lLQjgWK-19>{ zD?mwY*T3#1P0u8(luzthwn#xGX0fW(vD0s)6Pv3POf6RSYR-OkrlfWM&EJJSGuW3O zop9pzvSm>Yn?I`MRirJcn*ZhcDWQE^4sY`KEL!BQzBE(bvUf{Jl$=A(Qkk_=wKwIu zFN}(b3g{F%-W0i5cEUH23B5}b_7zvzZ?2gBRO7_d2}gKaL{G4&%`Cch@0-Qdjl8v? z0*kd=b{zP0N_fdZOG(#KrQU5W0v}4!&T<v?6(wFwP~9pKm-p#WPllt>Q^$$BN>jer zeQR5;eAGw1W6tHL8-vcYh6%`OU6VU4b~Zm`0mtr}6H;?8GtIv|@z2_t$u@SA&voQ( z>$qMbIVrSEI=JY1hr4mc(u7Vw4U2{Tvp<zC4iTBI;d)c@QJ9}dR&Q6Q>;mQHhtnrd zWDEXcy@^%Q(^oG0FQ4=t&j^z(>}HG7Y?*Vo4{c(ueAKm!U4e6vh0W>z{XyKm?7qUP zeRH)-G<d6TMO3=1^V9Kgb2UEwZ{y0B%?f@qXU4dvUUIURHr)7-^GoPl3x;~O-KHxJ zC{*U;ANWwv_iJ~4j!fp->UO55Hjz0p8RuG_Y!o+E{ynp=c-CC~#epG_@9v%X;S+gi z-4SD1cI$2DSEer8{%(58R(s`NyI!R(jaanr;ZcF3jn;4Z3jRm5ePLQ$Z&%LucJtIj zMzzLs{?EDL*{HZGd@0ZQuY%&Ytz++<7dXD{)q)h=(5$tki+s18u@5+yT6$TaBelKu z*5VxdpjU4nKAE`dj<3(_X<^Mgzo*U3h~+)~>&(8nIc+z$3#?qN6P*9d$7uJa3EFk% z7&K3_M`cWJ;^o&<Klk^GRB)M<ZCtX>3Z6~PC--g?lw8n%{8;IH-74-z|D4_x-fCKB zvdZ7N^hVZ(E5t2Lu2_9*6+>dP?yX3(Om4=wMU6hU+;ezjdU^K+i$9jS$!wag;i~ig zbX8-Shv<!u9~<8;ofo_N_wI!4H@0rxp}E;`-k#F%{|D9`+_&(N+65l2zUhZo+kW)9 zTkHHcmU+VA^J$-0kMj#zmhtkxebLP3P{h>~bC9{_=w_ZbH%v`J?(jx(St|UOSz$2u zBjX2-nOmRN1V=yFI5EE`e4d?-S$d_zvW%10m8ROre4ZMzb-kIL-Lj=phrRdN6iw06 zNx9N^{mhYx8$Ed>4_-2nuT*?JM`m@{@g#-&7ZsLzKiRV5+^=a8iu%jv2((3{PI6We z_DEZ0l2!2{aX*W)?pY0Xn^!u840E5oXg;pxZQyt9Vwq~}(&qNkn!moB*1rT6Tz(<> zeO7px-%Z2MktdB?ju=MVcE5ZwVA<b2M%GVaXU^9>B$07s)A6*QHVUV$_OBH4e4jDj z$AztZa?hU?Q>Uc<7L7HYd~550GlA9<^Eqd2YIvr+ttX*iqQv@1e2l-u9Ol%P9AiJC zoK|%HH<xdh=yMaHq>M>+$C{d!=&1*aaPS4(*;#sh+rGJbkG%@_{M)?rVE^~>_qR53 zZfV=|`dP8#!BYl%HuKjVoW=J^a)!5p4!6yZi~AgPW);_pOEj~-ep_~D&1O!ui=Vkl z@-MfPegFFFjE~I&aj~5I>*o$WoV$0nLqj=NrTK~5qV*-$zpcw#vHijGhVGQRM>^JB z)?|p^A3xz?RV?#|=r4RlG25GCZ<m#ddpA4BT5m6XdvBZOY|cFjA3pzdnjCYqn!Rgx zyG8%wpJ%gfS=m@@SsnlUq}j>Mi?dhcr)zTOm`4}PjZu3ZJ+tiXjbo8Ab5+x?8yjp` z9C2&!>iya33yyu|YE_tgp5xit9F8W9nT}76URy6xx9k+t-1M|5x8A3ye(#(8{*GGL z%7`U~&0IQxo90J7V}0e_IMd(JaDG#g9qZ!>t5s?qxbQu*Wi71=nh@o2Z9-a$Gk5xf zqtOA~+ZDvuD?eGG*R^=boVW|yHq88dQm9eq;3knac|$IPFz&9mY?IzvJ^GWgeS?QY zDwAC80ylmB$1>L~x}B|?_Dp49URimnr$=pTkAaWI+)zm`tG7}+7`KV8KD>R6O>OZS zGw<5VZuYf$OZp0)IL>}tk+yJc#!iD%8yzh*B9^iFW;b4NOFNa^-m&V6;i4@J(#JcN zwHhv8YME%65P#h#Y>tln#A>$CvL_ii@s>&Xn(m@^41_kiF4{HktVm3)R;Jg4+}&I9 zQfzo9TyJCB{_dSLgV)Wi!YaGh{aa*eYn1%|L*K%ELG{-aI%1oR*mrXkh$$}2eSO<1 zMcHBN)y=!F#LL{eyFE1Yz`Mh967%n$n>TmW22HCYXO)uny!kq>(ENz6M9~I0-Y_ZU zn?Hl!eYhmDa`I6<drPCz1!hGFKFfD&RW<qv?>llx*@^w+g*HFNjY?S>>6vEpcl8;1 zoz`hg7Eu;(+h17XvbFz;(W2EKQw&*leTdvNci&M3jY~m1N^MFCzUTN^5A5(gE!TJJ z)0+pLeRj@0^W~Ysw{A^+dsE}fryISNVa+T&vQ=Bn&Tn&mxFzZ9RWpS}s!Em1*7=uj zG_vy#)0`BU!ZdZsmrHY29?N1neQ9Fggw5sCpRWD-hAG0z;*)0L$&aE|q8UkE&0G3B zH_Q}V*_yFD@W>ht*X8G(Z-}i9mQ_Fh?v~{7*E*9qtkhJ>6Q6#~nC6yU;iuEENaBp! zG-vJyu|AhyyjXPTz(>|o4(%KMo_)|N;(0?R{Q$#ElPOOfn13Jtc9n0+yV>*h#g|O! zN}9lEvf<RpGhX8Db8POFPqA;XvUU-5srZzl^Y`Ek-F_d|Fo))zrJG)q8U@)+m|7XJ zL|?w(jb<=gT&AknExA&gbrU4^3V2(U9ZUGGEN&dLa@rPk(V0(Ju9$^R_Ftx)xGi;7 zeqhlH!IjS>ultJ}D}EL@$&_QJbC=q*+5Hn5dJaw!4m~zm-C{<y@~$HBBfMW;*3Orb zzN)DG>6Z$_<XMeBuXG*qGGqQ-BRJzQXP298X|uyoK@o=9>ISb9vt+g};0s^b!c-wy zx=PE-=hFcj_ZXP~RgngL)(dXxkAhxyzwMiTTY*1JQ0ol~+YW`AKd}!zmRIg=PV~Fc zd7mRn-J$Q(1NoI<iRX1zUU0~WeNcTjqHC)6MKK|>`|tGnYj?GkCtTg|@khUYW%!F- zEo_M`{C0QV_H=G#lU=}Zb&7w`2c^`)3oZJOL^8RX_cgXmI3l?rV&c|Q5uU7qg%#Dh zC8vyy-H(e-oGUUr#BYMihy6y?V##5P7<{&$E0J_9TDm~`_zs4XQ`Wrw|HNZHr!x2L z;?G(KgHtE%)_5#Xt9)UmZzR`~gI=EkR1=?`dG_OhV&apK=e&i|>Bk-$x3#ne&oxwe zGy7GCV&2^|6*c=V+)SzIVN%@p*g!StlcBlkts{kxCrU2aH2HHx`NO@dPtCrbcJAoU z*q!|%o7#d-8cdsabuZ_gu1Rr4e9}UeZEM1Q$n4X3_$1_i?8*;M*A$=XTy@EIf^qJ% zHJc_pS#5dvY=Lxv$YO!}3yVd6?%)z^%zUyjDk*0Nm-MHumdWQ|IF)&S5(o%hr!IQG z=GvBBGj%`ea-7lP_H=n78>?|mNcm83#|IT9pVzWh4?eF=T&(lhx$=(nrKk5!R)5@d zBH`?&9<isj?|*RVw#5oYw(1>GH=hwI7L;-FW#ntw)pb4_QWt9|yH{Sb-sjZks2Y1@ zdvDUGS<9XJt&&cPuMw-fD(U>>vzYtb?H2o-{1X<nSL_Sy3tVjTPWENddl8;4!RyaU z4DFT{EP1^5VCKw;7b9C|cUS(|pv=DUeb5=Uvzyj&7MldHPxZ{<K36o)ag9gGvE3(< zA4EPX7Caf=qqsn0X1UMtDLa(Af-lHEk0_YdJ#{Tp@2T69{SMw*Jmc^MhYO-U9ha3B zFLx0X+jRQWwl@o|b9O7IWjUTyI&`0H>HD_|HPd^3e%?AiuIJ*(gU>VmSuku9i+b9p zcPV$_Sq2YwVf7O$bYmToF7ia27cmg=R6FGq!ujPSlXGZCX5hwSdz!f8h1vVFbpCcI zd2>%#9_nwLwUyx+&#Xk3r;pc7II;QdTKV(wNtK^wM$D@*n|ZwRdEw;BJt;wl?4^GO zDrw$)UvtP=I?~x@<pfVP&%Oi4jGNPDMsRJpA?x^5%~xl?fzMfY|2by2xsJ9iKYR81 zg{21*o~>ZW_`h_9nCgMLoXS%j0eNcj(Q}NSZk##M$o%@3IoBpI-}vxa<M4WA-u-&> z+un<1?>N<6Vf=jJ&d)~W*G`<Z@z4)8`)hUT%WIFz>t~nhtedKHswY;mQMOX>@Yz*< z-n%!f)>UcLo}43@F^f6v!%Cxd8_&*(pB5r<Vy5c$-lJSbMog_e4vNb8Vo&yZDH$fj zuvAt*IJSm`b)TsA`*}MgP17##JRp|J^w7AcGF5Y%^^U&6gU6<&PEay0j*C1sdFiHS zMvPvjULRAVYkkcpPhKjs_{xMONsBe^Z#%o<^|nhho?1OSY1hGC@%MzriR-z>&tAz2 zT*-UlmEhQVMf6DK4b}-+ot_$*%qI<xnN2v;@_hT^;>tNogoMuUtUR97?IG&5*~@3o z9`Qc4j+kYgtcx^1Cw^|eVZvLxJ0M^i``a7KAFs2Tx5@U!gY}CiEw->~Va)pZX~TWj z-%_{bE4agp8oIxko;O}=<gv1Fip9peM@ofucfPjxXp?8-xX$0a?S$HqV}kB6rPnW( zK2a)7?qQd|yx~Rf;`$v`x0Z4}-?eQ8Yf`GH*lx$xHRpDE&2{D}jNF=X=gEt^KVHNZ z>tE#&i(Xa0C#Q7Z)Y#Y{aH8?L$EHgaf|X`VS?j0;%L-@)_WE95w|Z_P>xo4I{+6uf z(?2e0UdOP?_u^&03zI6AB)zPfXSr%_a(nOZe>V1Bn@g6ay{y`|SK3j(x5&oaYiG&Q zqL)>cn`4r~A`h2*t?}f&{Pk0s=j@}K`d(_u3cHIwww@<HyF!2ZiAC#ItquL>_eovL z{cP~V{ZE|LW{dbvykN08&NcJ+{EA$kn8+jgHePc@+TFfH9_Wc+KVIN(ac3Eyum6T( zh3oOxzD{5J>vY-Q)OGUry@ZadNldTd;Xh@u<$wDgr+dC1Gr68moN(Zz1mnxzbc0#_ zW@avujkiRv&tj`C<C9br2>xciUgzPjnchdD!`o%cHk2l=UEk9?#r?go_~SRhx`qLX zo9Bd0bUz{}o2noBZuW)nMJ=CSm3+Fg&iGpNGWliITjVY{yUkV!)A3I4s&Wi|_)Ai9 zeSDp%<DX@=EN9fzOs{plXx0C@U_A?;Ns@}5{;qx5w)_VoZ{7?MeY*GNQ|_=YPXapU zl|JG*Bm1*yD&uoamHOb?KkMI2Ikh!pmL~81)Whl3SzZApad-2Umwo)bZ=#pyy=PPJ zi<(uRe&3w@=m7Knos4k`w%=YeuCy@gZMz@mtXX?jZn?_OzuT`DoQgZA9PEC7QhuTE zkJfM2->T;<+-q_0*pUOLHhFcgzWArue`!+gW`krCx8O2wHRs3a^F+35i99+l_c7LG zqG73Q1P?E>n6vbQr|Elk3QDiIDjc`ZOX_=a`$a!D-Qz!6F5J1#k#B0=XffGi&&w~{ zvX`*0t0;NY^3=Ib?RC`48INw{Dt~Fa)tC5rL0`YdjI?=|(sKTYt#PsYA*i6*u3^0L zQtX8_GYwwvJ|)+kntPtnKh?mn<%#?I$bvt`t<2Zc8@5h%+Live?M#As-|T17-5JgL zHBX;x=W3Y$$e~Vk*J@es;N1dCW?sDC>-zec$gL@F&GX%*QZ%{?Grsup#GT=scUN8T zm_h5`m^T-WcAxdrD_d*7{6Xj3N#9~_<!w6hI{ALp%oXX^%{J;}__+z!WM7f^UFFAq zGH83R&27WZgL`Th`D8A%b&Ks(f1a1B7@P0Q%;+C3ll|2~{?q1}PDZkmKc^X~J$a+| zs91OV1!o;Kff<YWXX|}Ro3-=M#}b{3)od$|>M#DVB0)c5p>N#BtMjY5-%a42ws^lq z@qy`DCfj7L9}{!RXN?W%`_Q_)%uPD!&Cl(#iVeH=Op&<y>D+OaV{10LUi5CP(#Y#M zdHJxuxsk|XsdsB9OUQpemMONUxypGhC(8=YiQ$ZU?nDRHJn}uV{cNMX>h$%p8<qDh zm>j$FC;K73u>Oem%^yEEo13tFtrAvyQ1<KE?yh^TFEV(O`A%+^e-t=9=+W0nnqM<o z0+*O{B|d3=Eac>3X4ovp{&lvM!1uC(muYS3_v$A2_5V)#*m!pJymdT3pFAu6xXY4x zw#BDY918g!36nK#eaz24yk&57U6Zn>hTY`p*TPDZ`RfapPRMrSx$b%F`o+&pIb5z^ zJRMamG(|sN4$XVM&L;0;N6WO6v%Gq*o$7foXJyW_VzCVgnTvjW?VFOr#1a~C;!Dk) zoVN9k(&s!~tiH|Vy>+X^{UgsK?(-cy&QkVnQ?vF0Pj;5sLF$(4xYjQ<o8n}1CSc*q zHi7tm?Pe<@O>#VcwVr?G?9=nI;X~@2#5QB4>1+oZXSqN5b&%ytWow)2$veyIE_Uh2 zUJ<UhU+lT!%r#@-kGb!j?Ud*;YU*A2-1TdQ=Q+izn;v*(dS}gI(Y|f4b6the63N{P zV*kS=7oT~WY<5PGan{ubfl)_4x>>I2jGo|ssKBht@S(_*{QVEN=iYr|p8w)#l)%O( zJ<CI4Y}N|*uDBpA^U}RiV8_M|flbz-H$B(g;(Kr~p>M&`iHrHZSOiGz<zDB1B4*#S zhpV#XW&}nwF`0)s_3J$N&2nqAxpJ-YQGqL!>o)naTNzEQS{uS}C0p~=(V!@`OPjA5 zq@8AV)lcR*X0^Ncr@_V0_Re)SK3|NERpjh8ny-=+7O63z)rOhV=+)-HNxqGZcSLO@ zXPiC#qwM5d1B1{DkF%v`#ESXI%t-9ljW+w%CRC(#Y6Z`^HqDhstk+j{-t6vr(6oQW zWoP}x0;(O^{WXi{9F%!rviNq}!Sc)f2lN&+ze{@&dakMD=$B2BrSaY0xx9q77+IEO z<OD5AwLHWVZfR({wYkB^X`000E1y^1IyiIEHrdL^GL{dYz5G6;Fj)1U-;{i{c=^W{ zlce6?y10F9_KJvGVQ*ea-7{2KXTR#o!hQGNI?vt|cFW=VyLEGS|Js)OX!XgD|H7ZX z*dcp!eMHDEoz|t!asM?9HO@UNa`YFSa&U_g=d&GQyvP2`%=(n^LCw>_Onw<pg`o2r z6URM_vyEThNj*2W%iPU-cV)D3S@OJHn;Q4K+&JQ}CDHVvaDVeGt^UxgHChkU^QWe6 zzF0Kb?ewO=&6huAK6z@U^_9W!yXD1(a{<#ND*}pE78WF=2-VJ5f2uQS7BjcT%E{BF z>{*wxDZW-|rg_t<6CW+iPm6B(W2IUuU3MsJ7hm=3H`6D^B#BI#bz^;@{C}bCv%i!m zeS2`YYLbCz?mpLvLD!{f60e&laV_5<yejsuiBa9Hx0fc)_&LLj$3wbnwu<nsFAvyM zeri9G^tdGVwW-L*@Abon-)n_mMJvxJ$f|i^b#JB@kJ66T)ckcTReII0|Ls}Amc8%I z$~_ljKF-@O%D*wPL-I$&Cni1VWD(A5N&S~xHXE&amb`3F8uP|wXJ@#X+&gvOtoGlZ zD6g9=|NS;wMeg1{XUqGAm35Mt_ZuQF?R)O=vx~Vwx%`X75hGD|A@vS1*9-E?9z9>O z=e?!g{Wz1Se;Xc6n<`?;ku;&Mkz>;ek6$cmYaA|RPkDFk<mXJU=O3CU<oT^HF*;Q8 z(<V3Wr&!`D%cqxCb6kFTAk_6z()LAu&UX{<Y?v?k%A@Ol<&#pUzuu~oGmcF-z>&&a z6m;b0&b3Xqgr{!lJev8%P3TPCqgDQq@s~34g(vUr`h19^@x{bg=R00Aws!QSii=Bq z*dM)8Ez*C}qw*Ei$D($h^sNhuO**!#L#4F5M|xLRV0K2*XZ6?jZ!n(C%gIhY_33&* zrO-O5BXfDxd2Iu_6<?(a-8PxB#p(N!wMJ8tM79*lJnnm6l>Ptc;>T~xFT@<$q8nHd z!4*9_iZ3Dm9rNj&cNM;kHyCE_;JH<t(m&(v#>5E0@1I^|?RvLm&eD$CH`01_mG)`* z+Fjt`{;jsm?UeiM1V@HEpCgsoI(H;GBb?bJ<9i=HI5Op9^wfQNdY`TzKH4(v%@=>3 zje$my@t0L(R(P)YlH2?K*ryq_9!J$4JbUtJMn^_?>Eu)IZU=<yEf1|aeRt2T6EEAI z`#ClAzU*|%&cCfAcsb1E<IFd<W~Cp$<rjUL_TJ%wkK-m$!B&08<-QlU)|B5ryHfwo zuA>Qy9$B4zp&)SPu|wr9wYVJrbMpBSjja<LiuE}UL|o!J-lFrf_4ceYvy4Jgoi)Aw z{$DGZeCgi4w)}`Xp~+Ka+$wJt>Nsz0jgCq=t+zTg>}oIHL$zIh^Ypg8@r{1_Rp6{> zT2bHApE=)TH~imcx_B?2(dO-G!hMkorY~$%+h&-3>Md*8T)lm(h2QDqi+^07EdFu& z#_lIeVpZ0!k&kRow3Bu#Vmq;+=gG^rjF*iLZ4+=Td~K|>ifwP-B!m7LjQ1a36U=2< zD5~+9TiPQhQOaLfLZhnvn#-QG&#L=0^|Qrf(*@bQ?@jo1TWi%+E{92(au3g|eG|MN z#m4sD&n#7c4ezSOo|l_1cBhuiR(Ya!ZTHf<N22_VzOmRx)NQuXxR<$jzHsob<+r8= zul&JqkMpTQb#vOA*BR{Q%VkpTtKME$wBvsG>=`2SR!t3=yyfXTNr|$`w`NCnZ`JTH zSsm9>`eRL`=b3rC1UvR~EaQvi%gX2W-hDjtY7F1LFP)O6ri<qo*nF92vajX*x#%mp zRn6apUxvhdPTMnIV^Yl2BX+LyUTe<F`H@;76MigMG08w#_Uo*v9`zhwAL;#j6!SA; z?=kNkmAmHT^Q=$Uv2VqlPZLFZRi3;wI<fP~>5#bDCnnx7*{d+&QIBN!^S5TJHq{<k zxy$O^N%02Tx*xq<9}{<#-TCn3_x@ju3I30+8h`LwzI^YotFHa=n-9F%l%RC2>G{l! zV)xh{u86&I`1O=i8m}s|u6?+qB-l}BC$?U<?DVnroabEUCO$V55t6J}^l?#?Y5||7 zJD=ASJ&&+n>5sPOT#g*u(<OaPvi!pXyA$j)m>(5#x$m1LAQ|DlQ|IgE@@dCEmKeBu zMQ_Yyx}?)RUCv0L<aySyEf(H0H{WTRE_E!p+xm9Wt+hXLxXYv7Dy5!KGgh7bTvK>$ z?PbAWH@=UHr=CbycDlm*R)9?IcPAZNW23-pY!$b6*<00S@Vsxx_!&_dooLS27xM1< z?)%n}H%;EKMNAiy2~fGBc}f1tr_L!G-#*ct(pg!P)U*EKX=RP7i+c0aOhncl*tBBB zznkAYi#f7d=J>|s>J;a)H9c9dL}B9fN39;$($4s=UiMDjTI>5~=~J6x-sUg9dd0VQ zdaLcOGs=97Zd!|lg_nN(^yOgCTB~_y?|x}o-Q)lMcZjRbj@MVbRT|<RKYGN=sb^X1 z*&fjp!FS0qhPBS@KEIFW^>2GVm|SdH^2=2}&NJrb^6-t`_IJu=-rlEIq%q;ar(}^r zw*1td_x~EMWF1+z{1NA>%g=7PFsx3wdBj)ia9YFDWiw(QwMEUo6)!b&=FBT9=}V?E z1S$v5p2g6h>FXErZnI;%dQxR}uyBz6g5<efk$uc-OOj=7Yt{Gr`CqJFsPb`@^tE|C zKc4;E7#%0U&(578*qk3x{Yp%5+D#opvDrOOTm@bJXPhy#d(SQxyI%jL$MVM;wboS6 zwNW+6{B`7BdTT}65}Tq8izfB>pZ_lWTe9D=YtEY{(}vb7uV2f#&;5L%^kT~<ho<jF z+O0Rf))`mqDv6r>@XyN9oUSIWj*}Wk?p*Y~+H9;E<{M(Z^uOM{>x-@b$oR}T_$IO4 z+>P_r@<Vl@J4FtDOj^wQyzz;P!S^0P4kqzQ*%nT#D>ldZRX*-a;L^Gqod0#^$IQKR z*2@d#icLIIkvw-@QLv=$tYE7^&fn_=W4d3k+_w*0#vBu9wLZ0^R(>YKy1JeIu}2gd z*1xg%wQ7;h!8Vy%$q2@pyUm$}UYeJ<cjfMSt;YD~{G#>ev>G}lF4iv;a<H${s@nbk z!Nj1YQMZ?O6&BcNi8Vh9onWK;ZDmsBUEW>xYK&=9;&v@w#xU<4+ufsK4L0rP*H3#9 z`J8JnOYWD&3sUk7Cr((I#NU*BvF~t~SZTnTGNxn~r@kAjy{7lfcq_MW^2x&LQntl= zmd{I5l{p&Ct|D5b6>-nUb)nqiOCmos6?8NlL_@U<GN!SX#^yGzV@L^k=)$&3XrZW& z@|%tB3;!Ciy<HWdDir(4GNQKBPiR98&oqVP-)ioql6BnEb}d${{417|!{i!o^H*uj zfps%tikXfuom=%Z_aN6Z>5XT)Dvp0N<hy=BAhui}(f(`L;YMx4^*jEu`5xa~Va2`t zNy<^DgGaOlJA-m8!Y=0Sjd7e-R1zH<?0(j1&GcteKDx!(d^L7sPcBU8`LrhZ*;Kxn z<tdf^)9<TU&ImL)pH&-|d*f5ug7f_jL4mst<%uOHd&m8}`dqZAXxEGyms1)iemu-> z|MJFb(We@j_MZ-6dO0S|4s6F(e^?qj`FHQ5J)tYB+vn}!dy(Gq=zeoe!>R8VXY=mT z*`M%u<?5C=$H3r(GcAHMZt9#3S*mxa^3$@Z^UogfQjbb23TEW9m3(mFJXg`{R!4rG zNerpel7BiLHUE-Q<7|KW-@HesgoStNoyZ8f$ZK2q`Q-UsVUE9ZW%~6UDqk^8QD>I> z73r9J+V$&Ki$@EWpABntnsC1)t#?z8LaF~rZjmOQNso(8o_wh7J#W{hC#+n7m8}od zo=W(?IwbUI>WqinmQAJaPx#;S{bbBpJ#)V25w)+zodtC}772NF-dN&syK{+)jLnk6 zE<s9SbLR87c9=}`n6&Unk(TPspE;X8M{fSSvVudy`;@t|&)(?BsgH_JFKv0Ie*dK7 zTIKiLYn{8-zu$IEarN;7?ruji+GD&UJ|Dh2{Yah9RLA2UwjJ5QkM^mpocgC|`aY8< zpL3<>_o#94awaFe;VeF*cR%vj{b!e-r$*kLP<1D#BkGa((l_Ckt};(KDHf64VZU$P z{S8~?{6F9PFMC_?^NP8yI=91PuFG4mI5XwMCpSJ>fqd=>)8tloUs_aoWyiObGyEzl z=l$zmXfd;(ctvj4x$;7nvu*|2Y)@)`AGbHDdfoOs+HAqaPgkOzM7wR-IIVlB?_mxW zA(^8OWyJP>N_zh8-nGLo|EO5F8e}9L+|l~*&GPRl2@WO9-0Vvi>*$HEIkSAWOhsa` z05^}L(fx`q7ypX;9`%yGH|3^=y{F;XRsJFFvR_@R)~&YVf4F?Pou}*9uj*QLJ9{@> z^ZnU7*Nr_W?f9xq`-N8g6*w~UAfwwp4xwd+0@i$n9~<78{ZeW>z}e>2eKf;3{bot) zlw2v-C(AS9GpcSqnBFb@Cy8zMVd0M=iPs*hT+Thwy*Eep{-zban-~{PN}6H)*qoc? zqv6}BOKYzb9r~xg``MIPdAFY_bH=x<6<;S%ab!kEgZ<$jTlm-W7*DvcEZ;<B&c?#U zMn|WqY`jx*R3c?XmjA7bEq2EP=AX0?e?Qg8?rz2WN3tD9*#no&kzRS4k5NoJdwNe| z@QdHuulTHa^L5t7GxEOCm*Q+AMV!;JuBJxqJ-I5V&C8wf-cq(g?r14K35lOZqOZ<% zyjErYvT~xuhJBF&%cfj)t}+o^b=N-3)6}=u+(<av<&n<~<)51-e=*w>Z5G3})p|<d zj_l72Z`5zs9a|PM<v`Qx)Sz1r+V#S@9<gaUDt+nM&f~rKAnR<G6DnWJnj=oOn|Ivh zZmvClWTK(q2h$1PZC30qTjD5rjxlh9&wS0czV}a#P7KZ2!=t0Iz)h%mN|{tWuh#1u z3vX_i_PUkt$f`V*66xrVFE%Uah2P}-B_<LmaItyum(8!8W}j=c%h+vq<HL!7E9!f{ zeNddY@#Mzltle{EH01-jCfx|ScWuYLtLu(NOjUdNnrmIz_nCDiCKJ`1g~~67h<WWk z=(DT4usHwn)^NGsTW%~YXqS7q?`5xvUTfmFqR(%Fn1oGq;tf7q&Y1DDNcefe)qdrl zvn8ik3rst<!uG^EPl@8GcXCqnc@-lvmb~h;l=XMAcbQ(kM5!zP#9O)5KK|EM{ps`9 z%eN_r@;$UByzX)D>3da5T&EN6uNU>+-Tj?MoW0%4SzcaaTG_i-?{DAS>fDm-*;FpR zyKKs~uV1?_=y+C?e_vPacqO0fcGR7X$&+u(nC;k_?OrHwrD55Hf9t9pRWt0A<|&K) zzWDh4+ZAr7C#2-`$FJUy@y}%CSC7oJv^NWaWczN-KYLQ#bK0v<XQw-vF3rtys<o+_ z#x}9#tm}cj8n^dqn7?hk<elegnqGNC?8TeUGoPA;Nb_6f+6#2sPEYW*NfGPce9Cpv zoh4px`+_g2S3UBpdlUWLf8V5*r|c4;cUl?W9qO32y5<Y3tf74Dwa=Q#!awp953*?X zwl9+N`xY|EhO>zIZ_U!G<GW4?d<@$zpC5mA$&M<my$)a47R|_iGhy>fk(n=MY`l=@ zf4f7Bnbl7seM*DflCu-9oDn<}F1IR6eA4fJ%gf4Dvonpj*=#?1*;yD_&YbY?PmEmP zM4Jn-=eVRNm+5AGoiwk@Mq%40iyH4EHlmMYa^5>Gzj@=E=4_4AYC)ohk3Fki_cQ2+ zLf@qd4wF>ID+^m6M7?N<{+R#b@8w$G`*wG)f4O^kVp{&ZvSrg=Cx!Mk?Vb`<wyTBV zHRo=P>7S<yI|hGL-V*ZW_N*k&RdI?7O?%(o_D|FFe939$CfAxTJXtwX?B+T~m!EGk zY!uysIhAhNn;pKUYQONm$LDqZdgpxQ)*mRTyDfcvmzjF^1ozAA>C2WM`=RM^|8#cM z9WBSGRSTCp+x*S3k*;;Uazpu8@yA&zeaC`3Rjg9)t0aGJQsXV2XEWI;k-2ob`)RAm zwhT!*9}R`fC+Bl`els^NT++fPekw#RdWGg=TU*WW^9!0!Uesb26g-#`C~NFf`6%Xj z$H`IyPVcD;e$;*4Q?be@R=a;yx8x!vo|Vhj#7;3XG}XGl%D=a#@08)C+s|ITvTbdP z)wlIt`blTkCL51qJxeRfI{m{k>*{9IOke%K(*I=9l8ZHG?+U~&?n~cypm`6+WS)2Z z`8M50ZY)e&HM8=q)$N+ix_fV4)9=%KX>oi4n@-v>GyO;YV(EvwxqY|0|GdN3dn{@F znOI%P1IJE8pR9YPaH_2TYNc1@uL4)!nO1+4&dz#1WvbDyYtJ%87tVZfb65EUA-~U2 zuG<$qo7lc*=Z`1TR=#`|_B-Xf(_GutvU3;B@_l!G?d|3rH<>u~ih>W<sSD(r7uHH} zHJ=ik<QJQF^jBA_<L%DSlDp6Iu9??+I~DIcV38Sn|IBiQG=WL#|4s=TWS@E^yjW=> zQ^@4>Jq3BsU1T3b%;8JDe~EvQ=j&(6(Ti?5XiAztQ2xl*fBefPgWm>Am$KB#y!buq z>xmzabtdpUsIih{+Z6E5+`7B!H^(IP*2-mP=j-nhy8FO$vw-HrbeXMtf6w@F`)K!~ z=~HUcPuVQn`_A&?0fnc+(erlSnRdLdAZ6c%n++xJMW?LFVfs|oaDF@UjhFjO0uE-^ zuW|e2U9_+2s$B8qrJ?iJ^B(ESjJz*y9{$tJ-P6|W`ES;;MTr5fwu*0`hty=UZdRV~ z+cNd!mf{nq1MRF{ect>;d9iTt)t9GgPrbZzKC}PN#J`t+7wr2syZG5-?eA}9tv8-w zXS?s=9Q~pm*_o2s;ge@xv5h)5yX2>H_|3+Hmkb`K@;`F@`R8ZN?StX(lYf4SRF{vn zDmmCC>vQ*cw!n;7u_^l|dVEhin37X6fA6H)r$uj0n@_5#IiebOtE>Or=KV%u6I++o zt4vZBc^4ksXt%`eq|9^`BmGiAC-&99e_BNxJrQ}q($ZBi#8g{8FI;@j-zTTv?yK1u zdtGIIUii6|PY=t!CW&lQOe+7qakIwJ=0AJ%^mq&EuH9g+Vf!@UbLHOl6OW#m-`%1* zZ&9l6Gv)li7ss?JqtkMq{!xf{_^D>i%oF)G{v9`us#`ujA;bQpX{mSF>HX8M`iSjU ztv2>fxF#w7`T42n`Nb>G9z3tDyyla1xhdzHB{iYvcFf#-^k%8>CoO&R>%rH0?ycgU zBV~3gUvZ^L@VvNZH&t60wp&L9MGLK)D5&KiEwWFoIWO}^boJ7c+skT9(o6GSYw{M@ zo{9@kxX2-2)tUO>FH7tlZPrqSum#M9#;Xe@!h|DhYCU!51%`F8hqK(?o4sI1^^3=! zu4JVb2B#$pT`=9keSX!XhJACLkKTLq&eu=)#<g{KZ@&;Yb9crY4*vOPr%D`Zu4a>2 z{;W4-x#x}W^<j&JFESST^Tf)#K6>FHxow_c<@Xxp_Gc6I_$xFM)=I7aY5cEbW>Bt9 zzwcVT%dHijOl>^r_djmFYkU9G>}6Z_oKZJiAMu7y)$2p*ml@^L3cuSL9-4h7*Imu{ zuJ)%-b@{HPr!B&RCf>RKbmJal9~oASDa+NTRkoJ6qy-rDMZB_P4w17q2%NZmA!iDw z%Z_)UVlyv<Owc`Hu9CEE#uTo}!BR&XR1El=r`YS;q<D*px$ydjOk5~%TA_?r;NI#v ziXEvFCRsW%_vGe@Y;%h1khvLA`J|rd(G7ujM)w>a&OUfaIbg}@&0RM%TN!>y_o!P5 zF#qs*zAUcksmPg~d}ns^>6FVxJha;I=Bw4@+*{HQtF>#CIL|1k_KPOfxqLam#d<%n zqA^t9ZE2%<zsn?{zaKUUs6923oH}KyXV;x4++I6-7EijPreFNr$jgW?rC|P?brxk= zB1dFqH_gd$<z-qgkT~h_u4!_v>t<g2ec$dr^Qn*8u14wlmp+;)B+oT`&{NpEF1>11 z*QNF|Gasw>7D+~TN=r@hl1V>Zw5@3>?>B?FM<414eeBRQjM!H>jYp{^LqKryr_=qh zZ!TD5?CEekW~ln-$)?DAPx)q)HN;$-YQ67ahc83?{UZ@<t($CXveqnEq!y4^`TFpL zC7QMuJ{>K3F>Pzm4ZE=4FR!g$b@${d-rX;KPDpWWYD+n>ETz!Uc~gc$drCo7)-BTw z8sAG9KhEamHJcu2+8(K<=)UfD%(UEi%l4D5zUuR)XvOLs&)0f-WwzJOH9UXcvTU4` zrm{k2|H>)BAkl8;7t>Njk5~k`dCvEK7ILylNAu1G5zPmwHs0Pxf8Iaix?{uSiLG-Z z5_K|PU-M9#y>o(&p5W2!`UOtm+G{s{YUMqn?d_?u^U)$EuSo$Zt7lxcV?J1u$>@Dz z6PN$K$S|%&Zh>x7k~a#>t5~Mq<rsOu)>mlK6hBShV;u!d${sA&=k3t!Fy0qwb*@{) zyf9GUxyD41@W+BPw_WS&@DlmFR=Q#3mAN18*H8Z&s=hhw|MatBe|osr9FN_7?R?7h zQ}vr?`kebL@XjKVy}0hvxrtGwRW*x#EqpoU-}~M6f4k@3WvmZB@L%`O_6uD9*NEQ# zth;jA|GS0xTBcXD{v}oZ`CryH)ho0|X5~Nascl`~`EEY_zg#g;?*H#2>z4+_AC%8s z*<Ly`P;rZ1F#ELfhwookzp0Auy&u5-t4;d;?OkoVO#U!kDdhZDRUN$Y_JjAvs#4p& z#&6==Eic{{yi%X3Z%?(W?Ad?XQ(p*LKKlG<_xk#T>v^H4nJ@fX{Gt5c<FcLKwp}Uw zQyuN~sHCJSWs^y0?xlXw?@GUdR_@)OcD-<VWAKr)SwHIEdT5!>@>_cDPm=emMtvta z59tRs@}AxQ-?!Yq{qX($$TXiH_l@W0@X7PV-`>5vF0(WuW<`9i<(GiJCD9f&4|6_p zT?#U(R-Cg}q*h^1RD1?^_w>d0%$qOsKRrDEiumo#>)khpzxuyYb<SRivvFMSJG!PH zo;r7H_tmS3|DU>vr|cKGds%GjmH3>M`rBAPZ@$0YdFj_jt=m@o_qwn@AlCHz+FSNp zFK11El^*s#?WOrY-LF|2>M|c6QePLlTTJx!bHA{Dm&0!Zv$v$yN9+;!=lS@51ncIT zFJdLd^xdkhp2e;FS5)G@B~>&fhd+GnZZrPQhZlBj%lN@mqgNy8@jl0&y>G|Ar0Bmn z(a+x;y%o9Q#~ZOZomXz^zWvf(Ae0yU^i;sQy0pjZSNmPn&*h9~;c5N*oY8ZJwN!*8 zPl?Tk&Sd+);qm{9vVUz)Tom;1&&t(nd)cFIH_cyWzh6u!?uXF<siWEfUstV27yT0{ zX}5u|`bM2t)aeA<qu(~<-gV;NBJpiaSKInCdne8NE&b+Pv-U=gp5k=(#cSV-BxL_c zI{h-?N7B!5=~&%F|KqdoADNiy-**4^>-9_K>&8j&M_<0LF|U5jZ`;6)$}y6n>#v;8 zIjCr2XFR`dVYQt`T*ZriDf!y0m)93tAG)?;yY8F3?yB2|-+f!LUHQ$s4u-XNwHMzD zP5i!UMS1Csy;iSch0E4=R$Xtqo4xp6Y2x=?E6Qtc?6rG!SE4MRr(Wtz+?qeKt7Oxx zo4@X7|F_asRP=oLw>9f*Ib-8x8dkE*$vwDkpU~?Y8?!qWe0jeA|K{xLV*e%no!qx+ z2kR&1bDST4&9{BH^1&D8bJEY7E^ih-?>sI0;Y#y!SL=&(_kLdLcKf&A-wnBkUl#mZ z!7k}%+g?2TUZv%pKeP9L%-?u~S^DtwdG4q3!k(QdPf|Vf^TX})&hhJX&tCSAne1JE zBxQrpi3imN<!|{F?jDd4dU}9Gu4$@V-IBVrrH;nghc_3iUq1fdf6g-z9hE;7a;G_k zvc9Ah?7XsW&5Bqn?>Rqn_^*n8-6Cvw=vLFLcxjggg%HQn>D6IfIjehe&IfM`b$NYM zJNwn<aIUTYCDpyse;%K)v|Ks#;%>h`k^ZI!d0yv)p4t|6;ChGs>X+wbLw?WPYICe0 zLG9LFHJKg$eLv0|et5IshvrU~Z4A~wg0^f|miec3De`0X#d}j9elT{ZJ^DQ4?CYcR zdwzUQ{FvVUqgX%G_)o~M)@vE>cO}^UU2(a~n@xx<O8V~Fi|ei)^nU3se|YQm^4=2? z-`3gR-o1C~srTwmjjVrn?_PMHTleMTO0EA(H;9K_4nMqCHt=J1Vt%#BAD<oNPjB8^ zmGQ0Pi08-52u6$S>;<iEw+~<ZaJhHe<;0Kt3%N~pO}>z}Ww))2U9;wG>jXuKn{i!T z^%8UZ>_62zzsz{=7Gcf%e&U1UQ}<7|{i%{RyEP|0@uJ=BAp4t4Iy>rCnf{o3SbSs1 z$Co94<AwC=tgQCv{bka*@JRf!{+AM$!|^PuWbN2J%iE8tE53Y}@x#-{N?!E5?w&tt zJUc2D{(JOm!#AyhX72v4hrHsse>6qz=xA-%Ulu=O=kMmN>WAgsk9KqWcQPrx?z;Xy zVxnCg&n;Q|X?|O;oL|SE_W#2Ldyeeqjo%#>AAGa=<>Sc>!B-dVEpI>UulLtZ@1-}t z@OsVrq5m(2p8VXgF03u|L8Udz`DlORUow8D-c={us=9tijiLHb=Z6nj^KKmFS+nnp z`L}Ii&sP8U{q-~a()sy0mUHLLZYmQmbhE!RZQfyCrq!*A4%`Nf&pY3WpI2o3uYE%+ z@!GRb5lsIx&#YPT|Ap_>mA$Ki&ve}G5VUVk_2)@gZg!|)LtE*MGY?C<AJ(&}UE3|Y zlPN%S)1;&M4nZb=f-L^bUGeS9%}09_u1*eoZL#6miru{b?(|M+d%a3D`yQ+5dWNFc zk&@p8zFxE|722d^;(Z}KfuEx~!6N<A`R&*A*Q^M89Ui^9{n$iXm!t1nY+oOmxz+LQ z(pT%-w!S~0a=lyq_Uog@x{h!8`R$cFE+}j%`CH%Yr&lNUZ>9M2=p(;4x;}4SZu#1v z;N7-rpDy0+`;ot<Ux@L}db$0fe|FYO!>C&qziquZ&2+-%j}L<bcj~^%<F5;Pna8t5 zXYco;@3L3^TKV;>`0dxrqnqsQwiv#OlDsEZdeGrk!<PM5f_{Jh%Dq-0?a!l=+pZno zwO+E4e}7iN>BfQ|S2NObO*Sms_^Mob^*@#uy07ZLUg3{g{4m`A?}u%?_w#b1XLhoM zDK5=#)Gg%B>D2w~@n-Y-ZGRqZe`RkG8DC@ZW<Q7aI=O=>CD+a^eck_H&6oHe3IBfv z+h=BPX?>WP@H>F(-<EEB?dWIHxv`0bb~VW_YY(tqI?op`^S_l};O%_t5Fh*M<1rtT z-hO(W9<^%w-nwO5e<|mzd&T(ja932vH>Qho{r6wEcXNNi5pI9R@EZp5cQ5Z_4EUqv zq59u@NBPxD;jh!#3Kk@tb(&cg`b;C>eCx0HG^L0p{hUVKs)ruG*}rdDd*kxHFEzDg z`)vQd5brR1K9O6ow{g#ue}5tuZT<Z9^2|4{@1L1a!mMI2|KA(wDL-qt&pZ~L@%q<F zo+pi7^1t{uoNBN<c>c@B%Po_&HzYToVVm3<YVX6U?{56|;<TwQn`i9Lu469QzN3NV zS8H8D<LbQlBdUU5&(GIg6f-YsmvW8ei~S*y;=J)$Kfj%>zn5{lcaqoJn$z7c#q-*q z$^F>OUeEl@N@m}dFSaL?A82<yU)bE;zELY;=izX%`sTW%`G==p)_*hazJdST7fnkG zem37#QCj={cwRi;?l8S~$L@UJqHo8^ZFKAMz8|bVZf968$=(;uA?Oh%`Jg)Sf9s2R zrWUb(-v-{Fwc)=IN7co5R|EeaYRhjwJU#H(k@em`N|$b~_*fvAdi7yRGT-*{2@?9X z0viHs_Ol#1ow{K5y{j(r;-~A)Z|zo-h?^11(WY<vgyFhD!_@x~_LC1*#v9gH%0$H4 z@3hm1)6r*aOzyOgH>^qJv?@{jWn!@J^O2(q%41iX#~fQ&Ur@nV`6RxE$9&%H=~BCd zpKlOOvwo_+Qh53XVQ&7rj<zws8rS^1V`TbY?)slOLIsIGdDk2bb=Nj{Wq&>5tC8Ne z#$JV=Zqe7wZ^=0pioCR{-E+xlir5@4`%l%n8kckgIC<lF+Vq#a_D;I#y5B)$8{ZL` z6F*+aFP!o<=d_H#!x-y#H}9{TA1BYGDz<)&dgz0oUlZ&7Dx(+~ZmwG2xJ~d(oYkHC zH+I{}%xf<d5YeC7e(C(O6_eHnO#VE<a@AR8Yo4s>rz&HA=}T3gYrVJYgL**TL;VKs zwtR=w_J6*~;#;ib>&*Y==s*1}r1Mvvb#wTo<M)q<npJE5eX)P>*8)|Id8_y6+r<9= z{MDf`;{4OrddE8=OFwcebT60xo9`KVaO*zPSN8H>=C9sk&LmUT{AUl>FF~I9_J5Ma z$`?*f>#viY`I$v@e~-)VAf5JvA2CmNZ|a)*QH$Z}h2{JLHL6`NHq@4^e;6}8K`P)v z+?q#+4(P1b@ZLQ!^`l(N*LY6r4bq3FZ&24T)!D~Bn|<T|E9~WKJ>~zq{@_Z}55LFG zZBUcxYOcYwdSlo8Y5%zl_^wQ=ds4dM1PgEcs+hPx2hV3by{gaH-+c7;#t*OVH$>Eb ziazmlv--@N^1Hu?tXnNEE$ctwk4^onL%Gs%Svk99SstBt-QIpw-^JRz?Qg%ktwYIi zhclUH=GA<j{a!Km`TG4u+bR@IXM639u;C2;vNMA_V`Dta&bn{i*Dvkvif`#(@xM6z zq(;-OD_6K?oV3keEO%?Kl^^?kKl@Mp6DqR(*|r|P{PlXqvV{^IYtMK1{`vT#R%27y z`sTGyeq5iZF#rB0C7Zv;=3iUi^sc~);o$Qhl_DzX`+uDc`Fm^Yf7#uW>;8S{`ta$_ z>zBv>$u(%4w=iMm`s|$jJZ}9x_7$zK%FZ5ky74jS*Ux*RjvrUv%02idJo~@mDqCT@ z9UCuxyElD()0GQSZzK6lZ0fGd#zzIle*AD(_u@L!!0)pjgj87V{hX>HBRXG_pWWfW zjk@X|mn?G3O@F-0eE!b4_vOx)*&a*!nJ3!G@z~F-E3rM7`?mPvxo<DN9b2W_8ycUn z=GWYUAKnK~zqIPAPW*p;+MkTmRyQ6uU*<pb?&~N2<I(RJ_X?E%eQ@;VZnK!WpIIh< zwtk$JH^F@0GuN%_S-0xTzT*C`^(snU_AZBxveh279Z`Q1KRjliH&yiPw)`3Gid#!o zcFEc7eRy<wz1UZ0*ZF2zR)2E7J=tjNA)GY(4O?l6>7SjmUw(V~CH;4xnhz7-{!K6b z^@#Y)vQlVo+?J5~t2n-GeX_mm&!^4{V*gDH*tzY3yx~!eyH}+IPrX0ipcP}&yvo4C zegRkW6xLM+9n1^3#N%B<B_cA+H)aI1c8dpyvMm%2Nxb7XkMn&be~;yxTOHjyw1wm9 z)^Mxkm|pum^XtQOg`XccSPNg9$K*TdiQ5zB{5jEo%2n*_cx~HOvNZKZ9of@z`1oSG z2#e#=vipU<*)w-BG8~?E)NYE)$$cBvii-3vZ@$dWn|F`>adk%fl<b9*^g?77-uFK& zuX?x2<x0H6vj6F>PfpM0E{u2eKKya<lDWb`V)ZT^HB#EKzr3#ezxw5Ktl_HpyM?Ro zZr5X6`L6HRwYI<Uu`xBm<tf=)uhxI}owaNC(JQ4dENySeFce2Id0hB^_11e`yPwN$ zoxE<aTj0=x3to3_dj4#x+##`d`^AmBFMf<R(EgzR?n881f%WY6K)W*Ognw5;FF5Gi zw--;)Q#!oYC+XRHrO%8rdH;FZmx({!&7I;kfi>XLs`-ktIf*M5*Ihf@`*8Dq-!}`k zv$inacw@CY{CXU7;qJ}l$zSigZ*5)L-xzaaT3zDxw+m)$Jy><0QK;<v+YQgk_ikZi zS$dlPFSEkJ`X6it_q2PrO`W?pJ3XIWRKsS^s?F^6-`4QT$As2jZ0>y%p!~PSpZkRI z*8fxL%J?-p_pW`s!K{8p-9yo!@9Si0|Mc3o+I#b=9LY0j+`GOwA@r+l`tESfx7DH_ zQ~7^<dT76Tex&oQo66UN%v-uX<Tps<?PlZp|LD^B3bwx3Qw@tm&h7pApGmV$|4-hQ z>iXn&j7v`MJUwB{hrjz<cGfd3OyAu)@!`bhH_UiXg+>2(Sjz3bjq5DWMu|YzuajRN z+Nu3Pxmx#^)xX@Ik_9Vw=7;`XG*|Y#tc1LLee%br^V{_2?)v3z@aq15zOZkVA}#TM z-mH%Jym9mVX0yK7Xx^NCWlBP}l?+uyZ+N~<`{wg1_{v@}&rNS1PMhrhj>CWMuamLf z{uddJzCV6(g|peB+(oP7--*T6ihl39xA5byi7P{XeXj3nYgnJpxai0q`M5-h#yzFn z^V^I9o1<PwNuR3~+I;qHL;b~|`m(&;zf4{BFZghW;Xjvu&f+`YwN9w3JUMQ&>b}#T zce1PI&pT7sJ^7ger}a<Mm|ex1p=O8oODzaISDAmRa^?Iual1y3KB*t?yV#y_OXp5u z^e*07y}m2!{qIPgfMxST6g9ZQE44q?ssC90MY&_e=Hj<^icH$KUh^-z;-3)Y{cH1o zWu-~CR?Ux+HM<sgIs4=NonJ$8rT^aZ$cX4n-7rgC<G!%$jK#mbTv)B5)6`!ndDrp@ zTfHiNePsUENBm)z1OwBVPHDL8e)0N;blKxz?|Om5Cmu1MxRvql)$(htE%T55HhA0F zd!_m6jb`E3E6Z1lEV_Q;q1lFKzmmLf?CAP2cQIdnCjWE2N6TOQcfYNqo>*1OWZY7H z`*3V-qTQlPj>)2>m8S1*sc(4bmhY~ys)i|gO)!6y)b4dHye!xMf0dFdXco9xmVV`c zUHP`VGym26l$ss3*v)#Xx=#I;y?$3N74>+qP7j#7tkm}}%d+ju`u!LA{Ls2(`(@6& z1vjm4Z!8J_J4L+4{O`^0$wy;PRR7yl{Cm}{q=HqSqJFhjM>$T<Rek)5{m7T){PpI0 z7W;{AP53!Ee@=9j?~LF5u~z({`ZcfqH_l2+{Qb6LTaD73-v%cS$-YeAy`8bXCa)xE z)wLhy>uXxpe)%h_uvhQT-~Wu^8KucrE{D}`<Td;9Un0;l@x=QBf8RarUvQ%04Ud`Q zwLkfOm(y+t#>GbP&#)`|mc62Vj>Ms7Y1WI{+YSkTe>BaaJuN%R@vF7D@@4BLOQ|pK ztEKPC9(;L9_GSJSIr~WNS5w3_1RHa|3jZjre*53+%TkH=-alNX&bn3T8+5tsYc^Zm z!nNg@wSVIuzn}Kyqy2)X4X&5&zsPf(JIk)G*+}f-vXV(sv)?+roBEIA;j@xCtM~4b zyqq21_pD&Xkt=e4)Gr?J`EjJq=ymRV9_iZ;uHV^yY5(8rTNc=#tgZTS<nIq{+wXEQ z$EV25z2WC<^D*Xcj<<(=_um<Q%#CU9`Z5Yu=>Owf_2O`UXG<%4+~M`lU5>S`ye_ca zg#GwA#dG0j1s_|NzGB~=TVc8AW~R+#w<D(CN?QCEeB@_Y{NZBpkqnpQmpiY&<bG|x z^@F$e3wDmRx1Y&zS6dx=9AcAo;bf4&Ui%+$zba%eemn2y*2^eWSnA;um;E*Q(ebXV z@^8`J(X8thy}kP7bMDPwt)eL&|Cj|n#m{k`vc-kh>6q}1gdLANk7s0kNG{~&`89jX z*}BIm1*?AjJGP4dfZXm6-nt56?c3eePjpotzd7$}QfZ+1y3qUjyFbdkbE|rH@_&!l zls`3pQWod(>E1~^|LSPulR$Njvj>dgvL{L?%H&M9sL-oo+9)Bn|MQ>H4O=SYt{bmy zc(G9VVW+Ok{CSH`d47F8`PFsiPvIXEKR&mRx;x!rp?zHaM%6!7)7Ax_oR-1oslA~8 z%g6l5_X=$moqy4(>rx+A?x33H@3v)4LmR(G$)9C&rapYp;-1oGayz0_bQah8bG5He z#9ril6aHc5wwt>fZnl}|Kh!i@x4l`cc;Dv#78$87J0lz`nwCtzb@<SND+|2*JG}l| z99mcDBH?zF-)w!w%lHFLm2ZBZh}ysVi+AALhaJ~~x4b=`E3XoB)&E}D{;KB>zq8$6 zyKnjD*EilY-(UYf_4K9hhw}CRe!nQpzhc_r-20ommdGFFWHbC#!TYa_&)(*@(S_@m zw0+ejb<e9Gu@T;>U*;gW;MRAetLJJ(_OV`FCdM7L=^oRi9E%#gH}#@zhTEAkSM26p z`rz)PD-W)^-Ok%G_1-lj`LFZybF8=Vot<%5+-iS;%%^4j|Cy#q>}#0j<i%KNQ}f0! zXw!N5YQe~yFE;B!72d5~UoRHAb=#MZ@tH@34<38`-rj#!RjKopdOr<=TtN-y+}C3N z@))@55^Ddpt2h6AH8-Q&SN{GjEgkQ}+z;n2X=kji75)0>zWT8`xou`w?)(y8pq0WE zzvKybN>2NcWDTpNyUV#YJdORE`l9I9e7l}WOIG}=KN|mEzBpelJoKaezxi+Vw5m3G z1QvP+3zqx3`ZVro;O^#rm;LVdG1eG|FHJ>zA5EJI0yCG+tk&vKOVP`i7BMX><j#gm zM&e#S&%QP-j!&=JZ$JP2_m4mRef@kfb6)wm*JsMo;*3Afn%Qiyb;FY{Tbo~Ah~#n$ zeExs0LeaZLxl47JjNhNoOt;rAt4_2kyecfp(5=DTtdV<ja>1w8vMYU|m4S?M>a$Nz z-@v%RW4)-5)E(JdI}fV;$a~KF!scelWL81B)b!6wj&Gc;^L^ccOR0`Y-A^Y!RC@0F z=0I5d(YCT>i|pdd_Mc4KxIL0Xa7DIk-j?4x&b?SS`+rw?wt2(^jmLqTg}(D7lqY@I z`{YMHYgJOyo!}<<Lt7-`W}EhK`y?^FYvOxX{rK{pduJLp#I30evn<+trkpWoufwaj z$EnU%abKp~(M_%GP+rJl^|?vy-D_5zYc|f!970W@@ggCwqGk0DZDPE9XX=74)7TGf zcv^9yOnIrz`2{Nz7v@{fc=7IQT-f1QxflEDZ1q=q9$o#WevMqH&G}{bx-0hQJlA%+ zuBfTKdy`U8-1og79ky^vbnReDXf-vPG1Yy|#gD<~<#R54xM}aS_^^JMcTM|B(T9(o zPk+i==ejmk_;uoskR!SQn!h&$@8;aLZqgpRZG3Xi{UW&TzV)4RylqaU+o~0j8J}*w z_Py6R`L;5Hlze9OT=xqu1rvUXx;~C7I4A2~mTyp~%l#omM8wiRDST2)!_3n+UdNWY zh5VSLzHm#neB07w_nL(Qjn>cSx15<?Y0TG_E>pNebjzE0XN;8+zncBzm_6(E;koLv zul1Zy{B4SKk95}UD99^c^OGh0xV7OsU(3*$6LlIlG_lupI?BEeG3hLrmdaxF&Hd_^ zG?|xzr=@Ph@rG;PId0vu+idBT!Y8ZeonGiVuey6*g7YEnFMkA&Z*-X|ZN?L^*mPF) zT<g=%Yfo4IT6^J)QQl`>f%<*yUo9VZsP7eJ_OFsY-k2!0SW`~yqrud`yddB8ueV+A zWL9yn)6qLFTGCjS+Wu>=&V{!&ms(RzZGJ9D4mFkG-sHntX|&Gyq5E&~+3zan9DV4@ z_nq4yZOxh2*H1~`?b`e5)jSom4BnoA*z$y}syi*#@@&75b2Ri(n9p`G%kv+^G{ZR8 z@8)i{J$bvv-SM`?`3)v<uEuIn*X)m;tZt~^?6BjrmATWrqPn$J#_Ot*n;(e%sF=)j zplvhr;XAKlW#&x%XnNU7OQpZ{=&uN8(bvzf%Kj`ZyqGDcJ<Hp|#$L4Q;KbhytCu|Q z-yOeGev$6;ie*z*TE2h8z@z=USZ-T-p+{I!!?7=`%L5eFaHiz+N?g-YZCv`i&-bbJ z+8swUQdw*x7m0e6_|-o<eA%Mm_O7QFVygX)vK`P$_j62Ri28M2$8?7Hn&>L=mJN~7 zx^cgATrch@Kk#<Xy@PM>+-ejpt8m+x9D2`LM&)A}d+L0-L#Gs;&u`CI@O{~5ou^w| zyMLScm&;$ct8FLJarA19+1aGfB_}fEIEyF!ox4E6|JS|t&fpO3FvkViomr1PxxVn^ zJl3vqkj+>SAHN|WFM0C+w$RXgpW+)C0++eANvt_C(=Df={ApZ^L%!1n^W3PoE6&TV zzFXP%ocr$gty9$Re(#;aH&3X1<HLRHt>&mcxH<EzcJQi=T{Y@P4!#%fJ`eG~WpaK) zq|WA={hhzJe0%R6lYV#kTha8tZN~n8Li2ywlm~v^)8II-_;~%M727}UT2uUgk(HUK z)wg&S?x-g^%l>cMoVQcx*stRkwmmxWGxT7n+_!f{!5ib#LwEALE^xDaedhW7!no@( zZ~imRQhu)ZdEetLo6Y1HtA5rkN`9LqYQEW_ww6&&O6r9spKjrkeM^&`zmBkG$}#`` zS#e#dWsU2L-}mMvE&F$O>Q$NSg~6raW@T%t<<968Ue#{fz;Sg-=?2GRmCF2O&Ua4i zJfW8RaeE>=(>H0skK1Ll!?bTOw#t`3S^I7IwTW}v@BVpvuWxHceb@fCc5*NNtvm2q zD|xE-?rPSqla-+}PR%gt-+%Vkh4cmG`yv9>@01!}epPtTi}!U)guTqX8s($RU!TRi zSm}EI?%!>Xq|IhDtU096kgioc`@Q(L!?Aptk<+>U@_B2jsiiCaK3bIQ|B}Nq%Ivj3 zh^73QuXn!hmVLwLIw|0dbsKZn>hkp)irhbMls<HN$6dS4`oI5gO7)!a-s(cUSlc|m z^CjU{(|SM1d~ZBBe?3q5wsMtu-x@U=j~jIB|KHJXo*4OEGxSmTlh)t+?Eja(KHi?O zLXJszJHuIaVT<p7zx9=-GY0%)33xjB^t$IqOTWHl|G2)!d)10Slg4cYa?=_g^=xoC zys<ux;Rd7Z@5@X!u`}%U$J))>svx`VeuL_fJK-$L+#<dm>zj6VUZlWN{d(TtA)6e# z-#9K!`|jp{`<zy^<?pSr#VOy7XPgeX_<D!b%+p_U4X<xMdVGI+)_RHRxNj+O@@tvD z<Q6*4`(ae9?`ZgX!d=OoI%gK^=zKeNXSd;+AUO}oHB4&r8#n5jG~ay?EqH2*^z87> z8VVDwUTi<YaQN+>Qzn;Z^6iM)etDzNZNFooVVO3Pstej81Mk?fra50%%@=yj^{q)R zpYv|TpSbsn7R=GQZhh}b(1)C?z#UAfkMHcwc_&zPXLg{JSoVgb&vW(#a7ruO;7DAb zTyL^UPa|TUn8D+Uu84}hzs$_<M5OxW*vLlRwK%?u;fAkJearsz?|VJMOe1yLXK(l- z)AHZ3H_X2}A@>7^_J$wI3%AScj6M*Ob?Z;R^`lsGo9_um)&0I{|2cG94Bt7JrET7n z$R1p=FJNxmy@mM>Pt)}6IrBy1HdQ$0rLW^s-S=kG^_kqh%guWDX0*R{Ul#EGh~MRy zHA}iTJ}N)@woxGJo@}6K%=?GCzL|XcRUC4|Nn-KE-$ME)r1u-^?0fTn%lF0JBK_9v z+q!nhN6FsIcTkdJ+Yz)!GWFdeJ_D|TX^{yAys<8BlIBvKYpst*=F43>|ADXhY|Dx} zY>^9R<er|_QY-h7HD}Fwu>)dLG^{5lOtm$e(JT4of{Jzb;fc20SD98AojHG^i@V_< z-{~7dX3rDsG~>d&pWocuRe$zf<(<qn*QFaxTIzRhSZ%J@@U>HSuXA*z@$CbDG_5jD zeR>t?Rgrp1`JSV1%KX#o?ib`fOu3aA=s7L^sIN~$eQYwTg)n=Vb>e3yv(qo<-e6E( z$~eu@GB|p}mK{RkYm84l6sz{mR5W1tD}74&AVX?})s_nrZ=Yp2I{8J!ciY{9QEQA# zWwVdJ?Rz@mdPmQuD^mAvT>21E-Nxs7XqoXxos1h>3)Q<^f9iOf?w<KF)m%HQYx<d6 zsuGp8tUDO?M}M{DH}kvh*}mIWg|qu1=Sm5t<vUipZwgxRR-g4<;mxnRHCl|7o_p_K z=CtEvRqlNev4e>rwr7@~%)Ml7E4QHYQmn~=$s5_WowT~XnUOhMZddW%<2z5zmU(fv z<8RHUX9drzj(4e-Zs{mseRMq{`QVnA&Sb9Y7q$TkYdDO&Hp#qs`u?aD!)}drR$=d$ zFBkri)aUsfQE2gLTjR<ZrfYQznl+ak`ZzBoPMKT8?seb(ce6Q8_S~10i+@(|pKs%i zQ!cYtR9q_N&bbu$ZOy(l$3mB05okWCl(8z{@s0m7wSJXzmc9$lsW}(d*?P1@y>0KS z`!`}v%s#nl-RtCU4@zqco_0Oo_dM^YU(J<?w)0viO%D@#r{$g9aNcH`dCv0R+xZ>@ z-rX2q{Qpv;@721~-ftcp6rXpEDQ?f|GaD~;W$WnNUz&I^=NJ2AGh3-wJ@0i=jzykh zvuk_pbZ<lCyvGK`9rtHOu`r4yHHgYPua7;@7B}6&T`x`e@9M;E9#7RnZtOMtMORqy zEjqXRkk=E56}z2ReAdzrsWR4kS^9ZV;kQVUs(Z!u>(!;ZTJL?Xk*qp5u{!McbS9gp zD@%A1gr_wpG#AS4Dd68$6Z=)=W~rHNb7`Wr^x?Fdj=9xMvo@=As>JMWx80?_@5=Y1 zwP6=uHDAkRl+s(iX_eNWb;(cV`3pZ@-gt?<;NHW3eA_K0?}c3B<GCZ5+P<oJcV)yz zLwU3LmKTEpuLRFC+5O(t;8MCwO4q$plWKUBELsE~R5{f|zF^zn*OJGPR$dz!aeUpT zhJ~9oQlBo<-{h=sa-YNY>CVcBaq|+J>txKe<Bl4c&f1)H#Q5{4_<(ulpM@5xCvI}g ziu2m8_HI7cp&0Y4vlHL!Je?@HU3TZ}tMyZ3Co2Dwx$@iP#=WWOSK2;xZTkK0U$b+E zlTXltPmi+~9C^HXkK}Ay@7dDq=jT}-uDX9<x9}{P|3{g`zOw5&sOFd6&+fWAExDms zJMZz0L%LdV;nRLykQV02J$JZ9Z;E+%@!U1ZvF|O!VlPYYS5wluv2o>s-Jj=9x!G5v z+v8hf_IS<=A+D#pX1WSJyff?IvAPYON2K@9Td85H+7$XfukX(-!BUxMgN|#7&XMuk zC9`8XWe#i*Gw8fMEAniuRzv$kJ+8>Ot+MPlGO|kZ5*tH5AIonH{Z;3f_q@t%d8GWj zjVCv99ZTPLxc;%no4LO&`~{y0E(>TcO;9fPXWJdzDLm6~P1eljiC3&^3?5a>Okv<t zd=YrR;zsL-wd;8;uGa|5&1yFL?~`Vdqi7?*d|H3Q5l(G`4M%o<=8TEhAbPZ?Ey(W5 z!K1l~Ps8^$&$%O}yRPPj@P=E8{V#2%e{T9!wXfyoarsKk*R!A3yee|&Pi&10?`fQD zX0~GEAw!mb!P|~R6sn~*tZKQZ!r&8_!zU{IqLWuBZPttg|D28um)ETO#czFfkyg~v zeSG&UGt_GNcupBuxFj3P%P(3e)86st?VsKMj~->$w|jon;8b+|*<PXjMqkA@^5^N# z;kg^&Bh7!SP?mkw?){f#f3H0&U)5E#R`7gdx|jJi?Sp<>Ut4LjzxW&7@>#m{=7d9g zrhZcXUiS0O^HBfPJlPk!4JK`wzW295?aH$L)eaJGbAy~Nu91^|b8xH5Jnj51Hu)*S zGtTC2|Cq~Aqon8aw(rfk3xXf68qDHyz8>^1&NxrmDY<sX<^vD&x}_IzX~}Fbexxz$ zOZct8{>OP7@%Id_POf3u=GBtS6*GPBI;Lg!HeJkkl2Xo;*v$Oq%|DJ=PX7XUeT;K@ zj$GeS6z_Qdf2FzWp~7Wf3J&VZ6mQ5;jF+_jxA$E5ragyeJz=eB{N}&7%tB8j#e`?C zz`XX;G1*}bk3RnFxbdv7l-u-<^0)e`MXDV(?fyKe{w#|nyZ3UP`Jr_~BzxN7Rn<HG z@|{|?!TU$?o*WZ1oiot_PYU0D)#FI|e0EdELdSL4eatg&iR>#eQ%%}9t+KDweob>y zZPk%SYBO{0L_Dw%IIB|h>);|Tz1`0oD^})P^0{OND_y9Mto-qEiji6VhX<S3UeDKe zS7F<!XT_(}d>}nR^+{pN<Mm6~k4)}+Q=V8Sc$MYXxt`{@=pCPfo_QZ%pMB=+jTgOH z=iJO6UOX$CeUHU3-O)8zf8ETMWS71-JltnC@9t2YJ9S65xoyY#)h+kSV|BWY?A4f8 zc~EreA}%{7>p9;P)f(<j)~|jldHT<_^LnR`Hc3mbwD7N*@BB^L!PxH^>)r>Ar7khc zdR?S7uHK(Bk8O`CPtAmfo^i~#S1*_x^KyIByga7n&ko0}rrhbjx9)3PxSq6tRhSLa z*KnPB)`KCv?t0P;+c%xdX3Y?bIJH-AnX!_+VcU9%awCV(FGoxsem!cuW#^46%39nd z#rukPY-M0=H+>j-QTX<q$zo5UJFE};S@nGlwvD&?#GYAaoZ)7sQGTZ4=M?|SwnE2W z@zVm%+n6+;%Vyr)wnI{+cm5uQh#fyK-uZX)M*jaVyZowxm}P&rb49PbUAc+-Gk5t@ ztFV7+x*VHMW{3GrO@3?fX0xBwH}_5NzOV<nbvJj-nVq1z;l$3F=l5TD68Uk(?VXXS z#vIp7+pIUs+$>mhW#j#y&fjm$T4yB2o&Vj;=D?#9vP(b49zFMUrt8CVzB5~O4&HNg zocBc6K-{lscjj7~b(i|YwO?6%($C@3<?)Z3zw_v9DT#Mlr77Dld<YS_ylj8f<n0!G zUoOkAD{a+$czk+n$rIzdg*IC@Jep&^^GUtw-8|pqOs$V^x{rLd`15~L*u0)cO3%&a zt$Z7Ce~#)qrezU{rkA(NKi_yeWc}(HUmX^>6xP?edAeB5zW3Js@LPASFDEDT&z->k z;maorqvp*<c0oaF?wt|nFIJaWIqMOZUOX@Fkx7M5*d7N(ZG7y|^elDpCuYM5>c^wx zvra_McJ^=mKQZ&GRr#Xc&&sYUjL9ETxK8I9-iqqpnSbO$m?rbg`?9{JPrf)kep_bD z{^D@Z+7m0?Y8w|OKl*3waD82{A!9*;=5j6L1G6{U+9cl&YOY*qV}5Ukz_qzoKdG@k zk4ZV)?vZ#%_vM3Qw`B{$KZYG&C9~zxueif)EUIr_zI)xev`{$if#ycvs^#T{4d(+} zncZaMoA2J3Sj%+WDm_B|NEY9`G?(nR8_f2J8C?0<b=Bzp=?x1`u{CC^ADC94_GZ_s z!rV{1$6CKA{#*6${;uR)j_b17{*S(7^Y(~F{^#J<dU{Xbh5Ys3-yZmFR=8$(=vz&? zqxdqDzqdZV_nOfoTG7t7QRv6P+xjehg>LOGIvid<o#x#6>}JkcK26t}OUh!|$xF5K z>J&xWbvEpK=e@)I)$G08VpHCK|Gj{5XOl12x1|R5^#<qm{_$CzfAVj=ZpOnK8oPe{ zKWTDT%IC7bM_HPK_3p<nf*;wX|M0!^Kezwi{ipxp-&~Gd=DF*B{p=;N#TT4xp5GTs zI=)MM;e>yey=ty+5&GP0oUzZ=E9_CtoNf2Z#MyT3PY-@<w9LR{jnlHJ61)$jFCLqF zsprjY)7IMGSDW56O<^cc{hfN8zu9oxqYc0RO`f^&(4)O#*9vTwYv23DA6)$R|H&(7 zrkDMF_ALKhU3B5of^aqYs##@IHr$+^zvBKXnclFcui7s@J1wol&2!D6cJ8VZDzUw@ zm(*rmt)DTo{O8#-vKP+8bogIyT%P}UUH$j3_Yzj?7u;VxE%JWt`;Do&cUrI3F6DQ% znJBJRJHPRvg@(Y|BROKRXSiFWkGyY9o3``4?anu|c5hhyp4aYoLU4fD@Ak_2DX~^% zZ}&X$)cbg3{zo<TJDqcmY8~(lIg&cTaQ$nZ8FS~TCKl%Gl5bWHTee>?@#u%3pWYXa z_#1NCtgE~|yM~RO&D^%NK%@QJBaxSqW#@f=98KG^&~@JLckip7OYV)(+sN=R;sUSV zn)zDkRXp2fr<VPh;>y@r#JcPK^(eEewg0ajv|muGCi0xMwR*1k;knz54<+hXPO?3} z;;_>94R=H@2lfd?oG*OxXW4_0l|ik&wzX3@%+4Kat*vM&bu-+dZhNxkLxAoIuk{U2 zRo-i_S(CbV`c}5;^S2~_EXqG{aLU%?!X@VvByCS$6y84Ze$>C%eAkmjPd@2dT)+EW z+WOkTZ$=i4o42vrgujWn-4V@w=)s07ycS|pYHUUR#kbXNU2dTBbJy}8d6_OXE0r%s zzDoQ*^^Pv<?yC$I&84DmufLSM5pr3)MZC&U@87ETm)m#TeZcoxLguEJ#1YHWyBzhj zt~SdqjQmnK&5_fD@$qrZ<F~|TNI%>&G4Oox9N)sdZ^ZX?7+6fGx@*oQTzPo=2gP^$ zO6sE?*sXi?>iFGDU02uSM`W#YKa>2v`}SgCzlNJh`X!~=|F+K95U!)<^18-QQI@SL zbPG#B*K3ZY|Kr>(I$m>Z|G%}bfaRPkuS2#;{DgjcA+h@3|I1hk%`e9<zVm%e-<$Zv zszUt(qWxUl{hjLf<KjBZGAs(JqTj4aJgdZ&d%^qwo9z`2U7o!UEZ?4(+sC$7`c2@C z6LO+D=T=+z8<~C;nWw*R?*~sYo>?znRkpWnkb5b3UROi<#-rI&1rm0o&kwoCRiW~h z%kIUAmHpfz?0Y{q?+H}eT-i2N-}L#HW4X*_*JL7g9$jhhX6G`O9eS2wdrq9@V_ILk zYL!>Qx#b3_L3cy5(vm+$nbk4<{So*5WM#lv>#p0U_cbS8j9j4<x@tAk;~C3#?n}>S z4ZWHYCBd;%Gj8?k2|EowsOa$MG#vTL`^9R#`;Ay$gXrlp+RL4ky)#&&YlNawQ)7aI zqAJ<9t*T(L;?L9VlenR_w8QuK%_*<MzdW7xrEC6P=Z7<vnXd|Mb@okK^zB5)3NuYd zgWc=Aeunxc6@Alb{kbzQV2^mkp3LkTi&bi?&3fEF98o$wU-`N4m4)A|FK&*owfP~y zmUKPjzWa@=ylz<**K<to5}vN=NaSC3MWEf~e6oMoDfi#38C5!Mi|>8=RIa_zF+H?- zv0g&@w*w0;D-QQfEfCYyS3Gcd3P<p~+q~EP?=3u-Q*!*3>vN9q!dKc0(kFLE>K?Wg zxx=GzFC~0ShS=-C9HYecRly(i=6J5FnB4Q?-Tf7NTR*(%{KmHYd~N@)>fVq4cAZ^& zbGz-D#Ou`!(Qkh~x9WMe$FP%U>b>>^?i$@fry{oO-;yidTJ|TDS+%GeY&%rtxb*DC zcZ~CV8FNo9o0i2m=Uw_+txIyR?ufCe7jE15#Q5sEcD^mUjmy|~$mnoxS}U?it?ftk zf{7c1zU)2iJMH!VgE|iarxZmTDp1}0?&I`l^NKV6@6)}#f2LNM__vn5MdxPcJ@=jV zZ1%&C?m??3JN_2`=8(nx#;$M4wG_rGF2(KP?+zO5-NU@<lXB+y-_Melm_KZ1Ub4Z* zE-6TKY2P2K1l_)L=d`c(yvII1y)(Ht<N8&$*@h~q^Y%XS{c)}B{d%r{KY8zOl4k1r zr<xG2I`cw-xa_Rb9dkRE27J`pQ2p&-%e86=vF|qSiFvQ|cs_i%+w19Ub29RtZFIr0 zxo6uJ&s%!-?S_>+LZ3o%Ez-EZGT$;;-Bk9zSfJ`%m#L54?4R=;OQ#==nxnpIxB04W z^;OHwwcf3)-2B|HB&9zk|M|*D&2>Bb-mvq0&W(7V!0qd|t|BjC_J&5^2Y+2kISw<g zyjN>c{%rm&hU`!493&1+uRdyUsFGRen^4ug4|1(nQl2_z-C)Vkn$@qczVfA`&C+|K z2Bs|%^S2(@+3o#L_PQ*SBIEQs_eCpi{8yhY_Tb>#dpU1fm`}cb*K{voa%mjD?b%B& zB_+=MITZ1`m#gt{dZ2GYdz45|YDu~!$05(nudOb>Js>;d*M8wla~Vtf23uvWXIuI! zzb7_@9b(G3;pH(+ebrR^-8RLNk@s%sP1t{!@7s+HVKpf)5*2ig#O^tH^Ur2hVFx9C zUeOKA6ZTr&k+V2^@cxX|TetK1R76}_oOW>H)fJWZUI_SyaLqndvFOs?i)U>Ey}K7Z zdhoX5ovwZ4BlDRCsguolonm{{?-(=Nwwpi9KK<<+_op|E%1k=F#mRnhVOx1?jML4! z8LoZV@%+=;2?u#^U*KzD-1KTrVKeXiqtl*0xm~%g$iVaY^+)Uz_e2!xMjzesE^6)n zy=hPP@J@CLpH^NkcI~$Ay~P=G&cufupS*D@dz<UwLnl{1U4PgywC;AFdDV{R{g3ZQ zD|Bq#z{8RL>Ce=Atb*3A6XxAeyccn8+rbMHjf2}0+x2DG*7HxF-^6riN5G|65tgs7 z-p{&Y+%JEA{c)zxXWOqlx_#bCZPly!0s2OpWY{k~^C`6db9~}kHfEoHmW7iP?05A& z-=th0z;DL#GTB@yiPucG?bh5mN8g=gI?EVe+GKV3wS&XwPtB%(C3%_8p1ob;<p1x) zoX6Ko&riSS`1y~u&O^?8-}>s0$G#RmIesSSrjAAIv>9=i>vtTytv|{0%tt=oiSNI! z<vf09runj@F7;LHzfH5b_88vrefu?=hku)Mgm}b8;YRg&`{Tp>=Cf&Zoom@R#pZ_F zk#DbGIGjJV_r~57-$MOai!C<sA559IeYVw_6>n|0-!;9HP_h4&X0l#N<dLiDi#VAh zyS6ZB6zpOD8yGXeT(hD6i^6*ToNG5&Hs9KM(_qq}miwJEk45Ek{dv~*OUGl<@tNGm zC$Jy9C3pDen$>a4vnPIB()2t=;`h`&oXfn<eXTV7en&F<m6cFl)!f&2S=YQiwe~dI zlh+T!m~>8mEU?`fp{Ky4dnZ0ZAkw03S5I%ywI?DeVW+#b1X??I&+L{ttx*~5vSsc` zmFLf5&a8Q+*YTyGUXl6JLi0$|?`w`c>oGqZp%s?2c-gMYo7h$_6HZWglu~MxcTMEl zL$l?(Bw9*0?v8qNV*i3^E=O(|zg@HH*Rw+}+qLeynOu1Ay5s5XBa!Vwz4>3yzxr`+ z#yst)eQ^)}cTLL|da`=eljmO_9KRd1KP~Qr+$Y|qEh_8})U~*79Ju$`MpI{oU4UkJ z60ccXOn=*PhWt-qwKHsODt9NRa?SZzmRr1L4(Ij_u~o^<pP6oKN!b0Xecm2Z{S`-U z8?KqWeLbUc@j{-a1heX!)*2Gaf;TD}csH%*iEYo%KFD_GZKa#)Y!6F5i|xK2E%vwM zKl`9o#~EI+y76Gn=2L9pzI#s2K0JB5#iso&T3vG|e`naY`On-HE6S>kzWuURtMQlq zp0w49L%Qp8MdA0gk2~+{&C2%?&p+mw?@+$cQ>-jy<3#0n=R?1O*ByMMwC$Jr!V^Y* zuV%)+I}&9Q&c43be9dm|(w@I(*>b9LvRF12)~~rHy`k~#<B!X)eYD!%KJU|xZ5xC1 z%2L+XXRJD#kpJh~9=)SE0n^gwe6lFtG;=|<oP<alYZt3r%yh@lQz6yN8nc4G6<j~J zWq!?vnR4&FDyl6$MD7d~Jbr9W<h!QGfJxnN3hwN@G~Ya5OigO~XP1R<4?Yq5RCn?I z--eJlp0Wvh>OP-4IrC{`epuBtu1TA1v=_Yl*~9*C-|5!}HGU|n%e~C&d9=lx|4M_M zf$NupuRof)EnRK?^U<7)^%7o3SN%Dz5F_#A=T@=n`5S+9PLbZ={(1^Wp`G;SkN51v z%%9HR?kIWikxl&Ji^<HN9~CUWFHxzy`t-SyW!tOcd<3@4Xg;;yzIfZYHrEF$b=KcF ze5p+9Nd2aAo|b>>*UxthsGRBOv+K_>IU`@Oqo4fed}R5)xsiXH_s@q1Pv<*)51qG% zyUYB5b^l)L-MbYy_VF2(Sj@Pv{czibACu?(xKqz}^FrODvnT$3w(Wnd@}e+(WBqDV zlbyz{es|8jDrJ*zXJ+KPcBE@g_|EBfjrC7RPiA^{C*#K&!6jLI@A{LuuAlgMW#ZnD zr~AbuKRo2D(ct)XQuK5oSDEa-JJ&w)Nl)2$@Pdd%%zs6m`iI(LH}84;+2O~_qZl4? zZIw`+zH-IS%BiV$|9-xIW2g1?9o#?GXzk7t$l0>eo%Q}?-$zX|UZom6?an`ZGfiV& zVA9Duvt^##$Y-hAeAiU>!m;hueVZ><oLbc|$C@wZc#FS^UsA6Ie}CqUzwJ45tQ9wN z>qMk0{Op^vE<@|qJI{09t~4?SFc&ueG+yvHCn<IRt3~Xoo7ppx4A@@lik*>ord+44 z@#~wIhUguaDgiGKzfGT2)>v6~w`OXy*>4wUo*&(D@VxGk2hYWloNA_D+?3ybRqWc_ z&ivY=EW5a!4A>1PE3of=7_zH)v-!@RvtiNIl1JBnUy-rC^hwNtlTW2G)D1N&-*v@q zFq;0Zd1Ci+W^S%;H7?Tc4hitT&VOuvc-!2Ci)~LvE2?Sy*OC#;Y0|OH{;=)AeXftY z4zm9#NKiWem-Wum(=L_gA9Z`&n=M{{x4CztlEn0m8Pi&J@Z9*od3&A0o01zHUu9)j z8e<ifRvvznGw+G#J>L5&g4LRf44c<n2v*oBc=4Fi?ss>lT-~ds%6zPU1xG=G=95C} z@K2>-Qg<U=eP5sXBx-me;>Xf?do)+OPklWnx&F_#JFou#y<_#icwN#AMT4#97TtYR z_U@SM9oq|6raiUG`+g+-A^U6tnce)=Pkx-u(K-}#W5wg6T~cezTfgp8QNH@HG%v_I zA}CgLxyaf_>K5JxEys_2Keq7YJ@M}ROzYW&8?s*CKC8Cvk@pVG$>JK$kLD-~&zG}^ zNPO3DWcg%v?cinSXIQ?Rnd$ZG5o@u!{+tzOX4{t@Q*!;qewJ-o?!5!=*EdNz1^1-5 zR;qXg9#hf$|MmUS{~wz3-yAAWe%SCo*|6)9M%(Z0DS7P@A9-&t{PS<|T#=`5{r>!0 zFWB`dTBU!Z!=3Y-VN)h7`%`ycUF7N0urwRrf6B7SH#O=Mci&5YdGGwXnljPO*EYL1 zMa(+3S$k5f@1+0M@?ZMDwuhSj|9(62?Ty+p&9|aYrFKu@>$)^McH*0=-q`4yp{&|s zvNJh$TW!de-Mwv-_WW4ZH^1h_n%@j%4U3-kUrVF;+?m$?e`Se9AAR~_L*E1m&G;=< z{N8x`q}J~NfkF=tFl5K=fBZ4fcPE>B*85Da$6jyiJ-_Zhoh!L}+b4w$2c~b-?vCwz zQy8In@94U_Z&o!uxKTah^t#G7tD2^t*76Vy5xVB*7_7;A^YfciN#S<8xo(6W)mti9 zd~>NuT3)i;$C$FS$=9>r+&Z=H^Bb?E_vNy?kC~?zojqI9v}%TN^}&`GN9+P+gVoM3 z?Z5s1|BvUqnRQMl<(ga*Rx01gXD|NF{IE}cO^)@6*Ee6k-)Lr3vEh^3v@f?cpUe|^ z_t){%w&$Xs|J`)F^I!7eHGy|e8~^itf86+kOShNp)9?2x56%0spQ(MkUp)E8U&lw^ zFFz{Z@uSu{utodMDwcQCIJOrvO}{UGzCOAo+Nfc7cT4om{@wCi<;?}pxxQ;YjC*tX zuJEC=g6{+#vT=N0Z}HBJ+uUcz)fQ{xX}cF5;uU)LOCoTcq0QagmfJo%zP4ry7sXrt ze82aQ?bY_(#jVo%clOVF_HO#cJGF5;@*XbZ-riWST50F&*GKQN3*M2HP`sobv)8)3 zzx?s{_vKIbTbDh2*KqF6|9-zafBklxFM0Hxz5BlHk@uVW{(N84x9Cnw^(yA_$5tPH z&)@!h|MV@-_rKrzIPdkgJG^3fz7Oqgwe2o@D3_~y%5#T(OHuiZg6~@%z0-PV_nD<U z+D7ry-Jad-a^fFt&ei|F8FFRzvOD!t3Vw5%$Lwfy(p%11ew=gr^n%%(-}fH7bG7An znew}JYtJ7(DfI4d)t&#=50`Ol_q9#E9d_~Fy!5{l1N%=;XaD?rK1X@|hE2J*41)8L z4f5OXzApHA?2vAq&ldHEeAPZn!gpM6a;fEdw14u^_tjfn_pU!$Z{0FGc=B$+Lw}7M zc2_Y>uiwsA{ypq@Ui!nlEuA%7+xHdh-`Z6qnpdjL|Gukrw>j^-`vE)3OWxJ#-I;qx zR^<+_R=G6y_w;+E5q#Rq<Zi3|Qr1{+bnmIe_15ap9ZL`GZLyt~G=<}PPeFHUb<hsh zL$-%@TRdJ+u$`lPbHR1)^4@~YmE!3-qWdqmTKn(V++yu{qE~ExJGZ(68I?k7qG z_B*#o>)cV8sK49eJqNq==?&QuyN_+iR@i-PV>ZX`woR+;cmLX`-5BfnM(WJEz&BFo z)}@r$9$x48#w+D|1^fSVwKlumHf5Xa{<SHaVfO)xx5<KjK|g0K+?H3w^jLF|ykE+l z;13bUBAe0;*Dd{2m^dv#LOxH3=kX!_23|Wk9g%+qYI~F<j<s!PIsD^7RzX`~Qpdsh zts9f9AM!swx}5d!j>47%3F~u0Jjo|?KI-%+n{(Dnc<)n}I5tI{<?xP8AqGAA^};-l zJ?|cpJT~=fLu8br_!eQFujXDSe*E7mJm<il&8q+HUe$KWKf15_ASO1~W6jF59i>~j zH-^4-&I$f4q@C3y@-IPi&c&b@W7VIkll~iN@)oQs=JhTvo_OxM&IPsiT2FJjHcc*E zQpA7!UAs;IyOyZg^mSH!HM~#vZ<$f*ymgk0MqzO$yRn|YQ{$G8rN<2Zd8Y9kb}$qR z5^DJ$psk<2zux-b<~4if{QXyZ<*|^s*6j}ePx}uy)<ju));Rv``LU>|^T(v3sXJyo zy?1`;DdtDoUA|vGhllY0S`j`~;Zgq7w4QQ@eJ;2BA{XXxi)4I`PnbC;WZmXZf8w;} zTg*OrSk-T$h5Ms$mAd#x$wKwIA9*|9mQ8-`c_;Rft<d}lKZ-j~tNinR)R3iSK4nMy z5lKe1{7FBi9I^NO(|^P?dzOq|;i4mtRp;q{Y!|9mEBqX#=I&wR{Ya+syGKpbqxGu$ zv^U;OEK2UQ_PFE!C{Sp*#~kI4tA*kx{_yYYb<pe=I__-~_Q<4j{^TFIo&Mf$YOXw) zEOeZ8=9|esjvrt0Y2uHGR%+%evp)%S#!uK$w&A3&>N}mnJxA8Q^30rEG3SW1%00!8 zJ-^hdRr>N1K8bX$R#_*WR5as=p%DLci`Yje+JdY=PGjqQ>+6%J_R*^I{`4IVkKU{7 z(=7}Lo*eCA6ZB}hs-4cq$j<ud5!H8|OcT<d_G8hJ{a!UIW}dw7@n`yxZ_h4OPyZp_ z`PScK*NWDVFroc=AKit@Gc{j^c4lv#^lHhGwb8TxWXuSeCsaOp$NVGaDtsBqpM-_1 zRps<HdOwQkyg%i~iX-8wbqa+E(UYw`-%P1kb);MMp3+CXPJNFUwT)ZnUMW-Qn_%Ji z$fPse`_IH9%T@HI|H$v0z14i@>Lbdk^K?Ic7TT}<(Xw;@<Qta`KH08fr~2`2pW6JF zDWCF%Ztt2A6aUDdv)Xfx#z$iz{V5eokLY{t34T=5sqgh?@saN;>pm_C$rF0+^=H$O zpF;6del#9wjP-q|S-9v(x9Yjc75k6O_xiK^$hADR`%`!1m9NzGelw+F$B~&r`4fIj zIFhciPwk_;&~<L}oxMkzRp#k@%<8;91)^!{5m6!gDK{=UXZ;qkR-LEzQK&P1>JR5m zea}CekMwa&mY;6n_sCMHTBR=X5x<Jwgda^uQicAjZd|+k<Xe@t{Mo;DE<Ey9rEgNj zgd@VLb@7jwI<-~mGzw40sePYNvFON3kWSA>-&O6@KmNKGG<V{UDM!LV3f_85-tB!S z{?Se${pl5pkK9(dCw}sIr$PB`c@Q<<O5o)4&hwm>Gt}EQzD`h?uin=AGu-;1>cpCP z5^kS2NpvPp<#@#CW%4m$sr*NdRE>`wsWKlWQpG-2JoSCldFu9&$y4SY37&HJh^Cia z;i^xZg|mtpEn+oQ;}*pzp9`o{o44$bn@#LWm3hlU1kZ=hnKiR5;%trC#ENZ3lPn@< zdhc=ZR6iH6sl#1sb;ogy*^<|Lnkx15Z*L2HR{ch;aLSRts(#Zd_8c)*^_yBzDRM(~ z(TDuvb=^&tr6%VVZ&$Ei8<SeYv6KJY*6s;&x#s-%6U3#i6ZPt~>O1X^A)Uo4_jEqq zSnlgLxnk>)eD4~MM{Is8*CZ_|)BPCKdEN8Rx+Cr?cKRFrAH7drTBpKiA@<hNcEarB zUP%G=ROxoJ`4eB<57$gKy8P%&dT_w8&NqFJ--_I;Hv6Ui=)UjWmQQz9eOfl5(QK=3 z-}clD<$TXizgu{&?EUM+_Uay^=Q58I4tKT1jMf|e3wd<8Fvfn#kGF+~<o|7*yrch? zuc>8BtG`4o+j*}4@sAgrD`|bJcFI2Jo@}k^T>Xu=?mtlza{v1L<wlLPs%@SxZ@Oi^ zSUO8)<-WrfQu9Rr1^;rcns?~Sj(_b2_op7JnSQ8nmD=%D){@JUX59JD%Cnij?dP}u z0?*iep3VIiv%XHD^*>|l%q6qtta+y@w@gl@Y^8dK_)7a(yFC87PTHw`^2$};nF4ot zgzdhUid;Vb`0p<JE4?f~suq7zE>eoxRPQd=Vfw&sUpEKOVY7zc%|5wL91}K$Nbx@S z%5^Bmrs4WhKb>`I%oQ_Jyi=L}`Lcg7dbwnF>ZQ(0mENX5`L~LHoc}7|(d}0S$6^(0 z6zv5rf3{whZu7}k^wl4kiEZ10q>dfDwa4SIg(mM~jX%Fvot*lrBx&_C)pg5q71piW z>k#8yJ$1*jvW6Yg%6e`rtaZxCxG!wKXsWRNs+Dc?n@y|>WzRasglD_Ttl6r*ZhfgL z-^B-~nQumf*~G6;{CVf_r=JWrx$bub^mTmasI<|#r@Z9t42{D^D|r%a72~HoyxbPq z<{!MLKU>ZGa#F|a?Ap%x7lb6^k8LUZx!=IncY~Sq#{<5mKLkb2Uk>p0I_#kKKf=cU zu!ANqv*sVOStoP1ZagBp<>V3Btuv3z-SYFu+^r^$^rF}b&2w1`%g;LBagO$vS-98X zPH^?qADVA<A9>`e7f#vMZV`3c-6p`=%f>@nNp8(tHMzyHDsro99c?^+PpjDUP5EQU zTegomZy7(z_-_AExh|}?V%{@_xCORudjhx>%QDY)1aA#^q#7muNJn>4#m;NfZ>;52 zI(K!M(Ejzh3jZ961?!jSD&AYJtA20&Q%|GwLh~=gDgN`h?OEe?+qEW4Tg7g9tz%8x zZoitq-<>}uebfFZe#`ff{#N!QOJ^m1{VclH?Bn$)gOA&zf*%P-aX<3kns=mptIDI_ zw-O$u<f?o$$hG<C@iy|&>s!)Cp5Een^nUB&BlcPI1-@UbQ}4U@PwCz2ts8$<?z+}m z(I)0NXZ2B`_1D@2tG9kUlD%c+k;+>|k4kT4ADO*1_K1FVb?5es_RjdreM0-!iF#%J zX!%k5Hv19(mi$ipOQ)8k=L>EQY`S}1daK)!^O^nzdCb4uUrheDV!D%QMM;WH4`Wnz z^i7F;wO{QA%Y~-Csd!<2JIlcCj)eZ%ixX~V-k$N_UE{vo*XV@_6LvNj$!>Y;^USKq z;M>vd6RfkWXWGBXKOJP1xm)tO)4MfqQ)Qa&xLTjEFll^U>{0xhg`?i^)z5+{k&9## zjXpZD-O6P8m7d9Zre5V!(OVUnI!}Yk`vq>U6+O(z_ax^n&tuaQmQkFKue;8;aPPjy zgTEYGo|+r-zE7_Eu2kRf@+VKF__XMiBG>g_?3X_Mq>n@R&`#|`EoHU*Px~{bN9?)g zGQqwpkxjMfzv0>`Kh53FT~CO+EVa|2`KMon62I`FmyPG^nhK9DJfq2b?5*>K{~~Rc zjwhP=D%B<~XT0^s<>k$vmo`gY+PwPc<_qigK8nn^o~?3jaz*Z<pZnrGP3~WBSCYxN zUM+NXkGMyrz53I?T~odrX}+)bdU$8rrS+;aU#_2;vTVQOBu)8AM=o>jTD0&;uS(vW zlx6#4C(ZnqA;|ZlYx(3ezoyMdxwbvfGfj5(tdwgTr>Jc1t6WkL)?Kl1Z}sFeR@+oh zu1S_xomsj@;pCd|bQg;cZz2WxUbGYk-P$+l(znS|w%IS)66%@BEp_5>OM#s9iNiUE zOFU#dUwg^eOz6+uCziaQ<zaljg8c0*g1c7CJyLr`>uieadyh4*VmnO#Y9__@t89Da zFU<aeS>?Y<(r&x99kc%N6!O+e75did73$VDiku62<X*!6xNL&^#Ao}M7ygk?_{r~H z*YQ5vY7<jEuZyR9Sm}k0t0$Ps-g~T;BJ2ICH1M3jGwDS(pC$Hdo+@rinx_6EU-;=v z^{MG{ON*D~ebT8l{+RPO^^xT->m$WqosWF}Qu9dUug*uMzgi!S_V!fF|EK*izpB90 z{{KSr6=|pJ{pKv*uJ-NK+>YxnZ9C^*U)&jg;kVHKRs0HdzVa@AcG>m(2(MN8=v&M7 zG5%M~Bi<^lk8ZZkT=w2v^{O9l@0wn*dtYNk`#-Laihp$<E&iqVDEU|7qnf`hD#1#& z)uEI0mF?F3cl^`4F6{f~?^UIb=6^Zf;s0uHr}x)?N0xuBcx3!b;nC(_9FK~BsXP*@ z)%xgKEB5jEFB#1<A&(aS%6cUK<#~ty3-u2D*YiC;%{SINR(9m|EBPB@Ki-7MvOJz3 zY4wG*m(BB=d8fF?o;m>=Ywp`u!oJL3>s-H4{O|LG8Lcnu!`t^QW~rRVS9_fQ#OKl% z%3BVm&G_$;Bb`)qS#i%?r&;pyOb_)BmfaPs)Lgc3`-Da_q0aMq*Aw|eWlrf_ceLjb zGP+R4w)l+RU$)7T%|^Qe@_mGPK5<VhPmY`Bc|MKz;V!0IcZ&{QxEAK|aow~>cU9)K zn*EqFp}p+mo+J7mKdYioU61>yvt@2=&=2>eAG%d$CTYftFRiIne!4p5)b-qtI$IX+ zzwke~XS>&r<k?=&UbcK&q&C~gbdu{#<Npkb%x{;b87+Az{a39=y_M&Oxrot)I4RGE zTZD`r$ZMr6kli{hWfzC!iqHOBk}E#PF5NN5iS18v3(uC;2+cW-PHcbJIVCfcn^k8T zI<eh49ibR}tYQwR@viXESjgY!+20ceiP7Ey|0YkWv=36dm1f=fdqpYl<k!;m0_Fzq z1luLDc<s$iWRCduv>iFybG*}9TDP-W!nQ-X_udhIsf$PM_S7AD=w?&cV%V``xuFkN z`WBIM7LN`d3wd<yn9QTHV>OS|dqf^hI~MdPAX&0dT6y-4=?^D9y5)T5{0VhGBR?VQ zUZqD7k8KL$A1f8sKQ{Wv@K~#`=_B*w)(>(=t4|)S`lJzMYo^+Kj>pKMKi9SH48z}V zj773{qH9>5zLpGNwL7>g>VCtwYQCL~jBmdf6?HI{{;(=?W`0&{SN}Wd<3FWWp$-j; zLOQChdTrX+{GT^)JrmQ8dXOiTc_zC{m3F#I@^-pQ=XM;InA@>jLhy*D8&6@I;hc(A z!_FJIXOzB4aCcmn=<fX7Gxf;po~@JqxOx5yJ^4TO(e&QAM{f5pA9*kF^T_Sq^Bv_9 z(^Y<+p7ba55r5D8r90kv72cixN7nT3p6eA;erynQsyS29WN|;kdrsmPH9b)Jl6LO& zmrm~V?%|wtCgf4~v6x4>ZdxDNk0~YfZw%x5?5cV1dZ)edHcun#B_F;EoHyVT^f&Ai zK5yhFbl%L*`;+PsO}CX#;@#$C{qdQT_DAdFf6qS~ADUnJ7O3lHu<>k$L(JU_#h>kh z*9~rY8pU>IOZf|4H~QuEk6H4%6j$z??Gx8IFFeb4*zBDQS8nAF#>a~sofqcznIz0H zW~`jTm@F;+DI@2%<%#3~^*uc{Vz+;@OFXl<!t8#r-e%k1&oAs5|DJC9^o=j`hu~k{ zFZ(-l8tr?R+6Wj0sPVTK&1I;5wpt~ut?;jb$E)&VU4OO-ui<<A`cv{s87U8$MQ0T9 z)|^Sb!+l7^XmOk4%qz~t*Lj}&+OchSg~ThXnsd!D^4AUHMP63=7+&5S;C0@q>osR* zwD!uL_(K&t|2y`qmW&T}%j^3%t?NT>(2wq!f2JnJ$m>me#I#PNGTx`q_kvHITePc9 z;B6<H(CWDrv%c|t)X6pfnDbWSqs&{Ck2Y&(R4n|aTe#|*apA6S)*qGL@;_R7>;93~ zrgtAc?~UU4xH+o$(ey3Tj;zmk+gYAvc;xA=gh%_gMjm0`y7Nf;*488P*(;B@Z&f|Q z8YT9TGgtScXRdJJ#&297GjrKLM!v0m^!ZlaBcZp-kGgLqKGNT^_(*(~dZ&K&(IfXW z<Av8>Kh?qe*KDKfdX;Ujzd6`nzbvo3ZoRo$-jeMqd27mfOy<A!jEQ~k9^>4v&UayQ zNA|1cPUf!*kMzG%?u>q!-0A!^^GNR3$|G;T91W5x>e&54x?}gN^Frxa>jm^LZxhtN zdT(;dH*X_%)tQrfcJn@eyR_wxwAY=GojJ?me@@)7wWxc?@}Q#@t}TnNe*67@-ONAj zX{!H%r5$UcrM>@5H*5USXEyc6I<w{-G113<I166)`cxnE=-nx+M`fq#9)0stEL4BG z=1Kf}LD!$YEkA!K*ZmJSnSB3JmC*jRU)Aod<5fC$?U=yxjK`hDTVEboz4hmjINjJu zk!mN`OiMBIFq++Y|ME6NK552ZlV5LFRNlbvRQ=55$;S-y+2%~Y7N>79O(=Gow_<I( zrOqjzLvc@BpPbD2f2YwX_`<eGn?rM!|L?I0y?x}*dnNzNX2$C*g(`M!W6gQll(={C zXODZ+9dGUGY58#3(AHmB|IiLLPRR?s&F-J<_(~oKOu5-%Bs_8c({II3d}kbgs(g0K z(}n+w@2u<oV`KMw9*2C%OTRDo+aJD}{A0!h#<?@~FEQ*|>hS2XM*f4C-^D%G7ajiP zy|Y5>OFw_=s>geN%N6m?c^~c0$o}BYAHyfJEckQHy6m~DR{qqG6Mr#B-EHQ>63Nsy zVck~a0Iu{o9PA}mDg^mn^l~;i=Gz#b()s^$@tIHOh0ZteMe03S_;$TS>a_oDfoVVY zo1N16AG`RBk-ga|ozI(<d^n!p(bzmk-@7Ju($74RbDah2ue_i1-}g)Yx&u)WQ$M)> zHJ-IxxTH@@;!BU&Egtm(lj-bp1FE-3`U#)hzp_HC<mlr`KJJRlRf{K2V6?pu`AAR5 zUQ^;$-SvwTj_2qIs~7Q2J1HQjc0z@_GGo89`|PJSm0Kdual6lc`bI8y+UH{z(=7Mv z9cn4KCy-co;D>ML_TFd7%k`3E?HzyYH;sB@E%a;2+#^2oU#r<KeXss*X}#B-XnX%V z?*AKato-jOvpibvYjOQv&B8_Zx+~V$O{$n<H?3mPKc0^wwQ3(rY+EbZ=6Tt8$2-}$ z$Gh72$2;4^$Ggv2l&|7<HD1B*a=en<lKoCL5%t{_GyZLyvVQZC(_e*>w*Rv%?5mqu zF|}^0Mfm^5ika_};}+jndbjw#a@i~X&c|O4D7acOz7OBCe*VV1FAjSP*)5q$TkY6h zeGAU$=XH74YIbbdiM<!6-QcwpdYkk2_=A7`S1grToNeb=xxIOuROsvcGtp|x*49Jv z_ma6z^&hR6uK0Ow(CUfD7yqmAGx)Jz(f0Q<iH&)uD`p?b_bhxX_9@_>JeQ=#f7>SO z4MsmRc-DW`R{72O<Grl%IY;)w|7AjlZybBFt!wg*y+%ztnvGg_v>WwXI7NExajBeU z5nS0<(fWz&qt;W|M=?(|Ho99n?g`OUJQwWMd0oriBk`Zt9q-C7hW6jXqJ-SF{RO`V zx(QlOl{{kTrB=9R(?koun?85KE1P%h-!$1G&eCPhf;ozQA$o%RVN<N?<QmfjEc=6I z3HFB`>QL9P?VKO@OTa&9Qpe>f=@RiWhmYqNpZsqqYEhu`-CzBGn9%yrd#N(|Dc>g6 z+m_B3@lz~}{i;`3Yr1CLeCI14kMLeSdZhQt)zY)+=EmQ;c9c!1*M5@p@W1NM>%om{ zAMf}-|H*v4j}ETfW~Z0%eiTV%_*kMkv7*mtRz;&xbH&0<0h1!n{difpz`r7Th85ql z2mTuW|HOt)wd1>$!#$_@xx)4%e;?}iG;g~Z)u>;-*YuoBzwDGBT}QsFl=YhbWbL${ z_Cve#|1^t_l9Qi%?FoDIUBynhaC2u&yMx?p|CT)^ZvW4n`16{<P}uRGC+okAw+>I% zd8s@ud=#1S`*EP1@ae>JE}1%7AHzEPJ^$F+?e<|5{W_aNxa8=2;iD2gAAJvA_?GYa zGDL0W%bJo&GtaqAK2x%7rpmR=H#X<0&wSZ4BjuR1_Q@l@j|v<4UUom^3F8qv7cj-& z?Pq6`;vCkdhw);k_(R|L)HQPm-}>z~#nXA_^;Y{WXUzllZIe3jq}=1*`%V*w+jlfS z{uZiN__)q9ZKllRQ%{;g)WVk<{d7ITn!Cs8)MH!C{%I%E<eJrHSJu>QntA-(<g*34 ze9S)o*z)9l`lgx387I~MNtsudahg*|ovW>EuE|ZG+cQq4-AePwj8<8iJ9Wyovr2jw zIQ19t{P#K<eMtVxf!j)YKgy0<3*}G$5!+er^XzZtCX==!@9TV?-DeiO|NP)TllCts zt*$=debs$r{i=My{p;Q-)dk!7?D72@GRe|=kM~}mKMSjxf7pKAcd~2my!qu?jz`$1 zt~;VWCGN=Ysf=IGd{Dn;eAs{blj4r^n)8L{hu5j>Tk)gAK3q;9J}m3%_s{%Zv5%Ht zId^1YmdeIpS#KK;Usbs^X~OEOr90bKws*L%Xg#v{%K47tE5bXTulU{}zT&F%kDE)c zsk~dYP4(T<W8Ox_oxxX49=T@8eM~A9-WYw?+a}J|-zM~LTg9v>*EhjVPJjN)Hk$Z@ zJ=Lp2^YPS_IJJFC_jvwUKFR-&!_PSpf&10}x&NGcBjCN)Ll)C7pL3V;evDOJv{15+ zr*MH)$Bu<o({{|XYTVJf%VW|>g}f!tJd9R%Mz7B9v|cg0!+P~@)tSvl5?=*AO26Xt zXx%H`W5*Z%?fO<xYxL!1Wrf;Pu}@K=IdAv_!`B=aEIzBbz~5|zZRGrW4Tapvleu#D zoEDjI@^CTZIn9{)4l@ij_WL&4E_I%8Kd4C3-=!|PasTHTMn~WLo(CE;^;g)x_<(!c zeusPO4zwRwpSb7!qI<tXCxtJYbtgmX#2bga?tkw!KV&|ZJ7F#QV{*gB;L2H!_D2@} zag5n7q0?&Y`l#edzvz$0%j7=lyqIt`cxN8V-iM+*Rmo>VHp|4#%9?g~cktOF3!AHF z9?x8vCbxf1*0YU1r%ulgikp&|7MJBG{Pg^zwWep!c<;?jn-%SCl&JBUv+X8#s-NbE z^cZ#pam^2*_X1BGJ>_%k@<jE8f06|GUhGwU@qaDT{fFlS|1G#2=J)t1gH`U-gbT?# zCEhcw3D@VWykM!%EqTE>ddZfzlP;Boc-@xN%#H6XcyM$5$D8gSdV+R7c`y91`Q0y9 zgBR<#G;R4?Y<}2_7%e!yYRMNHqq{!-lV7G)-SRiT{P{{rVseVrlIta#YaXfm-*>t4 z#{%tNzUG&0d`>jnlh8|9@V9S5#gh_a+s#YA=uEt{Im+vNnxNX2zv4@G+?)32zTm^# z(i`jIAC;@#Q~X#h^nT8{<IH)5(-a+l?6;qLetqM^c<au{|Ep)sS$|F0Zk?H`UP!di z{IJ_X^8<ei%nxT5p1$I7hyLoz9s9$c3)e5!Q{1;~otj>-xxoJ=cJ6;R?`r-bUTXd^ zw^aY5{VT&q?5{K*X?^9{xGGld+Lru|?2PN3uQT=wUcW4t`{sGXTE&l=TP+JG-kSDf z%dM$DdZhewuBHj!-V*Xi>Q>OBS+}~6G~QZ$Wb0PjNq_7f3B2VgRMy?lIbZ(zD*^M% zw}i~ETM5`NJSw>T!Y|?Wtj;5Aw{{+RyLIM~*eyqo#G3LK>gU=PF8L-@IOUt!$IG|; z9_3%DJrcjVUFHAeBX_sH?>xM9ey8#l(BOs8{lKfsx;|-cVGZ1_z0A3Omw&4*^M8f+ z;feZ=2Y4PZYrQdCVa|N(rK0FJp)E5KznMN1;&-%L)3i6w=F@Sl8?V!p<pU4KO}BFX zlB#oWi{yo4`j2lOlX((k)BJPIgvPRsoPX<`_I_vkbY5d~^a+Q*{|ngi9|vsz?(s+P z)ODBWl7$o6e-%5OaIm%PH0lj_rc{)?CAnVv$-;9n&i~CS^qz$uRQSAoLgV*;{q{b` z_*LpOo*E`Bn|b_~@zFb7CrxH(o>MX6o0++6`Bxuf+t^l{6D6}VmmRmf>~lWBGp&O| z_+IIzBhKlwUd~imn%-C;mLhh}<aEtXpUr2kdm6oVo$=xA5niGEDL-z`jJeO|`TPIh z`|tDA3*}AYj4d6rJ?E_0sw%glR7q}$t*cE$_ryQHjqb60>@xU%rp4+`d~@Mr&L@mg zJ<|5aYrY;g(s7n+NUe)r5?RwGb9v5zLqD_C-YW|&`Jx`M$C_udy@8w1d!u85@6FYO z>NCzL)P==+{FyV)`_G<v?t3EZC;xD*RsSem#rV<eugOQxzfvDH|LT2QZdDWA{aMns z<Hx3ZEk72?Y5i;$j=%a_xPCpq`ajS4dM8u7jO0Aict7U;HGQ=IOMmD4*XkYrubmhC zzc^m4Zb7~CpMd`}cX;i0T_a&SduAn%O5L3dr#ojjRP!>wDBMf@qR3~O)EO=Px8t@H z=aIKPjYnjA6oY0Q?yQyy?wH#)y<)+}K8u?c9yX_TIM`g<;bU`BLwR1}9ff(xe_Zz* z*kJPgv(sY5!d(}8DmGr6R?&HJX2s5ny*F}QguWX->PYTYJi^@j@W{zyIhu21H0NwR zqTTzvv$%J9hwZW5N7hTc7v7&Gqx>$Z#%a&}AG0c&KH7d%Sv<$$>JH7PfB6cREwo9T z7Fzl!w<`D1-KyB6)fYQ&q`3&(?$tQff0oJi@a=!Wn;qJ7%pK<QIMj*vpX_s}<JS$i zoL2ak^V8*Y$N4|j@TJQIPn>`G;hDwKKPzR=+2lFY1-4h-v_7H#vf$bq<tO1KH=YMH zJp4TQ=k*K!O=Zs&+lmx6=B;#^`FV#}SgqOj_HS{?W+(ply$(KjNd8vZ-kUM)&bL?U z7cx)DPdgyFv23&AnP)rrH!QdJQTr@%s>Jlcn+TgCbLMk>z2Zg}#MI6_`z^6>&9j9( z_m9s|Oj+<Ry{lrOpPn#Jse-q`mByz+>u2Ond%o*tT4mnM+-cAIZl+a=oiRK8`Ap7c zoAn^Zy`0T9ug?kAYIkc_^hNR|7N05Nn4VH~#_;sQ`!btlj(Hd*KcDf`pt>)TuUmDd zYH@|!!aBXF7S4~(SU&sxwIhAuy>((nAAFP7AIVlZH~aAK-TRl??OMO$`CFBDi_Nyo zxO2p)XUEJ`p28KWT!q=Ebsia<W_n~cP4&oI-J3`5>aOlc);TYDJUUL<Z_676xvZP6 zHg}4qR4iHAP%-5x%g2b*nvWt*S8D$04*GFlKs|C_`W~@U?oa;iwKS;9NNC)6B=Ly= zcaN&w;ZOM~jf|H?pBxjb5a0jUI=1y;X7Nt@E0cE>AKc%`dMnoWOMXJ5)dfyVmie_+ zdiDJR`SW-Fsr`HAhUN7A>%&Dq*EZIliLtZ$8Cg|s9~>9Aea4?<Px&8h*PSL-S9d*V z_K#X`=|}xKfk)bPIghyO9`5|CdtRVEX{Kk*wMkwz7dLhMSe45Aar?BhN3QFv7pPCK zY~FF^libJtX?ufi@d@7F`b2nnWLIagu6Sp7^ggw?WKHFL`9J6WSh#f3j#Einz7(5h z`#ySiP2mwow(TPmZ{tT#r=6Qrum6b0JN}W+X@*CKr!71ptyA3bK6;u^^qSQjtD`@6 z?2ekRs<&m2)1K3x>^>%6OFnY&+T<f=*DUXhj<i?*cj%LH;l8K(k7ixddSrEN*4jUJ zE=JA&v1qAiVe3-c!Wmno3#GGFKAxXecjW0bmq%gO5_{C0=8BhAsBW96n{lv`@26-^ zaQ>OrZ$DPCKHIQ+Lj2*fD$YvnZI?god=|6ywaw(kDsuMxhiZgxKahEndt;sW;xo}= zGj6YQsk_ZoeEa$Hk7Zn$)r^1NM<vYL%{zZ@_sculDGU7GIsgAT<5|s=_=Lv2+RHE6 zvp)4!{i*%=$j#zo@t%LSiiGbJxo-PW=gQ&VK{3B-jMqhdKD)!|+3Zie&p&@yC}%cl z$HyAub!MN>?x^ZYU%1ZB^nQ<aSXcH0k?R$nbxj=duf7=z`HR?0+xy+~^UihNmw)W` z6!<s!d3XM&?y5_ENoL2k&AM~nYO=+_SE_PJcaK#3toidy^wfS!`B$D(L`y!&`4n#v zy)XFba@d9Q;(^QhMPFU*e<9x<FSJwt6YIl}t}lo0^Zkfk@?Z0)&;Qdwv*MS1vDq?n z&F%YYW^dX%nBN@lY<}~+^Y(3h;q%-7dF?rn#rgHKQ#S7-o^0DkvDea$EMN1tqkGL_ zm6?S{_;a~Czei0MlHXF*$scJhARZO3^6$(qwT*YbF&3KMj(hZKoAMFHZN*2n=Gr|{ zxLy0G%53e{`O-JC1k5*^D&=KX&#^djt!+oM?zA0?b5#n<f15m-_pSBF+qaQNdf%*8 z`OkZV?>FNkhu@x$6n<MiioLeJQ~XxV5zTG066@j;vmM`T+p2zU+gF9S)aqFkTi5D; zjJh50=<BwVN2GIB9+A%V?wG%ItwP<sY0i6&ZkzT)^tRih@Z9sl`xC1>KiYr(IdA^k zC-+0le-{2_ekArw@X_+GN=eKANfyTcmHEi<SE+E%Kh}>9d#6-P_^10(;4k~5#9!wp z{n4NF$Jg_pzNYPW$#(q*m4UZ^{M~)Sx9*ah!=AfhPJi~TUHaty%pbhb`JQUCD*AQ% zD%R&3d{n&6@o3|<$Rp-C-JSKDQ-%KLeHOaEX|3wM+}nP4?)?+|c>EgEv6V{w^C#77 z-+glJm+PalU*bn(ziJ<u`(^c!*ss|~?tYQ)JX|VY=>Ip|^WQR+diP1|r(F6x;iJ3K z+-uvO?Kb%7S)KdH>f5p-rEg_B`=uTpIo^};s7AT(#}31u9XDop+_|@}<A>mFuSXBJ z@g7mm(HH37wAah#+&9C*wzn*W%ii*QG<sbce5|UuqW7!Z$LwofkJg4Qojd>j2B{;r z*Y<BSKAht<Cpp)9PWD@$J-2R6t>`tKQ?d7}<|C(QrjM4lIUar9#(6|_+sa92cs$b> zKf2xydZeGby0d<Zt@oduZ)+cUZ~J>`v%I&FdWZb2bHec(rp@|v&B$0UTl8b;Yvs3p z|Lon$SU7X5X5r4Qsvmi?tsg~S+jpcs!d=*Yi=SFpj&Y~-jWFT*%<73hx^nqHZol@v z!~C{ZXZ)6zvVUX}SG(T1d~L=L&1mmO_qO#Nsm<v;;umdH7=PR2QQbDrBb?h_9_cjW z|EPG|`-tkX-$%rIHy@eaE8n?ZYQMn$gg>rtjQ=VAySw7<#q;%2r5*XwZ#&;h#dgR` z*mkV$iAXwossBcjq*KgUqn;hRQsoMLySsmICtDUyQ0@O=cv|gI(qqv_TesOBS)SA0 zaX4qbaQ@~x*FV#?&iSGLTKAE3n78`oGt3hAV;GYC?C!1JDsXIa{p|#sn*u-OrOyQ4 zQncT2aN@*!+=)7|si)bhr8XtC@0C0({>f0i#hB^u^XP{$=S7~hhHYrpb@JQXBzs2t zNn*_ow!ijUntb1=KIBi{KVAIOM(v*O+dPb{TX=fD-;3sW9LN0s%*DhhhB*n&zkPlj zw)m-?(#^|ue1AuJ;-2uvf2BDF>-MStN&Hh5e}wz-I<L<E(|*Wz%6t4=J1^<k_QbB4 z_rGaA`W^1GkNMZ~TL<=C*Jiymq3dOjyWin2JtChB-bqb8^tfr`*^Gk*^CX)e+Vp)p z(CQ@jC)hwneV$-MqfGO24l|Cn9dW{+49?xuI@I#<*z2amo{w%_GuOuk?c-Wn6D#!a zz>UY;A9cRGkM}zNPr<g@z3SS#N9PYoESPn=W`C*b{{(S<;bY8SRo1;X`h3svM035n z_>+yM&-R)ZNj$T4G<Z_GWkP%5Q3*k{FYl9Co#)%}9k$Op5V=3{#Bm;r*V{QP?>B6& z&YsXOT~PMk6{JYNvtYsgx|^xf4wp@j<dffhrpQ8jUaQ^TIU#)Es{iw2(rouXG<yA$ zd3xk|=Ag4xa+9*`ZX1NwJZ>#i?v!3W>+6QxRgwJF%VvGuu%3hc$?wke#5ot_Q>Q(y zDQ=n2Sa`@ok@@dG4bQY)6B-Q<@F+6Z{_>gfljrgtmlF>E_l2BrxIb%R*0j#>6Ak~R zYQE{5YmFD<$*hxqdOqslx_^eh=5Kb|S*upKl7s!%Yi%XH7ux&1Oi$mOo;9sFbyeiK ztC!9ct($)AaAW%G<uiXRS^DI@R&P81-~1Iv)~fP(8=qEmvf=(`+sgChqW{vFPcOuu zX!ze?vRTG$>CC4F)@OCvRWsA>?G?(OcBnG&2y1e~bd@^Gvuo7fFPr)GNy4m1e>=g4 z4SzI0>hwr<EitKAOgZrXw8`c<^*+X@fBMaeJU6Xm^Bj3^^Z9Eh>wQstyi16kyRFb^ zZ^`Dr+dRx~=RYsm{P)<B*>B4?aLCV-ZTdG~vVgCg>ysq&xrfWVj523zJH2Dsv}U8F z$E+8yxA63M#tFS_-1jf_;DzP+f;_dqv|lc(yD>5ERr}(X%jzuj53&55RPs5tW_I4b z?)b}R%L6q}{?~ofWO&&A<+I%@_IbQ<P5EakHuL?We@dTYTXc=?yY{<2+x<e__ICZm z$mi|e|CGf(RwViu1w9HB>W@o#)h_uc^22=1l!QA**%N0zJL<&tXS$Bj>p!nt)8^ja zbYjhCYq6PM|7<wo8f0-)Nl${iR%@#B$`C%gl``)<pC-hgIoz1OT3773okaNb9c@P# zg|5e($t`^ONV<v>v|vX#Cfjg+zMWU{wsS(|fwP3lgQJApHQshqYh66Dcj~?)fu{@} z*_{$OR;y^M^hdKhanE(Z{qmFA?r`pxpR`xv)DrG_-1l}!oLZ<nFS$y1r|`R-cXdy( z9QqmXq+IW@t<wH~`+v_=_+uY+CU<%9(mm&wZuvUhBG6M+ZbgbPe^^mxyGG@a#Z%Hd z+qLxt`UAFk808z-byq$w{M%L8dH6T~#NSDB*}9DHmOI?dXs}`UEWNAcx%j-?y)Dnh z|9#88AvEuPUQpfrX`g<WElq4Xa$ZAT$UkVG(!4c)JZxD1@0)i2zu03l?+>?GCH(FP zRm4C3aJSb%uK#_W)v`*NXQ_stDt!KDO+2TfIk!B*;-2cCy>}*Fs%d}Jd)cQ<)71L6 zWhkezU+^tK{m?4mbPdlV+EX4Lxp}JMkxZ)6N3T?|k6EdVAEi<`KSmw(-QySOxyLcm zd5`B!mp^khxmJA(eR=cx()9Zi=hgaGeN)!_+unIUz)rC)c&Ec2UrqIU3-2i1TY2Tx zqv!ln)I01$b_u@^brU?EDcs4gak-OUOYc$t)RISwPq{r}daC+p@~N^%{vYy}75)pk z>09Gw=~5G?siGI?Cmerd|LS8uwVz&8|63DLC{(|KNAX|qOgEY3O9lTgO%b>sxJhN^ z^p5x1(Vf~;-yZp|!QLsarQQ+xRcPa~I_I3gtLy5vt=`&^y-K&k`HI|;{uRs}%~t}C zlwS2b^7TsQk*`;G9x2S?DvU3cEUf<;`iSur-=l-C3Lm9>mHBA0bxuXwuZD_kS#O^` z-?^&!hxS&+kJq!jA7y8;eB}L_`ABir<cj5!JpS|=wf%@r?UL*>n*L+MriLHfsj45R zpR#&%`c&E@{wr&b?7rgPVIOo}=zXwv=l9k3h2#THckr*;FDM_BUAFwoihiN<q0&Oj zSLSvaU(q;OzwF6;&pAuiDV+=3F0el2zUsGs^*MLTYeJ81WB)KSR%2m@NAN1cFItWY z3%z&+IAmY?PWZLMMLsCVuZl@gQOZhOP~SB`fMv;Q4~LK?9a|WbWT&3EtnKp3I{U5V z{+Z{W-~03R@0#<oHhrIGyt(+?yy7Qe75nb+>Q7^TsQO8|qSc1&`Kg+Ug?mz_>}C3| zB7acuTJVqb%vRPK*Ige<BW3m}dLP>U#5i%+x#th;Q#k$vxE;Loiv9Mrk{vsya!lXy z?BMwb%Yw*k!<ds*{OgixxxzR19lp9YxS*p{Ze40@b9Qw3gSKn`5B9EQ|G@mRjr~uA z9k=&to1Eyahf8f`50%>5K3I0mVaH5Umb#;}IJR$Ec4+NdmLKLb`L1uicIaPnd-GcT z2VU2<f3T_)`sWnavVY3<hs>YKZ>YaNti3cx^h31~hn#};LE#h*8_%|blT+C(eE8a> zPkk&%w&bphJa%}Y5oey7@xy0E?0K5g53GGsRnh!IqU>pUfoUbnI=%kGrcWdH+dug& z^ZwpriTk%pHfGpgS1k+g{#O6@)OWMHKZJj=zq;4+N&eiz>g)fX+QuJE`cbca?{=te z+o$x8djtMT=+A$bE>&PN^Lx|QCx1llX<wQ7cx8?J4fm&)YrXGFyua7~j{TSB<-ZQ~ zdcPUpC(jaj{5Jb{`+dWh^HTfdXRr3j)lFRg`0>3Zua;Mt72m9Vq<ic4vPWC?y?^+p zIp$kH&-VSDzsi)3-M(*fdH($MpEB?6U+~K<`-|)0={w%U=I1L+->W_A=V`l;)XcYa zOFm`3t;=~bz31vr{UcRBw=4^PR$=LRKQqAnXlCwO>DAx<{)|0;B6DF;#@yVMMH#%j z#xi+3M5p&o_!3v*q7z?!&)uNo@x)2@rq4UoH|dMrft<2@&-ctafw_UU-j?(9U)KNW z51DiALVsxV7P~y7J(gkdm-j@}`kp`XD!a-yEdH{6@>f$`x#w5?U*`nO*|+Rz=$vbJ zxC(#G+9$DmeP**ot?z8<pSq9s?7J9s=TgCpz<Twm{@Eqzi~rqo`|I5M>$v34$Dwn# zl<iNfXnNRL_$%s6$K~rvs($g^PYZuVt?9pf{n3Q1?pKy)K4y5nKR+jBzvj!oGr8T) zx%Sm-y!?M5zURmKRrXun{ZISR7nr^<aJlIEdy~IBzwuGTf9jWc{*t20xBk0XVKwb% zjn37ZktM5Kl*`QCJ7+Ha^ipm?>7MI)YwzarY&X557uUai-zuG>zYF&`Tq;lRP5rO; zvUZ`QR{OQr+jquJ|K7Qz$WQR!+*#$Jd}}Z6oD<x)|9O_~ZkzY2KYgBF*tIA4Yx}i3 zv8T3ddl$BBYfk^g`T4#7VuHS2korFP;(VsX_WZqb+}-NEewWm*`n^XcN<RC?p0do^ znv2UnJNN$a)0%(n>^Tsj*S1@#&*0A4<;NZB=gToGhs>Q~d};ad10tf!x0bH*?{BoU zvt@hs>x)E0&J+E>x0inHzVgB7@ad_UXJa2;{(LfQ{ycxaUtem9E-imP`Lvzw{5!#K zgKWRoR{7~oTJZcy5oa9V+Raaeztl*td9>x(z9|pBwqLs`@YK5Qx=GCGg10R1Yny++ z`fgga(qg|E&*k?inf+V19u`i^k^NAyTH{Y!DA&A%&<6GBs}D1@CB8-aJ}}XinU`JK zwt3CHf^DV(b;qT6)FYI8tBy&0^)Y=lGxLgY`jyEK%4Mz8UsYJEefX~U*>3&5HwX8e z&(2|rUA*wm-r~zQ4_D+Y*Zf>P<IVLSrduc4-uQjjp>*$xf3>fomi)YZcm2AfMhn-o z9<}%XaPP2Z_S*H{QosHzURrysirp@MZKHm4^n=yco`1-FEfRC?pX9xazfAA9ay|Sz zEl2o+c$h%UK|TKPZP^Dx-&7S?TZ`o7w;z^$TlOJ$wRB8^>%sE1jUVP;3;EG#%3YUo z^q}-wor>LCFLl&&<ZmoH6us8=gR?e2-!}b2Ti>oOi2iLRllGtUdE}<t1J~CU6$I~A z`_mOGpO?3v$9uPI&ds?A$KSDuZ>&D(`nIlMg{_EQs(-`#sQ(S!H$N6kn9DPL!^`cv z&wrlr{n#aExz)#i-m})2SkrX8_^6B2fAyc+H#*(0|L}T|>Ti+#dP<i6dHO#qzS;ao zN^-u(=c|_g=B~;3R@ptT*w5!n9QTzxq2s4Net)m~VADOm^PyVp$DaI_i9h`J=82!# zx>a%&?8mPc&*zu=S=o8-b@#F7iig{KxA{rt#s;Tm{)sWa_3LiN>&A;=8&&4U+j#!n z|Db%rLm|&yYrQ;ot+iUE(>rsQ=dQIERPKh|R=FFtWa9nctNzJrra#m;SAXc|;Sjst z)ep7WkDcUDPTzEDp`o$s(+e|ZW<5C*W@%FQY{eXz{mDGX)hdg_Cp_(49j7HX{mI!_ z%d9=7Mn3mTSK8h>*LwWM>OXNlrK{%1-kHC!=H90phksNy$lo~p)3Q-}75}U3o}K)w z|E8{AWw*xc*9NKFvm3Wgek1!K>9@h2JO5<k5>J;guHUly@cWyJAGCJM{n>YyCoXw= ztN-oT2gPM9bMn78>fd61sQoSD$E?3rHHYUh-QTkK;qGrT7DxTsHoukm5nj#vXZGHc z8oSTFIB!?6w^ra@o_wqQ=K6;3xB4IcEqnQmu|6@ph5u&hgTrOYKeDZ5?2^hG_HW*O z==dAP51iFHbCQl9ep#lr=U^OreM)|t`R&^en!nj8KiAlE{olom*Q@Tg+NkX{{2XI+ zw%YiI`I4ra`M0--uji~@=3D*c*2eUkCjQ@2&Tq?{Co{?C@wMM)7k9pis9TmQX5DwZ zILhcObKxKB;GJ52wUKKd?NL8^;{NH675~nzRL+sFKmOA4+|0A<r%Ru_mp$`Wz46WJ zzhXc7Ux#h_eyh_YZa?d*8`6@?YIAS>y<7c(Vf%^IjQnNZhZo<``k-RYvM+x>llU#$ zhx^~wZFt(#7Cfi^z{+z;7T13Y#J$LA6}SBTaOt_kiq>M0xTi7A<rd!`)SgRLepklv zqj<SQ%>hkb`I1wIEB#7;O!yqc9-E%~LwdR4pL}(hf2T9~?F$w?SbmPh;@(`o-*+S` znr5?|FWvl5r(DwJ<lpHN_h0MCZ))Fl{9)od*NQ3C!s{OXljbXXFa5WM>3d1D6<f~k z)CWrMiVG(Ew)wLrnpf|2+X4L@r4Lr+IscH{&KYwsmo2>H@WZHgs|#wkYu~xj+v0pz zW5?9n{CThUv6&aPAJV-uvB0~$C-58ZkI-_iI~V7&*_Wmrn0$xlN8@IWZFAlhq&}Ch zIrx*auk2sj{gQc7somw5p6|Dbxw4XHdO=*1w^ixGB0uLH^Y4ntWqfbcwsL-O>6}JI zkF}iK>vIk2J5LsDo6M|VFzw)a>)8)N&w2icKX?Cw)N-Ha4cD#CAAUV&)d#laY=0&O zbN{=M$y5Jm4^w{Op$BXI)GJyq3;#Rzl7D_l+W~uv<cG%RRDP@x=6!Dc@&l{7_`j2p zobiQbhur7R{Sf+`qvot7<NX4?-?i2=_qVq^Pc(16Hs#$O^^G#S+24DvIoVh8GV=a2 z%`IYIieBEF?Weg#%;n?02lq7ZMLB%^@^H@YJ?*tDzw_@MwwwER#`g`!H_iXBdDhHT zI%gk#ww!ma`qK2`zc2sTTxBa`d!KlJ;it@X|8$N<muKv|yV9rlf!@03`uA4<lbycz z_}4k%shaBXPcO?<96a&=?uq&}pECQZ4i(P+9yQJ5>c>edMfe}pwodJ>m>ROaZr0^h zT9@a9>4shpj(>W2&b0$8mQU@vJm*@})TKX{^FF`wXwEyW_D8lBar3_$@C6pmTHLm3 zlSw{L@UqI}9S;RhnY8!#Tz#%+6*`}N{;J8(rm;-*FZNDaweQ-^mA|6a`(3?W6})QS zwcjDOA!YW*wLg@L$b=Wp()KIZz4zz8C%XjqFTAz1^6|2V(WgxE@0k56KL5i1qsiU* zpE7sZD`v+1HJN|K=W?>XiEsa2zRapOUyVL3zO<(-^W4kaDYA)E=4MTqyY$qhJtomp zms%$BO}9OEfA55aMHzK7Ru{e4YIFWX<f@_<rF(szPI<3%r0B3V&wt~yyX9BEty=## zPRp;pcS`uO%JWlMAN~7!t{^s$bDi?M@7D8Qg;?@m+H-&MqRPcCyT0$eW|AM`wLF>s zVNvPjy>=_yZ|~s0+G7{u{I{3aTvY#%es{wD*MYWL>P@$^Uf5nglJ~^+`jNL)vnQqf zpI(+N{q~yMUtQkqLSG*g1m1sdd1u}9%`LaH&b?iiy!}C0dC~5Bhb7wod++w`DVx3E zA77hwcfgLx8PC37zq4+7ar5o0<8S{R%{%{A?Bs*mgH6w#cS&Ahe?Na&)SGW_#3cXU zoNrJ+SJ!yY|MbH>`zG#AuXwD;^H(ydV#W(ze(}E#1(Pgnf_z%sJ2NV_%;4OwC-k5& zNzle|O^bS$?}yt->^8wQeCNd~t@PF(D%`}-H=RFW{+8Wra}=}>pWMVbM^pJ>jwRQ* ziI*RgKk@kyE6M!)R7u6eGp*vMML!7bWQ)@>KXm%3SVij{_Vtt9AMk!M*%KJoQhw6@ z!QM?FE(d-;`TRlLNaA0RSsVWe4hw&`L+wvYe$1G|_`lzyWqGIVhmu06J~7r0vmfRE z$PHW;eZctW=MOo7vitO<4)wc8{0S*(Y?WcUUBnX;l6K(e6Q><5F--e)?HhuhvRU}b zwLNyRo1?__pycAl>I0u$_${LMaPHR@JJfx&tfKP=SDfO$*8iG%hqaI9R!r5ns{DZ8 zMYLk?3if=Vzz<=DLjOX18n$<z{NQKEeowdPp>2}zp75OJ{UW~~Fh64Wv-OAAzpy_X z@}lMs-n%N+#7ybp`O&h1>AynOq2(^sKeoJJn=iQdf&CE^3s;pxFO#(QM80d<e)98& zvP#~0`u|(JPh7HPey8#JP;83E9cQz4_ET{m6f9ZfbdDc%e&SNGXAYbH6z+$fMXENg z>sq}}#1^<#imX#ve^~#-@d8oFE7}jTjClB_tv{r=NjoO~TZ{CG!UADQZu7}E3ueS{ zwV(c4Aia|{Pn%!jV{pNqACl+9k1k@`rx4em-x>A6UrFX)=$7{P9eM?g5)Ai6CO?c; z68q<xBJp)iQ~#;h4;(*5ZG!GKxSw{a=&5;BUd2{F?fB~lS#ibeAJR8P-(>!|`4;n@ zXMB&+)$5-8$leooKaKy{*I#nad7hpxxVy6?{`ucfBbh9VO9kI6|J0dQU$E)of1Yl6 zFQNazbCa|U?w{Vbscd%Vl&|GGB&YkLvM2QOm3t=tH|{zA@#Y`dRq~ske<)w{F4S^M z+q>Dz|HXee|M0hE`lbi>lfo>wh{*(7nrxSUKIeCnoxlBZpZN>#Kl~?N^#83-mpE6| zvxPOws@@%n-{!O|od4{3QRCA4ai^}-X0Q5`d5<sjr%AZ^<2n96b|19XxV%|)@6?x- z8w6)wY1jQT^G8TuzTlTLCuREbpYBWDVE^>>j+WwWoK=1aYqO?5yHUC-c2@T_>A!c< zzI@i6>R)`(ajO4kpSWdq_V?3YeJ)lFo<HB|@gJ76;nj2hq<WuOKIhV(H;$I6uhOsn zobsQ?e)h$Xne)ze1f*vAy*~Ccc1KQpS-75clkCCsx;{ZaP2T&?Ti<u_y=Khw3cF*G zTJ4WEhw_~bFXlNe@z=-j*UZ!}pP3iW-yJg7<oerZf2PHJGkD(OUDfu)eX4Wu#muW> zXLZwg=9|{!?UUm-fByR8hwC-Aa&L5O<xZu&{1~9@-QVsOS!J{3<fX?8-KSlbpLJQu za^Cs->h>L<^$X@E_s+S#dC$I!bIi_tsL-pPeA@5%rtLd&)@XTK7HZ9Zw(f_HZQZ5K zUw%YRTzdTcH67bJzExEj>rS7(bp7dXo!Z!QDKB4tik`MlFKnA$c6xQK#_ed1;~TPf zcx?N=|CnX6d~oE}nM)=XUCep^zuV!?emTiJg;l@qMn1jbvS-#qsYSdpO1pl|UGj-t z>E49Ds$bo&)*H@#_OQxE{r<^i$?K0l|7p0J@%%|uu@^tL&3b6oX3VqRye6YDod56K zxCe91Uwxj*dhh4Le{*6V%#|;VKJq+$M`2yt;{U$9?OmL8^P?BkP3Hc%u5EXx`NMZf zW-_Wm5AG>le&1yoXZv31UXQIp`?;yt-))iE`&`?uz3+9ZUHHv60e0c<pH>|AsEwHV zSXTM!=el$Cb?dJfJ(ifh@UB_g?e5;X^<lNQdw*E2tPOnEtbf|(N0$wE{M4TxOn(~J z#NKPlKf&~4+8^$Hx~cOUq`Q*}gaf7Ww6qSLbuoz1nEj(R^6P%fN98>CMROn6yO{4- z_2zZ?*77}@m<8$;w#uJ8_(9l`txjuk;%%=cS#4pxq}0Q%Yp)he*m~`K;;Osn1>YZt zTlVPwi+>VzN_sEtI;1zKawmk}YwkX&ReNzAPowv#Wd)iy<?7tr4y2~U?^q-A<a^}R z?JGOtr##_$U-dELi1miwt1EOKUAmN~XZPv1?9|P&AA8%%yK5@?cf9&uIJKVnqgdNv z7sfkYcfRi~SvURtH|`_mlJ|7F4$bc{DliXZ?Grj!U@yq_UHtBYiHrDc{LZv4?~t*G zs$tl#y6v#>Q9+Ba8usJe+69X=8iJ1qE8l;){&Rf8@(%IeuYc`6uyaxW{fV#U_&Dw1 ztzOsV?_4wS;n7FB6+36J=8L{8aGm-3`}LhB%PT*h(cfvZeCrd-w~W?3?@xB?skDEt z&UkubEz93O$+>0Oj`odLvlP!(-(#E1@hvjS?5M&w%YEflwTkxrDnEali>*p;`1^L> z(U0*zEuX81F5jtIxzIfQ(w>QjzKVR<wI|?dK#kyW?w{KmudT2+tDe2{-0h}oFLK{l zH`%SXPk2(Z^wo09Ckr0hq*nFH8`a#fSa<nYVXSH2YyMFCv&{8UwcEsB?%3?{{imgJ zT;9ZY#UGUJK38))cl!VNo14F!D4Kh98?zCMkl0Oy#t%%6Y--=b=2rP<cRa6rf8(<8 z<e59`HfVk?xqfC!zJK`g)xWBaairX6a8jAV`rYc8C~Hegg{KBLI}?-25w1f*8$IU8 zGjLA`S2+0Hs(;nI>_rt1f4;K5Us?OSdj4gzhx3<KynoKp|Lw`<{>r&49_w3uXk*T| z`Y`Rlir=^U-|q91yIs5Y<BfN#C+)nTb_T?G{GdMam`n6W?f$nj>pU|~v<cWPllb&q z{`QRr+5J21dXoRmy|6g<=kMcx_KDvQ|HFN--lOpDc9~iEr}tz;+Z8-`Z&Cbrx$(dM zUh$iB{onkUUy*eD|3>v`&yLRz&~tblqdLpBOWNN1!|5;o^Y-a~$>{#p@vkST;W|ry z*|X9^{+V;yuY7lIs-O6v>)bDHr~Yrxuh0Jwcfqda;>+K=`Tojt+urK67p&SMUH|Gp zy<6>mm;8nI#jB3g$7Wox`?K^whWtOTgf0B{3m)t*d$7MUDfPkpRG%aDpF5|%&A0rK zZ@+QV-}nA&a{h03{%jAT59}8E-~9g5o_N+DkNN&M^Zhx@_lJ}H-;>=k*|z@;r)_3F z_@CoJ{i~hgRqyRze65@I;QpIh)(5{i>fbzl{{NfkhH#es-)n6f>N_8t|7yoD>pMf8 z<G<v*c=aE1;!6K(AAEn=_fk7cvF@Ybc()nN8m<Q7x9z{DYX3K8|HsSzubBPcGUos7 z%=Vw>wc0;DVE^_&HlIzwgPF|xpC5R&U1!hZ1HH`uS25S0ZTx?+(Z1xt^ZMI|CNjUb z`mma>=H-F?3?CxSy}SP4xB9;SbMF<ecU;5wL47{+Y_8{<ls|Mc)W<z2XZUB{vhcmU zZTG*fhxeI(NHhIsJW$^9k9EQS%EtQ)KO`IN8!GQti0wb=^X=cE#{HjqTKB&=@c+RD zo08vFCbjJU{rUdwV_t7%a=-9{F#Es2_Gh}{?+=`}G|8wm`NPWoKc4UJdy5|@4%Xjk zEM~VWy8iNj{mTP;Yj$L;`n>7n`c)s3f}SisxnUh+^*ZTUN%O8B{S#=Z#S!aw{Hexz z_s>PwEUqjzm)BEPKfG*?-s0okt5?tFvpRp;qW67_h_9XW)3Z;LetkH1({y6IPhQ&e zpQ)C)S#PXPr;8rizWwUaqoE(KTuZ76bh!L3vu;O*+S4s3{GT7r<bB<8b}qAU*XkOJ znIVhC&e}#?dAO$~G130&6b<*QHC%HvU;mM*68>pBCwIS8A7g#Y9@ZYC<ay`2n=;tC zPnP}6$o#VQ?5nEGp5Bi$3LOdpVwkT!E!gL>HS}y=UyI`0WzCOt=at+zbNY2n{;w4? zJ_q@8$-T|8h<<jg(sci&?z_5)u^XCqJ?OJAI=|86cA4o`pE=^wdN(9WE!+L!bkdg( zDTQu3qNbT@y1kvcm#HJ`UgQniNV}ZO7@O3Tv%(Q)Gs-US{>{*`V_$XT8Fz(eU+=zM zRCgm}^X>|xvuD@*=-DNFr}JIi_L8qPCE+42|Mwcd`l{!q%(|%1R9pS%55N4iKeudu zwSLXz{ky$F{Z23ImKNr}y@PYppQgyXFZqVLjmj!#*vdl>81`pb7f8qUw+V;0M(SD} z>5(~?Hd%V{wYNJ3Hk(ZD-tt*tn{l`6P0JfzThbHnT(ZgCGPm>N+?_E?=Jxjbw_kBB z6E8E1Y=~sZd^~k$nzvYVc=3j)(7(2v=Ph%jG90VsOuTk3GR5s`(ycXTA2_f5GV9^Z zB@xz5{RK<I*BJ`A{68pn!Q@NlB(XJL#4hjJGehjLxK}1;*tO?hmcReHSHbZAmq?ex zQ@_q{v=`(pXSr<trFHR9?Y*9+dkvJ2+63*n^uOoRVHKZd3!mR?KEK|CocsLw;R=S0 zYtOY!p7r+r_am}$jXO7+EJ>UEpd;|47k|jUS@#v1jc#3R*w^13xUZ~B)<HSjKJGx) zgk#~_s}D$BRquA4k-)l7&~>tcT2y4O^O253<&;gEW*zMiF<W-VO+M}JjkD#6Tfe6y z^6KWy%{Zb};q=DZd&#t(x2?-LrwY8vx72wWc$_!Jci-+AeLGAa+*`P;uXWb)o2`E> zj?^4+P(HGW@n})$nds6NmD~>3Zq85D)!7%ODJOC=U13eC`<Y8VO<I3aZB~c)>b6~6 z^rWSy^Wr`))8&buUq3%1<M^ZL!u?g=3vNy`P%dcY)i0boyH!ufsy4vj=Pv=*xYQN4 zj`Ckm7&p&Yd-#AtXyYusbshnkPaE}l6fWvsjLzJ`A@NADX@|j+J->JDoLM3jaiyT* z(X4~a(G^Qp7ZpwRZx286i=pDp@p-bVuTIdky;fNn+w*x>O|%$~`Z5vS#2*<Eeixot ztSzw8GI}ksasD>h;3!XS*~fm7Y+M{Oye`dQs3?t{teh^>vnJvB-_4u5B&Tp5RAX_= zUcK=Aa(+7|o-aIe9-U)2>2#w`q;12+e;edP55!%1A#hFTsK$-Ig%^*i8$QzS{`6>* zp~nMuh4pRMe-`}7uxK@|TrFcheV6UGOL^7R4G|ZW#4LnagAxvV_lWX3zSzn+>vYkV zf~YH77j|SMmTYTr_Vsu%XTtv$rsl~N3lAqBN^9VK5peADC&7GErgJKVr@B(sKFoU6 z>Cqs&TghpL74I37QajD;TVWz61>Z0;Evd;hWxd#9>~y<lUJzfADf3Te6P6XMJLYCZ zWiOt!aSCIm;e0-I6O9YM<xYpohh}_UCTQ#9$-mg=&)G@b%wMCoXWb}EO6c`F(Z+Km z!(`2pCkG<Jzb6K`{l2yS<MJ8TC3M<9PFuL+^oN&md~H|q%oBu#GK7UXI6Jq#<vhaC z{-)36#myX+4ezaF`DZ7d7N0x)fT0Dy)tMVV7Vo<}zdda-&*CpG(G@o?D9e}IYIw3J zOMW|6_qpME^TVwQH$L2nX!({K#VZ}?BeyR+-f6?88b3vYFRn9o*+1vESYy%E)N!n` zplR-mzVnP4DJsSeFZdeV1vCVn+Wng?`JU&{8h+E)&JRn@EaXvTRiEtDar18LuNTgR z<%K>+)K{ePuD)qyZXBz!&MNJCW9M;(ko6CRW7D}5uU<OxeB;?)H#Rt}Gj0s%vhRvi z^NUcFzILKi?M39<$HBcxBGXPMSsYXLva!6%#<SJUqG*xmcEQ|dj44$&s~7dCJ6EQ; z=0*fx2kk1!DA{3nSlR1ki_#@`QP)Sak{^Z%z382~sM2t=!o%L&X}l5!r@zivd|hRd z=&?f!RPr>>t_$pGGfkeG8GSrgf~}|_>w)j7%|9pfCQP!>i)7b4vsLqkL2{Mqt;3hx z4W}(=HC^=f#EJh+e~TYYb*a{m3Ru@Gv@^C~er*ZE;h%rA;_^0_AN13Vcw?Z_efI5o zhfVi#{VfAZH+U_3WK+req(??`*(v8+K3p|>^v)!e?QHy`z*FkB+@WM++0LG%<<m1K z)dbBkzjd)&e4<##Ltkd&O^=G0cxRv55R{Z)&gAYS=(5*h^TD1?`xdsIx5;_1Avwf% zcBSdb*yfkjLggN}mncZHPi%i*{K9bM`A>z05A_5eDMvl8;hcZzOK5RsF?0OS!t4F1 zEzd8%%6^=<l<%qu&-BF)wmo23rEDIlvFFgmH8&crIC@;0cfT#P_PE+j(Ex*0)4~FL z+^<S}6+G_YYEWhpbR~hUQvZ~HTwmz~SNF6kYhKM()7tDeZ-g#vY`wQ<l}Ap^`N?N_ zS6uKAY;|v9So!64zHu*alx9m=v*4w9(T{mLJuIis2;l5+=l1ouwcYHRp21?)dA!+v zANNGeSaMkRzW0{Y15;v>Zx|&cbPBqw7AqQyrwMuFx@RZpr5%12#D3pnIrF!jGYap2 zKeNt#vRByS+Xj0@4|o>XMV-mEEzOBA&|H7&n9|pKmVdvL9?FzG?P!|zcy_^>DL+o% zJMe)!=4h4d(OW9NqF6kbOu}9kTw9*8?PBWgKV4Z9_L#~>7R63F!ne5EJEz1*w6URh z`&u*YO((lTR{We&GdFIIL0PuNu9U`Lk(BD%59wF;oDdJTn8Rddwd_{^30{?rQwkHd z-R#xTH9zqAO5>(YtGAdhTQwzuf73Y=wnrJ98zQeft2<wD+2xS$5AJza!eyRV{0mG= ziNEG&)A4g{OsnMj)EjJ7KXbxjwmRF2U)4%!IG>w(xpQ5PhOYG+Kk0AFU;A8oU1bwj z{z`E98KqL4Eb}BW&cfK8oa^{=&SbA$YQ?*LyI9T5vPBaw>gkl0w+YD>M}3J{l+k}n z&fMtI)%aUd`EwWV4_U=H!?RfS#1e^Z4QJOlEc9F-t9NIM#D(p)6)JpPmkuQARToGK zq%_t1{`cDb`{%odA0IrHSyxc8Ve_-KWf!B{n-?FRy!Y~4Q~SPP(PNq$Hh6E@S#EX1 zf~kumCwA4MoX$rd4!-;+=ks8B;k2Wf9BW=rl6fmXZ{9l@W>2Z#ffCLhm)@_Nzg_&( zHzjkWC%p@qgCFjx>Nd3%DU;N6>bdc3lcc0b_vxFD{_NRs?c&NgXWGr@6t?SVF3>Wz z*v=VOe{rGu4S}`=e~bfeF4MfFD_}lDOjzN_H9_wWS3De!TEDb3*V$vOHM#P#jPo=u zpPg|+D?f+m?KorQxmfpHxLcgm#umG2Co0~*n~>oB<=xtgJiUEi=C*#EWXak7bmP7B zTj?6t@@k_G_r5VU%2nCqAnfhM+*o0~{6xg8%?F-D=Xy_c4YA#_?9`6wv&Fh3i_U(n zmz6el&b#H2))_5rG;MLH<fgL4sZ*b%%-!XGJK@Xj-w$#(g``_eJ}H#gGlh4h^K3&M zEy?b#zT+*LlB<85J9zEkw|fU|-S_fl6-=7H$L@yBo%qk26*!wz&Rr5a*xYQ};E=ib z$Y){ypLMH$K3Td~_>B~MAj7QtS-ZEdWQt$=)05$*=Zng>GtIxhb4}89GT>OdE!>>X zPfq4ebnv|8msCzn`gTBH_TK#)Erpjg*o+^tdt3kNaCQ9bzMh-IE-UlGpZ{z4H0+8R zrEj;-w*GnY<*|d`j(z+#>wRkCG*{0__nfwVzIE~3$CVdW80^YjvX)(ac{{WB<NHpV z_ZRLepYS^&yw+n&l73&5OZ)HJPK$Ir@5nuWkx{R1Zzq!@!;sx%;A^b^@rKoGlLZr> zG_<aN-u5Qw>GzsV@n$~^OW*k|lGS0~ux8TS5RMQdzR0;bRTo}taa?vqT>aKLmQ$LW zo<vtDs*8C2Vp-<D<hRAVDf!*43RCnZzEoPeWO=xXq4a_Syp2m|rD%&^s9}zcYw2&B z?5Zfa>iEr8Ub|Ap4aN;VGfru3ZTwc7yRiAfO68~3Q}=H9*xJ1B;evb%iJfz|8T>5x z#VP)G!Bl;V>luowGdEX$ToKxLDODu8uW0kv8*U+=^c>x~cP3S?%{A{Wt-ZYQ{q@|- zb;-BpW-Wapx`%t`<4;RZTtCP0<&Ngb%_@SHEuPEOqmNg+3tW+vb8y&dcq3D`Pff<= zhW*{s?9%E2Z|7uiX)fdDWOut=9lbo4ZN|>B{?7-`z5IA@nq))yBF?zG);DYo=Ek1C zdp56Pf06rhZ`U2G)Gke!$+Y{9w$#PW@SJ&%S4<Q-cyPC~dAs1Uhi7l*me=0j8^144 zG``}t`P-%*zo{1kXM3Dk{(EuLI*pZy4ZO>W7AVWwpOEptd+Ja{z0w1%g2__p%_{dJ z?-<4V>py7_JhX`=WmkStTHi~}{8J`VgKwt@i)J<ZgdDnYfJIJX)2H1!!3vWnHMss- zc)XJ9+PRis*7o`k(}P-~Yx1_tc)n}m?nDJvxhYIbT!VK?8a$o&AiVSYVX63qX96bJ zofY45;Qx-xQ)VyX6!TB?)jS@N-rfCY(<-@BLCIX}Y`<$=ziz&6rO_nKW#)$4Z+JPa zFvvN&@Lc55DJi$4!*qMyq@1R??$MeP|6`UL(~+O8S@UPCG<(s-n$ErDO<vCHHBH`L zbEQJ6W#{hBHx4v3JK8RBnLjUYy6+cVi|t!isc0}3oH^HR9xRtVwb6j1w5w;WZ3b7a z#G#av2XF0tbTpFpw=wI!30$uYq~o)~)AJui>*<P1D4y^VD2?7MVv_yjZSL8LG3wKN z*Y)<vFS~HSHM+(+Ra&XP+hSMy#Pc3At*pOp;9aP>p}4;@M~7);Z$#jZ_DqkTzh<r} zb-w=a+d7$$3fJ(P8>e3OSswXuuMwN?vsUr#Ej95zZOcx|A7b=8DJE22tZ9=YW$@=` z<;k$C{lUeSJ$qH+AMU&$d|LG5o*#b}t&pu#Idw<m`kz1N%vzUSx&Pk9w@+q)^p3M0 zN!L;)hbe#SC@T(mEVyxDwfuooJ63edBz66~kinsqe9L_4ZIv?pn1a@jENAVmPaNC$ zec~5;zWgD0U+Xh>eb20xAg1OUev22Ch4RQg|K%)YGL_x<m~`f|C3E)3zL&{)->|q{ zhUe4v#|Mwur5EVc)xW=2>mju3#leRMAI^$Wx_2v%JJ0di`ZcZI$~k+si52#||8?4} zIw*2QotKzK=BY2mMwR7Hw#py+QCldwE7m^5%cx!2>cF(uaZ4_JDLUxBa4+YdrM~vb zN!9-k+`0F=sPnaqcg1OD+4!s?n`N`5TYm9QuJxaK((2N+*o>Pu0xYKNur@guyd-zY zlxHi1_cfHtg?s)GnK@HQwtV@*XpVyPE)}&-o@nK{yF8}$Se2$tdZKD{(tC+FU*?-@ zNm0f}FP$_nGV1ZjS$@vv5Qntuu{Ob#vG)oY#rowR+}gMCgR<G54qp3BdGRLG^5PS{ zb8ZM_Z%dgMtCO|wvgZvU>1{`5>CP;^ShzkTE=~A#iRiN<ZI&C;{GNH7WV@NLeD(%) zvp0s@^&&6K3Ose@oY+$?w(1xAX4yu**wp@J`(^)#$r9I8+D!Y7e7Kyoe71pl=Pk~S zrf(u{tZ&{?J6$`xET#9epJz~0*mmEWZoi+b$$oM*_+8D@pw;(d=jS-|aZI~;GH#A; zLC6X7(k&uuw#16J)%nKXyfFLT(Jg0w@)})UrZ)3&+2?l=GE01)-Fhow7qI*J%$#+` zO@3`t(kJiY<2@$jBXnzdjZad%zOiG@kK0NMrl0Ydxb3~smfW(4)`i)N?!3PB?(3Q& zJuS;~IeU#Rcu&|qFQsVZ^!ru32e-`#YtC1+XiqqFfF)s4<Qd<_u*5Igjx)M_eOQi_ zUzkyFr@iKI<(64h@1zB<E1$UbaTgm)Y#l@L<>LYOFM4=ehm}fwdAshDZ>@Kf%FgWT z8cTSUHx`}SH0@UToJ(FOXPjI+_356>>4(GX)U~%XEq?P?qpfAGqO$wpmf%krVVcR` zJ{(&m`gzGiBVThpug9sgmUvIryPV>^;!L#L&(kZOmZl#x%Bp-C`DBrY#D)m}Z;h|* zgL1ZWXl-zsl4cmKznACZ%)j@nZ``}x^x#aA0RwmV+|wyDV|60Zu1|i+eq&|wl~3%K zKS`XOB+xne<d(^S^VaW9%`^Y<y+}WCi=(G)=*+5Bm%fIyUKieGF6upPxAsf98Sj1_ zEP1f|u3=upJ6W&yC%*WV<X?^b^*8KCgIiu~)r)<zq9d+stu?>!s?>V<rJEmo_U{jG z{9Ja%l$-1I{0BBqI(IGp?QhzU7nlFV*kJmNNn5ku@|?Llr%u*BIaxO4m_$hy%at?c z3Fnl)EY5UImA=k#{@KwSi{~#7MX%qSo8nUz^=)nClKW@cWnASpugyCWv7Wnk*)@C9 z37Z&$yH{^?S7eP$tt(w{<~-k_EmJLY%6*rtuAKcoThL&l<t#6^neH>aG<!cq+bx)N z?QBh=-tCK1)^YEBx6)ETbNlnMi!U|KY}l`KK~+bTHP5~Co{8|(4^D>l<<E+ZlP=W- z_lPwX`HDtfnY7nMH19u;(u;q3N)el;uCSYR?CCybsm2#;Jq<z<zKL7Ex_rtY;M4Wi zu<w`DWmWywhjlGfQFe{`dz!a+(K~73KX(^j)}B1SaE3Gg*@fwT`k$?xZigBLi{6^w z^&)us_Q!Wb7nRkpy)C(7FI%X4LU8pQ=dDLt1H!c<oabDUUd1QdYWuz5r2nEdlQm|z zaJkOq7G&G_L?y84_9Ow;Z|X*;_qiRv={3n)^uC&0l9r+S+T{1sf*$0i1)XXLx?*0c z&-H8xTZVk~%`}}Ep1cB!B@JiY`j&XnhpRCn_i{KZmv&kZ`;-Nj+?GWcaXW9f>Uy;2 z$c`nacRW?@+{EXbBl<Dy9@k@o>UEbt7o9sV^YU2J`@nWSxBa}67H-|&ce`}j?Ud+G zX{n#mmVQo~TJiRt!o6tSk9}VcN-w?sa<iA!rh*`oh@hfhU7O8*8h?uVC1u(@{cZTA zt?`}OC$6o0;FC04<$vg>dv{cS*ngX+Yqsw7j??aExB510$-drnTghiJKX-4;yS=-g z=w*seI^*rNQp0f5wSKX4vo7hS-l|F5=^e;AWm}~1$)mj7ERGFzA{lmFbu1bQB8>?W zd0w}eRx&vGo^DzzrgdOT*T$wPQ_4cS!-O^(7vKASZ|RSa921r$d!N^yn`3EQ{Ort3 zWxceEj-g6iqF>J*^Z2Kd=(_vKlOk~@iKCO2Oy%`A3g9i9J!heNe*BR{G4Clw4qhj} zC3W3?s%jD~e`VnxPu8S;joX(V+;dlNnflWiJQ7tar#=q8ysklShDNye$D)OvxzC+K zc0bvwsaR2TS42NksAS*&O-qlR75mNO`n2gbPjrs)7M-l=2lHoq^XKdPJXi0G?A^Eb zZ^#C(YK}GRU9s8uQGEA?osZ)+8pHdQ=VtvdzMEH*)LgRsx?AX71}Uk>x?v)j#m%f` zU#I81C=9;D`uphPlC?f}3Xhg#Y@Bc9H8W8D*sJY@&aOxKWD=!k9+_VGg5$dB=Le44 ze`g%elRWcfBQI}Vxoq9Hfa7^44}zz5Necd$mKKty&(r!OZ{8U}-J>EVtKPdBs%_r2 zCE;`C?KOTAPn+DFyTqgO$X^?Y_S%vb0S|%WAGNOeoo=>Y(^=y*V|jf<zu?*F>v}d{ z-j*i&?URPibH{BL0^OI*x7=;HFMspSud{XE9(uE7g7Kw4Eb~eysTaLe(hYZr3TQ3a zJujA-e^!7>Zs`?|U%Nt<zmV42^5ITP^k(hshYuZ1TxE2hxNK2=?<{q(GvvoRmHko; zhea9^9geJ6vw>A{MzIDTZ{MCpk8ZWN9(~Zz6>`ey%$Yv7tN&8}{K#;OdQo)x`<@-w zk1gds89et|m}VHqx>Jv4=o~!1C}N9lD~DyJR7IfTEDzp{2hO~a&o%lz*z&kf^v*X_ ze7WsF&ynblJFXk_KWI=o&&;&RZ*|kOrUgcv7Zg^MtWsmyc>D}gTw}oQ?b?oR#R3eH z-QGn<_~JM=U%u6Az*F+>SaDY3>3>sB9iP58B+kOA^5KFYh6KOkY&M;ReD1Hb3YsdO zg-K2o2+R?*^%gti%C}LyQY>=w9KRfX{@1+BjI;bBc#i#f(9%1t%WX+-v6)q-&+iwS z#n;qX&s=8t)EHcJ@n~jc=cSr$u9<enRRy1Hd-+UA;B}Y5%=L_k9Y-G>S-GE~)2v|A zmQC*5>J@X}yz*R`(36(1A%kc6<x`ixg%}*ZP<K_yN0);u?}Ar$Qptpy$BwgZ*5XJ@ zRb0#(<ZO7y&VP4QcB`?=(TK28e@EH7YZBAM9N&ayO`LOW$^rRhHj8uTBqh)I>^bke z&ozcwY7J_K(jQFR7O?E*<Q?6KDKSUIx=v)}73}f2exX~xvE<jK7Xjy7<UYT-Yv{RZ z<^e&k?kfRW6%p$Lxr-PCJRX@G?#K(hZ8oXYfRA5j!ns4wy5pyxoD~-RNKR4i0{djA zcZxDAbdM^Sb<R0spq1<}`$*%AV`;k%^vYg3KjCG@?at%QMI7hPnzCtpcUd%dirFGT z{Y^a4`k`DC`lS>dCN?h&GR${%HOds_PcELU63!HQcCJvov-6geroK3x8v>szREk&w zS;e<}-8bp<oDPeJU9DgD_<xzB-)R>m{P5O^`++VoQ*UuJM!dhJRL$PqSi|J%9{yI@ zSyfE%;%O&2-I7C7lh)jlWyunKzRaX^MRKCM0kd<?z6d{)G|mg5eMxgJKGd1veYxqV zUZ#A=>d8(VvqaQO^iLXb_NK1kI;~)_Oj`CDw_CwRagj5pxZ6e2eV@!sma*=<*EQp$ z&?~dAtMkNix>7mkrbf=mNhwvfn~|)zK-9u?;?Ic3MpCa;vvXRKPAqLOosn#CDF3w4 z5$9{XmL>{{b4(vU*ZjKj<c||gYNiDXY81F0e%IVM@7lz|T!Vexw)gKWxj(hiEWLE~ zE+NOrW53m%Qdl3ax*)Rg*Y6{*_#J}eg;_Q}X5IUo_2So#bzk@!zs!}@7jtv><B0Dl zKNqxg@y>&Zev4#QrbwiTud)6y?f$`Hg=Ow9O8ISTAADH&=HFrWe^X?;SM5lD(bp~6 zu0G$Zyg@Y5jobC&CXc7Jv7(QC^b$_ZRFOUTMub(kr)-ilkG#yT+MdNP)iyent?ljI z`1`><xwluQH~Gujl|0ZiGZ8!Yrg_8K<?^;gKNPG#FO~SdbFurKdwXv_pK<DFNA*5s z)yI7@=VV?r#cVikuz244f{?%N{OR*<@$bAP)VSigb%2IQ;rU(F|5d6VTnPN`aX-;! znO)5a=A#x9YaRrAcl@r|<#+6>XX0-)w!TFS6FoSU)@eS8R`s-0xhavRm!=S!?0vY| z@}uYPbk}61tQ+s#+}&KZ{H)cnKTv*j&D^u;Q<kJ`Fgf-{|Co-lO4!qgIr^SQDrbAw zeTY55f24Q9G&Og7!RHJ!H~e(>JMzTEC)BFQ=>Gpxt3q5(Z(x%Wni951tia)^kir)w zvpspv8HSURWha{o7oTC<6q)>L_DOT8_S+K<&A8)g)LM99Zc2dM6r(*8j3Qe+^jIcy z+gL`JZ+^NetkUBKkL7_Ux0#>Hmpd~rmr8svJ7{ygU-Uj^ht+v31*Km)uPSakaAX$` z<LtLgT#JO_beC80xo+9idO>fFm&f1y_LY3kLgvUXSzJ_^tF5=>q}X1Ar^m0l&MdIX z5}3Nfa?;c*GW_Kx^RqpUY?hjv=EdW>O?2;Nu?;Ny`82vt7Om`8+Ib^pX>d=@i7Z3I z)ux+fZi?n!`_=ixotRU17YUWVpQ0G^=w07QuFFPOGPIqxMLp8u(XR4jJKy<)>q3fG zhwQ0-meBke#(4<~*E)sySr|Rq)FrjXWzL?S)KitL40|^)^4)zfqjJriHT;iu`_H!j z?z`Shn(05!v;Jq<DQ(`z_wfby%eZSZ1#zlQVv0B1tjllJvUc|2_mAa{xbe16|0pv3 z_S1)5xvxy4J=bU6UiistdhTS`uDL?nZ1`?%E0lLzCa<z(t~+<$(<xIcUj)eQT(a-_ zvoQPIzRSn@RCr9S-fNe~-(4lWG3%_TYrb6aIo3)SC8y$S^{X6#wX3^6&+WY{c1qz` zf4j2ZuCoEhlWUf*vrBuGIV<__YQxLEpLZ^QHDhAB&C4x!1B=i5uTr$U9)BXWwB7Tg zS(x$eXhW5A@i$|4m{|ph+<WhK@!22M#7<YqTQ6HC{xrO9C7mCByl2n$iaS^P<`vI% zSya5GK&hZcF#S8X;lT#CJ3Fk~o6Vl7oK$m7Og-h1e)7(*h&iDj=ltP|T5T5pd%<oa z=JHRkEItOX*)8PTEZML&n0@`n(=Q5^1|RBJ#LyzJJpR(u_8*QXeQtbTbgU!)%Y^v_ zd2UA5$<s92yklD*drWZ^K67DF$t0slnGCjxQ`C!dJ12KU9kuCqC~i1aVOSpYST)*Q zVsp~YYqH1wh`bNJ#K_;bXOUAy*OF=6W{39NG0tSPe12Lf(YtE@UE4dG+&Z3T8wqTv zJ(k)ceC*@#$$pnQpV?*U3!SYvX7QM_LAYb$C(T^eS+6VF+OCS-Sd}za?30sS&WdFW zCTh!@o}|X4PRPiMyX~_fbi$;Qj8aZ5v1<kMc<1_U{Pk6>Jo0$oN&PQd4jF_6$tU{B zERx)l<yUlJk_Cf&a#5-K-JqirCQRevOuVLWw(DcJRd2h3OOGn2($lY23wL}=%+C;c z$mgcBExBUypD7tv_wb!yQ<xEOLY(vENx8|@Tu-7Rmt16>x$h*~*5tmo*-p|<8+Pix ztKIUz|BYly*Fyu@37(;;0q<5!I>f2I;Fz%=r{%vc?%UgT<U2p@-t%X&P5;vQic%-c zluEW-i))@d<Hf02=Qtm^uYd5wB<REwCD%IUqr8VaV>`PQT65N}3f;Xi_UpaGim<6G zV?LX-oiIKhARy`V`(@0&jyid^Pk)aJaV$M3TdGi*+qI72Vx;RwQ;{b#1%Ky0S@J3R z_?axDtv5WoZ+%i$cL?FnyScU|Zmr?nmWe679|D6O$RrimXou^DF+MDuaK5!fFMDgK zWDs}9L<yn8={yGIsUNI<@ScfZZzp?k&YKUN+m!d4oau_lu{w3Mb?I%1lQpw~SBHvz zElgE8Y^AsL&{3P|FV=)!$|yK_Rb1$_#WABr$A#~OZ@YIiQ7vj!m$2`u`)5?n{Sx{! z<?`EC7iA`Pa9CBPJf9;{cgwbD!R)!kK|8u{PAJdX8ku(6^`hp)oIJ@AsV=o8Oo10Z zzI#yk?ADwKj(NedjEsiNGpv+K+fM|x{yM9$`da#OK3Urvol=`mq>78JQlGi&^hS>- z3N;JP)D}&A_$K>0W6r_kO<jeX`u;u>NZ-3WOL11R*7>b_mwR4QUh&fV@8d|Ln{xaC z-bWjm60hva@Jiy5JI_5mSD;bu-j))czTQ4>#iOTE-PzfE9FsTK9+|NCMfHaQ(^;vk z5+_%svr4~y62?$J+bX|7?}B!7eg07evu?xJv-4D+u^lavOLG(UYKo{X=T56%yj%Lf zd);`w@}2)*H~pRF|0m60`nH|Ncl1Zks_DAuzwwN&U`L<BfmFeL=J(5fZMpl!bO(do z<rjIm5lR;SK56%CWQ%W$T`hJg#JcTC_NnLxl{-yDtMbEMI4B7>ML)L-G`%kw9FgI0 zrZ`b^*QUFkD}L$To4WdWq4KvUp~9=V4BFh%ugX?_y}R^EV05yhpE?us+M0;f8~=Jd zp0tYnnTO7y-PcUz7JE-|%Z$oqYW~Gm@-^k}tVN<+QGwN^ow}h1c248{l^kmRV7}&s zb;iHVoV{<?KRvqj*akOstLc^-)t)d(G|680S~GF;mdv9Z(yPy{R<M=c6tl<r?V63o zw;67~b@^7hwx;)6{`5GlAkM9BM}@y>N4*u9yGhh*xrglK{1RJ7&f>2NX4%!nGP_2u z6z%F-pLEWxZo*Wi4!x$+3Z_l0o0MPtO6f2-*wtbD(dp6Vm0n3Ku567``%R(*I+8l1 z%LObvYo;y~;?DHkHc{p6tx^sroANVEjSAie_KCQ}H*r_IzG}y0`EE!0MgHT*;w5FI zPd{h662-oCTcxD@Yx#=>&(CrFGELz;QO>yer}eVgKV<awEsM)zOYr)u`Fi!D*L$Kr zZ|Ym~m-)~~O?DTBJs1Dpc;J!u!Q%GBi_hD>r6i^augaVJTR!xm+l;IRb2jbUZ<zQ) z^tnV_7?)jA_x}<3Y;S#YR_3av*Gs>?3c3F?S%_!C+r$H}%Gg}KL<%-rKK@u**Hc_# zy+!oNakE2$PLm=ZWu8~I<b2p?pnAvngR+Ub;+fPfMyG!0d7huJTxs4RSt;9V_DABp z!}^TRmK*=L+<!`B+Rka7%bmCXKgxX|us`#H^npKx7atT$ec{_sQ)Tku&5F5;%H5A2 zdt}5l-({gjwA({(^)Dq;7cS%AIcoHK^~~=|Wu4zu0@|cZ<R#gJj?3Oz=wM-ZFs>~n z_pw+4ORw$cB%5hVeRPy$a)V_i`uIFBR|}Z(T3_U<tybB=+^u0BnW_^1NT^SfkeZ~p zM|Xh}!|szgo|h6Eq*)_1YI=>=d87u&?$2u9mUf}&u~xoAa-htFe_gGs&Ub8Wb2*!w zBa(92IBj*l_f6%Z>s+(5KUnP7@}0W6y*~Hc`#RpqEuy6>yiDFjn?BuaP%NFc<;>l0 zZT>2(FYm|PezCdl=%VL)8M@Q;vjq4Zu5Y)AnUJ__^1%&T`h2+fz3&vhjf=GOPv7S+ z^G+aKHQQzWAKff{X3h9dT{>2t@2=X-%Lt$L_@qlqrb*S@tCig6Pp##d5dATWyU9JT z#BF=3UrD`M`K*cOk2y#b|1(wo_J8xd`nvR-;@td;HM70_ssmPQ8LF(z?&*$wa&InE zV>D~>Rn@Fj3l3;=+`D)57uO!U&yE$RFLfwHKVG=|zLS;SgbJQLarLQo70Hvo-F%%< zSG;znU!&Rm3J$5ix2_%V+~&DY<sJ)<9LKD`#@|G@yyp+w-goKYYr!waW|u`+>MiA{ zGH>HdsnB%1`*N{{%ft)TVb?fcmbE>ZP%zP<Z9;aZ?tHHp_dlGHMU&^szpt3Z(EgpR z<)z4O54O3YotnBEO^i;=zmS;uGS=y<n1|#2S4G$5e7fHU{p0`gujEU>rnROKrjobU z%sMe^?W8jtob{ELJxa@1HF)cnPE}V|*|yC+CU0Wj7Qv*4+y%K@*Dt$m@=X%h%X#S1 z?Wp$?<oNG*UYY#UR>ZyP`LRYr_D`ImQw4U098@{KRB!3FkLn*@obz}gsWz|Oe&@0H zlg<+h?cWw3<=&>HzW=}}+u82Vo;amR|BT5|zJKS_Rd@G&j%RF+JWdMePqcdbNzke4 zxZxbVseI46d-#6+^^*>lIl4Q}uOh%UWbMn++Yi@QTYf6lci;2w>6Ui3(^)SJPklbU z@ztZ%9|YfhSpLrGDX;z=zH;$*9_0`F3dG+P*cZC7{@JR#wnkcCUvP<S>aRD)8fOTu zyq3`N?(E%PL4W$+Tod~$-oJd(+J-wPQ@p)5nch?S*Z$WzTIu4YNnO@`zLxQO@^j|c zhX4MtLiPW@uh-7!nIFiP{j>Vve)A8DTU+<XCcFN-dpR@m?AABpryuXX|0wfjj-h>I zNag06i{BNypZydpyT<0<+X|su2m7mD>xa&K{Mcc+yI;sk=F|7N_usERv}SwQ?{kaR zpZ&N<?A@*ElJ#Ey?XFzp+P~iR;4izK(|Zpay{eFu^}Y1fRm|?f?eZTTZ%#5@Nj&^M zX@UI4s@I|2hg%Ll{-LpE_Qa$k5n0xSFQ$EcFgZ>3d-jI|g>M_`r!VOLUuOR#e#4sm zl5I8u*N=amvw!~I!<IGdb?-N?`oDLZxs~nXzh7>qpSu3N;&a@4(faz@%590?vhIG_ z*LKtE?w)Gq%}dg`zyEyK`{|}_{ONrkzI};s{(1Om=J&SiTR$uAS7)<78&{aVxV#`e zXJ2-@?W6wpaUWlmhwbCu@Tn>(pe$?Im-Cmu{_oyeY5R4RQO4cs?VBtAT)Y`w`fpyu z<(ciXPTOZz$S(YF@00lbPhxQu)^&{kpWn@C%iCvPn)oSD<1_2~WR1}8IcxqXYCo*~ za<6EOnO(5mZ6DdY;g22l?|+)6-M?nd8V7N^FV*=KzSo~srs~ey{UmkW@9I~I^XEr? z`hIkerG0VoE2m8J9<E)LvhE)boA79CHrcP=c6Yvd%k2B@pVOzF-<IJ0QFOocvZ+7V zrp$PscJuwh|GQt`^jDrbD_igU^(FrIHRdL-jr-j<r`2+O`Ni$a)U*FMe|=f*_b>6! z@q3@%B-O^2=j_VQtUE81J!jR&e>cj-_ols<X;+=U_LI+=Jv-j)3_l_gczsr(*RCr% zrpc`QZ`bH7eX!k{tzqV`!jE;|jAi#1ynSz2UvBGave%09!|t-sa|h>q@5}c+D^lP8 zbxlkr8^baE16!(i?=>;lAE;XSNmb+J-qd9oUuz8Zrn{&9_;%`4N%`XP)kQM<EHw72 zmxWmcT`UOsdPbP<{QJxl`yB~7ULU@jAM$uN_pfK|-GA+S*8jVd@pbO0{m$DLG(WY> z5Ur||x@Bs8ovUNo&L>~vz8Lq`t-Ser#V56g0UH<AY@5oTziau$-#b1%%ssT0tM8+- zz3}Qk52lNJZ0z?C{mk%5JW==R&gnMai!AFmK6LL`?VDbuzpq?+^PA4fcaN^LKAKp6 z@JHo$uD*lkb<F0j{F--n&xfO|`@a`mp2@!FX0`p?Upr3DZC#Robzk-FlKh){W1LI( z?rv&4Dz$3Co4A!9tJg27PF`wWpt&Wh`PE^^*e_M$34Z&(>TNCSj4GB+O!<E3{2tcD zF(2hW@*m$*yn*l6^Sh^KB<~7%{QZDYq|bR#xtZmhytDWHRMy(f(!6!yfs(&RO8&<C ze!u(S*57;G_x?%OWggT%Fl)z?x7~&XiWTSnbUoOyyJlN|qONJdTEX_<d6{p{#OT!> z*N=UZqx+Xf>xIl}{l8ys=`gJ_f0nKn{_nXs%iYNRS1i7Ie&l7~J2RnNe*M~-s)tb@ zw<kuJn(Sg-^Xt|7!xK&&7ME{(VWs;^uBT2r?BDrRedg{|PH}FX{<QZm{9e3J`g6g{ z@k-OSy~pNG-9CBFyn_>FFUt}P+Td07YW+PHnFj`Sg3~|nYcH>Bwb*;O`24TC*2{i} z?KyMiO6#)y{}_HfP1U-$yJ3by{^{`9d+)t|>h;#wp>Jtr`NXrwe0DZ1$u2r^e$Lna zBYVzR<}W<Q`by?=Rs46|^R>bpXG_9$6V9dXXNf4g`ToOq-QRojm!;3HIycom*W%}# z`IWL_2M+tD%l&C~pLH&#qPErJ)!EjSt(WFct&a<q+jr;9cRj|fv)@%EsO}A^Vm4f1 zQ?qoZP0ik&Z}b?2LND#@_FeyO%|X4pAMVUteLUfaZ@SciSK-;-{L}BRVl)cdC)NB- zZ6EiGUs=u{qjs5G{_-~3qU*Bp%iGKA4ZfayV*g`ry7lGd|MR{b{<Z6p<@%C|fhOPQ zJfHV{+8;Cf;(PTMPU{?yD!BCCyf(Ryq3+&)Erwr8JvYn6PZ^)+>*DuS&zgPi%AN4v zYiE7R;oUO--;OW$17a?uEMmGa>wm-c4cU?n7N(!S>aF>AKKWlb!@cQyEMKq~td_X2 zXl9y{u><q}!;E54R_9l4{{B^BQBJw7vSrBKFZ)DiaIN3Q)w4|R@Sn#?)q;f=cE6mS zwr-t*CbP?r+o^}H|Nm4izUSWc1ecfBI`4m-mNxzMpEF0T9$3gT9<FYdxVP3{Z;Q$F z=UJDQUiW$*|98qmkp&@p&Dmu&^smqP!=&DD&$##U-Lq5U?>MP=PdR_B{%z}O`*sGE z`-dlKzRNxNqG4zJcW=Xl(hJjNpGKPs8#)|+f7WDf<cDf0#-M=TF3joam%oZH+r5v| zq?Ypn&$O)8VzC6z9SSctGya(K-+F_P*8OzuPmP~q*1Wm5f-%H%_jT|0vA@+LB(DDp zG%)*L!o$Jw<TkJCT~-Ct8%aFZ1j~}rcGb0+R_^;F-fMbv+4c8{lbR-2dWk+sduMq+ zmras2P2j{SrZUDu4hiSO<x=-r#Fx!Ze!BD5xl21QRbQ~?H{ht)RDH5sdq>2b&;R5i zrgZ->y!PneEyi2c!EeM;ri%$1wA}Gs^-kOFL&MTj#yVeE&PcR;+kD~ifny7q7Hxkw zb<1uJ6V6@sn-9Nd-L@~_rmOIMldIqAr|jjd@D2a|qyF5^=X@OBl{iA1GK4vWM8ca? zQj`q0v}ws^u3r1iRoLn1h1uPgA1}HZqP}+3wp&usCT$ZI2nDyUTDfY)w$6a$<P{IM zU%&Nx-RArI?mz!&|NndC>za4_ve$3^b}Re+-fwo#nJ%+jo*jBFw0y_8)3YCbIe5B1 z%tUml-pVflt<F>85;q1^YFeChaOb;t^UWK>>L1ID%3BM{m%e(jI;6jF^4U(&t$CkX zJ6$>SceIM7%BMGl+Os+{Px*TJ@9v^m&aT&<@_DqiRV)ZQRau<1yy2d%-O<UiJbc2N zxy)Rgj(lLeyHJ4R_Ksh(eE$B|oh=}^ojdh>_@2Y5``Lo|PA&7f`uBTL)FRF2XWQ7k z`<E33Yn@S?%VQS(viDK2lS+2NtuofbL3a)@Z-4P)|1+L_B6F_%w5jfO6_|1UiMCcw z%)erTm+c9g7}TD&&RA&`|I^Uff!~l@aps=T#QjH)n;Q#p?+ADrZ@zK!8IkL55nXcY zdv?p}H1sHSpZ&d#_s{HwU(UMma?5OYbw6*hU*heT4H7ecYi>DjKkcadoxKh6Mn;G2 z*`{q!()hgN`Juj5SLXA|OXPB<*E{%$WqHq#pTR2KJxN+ldB1}AblVwL^~w9R97J!I z1b3g~Ul4RQe9^|#i`A80qW`CT-6+YhHKC$w^&@VxD?WStMP?;Gnt$d<<>MQr$M`l# z{@ucN>T1?zhIMX?S3ZRM|6TQIXZ4n-Hg+fZV@Ct-%AT0Fezq;sN-LI!*47KQHlN>| zz)@!U+G=ho%aiMcZxiD7rKr5z_o(3h$|U8Jtd?J0ub$XFEmp34{j0kBXEWc`-Cpo| zCxdrTdE192*43hCI3}#IcDVjNH*mUTfVtNqKA&5ae<QA%%`)5UcSi1yG<SSN@p-2? z8%kFlDi1C_Z*$iASooPUwoy-0yX*J^X0P%;zkAh=&-=O3k}M6RHy#c9{B&-@)de+G z_ws!nS!XD8uREys{o2V{)vLuynVsgH4biccsL4$~722Bq*!%JBUCh}IRqEY0CIx>x zu;51Un&&3UmUn!v^*-Uav0cS|)=5RTqMn&=3@0U@eG;I&bMj1?G?jAG$+M+Sa&Cy5 z$K8K^*R;>~r~PVo_`f{l&+SW*&J|_MC#N23W6!qf?s>2v+3fkNcWaqt0=FkHA65ID zbXTTk+U>QQ(n8fXy}J3ak@2B{M%k~jw%=M;-|SoVOn2_2N4Le^>7HGgG&ggToZSrR zb7DN-?=Wvj;Iqr;xu{)kl(JUzzP}agefDbyzGqZCeLkURbMDEU38#03RbKPjpCEsF z*|~siyPm#JeysgL_Vx_z##TkXj^&G!eA62=nSIzd%-HbcoJOMbS!q$Ndrvidv}&eu zHioKo_a}Y(n>p?J!968RRbB_r+_g22ZuOm;x1r{{S4?T>>jO^;HZPkgBNr+*f6eoo zJlDKyopN-TUp_wc^sh^q_v2|Zi<Djo>AYeO_!BQ=seX1&@V~6@cQi!braDhq`p)s` ztU#f=>NflO?XIS6@H(j{&EmwdT55iAm$tpC=JkK72d6yWs5&F{oZMH1?iZJ)e15=Z z*77;t{d>itwze70k&h~;r7ya9o=wfIYs>yujEnayS+p~%?m-*x_YSuxR-evvMa3l9 zvuTm<A7tN@tzG&sC(*FXo!?H{en--&JhLbVyR}NQeCz&x`M-A3=KiCzb&oPjmdQnL z^WUiBUHUt5n?Pnmq4|b@>l>7{tq)A&tvx4e`kv#xrOd>3t@n?Md*0VbNGIxS_Axfy zn66(dd%1oI|5XLuZLFCqZ9PsOxhZhQ#vrstcB#hhZNYAnA3w6ri3#Y+HrVMWC>n1l zxp+$c?7z$kxBGby{5*8=z@ef!m;5&NcK_aeB_{cr;*IdL%~S60cw}vUcduP(SM^_2 z<>xMSg=Nh<vdmN^bk6dA%)RX55tGn-aj#uv*ZLW~*Mi#)|Bd~W;t>#WUhc!xiW}RF zx9#nZ<Pr8h>ztbYIr3Kli?!&hXNh+gw<&*+-6H#HqvhOMV}_`MpPwJe*_iRWOZn$Q zw%>Le+15;*uEmw-93}lo+w;NIEGN^i@mJ-xuDbf@>bxCir}sZGJhtZPnb5RP5y{uG zT5^)Z6q_$arXI|jxpn%Bw+ZZLtHK4il^3rrZTPak&T4k?!b`bp4Q5nslB_AnNLci4 zF6Zkm>-{oK95*YL^IZ2d+Y+DPU6$}H&W>Tv=bb5yZSuT-GSXTlH#^!{NSCCArcGI- z{`pk;lS;FcmW+2hO&6Zi>F+MhKk+@`^D+6&^FB(XUOzwe&L+uJRr6Wyxu5yI?XaIC z`mTv>>g>zTk{kX^c^fWgP<HHYv$fNOjSXIv6VB?IA6kB`$v1kX)ckU#=O*2P5_@yp z4V8J`eNsD9m^1xENN0$xL0J3Emjb7Kb~%N;JH0!t_<R)O>Y#h3SLg0;n`yIe&c<iw z>|3Pw6j}RB4BPw0D2+{e<;)GQb}9TZw>_}UQ!~*mEBFQTi-#dIWVG#gr?qo#{&~ns zJ>rd`sYTZ&`GyeFD?VRYuBY+q@NY1aKgBs=qp|!!))hQP_8DSwAuL6ub}u*0eC2!R zRQ#jrEnM-Ox9`7QTeLZn-8@ZmdW73N+iPcTa(9dC++X9Fe#50bc!u=58AbEn-al8p z`CQt2v$+@h7M$N6YyWO{A^#@!w4BWB4|V4=f1kaw%q=Q-+jR3whi1HVn|0iW*YuLp z|JQYvpKCSUXa01*%K0|Yx<l|(l>CL>2D`a`<uCm*S2XZCcVo}fcl_xN3?cWLOjVz2 z%s%odJ8|*pw^nVjKYMa(?yg#KWr@Dl?1%S^bmWpRzLh`tD*SABeS3XZ!h9|3yN=I8 z<90hUGxpz3_%3|stJ{G}sd+P|E^GVb9sDIN%OH0B4FSjYX_q$MSuS{O;~a|{BFl>> zRA~J#J|%vEyFe<na-Qv~BiGK0-v4m*`5Be-Mz+sA<7einR7OnVzc?`{a8}E-4f|dt zY-)YJN7wUsv*5n}IY&OVPw@^;&`s7ncts<ArC;>9t~tRu!ADHm9lp1mX}=tQ;?G5~ z<b;f?nN|xtZzl5SnQbzgeV3`qf7?o)Co##{wHmWeUZ}HBOFeV@_^dUbZwl9JTPym2 zZ`*`NGt12E#h&l3i#$B#|FsJu&vj*VE;maZS@}b3r`&5pGyDI)|H-W`E80*dvEKIX zi({AeHN<78R5zWDHhO<L<=*t#8?{|$8TJ0}ee<mFs*Z4gV!F>I#dM!fKfGrB+U6Ma zVDG%cpYEJBSZ8<WS>CZ?b+Zby&v&NBKHT>(?Ox<EE&Ym+qbd&X1l}zF$uiA0py%qU zU+nJ=79?bEGJkrcB`@dSsmvp0Ti<;xxbfKA^2mAZ?GDy|E1%wEzY&zS?9GZB2c5#! zSr#tWPhHRM7kB31@;%MxpY1ug<jlIbX${W~?_B$Tp0z#ux%gGR+5z_e`Bd00Eb5-x zAKjUlZ(*Czo3>eZxBcl&r_b=c*}UIsci<hp`@!?-y@U@xcyl@Y&XlL8?w!`L_qF7z z&ad<9YM)YgwBX9L&@`SaXA2c`3R5MgRlker___bfgOAoKK1ZL0OrKcJWvyv0ez~mo zXkh|}_oK26Yfgkbo*Vp2!t(jz;&aoMg)G=D<91HfINkWkoyzGwXVzKGd6%7I&Tuot zcpB$yQ$>G%pMAMc=JGGO*B0z>^^CRX`!m1g+#S#HO)IO|+*KU+{q2k1_JtGV-u_ts z{!X36;nh}=vx+=6-U<z6W_tK^Yu35uoVKF%>klpqiuc;drG9<6iScUzz8IS&TE3Cp zvSt<eW!A>ad$tDO&3}?>b~(Ysy!GOlv}03*<Bqdzw`|<G;)2HvPQ$rHj}GX*D4uq+ z@^hcxoZ~54;eqep%*b1!W6q{;ylEQS7oOzklajHik$*NhyuW_)M||$NV@s{F*Y4cK z!+!YFE0_N6+!N>hk1u5J?q+(dtP>M>Wp3KFC>^OiGD&kqS3lgaOKeu9_szOZnx~&F z_dk`I{o8BX2jBT7k&Voc&u&;0e)a29-PF~Ob3~<f&2+C&+&$M&p{4%wR4+enzQ#3A zpDhV6Q`;53yfWt9pN$)4`SDm5TsNDT`|jGKsuM13uh{c$zM7S3b$Zs^z}pE%l`Ac! zW(QR~aJ%BS<77nG!U=b|c;_5i_DMhSq<5>U(W^-_LnS0a)bErpvv}ooC2#SR)@N^a znav2j$(Leg!}R4{`S<%`7j8OjlUX)>jnlTJ3CuH9_d8z@)%*NV;Qrcq?<%`*N^MdU zEN%?W`TIV@c~k24^!iO^d>b7%Pv3m&s%mH6f7KIH%j9>6zIf~CeQIZ2z`U(@ravs~ zjQeoctK_`&ftK3svvxl}+svx7dP3^KVr#?N#+48E+24Gj$@7Aj`Q^iXmyaIHd)8X? zIP8k(;|<l{YA*;yRqnO!-Tm(0bZya?FEN*k)eX~KvhS?<xF~a<T}ifD^X@H6by6b2 zw(*1=h`Gb3(;nG*x7;$P{>GMxTXWnvmt{w$zWci4*EzqN=d)(!Cu+_XcSthyn$vE( zgfVu`_U2rh#l_AEmnv3kF3D;>y<R^3^1ScYwoF&3Kb^!q_4Mpb$yw&hvX5;u3Y-7- z!p$@mwdSKbmlLetAHCU`lRj&^a@D4DMsqV|KeAZgNwEy7tU1-Ed3^cvx8X%u8&wtd z2~66R`8DB${hP#SU$IPyxuyR^D|4J?_ugK(X;N@mT6DtZXG!wRnagi@as7TgQzP`? zvi~m*9#ycD?e*W;)-S#1>1DUW+dCEAPTkJw>uR#U|81Gb^U_bTZ&dtTZf?8#y~x!f z#q;Aa-r^Uz%QWjgEY*DbpyY7*#GCTGtMfljNj~&%jnVtr3IDGM#9z~#vF}WZzo^ZW zqY>687N1k|^H8|=M>;WoLXpxe-V1A<x=mVb#5-^9mqvw^H9VhYtht&d#M8SX_ub74 zMfcaTFJJm2Z_E5^-79t9opCFBnz-!ouZ^c>7yR71iOF0uM_}(Uw@UYK3qRR?JKh-m zD)GMj(WRQL0>7uuf0WC;J3m!^*|P4KDJzX4EsyMuI>!}JnCiQQQ73t`J@>6f#i{cX z?>=>_@_1T$=jMTq6?524xBoo%rKM|omQU_!w?kW=?Rzw9!8YOFMqF}Xa}WGH!dhy+ z(dho#_B+K7dm`?p@#w8t!>el%cT*xvY1-m{fiXYN+pl?&^7Q0`g$g!|=3eXMzurxD zUV0{euC(w4`LxShwx`@;&iTZ0%j_zzzr?KHewjK<i7g^dc?<=AD?)b`GVkC0R{Po# zmtI}p>t`4jrpeDe+I@5C*$m0TtD%WHyxx5Vky6uSUfvdat$pxw=j)rf-ji)@&T~B9 z$no+*zlJztXv)Jm@((jxN|!JD&|_`Oa?iYBZ6Ry)kp#hbb=5DLiUNz&&)5m($goX% z_;b_E<H50yPR@LGZ<37E`ES#H7TlAZUvy~h`{q66-bKv$ULN04rWvL@-_WUD-J#!~ zd+by6hK0c#`P&{W4yy08u4j}NJ#+7xj&joJ+(TIs_x$p^va{B{)_Gd6^SSH8PQKf| zVNd=Xa=Pfl*M5b=jb#h>{68^=)b0BpzH|xBkPWur_Nh2JO=wc_l=}}IWaJi=YPDEf zEDA3DsaEbF`=(l}s4u+s;r=<X3C}_{w4}V-uYGj+j!#WfuX#?@ntzOQ6H|^fEBoR9 zd40m#zS8Qmihji(({DP?WgFpIQ=7zHvGUW8*q})9^Rrqt`KA?aK4UFv{66te(|s-d z1A=#+e30Dz;I5oSV0q}fRM$)C-*QtmJ$l(SZ8g4HPUosiyB}7^6jV6%{r#nn-)~%@ z^29QJ-Le$xd7n!|i)KyvC92jC*kqE-?(uMPf0JLug_v_}Iw}_~yE64^T1FSVH*GRK znS9NFNpDB!0`onr2PXY5ZI9^v?{(y})1BzcTk6vveRwBe!+!4yN8cmiAB&|vT+xYG z!OiyIZsKXt2ktK$Hyf1l>`N1ASh!)1PV1Wl**nu!SJ(a6_2{GaALc8oB??&2U3N6i z+jisM{$gc|tL;Mfp18c+t=9YRI%kpbo#?s$^P0G)CVY-eDp{(S?a|rjRT=!}waJR( zx8AX*@7kaJ<le5cAIe!9OEa$T`ut!`L;K1KzFAW;+mEihA}{o2>K*}O-6J{;=ijaU z#c<-^AH^S19#`__EGXH`QL<vGT9)A+o%!G7=lq(olkW)AFBSpL29E{Xqw*}ymTH(? ze7gJSrMFjetfgMaXW!{q{cUb=Z`0xpzpwUuI?xdD_@Q%7{bTpc3Y7)FypkSYZ*(}f z{#eT0_WL_(GFF|^?a^;owzGD!q5yNj|5Ft;%O-YKGsZ5N*T^CvcKNw;(gXiJr*|JX z^Kpi;VR*v2m@5o^FPJ+Yx@n#+*%bfn-q||F`6m8}O?$W|S4l4M+Ec!K+l?D{;!P)% zn*L@w*ILq7VI~sFAo1qNgPk&ab|ybEpAo#Mae>j7Lwl>OgQu;w4i4MUVtXZg;lXuJ z=1!TqZ%=^P|4f6)Pg^&gy~KOx;2FQjqjsy_HBGs?v@Z5b<jVavH>w-6Z|rS<Fn3OA ze^R@A>$c~WM;ya1#&Nu2T9NfDaYbm(E>6}5?j7x0SFHaYYngDC>4(gP)4u$6P3PvN z$QV{v_3!w+I<aNB>k)PLl>e!IS9(hy7M%9>(YnV!<L-T*euH+Git_aE%67LM%-#{K z?;H0-?W>#TQrz_J?#$2IZ(h9-xmA4w-|_oaGWD(&|GE+yLiZgDJLlxFz+nEDg_)}) z8@kOK_V)8ztIY0hc+_3MuxFoupXSc(e?@PUd~s*re4bZ%!nye_Kj!l@UOy<lZ<2vB z!+Yi#ck)*zs-1ovc_ro0bk_%FTR+;yuS^r+ZFtWekk0TY|Jn7Hx4bQ3E9DqpXC0mJ z>%kevH>cAK-rvu7ckYls+rO9EOiNc)FXOkp+iBnSIQ_>;#m1HMwAx?xGyM1GF}%j; z^48><ZI$@^!(VwyyjsGIeyrG+`fK57?YbQ-cdZm89<o*#S1@pFO_=4RS+VU^bffwA zsZ}kK!s0A%Po6Jqwk|N^i`n&g{mRE(_2Feq-u;QbXV;y*bU1aMO#AvX$tu+bnE`tv z)SoYjY}s0{>A_m#KOcHOEVAAot2@JYWA?R$(%lz&XIC$f?ml*aJ@EG>*>|(&=RUZw zb<y(GyF%V4C_k>VXlr#>QFM#yk<?(hevRY%)MLK_f=sU;Ji422%8t*Q6YEV(=Db~9 z$GN1E$G&6p-~6w9y4AdM43-=X$^9f(aQ^U}sjX?L(QNnRmtE_8FKoH>SkK=LXQXz@ z33f~^-uQpxQj6y^?|8p<D!kG<<8sMjjW>B0m@l+FFO-<qWO?Ym$&E?d_8Fb^;QE-@ z`RcQCX_~#q&NHO}68rg>Z;5ke3)JOTE#iKVmh+4AMZTo!2bpa=dU|yqSEM$!q!>4B zV*dI+|DoT>iWBdRm<tYP-Cg?Z%CqfSzEAu)xegU5?MP)iU=-1H_~9+nSIZVK>C{J< zb15-gD&2PT>5KOF+Ica}eymeBUv_GKwQff2&O;gNEyMcdmP?1<uq(K4TJv4t?EJY` z4)}0I9@{1@aA41x+Xn)+*Yh{O+#Vs&ljuC-=Y;yBHjz8q${PZw^sQEYo!PNvM|0A( z-*UVMBl}rhV=W{;xc|$(*8ODjJpJ(PJJbKM#Fv<M<u%;Ptg>mcmXBZL-EHvOebdIK z&um;i9X-2rxVRQ5SXmzW@Y*Na&$sxls?4FA(q|6v`lKWzt(H1_YnDXfx5TQXg|{Z0 zSivl_I5_gI1e>LmboE^yos`#}9i2;m+*$S@s34W|K&-;q$awa!-G1ditu<_KTIH`f zth-bGf6v!NOD#9o-pDgsdPsGi|H}1;Uwh~9Khw_4;w$^Pt@6psn>vSBSi+8ph})zd zN_SB{x6x>x|J){b!AG*}a}Muc-4^w!M8W@r&D+DBY7MHd3*=@9w|{m}klx$nd3{$* zw%-A+9p#s<O1ITp@q7&0&Oh&s^!9|hPe1%BZ$!PaF6%$*eUC|CMg-^YtQSW2efz7g zmFMJgq^wO9w$qyxY_P?la^-#{3xmTwv+Vw`-0U!Ch`M7OZIB+OUTJeP^w};hp1c*( z9I<b8>r3}r{wq`H{CXqnhmxj}ovBj(<ckN({l1GeTv@F>v*G0a&>Pc(>sJ4|aHP8W zB47Ex)uslq7kqQ{Qo5!m)M`1+7Y+S$+Q0E$;jYMzOus<8WtK0@{^xAr{_OjI&hCS% z_cUhIPuKraZ17}y;G+hk!W?di3&Jz~nK}91$8OgbRa@;{$nO33d234PB6XYHoS%i) z&HeN0U2K}d0q@qM8}D7}Jg#tab|h2rTdN<3cAN|QUExyxFEwEDE6(#PQ(75rUO&4~ z(Cy&u9go~9w(oqtmuGX#e+lIeirU>;=6~KlDmM&FZL2rj_9j;DMzQ*Xnjd<)mEAul zg%|D-t4P$8U#s?NBkPCL2Y63dDxY<*lXtH&S$}TR#_|WHHTE_9-X~4w=1zTl^F`mc z{kreMPWXIZ^yA9fw1Yv0FBZHiSi`lQGwkfoIFlRo;xWy84_vyQTC+v>u-yFq`~FA& z9hB{qU%tBJ?wQg^?_=r{eusu1opI8zEo$x=rt`vQT)UM0UUus3<zBOQg5mBTRv%wk z2w!&I=JviV%CjnTW#k0?o4-rXF4#L&ZpYIJ5{n-=%P?NJwn9j`K~G-la4q|1iz@!u zKugx?>z7IhuL}ApXC|OKtMR0UP5ak}DY7p=%OB;ITC?--<$q~kug4#BtTo?}xZ&g9 zh;`4aG-clJ_^iJA$0?um_kQL7{zyNVbmB+d#GCaSBR?hHjed8ozE`yBw@X@lQt{gF z?Bxj(zt2p|C{JK$mi(Rg{lv7FryK*e*SnPXTAV&p?67P>wf7yy?Xvf0%!p>*C;$GC zr^!rv%jDwpI$n!ArfSDR^!D?;41GFfb;9~X&m9V!FXn!6xc<QA;RDqjMhz0n*1QuD zG5Fvgp{nLKi&a6))=ns#r6PX9*;iL@s(z5>F=m)wxcou?(uO`k#=q^{^VjI6%#_sb z)IRw(iEY=tr<^(0qc0S0H{7*8(O{ukT)FJ4LsJ)QGS|ydc=TF$(c$c^PI9lR_@DfF zcADejYCH2XBm3p<VS2|t-kP<ux4o#$`0{-DEj_y4I(=@t6#72I&buOU|6IiTubuW` zy9(Qmtu#Ea{Fr$!Q-#CfWsZv%Xs#*Oz4N-gZPQZg-EP|#^4|G5|Bzu>=9=vt=Qlim zaQDVPIpqy9w(OqIGB?+Ily*)FKJ`52*_Og*M>wWs-sSc?uuQuy=E#(7h3pSmE%)rU zu2=DM{IT|5U+1BZ$;zMV5`!1mbMKQDPyV&J**D4AmNQzkpo_tP`v6n?*$=1G3xs=T zy$YH7@X?Hp?qv1KwTn{?h0ksIDd~7Ae}_rfx_uq$Ml%`?Y-haF`cSM%cfsoa4bF#` z6_^FHNKc+~IE~Tor$&I~qb!4+TP{7+y{^D^x~aH=@y*+`oaW$^#ShGUiVQi+Hz(hH z9W1SqadTpias>O&4NSK)4j+B}JaXf4Hv23OUf&Bv-`IW`?muiOFngA*<?k~q1>G)c z%qcE>e<JPb@(sxkC$D#5cQ)H_+uc9u<h6{L1%Y{r^TMXb+e^J~5Bk1m`^Puh+pg?a z&M?qw3NHJv8Ftw0!c*M_Y2WULzBBg;_WhVT$4V`$qh8kk+TFAu32sxhCfUQ=WFD$r z`@ZPWn+V~lF6KsDZqZ@q*|Tdj4w~6MoE96L{(1IH>5m5g+)irlKFfd3_>c01T?N-R zmRHW&!Fro_{+Y&gFPKhhZr->t^?LuNquJ-2be?bBE%h&Hj;2|++u`ay*P}Ds7B1Q{ zVTI9p`4HdEho_c_e@ff^=(%(AXQ>&i8Z+;R%<8p$yjt*eG-K<-G(nATi`=$}Ix#<N zON&jEf8SHN=jZH=KeZhcWY+4IpKlen*8aF6d(UYzyCXUh%3++_*fy-Zu$+DQA^#h5 z_UafecPr&Qy`BBQ!|yMx-TqHFWw<?a!{<bcjDNX{6WIM24X&K6ayuBI@m@HQC1LGH zwgib?&-ogc&aO9|XQ~seb9~wT=KST44(M?_eZL{>Pcrwdk4$&o*Yo{VQ2aOl`M-ZL z8#hcpB&?MuYp>zmvYnfKy(yQ%^Hp1%o3#43eP7+Iy{YlGTBUW&%reP**+a*yZqGUR zjxF9yr%9G?PvXU+$L=4?E@zc)s1*<Tc_g%C<J0&LdD&T^>rY?M+QEH(if<jy!b632 z_qWB{mA?Of>yGsF%-{bbSU2lQo?~E2{N6P8k@fOpqSdE2zn<l3UNhBdKJ(rjzCX$q z?$0jS<hJe0Tz7chYjMHz)t&nTC&&o)|D9+ou&Hy)j8mJp|FiC0FZ0)2<bYD5+Odu= zlZE)^sm-d%>rH;F!^Ns)-@aMB?l7kz8`J3z1-gBmP34Ebu3(sd-}z|eO-q|5R>ybS z1h*ULvrJ~Yx9Q$A!{V5wD|bq88z<gt{LdQX{Lt~pl?x2fJM%(IZn4_$_ej5zCf??n zx#-7C`F%}_``JHtysvROI@@}t$ezdVoLrYH+>o1keuW}u%bM1^2`6SW<lh#I5R%+e z(c`#D?n7_mq?GUkk9CGWF62Hw!KOa%W$a(82iElsn({RqN6zT;9jM-z-fOq6;XPkL zk;j4Zm+TDw2d;0HQ83x?;Goxy2XaPjZ3kDgt=!qT^Fn~~>j@j<gYLXg$a%td&|0}N zz1Pzx^@-yh1@;=Y46h_D=Z9*Z3y(QmY5CXmeZEi|H~WJsvtx(uDBN=V^6~9Kc`fb# z-~Wec|M|ZEkNBxso0>mfj&uE3@$>un4d?aCoA*ER3S9U1|G)V+O_FvmT2c}`?bi?f z6#Jk2muDZayT2l__T33P{WYnzc?a#zPqF*|ICR>c%a?xD99^vwt9f;O%KZ5yk@NjG zo=;x#tNq6FwoA{AzE$q{Qpx)J&*tO5_Drd@3p@Yo594o{@aw;9&Uf!O+_wM8(fb_N z{XQ=G{^sMOs-4>Z>(=hL_VU!}^W_h(KhoQ?$00`f=+~I^x>~oG?<G$@&F_4@Shn)# zYuO)Lwff@QyRx@O)YUGw-TzJey4s^(?$IA>d9Iho^Zb9)`)q!F-r@DDkA7X~QCHgi z+MU1XXB_{B^Qvoqew})4k4<dM`z?>IpMA6|BIfzFN1u$3Y@MvJKI`Oqd$XrcC%=C@ z|Ge45>$Q)n6ng6aFWa#$<H+g%%Ik8EZcTQs+Z!K~Z}#AN+9NByDe>){*_(E36TE)( z>(8y#wRQ7nJ^B@6TbHZ9?(gfOof(C>@5TNJg)iOK(JWB+R^ZTS@hgw6Uq4#9We1<= zb(g}mitCPNeR|DO_*QvcsOgWdJ9g*^U5|WZ<rmZ5nay6<D{#H-QPitP*HsGdK7Dfi z?4w^(cHEkybnnfd;-0znacjGOcfLMsw$MLj@sX=~>pmnft&`8%Q|D0gt@HKdM^*k$ z@AC^?pZ4gN_58JOltunow$)!#K5FU|GrKE$#*Ram4*DEmFD-c8d}hD>rvG(G|EF&L z-?!mE--iEvoBs1%f3*L%{gHpo@lO3gKkv5{1U@SBd0Ct!mwVpg$91tU4b$hdq#La} zoX7R~Rqz3=`SHiO+A7O-CCtdS7vU*>x4kLx-CbRaAN$Li`Zs6q3%M6<s#3@76tH2X ziORgiCaUw6Z&8X{VB_(p?^4?jU)8=Jx=XuN{x4FopBO7`c-@6V`j(MjNZO<O%nx1X zwbp-k()yje(J0#T^rbe(h<|MB?37JE++H7H9=^F|hsz_U&eJOYT$84sePqyi+xySH zBLXgt>$D5GJFPwL#6McDGEb?{;n7o}{OLa?97$LG7yT%$>_dO&oojqgi>G8yP*!qJ zIG=8yCuVq|-Ehw(lc|OA#|*@lamD_1v9t+Ww>awQTa|Zf^(OsLKI;Cb)2O?mbCbuU zpDtSM^Do&leiyA$Tl81{!FRhS{2SLlzq!^-Pqd8fzmUd;&)j8yeQx}0O?fU}vc6X+ zKXjk!y=67-d)#lj><Pc=7qjk<#~x=(zdw6}JY$x{BwYV`L#%FnZN~p{iSx%NaEn%0 z|1N*Rdt=?|6OY#MWjv1VkZZqsZyDdc_ywQq*x&0{9Napy`M09?C*~>U<puUJlm7@j zx%W!2vtMhL)RW|{?jJ3W6#s>0y3}}es@knBQL|fIGX2#zwR6Eioy)cSh5Uo(sm@#1 zGx62FQ#+Kmc;A@$v|;1_$%no<es5Ej4?AaE$N0BcB-z^i(^a2N`>8+XG5@LI`5S-w z<X_HT&U5a}H@;cFb?%+{`JVq;K3Vy_J3n*P)AKV^KHGM_eZ`d29_8>R=)P*%>iGiI zSDqdzy_(<odZl!y^orS?(koSuh!^xduW_|>s1bc$aqg;DuI`DgA^aarRed(6%<?qS zmDtW?-%<9ppy__z;`>Gu-#?i1XNK^vN9zu4+xXor*|Kf(q{mxo-W@LrZPmZ$bge-3 zkH-)BFZDg2o)_lDH`XxzE@__7XqG2Z%knLM(vxz}PxhRZ8P^jP`ExCmB;q1%wSIj! zURl5J&x{xMGtR!cpYh4F`0Ar;S>lh_L-Y%yw^|pjxix)9vsHsdkgVEC8|{;OPW)i{ zHRt~6mrU`dp$DJyPI&LWf2&j8vPW$KmNKWS6}CJ4|6bbYAGPYiWJSGq!WS&B9R2%2 z>#=+69sZY-<QLS;=>GjM^d$fKNpllt9qrwkdBk^1<Pq7a=AG7>@dEZs)+pqyTAOOa zmLp*GH>2K}_ttKKofFw||C~uZIw|b%qhCVXr&|O*S|}txc}J;lcd$y`wrBr;r3i0+ zyK~kZ_1P-(a~5seaz!U^X|7`5g|Z04#cwwzxmlm65W3@irFOO2H(4(oQ8SZiITlCu z{q(s};IZkUz)PR2I)0b?1ioMG6aIeLPl*4*zmz?axerSF7xL~6d{q8Kgx4-adHF-3 z#MMWWIiGxuvYDnOc{{sswzP+t^UlR$+jj<S+BqplVp-&$mT%@CFW=IAl)gnu=Xn<2 zuhyFWsD$$ZJ(KNDIA1*X@I-&onLPpAzrGmqKC+L#!Bbk?a<;(C&hf^d1u4c;{6);F zbEchje7APrnn;_t>V_YoYjr=0==NE7zV({3W|_e96_Q6*z7lxE^VRT?&R5Atb+5FK z{Jm=P$nllWBgI$NNBUQJceJlO-O;`}yJLR9bz%FZc`9{bcm4kCiPF0JTHs^K+m<W$ zCijRZ$QS-!b9i5c-0ww8#MTHd-nw{={;7%a7x)bAn*S_f`@L%a#P~}O_FB1fe30Pn z3v+UIIIk_itLwC6Pt>D0jn6{I4k$b^l#o8(@}Z8s+HFw{{~Z2!!KWAW{~!FM^OZ%r zp7-^)!#}SbDEi~t_erm)Ui8|I^8slL=l0%L;y?1UZ1n}szo9aRl6n3FD}6LOxZn7m z+@a+6>KEJU7S*_O^zXgD^v3VGe{6y`SM+@||LDZqe{ACYt675eOIn5M*O;orExPOe zXT~Rnj~uF97M?FX?nJ+IyA$rIQWx~n)h6hrvrSZGOT|>P85LX2=2Y~4Gx=!sw(`-} zD87$nxsy^pmpob;#rTo!ZSkYtTTzdc)=sGC-WGZ((#yvGcjFJ;xBibzp6V6udbEYz z()s1VAL1{pFN$wBWJ^n!vpdWA&c42lvR!X3pOS1>ex5vMyYsi?IpynntD}3~+HGB1 zA=hUkef;$2t(7qc_qrwjY`0jxw`-3_^NzF5w(^VTnYY+{+1>fHbH?Vq{hvH%*w^c& zEU4eV;%u_eufmxLAAU~1wD+3V_ghMLv->YF|J@XRh4ucs$*<(5zM41jRh&ra!SmBq ztlxW<U0aoWvgOLdUy0|Vq90ia?SB2i(A4Y6-oGw8m-ER7OD>YX?Rh79@7l<kaA~JC zx7vi`!{<+Xa$NX+$bF@Aq2hx6Vf)qQEn25o=X=-B##vXnF81%l8zJ>-|J?tE?z(Pz za^A5%h3Bg`9@%^)@5tt>@A$my7pctm`!n&@{2#`p79Xd->OK;`a=lRfT0hmeb^HAG zMAbG|G+RxtX#d6c@%yXxBi2_{kEFgbdUW?y)+5_j<wvTo_D-r1{OGu~<%fHz`A7d( zjE@e#(m!(i%H<>KSGbR;hb}ihvHa?_Bj#7P9l3t>-4Q<B=7`N-RpS=f`RwtOb=(sv z>$=COvbDnW-DHdPfy;#RL!TSxaemZ!v^iQ<LfO19*4uSo>+8E0tPJM=S-dv&@zY41 z<NGbcB=wK+9eKMtVqW*t%dZdon6*aC=%@LHKc+FKxi-{van&z<B&0LH>-W}BC;lVf zvJ9^&s9pE4+U{X>T4k=imzBS#l|IK@f$jC2a|PPP1ON3!oq6(}<KDp?%VwW$_R%$; zQor<F>eJo{(^nfDciZ9kpKHtV<_YZ*?>e5|e=zGF^Uvrz+FxDcy1(%Ve-hZ<zjLRp zK=@%+XP%x3KMD_Cc<;YMcm95rFAh9Ch0(b)-)y^O<UMJo?$)QdD|P34<VLDKQJfa$ zoqJPd>r$Vr(}|w{I9}<58D1B9Dp0+j^S9!$b6jypew26qpYX%KQ~OR$pRCHK&vlFT zTsr&whO1H=DE51|Mam@qo?~%s+a!x~+xm7aUOQpO<h3()wCC;)iF3PibzA?9Y-^R1 zhxh$wyP=b_;w@vm>&*l0-xarSbPV2Az2<9q&k<pjd8!|e3*}F;Sh((Jvx=Ph$K^u# zt55%(xgz4<pVpf@_v(Fru0P4Xeqq_tn>v2mV-?<I?{>R$zijdk!P&34KCwh|d|bTk z*O9}y--YdSyVc}Uy(gv^b;NJ5J@!N4hW?wMoAtIV7Pom9_|NTK@4nJ&&6Zk6*`Aj! zJh9R&;PNK96HAifk6dG(Z<EzrYQJyZ7a5mF6NUE2_8&LC5#LZHcRZ(}Q-l4t{aW=R z=40NfGfkb?-u!nvaiI7?zG_@_|M%0cgZ4Z8+*P$F{z!51o9XH&)q``z_UBbkypb>M zo^wl0V1Mdt&zOYS{(siKWq!1ETffT8^BwoMuT_alx$XRCU9SB{q1)$={NBoa<Y|=Y zNB>*4kCda{N`+OLKMIag`<VH*@R9wNi%06SERQ_jV)IDrtja&{Xoo#lzH$DMb$*ck zaC^L=S=`|pI~r_`vQ>VvePSd1hCTawd)=J2zc*NZn)Ylz@oSI2qkl+k$K)F6GppxL z_-i&JeDZ|!n_3d-T$L}Tulcp-{=w&em+U(H%KLM}lH=+xXKH_O*nj5mCsnf<`Sv0_ zmVc%<DYD1uKUt{1@9?L;Qg5`kD^E{8SK~0rQX_{s{;$SI#e*O04*LtquRH&E+x{uc z&OayqvdKI8n_ptP_DX%Tn>zQhqWxo%w3Y59-u9}wvu*Z|^xJli=5Av?lDcj3k?NfE zj_)`1ysFk2tz((p%A2L}<ttkcqxmPdp2iOWFJ7O$@jiE=`GY-z@~3K9ONBS=VR^i; zUxWSk@3x}<4QFRgI+N_gmLsQ^a$ufd)5F-w$DMcD|JImhzwl3Iz`OI(lkD>YcAvYY zvu?x9tV=sKTvb`Osj}nzZ7G5H4XuLl+qNpKTj?%%f7?-^`&+*%uUlxZbCO>z?5p4r zv)WB6_ESIBFX%n=Z03v4!7u)ApXk5%zrC|vb8><0r+l*ty?xAoPx`C!Da=1q_cQc| zSjjxD)*E*1#nqxkQ+Xf#VLLVdxapyb3_qB@d1o-kiPv0R!1$g!qxvx0w0UB@I<{}6 zBC3Q`Y-?NOK7__EWdAc+^QENLOG(w2lKL-a>V0Y8Pv@|Gu>CsgVQa5_Y&L#Antlsx z_A~Yif0PqG*4h6jK79L*M!V@dCdN6)EUS086A|xo$L0T&9W(cJ?dbj|TR3H3t3}lR z)*YMcq9)mU-|<_o)OR)e`lctZjq1d2Y2^G{#(2a*wnlxC#LeD%-S3Pk{Qr18_b=jq z{m}DN<rAwP<%;)({;}BpU+`c0<pgO9DW>+97xceMH`OG|{<+U|diIMO*Lf>rKluM{ zyYv6Ty&G-Q=2dw5?^=@Hu_S%T1?GQ}s$UxX=S}_6Gxf_8&nh3!^Shn+f4sF_$X@ex zUqVIwo8~qfGck{ij8Emwo@`XSXL$HVhKJqzh0$}?xC?y0B(Ea3#$9;%3)zm~uX;x$ ztIQwSRpmeOv5mcC?4TuosKWAwPR@;M0>4ZcfA5mnY5nbM<`+-@H~05X5Z+LquUzgP ze>LyOU*@V;CQSR6F1Y_LyJe^Rwc3Ca4Sy&0?zn$oo`&bX%_{SCo*X<E=OlOTU$ys~ zOC7&$Tt8V(S#I{oPG0Y4jm6f#l6N0X{B`-r;xEsae0na)&-T~p-%+;*lb2t#-<hFq ze{;^w6Q|_Gy!LoKGD=L3J?U4$UO0V2aZk!~iA@h(?>?ITMdp#=uacEDY<niRlokEt z&UpSg<GKBb#T(_b+aJ!f>ASfsu_CYk+jd8}wU767{bBkStW<k=$5~&M*$?-gK4b8) zCT3Hm+D&8c?G@YX+HYLAKjqZ@BpaD8+&?#F-1ga0sddXhICr*i+RuWCM_#M^Q+!ij z%l*Flop_nvls7RRW_wmf?+N(d^MiSB%a7#0;*b2l#CJ}AvESRMUbudtwR6*-opJp? zwD)R$EZS@Q(aCmZ#ZtS5AIyI@3V7Sw9RDF&do=f-bgigE{7ot5^GE;XHrVk0-Y)v7 zre^tC=j596F75KWzU1)itK~kP!#3^s<Jx&SIX{cn94S`)7jvc6BC_`>cgc_6OS?DJ z$bGv$?^w;5rn%M9p9`%fN^W0o_<nJ4ki6qh{@zM?U!IM>ICd;Dtk2I?`l%T8NFr6L z&|1~uPTWj)ndKq^<w15z@0RN*zFSk{dB^pp)0<GQPT?tck7S-od}Mcu^U=Oj>nGK) z7EUUfY7u!cJGv^%sBQu0yzqqGL9-uJvewzN?Bv~7{?Vq0XWq>Hw~oB({w#F-UV7oA zBg!guk&nz({y9B*ulnxNl}GL>a@rp!{novwRJb-x%-!22?h&g{y=vjiBcek2d3<#l z?eD|hI_34-Szd~nG(Ccsz3*^&`zwX^hkh$7E&BaGR90BLc-i<V*TwQneu+hY^o!#X zp362*XtaB)l=9%Ge|YEKhc@S$-|zn_{Pgaj$~o;_5*g}-d+akmMtgZbV)c@K^nD87 zkybCQkN#d(9}{c#9r?M!sNu(qPZA$JpK^LW*LdVV_2ZHGnwLB5!_$QHgP(bs)i~@4 zj8vMcul_GkQ^jsY%!HhMN;hkKH~kd*c)ly{_@<k#f8^}AAJs%<deyjfD*W^9RE%3$ zq7v8o{Pmpc8hbmsr#w8;dTR3#>8aB@`5*nP3aDfH7?x`Ekx#Y1qJNVAo^Vc&()&|i z?bE*+>#`>}(ko`wnh7}?Q{L#L*%-)NXYH9EerRpE<L5((|K>0LbL>&QT#-X#ai{-; z=UN-e*0{`Den2F&$0ojU>*EBAb>ctHU7cBw?GroIVoB@K@7{O(9{F^-d;U@T#Kd|o z)GkwTUb4~e>02JWZ#pCq-)$uS;D_$PBD+Q3ysP{?YuJA(Kh>ICzLiC;^=YE+&N>PG z-sn$-T!#0TEG=C>W7@U7dvw=UFWtJO#7^hS0f|bN7mXG&DlaSjE`46LB)x4(dfx?R zLrI63Yc)PE)M$^0Qu*RMr$*)E8UZ5#W9?R+BZsvPe(*`#dL%pQ)6R^wC2lNF?{9fh z95}OMX_?UXFn#ZswK7Wk7XI<73H~|v#<G8|YgS+HnEOihkyKV~`2^=HeMh!lU3Wyz zbmESAv;6Kj$U58!k#(ur|BI#2xKyQ(`>W-nX|K2^&HH%7_loDFKRKTFraZZ?Ru@p) zZ{Zc|C9`;)!n+mg6yGh$Q>ydOReQH8PyO2}YgOCdosX{^p7iJaq?%Th`k6bXNBN$q zYO{!4`;@aNeyd$!{Z_+|4qGih25eRSI613J#dyLG!BUBj3ST`RDZbKpbo`2VNBio> zs&jWvI#=^(;wza)=~tN^J-<@k8GMz$BR;@hdEa6k^?j??sMH1AJ+?#SQT&n5k}~ek z3+BYRt#i7$`^58)sn;fi8L-D4*l8&9Q-6-MwPO5{orau0CoxriZ3qka&h<?3{FWxe zI@iYH2jLUfKdPCnFLADpJK&%Gp7+z&{)k|^z3<ScsvkY?tpoW!#&<mZllx}wBAG|~ zw}{F=7C4_e=}e*`^Tt}26AnD`qCAE*JWm&Yh^yzQ?09a!agVHB^q=S{&NkuQy9DN6 zSCy=8IWawAr*hM22Old|XP;e43*Op>M!3Ine;~<pEmuz>Cqw&7LydKy_^<7I6Mo!{ z&0(2;{FV24rG++nP3MyzZLhTG|C@7kN!rJNw>lp=);9epd@J)&_*Uwp<y-1I=3jeL z+We>InVQ^6Q?<IVY}Y@NuFWgdx}lR(Va1e`X0T7(gzvVU#Qc}%9iHWLo)@lTxc#hq zTk||~*W2wHVYeS{Z_Dr8)_q?#>GtCjZ69YH72eA7$mXr)BgtFFN9uBAKKkTpeaz9F zf8zpAQgC&DMc+5ULWkcjlm0hV?Atcyhi$I#$KSWUACb@4-D!WNPUT<7YK4DJyZ!!b zy|yuKLU^XW(E4j?0_!g>6Rcl-RxNJzUe`T-zb91e{bpG>aoenl)nOig7H*sRLwRk> zkK|nSk4d@HRrb&SxLksNPrO-@%^&v13wbJa_Njjp{$x=j|B1h+H~eGm=2slr=L@%O zv+#M;CuFZvc-uo$e)133PTtPxo_m5HT^4G0V@!W+yyk<(hR^mt_IX)9DU>*GyST!} zxmq}|PH3O>v`(YRhX2|Ve~RVxPiX&9!+ARW!RJk!8vm{KO`fBlqLBADu%^dB=d8=j z@_=W#ip)=0o!F9|$sWA0oLjZpZt9yz-B(Wk*G(+Rn|i9dRqn^%{LUk{Rqn|hJ^sc> z^L^7N*}$4JUHADO&#-kX3|bbsC*0b7kN<9mn00qm>=xWr{uj9UI{&A{wR|51b*KE; zajok|x^CMK@wbYPCPxVsHr{IgAzP~PF{qU7qj*+B#mrwzL-uw3(Ee)usPt9bquf`C zkKVpAd?fqI^O5K)$w&EDypKeOxUX2c+;7Fw<#{WXE?4~Mw^g%n<*m*gK4(?#E$vge zxB8h^)u+zz6`woKuj=kNzgoLPf5qxf{Z+3!)~{0UT)%R8=jy9okLp9Jn-%T{XA7*p z)qG^uwP`n&m8x7b)&J<aRsEykR{4*TZv!8dUtQkmzjAYj_Lc1&+E>4Ka$jBF*`LvR z<oA}?BeSnO?x}D4A^x#Ond{k>w-(oT-eP!vV5c6>&+0j^l_r*FJ!o5ZVyV<0HS@i^ zJqKegw(~gM>-+prBjsOrcg~Z!7ImL*e<<Yo{&jn!VV%(Z)3x4HoNe?EeERrf-Ie1f z*01{UCT`MCuG7;W?S3@d#q!9XXJ$1$&OG7|Yr`K}N9}IqnetxHNML)l>da&(wxl0B zCNxI;l1#00o9VUZJ!j4TJy8Zv{I+FG_{o|+x$0uTzizJT=N~dYo|C(LS!vemmVJ4e z62Ep$JtBB<n*Sr0*p5cNi_`q8T%zqfr>7V#(zR}Pi!STy+V)09{ibE?rs8!Mm<`SR zZ!m8(vA^}{ypkgGQ+ZCwj*b1QaXKH>gQCN_b_rCkUa~D`(ydQ>RW=9jdfy-PQ*q&c zp2zc5>~uZ~cJ{k{uH4sFVZVRAhP~L?=Rb{;VzvnX2{*C7Z0G!V>GUIer|$0v7TKFP zA$V%kk(XY!k9brk?dZSMykq?&r#UOXsGbXwOOp|1PM&<<T$k<7gqGja6;GVpVJ{_` zy!NZGYMjQ$-?_SRiiInW99P|^u<_ElM`}X#`X41btG7R|o3|pOPVU&PNtfpRu8eR# zeg5!@y^B@q!X!OyqE4#)>!0Lp6F1Y%Ch(*1bFIyt%QcESKTlzLl=s7D#%GhK*(+;W zRrb%k5%5i5|3VoRJ`MHG+Eed)+#PPaMyqXYx2t0Noo)8XqsDCm!_UY&hwCoQJ8pbJ z|KO+28_Vx+VXuGoXy$D(o%t=L-#IHY-t)h$%xTX3y>!=puhP{^c5Qcw-SAmH@Vm_8 z+d}sRYrikMQXWtj{^hRa%J=62Z||R2(fo=3W7<=`kE%=E7c0aEPLhf=dU-_kl-Q$O zFT;;zHSbPUwg>tB*;~|7F}-L~#rC3E74tu-f2^yyc4}wLPM;cwoq8wlE7~o(!o&T^ za4F+Q&ZUwc^-nP$*{}7slY7d$Bkwg=9+B7h+hKn^ebvEF$2-L}^#$tJ>~Z?D@{xMn zsy&J?H79)0neyi6lpkw8>3*zS>Y{buwZ`$L^2t9(cGT${F@Ar)Y~zM&>jNItzI=B= zTePCzO1N?=)BDNxoqMFtrxZ=N{$OU0zS#ZlV?XA|Yuiqqw1cHm_g`E^yiR}Uj`#c# z<>GzQ<0q6S+sqd>y6`@9qfOhw{pS|XOXk|6T@ic2;r`tNyYd(FezTZR8Qu8xM03o7 z15#Ibe#+X2cZu*+x-Pd^$NuZfLW?^654q_FAKca}T=1V?=KV=0xj%QjPc+Q0_BQ(4 z%JZY9VS?q^iUmjbkAM7F5qoR4!%yYH8k>1yf3Nx_S^VDmV_MO?AM1)*D<%}pt=LdB z`$ynYxsS<RdkZJDYnw_%8_6ZjzSXj$`BvYJ)n$tB7M7{|g|rK(uT<{Xd}ZR1y;nXS z(ahp2T=h$;aF^A53+LMSOFuU*d9LkwKF#x4^~r5}C-Jtc%)C6wr}fIctfbvhi#;dI zT{U~hv|BTGY?JbT6ByhnAF#PYK15!zFGOCsFEn0Z+e&>yIrfhVzqTvz9Sh$YbnH>F z=CP}#GUBf%<SXSLme|*soGAZEx98{liT@AI_#bO<<WK5BfzRbGHHY@TTXfFx&-?Tj z2Tm*2Iaz&(Xq8xTm+@8EQJc^E_!RDop69=vuv5JFoZce6BW~e=;x+H4zFOv4+U`;6 z-nHw3{$iKd7v1TB%gp}GOWiYpasGa-lmqQIo0c1%dwJma757Usnm%#L{+KaKt>&Iz z(hcp%J&|+$W0vTt-dnUzK`(H>YF+ScpFOd6{q{KjomjCx%C*L4ulm&MJI`zJE88tJ zQ@2~}CUif*THt<|aOeA#E06H4<uA<571-!5?HCh2+e>EES*5%MtR3$!iwV@P)l-XG zr>7jZbe(!#&~5)eQ_7}POevf6!}4wUqvu<-9*J++-w}T?PuTymlo{`*lC_!}{j+`F zTu<su&x-B5f8kN*{VS6?-(NTCh|b~{F2B$wte$;d@cX4>0?RXY9+`P7<k8+&Nss=% z;(Ao{HTqHWE4GvKl#-TjYyM&WmF4kF*&p|ws7*D$s>63Z=R5n()@N#YOYgehiOP2U z(;((7vsBgdld|M{f$vhzPiKcDtX0;pcfItpYl-pfAC9?`meflXZb=i^e)-<?cf058 z*t~7xj_z%9Z>*M8?Yr(LsGc$Pi0#(hlWI<<<-`e^9j?|pxQ)SI^l9$wNGn~x3syqq z*LRt1{_<VL?~+kRb!NZd_iOVMzGa;^yr=Wdbk-^DknZ!VjXRHLaCgoRoG#EGHeGQ4 z5;39u%kos?mcCQ7TPCNPw|?&AFLxCG^{+DF|HN}ObK|v!9Z|InKXyqu+c<s}iVv$c z-(K=f{ajePkbj7~!1Go9!u^+z3G`nt>QrBSxpVm{wvQR5j2{)=);{uiYkX|G)uZ>~ z1^2#{G;RH4U26HH;za8!ql$dV%H~~D3Y9*&{qYR@@3&!DPFVQnPsgo1-=})oL_gYb z?$W>TN9w9_`X6mNr+dUGecY)hcD!V(MeL*LDsdVgvpUN?|MXmcB-5D=nrwWn@-Hwc z-28!(Xx;r=3#8XvkN!}zEYy78zozrb8)~el9bfc^?~iVl%_qN@^}jhQBZPl1{*(Ks z_toS@GS}8G-w<=O_-N;eikcM?PHfjUneY1eRrZ>uaO%EeSO3;3GG||AcVfG?fS>j7 zuFW0>Xa383n$@e`+~c=tr_YNP)1>JspAA?3v6!a*_~&!iCviV=4#}NQO?X>y<n!-C zyB<urp(^q0ztqQRw!DvYs}DWat+wKtyTPrbYx|p*x>J`QiMEpw%>Vg8)bpABqkS9p z^-Qghx%b-q&)GLT2RE?S1RFe=FVAVafvvXZ>B1l1Rcd;_XEoH_P&k<*@+<M)ZIzE{ zC;#nrl6$td_G8%mc>+%j_WxCSb?8r7(4%-&Tk%$#Gu6{uc+O-_SCuq%{4;Il)NIZe zwr5JwO{&51Cl17j%u4v0AJTMnzilhe8T(GB^F_xzh19+8ct5(wX``R3{m-tkZjp^@ z<MXAbkN&ylmsC-I`;p}@t49s{rdG_`H}^+wt^7x)zZ@Uge@S{i<6pVQ>r&;!AG&{6 zsT5EDIDzF~oyCpMM!$~qzt?@P_Tl?s#cwqyHh--By0b}9;J&k2$%XH(O{V8-l>cyA z?HAp5>5yn@?xFv7>Fu9N4}~9ajAxa+$GrVV@LsczL3`~!rdK&XO0AOk=w&;nV(Pu9 zNu6r{yxx2L*?Mns#m;$Nf7Z@(-4j;ta_O^1;lzJBkN3Xt&ns5_m2UX!xf|1(;Q0^U z>t~g<fAYULzjwm)MfUOz|9Jl1-)Q|^@x{w4u}91vx9=*JXZwHdeBGiw#pNHR*-y47 zpV)S~tb6?pb)opJ&jrJ8*B&u{+r4Dhe4+c>>OE`D?`w-Fo+4CU@W<uO)xtSDra#ty zB;vj`q^{lKY+=8}-NbysC;R$l>8{!3+o69uTFCx+hHp%6zv{dvFI;oVzbKYj{Sv(Y zyrRY8&c_uY|5OUSk6%8rR_460{evI<A>~pZ71|wbjtEXTbziOS%16GB2FKfvD9d;+ z-Id+xETcN<Z*}Kui#mleYd*p2#WIs${nPvToT)IpeQ)XncWbB4`Nbycbr&x-{YX9D zJgFxAQC(l$k-xGlkMPPkcSu{!Q>(l5k?CV_pW%_fKFuS!GMhV&TRk(ByC!?z{BT8` z?D5l;b1Lt<>`Q1b+_J-ZUwB%3ai{1B@wXG?^IZ3(9KV09^mzHnHwA8mLO)l@p1b#7 z=rP}yc$c~60sC(;pHF%7V_h}>N1q8NcT_i=aps$$F3rvMQ)A^F?I(#kC5Jzmu=ji{ zN%?1f!bT@W;h+3V#dGNq^1MPkA8jHYDcb7XcJto$l*3lwxp2U<x;@uR0{J%DI=^VV zQ5QRDrgDnHIp&CaLT~>w>=eEAbEeAYofnu5|F<S|{7enHy?<iOCSNUkjV}#<`Xl~n zOq=f}*Y+vYiS5{l%7yaB4zV6I5c}u!Q!3(n+l2N{vq9pzo^J0?rY7vUQSDSIn^Rqz zVt(&?o#(Ph|8?xg{E816lpRvdyLkCkcc1OreI6oJ2{o!;x7@n7efiVL4}*SsPx>RF zQ!jX0y}L-Fd41>aLpx?)y4<zYyeewrmu(Z;KSn4#N#xn5{PEDdY5sPCp91!|d^(wR zQe9egrmqu!&;7GP;-0yhQ*TwcX#Ed<!T7UlUfBNd?^}M&Wjwi}GsgZ5=d2^!T(tAD zxhpl+PtG`+d)Y-hPkus*oJduIUFQ@Ft&5vBCof8^*I)TZa3T8>cGalbFFhf4K`&bB z^%JKYIq&sn&XM!#pG^1m9(%s4ZjsEt>wb^!t-7E3vF5t^5%JjU4*i{Gg7KHX3xvNG z@63O7aDTy^vv0pG@3b%8>oI3-zxuot&xM}9s(W<uSM-tfFSR@McXoB=zj}J4{L6(7 zh5J`$3ub>aJ7QLyp44vJXmP}D!j5f!U6Z!|6;0~5oxfvVtyrP+ZqGX>{%IB_|1Ns; z`_1l-*|)w6n{Sq%@WfxR{kC>T^v%^Ov)2pgmz(CuJ_%j-?8xfai$`9^#&+y4{;GWM zft1Idlcr5OPE7UPb9AbA%$utIiuTvlkKV`b?(mNN-BG@~PxyUttg79MSAQHPsNcBU zQT*0l$bVzM>bcGSD&KCa3!dMy-!11x?U7}7Rq9Uv<NL_;yZXrc8}^EI*Z-M*{QYg~ zk<)KlkHp_H7p~8}@3rUDzPT0KU-Pewo!()7E89lm$>Md_j_BWh)Dge2vh(<@Nu7V! z*&QjCIo!eAm)`l@I!>+bxM6R_!eq{m?0sjCbj!GR*cZvD|GV)~`(t|F{Z9MxKdygT z7ti|PeO&j^Q$F{U3E@_++@q}a9(gT0^T>VcHo^BLHr{(qf7JSzcU<L>ZC~UhpN1dd z*S8<hoqP1i+PV9M+^y=>>rPbm@7R1<RP>46xm|(NYJ?w|ojZ3VcWzwL{?*on?CDyC zyEe;z6#6ajDD<0pNBuT?|C&p7(<&C%3KdTI>-#9<x6-3;-}F0!-|SxU>F<%kZ&|0! zs!y9;iL0)Er1x!k=iYDO9lLKn7gWEoU*%n*zS6r)eRaQ0@@nsL?cL|3{hw`dc%3`@ z&h>lEJ~C7rKWhBO-pPJ5xikCa-A?DP2ahEF(mwM2wQ$Gmmy<i9U(`LC_ABQRM=fXJ zoPF&(n&bTLc-nj4iQMmXCp2F+`DLc}ov`;Fcl`R**Dd|7B$p=d_^0Ks@1uw3<U8Cg z{;Sj-tDIV~<g?nxjP$qL9P2LLobf|7{qweIKG~1L=WIN(-fFjye;J>`yw^2t74wQk zKAJrDKJxS2$s?QRT<+w3&XhFG-s7pf@cF_z#jAgVCPjMxnO&^@G4grfBkyxrk52o! z?^cK}yr#VGRgPQD*_&-Yc5OEP=$mf!(e^n*((G)OjqjxV-xNF*x?XU0@{{{Y>mFD2 z@7R~kS=jPg`_Z*^qDLmK<2_QiZtW4-nA;t@cc1DIj#clN9J60oeYc)K`p!Io@5Pq4 z*ee^fn|^SH+k7lumw04xta3+uiLIy23DZdx9oak|3&PDldR!Ore13b<xz<VNzIPtq zWv8_7-Jh<C<@;vu2+>#9yWB7M{-VFY{{{bDYXbIr{aIW$`Nx_#<!h^?o%Z<WJH@PX z7vL{GDzJQ~QOD(2e&O^T^OVjN`6}LfZ`8T{mbq~L_WuqsS^uZ*I8%3P)7iMpmmA}^ z=4=iZ{-3emyXHn-H}@yQYUM|H=dK;$JZE;qcCKtkwdHQ%?`6vb%(vNl-wBm>p0n<} z`ne0@0_m^fh0|YZcm94Y-O2uHcZd8%eIfp9>xJys-&d4dR{l!h$?-38N0h&qJW~JC zc*OozyHItEa;I~wzJPf_ukyP0v)p5z{Au{X{9Nr3>$%z^b=Nr`F+G2O<h|v2Vg2$r z<+z7?y!Tv^ymfI>=8cP!GJW^ldZ`-s+DGZ%)t@FGFMsnqlAN2}as1}Ksi(dR%Y$-J z_hYG#`F$V!!YXsrSKCa!@m|U$=3&L09j6Q@{aBRD^HKG9$|G$)`H!aUo;7zrntkLw zp7kiYZ|{-+7JUNu3uBb`J>Q}Fa=UHHOa9sum+nux@$QZ9n*u(CGRt_CbuVT7V{ThE z@96t%o77({Tp0VD|H#+5`-RO5;--DMKk3W$_c<@~9p}6_qw?>D<+LBc>2e>Vp65L3 zJ-73S>$(1patrScb?bbA^c(7>oJHl&wH`Sg=RYDX)81ij-6x!17_;fd%@x`wEusa* zEt5OC=icr7ZfV@XZzZqx@8nOLkBQGK9_?DU^T_czw>#@gZtd+dvJyNO`}61FD=rr9 zb00PtU#&c`e)j{PQo~K>S@)Yq_Re|Vbbt1rDH?lU&r`Ae?KbaaQ~l+w0b2GwHn*4F z*<1de=aY>1AMXp{laEv?Y<?IeG-q$h<IkG9k$<L%ook(RH2<2!>yrWBmF$W?a!6Y6 zuhdR?ux4@GrlsmJCl2g%=T>BXE}^Sx`?iH=PUe>5yH?50d#tjcCyPI^?3>%Ro3=gd zoRt>$C3-&T*({dpjA1^{bDUe!;(kTw9r1Gln^+G^I`th9-teyI&uq8PALCZXaK4G- zo)ErUNK)T%W`4|tb*3lo?|QIiO~f7UFH<<?7KCl!eciYH@P3Q^(I*bvtLMKqH-+8y zIBWB~Vkfq9EUQ}NZp6=@{-bHh=X^!}-|w;%nXBKvUQulD&$j(roPzxkw*NcI@5Vja z-s`h0PG67z_v>GK9qRbz?KE}&*`Pf6<o4r5|F$nxPxxuW{>S@3<Oyz>5BZGtiX~0+ z)Hl|2J`N1CbDMH_-mlavpH*MYS2~p_KUY1c;qRxA&gBdL__2R^d1pagn4SNL1OLkR z9m#)G8*TOQzQsR|*V~Tm*Q;$^!Cn1iYQ()`oL1)DMK{F76DzCLkKC49S+o8E|L;e& zLjM(BS}HzC-2bP0$#SnLhvk0mS;77L5x3BP)sIKx!sf?`moEI{rmyWcXYX2z%qzDi zalStL^}xSfhNp7eerhN(Kh167d9!sf>)|--W!p{Jc5_u~d{3&Bw*I4hDf7g|ZwANu z6^`GSZ6v36vj4!RzOo<7SIigZ`S0+xV#{*nTQ;EvH@>y4;I6I=zQJ7m({j?h)=BeJ zC(WBWX<n}r|C_(&oVFYG-_t1+d{y{zqR;v7PIBL_TL=2**695aK6T|{@{BW?2RHWU zEA0O2_hJ2t<qXwd*7ewG#_+#6`+C`j>VxyP&r7)R`I<P-?>hl&tnYCCzgEHhM9}ZY z^YynC?H{((v+Q>7G7aZ<sk_AaUZmHD(R%)&9kUcp?rFBUWI6ZhU!hdDL?1D(+Yk0h z2c#_${`I{&kni{XxrfYd{GXO|S2E&z$ArdDi=EiM9XhTu(@T;0_oHGbwr?9kn-cF= z$vxG7c>i53bMB5eE%j4w&+9tRKKH}=g6q!vUd=hYL-mvC^O|G)OS|k+tE`qc&5QPX z@%mnq<4ffe{}<RUZn1e&Jm1weHa6e+4QJi-k0l4?@3q#~%>JBoOn!l!{<)v=o-rLp zcVoO~`pmq*|NC<6%00asmfzNu_*PQQa(G^z{;QvI*Z0kzQ2wZzBYmRx$G<J7Pozpz ze-Bz~w|1`Dz2}YhC6*S>-QZrlJo4Wj{j;CaQ)WFq-+oD_e%X@9e>EX5SZohp(y6zb zpZ2rZY1Y&8k(2(sF*!Y-HFKK1z3=8fJFU)sdOpqMbo+0Wf0k!IrB7Y*e@}+;8&!Re zKhuwhUtY2^@Jj37XT2ub>x!2~KQ+B{)at~yNK@5yQ}fmeCceBT^>M)pZlj4Wuid#9 zsr7zR-r2XBL6xg6@K>KS>Ab9Z&SU$t8wVHZP2u<4{%Ov{mtpfh2kn~re2>~me~^Ir zrL{KCZ9SjW7RKK=U#IY~{pB^89U&*2f2M;NW_M>XcVAv>S&+ZWl>OhVyt9qss<zXQ z>`kbzihQIk6z{wJ*GKt4@l*NBqyI`wN}PKA+=J4@`O)r4<!vTnMoTtMQ0#5x$<#^l zNOpX|ZhIIZ;_+#7EANJWGnG2!!?SLSr$rS1zQmKA7e71k>~m}5H9!AEw3)WgKfmGG zhx#M6j{kF~L_WJy`2619s9J|K$x|jTlTY5c?*8O?&+Km-pDb4Wndc<;?Z-zD!8xfW z-t(WKBLDBd51r(`JyTYx+tV+4Tc4v+qdxG&fq#FO+J)&^t?ZxL{j1gH#2JxK8>Y{1 zH99WiZ#c7j<GaE$()$HIDQxCRtt;(GGRk(beDi(3U{%8Y|7%q?N1ixvZ$HQB^_FhV zetM@8|L=3Z(pvjH&hy!f35~Wt3Kf}uzngz?+pHR25u**)?bK5e`eRg2-Vrg{5Wi0~ zC87UM|B>yg`z{}!wLa_H)@Q4a)w)K{@R_{tT8*gYRQIo2pRLvls=U50#{SLmy+Y-a zE%vP!J^!+HZH3&O>s`;&e@A_^*|=WxeEyfMk17M>wdYOemUj5xwJ&T>?z`-xx8)R> z)0wJUZ8zM%fBpKY#6C_*4ST(m2Qm-RJN>_GP1@vi!nravUVHi8d)H58=FSZBi`Kq8 ziT~u5qKj@b!}M+$T|VV{J2h%&hWX088nx~0=TwDM-su(g`>d}2ofh@?_lyh7Mu&~p z{;PG=syDp+>VC}1nn@S<(-kJG*7-itoOvxSziipo>(%C$Z@sRamihMUwe+a!y+MWg z7lPY9wXS%s{)G3(y%Uk1&&mtqEs}paKe9JoE3tc8=Fu6mQjbR5)zLl{l^SVy&GK~D z#vUE*V{&I7eP{i9c+(mQ>A9&#Z@74>nRnl2er`NjW!{|Bwfe@J*L+QNoVInJ&bdw3 zreBS`_G?q@3wB%UO>4eBO_;WI-yD#z_M|_diOh2ZV<-Q3uX8#)%KmitySi!XXMNvX zBYOS(r_lFx)7H0r+g$TC#=b88!v7lk)8WFuBKLjrHZuNQSZxz$X76niowQiK{(jn~ zA9Jhi1Nr`EtN-Y&`}5uI;HP_8Q;y_L`Q5R2>a-)dQzecqU6jYJwLX3Gj>fl&kJ`4) zJCeAK=h3lk?h>#6?wogg#U9zBpn8k$$KQC~@;}d+_~Z85=f9i%l|=uXb*=vp8vQ4> ztgim$8Q({|Lith&h0`0w_@`COIpVIePx<3?{^&j7k5=|a{OLTBt*STmhk0i-|0WC1 zM~*`NlPda-yjH!Z`cbs=ZL@CQ6pJ{>K-q4g{HZ?{9JwlVT_UM4x>HzHPV*y6=l$sw ztw-2Z?6fx)uQ=+f;y2}oV5hp*pLIvR^KZ5Yd!#62uV1+CNZXP3-hZ|pnXP(H{iA26 zzSkO?w8GfVXs<hgkM0TC+ueC&(`oKm<MOCj$lBfG-;^JUo$(WHsDBjd+&{Hq`H|x) zcKU^XkL%VsJo4$BKgA;cQLE7UsTCiE#qy{B*l?uYtH$|}lz&vs{3FS#-#qX9*6f}? zwc^F)pf{d>+K$ZkjL`tu>3!#iWVf}aO~@m0RX&eB5s%&q$xr*S?1-ZB(rV8+Y9CJv z=})LwdL&v^Z+gX1jqdFpd*UAj3&l^1sJ`}yO-SAAPsfp9m3iug3y)N**eQNw?R@Wb z=Z|Igd5=Hak0hRtmeKvl(CO~=r|n3$ir&N@3y$pftnp3yoiWe&z^*qEysy)2|Gii3 zo%Uw>j$Rdc+gZ<rHi#YfxKn0wUYo7UYC^b;?o(0!%U1V1AGJ^Ucx3L!?{nX}eJ=fP zs+FI(dB@UR#>dlJ&RB=Y_3!bSvfurw=&YktZwWmrzIDClzrd&Lm3yp<R*P5sbkmYw zA3bO7dzEt+`Gx#1_zU@8`LA;Bs=lEArF^40uNT|Pxu<=fU=g_TXvM?{oJ&7#-F5W! z*Z;@weP?$soXh!b!ND+@x$e`is;#r$)M(@xp!4|UyqWXzdY>ws@tBb6kictUHv6MO z?}Y~!du%Q<A4=zZ;}~ZpdvjmNwU75y#l!Pn|MR$d?B?CBw`YZv1-S&T$N5Q^sYTz> zovj?1`LL|>Fq_Z2Gqv}BUtM3#c5TL=RkxOMRlKjh|NHCS_t&f6zc!Z_d>P(U-uY#< zW9X9qHa9dc-RHWef2m$DhX3XMw72;pAM!N!x>X8XlE2ltPb_x*?(#+JMHTmjUH20b zUZ-&W&pW>-!gKf7&r$op@$q1h_08=<0p%SBgt>mL4rM!DdUNaK+UpE2?=G3E_i5j8 zmBWs+?9UcVu-orn5GFXsKEc9c@^eYPzW?1idu1=_znPM=Zc3f6m;8OtpVMsaEezOq z_uPvOL0*rgGm5O#FTI}XuK1U2q3F?{k_)d|IjxSCoBCz*lzra=Z|VQe6u<Po<I4Mv zjQY*$wpy3|p3?IuPqgMqzrFazd$mjXj<2%UPx;q1<=<ttWQobg4Ag#AotXTOUum!J zO2=R4Pe^E-lTP88ua^8{;g#$5o-gm~?RY85YSmV++?yzLE0g`l@mX?#eGXQfFPD1F zo5Jr^TJHVwyw}V1-Y@(6c4Rtx{a-ibU(b{}AFub*FU89&+|S;ZeAwV_zs|koI$jNY z?Ijux@1IU=b@DZ+Kk#!`Q{}0U-AlJ9FAev6$-d;veD9ZYgMRJzc)5JZm(M{_Cws!$ zKD%m%pX-^zwz@SYZNY@KAp&z8D^w@T%IdxeG@9uXXZ~fXbx~Mai9#}Ocz6H0J9f)b z+SZ(LSQ*pu>!(-RiV0g&0#?pBFS>TkRDDs-3KjE7l3LG;yp}DupS()!+LLlk4jIk2 zLL27&k!TDpnzkbNTq<|#B?iYvE0$K#i%r#+rpD|nI$yBPhM{=Hoy}_Dl~=TS?={bj ztad9d&(>DfPX4|pdXHD-135qOi4mOdj`cM%@~W8|&C-9u7Opk-T312)t$VKjrh0h( zlRd@vghiIqAphjggF%MsR~=8i)0na?o!jAfR^ft2+MBN&OE}A#?zU;FyYbGXrBUbh zUSBz_nAspOKYFgSf#cd($AEPCC5zvla#$I)#lx+=>5j+BJ<E$lirjVwY4JF{-FVJO zx5d<ZJ#$QV%EYjbWvb^HCVpFI^i#iZ`!cu3fy#^Ads{q?2}jsQ>P<hz607`G`R$ZX z8^5jdS9p2&t=E0#nIe7Xlor2MYW3P0aq_*!Gq&lU?mgPFy`oxa4u|`rNB&LQ(l>nz zF?t~~cZ#dpRoAXc^V!ABGtbrCDh+qN+I@B6nQwbSU#bMZX%NifT+qPNoxyQu-|<s| z9jmsMzX)V`+SNSsqEO!irCC-^!tXfloC~=WDSB<HiD06wprFD8jrZ*0GaX9q@d_(4 zncRufV9zdj6g5LoY}T?V4=UX<dxMrqN1yt_aQkAASAj#)jl#CIf^Xy`x?6lA844tf zly`|Ko|yg8K()rJ+Trk{s}A<3I1-tzEm|Wf5qVue){;4c=fGz{amNow4-`!MDC(0K zdemb|rqm7R?xR9phTEf`J&}3nti^4&EoIddFWxm9TeH{yU<{d%6z6%0zi*<-p@pG( zS`$+Dyffpmx_DXdwD~0eouO*;YC~*Z>YPfFGV+}oyY!F3<*a*}soR@#6|`2%T{+3& ztKh<&QR>zBirdTmmh^KW=Z?^2^Gy;ivhC8Cv^{`>IfOa!Lcpg2lhQ@%%qx93Jf@s> zX$o57qZwu&n-wi}z~bP`mfw4X(^Ae&+Qw<<WA}HHP5rSSf%m&A+KxzWnD>8Oe3-eY z!K-OO{8itDUnUEG?73>J-SkZHX+j+f4~InkL5nz!=hBR-dtDCw6J%gt!^-;daYKii zMMH&F9p8k;Da<S?LWPkHvlOT5xv98SMJuzVTx2W_lxdSmJ+Vtds?}X1?#k^p>x2m} zyj;rN8HEhOKKic{PD^;Dx804W?Wtgs-<1aqZea{>Y!0*7u2i%*$o{Nsop4s~G!Cr{ zR<9LK>rQ+=QzWv<+TyB3=c~4ijTbM6u9zGU<tJ+1wY^`mLpg+fr<w7ORf`Y0ywc!Z z7-YPN@%j;?`lE-pm!63_w=iz)`$Mh88+YcZ$I0!RSMnjPbN_;v-75mOPYv2?<1jVv z$dj8qdY?69*_tQ(;(5YXTH?z5|E%((65XBa9`P}$?2=1WJDj`rP3Bsk=+9?l_Dpbm z_D>^q;mcRL^Ed6Dv%N^BcsqM>_%?-0Ubcpto0}hKhp)NQQN&xJY*f^gxL8Bj=Iv4+ zvv`>^y%S?Xa$QzvTvm<<outAqc)=+6g@JmMiqgwpZ0FiOt&`gE(@&}+YVMS~9PiDO zG>p8aM(+rms{d()TY{Fkc2>G`<lddPQvQZ4`#9rjvRnU_HHM!iW=Uly8-#Dzq<30z z^#(Rh>(6zXr$5R3d_4EZ`VGbFw>{+cHvh8pVoc!2Cp*q9nbv7BLF#O3!Ez79gfGX6 z4hbnlM0)9Xi=2_tjM%=={__8q`%>KAhFIG$tPOtcvEzkL*bO!1SF<j1=`Pr9qY-ZN zH!??JjbNPnj2#-YEDk5^agXSivg|zFs=q_o|C`fA3-jW4C7I?q-A`sIvn+1C+S3;i zv)tO`&J8yct4$X7Z(q`xv0o=KSa`c|7Skj{fvHX_cO+-tJti_?S4_(LYge9oUzn?3 z?3wiT)2X7R&!0)HUvvG4QhcD{LosHppj?UI%5`UoG`{-0c<C_XQ1`{XN2+GXwq7>v zalO&=(<M3Qu>9_GefQPP{;jb|UUfmaOa8&!?-_UZ?5z6kclEO1+NiY9r=6#Hj)~^> zctpvTE|OEbAQZPc=sr`K)I%vI<5_bAcOBk5J4tVW`<+xS!R@XenWchPoHO1b=UG#> zPw%~C+p)izmjCtG8TWY~JG}6VMC)&x_o+8$Ow{mJxe{aiarK&~ONF9+mdah35w>6J z(w^m(_d-->>M^$lsV=YBe22gCJx|Q@9aZk_i}f}q#&73v%UZdq@avOT*LB4vy9+)3 zX0XgSluK<%{M0vzJ@Z(O{y6E_^G4c|%dq~FK!@muCsO<i<D~hfcs+Ftm#sSfV$t-y zFYcIVREX&YJMOj<<?-idn=f-a>xILuI^ShXcm16#U0GO`G(B6~q;_`qqKeJE>=!%u zViwedTx_*H!m~l(YMGVo?l;;OC%zI){GBoHrpH|QFel%eIxZc>2c%w}?0@=#bB>(o zSrJ$Bu#-)1`_t!KisM+%c0|=FRU!IBYT0x4wGU5K@8vzP?L?`=<1|ahNXf7NIM+`p zW)>?qC<#v}DVn!^+rft&e6Qm!9=h0Nx<mT8IREA3{;f0DF3~PCT6C;L*|FUqNH;*3 zW1m#h#puPVSJI!kR#}|sH(YWoV|`)KlDt=wY?taO&z4^luspEWwWKa;iLqy|`-_~a zn_qOT{_1rdD&XDrV_E*QEmN#|cU^oZE4z2?0>8L9^R18W%~^bGLhhr$^AdMvx=xrE z7`(o`-BvGm&ip?wE*|;jH1(d}ky5`uS2>in^k+N}SiMW``-GsLsYcmzx(!XDpZ_~1 z$yqTwXF=hn4{lo`wE9!HB_DVh-PmBma{gt6NX!S8!}sDgt+~Xp+QBR1V?dco{0(K( zYl#_#cY~j;U6m!M>~(q~&y=&Va$PIG{A&~8ecrB9m&N9KafQaFwu3vR^hDW~KH8zz z)xN6V{@t_}iH9~H4O+H^yQO$X$fD;>ZEjwRCnPNqTb;1+=)#iEI?RjJY{m4amRI!s zWLtH_o`v^N|Ibfi>^qj%WWP3-+K?72^u6j@)3=NT97nHI30Cb1S#l@kLfqoSGJ}`# zLEXCMxjiwSQ@mKYuI;&Qb0K6eheTjz0l(w=MS-WLxUJbYr+4n06G~f+p5B?zp2Q(s zb;MTA)gW1mCFqvog{NvQm-i|M%-!DI;`S^hAl%utqwP__cF~}OtUV21I|F=^xu03y zR^aOXbuZ?t#G5u%y=?I)r$`O~k(uXTzv18KeqOiV{A>>IMTsX9Caoz`TVv9)OWftD ztYwu)%7b(4HO$!({_EXeMol*6U2pI0XK9ezcJWtl+8u8-;V71-p9)L1Ef7~{{j9a) zf<WUU)hlZac0@DY74VrHoj*CYPbs^qa=O^%*Y%U%)yqrhO?~NheTiQKr^_0JfHw`k zMORn6da_Q?sB^b+luVD*Kk4-Du9^d~i3tm0EW>3^a60R6Uh1^8XUkDp&&e~FTkTuE z^oj%Hq(fU5hpCsG;{B$*wM5vIGb*Ae;}yg82fN*3%6aE~KB61YeEs;2?n!ZvJPs&W z-rDlOY0=T0<sQAACw9q1t$TdIjYsQ_#l9yT6RdSN`*Gf6x%%gLQ|V7>*XeD|%pdjU z_|*4zTh3S=@${11QpPjyrG%=E-Km-R^fe!^jjTxVZqfL-n6m1=8SbZl#+EcX9NJv8 zd|BXqO;MI*a=wbc?u2$v<c*LwnVA~?Sk1IKYew6w4N7_G0zTcL@rM0EiFs*TXVmkg z7}~!uG;NJ3yeqbTrXr)N#<ty??x<frbmWf25}#)RVPe-KB+K)kI4Qr;%?Y?~U^V0Q z<8Le5Op{I@c%o7hdc|PlD~St&em{1rd|l)=BP8dJ>PmTjchA37{iiQ1?)|HKIOmPu z%qu&>*5ni#M9VFa7P%#8dHQJMuBC@}{^?6Rt=qRa+nXaqGtJ$2-S_?}hQ5ALK_0KW zf+A{E-UW2t*<^UVe@DSXgGpO>F4=l~n?Li_is)sp0-nA0;awar!S<W)U%{dKlDbzL z95<Mlo6TBUZsdHEv0E-*INVffsn1m1cPrA$pBPyuFf6$*@lCo{_@C6-Fs<E*(b^9- z8Z7+oA$RL^sxHqjrPx<*Q=TicbGO#sp5WnRHhsssqKz-Lzs~Du6K2t9YCN<rxB1!X zwb$Qk`RvN~+r3Qu_Tonw1&^c4AM~ZJlRPG~W%==>i4lj2HJ^q0M@CLukn~aJNEf%{ zmFsos4s)6wirv_|*6>8+bo=_ZX|DtS?ylQV?=ophTfjQozgd+%qWwW;LEnCSN<NcX zdU|hVW%K*%+xEQOv|e{!cuSDM9~IVxkLxDXXNRUgmP$39xPHIr6ZhT{b<H=X#xHc* z>+fCtQ0KV!=d%Llxz$;Q%NCSJ<-NF8ZNqv>tZd2+%?ayW^Phyv3#wk0|K-5y$NTw( z*E5gZimE<JGkcdloRclx`e%g-i;>i~_U|n_&+hR%)Bmb1CM-aY(<A1yVuxq9M&fVN zobWfPr5j^~6+(ME*GfflFkL?C);qzc<#R@az~bA^RU6)G8}mfo?DFurTCnm^mx-JH zLb<CN?$=m4j-ObyjKOff`&EgBN3S_NJvcM#&RZWPyLq}9Z12kcCc1E}=2ksatL<EJ zUQ*zMfuP4qeRf&HRsCs++=-p7$u8`ZUGsODOn=5{$oa5;WzW<nlDj@%$hffX`27X! z$)9#A?$$UbzW4ES!E!<KwrzgbPVHorSP>tm@kL7L@L|)Z4ZNFrxQf#HV!y0b`f$tj zs>&T{=XLTH-Dg%cR~}|@|GD69aY<<M@mD=FD|uE-Ke}FA@>HK;gpJYd;>{0?_Ak2- zal)2OqFO0pi3UgLWS#Wbik=|xz$23m%oDvOXZFDDqR1!Z%8jbw9*xo=O6jjUx!y_M z<onREDO>#7@rztW=}&Iln=QHLjNrc)5{1WoRy=<!9+|n1J*M%MYT!18x|_cD{O-&N z{XPBG_HxcAs|`<8W-;q;{I@E{J@NbtgJ8yqWjBwfE;{8qN$l}=k%)syqPryeqE%MD zl(0NycH!To>|0jZ_5oT^OS5ife~1kU6*gRBq-Jumbo=wX7Rh-*SGAtZ6zy+mefn_8 zf+-KS9iN(VtHfn#T6}+-@b02iZF`5M!ryDyZtm?*DW7&~=D|H1l5(86+m3OkOW!&e z#I{YafA_rJg%{thX>`5OzW>Am*Ck@_6x}}`m0e`A&Rg`gSFeVy>h7y=9-PZMDwLWc ztYatf(2nKmg>2(m)rZqJT&O+r@W!9Rvp9Ae?4Ga3uALfRk#Wemvmo41NK|2K-Sg#c zNkPx`9#1&%VTEDTxwk?&4wY)=X`CFN18;a(#0Qj3{403U`QjcuE}gKpUF=ycKU>)t znYcXzV)$?L2nTx|Y<nQjCH|xBc&5lX{?FnUPp;~UW_YEplq25$u#l&CBTJl$nx$vY zJE4^yrd?POadXpC)u}bJg)bfv_mrMl5Rp@Q;*jeZHa=_TPQ!K~{d2YV@2rq;JZHb_ zpwFYcJ+;jH6l3qce`MIkB=YI2;H93a0oM}4#d8X3vc5R&d~s1ot?=uI74AWrYC9h~ zuUKNeDABI4`(u+-sPwAIE5e>1+cn)bCSlQ>rHc<mKi_yLE2N-u%1>LhxfiC%Sl-+i zVe7=wQ&ZyE@o+-wG==A?Q_8j|DYG0)594{bb<)$jk2mqiE`2U_V!N%l;c`JK>9dno zsH?C#9S&Z3{hifJh7$_*d`~=hg!7N>WiDPn#UrkCcWB<a=T3PiPKgvVtczGQ(P-YX ztB(2GR!h%N;gp|v{+DN*UG4s7b^F(?+*Nobcmv<lyAF91iq6bEygq65gA+|mAvKkc zViXK-%CS$bcA4b9IQdfV^2R)aeT#jvyZm#WXfu5fGinW*##$IUr7hsQ9Mj)EyOV(* zD~)zLq)(l>LMty~hSoO2N&WB3Kem5*(y={8>)izQ;@F<-9G1HVRV&lWB%jJPcAgh* zF;`TIO1*x&TxHRPYn*oX?M}G426nmHc^3)s{PKCSIeFfm{MlA7gqM}y?p3dyt5$Ew zy!&HaeWghCcILmKLQkh(6#x6U)^EY)bk>_2idS&le{#<JW<Wy8(t38M?}wH;wlyjK zPqzGYx1i7<{M?caE+3!mlw`?oPEa#n<C%AEiP<{OG_#yLb6&;Wmwfl(;Pv&dV{hMI z`Rm}yUTL$ktkM(T*T3vBVMyCn;`Tb~McoGDYZE{8PPke0?3v4BpXjN@Z&v3uw>y25 z4O*VQ|H!IhbE{{zA|G9<1%E%?U-Y$(rR46Vg*7{sL=ppKG%IQ{j*3rzad{~hFUPr_ z&fiUj=daG+QI!xmNm9fuS0g_%C`@qihwqzh%|o=F+x+DUk?*cL=VBxO;Fq2Lw{!RR zPt7iHRg6lLfB!=>kpJVEyYX)(ud(WXFkgE=W0I-D{C43ZlUbLPh^JrOa9S+k-RDES zw;rn<_e%0;uJ*e0Ay4G~+s?d%BN2{{h2`Rx@7xT1QLG}l&rs!|^v|SyMsp_XO|9{M z(D{2A+nk+$lXgozy&df<t})ZV@sNJqiKB+AUsygp(qHka>86MB6=#L`+m#NNiYi*o z;@3Q}U|p1!-0{3`UE}`qMs=C%>@yCo=QzG(<Bv8o6+6!dY>c{T*J4>t<UF_hGI8^~ zGiCgb8jjB{D>k_>UD4gLcr#xu^QVfk6m$3DRr%^)^_yJQ>}Pva8$9dz^hC8f&quYk zQh#n;`|q~p-0mR5_fD-Fetxbg>&TDWtM<Tl`tOn}Uvu<0pHFoBx3SB0+T<dUwMD%- zKWF`%{q)EEJ*=N=&;C8V?Yg=5f%rX(uSWd;@3!vh{#8=%r#;wvFYRF5hrRKw7muII zTb2I4I`2<F`@W^_-&Yu#$3Lqq)DRY(C}mjoZS}D`@9(|*x8YR(?<3te0I)PPyY; z`{&rMMaRAtb;=p9`XTu#f>mBbdBvY#E!#N)(gjV+yx(8E&|mk#Pg$-{&4&MS;FBG@ zHJ7ITND*J#Y9706-UIz>fi=PZG6J2B?bhKDe#(DSFy~LoxxYL74~2y)dtG?RoLOU6 z^USd5nSH>CO9ui%Wh%r!-98<8>e(uhyNdV!UtIiGc4yK$pZjb9rE@Q?ozD1iPW<=p zXRo!{H$AJJ*&uppt!?eg1@n?>zI?eox3Ng?^gX+aKh>l2{>U{wew5e59xc4$+23i) z^I~=O<*hMZnrC{$;lt%qU1=QWIyw#J2UZ!aJI2cSa{CSzwY=z)=F3@B@}gdb|KwOK zA3gE3;4eih##N6NO_dW6OmOM?xbnG7_hwP)O+m-?YOH4ETea0&xvi<Qa*LVAm+F1^ z$>)Q|Dr`ElR=qoJ`|kLURg#$on!$WAtI`X)i|wT?g88iYnT?MwU3E@*w*jB%{I~>} zJVUYfNgiFN_s^00adfWXjHO|2Hp(3PindLtpTmFeOU$1_&J8<aHnjan_@P~wc=hxn z>7w0Bm;b*ZI8|@kxx#;Oei5IqRV$?1HvD-PmKN{4>QS+WsocY<d+#TvT?<$_;nk*q zojZ2abbl7-JsjxCXU630u~kCw@w>xqf6neI@L5%A|EVXWcYlG#3Ssdp7nf#PxIWNX zsie$br~dMImj}O6TdWD2;Cpkg`F+if3@<0GGF)cF5-b@Q=X;Iy?uk`Fre*IlI=sD{ zpI`Oye70wa@r}Lfe~9^-^89OAqO;QOlBAENq*B(D`o5(Pc{i<S6ItnTb%v0^(ce@5 zEY{_X^$+Bg*DTK7sJ~rc`t?UF2Pb%y_k=82+SQ}7Oo8+NBd^2W;(-_4J-<B^RoeZH zS!2T55DBKadzT$cX)OCXBlE&~k5~I&e3jG{i7^QN5vW<G;BY7XnWphq)h>fqE#iiv z$4<L#zII@P#%0$lykApYcBoxV6$*H~as3Zf<`)$<&(id-WM<8Yyz=#Dmn-isG1Gz# zU!py`yaOE>R|@{RnY%4(>Wta0r%Xb22>!a8YZ>jRpCPh8?(om#4H+$U#oD5&S_^Jw z#9lcS`0M4{guLof_p}`$NgubTEc?O8%BHkob+zu9$bieXr?$Ai@b1<;qt|v$dy~1R zDdUAd4IS?%2K}))#NF|8^^3Zm9r6i3R?o2G;W_#(VZ|!>!~d&Ry^>!kC7SzV#>~Cv zS6;f#cXRb6C6lHL_HQ=zM9i4++d^1ZBhCFr7pM0bFNyX|vON7y7o|SElYF&i=EmjH zN6vbE{*#z?YlEUh^pwjEp1#JlYkcok>pU`yb9tu|Kl#Td74GW~|15sR8&`edM({2l zK8v#fhk6sgdCU`gST}v@S#cJZO{ZeIbo8Rv2>xTydmbZZxq0U4=|@@CbSD<pY-H{9 zTz%?PNZZ=j*Sy-k$p<y0Y8|it?h>tAq#W0NDdNTaXZ!B2uH64eQC>7tuw1KdoA~+T zZa$2U)ZA=>SA6s^(p^>cV@n7N|3a-r*#$dyOW3VHsq1m&@WUfpCuq4zL@GH=`|)}~ zl!;RK9iEz*&ZS2-NHDsz%oclSrXnReXJcbLUzW}Uu8mKomPE2Quhc5^z4v*e?YtYj znHOh>oa-nQa{gh+m0D3a*(*=f*mg_HX$Dty|HHvK&F_0W7)_I0v>JZSytj0jvX4DW z$yUSAPg?|B=Gm@Ma87*k#+UVwS$2TudRE!Dc3f*e9(RpR?S2^d#MSGgPv0^5l_EC6 zU$vjCh(GJPG<?xg(}I&djNw0ewCt0`lujjcs|rrF%{iaFd56H8nI2j*jLufNzuC2` z{O|JL*V3v!EZSwiIq`9u%HFl#8s6WZ@#^-E1H1mEs7KT@PZLV^`s=a!`q$;Vep`Li z>@K)-At_Dv*s+rTze+DKR^%>QDIFNR+WBSl{*C+XcS;8E$VT{tn^w(yn<&-&S$KB) zqo=}lj+6K7b+Gg{W4ivt-z_Xk#iaDi-CdKJ7B2s4V9wi9?Y+1<qfzY)lkUb-H<MU@ zFFG1He@f2%IH|>|>-IZ)H}D!%b%{w`y3AvDa>I@@8#;~69`rxYw5q*ZQ+zE{;7zOj zk%u>Gb_?@+-|!LLvFKpjy~{^FJ4f{tN5_2C=>N4UFl_3o|Lkju=4ro?;P>mOnmys! zaX+ywI|TIqO`9y%@8Pq7FU;@N<UrRwua|s$K50uu$f~Vu)2^;vYW(U&lhv*Tem-dy z5ydOTlza6&7IR;E5wy1M9Dh)#o7BgzJC+qQi%hrNW1hY?E>>!?mXYO!)HQae%!R^i zMSYefzBIc0eQieIoSpeeVuhjKj_%1myo9&>fT*p`8Rj>p4i`)gXXs?=?3$64Dixw$ zV%%*c=A<n8xRRgSVwruq<CDH_{&{~MC|kd=>2~=jU{R;D?v&i_?2LrlHwAl7E!=X# zCr(%HyY<<^{g-9FSMwL{zpS(Eh1(hLBW!yPe0w?TMng7RdgS5kc@t&dec!-*drvZN z+;ro04@)l<Jnui~7!-SKUt2`Q#%6KpG@1S7@7n6$x!pOeJLS<6hOVif+jpO}V)^&Q zj&p6F*%O(YR~~2ca+n{jT>63W#=-e%UC!QNPag6FSA6fC%U;*#!QJ}I{O)=a%gZxr zT5n`Z&YoIh(|Y(#(vCf1@zR&Stcv-W!utHe(G8Wh%fgfr`&X@t4xF4R`mv<@nEcX? zme8Hc!hg^7S>AEjVb0WW)fxM2<@=5_3v%wRwu?V=J?LTMiIcN;EdI$Fv-wZdzA3*- z@9X|myOVWte*Lw(S(P{1ZZUkB^LKkJ*WMeN!rPR~FF#tQF4XtqlSxqP#}zjw9Amxx zX>viL)<!PYh2{%lezQ-_kg$@w>m{rxU3jhU+-x(cJC_Y)zOB|tynBD@j<<{U9$A00 z`=IKbFZT}^uzWkrmFOIjSS?+2`r+%)$<;?UUp=;W)gN{}8}>y(>$Uz*<lf$OtorJc zxVxYG*g3+M+|`|2@3dy~bP;#gV!>N6E`R(4#4gGC{Mu`on=<#sfut8D302B6-yVx; z{VnbOrK;XqSm>jrE39dFWSP@4RZXMUbxJL((+U%szDk~0I_sq49VX?v=?S)ML6#l{ zX8#W=ZR$9c`{B9YSGmyWSN{S-mBspAJdCJ$c_|_y_SFB-!-=+1t#kNF6lV0_ar1q2 zO6b(3@9X}|FaNMze74B1*~LHpyZY!X{ds=l{HD+Ue}0z_opR0fOZ}SudhyMhe2z8o zuJ4|G@{79soA1}cr(gc{WBKF9U7J{i9X|?J2Ba@=+9q*5qxnkv|K0Y_a?2-9IhSDK za&*$C>|MWi-~HsipjZFE|Hbl)lkIu8{MEg0V?1;2Rl#pL;%C=4|NW9?IH~)>vAGss z`m0}?vQPcXwU~41aR<%l6C!Kbiho{kFMQSYsW4vp{qz@&pAX$<uX!ij^~u`d&FSig z?+<_ZF7{jET>f3J|4GsEyQZ!?x%FSf{EV1++v>L*owsrS`!BXeKix9y|Cub<yh{1v z-bFIA-ty(Qzgc}kaQ@G|@2}kBjL6+uE*2T8kujNT&b!>rtD_8@gCbml*Q#vIoPGIj z;`%(b1q(D{oPwJtUk<xbm-8dzyL02>yZqX(Ot$S<b@<)Av~v5P*>PFr<vKkvd#k2? zW9nS}Jg#6v!G}ABRu$<bvoBvyJb(A<Wt-y4z_*(|9r@L{`|Z52H`}UjhujaU4t8%o zc*EAaE$c2n+Z<onPG4=U_riOBKjXd0sL5TMcQ?rTev<n6+xb?j7X{}|Uh?!xW%}Ju z-yWB}O3Jk}_~vO{nYilhNtfq8+UI^bs`+~5|J8Nk4?3@~X7BtPma7)<yFFpi=g!Za z=Q{nBoK6Ry+rRbfEvE~0!WX{nX+2xIe#Ke#x9>zd-}S|oTfO{z?o~#vRl@qdq=(C% z8mEiJTBY8<y~^);-<BG+$Fk<k8xOM0&H8-BW%cFDS>JW$-nx{tT;EE1*77FC-yhE0 zuU9Gf@k6xww5;#;+sD(M*$Y{e{n>Q)vW!K}`NTZF;<bMH7v4p_Q_;7|ZvM7W?Zi&e z=_a`xU9<dNExIc^Mf*EjwtLg1h-nrppRIgn-B5FGne`jrhbxcIdi#p?`Nn4}ZP$ML z;mZDR?*);DPN%!?o~``H&$?i;ulBMvznPBTpBW{r_Tk#fy50lR{nloxPO#=^Y={YD zkGd_oWp%o2MsEHEIeTW_GWN{wlb8K|HSLw+DB72)lo7vDR_$zw#pCq3PiAVq4tsG# z(%yEf8sCiz3_SD8x6UbJ{p;}e)<o4ybAG*fBKh0by7bb@ZQGX5o}1$R+tAw5-cq*e zne_&Vw5_UNcIGQiUUK`)<Av$*PB;9W=I>??<EknZv93I_a^9A7zdg-2_a(f2&s@ID z-)g0q@l~O!V{9eABVIhcGEvx|aq{MqpHCDhtUdq7Izu7QHZyhZ70Kn+H|)f#G;jWC zpMLB)^X9FK8PzN6if(z%=d4Zqdib|oy~oD9;;{V9?zj8a)p=yDclxZ}$p7{V>zm>& z$yz^n9;k(_*SK%KJ1T97-5d=gNzVg!j(B9OKd|0!RjQ=Vk3Wa_M6RS5`~6{^lfOx_ zz)8Q9J=aRly0Xx$a@vZnD}R>CTb$&cd|BB0O6Ko<w=O1J{&Doc$BohNyv~~U&ToBc zG+BI=eVgIUr+gRp?oF%QT+6s(cUq-@#L2u!yL=ti)263icDRJxkC;)%&R&#u|Hfgj zjQ{?M!P4(I<YK>W*z_U!M9eQ+iE!gd&zAbL=4L#Tki2tdseHqaLkxkZb!=Mpd!4!d zeZ|~a#m9PP%A4JMIk{20?AMgdmK;G3b6#u+elC3SnYx(zC0*hDy>~V)eZ21D<Zmqx zFY&Obl(I<M?|n04W)5RfYtZpGS89~*+Wga0m^9ZWTmGIoqj$;f%bU;c{Ch-n_xiUP z=baB2q@VrrNBH%eCpEui4mj>R=fAenXvT}kz<t;6T`;`;c-@tq|6eTW^I5x}_gQV# z&7Qed(p9RJEMn;yp9(VUXW9P#TKxa!Oan2wmd?f{b8j=s2w3#-Y~YMwkFdCSS!`BS zo6b4b=d}hY6VlWR#0}D4<^2A5!Q0qjsqqER1h$CNdFy=H1G_GZzxSHI<+6Cfw8kqp zkNjx8`=9f}*(-m9=eK`t6}7+h*}&(Cl1I8yW!d}mwSIw5?|iHk=GVTug!xGfOYmmq zt&$3&TPm-;<Yb$aF8;4?&0|;V9e=W_-rWgbxRSx_siWGA=ljB>E#;4_JNK6}daJ=2 zDURw_I-3%Au`a9A6y7r>bLW)I)xGf%CKpRIH>-U4)Yi_oM6XeawQbjz>t(l#B&=6; zaDV11;azQ1=eaSeAa~XF1Gi$THt<Su?k(F<rlO<Su=JZw*;m{2s|9b16t?VVbJ5v; zT~D9uZM|6Qi=qR&`k%~G3o1PLE;jppTtCkyk!a7H82PGi`<*ZTh_B`5-CtW-_u<pk z)xVdoUUj)!H;ms}`nq-Wb*sI94K9c+-`>yB#OlP*%R1e;^>|&M=$iFLE1$mYlW*NL zd5Pic{Xup=6&t?W2~_R;zL5E(_XWKZirenEcQE9BpUl!BxwPwr;+JB_3DMu)vZlSg z!!LK(>w(&>cj=7j>Mu1-c5*Mc&vjwtpNFbkxBE^lEU#GD{HK43&3CDV_nEhTmi;Vx zU{m_?Z?Z?cP6n5)fB0ox>8j-ye!Xe?Qnh>e*_Wno_NDzP&+XoP)!}5M%fEcasWo{! zYi%Z4?JX}{R8_S{xXtE2AJ4LD*;|~nJMX%^_|Exp;oW^^>ABn-i;cO`9`#)2(Mj58 zYRJ6m)W3f_n>)Wqu9o`sspQ2|?iDW8?PnKX6Z#Nzk3YEZM98XTf5lSL>fDTEx7Kq+ zNWVPAQkdFwdifmR{KJ242KD{1H~RlK)N$o)S%HcfvL!nv7C0V1yd!4o&#)QaoVqSN zpLLe^{~WXLh8OQB`W>x){=Uud=E<E$r*tLsKYJs0_+{kl2Devx4||@oT-;{+dJR*S zp5m1p)hjv4S6GgBOq_ga`_zlud0$Gi2X}D?*=Eb#-+lDoyhz*4<r`<(S@$K+`EMX_ zTXH^gm9x3J;?x(clj>(i?6pka`mjg0aKZe2VoqO!{cfzA=hriT)(@%7Pd&DLYyE1@ z{<F(i`Jb)eb?1ffA3{CnFNXdwh;BVP<wNYZXoH16&($mKtS*qeWRSSLebT!2N$<K1 z*5yCcV|V#gZ+yvCXRXVxEqkYakeqtF`leTdy<z%#GqFQEBrF(jy~v7RY|&tTf7x0+ zv9<fSxQ)E;WG_<OW^uO9>}Tw2X3npjx0ml~KDSHZNz*c`kJEU+E&pmP!@WS>s6SeM zPF2stJ?Cro{u0||x}Bk~cFK}-u}|V;UxWpvU$}YYjm{=!zw*-|A2dJA%KCYYA#=em z<@Sebm{jxkTmEbl-QGX%H$zE+eES)7i;|hb9y+sTY`5n~JIi+Cn8Heq*r1kI_jknI z5!*6%wodiCODh$BpA_d5jdE%i2@t=}zqjPzzsceq)kYr~m+xlyrvBy9osbXB-zIa& z&Z_;ix<zlo59LV{Y_bx}FBz3oyv&y=&HB4&_33+Ttoi?+9QjdM&~_{RO>zS3<+Ghv z%UkCC)jkyY{2;H@2iaFyEpd{2udkWM@B3HsWb<cXs}H$8ee>t<yu~86_}ljFO||o1 z?abOI>UFl2uTj*7zwg!4WfvB5ua9#To5_0r*`v<YTjlTl>fQV8qww^4vvP%>!7mI; zUTDf}pJ`+N@81ROm7krzrSJFpbzEppM`g*QYl^@9|943E--un4rSv(M$@=HDSc_Ag zrr&O#J^SE>qmjwgYh3@%20mR?x#O2{wceMaU(3(dGCtefJbA|(t}{PR9STa&`1&g6 zlaf$YBJY!g3j5e^_HVS$u8m`_XSMi|@GiRT&6EF1_m0U_Nv8)CO?sexzpC`+>+)r{ z4mg^|&*!)~o%#5g!`Ga*Dr<YxZ(p#hR(O_O>7!Rqu5SE!LEHBGtj!P1;%Dx>lyd%N zKJ(o+q4SSh=1WL;+4N4nQ=R|fLd@mQDSgpldw22wvoG9PDVS~a<&*JxrY8=s+<)JT zOIcc8Uv%GT!LK>R^KI)+dCs@_{!{UHWzLdB;phLDyf*4zyL{yH^Jm|B|7%Fx`Y(FI zF{?16$doHJt8?<6!!f&6w*2ouS#|$mkG|&@r*E%k9NqV3`@xA-#n0qtx8;0z_be+t zp>vY`yqe@SGkrdO5SG0lBk?pbCvT7F6`2WI3fuJjvhr5h7koYUWoGMt&V3FqF3k2j zziQd?!UGGZ-;O%j(U@g#S6Eqe?$@(J^7}uZ-{N#^%ZEyr=&M|3e!ht+F)p9DEb(Sg z`HZ`{C3)O8%RAn8`qaL#oU-9Sv3^0Wl349d<9j^Pd=q%KeNmsgc7t&C{)BVA+ZUDi zeXalSYSZD<X=kpljm~zTHhF5LYGqMJQO)Idp$AT>Cl*S+<yUz=cY-bZ<(YD`i?@m8 z6xcmK)^8QP_JVi&+xc70GrZm>uOmM7<$;eEPM`ewj3IkQZ>FyFDMta`<uY6J8&#G! zFz4^z^@b}TO)^K?Z)UstyRx9=O!kKH{BP$g-8&U^>W9VjmH%$XJo5c|pGkD#*=CCu z;t9dL&UPC7KY6;Of2^wS^t-nzwCt1gxgV{|KISh7S^96%nWwHs)0!$1|5QE?HkdB? z+w1qklkfdZn$<Y=mgs!2N|=|queYBm<KHK{L;FsezmHA1yZ`sQK8FmUxzAqrE7xWv zicI*{yPtE9)H2NnSNkXEUKHB2=fIqHiS^5-sTf%M9#N<i$T6GG@ge8eqYGz#98`-c zU~J!CId$$oH-<T1E^obaXYHJ?&oa&%e758MVyY8d{mDd2Vo~#qPrOU~oh2_k{QJUE zeYS9ItNOIVH^d^f6Eit>v;7f?uXrlEC}+Xj%fDx@eat=IZC$Hm9qa%2>sCMSUf679 zlx6<#-WA6S7SEy{+_PY^*7$C;tm4xjlR~#|vOk*ldUQW;a&(=^w7lq2(;JZ&-!+%q z4k^9&FO5-X#l>>gz})xTvbX*pU7V2StpAnm?Y+7)a)LMQ(q9KvXCKeWm$>>k=e_ce z`xo!EKh)2eQ#Jkiv+1|?YNu5%=GeYHZ?m~M|JiSL99>JxI%KZ4&hvCOUy)$%?pHAB zcUm~_<ZWTRLJq%*8_nN*VSK)m*=6nf;(0ZE!dICWhBqZz|GX3OVZ+=S#V@Bqf8V}c zz?Qp1e@lG%HQmAk6Pe`Q?LR*Lwz#bH7USOS<`s|L-%5Y`vDxn{>+@#yx*K&jZi*iH zRD0iTlg2gnIajtcbKB)I+de;V)P_r?VBXP#mXnt>S2HiXp0{>xrc!k0vZD#9%U5%% z|BQLDb(+K5{MlLD8@~QvY?yuN@;gSKqFbJ_bFy~FHp#5%os+fhZ}Nf0O|R^v?;QT( zSbe%mz{~in(~Fl=y9=i+&vKvr_LcauD&`HQJbSN6H}pCG&Szw2|Cwd)=rw<pY@X?5 z{g!#Fm^2wP1*Pw%@O|3)WTkc1X5S;Zcb?}&Jo;i{{W!kB&Xe<_>hfQ#ZcGKNbN#q# z1!V-BWEAe#ay-(wU&G?sb!pWvYrj|C2WFLh@_unlJ$}n&{afvCPk&Rb{v?<reZpnl zuOj0$e}p$ISDc!-o8|9*js}IB&udRQp1fiH|CZ}6dr6)Nk`GJf?dvvpFf%(K@e@}U zqrs7Rs{iM2u4e3i_)4CA-)>`T>)o3-ItnP6KMGq?u~oECUC`@_>MC8`t8T0JXlSlg zn#GcRbnUxUOZTh@51qOw)G72rmZ<CMJsPui+?Tqd`v3Fab0@#o)K7o@zkc5S=NEsz zDSUQjX7Rq~XJ*dym6A$iGyi(fu+HYnF_GzWE`L4Z`~F_QDVdEIY-<+U{Y#FNpRHJU zfBx3+I~r+c4nF3&q_C;)`5PW_WsXJa+25B69!#zf-YGdPa8cY<1^;7t&wZ~pZxA_q z<Mp5Dr7s?}ly#d}EDSY&D_kZ2?Any(Wh<g4bzJr=KO);=;ZShrUVvNKi@C2Bo=Y>3 zU!`t!>Wru5Tb|U;V3Q+~hq|_RT8Ky1zL_kLwsyO{#dpzCx5hnr7dDkU%~lXxHTU|- zye!)rO`)2H)&;#|ub6n|+{_CvQVo~yda~lMpv){LVdsR;+cYhXnV+A@<ZN#|!%%a> zVuKCJ$&+UMd$2Nj-#ek_yVal16P)qU>WPOI&zTqNAGS=CJTrHrxW!F9?c|`ef^$#) zPB4;RKKDw{MAqjb){5!VjXMN3`xUI(VVe<SP-uQ8yh2mJ)@G4@$p61dyIpTTy6aH3 zLe^&6wIjA6ey2>9pAfrYXefTY{W8;Kv#ubQJ?v)tuc{l**s5gwe4?=dXS#slEcfsH z2a6+&<L?XkTy<p)?+~`BdigS-%H`i~&!tJ91l*%F`pY6r!v1ac^O&VF`NPg@(N$^Z zE-XG5m}^vgOtzFw?YwYf^o%U~D0%sL#`of9eT`gE?(!jF@9v+O=Mt(|WHub0#(prw zxZ=&Fq`>=!wpm0U+TfErVNR6!1Y-}klI8!B^3LDoc4mD3e9^J(N9>;*<cSTD<}5A= zyrTQY-C};j4o}+}bKyKUt8Y$Io=i=7IsF!^eCx69+Z#F_tn*o0z9ZsSn%eRyDQvsC z{&(2SJo!jV+(Z1o;Pl;2%<3;^f0|M4y5-5#v|RCYxvFI=U(DK5TF{mI<~rX8`D>n! zHyu?~IFuLPv--|e{-?b&PO%!==SlO_8a_YxxJTN^;CS3->9PyXyVLI<*4+1c$^pK+ zXXGFA$nk!CA>`HCKBtnMxl-J9-IIIgSw4NgA>MQ0!@i^Y56_D|+O(YE)b5g_dh5G9 z_HOZ8BhlA2IW{oIW>fe3p6P6bmJ+##*05cExY^?V)UyKXJ7;w!g`G&^vul`{+81Fe z$}dnj)wrZ_M(;LOW3H~r|BkVqY(2AN%I)`Votuu%3A3tJ)|pcrq-SyT*Au6-qU*OG zpLbS2e>h_Q3m&B|@vhs~AMozEK5yoo-Pc>T1gzqC;jm6sOV{e*+I<Vn{yhn)S2(XI zRK#X}q5Hkffe#vURwU2pJeTo%e_5NwQS;wo?}c}M4$eCqyyVXmq3Ug$UT>FLzxw)7 z*>sl`u`X$Ur%XEVtSMo)hvDIl*=J5Kx~62YEAGIBtXbhk`&R9k@Z3G8N%`JSUmX)Y zm7hnK^2@cRh%H;Q@%IAX;EH=SvQZYVtKv?sC^3v&!<qJ{;N%Hy*{fl0i79`l$TzK= z_^7FJ;-Q>Rr5n9h*+0+AR4_l>dVT8}`3Lcaw{FKDSGc2SpOj|(<Nn^f{;Au1kGkB` zblk@%^!2vPL*a{iqNWJ@<j#t;f86wAi`s_DJFm_xDHLb=DLmIey;F~S*_syiqmtRq zvE5Cv*AI7Zck{DZsxRB;?VtU4n~E*hlSgwVZi+LBchSgRJ0s|DbF9#xgK?aXmMNsF zZhN&O$ME#DbMf7l*V}HraQt|`=WBuR{Ecxwfs2pyEi77C_}V#iQr)}+mhWu!eD9jf zq?ygR*eAd9`(aQa{_ghUqox(!|5hxy^uzYi{LR}B{JL(Kl@xSs+JTaq-)dR`kyC_u zM3%W(y;b;q>F0h~<Lp^8rtT~0skfX`YH700<BPlen!I}w6{XLGCr^*y>bz2>_@X!P zx=W?SxBI>w4Z%E>9~74`ZWNxy{kuc>nrk-uU(ThQuO03@C3NJALU8JZ^&*b*w;CC1 zW`Au-Tr~4~N|uFH7~7|`16rk@cT9a`_kqdI_=J)E(Jm{O&U1Ca{9A>~lOwOE+V8In zEvfdr_A|h3;t6q$xGw^B>_zFflNam!PL<?->-x?6|HR*Xd%O%UJ=eN(d+H;*vQxT- zOS;*+gO0dr+}M~|Xmmz8X)pWo+glw<)<ziV9pzS!pK~OBn|hOzVM=%W4*&HkkB-RJ zXUy3zaR240jbR#2Oj5=-OcuWI<mcIP`;o|<gAda#DCaRgaZU_$IQP_};ugE0$~2uS zr;DbB|KDw%{<`4xgs10kn`_0HOelY}qo6<j&O3K8tG9vcZ%glY?)&kla+wF$H1YC% zKdV+(CD}gW+IF>B`P4kW6SEuUSx*1!YJC2H<ZtK9sueT;PSe;vlY9Q6mRSzM*W3Bu zmU#3R9}IZ;?o`Xhhe!F(`A9tDe|XB|5dTg2cE#V@-f=v+*2H7Yr_1r?#e`oR_hjC3 zJ(*g5^Zop`-_DZ%CY3FVn0!y*_p{E8aZITtUk(@QG0r{cS@4ywv+B0^t8HloLVCMz z|7xE6q3MFAjfL#Jg&iM!WSjDx+uN;X9lR2_Ximbb83D&XB)r<auut%y=gkULBgN!7 zGj123vlDnNR#E;+KQp=O=|zFUBX2$@RbH3W%WUJHWo)V>Z9efr^}?bb5B_|(nUFts zZ?kD}S8qbqkGc1o_WnKi<yE!XL4nd%HOIA^@^_bsRSM4uR?BV8IH4)9P;AZ?so0NN z6}r1_n|`SJl5Bp!poB|(s_(0rt&<bpvaX%WRo*}Ipy!SdFWGsLKDmNkvcf*OmwyC& zs0#Gm;UJ!pnwo#VOZe!6H*df77%JE=|H@nXfzSNP!T$RJ?E1UD*4zImC@uJ{d+6(; zujU^n=+)fq<<H!HKx)|==Y@$kbS2ZbtJvu1|BLDQtt%R-w<qRdG`nGolEMe8?vFBp zQulOB1hd*UpF6U3+mZcS8pQqg`dXy5{9PjSP0)IYX>+~E!>cFnum92`Gx=eXL)#{$ z2f18#(%kz#<r{u@@bFtRt6_e}?mbfqG_3bO7Lcf@e8h9qqFcn9$7b8Xf4a_pq-8AU z%-fyTIaBG+{$7{Kye9(QZ&J?wuxH0=d;8Lk6;HbVb}5_wS=BDlA*}D5BK~rDg5x9p zt=^mESM;q4nNf7^!0Qt`J9jH~|5d1o*|FnZT$$7IwHuCS1?}drc5Nx~Yt*QZ(ol7p zGc%&u<p6V*1@H8~k20j@94is`32=WCdceeRr)cW}g^Euh4eQVJKabI9FlUn7|NKqX z+~REt9LD!w&S|=4xt#mM(W<@k%ce<vUH5)ZcE{|ziyW5KyB=JYGuFu4bi{Jc_r?`@ zp3<>B>$DcdscJ4dSNUD>!n~_Te%ziMb#Q9r45@boY)8EmQqwMQd=q;;skk6fG+3?9 z&?P42&!J_t_w9w(TPEF9T@|n5#k1^}>*fP{Z>)4L+x$?m_)<wBr%m2|J?^D4n$_`b z%WdVqosME$K4;@D1J<Ndb^fz$_cduxn6xP@#_V%&*p0JErvhGIRGU%cC!)!na&&28 zbF%Eb?XLrF=;c0HaXnt_=7PjqdzEhSe2gj-x?^6#^G4^=XJwg3Z{{A2(p*>a=F^8Q za*qr)E^a%weE+`{71nR&eC~SndQZouz>q)fJ5p}Ot5qLL%$K(QCtsf+v&{0%`}~{t z4L0xJ_%(daDdUuoYa6^j^0{~Y*d6sJSL5Hmc^~4x`~UiXL;jL|f0@M}Lq2!=kKa>2 zeqZ*Z=J)@<>LIodqmR%3_~Wit`BawU$N#?lrBkhN>D{$0m%~rLEiRJQ-@Z8O#_j1( zx7G0;KkohW-^U+&*KRnv=?`boZ%>(d3xBV*INoI^`sUAJ*SYN7=QAI^`rQ5K^Rb3s zcbsef_0-k{O)J*FwlPW2d%u$1dye4w=R3|@)_wgc{&A<^ZyS|k>y`^9Uw>b*WpAuh z?sWTzyx%8s!*}K?Z-4r9TjrF#Yt^@3ee%uGwAy<As=c*td9p>;=9li-scz?eViuPd z9=dUR@sn-a?(nV3$?p%@w0+i{ZQI|xojfi1Xo7XmG}&)mWgl<8Ot1NGT07n6zQ*>s zPrj+IzpE#`=iBqCamTxYzkOGm{<K>&Wr0uqxBW}iPk(XQ`S<RY?T(lA@)!KM<D2*T z^xMk*y?52Ob3fTO>(0ANZ|i1e_6yX`y5l$TcFfMR({3B`{kgZ?&Z|yNZ@cr8Z>Brn zDsRvHw&L>alYeKO`r=k}+ad4usoW)ZW)<15NH6XGD|^)A<MvfQq;>zfb?)EaX|vwq zty{U})aXNhC&=7i+Y;?j-uiU%7w$t(=X{GXaFKe}$a%>?{>;?2%EVriGyK*|66-7! zct0QU%$%XW&in8l#;Z(+{|M^Eep3&$idyn~(-*#T+ha~Gj#aDNv)ah=wy0~|!&T1b zN^RZdz0ErHX^WzN*;e)Q#igp}%Wb{m9!NRFy^!*Wdm`of?||vNKNGe4_gpb;-E+pY z_iCcq&)n-VpRCs%eX?;K|H;cS^CwK-@u2Kq<wYaTO|@-Z|F;#UIDWT2=5;tIrO*3o zso~~jn&C-)34Td_>HoI7|CA^;EH(|coVe4pSpS*gna4A(8@^Bb*ZNcGbM3RPxTnfz z!e<oMobsOW-S~g|Ppi$BgVr6GbLLKOrABc_rR3+ZXSHYc8^)*XJ1_G%Jn!@$uFp2l z>W%-OvoZClwEQf7=Dv}9+O|`g*OT5IwCViGoVa66y|Vps>s)=!^z;0wFFVi3&XJBi z6&-tj(*Cl)KKGtldEI+$<#+G7mE*sArEN6_zN-IpzaIL@f1UM{=5_5)4(n~-d}ja7 znkSRj6?_T|cbz8Zeed0>gO?uOx#nPf;`6U%GClY83v}xHb47c1_MhISHM@AhTB+{+ z`%i7ldJ~d+b;hav4}<gyw<_H)+^YKj?JLiH@2i@Z{-6BkglXfOD@`fW#gtx0+3mby zI{VGlXOnAh6%{!|`|@2ko20zuZp!{|w%+z?F)g{N^RGKUT-x_~-RY##Jk|ww*X@2# z>F2_5>+Q1F+dS4w27J6G^7&5D!6i4jF0W2{IXA^>M|(kI&f$57mLC<nrm&Z(?05aC zTk@BTnaY08PkLM5^=i&aP5x_LC-XDRPdab;{bb>+^P$h`vnD=y7?t~pV=d!P-?f~T zORmkc@j9*0f02!AKhM|cUr%y5?B2WT;MXs<Hs2kkLK3BZh4QYG<xaJB_~*JwHX(O= z#5U)fTXkZW)hpa~T=##2EL*Uw)2vTCy4^Oxvpwc5^;JE8?VkGn^|dbZ7Oz!1fA!kL z=b5ule%{LT$thR9a$;G>o(OBle-75}af|LM)~~4CVpP8*R7L-4)`aPqUr)+s`*YSe zz0H~b-Yn<&${Xi?Z^&Jq`0ntff)$f5U3gaS<;-*6!T)GorOI!nQ#w;?FLHTtZU6m< z<2AQOdE4#Ui(bLC7rS2loV%>X;kDntz}K#JE554AUpqFzKkMd`;9ESOBy$aa&e_&g z<9gd`-?FzV_b+{$ke_}0Wd9c7l=gq>H<!jMX8+RNwD7)Sb&0S3=J0+6^DB=}@P4t< z*(<j*BHLx(imeLmFKtgS?v=NUk@s1*tY6Xn_2Uy8f2kDhkyE;UW%=anmzz&+{kn6_ zoTE>E{R#?ue)UQ6t@J04Z^eCzearGQe{Dxi{BEChOa8mATN7SjEo0ZADk&X$STV0W zWBJiPk?Jy!3fPaO2>a+?=<E10?ZsS)+nFz7rSAOt=2E}<;M=nLFL}IjQhdDaKg;^r z?4=E&c6n4NO^fgND1YdSlTLk~PrKo#g+A?-byL5TKIDC|SL)2?+XnyR&cti*CO;Rb zvY%GZ^;h>-&<@*W4{G$=ZzpTHZ8<Dzxy<jhrDg20_^HWSZvQUCDHXFnw}`FW6gS_- z)nA4EtJss3RoS0RY+Gx>-n;#CKCdwU`tOP9FV;^;f2n-p^OwRWTYrUovZ_`4X<RE< z+5Atja`L`Odm{hO+T(iPFK)?yhkpU~j`vpGSA2g_egb!Cf8aCuuU=1@tD--huS)+^ z_E)l~(Qd*XZ+Vw{Yxz~>uijUgf5m;`^jE?sw7=SX%Bt0?oWE~QO-#J|ztH;*b_?Gt z)vtN4u7AB=WMBK^qwmV&D?3(iFFhfo$y*q)+vdoB>tBw7^Zgede`H(B{$;mS&-8aQ z>TRCAkDhl|-@rd<p8DtJ>50E8WRG2u%9IF}j+|+2U>n}Par6AC#as5s{tx({{Pb;w zy^`O9ic0H$`%^yhzuZ4<`{Vx|IqfcKhW5LsntpfPbiB4TXV?14d*4N;%-`LTvr~S; z;X6y8G~E6$W#=C2zL<k|8)P2lIjwt>r&hyw&h^?`xoszv-zfXDX8d=zI-@xC!qOXU zTQBmNf4OLX!O#3l;B2l9>z}nf+P$FEe9PO<q6=&vZ(M40ao6uYjpx2+lK)q{XW1hB z*?)DycFQa3`<w1QTkE>;vi6PKe{IfNEti~Mk+8ioyFcsmwUWO6-BV}pxP0>b?s!%H z!hRM0(*3@2@8taJ4$XDXdpOU}ukd_Is-F7y;`M6$#sANovhm7$Z+G&P<>^oHisgm( z)xKYPKe75X-{v#5UyeO#d^c^GmU`=)cki6){N#1_Fx(2>c3vyzf7^}n*&F<&cP+eM zo=~+&`cb0%F6+MO$v67%mcBS{pHlC5_uR>UO;&T#f97xev((7`3S*st)F=Oj^a-MG z|K%P&CbDF=)~&zR2Sff^H=avvi>~aeW~*FRZCE+4nzeG@@8C~N-@`r?edm8t`cD4j z{N4SN&3E`ut}mRgT>oI7U)&=-#rhX@4*yQP{j@5%@`UtV(G&M~te&ua_u~`RcS}!H z-|?TczkIv;|2KZh|DVaZ**&Z4uDSD9@8=Zj>3eS4_SPJ*oj-MR><#|EO1F1bxxTn8 zaO`CAr3?H07c77Hwr+Npfc;Mk`w}<*<3AUQKbzV4Gkz7vM}y0McXPB~Uz#Xu8YJ~> zW}%V&6w6SlM+J6OVpXPA^3NymzIgc}SM;q!vsJxv@*C?yz1yihOE*b0e~~phwr}$D zc_(z9WjWt8>6^6onB}JPJDj%l{7%{b@Z(g=Gb_B-Wtk|bOZZQaH=lIUw@2iYeb2fl zac=rWmB|V_n+#iGE=sud8QfC|H#)Y#swcUWW8!>+XOp5Ox=*a_efnhEvE@%hlBIWU z-Z=kH&qv{(mXGCjZg1S5!0>lX;)LIlPfwifIrT)(t!e40#^<fS4b<M&{S-}pvrzgP ze|-{<%@K*+t#vIQgS#rd4As_h?5UF!m>hb+kNMiej~UY$Uw`-|Sn>DJ>6eo)1^7j0 zYV7xBi96l%_|cBNOBLt+_I9@6pW0SY=l+hn(7JW1G5_0RUqW95^*q$Sz_(}Ddk5=_ zzc2iFajVecP+xIIyRu-}obO_9KYO>xKHnTM$NASq4(oH(r@#56ynFCxx_jl)=a!$e z&U+uKcbIA9&v`Aewbpdil55^iXG(`{daclX(27SuUP$|9sl<U-1`T~*Tiq*HKM(yB zKF{$<?!4<KZ`(SbWSuAYWbV8`o&Oor>UAo&r!)PuK41OBc3#Xw^@aa7*~w}h{8`uc z{I=}ggUq$&40{DHw|hBH?sv{VwDfPvH8t)T=3$$D^PRdMa`N5olZWC@m1+MLRe5Pt zyE$k3$u)P?g6HyAPU)|7dJ=E@^NH}h$S210c0SoWk5%V?(zO4|pFGbOeVRY-s?PcS zk@Ngp%M*6r{A$_owm{(abMr6fZ{&$zY~NVxwPfMlo>OJB5A2(Fs%&<Sh?(~7+)ER- zaxSUXzMZ>i;?|RHtIp^4f3iK#_v!w;xlh>Vy+6TkYd=B0vQBY&RbA@ue}31_UQRh| z<Ns~e(UjABy!d9QJ}LMtx3j5ozD)MCO|_-<GY|VrjybC1-e+?7Wa!ybPhO>k?$<It zxBk=`*FN*toa_s7Q=?r&+blm!W1lB_Wi8L&PvYMKgEL<&=DT!Z<=xc!gZpe#>JRSz zJ8#qed#Qg}U+zt*Kl%OtjriUbcD+7Nk39>1qJH+-ljUbbii|h&Tb_L5?PvDiGcU1E zZM(_l*7)O}xAsr%em*<nP-)^ela&7ge|K<RZ#Avh*X!GHTX*Ws-ReI6CJTN0Je_~Z zZ}MI6r+Aa^gWvqmQ)hok$z^&eo-+H%2D6h3t(MO^WqbDJ6P{wzpOu>%?p(L=t2?>J zQ!e43Z{5w3mZ?8QFRSd&3RB`Y%AOQ&96gDBw(W`h8O$e~&-#2aC^o2^^3%U)nq`yC zEt$iYj!(XCSbS3WjKI!*%h`9X$9T!5uS@>9o#X!Te_L;_EfRfkeA|uvoR==}biOFN zvETE>H?^4W)(fm>e7M{6?uCeOUF!w!&;|FcXML!7@Kx)=by-6>x5O%`W&P_9-Q!Q1 zXCi#;Tuh0&@UhcDXN23spZZ^%dnP*R{@EGJWsjX-r&adH;qU&nNyqtX=BJg5TGvHw z$hKNiAAYn?{^wljp82v@)PjAUN<LHk<g<B(&FwvI^OEl=#hbpLe16uvqEx$dwiDuK zG(OEw<1N}4*<N!o$7NrR+SK5u%O^jdDfwjavx05;Vz<A?hW-1kb6zRz-2M}+&%!?C z73){-uk88LTsf=efR5V#lzS@jX7U?%&19VV-0+i-@!Xh%w29@jD-Z2=ynk}v5AMfW z?8!mhTX+p6+s+-G(c|(w(dU|r|DhQ<E%SN|Z)yo8sdW_I&=gA2%s6EHaNZ0%(d3t| zKK+L}B$X~dJe*O&cPw4**-1nH&f4Yfw>GkWog<ieTyD?xS(2H@?{SJ%Pq5Rz)Mxwi zuYS*7*OGVJeV*Qa7W66p+44i$3w>s$tIxacn=^U-hCK6)|J0urYFl0@d}y7q{7IpG z^6|etr>^fk75AR);r<U1WmT=KcAWcui1E>qg@2_NnCfq--@NKu;oUboKE&==vZ`qB z!M@!S`$7+{mU(LH(DzMF{dnd1NwcfEPnhnxe!_Gw|H-X;o*p_Kb6nan@4;Hfycf9+ zeqYR#%s;73o?UgD>u~vfp%mNpM?c#Vt$U`nm7Q>&ez<H#CtrmkpZMa#dj;B8Uwpb( zpglgU_1`Lv`1$2;T-+-Z*VV0A_3Uu*3$M6}cU7XFTPhRnY8qZ9#&txOn|kQC|885% z9LKSJMOIO-;;R_h%dZowa%b|r4Ol))c6C8t>C%U_-g~pk?9V0s<#^d2y7_lt-F?B| zhP}5|Ee*Fkdb@qjtJ>x{&tyH{y^-~u_xP;p_b+WHChu)O5xn>K$;*3|pS-*`{G{=o z@{`7U`A=-#TUA-ABfqnIyG>=o_s~zP?*%?NcyHws#d|-WEWCIA<l#N{C$(4ePjs*7 zpX6S3e)92(_Y;m+$#1d=6b+g8>j~q%`U&x0w~6O**Q(t9b2LjJ{H%dmyN9#SzE;0O zGv;*U^%+|7&h0VWDR7r5xk&Vwr*_Xt-m417qADNS)k^Q$D*o>B_eHlW9@_mC*fq0! z_6JVM@PPUEQ*{o0Pw_t$q4oRkq?bm2r}U`)jE(A9YFE<7z4w%SMZCa2?(^6E)(fzf z#wDD04g6nx?xp&tBkm{Pb8Y(cJ8<S^-KUk;ay~I-Ph8c!b=saAzh><@a%<(UqnoGy z+4Nlflf(JMtMT)apE%CD{N%cA{Ur8ky-D{!#3=HAzN6It;fL0=pT7PqmD2(z+uUB^ zJ}-HT@_ExZ)$_*pRL+|pn<OsvexkkEv<cIt=T8imntdX>=j{{!-q<I)$Mm19J!bjI z+>Ntx_eb-}<sT>PIemcL^Tpk^`FoCcsEA8_eDc26>dC2j)1G9_+xJAnzrJXT`ed2M zlHPq^eH4#ZrcHco%YDMs=JW~9d8JQ&&5J+5YnvYNmw9T)-{cdmZnB@gyE%XITx|Js z%Ek7YTPIZJ8@o-;mnc55y|?no?_=&M%hN?~e>eHL=;6AUXWnhoYi@EV$D3+RUN5=z zgn3WeliP0LMV%LC?>Qso8JCzk`Fd3F$@x*-C+0_LpO_yVeKLCO`;+mJ?k8`rQTkN& zTCQ?lYMAEdy46gU=YyMNzL+Tbf8C<M|9Oj={j#rW<`>u|2yZn%;k!lf$+lZ5Mb^1m zmaen?-Yuzhtc&?Q=}yG&wmTuWz3YOkUHmTfO`g1U^AoXKl|{SCy63#F^!Rt;lG5ot zr$0^p|8%um+|$*rac{F-;$C~J)xXO2j(h&vDenDgh5Qd+mGi%RRnPy#tCIhXS26$N zUf+MG%sc;V&6m=ySFBu~&-pX@{{EA@*YZC3do8Uf`n=yKqu15bo~zt^`EznkrQW3b z-+ru~_A}OBXXj4!sdpl(C)S*(Xs)>-;cu7ZqbP5jHgR^vw8{47*Cxhq*{Aq@JJ(6( zHHUT17k(<g7Fo8Ydd<0WS*i0L7@oK}PwI*OnqN<P!;C-Gt!A#A|K9Qw<9&}${`<C{ zu>XBeQT~%}TII4y{XdsYuK#>i`TM4All*^{O*sFHZ^HSXe3SHl{8RY<a<_xtrq zFL#yVzgaFiRdY7n&TFcqbKQ&8j&)D6J<1}^p748JxhZY0&$p=L6L#4)H}juPTD;cs zN!vB|C&#YY6$!r<xc!}F=bW$dMF*_h_3}k0E3b`yk~M8})y%~@_LjF+Ijl>(s(5{i z)P(Hl-jk(k(w-a(^DYwBp896{u8FfFZBMR`JU=;p`>%=jH~gA>e`DL^<59|y^R}OG zUR!?R@S4si6R(Mcons3-rxtcjtjIfCdgs=y)9+lfa=5l8`N_F!yq_*#%Pk5&Eg1W( z#9O(1bInDqdetKT)ml5Jht9ooyK2s#HCJ2i9QRV%zCGxq?3#B^qW3XAxnHY%(%0s3 z>->hV8)EL;HNSom8MZBA{(cSK{U?($MAm%1zx_d6QHjW!hxfOu9em$A@nwO&rRk}- z^UjuvXFfNjOVyO~eg1Ov`3-sZmDN|z8riRD-<~i}Vc&A?BR0XkmPz-OUrgBO@Pp^s z%(nMj>o*nsJND(}k9p@-<W1*%9qnIwBKYFx#v9xBd<lA}k@-W_X=_Sd1pBphdH0(S zNUiBJS>yT2==$n)=T>``md53#SZ+wm=zh8N!|%GgOBBz4-jSc1+j^s1VV9NN(@Npb zR}Q{s+^2oIaqAI_%9tH`{nOiCe`2{)zAt~NMtawmtcR?ZvRlHFXL8pDJY(~Te-W*H ziF?U)?*A=uZ?pyf#Y)|C7kRv|`{U~S^`6eIUo))FPgnAHF<GL2&}QR|eMh#l*3F;b zbG%$~#=nXD`|e+o+k1ume15g(VdJhd8NX{1V+}QK*}3n~+b_2ER;A09tmm9Y_A!e$ zFAhC(rX$Sov*VVonf{AH&(uh+eUu`u{XDudX2-SnY5)4JK6DRjzyEaK1~!Y6uL@>f zeJHn@`OluzNLj68E3A$jTT%2V>CNLqzZC7<rry+Wn|jm8ZR*XLQ-A7c7cbBez9zl? zgi+$&k6ArkCnp+esU1JQV#XYq#g7W6>9BvBt9!a}>#5&s^5i$~sy+5<Tkq9e`PH}e zH~DBh*I4$y<>{QXm+4P7Cd@51bL+i-+A!<Sv?D7%zV6uiz4gzzi0b$V@tsQ&W0x4d z-k9~K<>;!7!m_K6`5lfhEt}UBnyjuG);l+DW7Zp<j?m=i^EYO_*(1FAn4dvd@7&gn zS#Q>KgeIrQu932iPQH5Mru6D#=hkn`dJ{A0Ip6cr$a%_ZUavc{YKLxTXyNMPC*SvX z+Pt&4+W)~??9?wqJHM~VNpoHue`0a9UpCS*vv8Gs^@cC=3d?E}Y;Sg3I!j%fu=jCD z{2r0zzmg*6yz1sGT&3SsxJv)o@s;}`B$xks)NOH9oV9S3eqBd!ZK0Ci*P}}<u8OM` zuF{wJxJrLb#Z~dEk3!?G^oQ48G`eS39`Su!*Y@**>(;J)92&pm=<0nhbU!=KOMe_1 zpK@&VJ_*V7zm%-wzPi@!dDY#zW{&H}tUYTw!XKx`?vc`uj`+8B)4UJHo8t}Z&+h5{ zIlJQb&Pe^A_iSR99iH#<jPKmhx~EJ3$v#Q__x{A`zx5Nsf9X%S{zIQLzdiY65#RB{ zRw)bR=iQy_s{iTm=2NpP;^coUT<?96v%;2l{laT(AJ3efIX~^+oJ#%A>(8j3nK$c{ z>CD+i-&5*ZExRrIE9HutS)TfFO8l>T@y70jYh6d<b)h$PE#E3_5580W5&7&OXPNxg zslS(>F8ML}#GQjbXU6|5{$KlvZNLAS_4y8#M*d|?TYg&Q{FjVqFa6Q>+qrU0)|-eA z#@ADiYZbFUH{1Wo{GZkn*?$_JzW>|xME+0b6Xt*FC)oe$p4k02_r(35mru0*yQlNN z_>la=oi|Evv^?J=dOp?smv+z6#V^+X{cvYD$N56-fBFUQ7VJOt?fbP&=eJv1->-X9 z^ZR09|IexVKYw%oPKciww^>Z)HOIAuoWI1^IA?zeT;sewN{da+=zQA09oPQX^!+tj zeg1SvyL8>t+5a9siT=0!MERfO6W{-KpX~o5ee&Ff+7#P2DmR6{vELLgn=2#6c0KO) z(?fFV?d_=(PPczmc5mD3_U_p!rSkG#_3s5wCsprqdLkaX`K10%JC*O{YZdtm)~e6n zW;XGBWb}#WYh|A#y*Bu{=&SrE)z?BlH<h;6T)p(@RLxl~<@oJdlk=lEpG1e%eu@uE z{$#sa^yj{>JU<(+PXBYEs`t+cDc7<en@{@v57~73zg^^aeP#F7+Jl$&r@dr-k{(-q zvNpzk(){ATPJKMqhrjJTaB7d%9+}7Y`wp)+Jhwja&wKay<3Ijy72DT;tT4Q1Uu*GQ z<}bN2&HHX?{aZXk+F*N%UwU0<rNw8TXPl)|(hc>~@13ieu(Rc6bokH0XEo2Jo|!%K zyV3t+H7nQIK6jRmTgRPS#I*iM{pk`3{qL`DU1xf6nO&!U{k*yCzpk%Jf8O}->-FHu zRVQsOTn{ulFZuA5&iP~`{x6xeGui9n-I<@YeSK58@=bc$<+-oE|5ou*zqYx4yIW)x z`^Jj!zTzp9vaMo1rmlOvLe)m%)byYCSF?W<Znj@!DE(TJegEns8~4a{xBpsGKXZSg z-HDpkn-?8+S``~V%RAFNL)}<E{okaY>CcMK@c%57-V~8^E}^d1vcEEE(Wlb1&xKEa zozb0<ZdiY8Pq*driJ!Qh{p^j*F@B$JcfMx2<+9GA<Y&)kv>TjHh&%d6^t0!)*Jnik zFN~SJQ@A+(S<JJaXYL#PKlrD^a?i>l-e=#=6#8qJC+3}>b8yZ{n^~3LCZGDBWOw2Z z`{w_ePa~e0JQJVs|D?^#O2N;5&y>&98@HP#KR<n^(XzQx;IqiHqi5zD<)_=7_)|CO zQ`9rrGwCz`C#|~{vs1BH|C!?%#b>H#UeDm3QJ=^6IiiPo*?D7~zeb<uKKo|FQ~coW zvu}5}_p`r@E3ST*tM+**H1FN)*xC75{)xKG+lZ>_hx=zg{$62N|1{;#Ow&2}*^7l` z3*P3n)ye#yKTq>y!2h<0|2!p&?y8+EyQ>s=Hz?w6(2E^wXWX`|nl!(VM`gJs+hl7? zw+Zvho=n(np|-hpI_G}2(g{zWC(fPyc;^{c^~XDP+_xVn{>gOr665+8<qvmmIrfQ9 zZFAv~H#rMs4#u=s=4d~CdB%I@{)B&xm9^PVozFa<8Jjyr+tB{#oo37Zdy886-t0J2 z8a!q4%*!*`4f<2(9p2Nmv*D+~XVbLsRYfMn%FmY1j88e2RyY4A_p|pi^$q!7pIGO6 zW}!)$?u#WdZ`S<zcKOuz8Q;qjk0;d~k+~jP>1h7c_e}N7?wPOc7vGt=Q~oo{vzupT z&n(`x`CpRX>xF-;iaRRn^q>0A*q>x~pr-fc)P-{n{1N$Fe8zdka%27Ef75<ye2z_9 zy}c;-S>Kt%GmB^ZKf0&&r^#pCXIkgA?2p}<Y&qHT$REYede4;4JfHdAV0P_|uiZQC zioKuZonfBgZuH#neEPqZpV`lB&)9!&+_}Z_7mt<X|N3LsFX(=3|0wr$<N88_@af++ zt}pyh{a@z%&Fd2zH?8@ysieJDHqy7aPX5_*8R--H7JL(aTlP)<ZRPhz{@Xm=E0f-= zl5MiD(`fp~YMgOkXVK;0_raz8>_)b>wwEv2*1p_lYdkmX)UM~(c5eSQuliL)=<?rp z93B4#2n!@%;aDWk#=F8%RY9;vLQpU%fu;UWK+U2AfltC8l;zi5kK6isPI0=?<0I?O zxZe-WUi&wqdi~aKx3b^Y9y|Ddck_S#hWqVrz2?eSbi6*q9A*8Dvu^6OKIW$Q#akag zZPz%>yy|gjQ@rZVG?x8tzo)!Qv{$oNFS>c3!DZ*ZM<>3DzCC}YQTlUftM%u%_tPJm zpDow?v;Em_(S0WJAwSg5%sXVCeT=LA%$<NAkEdv-{t!Ro^Dy2dyVX9iF6v>tk$m`% z$<Knh{&)S{a%g{6UHC))z<*O8#v9KM|8f1SxadFK&*fbIxBYZ)tv~)}_M!QP|5tvH zpYcEJ2mje{(SORHO<V2L|G7W3H+%R!`iK7+caeX=pBHo0AN(`pP<>h&SN+8pjX%?$ zsf+&8{(PG2|JI*t4#gYI5C4&WCSK!D>Sxu~`tyJG9@?M(&-LMbga1oE<j?wEf8vmR z@;>*6=4bgC{(N4tdX4&gwYfHGv43R_24A|WFI3~S>(_af=_1c-u3kLpU$>>*-u=VM zgXY`n{XWb*SlnyQxsK<a?*I1wMS1pW(f_y}{_i|hcX#D;YdOU~H)@#9-<318Ki2h| zW&Y&eKLQ`m@Xl-g^I`G6H~j*83@YM&{t*1lKIP*d!QbqEVjulfuB?9dL|&kt@kjcZ z@0Yx1_Y0ocAM!P_X}{Zt*?!UgUmb|AZrPuD>g$0?d3HZ??Op%hFaLA)%KIAop1bWo zuJ;HYyD#>y;lPjGM}Pd+td$Q;^nZI`e&K_a%=I@L^<{r>^W}VsoPIjr{JHN=3(eV^ zPA>nvD7W)U+0jQ!GW=SOCw||4<MSS`OHXcP-h6sG^WNOGV$ZMlU02&*IpuzA>F2D# zXYRfmGoHJK2f2zrb+yYrH7VlVnrG&#)S2H+U$9Jk-F53#Gp?R(4ZAqyXic2|*V+5$ zRbQCq`}<DhO`q`3n`+;=-JDnc^^;}JhTSpK<oVXMUVrp_U*NuNGwqHyot~d<aAo=B z%nAOlyHic|{nyQGeixa4|NiU?`<oZ85)0j){Dy5sp2Ccyk23uF3wdNxxKDKdYH|Nq z5$ALMv+K_*KeN0N3ip+Z6jUAPm|Vs9CH&O#pNYZe9Tt@vnr!xCKfdxs0-LhXo0-c? zi{s4L+dqiDo%yJay~`o~<h_(wxr^o12`nf0`x;Dc&7Q(9_PqPoOQq*b_x^o;D`FL| z>&N=|z4Q6D6$$^<R?Mtv`JHTRt1UHaenI}F3-dRce`~&YBWC?;%Rr`CI}7@s8{V7! zN8yj>_cIT(@4WB(Wve*rt%{<sQy;_0Id?vn<X`#~C!sUDC~9ly-V^<+*V!_7ZQIWO zmL+*9hY=6kjX!H<oNt-p;(W>V;ymS(-@kv`oZ^vvepRIU(?1G#70RAox-=<K|I_hM z_Tu!Fl3$n275iKikSY)m-xqHDYK}aU)-t^<SEZkpiq8#tEPnLX(Kbd??ye;>X3Wx> zy=>XFzY+zSTQ^0-%B-E$D!c8(^0uxtuNuw-rL4z4w!T_ot^9;zf~L^%<L<7^-<%^f zWPV>c^ODVMQQLvm()G6md)+&a+HTo#Bsp=FYk!x`#P#mIOfSte>$9s(J}JEsjPUc` z%frC>ctW52^{b15eYj?<+$!bbG<ER=E92WP>R0Ap<}G;@I6o?==F-`}Q@*YW-pIV6 zv6S2HYt_|Qk<-n8MXqo^tB%>+uR1TH;>dfsH^1f17`-?nky8_OPxNNZ6~lR=hxT7d zu1w>o&Nf^+lh<v@Bopi9zJ)Un7d(4CZ<4C*(g^D*0?+s~6yBKZ|G!0N`cK`0l`d|v zyp=+-pZ=ygrioU0Jo{O4!dxoMUdi2NYhLEYNdl~$6|?*oaPS=C{<<jpK(d0VgVvb} ztGv^hdo4~*-ym=*<=2W9%~e{7hd2TZGaQ8~UjC2>3yq0ho^nL-#qSIjp{6z?&mLwM z@1u8)v3+e3ljygV_#<0y(eQ1tiO-^vH3~nrL?4>{G3m+MnU#AjYTZ_IEa`giN-NKq zF>RWtuE6mZ?r$Uo3vU#+o?-2io$}1p=xJZ>&9cV*!g{i5)yr&G&we-a>Y}xN;!i#A zTYs1%pP9H#`X7V)+#`h&{b!qhM>NfJi^<pe$~Nx`_rKpCeyM8IA7`^mTvWh%i1pmB z3sHW@ml-GS3f!GwF4wRlSHSdZa9D-^obSP<7W1m!t(vW+6{vqwPxP0<JgK?Nt1Pm; zPWee4i4A*Q<agRclQmN=<ARWk!H=hmihNZ}4}(gdKaOLV)}yZWpmSrONcXe_8TXi+ zX1Ip0mwGF3^SM&|qWo9Yp4)Cdc8cA&>(La0iCu5QBwh-c&gNF`>tExOygd9)eAo<! zuZLH;K3K(C(_=5g_JHO15B(R}>!lc1yDeBX@#7Nrux96rQ%|h>n((Zr!7-@xjdGiS zwBO3R6CSlGu%(8ma;p|xxaE+{mC~1#a&FSb7uLa#8L#$Flw$n)V#BsYZ8Cu_5<xqn zq&B5YoXWFouJ6UVXisBDmup&YwsUkP7Z-1xQMTia^}j8T6BkJwzn!Ew|JKI?g5CSi zHuY_OyijGDL(KVUQ=5NGu9MhPu;hR5*^8wGO=pfO3$~ZlL=-2csO9e3md&gAZ|UEp zr82KCcnbC$Kh$vThs7kL1*Ol+o<2$Xnsd#oKp-l2-r3j7!*U}hpFj2LOV3WG(9{pl zefyKM=UiLuT0Z+$kLj|gDX-6MTlG%%%!8{%w>oe4+$cO6mYraxW}Ln(@kRUn#=6T7 zHl8uanQXQw^xC>5DYv%ldUeaI%vW}Yq>A|~y@yiDrN5(##ZTWkYW>Xb=>$C$tKg3( z=4$@gWXzh%m)*DY@kF!iPvVXOyCn-B-2Kg2ez0lNcCihWFF&<g9_vs0ur;vm<Wv2X zN*m^!-m_Uz{l$T6r!w`Lo7*gZr(V<1;ro8&`}EIT+tz(uG)s!zZi1wh-mOVdtw%4& z1UueeB<*N@bxq&zEP;EGz8Aw6UkF(^dA0P;-qQ!0mrmTj`*_;h%MTJ*r`v7kd|(yu zVH3OKO}*d!Nq6h-Y+%dIi%2$In$NzD$Kr{hvFlkKu5vM^dzZZ4tqooEyjs9{x!bb7 zT}hl8Z@zx&<@%Pcu+C}s)R#+aT7B1D?GR(%Klx$D<?WL`Ub@Z}Isd4ty4*X-TwB@e z#))jte5!=Sc^7}Y*vKXFiS1C=8vj?XT!aMHtuRk`oFnr?_h{_C<ibMrw5^=q%vM*r z&%e;Hd9B&GZRr;3A=9lLm$bTXow$E@_3n4>(N~LZ?6|$4(tB3o<s)Xg8+KoO8FhQs zx3jxqZ!Tn-Zk0KGVe2)n*hTSSVI?QOHE+xRS@@GJQ7Fg#C);CJzD6tk19`vaTCv&e zElD`uvb>LX|K12+{pn2;yCilh{bKLy*yqj3c8NW_+rG3Tc=^}WZLH0bSC)SMbi`uA z*Ez-KtRkg-RkXaC?C$M~-TLOXFkd^<?iG82>`ec-XFG?j5;#+!>3wD4l$FolR142( z4ZS>tJMf6(`<<#cBNSg2td^E3N;K7Y&|6ejUYGRa{QsTGTW&b~$oVkeG1q(L+qGW7 z7LUWeYUymfx@Cs-#HBYIH}mp_ism*&^`5lVI5T_o!v@bjzC{wzo|nTfc^s6rJ>*cf z*<Iw$yEhYOG`OEu*m=a`x*f~&r#<XkPxCblw!|-ezau|1A->78+&h2Sp$9LSBo>L6 znn`YwQQDH$XK_nYPR-ox=;D^+=8k)oO<ym*exj%3o0DrIZf`EtT=?SL$|l~U*Fqku zB`?=GT;=<(=x#{<fw+<t-PRl5`$(6E_<C&>{(V-a{FLTp_p+n+M32W_dDfL!zQyy8 zj^?$X*GoHZ3iV#eQUCVe{bG*Q-SaV$?5DQa%C7LU-njdB&Zp`Uze)Gki!I+U)#k|L zb-5zq-^{$vKf7AQdHUR>>rcGC{@?ia$<9R$TBRTCg1&`Yo5vfN&uLRMXMCieD<*0G z?5gWh`6;s(a=Oc3mTyvUylwDz(;mKUk465x@47eh@vhgexTQDTelXk2C4zxPTJ5dN z>XeliPVPFhFu(iqrvLA@-}q6xVkzI}+fUEr&42iM-lmWDl<PB2C$L4@=bRTP`_(gl z#*MY%lU}?!dvO1$dVAefe9Pu-dd(=NKkr%b%gIVox7W5DI<va%{oS*V6W;CHId#8y z>7KoPJG?&1ZMnf7cE2O5-kbCOZNdN7I`*k6|JqiS-BbN*z4ryz%0Tly*VJZ6JQA+_ z*S2?0^{HK@A<BhcJ-#_h7T$TtWxcN85YHh^&KDD(7u?fcKIeDyr^(m+!*u62w5)vc z|3wp9lH07ZquQ)37niKQ^GYEl=kvPc;)?#GFL#7mRczlYdGh5sjivW&`kxm21Q<{4 zuW<V&lAv;Xt)O?MaMc5Y&t=>dEs=d|gT%hbm7ja~Jh*$}+3S5N9KpN88|?zi)VJ)c z&M2F3(0A{=haIg`s#)x09lol2PPA=G3dx(CJfrN{MG?^nhR;7vIl*%J_QfmCD?%pS zn0P#WebqMCpARRhbnKjc@WBtIMVosawywK*VVB#MbD?2-GLjbSx?2Xe&k6dG*(M&f zPGifO*Olu|UO17I5i!k1Z?@=n*EMfvuH9`EzQs-Dk4NETUH5`7vazLCCZ3u*+2oGj zbmQg~Nm;rA4JUtY7Fj;CSK2!3`Rv6E&UF`y{1ceo1ln!w?wjQIzt~1pC1lr5=?7(N zXWd?sqE$8Lrtp;z9lPMYXLqcgxm7zs)g_^oG0d$c$9m1}_B;3cx)*&+v3`-mBsn*E z$zR^KE4wCbi!%-O<8^=KeJ9y1tnSh)v295;6J7pxp4s6&;jqk&m?yC}KP{a;ao%%< zsB`U`{!Qw6{qTuHI@iMbx|rfkw?4mZ?S9>`@U_u}9@CX)<W^LFo1y2e)8?OBD7<o= zT5|a0$neQGogMVcj=!(ED(m>aT72rqlU`}E6W&*DOV||nq3-3h&C@w<d|k+4qrFdj zLVf)GhmV*3t2yrYVal5KB2_F$jEi0-tjXWbeC4L$WVf7p=WELGf)_8eKH~6MQ^}zg zC>HrsD)QyMpW7?T#UCBW`kNiRxlnq-S&L&wOe0P6d)+1EWXxMDg6==w`qJ!iN#fU! zer~VRJ>S1L`0~?(`O~^Lt^83Za__Uk-fGVY7P6iubxc7YbT=Ir;{LHqLt|}}g~>)P z?-;Rf%a{dknth04u5g!;RQswvkGbTK8<Vkg?_1d*#oi_RXMAJH<o_Wi_@!c3)|Y)R z8+k<Ua~-Nkx_b4eWJUDCpXa73$bFWPwOc>2u3rAcLd))q3->v!H2cGs|BQ^CU;Mu* zU>)<uuiu!nm$Uv2sR}ANs&H>+Xm=9d*W&k083i9S7u}NjFvZGNyIc6#*3Gv>uf`Z| z+p=QE*8d7qZ@9FroLo4IWBP~R*WMWRy_xEL<LHfAv$ECZbFZpR6w3VeK{)h4+(*VQ z&2s1awEDI_O%bqe`4^FPT9W<Yl(^Sl<?i2m|B;!~%X4u{wAI?{H3idVT2Jx&+J2bP zdt%!uX})ULxm;J5vus?eRnV@of92#`C)fD3+!d3#*|d=B2NxUv+%u0|cHHrNZOXWQ z_m;&AR%Y+)73j>}@FYc6?(Xr~=eo`BCCrQH{a8}B)8_O?t3t)6FDL18IZT=Dvytu8 zo05sMcLu+<?D)VWcp@k9qtIbRHy*c-%cArB9$n~=c(K-7T>9nO(;Ev}H%&?}(OoI7 z?e%3B+v-&rufn!;`vr*oSt#yupDnIsy2M@?v8t*<_7CP4Zp5=izn^Xw(%c)#`@380 z+?;Q7kDqp0+dsW-K9BB=xL*Z2H%diL_I;cnwl*#G7W?W+g4+Goi?>Nv<V$&OmzUc& z=l-7R_vb#l|I{vzul#u6_I;QA1>es-y!(55U!2W{$tt{yR9Y|IO4(KS`o+1=?FR&# zy*-;PZa>=b`@xHEx)}%jC+m1$;t<K6{Pe@OyNef#zi0HG^`me~LspMDtAOB98>eum zOHSGeZr3X#@~>99Uwis4s9v&EEwrfiO8=KKQ{jwqr|ix5qJ<x?n7*d6aK&rI;4jbY zCY$$uxY5=q@tWri?-rIrWtn=?aco7r>o==uPP*Ma<JxJ}dBO)c&rbe5<JE}|m&A&H z=j}K?Z+Up-&VNr|Kee#m^lBOlbNtrW5EIj&?9Lp8*)4|`^~Fs5@v9~I?!935m&cA? zzOjzc^Gyb;+&zoh30oDeZB^jQS$RaWlzG`sebMf@$7`d_H2m45IIJE_nPk1baLLk; zdsj4<`iIR~RHPfGU-5He>@n5Xhg{>eta&=;HW@{2ynR6N^~A$lO}Q#|x5!xeTU+XQ ze==YE?1<IQ8<E*}Ehk^jsDJWyM%cyxn{#=>{^AB2oBPfAFW)_;+0R-r_e7^_IQQ?A z1AU8~mx&1Nmp|}#?Tl4hEqv5ZdNbX<CTw?YJIki5uip1FmaON>>6m)tZv}_i%^Ot- z=W?1=@1~r*v-GfRh@|0}^sR}94i??ZPc~Hf`pcl|#XBeU1Lwq#wsNfS?g~&TN>56& zoh>l?)A8_7<&QsC)SD@#bgfBu-G5%}`?8e6r7O1!e)xV)#MtN2-GW(croS?m_<OwR zxE(TYzM3=d?L_ZMH$Izget!GPy!m{KwM~|bvpqA})U`$}$GEo6if4K84UxlhEZx*B z?c*oc?K}JH=Pdh!oe3ewmKAM|nqK6eJtg<Y_A9?W=d4iry6Ek!srPt~7S7|?ubWw0 zEw)27vEE8YW8Yr>y5QHhRevh6zHfAz@;7NxSMv2gB7Udab}e7bTk3zgQF!80ws!wH z9$KH$t-hI+K1q+teU@)Fg;kn2vFt>epShIK;Zr~O{`>8J+_r9pn|d9un8~uO)0>P< zbrg5jsebs<_TgPZ#2c@UYgSD95^?wU-#48a%c^>JvGKIdKGsRnLWS{~^S{lS>G@?! z@0O4>@1uv0%I|tVWwNOG=2y}c-wypSaNm;2t?|R<NAAfB(`0t4vcJ~jvJ*^;*0~kY z!{qx)L+NJH%Tj-~Ih)lld@`2e->tBGvHASqxS5k3llqn$dlw#WbNaqi<8IpQQ}-gu zHou<xeCpY)pQF~<Jy<6@W$VgoMWTle@19khX}v&rjpH=0V~5Xelm8NUsCLcP$x-Tu z)L3);6h4$H)mVT2w8Z`Og}r>&`hMEy7e^oS<p21Naqlzfd)42ol$ls_=1ozbWiY9u zI{9~78T0S$-9l|m_k&qyX+IKp(KjK3@sO=n+Wu~~^;I_YpO!?N2x{)0t@G|oLwNT# zi3<DZFE2di@jJ<z-D$TGwRy&Fem-d0?0Z~~s;!Q_(o|AC{iJc;gg2~li%xL298|Wc zo6Wwv=FGaStCK$^`qiC%>{{x;sloW{W0%#_?^!!{-~3|Bw@oKEPVWt)5RZBO*4vNg zn7)nlyY$P>J@TwsBlDVF)~`1|_~xsi`=z_7DBSUZ4Yy3R>EtDO0$*l{8*06}8hq`E zL!9AVm%FcAcB&mpG%G!rrD^}?g0Ze|@OSr%wTpi7e0gfMf_2CJ>+PJ`?Vk!}?68x5 z6=73!dFkD>+(*x4CxxkRygYfKmr`nVa>m!ao3|+}x>cTcZ2|MQ@883Zhxq+?8ad~) zp5BH(HWM;l%y{_t<m;4gYKOcgGVNaK_pHxTdG5S>-WQmy?0EtjFKTW%JlATGf}D-! zb!kOi!Cwj%LGv$`P5<oM^?B1e^9dSPXU-56zxpTW@neM-@@EQ5oxPT=uSl0zA9&>M zs)eU=MEtw5;$*xX&P{7yAE-Lz=%tE>TxafRYPCIo(0t*t?73z456|WOF(>)CLgzQ# z8TE0FH|{?3jtGw5bNK6zIpLot7doDQ`1GNoU2w1PorWI&Q@Tv^-&tKZ;+TE0IC@W( zV%!BwVK=r<1<q}~T9X>8HXXY5;^f0kd8_@lDV!0kbnbh%X4X7?uSzFx9YcGLZMSXX zEPwQFz01m)c;fx)--W3qYx0--&wAB4wQ`C7^7cyST8q0=j<Rk}do?+;sd$&5Z?JLF zexBgwbpG_B-Oa|mdqNHdh3gd@zZx}t#>OCC8>M}{Tl8w)+*+AzXSj3yJ*S%A6~4L+ zX?9B_wPyv#@4OMiAeuAhBacv+qry)e+ba?h`!5UEoD!}4ylVrONbBs_kH4?hDVrb5 zt`RtTMSnKSga^mUl#{Pc^O+Nys^r;waD&lPpZg1zWd%LHr+M>V-;au-wcOTUOKVr& z|9|@C&I7KYPaEssHA`xhxT$UpQrtSJ#_({li}wUZUp5cdH=bQH#IznR$cVbsP_;WT zEb3cb<j&mncXifoIpA|9O8o38UG1Wk3U^(u3$1-pU$?*b-FvwWcmMwXUnBGW`@HY( z=iL7}xA^={{<sTA%NRDAXSRPh9lkU{`p8uw->qxfy=yzKg)TT>wMWE6z+8UG?FDOD zQ|neLRsYy!vt?F-Ew6%DrF!$O_LhD9f{JT4T>CNO#AVszyBsIX`!DL8(iD3jMB5@h z>(rCG$|}E(O9;BPY@4U}RrRCxjgx!YTU^8?l@CQMT-&H}(mUC4dZS7pkIEODb@~@4 znR?Dz|E$24o6}WVndy;`oo)1#87le@yPt1+yGp3P|JNj;6@0n1$J#xFg{^%<{@>vG zz01#T@|v>}9vA0T8|5Ze-P+l$t~$BYfATFiEw+6cN6O0#y`G7lpRf7O<MY8!3VHWg zbix<zO<j7~d54-=y4p>qIYvP>H{17DDW1(MT`5!d=H92a;Oo3<@kKVgvn{5Sn{^uG z{9E`^SXt@)p4d0-cWQTL-E?hYjSo}V6Ue@Hf9dshgTE^|zr6VShjkkB`@;s8rk>a2 z{%D&cza}FrEI{nTz8Qhnx`UUsr(J$AUnh1+w{JxJroE3sW31vuSlf8A*RH;7k#zTe zVBo$4JKG=nS`B%Boy|Qz`0aI>B){$F<VkD0RrF1jw=H`5X7R&G_NTJ-CzowpXW(M+ zI_r1&rVR>8*|xXCjb43Q!oF#avRdK3l<esRM&+{Rdn?TD&-~I^-g;(d<-I?jCN1i! zTr<skMvd{(+A10D1hdInzB!far>|mIXZZhv8~cpv8~Mr;*yKJ;h<9j+OER2NIk#5u z=+^~Fj-G<ScR#%hG1K4I-?~L#HE!RdmZne9B9k5$hTg8y@nSi8+Na=sNvw*RN@nbu zsj518a%$x>Jrk45=hb~|+qSE*WWH};WaP;^=fw58t#^8Uzjb2UX)OjHvznD<M%%XO zzI$`b`#_fPJ^m}D4sRc6JyX1N<+7gVa><n?FR%Q3bSA1`+w$45>t>!4>bPD1QDArf zJI4>Ik*Cu&?WBZu_4s>UTX2v)?(~DG&?nEWS2x}%teh!aw0UW4Xc3p6-mDs517-d6 zDc9#um^5L+q&NO=MHVQOGc9KL?AQ5y*^%FS?)lxDyndE}<RUe76;&1W(r>5FC47A^ z{nXbpfoqzC{C&&kJ)Ac^lO~%Pn%=yBa=n3Vd68q@H;wq3J^H4q2j^e1e7O44vE}I- zN`fa(3ZA_8Udv{cU;3>{_x|sV(K%4BE%o`I{L*B_f7y(ejXxVPxlUfb<aydM|5Gwg zd%vsy`s=Bwxw2kB%RtxOAhV0(aMdsQr6%hVK26!PK=#;g_Qaw~%Y9Dhe(L+Qtm<Z| zQ&CM(&~k@L%b7|Y=lLexv7Gzo&m4z~OZFsG>8+mCa^y-#eT|pReUasjb}7C8o&L6{ zMf<P)6(qDIa?TcS_QhW%1TS68e6cz1|DiL!u8$7ATq;`fzraS`=cL<ZTc6Ci!2*&U zp4mog@80N7QS+)4^PQ2u{-;{E-AtcaqnW=_Cdp*V@N5gRxu|=zEoZvoaiPxp)=F+G z7ya3DGFYvDwu$0=-i?(zgS(0@H#hnvMKU(CS_Z3$uwGX8=k%GC(<*SiPKjgxWX0k` zJ2a=&Z?aJmdz$X6#l^PFXO=;q&;zw|Tmcq}=GxPhPQTy((yFFy&B4%)E14x*T3dV9 zvvQt{7329ihu3}6qI3DL1;awVeVRCb?~}rB3@?BCclT_`zFr!_6Un?xV|m6)k@+_H z?@S)PTy<#D3=6Ge>i-V<8LbmMJHOD|vv9@dbt`7XG~Sl~)h%hcX3PJL^^<l)%oo;L zG_%sn=&jn}YrRh<dfh%L(L7Bp=yB#w$>bYyc2Q~1483;d*xle3-R|>I;>kpxa^Hh> ztZPa<Ui%d|Z;9w)i~pykdHc4!zy5~im)rN&zx(|Ag>Bge!)onpf!C9m%c_n>o&FNg z@iI+tZw8;)i6fJ^j|e4iI&pg5vnii*U4*O|za2mF>U7hjpq<x*6Zn1B9E_NLTQf<& zW1IFthmw2To62H@9|=D_?fbG%AY-ec(hAX&`L14@luPf;@DiM>-+E^4R?FE6WrteW zPFr@?M#{fE{cBC_&6bMaO8dP1R$gnh=gfS2Qtim{Q`sBm773Y6F-xgk86sF`9W;H8 zi|djg*CkP+itp|odGv6e!oKXxMv?F<?72C=|Af_c-1b<yV?j+&%>ET(RVfFaZ(rs5 z#y>IfV2Q^>m#sfmM*Ruf+VR_e<JC>xPQp7+c?G&Yz0qxQZC++m_@zlDS28tct&qEA z^7ZG+s!3K)HN>8$3c7y1a4gfwCe(jZjO`71jku;8X1)t@FSk^zlJZPeOOBtosMEaf z;<ikt+}Uaqy{E66Byhj<w4I{e((DOWHaC@2dU2X8^%ls#E?bpxb)6n(`p!9_3HjG& z=PY=&YnMm)%_Em;Vven=-k4$kaiYTu-#<;$?TcT$-Nl=;H>*74`PwJ{H|TaN7P8;? z%^rPV?&hN#o`yvza@lTs_;!!Ij{URG`_0?eE}tlr;Lk4JapdyL4fgh@4ENWZJNrnK z&F*5LYQ5b7wF7B_$9SHkvE5K<i=DY)^(@bWUu5cHm3Ke)IU#p`*}2%c&6PVV7uTe- z%1yV_ddM%+y{ym6M!WS(=Hf{|&V)}>NI9v-b?fI(*UVRw8Th-zyrot7>Q0`KfA3@U z`(DXKzH4hAZ3tA`d+qG)r&E<Zf9zv?{c$DB{J$q|3;a7W+v9B1Kc5Bao7z64FW#}P zv~vEp6*)aD`k6oc-(MAT6k4hfd;dx<yI|`Exhaa-yz}m8PQ3ru;Dq(1*WFwH@40tn z$&Z#NKUC^-a)S1lU;A}mT7LeV87I!|`FA9Qr}FYn?q{1iZ@dxwtT@+p`TtV3dl%PP z{-{3vu!2cp+Wh;<amM$)z8CoXeZ?P+j}Oyp>o={?II?U-*^NbuG#fL6t&Z>4Z#&)| zzIndHiTg|6U3h8wTF37r)1J;}_DdK)KKwk%KmLwoZ0IAU2-hfqN#~3&FJE%|U#U*7 z@|znKhWgd#RQcTh>lKNK-VHL`zD9%PcFUg{Cj<L@p{Y+))%N$xZs&U=qaRcrV(l{b z!!M0__ItNv#J%88`DrEQQf^WAYSOXFpxTC*4||uq)-SdAG?&kPe^J=KOdX!$)8dJj z=Kf)?OxyT)XW#!n(<@%e{}z|HFY3oD-)Z{l>_+FTS9eTJ&s_BBH)T>k=PfT2l~i^1 zi^hMy^0?WRTl2ztQ!B6b#U+1Rc~ksV`l^3(y{mthhq=hfO@9_GB`OuXTjkUok<iWS z7oGL-_wnwJpO%-i-hN4TI6wDwO}DB=53^4+tQWM9GFreSv+VSV4x?Wm{+v0$sj7VG z%!RFA4!X6;-4m=%zR3IDJcaL?qk8u0TM;78@^>zoPwRSXSSEE)_*sO%O!qv|r}-t% zO{C`Y?^PDEdwS=g-2HiFt{OMzShY<3*44Hq;*2Ht{uv1|2R9jS`m$wB9k<e@cQ1B- z*`zz6d!nhzp2N&Pjoxq3vHfCsY~78#EnDB%UcOlPLpOh}tlJc&`xypYc4o{I-4dot zb{KKnxE<t6PQN3!_|bxmyZ@Ce3H&hY_gVhlxnI+jdb`}d&n|UK*e`kGA^)4A@bd{b zXR-Fyi7na1ylP3(@e5tCyp6sWWFI%pK660r`)cc6hUVrqwPABvB$?O`Y*%E6w=38n zz&}5x?1DyyVcE4e#p{{$jSC!Z9(|;FbK|K+2h$E_M>$RoEI7ndm$PO2p5rWr%)6(U zDPKqvoAW{3q%CdJBOcx@SKTaM@9#A!`}n0#qA|^*KwoTiYR1unhwZ-2kGvprZ=FQ% zSKo;fY91ymU2rzVmDAyqj_tI=yc3xHf5xnRbm9?z<ebCx#@uB*sgBxwM?wuges_0p zyt_W{d1p)cljN<=Gh)+@{)@VM`|A0>uM8I_T|Ozz*YqcX*Z0Di*eB*PXLSEeKJ?1_ z<~f<@+Y1bQK0J1__FwV!?)}IPvDVJ?Fqx1(W6$W{8$A|To?c)nZ`}0y?8e6%&%W|^ zl{(0qmbh%A`MP@?c_z%#Gv2s8&@|p5ClhD%`Pi(+<B!TD8?T=^@N0+LwWv%{={u{_ z6TNc``j)4<@6KMIlAhTr_ucj+!<qfNW^?^pzcFnspTTzB07YkJ>AUMUm2jCkUR7VM zpeFUA%|SZ<OS6LY<O<=-MjVSb8*rVj?v~6jHez?5#TwnC*<5P8Vd7V@3A<9cCWo)K zNDSFxV1MCw@|llo?=R?$`op?LA#qw#?aAzkYYc1>mo40_@K!&7X_?gQo&ysPSEdyN z$9&+pEPHKkWYE@5IpZ5?Pk8!FoF+VUJW-(UJw^3?%gOlxH%=B#TPn$NoWX)E`p-dL z#s0vJM|D;NbM@)`6ZZb_A-h1XqLcfB1ebtKh6}G*b96=1cc(iClHI;VY);r4I3ts7 zzR{;+?d4M%vm|^bnr~T`teg90RepNz;i|~JO@DQEtbFGDeHH%(Hv4CyJ43(7ZP=7{ z@Y+JwHJ;xmZ_5;wmp&dbJ*9HpZ_$>FRlfw4Bv{X;O<=v9%fkOd+pHyN;pEigMpxg- zyi^nG{26XC^WfUFgWg-O+Bzs3zS2|G4?8LMNB(HS!I@7cJ~)47UgU<09cgpRnZ3W* zP0M)w-p5XjMZ=ck;BE$)sL9p=i)UWbV6~2_|0TPM>+6dryt8Ng`yi2PbIeg-*;m=s z{BM#>m%K^yy?5(1&sWC&ojRA+bR>nnKOL;28(uq^>zGosyG7!a&31`mTO1D?ZQgx% z?)8i`*K1*A24{Zm>0bKRX5GOZhi;gfoId<UH(Tyn>84}mDZGy7w~4*a)X14V(ezqO z*`XcEm!s38uYVAn=B;w$%IYt_@<TVL|5e<&v_Z3J`#a~;zxq<2nlQ^1zll)(u(6W0 z<$b1z$+hjPy>@RpzoP&4>$tCGWhP>3!X`<p@<e13p52mJE#26>=A~lJ;>d!4o8s4B z#BFV2{dRqK^VhTspFf=39(7~G;i?y}x@Ua8y}(|_WOKb~Y56}PyR|#QvnP~Y5MFoQ za6xv3(y|SfQw1{;^N!UXSSGBcYkU06rEK@>4>p7s9@*jCK55kp(^lRpj>~7hY;^ne zHLYsd#Jb5>w_UjK^>o>WtQ!-j9XxZq(jrO5(AdV!ZB1op%Gz}s0>2%XNd0~9a@vEA ziTA^k)%NUDb-THB`&}M6!%NCD6?0hHkL`Wyw(Izg+zlt)Uc_9JSks;*xl4AgXik<r zZ%xF9TPsfNUA`dm*lQohH7o}XZN4~DvgVp`MD>iuv<o)Z_8V9KNqb>?BY@$tNX?mJ zJo6f?IL$U*JlqqN%QE}$+BL`SJqt~^x3Il@6QiKlqyM`%o}PO<;Y}I4eR^8&&$e<S z?!rScD}LX;Q)&HI)cVGW2j_nFRBrlrw(Z82o{aCd_a9mmANeA=CPGeEd9ztoP3|r+ zyQ>e+-3_hxGBrMSNF)4si-B$0f^}wA`^}uW=cnE4{klBzqOGppvbtlMk1al|_ql$! z*l~mMLwQ?+xJ5c{N$eRh6~`mqEDkW!DSOZnxpMQN?RshdzS^(INm>1Wp6agn#A`1S zazm1rFA}L)v*B6hn%;Z&wsKt6iB6m3&m2B)(k83Q1*MFym#P21SoQS%w+}~DOqnmP zcwhQ#r`v?kjwtI{rPn=-Z?3qJy2WsJxz@USdsp#H;de@NIzQvcmO5>gRJYlga&ye2 zdUf7>-0}8Z==BX7{_TDDAkLVhSYnx@qZx~TM|Qz_uY)Oz&V01;kt)0TD*18QuJBk6 zLBCzi>b-8okzWq0-?wJEy!k-X;$FiqlF84jFGTarkKUiNHmcr@+kAs!rS5Ap_w2fz zp9^+0YaU8`VI_L;;ap2MSL5LPYwTy5GL)6uBmJ)3?TwNBWmY!7M{~_@1)t5odL?_> z_9^W;=X;|xE$RBq*wFsD0wVgiD#RmvB%|6l7#%$DjiF>w>e*+D_8nVPvFuP<>XMn~ zXVo+pMt#1qOD-pEulwp72{NnmdjtD6z6-dR^Mvo>v|NL8SN@AEo^!LhO;e(De(G7b zh3=Mad(S5@cU}3q>G!NgUAHo&6*)We^s<dVmt5GBrW=1eVC!PrYR84Ws`VGlna{fY zGf3qZU21kQcZ=haBR}@0M<g9vbnfn!n<pe<R$ISiiOAnGtMm@D&wl=d<F*{K+ZUZY z@#d^mUcT8J$K$!jG@o+LkkL&J+jLT9@6m`dgPJK@uWNqEa@)O=b9rM<R`rpXMZa&~ zt>n%5ka%o<XylH2$t<_e+;+Kcdv2HRu5Yb7f3e)<$ou%d==s&(<-3c&Ii>TtEnm9% zTujsDOKHNr=?B%Gt%;o*xq7)lYp|5|`bI<d<Y2~YOKydjg~=Gkp6SZ;`*1I=vi5Ig z@5?IhSNaB5@|p_Xy!jNrz}dKQx@mj=H`8fz9~epfb!k85Xdd(Y*ZNHTdjj{~S^ZI2 za#0}Dz&`E6D;taQykmJ=PVNadKmFyJw)KYfQaLqNKTBVm7yMXOYAv%bqn0a8|8&`c zsW-a99wl!O>OJ-D)(U?|<Lt%nlY`;{@2`_=G&L}^;$;q=oaSU7b5uo!Nr>%wL&W6z zZ9Hxz-rvs8b+z2X>-C#cs{7<a<-<{WHhh-VGcvYnM=j9q?@vkl7J9AonA^dStt+1$ z_S)VV=OdfYcW9Td0$1Cf;|2Q|xE>bl-|1m~Yt?I~sqfCVzFPAkb9%LEPwKnxccM0& z+*?__<L=fMRhzB$Ot92qx0-crP2}e0MA_eakJi<v?zi83pY2=qoWF8M4%SZ<S{L5) zcy-l*hxKz!Ee<!PE!%zeUz0}p*|i3bZyLU_+GB8IkL<JFV};*mGwk|pJ6$ZJDf_5= zmBC6Y_b(ee+U*67ncTZ^GR^9%?DHMrrRic1r;DClBNbBqHGEA)sC|jS@>P6$e0F}1 z7T6}G*SaNU***6yD<_67e^^!PeSGd2^>pjmVpmIctX_ETjA(BLPjr_2mlqa=DP1Xt z{!4ECxtzC*H{`;ho(r$^72dpR7D(A{UvVV1R^IAOyX5h9MKj-=l`D5I-oNt^L(2&n z8CErhXU7}GCQLfZYyHhEA<SZBLfT_TkJEc+#&(LDoHq(_3*6kpb2TIWs9O%t%9ipY z&Qn864;)=q{ng{gGWmqpsy*8d^jNIBo00MMa^tOP3HBRi-=BHD(pmgq!tcEsm*1WJ zU9<P!fzAsaaW7_dUJyDRmGmw}Y>95n^OR|ew+f~0(YX1renZpNxN8S5R~kEiHxGG} z!fI{e{kS!IZ)<#&VXAM=%<3tbWeaBdMmjFxcs;3p3H!4IMgC&>(`SP#+#i(|Ozaa4 zk`A+paL#GT>btT2qsQ+%7ueREHsAimj%%5#%cI!EuTFTciH)xN%~{3nXL!2ga`GB( z!_I6gr^^MM$wIR~ZmLn=W$quEzVWll_q69a*VGQ5y`yo>Y473k7kv|s|Gl^G>$~qp zm(Oolt@Qufg%7$P43DmoonW_W`F206n?ZMPUOw|#V(Zk5UyIKC@mO4#@4drUa!m`{ ztgR8#_?_j8x%AU!?v?vy?X-S|u)=TO{W;-xuI5|I_GOi^&J;hWwTvw&E8?Ai)x`}l z+qW>YCO0qboGBSP@yy|n-c=eFVz16T;Oq~X)>n8x<A?n8YN<=@i9s(v{+V!szou)x z-3<A*2Tm=QS2UeUSKb;}%Aj~@g;j?@YKW;~MUU2t<TSI-SxJ@VArqOdFW6JM(Bw0( zj*j=bqh9YirpC;kdWTbcXIV?e;#cNuTOa;S$lShAM|+{V<a@{OiCcf4zTsgilADuW z*8h8k<lmmDFFLQbbsbK#e0TQes^5FxZteWKdBJ2mmanTiL^dz(dE;RmYrbi5Z;pR% z)sp(>hkVSorW7mlObC<M>0`{Lyms>n>l=|%cJiHH_sL-YYMVp)`m=sMb!~qgA=SO@ zlhT!NH>=m$wtjL4&vbBIkBz+l&ctZZnVyX9#XIw_mSv>g%Ssd7U~hYB@2@zsV3Th% zgq1F@>ngb(cJQWWabii-&UbOVlRZEC^>55o6G`x#vb)Tx_~ZLsk8LjgcsbF{_65hZ z3-jMbmhnx#v|?swYv-0Zjw^D)loY4iEC1@_2-8XPGHi&H5Z!)T<4yJ!-lH?z%J#QS zHBe@mni;|Q+2zNlj2|WO-}lxhsy{4a(>MN5cS88j6G@K0CyfP)UP#Yyk=9q(EtBnZ z`czu?S<_NcJu|D1svDja{9amq;ALvTFSfE~(X-Ri3{4ZS*ZR0Ku^;)xIeWookAH68 zU&T9SZ(G|Kvu$dk{hjmO3-2ENoYms#$#`b!pWcPVH)otx6a4qK+~Ovq?RRO@Y=gMP zft$q^h)rrdnZDp;JoB5loe`V8Qr8{h+a|S3?94i@SvN|uR%ER?(X#Yv#vVHpsl&c` zX=zH2wq5rV`jxb<MNcv>Yqf7k)>k>VZwCMUzIUl7Oe|2J&9=>WYES#e>aCo{x2H~! zl0Ni)?&_e@l#lafAN{R$`c`5}<%1K;iX$%;MQ-}F@%1Om<qM5BeH6NM+N;HN)w~T- zsr(k&E^4bEZrZUh?WLqluuNEG;Gxn7S!(N6{yZ8hdnn<w>xQ;jS&r?WZ@5kg;+A`6 z_GACQ_Trvz3nM2kY&89?#U7!3;LNhwTW838n<`dsefZu6k)3=&M&fRcYWJNvtA1b1 zyvc22n|5AazDsY%x)#?J`BumMCa52nY+E8UDR=H+x1~?pOUl3c?75TnN-jIn<4w6_ zbFY?cVu!&p$-_HLb8BZ_joDGVX7{t2)^L++MUu1ak8bR&%$;&7ZQs@98|FT~)nXdK zxog`M(Kt@4(|S{8_5AVpQC}nSr~kyU<qpEe;yI_T{WAHIvc}Mi?+C})Q?E`xD>g8c z(0!7$R^sdu&g9Dm!fE02>bbYf{e7=yid^!2-DR>LkEK8Rd*PVr?{^Y8=WTnoaqu7a zSaU>_{pXE48^yh@HZ8U4pL%Ndc_UAYiWk`nS|gQzzHgR!Z*#?}pY_nzZ`bNKu-&=D z{o?)Gu!Bc#Y?bj)Z~E1m8Fu)ShU41DiLqS8Sswk5ng#Ahdh|bI=Z|}D`smdq#~XDG zOXs<5VBYgOzx@8?$L89%KZvdP?(zLqO_-3Gi%!1N;U|Ub_f4|g;BCHz_1>;)-ZwIT zl&H>r{h?y&U#<5x-*rWvpNhA(y4O@Y``VKDmsz%AdZ(wmn(ip*JFmAo;%}pqvtsX& zgSs#EV$@dt+@N$wquVIP!n<?n)Ajo{tY-KuWtO&4^Q?oIl=!|g3O<n$*|BGioi1KA zt#Z@uji=t;T~KhdbR}0_#eI+OSJs_mUwzq`yW-J|!c5~!Uw?^-Z~i`mUpw6-CNzHO z=EP$<-lnVLia#tfTOC)_F*Ed7M#kHf6ALy9)+!%sw$M5BBjf{*%cjVayt4OiX?Fy^ znRQr4=Ddr?>G#rIx0vpiFS{$suU+9^*03dev$x}}3b6&xrU%4Jd{E3^{)An=eOfr% z@<XQ_E?jm^Sjf17|5=E3dhgV09Bx<Brfzb&SK<8nw_p<U%2ymQ^CYZ$OPBs>`Y`2L zTy#3iJH{)5*JnsRzP#zzuI#Rvtp40?t#?*z47FBJ^9o`vJY2fejn}V=d7{q-#t7pW zF464uVm7@i4(e(qJS)6)ibv4O=;fXSt(#xJEVN3#>r>FY^x3oz+e_Wv=2-A<T76SF z=MTU6MkU!q;g=u2X)6{m@@(Aj<H$2s(^P>?hI!)iS{CTs-jKm-nU=RiFedfdp_P%W z;TrpUu8NlX)^G9u-Y~U&eZuBO?nx_RyCTD8H<~`!EM4pLV%wcHN8k8a_CC1v>$2bC zgumzB%zL$_Er;JY%2dKI+MIiubnTghtrNvFuQ~kmmpd@)z#=8@Me)mm_Zu*uzPp}n z)z3@cwaO|l8*$|D%+A{2t!?(_5372oz{Jo(ne{IlFYMn`GO>Ac_AB{Ex2|&T-02`x zW|_t^ZF^tCuLD)g>^gNj{J72krm?Il+;}(Tv+bT$5v-lL4W&zR*2Szad=?up{o(8{ z#v1}!LYc3pX&7fOxwgE(Ea7@p#h!H%r_DMav2HVA+4ksKT7vMiNk^-1MC{1mychg= z;qG60CsrAp(x~V;d*AV0?ZQuO2iVw6ubr%y*lM1b*Pr=%+9ZoLNt15mta@Zvx9W|_ zy%|jNe(e8!_RKrk)kbykQw!5V-Q0h;>)u)Q!*FWX`m+vOg(`GpZXD2?ZvMmYd{=s) zpp*El?nOJ~ju_f<glt|G6=!|xq|WuN&#bNl-Pn1+%b;k6N&bQfXO6HIe3Xsa@Qh2Q zVS$s>vA%eLS;mKTBC?;HH)(#|`*Cx0a$)u3mdWuCx28RQ8LXj`<+^0!6y7|YqxU1% zW{O@-b2NRDx$~bw%*;nmZ>+1{xq90gE18Ne-ZlO|1DUnrvd%ubJ~uc~eE~y{=Z`6$ z^qxFBcjvOegR?P$xgiZFe@JhCk)gpn@zA#oW|s@JB+r&ywYazGWB7`nT(#-fdIeLI z&vz|49jNt2!%wdD{u;wQTPmJ8wV!2@P5*na!ua07_x%sb3qDvYUEzLfuykS9PjjRH zo@d_jev>|0=bdbQy#7!95&2*CkMjS>f3#+sBP)Mr{mugqZ<H|df6q6Ivpsa<u*rkK zZ`JL8|JC%(J=gjFx&7w*557n4;r>|H-C>=)p+(U0QN>J)I_rkt^(uY&9myLl_+Fpy zzyIa&arGk`y=1~;j`VNueC#&yzU`wQr&#~&h>@B7>qAX-*JJCwKR-GZ-no8x<3k5? zk)N4+*?;e6zxVv&+iL#r|1TZBocY1RY|YcRAHFc3d0Y9gZhd?E|7F(p>)*V)v0;lf z|94w&^CRaDU#gU}-XCqHpZff}=kv`se^$M$QM0ZOvfAG{*Is{a{P}b7Q_ihVdw$*f zdHb%9pRSfa{<KH2FW&uQ@?wj1mhJMZk8Yf8q4ns;uF3N6g^qV0Elg&y_Y*tL_~^%? zbN!!>e3UA*S^M#E`J*43PxS{M72J0Jp+$&He0fLN6RGv`BFC8@?TD9=KKe1a@Qz|% z>7yM-8^6cDoPFeH_M;z@Eb>H-e|@y0>$~3Gpd;Lz-;D}&M33KmWZ^4wyt`thQrx0~ ze(~dpk1Skdes?7==`cTd^1VLSrg*d8z3KZ`-_W1_x9CQ`((k7m<4w9vf*<~^-*Ti| z;=EApj!7Rg4r)v4i|^?(Tyvo5ZiS!0jWxMV2g}|F^O!xUKA7O`$1SJz&XAd{+Bm@A z#tfE&3E7)in)mJuGq^D~=-{>c90$t{zGt1Z4X%vcSUI^!?_-wgv>$e<3Lm4M7Cma8 zlJe-Qm)6I{UTsh8;)>2I);XP=dTD1AmwoGx%v7n5Y){o5J)cr}<h*w35q*vBj{i&U zIR05Aq*mu`*m*zfo$|d^Hco$fKABh_^81|-X#ZQHzw}RN<7Blb=7Gw6E6R5FU(Go; zxnkK7Zk0I2kJ&=|^*{3J%|5MK7xw6^P`%d2!p?BFTYt73xqN<OW#^Ik-hU<^34DI* zPW+>g&g0%ON*{wd-%tDz+i5>N!v6fT&#L=E9*J}w_qGXsq$+e@{o`ej5t5yWT{(rS zkF8qQ|JChdl3fw{AgV(3Qx>aQb@q}E{a$~XM9P(uciiUv^1;8!@q1j)rmwGj1?9dJ zY@TwRJt(evi9x;i%bc`38Xx11ZCJNAa*A^Jj`!V<z8x%*S1eq%DR|>g;Z*jI%TMJ! zs@M44u|H^^VqVZc&p-Z8-5;ermH5c-WnI`^G;2p_p@x`zSd~!y(in$3OJaQftTl4k z__%86j)M4G+ZA?Ccq+bTyKF>$mHD}V^LbDBH^j%^=)HcGYvsCQ8}7T_t%&Une6vf+ zx$<j3?z_ct&NUOOgbVGzhCPxfHT;;G#k<jeZ@)!k?Zh8mUuz$2e09Hb^Of_Ro3A<_ z5x(-iV|`G)(!3ShgxN!1r#<#j_3u^L7uBmaZ^<zs|KN6k`%8`q`-cm6q_3)bBxE|b zV%jXvn$5F(ZK8RF;#bFc*DSVb-Vvg!I&bwf;q$@a0_VedA6b<0eti0>`H1t?^d%q8 z3oc)!FSvYVy=q#i-<el)ES&$&shIPN_2bc3{6W9$J>RK!EMKv_gZm2KvA7H73+)}R z9M%y1^`o?BeiD!Q@v~0f^R!Iv=DxTW+q&~iP|9|$>1EmzZMAeJ-o4M8<LCd?RP1}< z6SXs+RUh6vamPG)maXC0@2$V<p6zqr;Vf_2@ow)G-!p%A=WUby?Ycug;aybuId;i% z=f1Fqde`<f&6eaBx^t*v#{=b_;0e1|@0M6z-d=Mz!rJo1yTEdT?<?=_tZn|K`Q}`1 zl!&zS^3vyjue{>kdFbz~cYEeD9lp=eX*~7ls<WrB)*T6bmGEfymD8Pvvy=*Zr4-^8 zJ`=vb-cPyCW3KC;8Bv~p=0v&vG5;#}Xz#14NBUQEkHoKfFId0YOh7)!UM(*yx^sVU zztH~$^Az(!&tKKGTT`ZPw<yk~#z)qr#!J?*CdyakU#zTajhn3ZnoM(n*HMNa_g^h~ zH2Ia$$-jAzJl0OzG5Z@=VR^3b#^~zVHx^$NyuaQ|AV1{0(Ec@b-hXzja*5dESt_`H zVO7WdkZQsFz-r<BYxz{_++`j2g!(Ghh0FT>nK#QZW_h3by>)(59*GInFNpKs6Fk@X z&Vp&e<(IWOc4u!F-n~^Tsejv~ADpG8A5XuE@7Nz?uk<hKuJfPHU;K~GUr~EB|H}Q& z{#8=OEZd#pg=^J&{+0;d(%7-AuIpp+n)!B(F)P=l|4HZB%#wQ|?agWLE4*iFcR%Ru z`LFgv^%(nveD~^7j-SzI{;w!t|6S~5V8gL+m*U^shJW);cwfx>Qs_Km>8miYG=p9G z&gJ^M^n+i|sGgOuL6`AhLj5P!=DmB*oz3MtQEj^{xclW9F&=eALAGCYt+Q{dzIe~Q z^h3Gl!|?783$}mn`mkVow!wYz3u^XFdj#KpaC>6Eu=lRYBc~tcE-@E+&6n;d4Z33+ zbVuJM=0dx^Ys`iA=BC8lSK8*=m+smiz4OrDZ1e3)4}36pdgPP3BX6_6yu+L&@lJEr z@T>b>o!nU;c&XE0Q@F!l+w#bM&ESsu@O8>|i_a*$3rG{TzG9T*x>n`d73)s-m)aed zzf^Y|fAQVej_GT{$)}99a$VVM&lUMEC(hY>fVtG#DL=W?`a*JlC#O()mqEeoste3k z1|jYLjCd<&@SQyW=|frLo;<hjAr<cq2I}2eSSMCdA?-NRxhYY0<DtX1Pw#3wEBcPx zcF$h9skdGSPAZ&}SG?>WQ{l9IlJ9mjnz+vRs*!JX>Yq*#+o^xzI_Xx^inWdEUuACB z@Lv-m7xDU!$CT%?D{bBf>~p-Ewtm}Wi@@I#EnHteUi9tKFTwt6daC=JycPBZc~3j^ zqw{!XatHSookuI9<UX3bje3;5HR;joEzzCpuji@nbBuPZSzM-HIB{E_#ge@aHI3V5 z{%~5`_e1Gz?W4L|%a8os`o1%Hi|~<+w>%$pZ@u5io^^4e82=?b<+wFVh4e4F3Hx7H z6BN%rdc=6^&m-G2rXE>(OZG_d)~QE6Z@GFT^;Ywd?V0BVrf2I5v~RiIdH7b@qtGbk zjSF4pByU{#RbijI_56xmW(^kc{mT1dKMTe$^;MX+;;F#%%*k(d+|tsVyY)!tt;a{= za+x3NZ|E=BYuokrk=7e!*%QJW`{&$dws3E+thg_C!Cft>UcSX9r1|Bm4!H#RwoC(m zKT)2~Pkf#{lsYq6{p*IeCwt`Xs5!`Mx_zH*DzX0=XZeMVKVR(gXs-PF_K@tCT+L^< zr9a0i?p*)o;9JfY$Fw?m4=#`{_pV$kT<9n-Cz80}t=yq6(+`^*-00ZC`2D$yM8@Lh ztj^MV6|NqRUs`oT>*`^>m2!5%nNG9o^rk+a@Z_KWM7u4e#>?ifb=+>DCUL6Ft)<;S zR>@{tssHS$^U7{6s=Af>`tD`D+Xv>A-F#I2$;8orkCN<-`yanP`L@9~=Jivq?=AE0 z$VF8<D66D>bKm|`_O0)u@~vu*s&rq)blYF35_o?}Px+sRwDX-6sRHk>u2Z|WUR1b# z)m@)IGt0O?+U4qfwBO?ONPer<qr<oE9&z8o-uZv2t>>S~-;_QEzAb%Zwszi+8QW(6 z*m2FH#_4y@5AnCsk3N49KGL7DU(kM)>zwqD$+s$x^k>_4%)h`UY`;=f*nVlMfc;uu zwK})ietR5e`~R5}=J;n%ne|8RDAA8@ZxbKcXRa6AzhbZRpY&Y*kKVV;kL3N8*y#R$ z=8jlv{Zo%FN7+A$->P_|>z!)Y*T5sQ=DDtUE!?U6Wp(G=U%W^3YS{{x)ER%Y{N?nh z`0MS?^OvU!$1k|=ZR1eiVc~Y)UuLzu(!PlQ^LE5qd)3UXi}G@RomR;Ix9Cy%mYPSg zQHmegZ}lE|pQU;vK6~kr`x#G<+|QhP<bHO(VEpoWh1N#XNjxteFFG&wjb*ky>+z<W zCs-}Sblm23B|DlHDc(~rwZAoUrA2?0%un7emeQ=vZ>wbAo|!Fm=HYhEHq&YR6U`UL z{))LFzd@AU;GJYe#rcamcNX^7v_IVaGGTWgXZZ{L<A#5nXI#&hc&5m^?xIrF&BQr- zcla{fmUzl&N__b+C$4PY^X?rBs`t7|Txhi0tMK=p)r~WbN<2IG#S#~+)feQ+t<BWm z?YC#|8!O4Xr`Jth6IV9Z=T++UlfFu|7bd?9+E=Xly;4d4!u+2>Kl8;C57e&YV6NKA zbGW86bw{*8k0yWThXvlRT`Mk3Zda{yne^1sbJ}&4$a~XLZfc&~6u*T3*SD1+ZO%cG zeO`&TT=s3aUgz`Z@!lU5CNXPzpKyJz|NiLl#2d4Ze|*94vT|cyac5miMPJ>VA7Zhu z^FFTK)m^df-t3Bfb}c(%<lSOc{_dFmD!KFhmCYTizbrjc{xb2=hC1`Yt#$H+z5C`> zwEk21==Ha9Wsbhk`fJ+-^{?4aIP_<7p^M3v!Z`lFix>VEOO)R)@>A{2W6l$oH})@A zK7YV&o;dGYi{SRMIbylzpFZ=fS$-sY(L!JE4Xtv{^ZKs$=qsH+V5wr$9;klng>K3G z{&%~Vmh2NrTyTy*X~xou%^$xXl702FJ!7480Kcx#cCXBNVh<Pk)rlr9@T(KPbMD9Y zjKaI>YY#U4o|&;O{Ouw;caJ$MZC2d=vxP6)a?bqgyM^<w=quF)?w|2PwbtU}>?)>@ zX?OkqY_pqHF<VY$-DU2M*I%VOx4-7@{J-qJ{~q`HX+P#y$rf(jH~UBYFZCn#FXIK} zukKg2TlU}MPySztkMUp29@)RXYg;z=i}Jm7{7U~k<bD4vmYZ^?d+CSmLgp_v$Q8W% zx!~}gbHC^Ezpb|4_Wo(p!FQ@k_6=1<M}ICjoE>;xU1`0u?fz#qGRg%qnvQY(WnZ^_ z&b_;v`*Nkk*Khwm@BHVmkAKej(lk}=^S3_lJa<R?CC`ra$?xu(K9fIP^08)}y>_dP zvdXy-CcoM1%j`UCZvM3Rxb<9kM}EOR$C|~(+=Y#wV;`+N=N$Aye(8t*Nqd-IPk4U2 zr*zWGmMV*LKZ0~`bEeuYH@|ZDs$azCmv?Wkn|xZuZ{m)CM~{WFYjfn33IiTVtFD_? zG55%Ok3SQS#Cz53;Llf{@Y+NEo?8L`$^E}Rm}!YVENZp>(>uW;*z)m~orhn(O5Aw( zYHvjOTz{FDyQciG3Fj&-4_Etm{+#BKpX;(!zR#TWTj%6ovy-)oh5q59AAhdf-T8Zm zoa(+4Uu8ZrT%UcUIp%hUe(_tCeRsCDSFCuQ{U~vr*rSK*?sr~}5wz9i(|RuSTx)OV z=c#o^!nK(@)in!`OrBctNYjg}u(62sV~DDQ&9SM@HrGNu=e%2`B=_8?(>V5Z$L5&c zBRAJM9}$kxJt7=?yrVc~zo373!oL%hZI2Z7!m0$%2mKO0AF8K1Z@G%lbj{?B(^EGd zQB<A0!|9~bx)3!1{V=Z1=^Cm>wrg`QF<IU5J|s*~Km48gx*$1~ecm@cZ0_&u{9%?p zH&$-BSnfxsbpJ<Q=`tUao@+e1J=gKk(sQpnR?peo@xEx9;QAsx#dW3Y)Z*UOwEU=h z9(;t~V!Ocl(swF#7k+Afta@I4gx{K9*#4D`+n*hqpZ^rIe<<VgXNhs|kIZzdkH+U# zcg!#KQ>!~yY5OtzTy*FEM=@@Hb`_g`RC{jq$b3$}!2XvtO+RFxZ$1(|H(wyXc%O63 z^P2fP?)@}>Bzx|BN4e$fPWuu$<$G^))c>7$`6Bn@@pHu;-z|O%m|L+6eDB*a<wp~T z{zq5A%p-r5)r9$bX878eB(Z+n&{5s#?y^Q*PV%G9M)O5+Ug_o^Qw8S>@pooyeZ1?} z_k}ywd3V|u`zimsWI6Z8f?~0c;pc)L<<Av8vi4l+5qqoms&<cRCj5v$cf6y%$j-Uu z%1@@k*`HG%9qB0Vn5<-{uuo&r%p39xzizDvapC!>ey;F{^_+0w`Ui7#cAi)IcXQ{2 ziV4}4g_B<AJxaN*d_;2{?~#@3!aLHnZ+AS`sP2?6H4~m+pe26eXPi^bcH@a3{SE$g zZ8Y7af5yD7_)yIn{!j1yX7tD25`PvY>o?=H>i46DcUk!*``yE0J{W{M##gVIulmub zGu->nk|XOqW$GKxz7+DGv?Joth9j!txAp`)nkuwk=i_dn|G|&yz1PI16tC}IAXis> zXio71*BU$KuVx&F&y*aRyyoKxRlgl#(!DmPIj`Sh)SR2t=`18IWUus5ZX(|q=KYTQ zZgN(yxA#h{6MeVA{`H&VlIy-#e{D88Uv}t@^|tx4_ip!3mw#rzudc?9?eqMWx@|hi zzi)1O@?~?X=8N>{>0$P}ZMJ{ie0oEOR<q*NhmI5V&#add`g!P2*4`=ai-Y#nPyAFH zed@ci=Kb?aYW7e4^w;y$_wb4OXYSVt|2*{PZ8^{6XNRgk|0-_#C3#_fdwXSwPraPn zGs}&C-xl$`&!2wz{(Zf4xBA_4CjY+ubkD~9vF9xRzAe&wlRw>9=TqxWU(;Rw$5&6^ zdct_Zd?&qQ)!gwD5AE-Ir?}_*hqeF8qTjoH=i2kUU_S?c@ofLr7z6vCJ_cvZ?T&vi z_2am&bLeo*18YIHV}IWpp5cyoHlNkGath-d#dYkJ%I`LOlRt2|abpF;uK$vU`(5fd zFH1K6F)G@Z&|w|hWu45R&)l={L(j<~_kNBFlkGk&jfEe~dT!e@Dd`_JU{-oicz^fA zWTgj<PuX26B!sUg{Ww^mekxd^?Y`x&O&rXRA8RYcOT3SpdT77$p#wLzhqg3+%$t4W zz1N?4M@ogR^KbZ?b)F%5{XU6=*H`V?Z&Z~gHLMMnWzN}aWq$11YCFSialCzk-zRL? zqu06dww~d!yxkiO%WgkCdLy@dugLc{iQVV&1>YIu-IGeb{&SJU?sKb?-&n1mdT4#0 z;M)^F;tm?Lt?S%a`uL?pw0T_b#?s{Kp0(2RJ4_PK+||F-xbbUnr@b)G<2TO@%WTb$ z-}rh*EcyE9l@hz>o$uZH`sbgB-Sd)@-&V=VWncfiA|g&sV*2HzxBsjSuf5yfy0PrP z?!-gqyF^P5{dg9!o4?IPLSntPi$sN9^1>tCD(iZlUca*Wh+O%)g7*D_LYuQ?rl0MO zH5b+|JgXY_%BXYt&M@KdopK3#Bt8kfT+`WV>AaJBQ>{>CBlk1@^+~azI}-LLX@5#s z)9#;?D}7bx<9ng<{WqR*b-thaBeV1V)Qa^->^*t-r$^WXJW}c0tU6Eaqpr|(o)$B$ za!2cRu5k~V4kjOVxEB|oex6t4`)%X8I)(h{C4%<hJ0RV2QN7vk%WS=KcKti`gVn>m zr7~aPN-^)XpK?0RynXTUoqP1Ae7dFbbZh6OnAe*s_hw6fR9;v0$bR=Xf&EWz`TyDU z+WXP<nD&nOC8ommPk%N3h`b*7=y~k&r8@#HtPj+Sn>ShGdacIvVu25TS9sS>lrK0K zbm3{U!@b`z3w-LH{0{uq*}UV;wa<16yTAH8<v3{B{G-@&TJ<s^<-#?}T@@1!``R3N zn4IJAOX*K=#5_hmjpx}BZ4vBKme);KtA0H;>GNZudd-jiLi5X4o@G{%Q~emy>8)B9 z^2k@{{q!BaNpFob^*i?pP4}o-e#GD7k9ep3^dIh>vCcVRk8}3<COJQvu5wSU@cike zuUR{fd#>T%`ctU$H{WK<&_|s@_tgrw9?|#wGw(>dik)uZ_J={1s&eWdbvnhp|I9eD z-s{iKBlcczBom7_9l0qKul!M{liU54jXP-EO!?zuq5Vo9+drDgPr31Q>rbc7<DNF5 zkE~Vq#XowkQWyScuh4eyntA@0(mRb+=P7@DD|BD^qp;9^^^bO)vsM2^CWSYd@K4_n z`Dn6G{EUpx1)b`iF-jk8h3qvy{uX*a{fBjD{lptnS+->}*e$!P?kOd&DmU-QanlXe z%9DQVU^_pd&*#y%YgKZ_usE*htnJ%)#Iw)lr0x7dn<biu{C$|Dtz~lGl%7zQF%UcB zD%Y8RB&zADeBaak(v>XBzR%Ezj$fHGdC4Z<MK#Ag=Dgd{X>mT#ZO+>W7n^&9>>oq> zOpgf5W-r~b-k?q<_2J9?t*PG@>&PqhJ4M>L`#DF}Imo?jNWC~eaGJJ(t?tdd?t4P& zUUPImE?yaAKXpgkBYl;+>-oi#kNlr@!}!!QM<I5VeV&ipkKK?dZaw>dg2hX(*~h(W z<{tU15~up{vQYk{ANfM&o_}T^dAHFlUhkts=W@@Q)kn4p*{c@LJ;JV%H@zZr*I7YH zv-Q(|G!{;(UZzrg;MobCm3FG2Xv>-H?)B#o%j|NGKRb`S73$yRCFQQ7H??Bx5r6MJ z!H<5c-}<xcNUNn;xYwVKBj=yr`ZMjwZq<KYkN7&PpLzaueU#Jr++$D3BXyO3-ACqo z{MmbC;!m@9mBM95T7~qd|6uIAKcQm!kzAqd@Y^*rk1STvn^v*#NWa>|Pxy@}~Vr z?~I+C^G^HYQ=#RaGE;VVJi4vI=e@`8k+@2o_oIH5e?E`$)f>-#QI>a>YrTKxrGwnt z1L>7&pEvU46n#HgqtjfjyhHu-$3+oKrfT1LnBQ__rq{wFmu21y#=rj2^rPx{`H}0E zQ7Ye)Ct0sCuU3ek`0VNAk8<`h%5I9{4<robDz*9qStmP+{d?9V^n__jHshy|J#3MB zDU#|ZFP*!zewNO=nG>I6E&p_8QpLK*d%AVzJ%8aF^Ki$Eij~P0g$|yI`z}xPtC_Am z-{OsiO5DR03UN<&%)U`z<5ROeS$X5j8!j=gS18B5{bBuaZ(s9~Y?=Fl_Ae}a{<Jv1 zO#jGs-1SI(QIAU9#fffz8kOf(ELV28^I(R@p3{b{Kb()79+9{1>iBMv)p2?1^$z1H zRgZk0&OgHVwEEF=ncO4(mQ((T*}wfDu>N>y_Bnp*ppNfW%Y@&T-*Nl1QrYFt%w)-p z%R+>$r?z(}PfhPwJf-(Y-qOY$%P)Dzto_ryqyLiMo$#Mie=t4e`Pj;}Mn3xGj*i75 z=7npFW>hRNn)1U)b*_agr@-&2vpe0jpB_n`V%@nuAge>%@|r-p7Qg39drz6=HvTm` zKZ$)bNY(yW@bvu=<*BttKAtK+61UXV>%Ych_ltZV>~@I${#5ejx_t8e`41bu*Vi__ zJ9^`||Ki_1TSTAxFzPu*3tAuD)_z;nuBB!(^R-8PO6SWCoIZ9=;e6qPS?P=)bonaO zqvBKkZELl7xKC!Ds$dN7_v2y?m3gkx(GBmG_Jy9=D^a=bvD~rL6Tc1TK0WbSCVNJ; zZjsb3`!<{V8>j8uuOTt-<DH(G+066K{#oE~=k?K7>FT@OwLbW~P(SfK+3Ktk&x=>( z5oYG^I%UM)Em-|u?}3^8msc$b7go<V{Nqsbz12*#LSWtHZ*xvPZrb;C)~UnIeXjmn z5A#nsRP9=EL2^C^|LZTDLh61`zujE=dD}_RcOT51l6JHoe`ceqb?lL+m;58mQwb;k z1|9R9u&-mbwdj1sAP4_Emw781=1oz0u2I3;DiiYI?<|eep*#G38+>wEb69*rae@9z z-X{vDb~~RiI+J+X$mH0xRE?=`*^WM&J;mgaq?cXcMx)k>X-2&t*)_QPt2s_r@}4S^ z`586kXdp+8?5Rt#KdYuJtyi4#*=<UyhEaXCo7AVR5&t+(TwfT|dgA)xJ)5~)cW<uA z*L#x7{yuD0?1`to6Q1l1ob=sI>wnGBXGN)Ug&v&3;TqbV+M<&`%6P;diEZ6<r|Z)? zcRkn2`R?<&Kjk^iYyY&b|Ea#S<aedd+Z$`TW4b=cxz6kU^smo`|7q{6V^3RacKbg5 zbm;fTUH;b5aRueZ-y@E{-to?grBd@*spzM}CsI$$o+v*n?e-#Z)q7^V_bQKGo^$wI zveLB2+yC9LZ;yWbe$QtvHg{Kpn&}4qA0nRpo51|XK>N6~(EDjSydJ4_TC4nXeKcM5 zpXVcuqiODfH6MiHO(Iy{%fI<_)$7Z?oi)E6u|C>7E%wm=z=DUjuP$Ga;a8OPiQ`8@ zc4T2-M%mFl(e7tfl!&DIYMy!=&!Iaj$gcKY)1{XSC;6?Lse1JD^J!<}55zp5c1Bk( z`p!x7*-Op!lK;u8m}J-ejL{M34mH`krKHYKZNmbUCmLFF?cYC(el~65_cfn{rrCUE zIzEw=+v}8g&z#txxR}7GO$jM!C!3<3Kc9AUT5#dfrb!R?334h=a{G6`Ejl31X43Ue zi=KqZUuJiA*SacPpL1!_OywW!4tswvhUU+S>HhHW<K}G9)pZNs$h}h8Sg^%zn)dF4 z(~m!F-cmp3#m#kmIdvC*xqkK%D=pK|Kltm-o02k{A3nRD9-6heCM~egGxOztciwYc z3(YoZy_q%RtLp>T&!_WsHRY%B%UARkFW|4?H8VVCm?~raaQ<cAw)I!lAE##oKd}DF zxo^v(pWNQ3TAi8xFQ}?KSyJH9x_*80;XRYQ{(Q(ux?@nk>5E{=N6U=*Im-JdJnxgA z^X&d%(fD#v`D1=*i3=oN9NXVGSLFE&WxLARLgve4_%jdJ-a9ho$d#5SN3NJ0nqqQ% zN{L1YhqozPv(>T>HaipQ1auTnhAY`^)Nav^%$Zws@!7eV;VMlPx-Xykt)FsdM}tJ( z#;4D|E)8<HZ5SC6e{|0Tk^8T|d!7@y_1ybS(AIrRo~*n2-ur0Hvop~adrQvwWC_pX zU%iKQk>HFuVU;H&otAyNwra-hla?1x8!wvW>2oBfYh|8Lup##(#gpAHgC9;7GE7W6 zpE7Y$kilI^RqqF<4<6mVsG4c@)gM<9PwxA1Wy_^Wt&{k*%Zs$MyUg!RpP^POEorwl zcIN@Jq{VGZm#7_c{<^Gn+4RlpdK!aV7V!L=`#5ps$B!Qau4f)yT70T&jlTBpwE<@g zHW^$HTl4nPhSNG4$<vZV>awl!BDAioGS^g;%wE0Oezj4(R=!N4!U68&UkAF)Cp`%@ zDX!v(zRE6p<os=JTe0YuKP$V>&alf*yVzvu?R8?Vxn%kLvsJr3d^mQzJ8ZUnzF(o> z>XVa#ZhLQuKiac-Z-w`x^4j!}Gqa9{o}SK97k6#dnzNTwzPl9oKVvFP*P45sy-qV` z#?dAIc4yRDyEjX0onz$x@X&^HR(W=t{qAf#9(`A|ZC=Fc!-vCfoc{UIzWnE(pWH{- zH~wUJD6Gb6cf(G0fBZbD>0<Mr`TH?%vs34l&!1i+yeHG9K68dkH=}$({DbcK?D9c; zXV+`Ee-ye<P%$$~Wa`=UR#o?aJ5Nkbp3R;)<-(WQJG;*tY0MS!+2C_(O^~2LE05Q# z5RJHRDtehlV$)ym(#X}CVz#m7pOQ9jj>JF7!kZPJ-!~PD$I0y8D}16MIx7G4aW598 zb1QW;j}{8qI^;*(_xIJF9Tz3UHMQhhqL+i+62CiI%Wgh>-n6vfV9?HlHPuBMAH05N zpuqY(f!*6ftVnm7%#N6;|J!%2XY7Byif>M#+P5P!Q`Fu~SmC;b%i?a!j*@$`_kTAL zyV_%`Y<cyB@L!2wp|sS@6z&vHxxIyJYDztf%1*q#oyp8u^VWTz>ixWFzPtaVD5|QZ zHtY1HraNcfsqs9uYe4|Ba*CN!woLMYTgC5ezwi6*7Q}HO_4RvillS+E-`jq_^SS=r z?34U50=hNv!F^(h(^}q0FX8<mG{^A6@hj5}-ApvAPR?+(?AoiaZ|A8S3hy7Q`HGtH z)^GST_s*+N&s(z7R6TXRGwQX<w8^j4s_T_y={zf_d~!vPZ{Hg^ZC+2o#+|p`SSnv! z^5^)ror_H}dL|!S8oz*@lR-Af?1@OhhTOLf_d;gcFZrjiN=-P5>;HTavzR|e_WUh= z<HGS%`%9Bi(}ciVbv#mR-+2mD80IYGuAj)Fbv&rUV9rE=L?ylaXE}nxEi8|=PqbFv zenL{Ui!ILjL7I?x`x2W;Z9=Oh7B?K@V3^NnY%1r^Df8pXhN{~t-#eH5=$|I>`)G*b z&oe&!Z_;Yy9=~g0(=Mvgx3-o@7nYMtxa(pg*E-c!_>wU*-v^nDr*-{@g+INKmsh-7 z$<3za=byLrqRxVcVLY+%C5Ey7+P^y<Y!TVf^{pXPTz={9Q*UoSI3Te~{k&K2Y9H&X zR*uE80YA1d7%#oCR_lMq+EqEaj0UwOxA|WLx}G;+nEEvRrcH<xE4Pl7+KD<{W6OCD zCw^L@Sk=zg;jf(B{G_SU&Asj9f=Y+$7nc`h>etSiWO3+GYPE1v8Sj;7x1Cp4ruB&P zdu%#zcuI|i@6Bqxo7ud#cktX^>wKuQc&7jP2_J6RY`VX(vGdxeE|y6lr56t@>u!$V z6RJ8;IgO*aU(0@fVE>ofw#Q;0A5HwJB9rD?`8nW`z_+F|V!eg^pBn}3J4MpI^twK^ z^!ZRc;mgA&pI!Q5!n_N9+j+bSx+J2ey<1)T^GSik>V78uXU!aYUOW_kwDp%%P0%}y zuE?X4XNbj4`t)PPoZn}4j7uDhIF2lPbRxHWa{V*I&JCi5T;C<6c|4-3%6NUIoycus zx77bv+*GJp@a5kmi#-QZe3sPp&QzT{^SbU!AAjDGFqP7kj(?wO*eeuD-}-u5c)=c} ztL$$rqoq&8mrXw7xFlXy@Vk%pnoX|`{+X4%&Mdz<mihDh%p8GPGhfG*&5^i&ftg?6 z=0jB}{`{spucyWeOzLHMDfF=D5c@Lk3+%4$GiCRyiD~T?7rLY;J8@HXUaw7%$e!9Y z{2M>6VaT7H)So-=+nT%?IqC<$3C`Fj`Ykg-a_Wu77fm&L<}O}2S^H$hYloiS21gS= z?C4I|;QjPr<H1Y2lQ?6yUzKi<K6-a?u<#678SSaIt4lc&OXMe3zq=-TLCU>5O0VDe zw5Yh1eALa2M_l)C+UCxjE#2(V!?&Zc_wxq@x!8N>ZGB!GeBe7nA*XX9zxEaTZJz#N zS@}6r3+G%hy|Jo$MtV`d$swgRPs)C$y^}uO(6d<UQehYOb(@51=6a9kTByEwq_;rt z$9!Q8#l|1T8xx#Ldv7&W7xF#Uvv>HM*vY|L9GuUccg?crxCQ6I4;vb{C9<a<T=nkx ziki0i)0ek2xmPGZp2)&+=7>XOg1-1CmJ{<lf)%^fE?8}D2@z}+jW#)%Jm=_-Q%y%^ zh`oJyS-R$z**)KaC47^LyhQ}nSe4Z}7J1It)qmb4GG^{ly*r(APH1_~dC@gf-K%!m zx4!AiQ(ko$PAPUTThzp^t|I9v$icj7jicafrjSbJ>7q`%4y?@juuw-{B>LX@?`*cY zlMT=M{bdyWaZl~I_EX2c`k0*4GeaImXPx-EGAVku8#|l*i+2mozLhfUa_ii^*E2e4 zL*=B!6RxDhZ8ypco>R1oSJGqJjiYN8D@c88Ry$|u`FxG0pHzxlkDbFJ4NJR|Pqj5I ztUPxG2TQkooi=B&hOOSB%HBSo4^yrwn9tHu&J$`i>TF_<Y`f^y{P-CAH_57FF|UG( z(;qLgQnNQXD8O*OWI5ZVE7K2p^4#l<$P(h7#42-afrY+<J<H$fN-d7ybAn#g-RXiq zlC8WKb<emc;hQ1(<G=-nYS+gb`Hf!$KVm#T@on7XBg&HwudKSqV|$OI*L>@%{H%$Z zi;qlg?D*|5b&6&B|F#bWS>duvlIuHvuXwSpukVel;giY7%U<6&_#(w5;Qfv{Ht%G- z`jf8jNbGrEYB}-I=X(<uF1$FY=1E?I#EDCHT_0{av~IcEfs7L++-1qBi*r1fHmUXW zxHh}@6#8hUO*WOE<}u+U^RrOHS9cz*DzCf~`{#cCqlUWBPk%32{|{gEW54CL+$YD` z!c*3iO#k3~LTK^hg^T^)e(?UX;;{GCoe$4!N^dsbV)<pK-_7W`zw;{X)*f7*`<Q`6 zbJccE_7wlj39nWbPMc9a%X(SO&040mjx`nu7iVpKafpq1Gnawtq8*z)^R;^{pHtvc zA-sztNvURX=A0vDxmMq0N*7+9+HrwNaNkWCg+~n6Gk<logtOY*FXDH<EZ1~mo8S@& zVbSDCn>3I4E|Z$9TbSvxQgI`Xi->_Gqr}{!3#Uu-?e%HDcR;sd`hu&utJPopnZx{W z<H7r``e{!Kg&#j&>^e>Lz_b-!x@Sy$CPbK?$>rC)JR$z2S@RyjNBce<{NN&|u0L13 z-Be^v?9;|g7rqLX)y3}d{j{bj^r)w+|Bbx0dUM+Ds&eqSTX-k^oiNvx-Bd|gJxMdb zce3*1<OQvE2U>j@e><Jg{_S>5ruK<r*SSu{ReL}By>nl5h|#ol%EMUBmp;2@nZ66y z^l8TqXP4MTYwnsFWgf_jPP{v#O@cq{)Te!c+7q)T3q5`MyRpkK?#^MQI63YIZ(B6< zp9<$cNc^-<<J-rkeT&ZvdL-oPi!J<76rNgMc>c!^cFVe~rm39DPrlx25k20dxA&RO zB;!Lo{XM)rhyJw0UMhS3X6+@OH9jleYVv-#GIiBukz)r=tjG~u?D?SOy_l+b^n{ZN zR$B!{4r+(62d{8*J>xoePgk!)-`l|WDZh4Hx}|oCH{`UhRgu#sk%bpp#s6#wDqMem zUh9-4N>};Anx;=R{8%8HqU>?0VH4A;6;8}<Kh-|>Fs}3uxw-V6uxg;HRP0)hl`9GZ zPxP<fGg(i<eSu+=f}VK6b>GD~>VYebLlgNI6{_FtwmfOUR_G_)*!`RFkb#TvB(1v< zJIy-6Z*iPDDPguf(X+&8<+PVpZ9<~EW>4<+OlXM>kd%?#@jH)iv1jA+nHqa0n>joV ztn=Q%cy01yTPMzfg0jd7j>(pjvemC`Y%Mjo%Fw9FnXVmv?9rn>>&*w%I!{I0oV&JT z&*{mZEWRt7t=qJxY47TYpk*s}m`pI}xE-Qr>-}+i^u<NLSX_^4e-<daz*so5^P}*M zu3t-puXG+3a!)?ZXZmgpZ?|%(!ufaGRti78RJVPS!1n7hUWZn83u#|y4pTYSbxYiz z#r@b1UB>5)LQ)ZhY3X;r-g8Pf+`d<R{yXim{P*X!xtW=o<=>pApY#6iwduK`LY%(6 zswNA<lmpVD<LzP@IxOyO2z>m@sN?P5+SuC(jIQ1<s+_tR<4v1Hc5VCqHMN?-#arWJ z1XG0a)g6qtlswtz_BL}KWt-@^NGm-$Q$DHbmUf|iVC<3%_X>9#rOLKaga2)%CzkM@ zJoba-xy_kblTJRh{q#-!y`Ra62YM5ycHZWcxyKx1#Aqn`+Q%hDOa1DG)Lj8CvkcXK zDyZo-sKi*xtn<oI>zkN4;i|Li6$X)0lenI4uF<&5(xv+3!V(FoQvT8;uQc6*xf9n` zCm#~&xcTVN9o0vD#rN3KlOGGHuT~GX^@@pTaXDm|r7bfjd5YKKMMWVoJziFoTz*## zyPm`@n>=;Lo%O-jp75q04=|con5p#m(6?m1Fuu1Mk`?AB3@5A*Eq4;NNWT%#nHrLD z##USDr_VvjaOHEwo&w4$%Gxq>cl5Qz1t}@5<?FfGGA%GVa!JT_Qx`U+Qkz)Gsh1wU z@YDMAOCxQQ=Yf_vDvLjft=yr1_V(jXQkplVZpW!k{^Yju!(O4n*>YDVWpqq1xOtah zk!jNlzt;CET7f*5FHXM5@_kXak?0x^{>fD_URtj{?CDNsuFh=!w9feJ1n=|KsT*6Z zPA{#UI?>4T-3@I$j?a0!Pm~y+51kw|>FyGStsc%Q39B7^r&@9LpEO;(=;)KTiH;wa z6ujBeGW&4Ygy||PH!lfc^IUjt%aUr7jx%D@PpGgepHBAX>Rp!kZsT56=5uEhJv@Ul zJy%|GQHz-<8E(VjwX-PjWUq|IMc)M}i}^0M@Lj&EV`OKRIYs+ZmCU7`y$_ChEIeMa zT%M=T<FG?e>a38|Splh4S1dQMODs|mmacHfWzjvRDs?l~+ib(`Wjm*E%oN#us>3B| z^R40+N;}t|ZY^0_s2H0Y;n9EVWM^Be#|DGtCM%DHU9t9S7yca16BnizYsr31m9=}< zoGRB|mzI>ZZw^h0u@qLwnel30#;xor?k!6%TTXY)?Gl*0Qt*1+ZtwD&YczubcZIy% zrRR3^u9)11@*ZXGMcn^Fl^<CxJz@B<u=h}db-r?ip^=u`uB>#u$6eO>$_a)#&&=Gi zl8wAXPijaXO0!*LzJD<b(;cO`5zpO!Z2#jrD>T^jMx+T_SumSs+xJMGx>$!^-T0uU z>8v}_Td!A##pV{3%(-tHa5IJZ0M{S6xmoc%BI0>(bhe7{hd$v95xlK@`TL_KY`(YL z5*~>ay6^<tWlqs(3QqiFa!JDU;}-Ung`$g<^-PtV4qi>+D%})vFJ5YrrgBk-^dfB$ z0gm<GrX}2N{!-?AN7Vk=%I-+19tFd4+kkg6`u$7Vzw!4>^mWvB3!B6IMq_GkDuc}( znGLfImmIPXF37kb{OGMf9s8WK2jY1TPB*K_F5Gftz21hBnPQzcn7c~uw|_6t+Ie5{ z<`Tw*25iUw+)7Cm4-V_&iEfGZ5AR>K;k(F@Zu2*3(_TO2eV}pnru+4Vo4W<L%2&Cm zmy6yN*AaQ=H+6b>fj`%e8y|PIp1P}%cJVlyn`P9Q)`Fh_Cu09BTByYusc5`*)tt{o zCp_6U21z?sNcqQoNNH-#{nW}>*<IzInetuE*`zS&J>$C*48jdzcQval;;pLgX;)cf zzbh;jS=`{$FV(ww;;*ujlP^!G-g=+r@Fr4jDd#&gmgkqlSdW@G8s@F5*4}-?;+3z^ zo)d;ER!zv=)T?oA#>L0(sTU%*3ThNH>^NljVo61Kj9mX(;gD&w`&OM;w}MISZlbZ7 zXzI-~4_9vDyS=^lq|)gnhNib}Jg(SzSgd`<+Xa05Z)7FsPRd)q>X!P!<;CAWG$%+b zmOdu)(o=KVqp92eGAl1;-hJZyveTlTFBfjwe(@VmL*9%69#zBQEvr|lF;92XZD-`p zm=W9OEhf>MuxlsNxi2Y&OgyP(=a*ls?DO_q!luT))Oz8gtN$vP4tHG%$c%KK6#Hqr zYvcAuuah~y&5~WYXOW0J+kq=Hr57Z2wVX0o`5@~}+~p%bo^&`ivbHC@-({)LW2@XO zFQfhOMOX6?$ugsk$7xC@`P`3~Y3-XZrRRuD%G0wB`%<RNJrYovvj2wh97m&ty5}EG z6k;>qVX|R*v)WRowCB+>vJ0gjRq(86d6=@{O2bq(>(|HM3f<UxN#a=GWT*cx=PZwT z#ecT-!gbB%Gpv@VpV~5ASK)-K;B{Vwsh6rNK0LkK)#7!bd;0FHZIk-6E0?VLGH>~s z#2qR38##B+7m<{e7vK>ImI_Q1J2CU~B=5rJb&K+6ANani!n{(KiFfX1v(%$4o(JD9 zJi!=Qd0y_Lp49H{B{%b@6wX!o@U-;~Gy4+J=kKfhPNw(0n8NF@KK!P@y6JU+rU5)6 z)2o7i+%USlwCjm&k%BhMmq)9Ot{gAT=()$X$$HTp?P>W^D<7q*m>w(5(%-b(@y|Us z0j97S$0f@5Zf}ry^760oRHJjN*66Lc*uwDq-?uP5IkuDT(g!&*Hp-s*^R0-}(8J{x zhua=`wKpC<)0Ztc*cUJ_bZU6T)fqRk?@X+E`=};OVDVN#1@Gm_AI~Y26)m~^a;xL) z5JS1XRfVpXE<8*3G4VT=q_@5#RdtP7)vOsWljo_O%dnnxK=;7%Ji+5<bTz+Ed7LAY z@!`$iA``FV=Eu$wcQ<AVg?OIq3VU>~^CDw&>aHKzmwm(y{s;7xf6MTBy6jDG`Gbim zkKV5NYjUmX%8uCAiPP?^6}p(UZpE(?3PlfdFUb3Se7feTgJ-hF$<u$7cBfuXds^zT zL2py5x8bc_pH8$K?7pU@X3QV*L@9dV_NhmzlMdWaK3lJp#C|`dG*r0kimio}oo9og zb^FszDvyd%mfBeA#oMV0eTX(%barFu^f?w94c}uQa|#M;ep0w;*_9S5<@4{<yt)5! zF02py7q;W>`%4>lxLVlnzP|8U?t1p=GK%_sN8hN4v)tR2noz*6FT82@f&(_nyN@3` zy)-G6XGKiYUtUYD&u63-*e|xUiPrmW#%UmKzw^;qwl8*XzE6@})?RDd@HjN(T5A2% zgP&$}es)aV6vFaMm*3;g1i>v+9@vWtZ!K%+?D%BO>0o{)>~N=ZPaa2rSZLC2Z62lR zDpwb*Kay7Y=gtG~jfcyu6aFk{Rj`N?)ARHB@cpXHdhXq~WWp!Sx#g{JK<`cVHxsk% zzB_MQu(5xbdLqy|KyC7^3tsa&4*%R@Som{E-;I;9b30u&y)7_f@jY#JM3>=eN=W47 zKv!S4rIT2sA8!jNOf=i^QdBE^g2u_$b8f!Vy}do}^}B*A7OBDew%_=DuO_WJeDxyt z$rm$>7G~=;{Ck)CL6iIL$&N`qE4m)Ndbc+>TA$C?<?%(AJ9n>7WE6ME4V@I2utB0u zx@EKZ=C#Uxs+VU>yAWIZ-n0DsxAO8Wt0s1=Qe9ki$@XLJZR^XDGs3&ox3EO)OSP_I zUb5hK??<Kvb0^+i^^9c<AKN&VZO=QO(!IC#<-4^n=dE4q<<kGM%4X)3u!d9bbW*B+ zaj?lWPEEUY>Hh8Qw)uxOv=5Xl{k^SJd}^3$utJcBi%_BXg>UQDvMjo#!1>*#)hT@2 zjm@_6-?3eCNuIULeUf0@qG`+S3CJ;Qoc|zY;sI|hKKpZlwZSXTEf1P|-mLb>sfhEd zk9_0r347u#ESTpjYc=au&^yT=Od(1~I**7mb)@74m9B}rleYgt)3YtT4o4L<CkH-X zpqr5+``ANgWx?%)q9fBLy-{P2T$z+uoge>x+Pqv=gN?U$|L(f`vgX=WUB(&j-@m#Y zc4m3??@hLQnVJ^aGd=vywJq=VCG}sze%%o|PpZ0p=ER@hrdz~R72L^iZ}VE~>$>dL z`?(fhtdTmj<I=R4YZo_0&b`Vg{i*p*cJj0}FaF)*yR_(>Ug)=*mi<rJf?{=-YpgEp z4ZA47Hu;0d{l5Z*Rp<2Dmrrbco2xc6wC70J3W3ck7k{kdpTfplzIE~(?VRY1^J|KH z7OlS{zr3LKh=$jF8_CI`NjfJjtb{iCoN+tx#3g9*%~Ug|vW#!r`9BISuF2ODb9l)l zEU##t^odXScNsH>icF`vuA=ez8>jc5J92UD$0fYK78E#@#l~FK6m@33&VQ(}V}Wyc z>bBGa1`X!jhm{vk`P+AL33s2;>@(L7Et1%2nHndzWqWU^;i>&T)7<8U^e1`tY%)-K z;Mc`9Z;xfW)S=iXg87oJ%BzeYmBc(hkesa?V5p(V=K9w0U6b(M)+MK|PYC%a7c}Kn z=8;3|rgl7h8tt)4<Eoo-nauqSLZO+VkxN5Oe;!rlOgFo>Qz$eeG;(36sb|L$+ZBnb zN-a9)SItssNn3n8tCn?{oJ?}3+^4Imp_9K{kUp;T-SW6lWXjg)tE`bP+>D*YO51Hc z)Hl7Dr1R)e-4v~`H&?8@j>#9#E9Fsr^kS05E``2F4<?x;XB{_C>Ysa0Q1!|Rq0+S; zFDs9Wt(>sxl+!9Lu9bnR&s6w@IgVQ>_3A8fQ=VkP*Y`5@kW#y=vQoUteh0NhW>@x4 z+#b6~NK`bK-D8j7l8rI)y(-d<TT&IOlDVgGNk>VY{#+r{t9vn3_q0KnjCoGf66be+ zZbYP|a!t9r^{D#q)wW3&+kUP4@##odd1uAcChg`U>M5_x<0dzr+MY43o>y6Qj?L;) zlW7gy+Q~<<F0;C+Ow@f;9`s?8+sdoPadJ0pjnuLal}u0XxV}X_W6p8gu6@lO3ui1> zzrEL#JC3hKPvF~^CzoSwJ``>%&wc%Z<^HaXmizZsSFhg1Q*rv*wHI8yM`hP;Of_Co zzU|n~>^FC&E0+0m?24Bx`r%fwG3~;-B^4<yYcK4Joqpc7jNz2r)9c+E)mOdi($_0U zRkx}B7Ut%9Ysts7J?Zt%%O7_yvSCk2l$gKFMOQ-p#osrxe_EfAd-*=F_I&B#8;==3 zU0BO>?upJ+Rq1zH{SvC_|Mg#d(|LTxyjt_%(a6(3-uI@o@#>oMOikK-$$aL&><3Tw zsegQ(u*0bD=->Zr8%yeL=V!Asw>GY>U9a!>!ms1$eeOM6A&<B7-cC?CCUy7qr8jDG zXC?jNz3}zJd)ZU+t0s#5p1&yLqlZXS_R^)Qa*h8l{-5fhBG|okOUA_trDF>J|Ncr$ z7FfKdytn#IeSQ7Q_USjjuc-d<-SqK&^^eZn_3yq^h5h;d!rFG;^Syuc`;PyAp?%5r z=px3#X}r-o-%`uJ?L6Lp|IqQr`)z02%-jEQ1LwP~$9W!2wL2~oeYrNX`p;g2e=L9A z?z;N;pnRq6q6!;x(+3eco8BKW*${Ac{`RNbx2sju<~CF_{%bSedHiSXJm(+Zy>?DN z__6WgqZu0y#r^v<x8}YxZ*k1q8{Bp2=Kr>ZdS7{5nYH)$=L_Nt-}{+*+Sm90my0<6 z|M2<=^)mn3Y*zoD9UT7dz4`v#hi&qH^3OLhi^!Z`x%)iN%-3go&hPp6x4iD^orG^6 z{29K_lYO@4C$ILR{TY9@P5l@t%^>veNzJnRZ@$g!;ym2^UZ3m6<7sUHuNRuXy*%G| z-PL%bnj5)s-T&vO+JE+Xu$f1E^JVkf=jv{YxRti8xm}Z%eq-0!{4%r1?W||crL9&^ z5sO+=w?C32;xFUo4HLyy&&xLKpRIrO*59xEy1Kfd_n&Spl0N&UGTZ(1!^>_5PO+X@ zD_#5SS+Do<v-WpiY~J+T_x`b8vIqFDChN8^`#fS^!d)j(xOQj6|MLbDw=&PuS|8f~ z(}MHeod52B=H~26VVU-3zVYYuHDwX6bp)K^rT6?VZus}`<%5O)yKbNOxt7^3+x_#y z%Lkp;J2~q<H{Yy3d-|*SJ9#D>ulW;J=BKcIv1EarO|HmU@33!Ae+5tf88$6Hsdb@m z&5I+eqV2k)<#yhD95`*w8_8g1rI3Etg3qQ3?B}L&KNM(^Vf84!cF0rv|AtppQ`-x? zr@yNIUF=Z0c6(vcw!1&eZ<=HqZthO|Z)qIAUF}c1zQpV`e=HOBzFw0v_pHqA9ark# zUD)z5?6ax%?uh@kD#2wF4~E4p*u3f9+WmQd<g;bx>GR$`(;iwEzJ88*+%~>>@hh+Y z;G0ys@t@3tT^|-%xV%ny@geBLh57@JPqkSnM~NQEJ#*^!YWMate<HQHpIekva9-Gz z^OQMF{P324k^wavRwSu@xvqVG{nJFp`qE!~56=9uKPdH#=fd->1#MU5HhfaNoIOuz z7sJ2Th0W=&|36J<2)A56C$8e<%=&gE1&4W#xtl(e9@=!bhV#OVvwBKpTmOAdlb1Qh z`=MT5Zfev1qjfTT|E-pU{*Nr~-5Ftf?OcD^#QB=ZKluOJtzl@GI-Nm4`k#c<nmz`e zvk|g&Wk+P~jyJ^C9AJGMY@)!$+j4Bv)-`<wJiL*zC)^rEpZ|X6YjOWjdSdj|VqcGI zW%fGnj_;ek@cj~zbPJ}}2@9_E_RNV&k6G%|ecAtaknFxwtHW;1fAt}JU;a|&9^vNx zGaKfz*qg0AE3w?-aod^_jjMvIWVT*<7~;O;lj;PInAPIfteU2!JX|06>EVKh7asi3 zy?RG{!zsJs_!C;c&(<ccmNEEl8u@g>&h<C7+RxVNUS0g}`+ZCMlACFnuNT~3^&lf< zC!bk8!?W$zX2~*M>62BA*{a;*bmd}8(6x&>PY<QJd*|+!zxlxC{;iq`{-**yF6U}| zpnUnDzMr?Kc%y2-W}8PzS9OF6?B6`txA?^2BWvA1d^T$PtMaeldx`3+lpER;FHT6U z|G!*s+Sm2RHm(2r#CKy3$H__Trm{xce`m`w9uxjvFU779y(V#z<c%F)E~?uenIiq* z&zf&@o8<lWFyCt2?&M_u{m_!HdJ(dfi>0RoHav{0{=t*8`d{b#qFyfL_iYn5TYfvO zxY;tzKVjPULSDU&*X4rZ%kIVezvw#SVZsc~`VSYbTNLW{&#Ya@rX@IG9_y6(Nmr^4 z^5n0%-^L-g{ZqPQBjed~Vg0#v@{ce4JMi$b`-KMf&5;S`7_7G|+udV`Vd8r3@!K@K zqA6Pc5ZAM)Ir;79_pmd}KEpmQMcZVy{C^W;iSmSed24%x^tTURCtUsI>9F<N0mVbE zU)r+x@3-vz&ucy@*HHQM;RTX?cTR8|D4cB5og-}X#q-vZHZ6hrl;c`I9BdD3Hq5iL z+Ro;a`_|vtck|899!FctqsssCOmQ?`^-^}W5A)MsGC?(mZ#Q0%wNGAhZr=B>_^*+F zpMU*#^wj;sZ#KWR?hL+Jd3Ao$i-pV9{5P$8^Zop~#Pq3&=M?hVm;K!>EzN6k{fuwT z`>!&S6wBF-&wsYE@o?6CW4z+5al_xJv?;w35yv>@TvJ<pmtAak)%kM|>STAR7kqsq zb9hrdUvI<-v!vB!9Ghoy8uPO65}2XHr!o7c<qbOvzWL_rN;l#<B3~!$naR1(>P$<Z zcgn1WyJvljSDp6Zes%7Q+v>$9&)mr=HJLrr_u1XqYw!3OFFv@&`@LfJZ?TL+oxkKV zR{2$*y>srT-j|>QI=>lK%q;cfuG`@HF6-Yi)gav$cVonBqzq272fds-Ih-%te#1fU zbH0BUy}h$wLBl_m%82B&^9MK<+>rSb$=x#h?6ti;DbH{0oEZ7&$qL4aGY+LY%~4yL zbjQPHiO=DmYYneA<?RycJ!G}gF5q>ASe)Rz8{MV_f6~qfe?9+C;#{fDo6@<tjg?u~ zb_ecHd%j1U(N*EZ!^`a7UKk&=pU?DWmH6L->>sulP1xG6n7of`UdRHmiesOc>|STj zz4IeP@4&`uhrZ8N@K}Ce`QE-SS?A){u4iO%DBWNE(<-=rrj>>Gnt%RmoRj5do}Ks9 z$F7}ya_!Asd>p(<-#$I`QK)#Kd}Hdz*>N^fKW^8H{njov5c|@8wf@+fDvm!c^`&XO zI}h^*Pq$Ba`aCOoeUtIGLjOv;j{U2SX2?8y7ttZ+eDoIo0qJWTs!x+Mj(%XUV?5Z{ zxq6O$%_gIiyN`b#Tm8&--_Pp~sZ5Q}e-~cjTfejH-^tUbm$iG=%6~5Gm5oUKCvx_@ z&xeJsUn2TNWoD^4*#+7yn6qyGzht$aVTtNiN7g?+bMy1&o5nHw&PCh$J_v}O*)h{L zeeF&r%XM-#U+znG&n+#G>Plk!R<mu}PepCcKOztNG^GlI+PqtzIX9eF|KU07^@ZBT z{Zn0A*3Vg$cD^cc&%OBdHFCQexYxzJFyhx+<X_CN%#vMf{+!s=^@6G!1ol0($XePt z!Lr#e<^TD>;)y#JW^cK|+;}p^^znDOxK%c+&9ApF_Mc<>n6;N<^PI%A^z;w^?jK@k zH92AX@8^`mmTn6fdHC4Q%zSY9tz!1;_P}>*ch88|+hFi;;?IrC>)VzUTx62x%wWG# z_3oJD>LR<+zfW#O%|BlKxVYfO1KF#G_#?9$9*5fQ&S1%A{j~Gm#8Y}<buEt@^|DX+ zEh@_X&OCkIdi$Qu&C5Bn6!vE{HJ3zlhadG`e`DVt%gy`wSeO(2qRW3aJdS?ZA=dOO zRhf;?LdR++=Y}MvlDZvL=h@D;pHouYxjp{7lIf=Id#&{w?s`o>)xU7-eZj|02D3k} zeH>=1V(KShG0An?2Xlc(^?$#du@JrbNjYCMC(2f=dVja|+HVpaW<~G6OXUAtJC7re z+fISss4$L4?$?I39~f#k^h$hU<VkkPHoj5vVBuSds)i!=b?+Xqyj?$A{I&Vwe5PQf z;GeD@hb&j|$+R-&%ICAFB~ALZWlq&K@keQ2Wn@lUDx^P+o3W(spU~zx42QSsMm6mE zYMsNpd1k}md0dZAWlriWtk-xn;bK|GYscSD{UhHhRHe`R8aUzNe;b#+2S?^Q{l9q1 z?tBl=4}JY`{cYjf7MNEo+sEO<cV|naeVk?NXVou{%Nu{p@k~AR+gQxy*zZHD{S*K2 zul{7@k<UGo?MadX|AiN+T^eT|e=axvT{ds#6>)<%?=LtQ^UZ#F;X_Upvzxv`wEi87 z$-5LQ{>N8Fm>ianYdEvzeoVaV_v(i%``Ypz#|m<IIC{K(9ml%tbnD(QcNTxa6e;DD z327!<6ZL<U2rw@B#@h7#{j+bTKS~mvOOILSh?zwM*Y#*!YWyV6cz-!VW9#-P;e8KZ zHS*4@-gda|ox{{~3g6=M^<If<uh$S4dlsN_|Kk5ce|{Gnvhk_--4?|bdSb)On+CIM zD^s}^e0K=E=Y7D1yI)X``^<FK>p~IiDk70L>YwkqdPLajYO%DUl45gD(uGH<ip+-& z`p7dHeAeinkk@FSD(m*r$9&=0*}Jd%n9o+9w^RIr<h<N`Mkn9(EB_scuH-fRY|MD; z1nUcqe`>Pjt1ADn7+#Y)yxb>w!nG-<emJ}`{uh1u?A300uDY12+lQF>t!+Ns+x5{o zPwK)^)4UHA_sXBw{As$<!zz|wIDIQ;?(c&E20z4S1Q=?k8y;e~d8+;FAIsv88GpML z-;Z9dv&dZLUKn@%60v`7x;4AMPq`{@_p7;d>siH<xph}&PIpLu_IKrLkMy`hYYpaR zew*Krv0+okMuul44o(I<C*-0zHg7q`eXY*Ev|eUc@OKskvD7A>*%oR_>+&~uoc^)v zYQ0l<@BO1K0smM_nEfIYw@5GOHSDoVT<7T9lkI-M@S^&kgU-Jb7C*~=z;L%bFVk~o z+rL&BZllB3zP@mHQscq*=jqw3yV5o-ZXuCI`jdV>-EnP3rc;gH!b=<l-HaEd=lsdk zmfmOD-d=n?=flgjJEuLkEZ**TJM>?lI`1Ee#YW68+$ZzY6o0B;ye9l#*Fq_;(tMsU z`|~_+WYfM?YL^?&X?a?G;>^5Do6k!-E_}FtkDRbpcZGw?l-KK@uT*8*evrvjd2Pnu zrQ03uFKuPq;uRTiD3QbcS$@(!PUo&hBP+#{Nr@shHLP5r=gx;J&VK%KyTb8yS>67J zXEuMn-?DRx>Qj?lv*(`O{^W4OjSV-i-!!uCwY~iL{-eMhHzm!ueXnkrZ+-lk`5LE+ zZL*Q~n9JTtJ;+h8{!z5x&ozdfm*1A3dmo*koPOJ|@b%8(f7zE_9&@k|_FGze%&OIR z@6=4M#(<3~Efbnv?Nm$L?XX2Q?#pEZL57oWJUDWcgg(uFuzvRD0+s#APtBrRr$w#1 z`>IcH=G4hw|9@##JtnAldrn*C3;)O$SK@5N+Ah3&EA!F%d3s#2g|ZHFa_Nx^tS3zm z+ckG^Pf9R5Ubpeao)o=n>yJGV_ELY5VXtbmj>FjYh|Zc|Zo`e-k&??=*YTZZSuA*@ z*Gi~;#Z3d3+0Lm8HyO@e`%Nt5+Jfux%&q^_PY4NUEc`s1*YKP{3m^N^omYgP{k-7+ zG0tS&*X{ZbFPiHd{jx$n;-J^>+iJZNV~=gkUF?>6r{eZRv1Rwyd~qv&_BB6DUypTn zdeeO7QnS0|&%>MJJ>%m)`?BvZs@}0}>xGwHYcAFvJ+MD7^jv7aGdIhXvoCHqdRr^2 z7hB%%({ub5^H*ipqz8hjcU@}An7yw)W9s{J^M1~RnZ2(*29#b~Eg!RH&ce!f(UtT5 zO20X55Wj`5WvyJt$MZAJ-;K)f5}kGWdL3u1_Ggxhk6)D6Y~2^YZS_c2@smo$F+&EC zZ^qA@-Y@M;%?arEmGyhqyV<W&wlIh1zx#1(>0`_F2PUhpSa-;VfqTuA$wivlcjM;f zSyl-;du3;3mu`Fd;!@P>Z|fe2r+=Aw>VA|p!};ky4+{&(u+Bf~|Nr8y+K&3FBfDz( z|9?q8n7%pv>zkXWYM-g*%;c3bn{mQH=9>NY2U6O1za|{BmZ>p&&Yr#dnis$AjK*WO z{AueLW^Cqnaw+?G@J#4I{by!2Gd>=ie?jei^Gxl)#UCb{r#Ii7-ZX#qE1{^4pWNve zHs7g|7073k-N00J>cQ^6V)G;`Y@ckouHVSaZaYUnLWN~NQ{a{q%>@x3x~=ydJb!k< z&xqn5DIYFav<2E{^2`0xshJ_a<4wn@i%;6u>`tC`|IGQ1CTyqN82=m-&~lx5z@78J zoDWm0%GTX+v7C^4=l%ob1yg+5-W>UFZm{I%xktMCVfyjqEPpRNnC4p2r*~~X=fCBZ z;l}H#s#C6QpD1g3;@Qz(&NF_cZTh~!`P;vr=^EAC-!Hk<=q$Y#^E!ud|4*v}ebpMz z4Ns(7ieFn0!w}6QY}&ZRQbX*|qqiP<`VI2Dq5aiguNyAZJ?0e@IwSZJR~k=^;5^5) zYBT+Nv$DOO&Qh<hC^;8?d)Kz3S}YDr*FWZbn164zuB5<<CuS8FleHXl4A>to?|;<$ zM)C~PPqSI}jCb2_R)1;DKO(@Ow6DIh*Yfan25qVBpDuDQ@7uCiJ5=`e16S{@^M6jh zk(}xjexPOMg+t5*N%t}(TK0XG`E@Qk(QLJCPy6ZgpT-jn`9E6qT(*jNyNNGDM*EET z>7Rv{FC0$g-6nHjOJ%W^I8%5kmqx$k=a`5mXZ{QJF;!$FYh4eSx%HAcbEj7P#!It< zc1}BWd5*>W^qWO_=NZh7PbpG!IoKN6R{D3weJ^%{{Zsi8>$GK${R!K}`8oPQR9fD) zO9p9^jsDgdRhf6YNF7T`*%&GJeeeC`e{J)hE_PPmzskq@6*K!^rH5A>lbtM{h0K*b zXceg2uuyPya`4xd^NtoK4eaX=PEj!6+aa+^ws4)5<uNyd|1NWdqQVm&o!aVlnCa~G z1xXF6aa+p1M9%cfi@A5G_w?5D21~V<EimHE>egq;xS@X0m}U9N-5(4m{%Kjf*Oted zp}XO8jvV{>BHLa2)nC<rvRd#}>V?-#)z@q9|B$`CwC-uvv!MG5LN$A@7B4R4XWC#g z|4f{su}s&xM0wZ7g`F?o*Id@o-h01%dwwRT$iey31CtcF?2Z*Tt5@WGsPrjLJ%1+6 z|0B;sZkznWhiAVrEPnQaf1QQZcE6cBnf|=~^V#(N^^MP`3C9&2K0iaf?_6x>{JraE z{`J4IDc)>z|Lm#y%!fnMt<L`QS7uyhrTFTX?dMIbu`ZeS&tE*rC-=^=XTz3{`eFY* zz6zB0w%r>2xBq(nZ@%>tSo!l^X8d`4&20Y6dZE3$qprH#N}Vrcl2F)q^?wTo&$W*y z-g0*FnAxY?Wzb?2j#zWAsFKmxbt~uo&<~r-9yd&_Rhr5fqM+tj{8D^|Q^C#uA~KRK zO2xl;k3~-i%3doy<7L9q&@+O!4ILPh8kEl%UAH%3KlPdEi{25*qq=SdZZDr3GEcBI z&NmdV?5q6U&;0GhyZyO><-K--E0+ILpR4zJ+F^06vn#ebI7~eLLv#IcCYOvIvu-{( zdg}Cx-*cwU_rI=RC;jtj;pR89|6fWy^^m!8{u+6PKVo*Db&@kJ`I_$W-`?|$Lt0wE zWt~algDG*%=Sn_II47~LQ$p{4%?}l$7~^z{?7cJX)9$`C=AU<9R!r;rA0jLKpYU}Y zK5*fyJ=;7cZkB`V9r>zL=YE>=J?QNB<YTejTMtNam`~XLpW*DO%=g6#7Y}4_PjilY zaAd=SZSIi=KBk8Kcx&=`zMFJWf65Mb*2A_noyK?k*bm#jO4#B4`u~^Qg9YzXc)qV_ zez@<$Hu=S;|8z_8iJjjm@ourU@g3XK67Md?PklJ=DNp&^?JS3vHdHqTggyNjC9$Xf z_<@vrvue+*vI+ZayWq^3`hy3{`h{-SzG~0!dpm2w+gX;kP4_e2zWe?B39Ejk+qDOe zmfg!=d#<eFe@gGpX)l+}>3^x#u{Zy7yv43{iyGOj#8<_A`S<P1>*aZevJJ)eJu^La zX6CEn##fy6Uyt14c8_kl8N6Vg|CT$yy{zl*2r_J~dhz7SG3D@sMdxFh<$kOxaK9j9 zCtTqy5p#BXl{xqEN7HBQN{bB8(USTYwUn>U-8iCV;@2mR>$Eu@<vIQkdN$MWW@U=5 z_s^p(i67=~<UQORZgjZdr@P<b4}bqZ6$;zL5ah6Ps>h-W&kpm3Jv{K=d3A$P^!Lj2 zCAkSg?<a(P(QMt)H1E;UhF|6S1(|z`Lq8Y1mQ-9@f8x%C<1>^0sw_K{&HtZuR(qZ1 zS`EFJsQ>o2+aAY+{MR@BE<4ZlqAo*Cn&)Cw#S#vImuD|H@#;!+t(-7HA=GLG$0b3* z0HLMa933KtyaJvcFA_8ybu_N>+c`XRKIqTF5+cykb;mOOT=ln#i?8>d|NOVGa$fDZ zeD%$njW=(8f9~CGeP_G>x3isJ&5x1(vUR_WXZ4K9TkPg62^4*Glue9>`%6=M=ES2; zZ>Byv%C)Th|1+<`H!?O)&df2s_B!jFyx&cW;M=dW<*icJ`&B6%zu!?@FH?W8><??V zq^E<IO03PTM;2>7%-<bxz~OMVtMQI7nYag`r&9EGJh`i&IYCaj>ZNe8)&KeHB%0sd zFtqrizh2_?`O0GntJ~L0F#fM!FX8^iz^4A0|2hd(xm`&jF=zix);`vvU2iP$u(7JO zYVK(f9_{2?v1yJen#J<5iG9lJ<m(QnyZ-r^&|`7<djA@Go?}hM{~ss3ssDN-zUJRL zy+83a|I+^7e7^qI`~TO%LtgFl@~Tanwnod#HZE@EL^a#xYl5zynH1^2@>tqmkJP17 zth;afnx8ZEeqZF3x%upYO=Z6q6xHAP_j>=0eJP^S{?me1g-!^Xd&cOP&hE2TcQ&m1 z6#i=7{@U~}Z7b`W_^)1f*>N*IC9h-a&a#%-sgpj={r_Qq<w4W?`$OdJ>wb&#G+a5S z*WLT(jpcIt^55K@lO)=;|LWF{Mn^-s?rN-Cz1YY+<k+(%dpYxWT;2FmSwqh_b9L9s zNy%BazovBAU*EK`A?a&Wo~5Yo@`~VJPiL7;Tbp_M<I>X0g)fcY>a$#`TbKB2P21n! z&rRRl-yR&}Y`A|{ucU~u=Cs8Y4+W=ME?=XYAJP%DS8n0I1r|m}rrozZvd(--#lBg+ zks{q8#itvmckW-Ab(uf#&)P2C=V_w5>y~zT**m=5k#T9?g8lU__3<&Sef&p{O^K7p zx$e($`|DMa`|ER(b&i&axQA^rY)sPba-5oD>8y22!tvwfPv72Kn#84D{8j!m=Z<Tk zR_|htsC=i_|F*pI{rG&7S=@ph)04!G)`=u*#Azp=w)8HHmz=$?<C=PajL$~Jzkl5_ zt<H(eU$R5%#IdE0TCrER|Fylp<SgH&zqRe>ntPY#?3>T@@<+fMkB=D*XSZt~SjWG( z;^_Tl=f7-!EvmUM{L-;~BGG|0+gPSXAIkflS}1+FJ8-Y&v?V`W1Al*iCu09`aov&~ z$IdVFU;g!@$nJn&n(@2q?u0LG5B$ySbBoXGyzxs#CEGjK^TO|3|8`zees|rC_G6p- zPsKdR{hV){xzo<<zSpViQ$C3<t~h-A*iVtkdvo_q+fsM^^t$s)EoLPtcZF*Hi#u{m zT7+M8<L&bcZgeL_cWsxIzQ5?k)FjvAdG+46cSPO(a#BP(c#VtTz2nU_>Y`ikyRByy z`K<YF(G2fG=A%Act2Ngx*wOK*rfak2vVb|Bg<MAiMcjjAR($x*8}~QkFK5?X&0_&? z+zclrxp(DiZd-I?LQ-s(Vo06A+VBMu9vfL)?YrVcM30tt-Mk;1GE?=oPG#E7tZ84< zP8y!xoferstvBsv(zLT_CrwYYZO&<W>$9By>W^EkR$6b;zZuL~x8Jq*_9ShI^D5WP zzFjYiyD*36bMv~C8R}mY4}Y!Gl6=Nne6rweylb1~0X3sDjCLxAV;(R`J`-w9nGrnY z`?j{7uDM2M45KC{t`qca`{@>MbVhU8gv2<*exA?WCPrtB%O)o7E1bpixo>sKjB1fd ziF`p<j!QjLR7{!C-!d`L?@}+%=Sk`(4eTZT+bU1x7@Y|Zn{4~v>13svt?Lr^S6PP? zPqoK7|J<0pQs|ADR)g%irW?7Tl4aJReX=XHHd(Je^@ih5Y=5b`sM4qF0zV&q_r9L! z=l1o>$JU?GqHEGKOG5wX2AY;|^yFW?a9uWExmBHeztWy-KN!BAydBZ^_v#fjul8-} z()F1<xhEA5|J-r&`Z@8}L6L=1=Dp7TeSfl?mdwh<t;r$6W&BrrY-6^j^ateL@c&pT zx^jNl+nb9+SgN;lrSu2J-blXs_)VeKEL+E;8`U4aU(e^Td&Ru}N9-zP>d%)+%C`Qk z;g)Sa{>c25_KAA=%fcJ?EULR!&~xh7&X@f^ZvMG&>{Z=1`^5dGCq5J#RfID9y7t+4 zlZDs%r|G}1eV)8I;Gu`D?+@3j)Az=FP2azeZPWdb=9}7A1HNUMHqBi)FEM?k;Ts>* zxF!B6%U3>k{lz03?Hs)#uk!|f@W%UWi{cOblWeUM{Qa}?ONoy1RG!*>Gk)=&igc<q zJ^iEf)oQmz>lJD>zh2e37`}N&p5>w0SGC{7n9iTOJT5su@bt~-t6|^Fw$9!g`_{Zr zcH8x7`}tr0=ll0p_={W4d&w`mZ>(E=EPu7{kD0~db9<l9Ee|}gne#LI!p#@^MM}@# zS34AVsJ3M}M>^+oZh66fZa?M~Bp6=*-RjS=UE|%a9UuA+xq9v36U<YR(YA5;;rg)k z(Ct=xk$q}10YPuVErKjOD`tF9c^KXr&XF&0Prt@3;^*$X7x~B6J}>4umfP6b|Lb;P zw8P7VhbHc7ExQ{epSu0h@|zET>FnP7PkeXtKXYrR{|D-P4m<QT{0jJ4`!{h<Yo>+2 z`-0io7Usv3{~rE2mz`g3&y)P~?l-QV{`ak>r6?_Mx6S;$7xdycFA3OPv-P%Kzw%eP zhu=dKtmCJOzYM+kJ5=|v`G#|4w`0~k&-;^ea=FzNk<yHWX?sK3*%tBf?l|LoNdD6v z#i05H4<3Fjyfgi5G3)o#`9JS0s}&Xf&1HOA_Ez|e8{rbuE4_cXZ?5<=xhv^@@ZX#J zS1G>von`X7v8r+H7oly_<Ia7%mcO~Sl<l^Ee#-PK);IqB(%8Mo?&P{9=QlNfz5Zs? zFZHs}+WE0Q)s}fbx5{q+Q}!mvs!4XqV%hCyERO3M-@IYX@az7!=&1}Z{=feaah<#2 z{2A$2-o|RP7w50~d~7aL!kW7E32Tlm&Q3bZ_Gp{^gRN;I%l@y}XI8n4t-~^?LH72B z_2JBKZpdZ6GO#`%mwkR?_u?;>jNc;qOYS7wPI@iBH1_z*=QlrAN$qZrJLq@erP6t} zZwY%l?|SE_+ArL``S**vZ|bV%pD2!*Qt9=?Uis7f^zYZrd#)$Wzx_-8*uJ-`_M6w1 zO5OFXPp@J9yW`)rA7<ZjP3rOvFuNIiG2XM+{<1`$>raQ<+XK>C9d2)LJtoSWdtWas z@4i^qKbCN=EyX{a)}<@IweoqbB)9#F>W#Ifk!9?%XWlLPy?OU5$2S_bUQgz0oSLcq zY0ojf%i2AY7yb*G-`RLUo!2zxa`46etR2hro!hf^#GgIzFSDn7LS^H-8`c^%jz5-d zh}XO>+S<;xbDrX!n2NmxjUUnvU2kdj-pwcMCs612L-irg!`wrHsj>f^CFY&4j0xQ_ zv0#4Jx^T{X@qZydRu#PUT4&9r&S9@@<6P1D!R=vx>wn!py9*YdTDP0iUnEXpPuP!^ z526p99zHtwsDg99#-5OhxgQ)K1|PcKS}(pX!u3pI%Wkgkg7Y+NqAM1Eh<kYYP<g9& zxM=attaZyd^+oS#&Jk03w)fEU)_m^%Rf^}VA99+;{=QQ5_DWgos=n8+4oz;I&Y3UJ z_W#Ji$2$*Qezh}BcTeOG;fLIZTwm?hQ@<0pqy59>Lzi2Qn-uJIvGD%E{P6Ul5C0cd z-1!@L{c+24PI-}i3Ueg2p4~XKSGx0~noYEYcg6G%&kx<~jg=Sv=e5H__`1G{@O=J5 z@44g!_i6lb*by@0wadf8Ln{xxZvD;?FT$7q&MI<875DYnmia>S)b@l`bbrWvnBUsH zU1a{lL$NK@+~)<(3E3(9nfc-Rp?hm%!Ugh_WwdSlEJA<8KCC?y&v}31@2t1G8VmM( zNO;(JXme{gS9qSXU3=?$F8d5^yZN_w?$dvBKkkVjh&ou>Q6T)#@6cbXU2?iM!4;ha zZ6C@W^0%Jn{IB&!{^72TACeCpZduN;UgVsZonDRSjn$K1e>x=FD%`r9bHCag^%{>K z)(_banaUO4b^77?u<%emN4|)invGeI4EIBwhr)-Zw|bY9#rp1;T@e59;vs!bebGAq zA2UA4Cf?UuC(X58yiZ(C#m3LVwPNOns)u(E&F6|2*r&Q?_bxr%81EfR3(Ozd9n$B} z7m3rJqh1s6W6OuGymg;j`?>#Xy!pH1^{+#3TiUt&#o|=w=<f0V(efeug<3^@dGHc( zu4>nvd;;rKY{D#DEo@KSGd{F8lx<o0g@W_*#96-w$bOJ3wwHWo+aFN3<GQs}>U+b7 zaqnl`__pW9w^=v7$>nl?ueHCtt>AvRM_l$F?<sr3W8J@YFa8q0_)T%c){=Y)Et!?C zxvq!LzOgV%d-ud&EwU^7c79*=YW|yLuatJr+;ui@;k%8|n#WH+zV>78l2Yr?$#)&E zrk01Cy)khW@9yqbNBF`o9$UKjq22XuOEb6po*SrMl3TNGk^t}bouwako?4Lc;&asx znP)dM3f~IE>CRD>5oBJs{=rP=9G)rn8Rq}|(!23E$Eyqa$K=F+yjx%2W2={bq;Tew zr*hq%cc!U4jLVYRy}oMZUH`p@-mMpt;&1qrd0W%)!ZDYcy#HFe)a|y%cYS@+dVA^7 z9ru4f37VUD+h&z<&GMbCuVOr}R8Cy+S!vy2frk%Y>3$2=>b3RCP3RAlcAaPQ&G^-{ zk6}68x}R09)eCHU>is1l=XAf}qtEu&zFvvQxL)w*Uy@vvfZX({FAiF;nH|0L&FSaO zjobEq*qiIOCii{B#kjX`w_Q*EVR!DU$<y=m*3H_GzQSPQy+akoQ~Yn&332C2_P@1i zpV#nqSKqvj_Xqy=mCE(!YD%)tOV}UodOLsHtYbH=s`qubShaUswHM3A3C>&p=q7il z{5PeqO4S>^L|=Z`TV;Ghe5$ZK``0<GU*#M84*s%l_dELQ{GqCIhwS2;{0=5hlw?1y zEqZ>pY{-9=!1{{#v~-!;?RvL1b-bSZk$wNUI`^g0^N&^Cve}<dduhWw*T)B6Mx1|8 zvBF;}?>fWWzS`S%_pUAPS>eBIg|piG?CuYKTRZo<zfF0*n)waWSHa)OqAwnQObl(S zbqW1k`1$(R!qb`RpGuP6hg>`+yWm{Ne8wBc&fd6p@kLC|`;rnlx#_Go?ybFXFZ5%9 z&bEgeZwTl=^EmYU(c7O)PwV?$vi|t_Q+HZ$!}0HWlB>d&>^{r?wpBdm!JnpYRpsT| zb?@H2`)%U8ciR?j(cQ9FFqb<w->0qIU{=ZY;~MTV%I9}4T6k#Uuk44fvp9aYNuB%0 zc>m&teT$!Mt`9nWv-Oqk<7FG-wT!n}e|a8$<NV(X(>KgNzCb_Oet*x~Ut+hna{LwD zR<8R?Xx{bc3)4SF)Hvj}f3jcl?NGIvd};j;nMnOxyXU?B>2SmSeTw*X_nWF;BFj8$ zC%#?3-|(Nr?TphqTXJ{y=l)^*YrXB_YW6EX_toBCeEjhJm3IY7cOQH@{o<wjo3&rE zA4^>zbL#RI_BYxb^8?)%ct19NHE+j#g+Fb{9J@^H7SFr#_+hb_x_=0Jzw%dyw^cj% zlI)kR-Z1~-)*IX<=HHxT&&sV8zM1?r;2VqWMBB*o3H}!~-#q^s^NqWTv3geAxq0iZ zZwme*_bsM2?8^U1D{hNEK6#^kTkrbB{a=sS#dN=GuAR~TuKWDY`|jT_U&vp6@vrHg z?PaXC4u^N=*e{-cMe*2Cp$C6tTZ*rI;(Yhq+4f69?WrZ(eHtDcu{>WLd-3mv)79!X zHu7rM3cb0}Rv!9G?M8BWu*~l0M>p<1GSj=fF8o#X8&j(T=O1q`jV#;6mzw@k?akL+ zmetLC>H8NicCqx|VE(f4&Dmd>W$Wghxwj}jE&uB08@Im-edC*(c8C9#ckavy47IyO z`UAPXJuLcjFN^aR?;pEt-d{@7Ci>QL+<umDe_68q^I)qj<@#TBuhh#|Hh-*pm44n@ zv2e<}m(O`)&hNeT)oyQVt;72S@fS?r6l*<}$cw!^{$Q^}&U)R?GTY4MZ&!=Hp5Omf z->2fo+(p4^m-RWz_zJwPd={C0|5oAMV>{2}y^l#QFL}2~zPK*Ayll=QIsQVXn}_F| zdUMdPbmH=PCxnmnl^wdd@f<_h9ODkz_dN;a<@Zv)mxOJeJh!Aw|9R{;hIHfI+lxEy z9=FVjF%$fC?VIyymlx;7_~w<rn8r6p>15}H=WAtt+^eim>RD>W7xVhK`mX2sT2^-& z->;mma%&??>b}00va%NUFKfvDGPa$#?&UH*NhN=|r;T<uohsK!=ZoH(meIfU`Q1(n zukSMVU*9>#bG&rfXJ+fu7mwP+J^vw*f4pwPPy3_amRT08IKSw!?2kLY#eS=tZG3&y zKZO04CD*ls>t{r>+w0YDer$DK^W3>oFNym{|K75BTJ>mm(2o1JUgX@#=Pv1Ep1*yf z?Z>^Ef5LXCTS?n)d4BkP<`ki?nn!=%eY?Z%K}fo|Md=OpxdGpP`xSpvT(0|@`MKdY zcR!Ke$>|cmgP&`D<4l+Ny~MclFMm4M?<vN;wZ|$uYtPKgw&A(u@zwvR-Oaw*tvq{~ ze`_)C75=TozxQ-w_T|QT2FJcVkg)6f`%O;nIJfOx!#{fqHmY1NZ3({c)8e1Fs-tD~ z#{btByq(Q;^M!20zv>rrEBs{L-XAJ{l`~29`Gsl4o@F`uX8&wX%DJEa_ekS!x5{tJ zZ4olTAHI8jo7;HwPWana>y=aAc+`Bqy~}tX^F0H}UzeY~pT$$UIe)=7m+gml-n@_! zJwI!a-G_5OHl$R&kGi5h{q%cvn}D~e{D;b4uVG)!f8+4gz;9lqlm2eAI({x-`i<x- zrr*p;oA<`vO?w~Es`S_Vn_lRW9mjWva(<H&J#sEw^hR|k?>C3gZd;G5iTq*xo7z`D zdvkG>Y4xgCN9L`YmvBCy_J;my#y28gO{_zE1#kNa-u6p9AAb2J_f?y3N?WJwb=iBe zE;e<8`6`*RzFjBhEv`$|KVB}qR(;i^H_ciHD~$S7tM9}g{&-pZ_<5->lPmH!P2`ck zz562b$GB&IQ|1Uivi3VZ`K__ok8;JE^OOzh{<T(K`y(EiF893n>bH-@`%1MpEj??s z%}sULERB@YW^I)d?xe{Z&oJaZ#&fvGaJH)3v=<xO-zjB(DhXy&oiyPMZ|=4ULFJ~~ zUU|-Y|JCw&`P|o)KmUH6m%XmIcKzGk^Y8!E+-0{X=jjz`dtQ^@d{>{QzgY6<-iKvZ z7ykL5TdHv^`jFpMkHyZPvL>q3bAR7Z+PWuhiKKVs3jH09OKyjGulD~WaAI@9b4%^z zF<ZAMYlh3Rl#ATay!0kJ`$(nkt!I`;ik^FH-tS)g?|DU^c!lSg?marsj>fG#FZ|}l zPM!P*mU(Y<Q}Q0^rq$iJedNxa-yJ)bZtwo-na^LmqP*{C=KE^HZ{dd9oN``U6<42M zE%rb!uJl>ny}xJf?hSZmu->+Khj`%Go0StS4|RX3?Cz}<I4xe;H@(7y{oAUmnh8HQ z%YB?2c;&X*`M--^%rTOFKG)@gw#ECNu0^}fAN`qHGi9aq%jeGfB(A$&UNfgCj;pdZ z=JOt|xQ5(yTZ(4of6Fgm?qB!3ymO<x`@@|k=ak*o&dDm#IrT;8>1T^$WnW(W`rmVP zVa>d)R#WB|Pt)YT&uOP$^Y3imQkxKt`TvFL!aB?9u636EDqTExem`gB=Zwv3HSO&6 zcC<d2*5thC?bf|F^p}Mc|2`_RE<E(@j=p*4?}Y3>dB-O|&8}nTnKu5F&S%;~Ek6f- z<t^U1>%gC-zvlhivg=HZ-(RgS>pA|ucKYxCjQf??XV=p3uMF`)S7+7-@EdHuz&j)Q zrI?f4tIxtyv}d<($ar;LYe%>g!#?)!@0|nJXI0Ff%DS%U_YtNmujTG!pWpIT$$GQG z{r==1K_Ai|n1;0%?GXD^^yAaMsln^E-LMMkNu74`|JrHMKlhxy_FeYrEALNlFP8Nc zmWF3PI(#wBKKJOx^oqXr>ev~Z_r5!mytm+4VI0e675%6ak7s_~6Y`8HU!{2B^usZ4 ze8rNN8&9t)u30DLywzZzt&sCi|HF2lbSz|l`+b)<b-Un=vVN2MgD6A8wpT_%zu%vb zu#UgJeKKdI+&cTuYv=r#FOYnn`B#iWiPu`bqegdMO_;AAz3ly(vmJ&%`D^r-^-pCl z^0P5M_N0dMxWqcy@0YY^{(f=wOzl^;XLVJ^#r1pVRyO=Q`@HtV)Qy#D$Ik3uy6-Q4 z(IxKlFY=W1jL&cL(m7fE=-&RaHJuZWUF$S0y!ie7t7EfvJaUOKcZo5N@!k43skYnF z@A?|S2P(1cl^uC!=B%+cSpKTuS;^h`md@^m{a2c2Y%Y=doM9VzW9DI-Fn!_Mv1jM3 zHaGOYdVA*bm+NPGf3<w}@|VzOp1<6mb!zWEuL4ER@+8gwttaZ2N1UpZd1n8e@%ZDP zK_V86$9q#|*PjaIdNnC$pMT=hDf11t={>3MOZ`;2W^JHqVb1=Sr;i_<Rr^1UH+=o< zH^no{_C$xTmV97q)ls=VPxpzZ)4bDr;>8W>m#G`eU)MLD{yKbS`Rk=;+`n)=TUw?2 z*=X;?%ANO4)x_2wsd0Xr`Y%{E?VtBl<NG1YXXLLmKI1h%z0Ns4Ew9z`O56OvdV}>> z%x8wbwtmO^Au6`Na&O&@=Px&=$@8cF{5$Wl!g|wU;rEr#-1o|zIlH&unfjhOC-sxh zZLifyovs((<LIAYw=Ugi`s+%&>cX@)Mbqrx36}R9HfH?d93u1X;Kgdq!V0y9=O-5* zeE<6Jm%VZy#J+sfF04>n;D5<D=!2O|^tA(gVSORdk9_zi|22B?=2}VbcgvEp$3KdX zy$X<@x3x&B`sk^Z>g$iqoVUDgx7v?g8zNQj-OLflKNhr~^{901tL<$URv!3i&QimA z=iIB{e%th~E6r~m-<`fk@Z*-X<|eV%T_bB>&CFQsUn|5scl*a0yR)wX_?H~^E48^V zkv{X2jq8g&DQ^ROmvhZitBF&nsk_{#I#)DoepSNK4~dhnE{w_-vwI_CCnIL%zDD*} z+_%7k$64h2&5zG{`)EdR+Hb8RpTs{dyMJoO{bk(q)|MIUUt}lziP`SD&w_a-zs?G; zxWDY--*D>!&3pA<eH8vLSL6?T5Ol-C(_r7#uyfm$4{cZ8v$nPA|I&SFb-^#A7~>Xd z8Lkfroq2u5uQRJd4L(<0om1J&^|ewW$?&#T<NwbBr&mAt*^$ax!FVrx-|PqTV!uj1 zso3#gW>Yxlx=9{;SiYa*R}J!;_9)V^VA17F<qCz8XN|!JKYu)<$e;6W`7*Ux_Z0pw zSDhud;QiO>YWM2SUS2lsbg}fg!)XVjuNK?+FW(rpPitb*fAgYEl6yEUf8MyYUg=G_ z;J4iy&c-%<Uv=*cduaW$#aRs(BsEHeTF!CIFF$Oa{8{GDO~(6L2jmZKx1Q8dz9{ay zTHv}eh4Z}!<rk_uPwx4z+xmazq5nSj-cA4Czj>zrYN7e_)vUwRg>LJ%+aErl{@{GY z2hShIx+m|t>#)pkuzx)%uioC;^M`Tg_G<49mx^b;zrfvEv+?}v$!DswF5RE}<X-S} z^_}0Zh=cgQV%Y!p#)L|}`L&_%fmu^Ex1W5@AAX(GR?E^u|DV2zu6=6}u|73#xw$d_ zHR~DeFJjL)e~o*V_)DR9*SdsvOU&<xKR8z<TpS*I%*Ma|+@1*eUFUCF9-Xr?-{AR+ z|EcG$PJPE;FmK(tm^JUy^)C7w`CnT*!@D&6*-NWAm2LmjKl{iYwuxSDc>dz!na^K! zp0WMn^vqyy&(8I6hyOI)J8I+bK3#6be!;r9<ax{gC-_}Al?%{newCeVo@?;cKQ|_M z58Jxt-|xOY*j16gk2!|_{n`En{!In@b}LmqYg9bKTj+Z!h2v|S@|=zHSj>-=`l%NP z7qEO;o|MD%q_p6kyycO3@|kN*UMzXNci&m3(<QwBjlNtioWJ$LtKjoGn~FB=yk_+G z<GiagA720aSMl4=Rp+Bwrt=DZ?rOK1r&lreLA{FgJ8cW@Ir;MfRc5~psuxq6of}v$ zrn-Aan(FQy(^Piv2)n)U%Hixc5w9L@J@l_Sti9@M?TPqH>@R-KPTkdJlTo@NoIld~ zN^(1^d}AF;PF?obmG}K3WnV45oV0uTTE3I@o2;&c+jsByCsY{fS6FB}Bk9<rf6kig z;`*2EsM;!IwKlltFMDmB+lS3fx0lR#eAVLol?DA%xBD7?PvxIgdcEL{5}&`}b#F$? zwZ@NsB!;$IMqEwLTP9^>zi8Gko7QdF$MqWj_kQ@l^}#U<@hOe7A6V?sKl=5gc~d^e zI-@g%#s`l!{Wm^yL^^`G{SoiC+8?PiI?W@FNT0FWE+VsNma+ZPD5LgOVQ1Ecls{V@ zI%C3jp-=bh!u^)oNc`?!I&0^_FPY4FjW?<roF`0fT)AxD68V`~*JD3gYF$0@bw@|{ zlZz|W*3~Jkt9#>Yeemto?lW^kc#7RcUl&XLG5O{CVL9(Vd+s}8`}U^QuF$OU5V`G} zGTWBLeTB(0yR0=6o^$;SnLqsyyYaWbAy(_kj#k#_?~p$CIKFZB;dbwp>)z>JI&ps8 zht148q>FBwpZ)P?#)p~Lq~1(V`xK`2M?bZmjpN_)S!Znm)_$+#xVgoOHS>vo{SQm! zvuC!d*~d5Y|252uoi#gtukP8OH31*`uboeL_?+$GZMJWTB0q{|?OmU^v;N-qpA$=z z|Ic`u%-SD5-^f2CU2|GV*U=ki{MG*(`|7+rx4paR{h0+3n?CMaFJ>Wp{gtoro84yj z&mERrmY?}{{R1B1@C4r_c42ZIuid|;>+Oha`}kk$^#5pK{%xQ3N9=R>;8f~;;(blP z%G52f*~P_dM@`ua-!`5ve(<@o=l1>1@NdWGoiW%O_|x%udc#ZE)sMG_hCVA@HS7HJ z4Y7-hxo=0c{=Y8aw@2!)BuiZLKORZFeeMbs8y?6Uyv(v*U{Cmm>rL|Vg}-YiMJee$ z5>xic%P!REWib!zozWa>{LDSX`<Z)a_Os)m)z8FMSr>a>bw9y=!D{1^*>}Spa;ypz z$TE?>Bk=p;B|*JuTnA0vt@5;XG(RY9vKOggxx?~(`EvIl-KGot`<tW}ZT~Nq`D<p) zZqrL&jMuumcY6og9d@x>>}t2z@|eoO*ifP3DYH)5_?%69xA2*9`^u+hY_D=X<JdZJ z=lWac{xtoXwsWeL_O?*PZC};bYJ2^QzAty`$Q{2Ydn_viitfqH=}695?{mtNDd$Lf z&^;@~{Ff8T&9W0ycilNBut)3ilL<-jb2E!PKCTliyC+;`xAE7McH0Xt8+WqAJE-%R zTJcx<?^(ZI;8*yX+OF@bQoFv-`tbZ+VBc)+cc7p$I>^p)Um(Wv^q0d~zs;XX+oxE# z6qwsOeb6XXFYa4)$j09^Y2Jca96ycE1cyp1@_*jR^)unE`PoIcQWq>+d*E>3<#&-& z4hLF1<6)RBdU?|3H!(5wIbPGcUpFP_N5`B`pMB?2RsY{jzHe+@-#k<*dnCT;>_*i& zweNIxba$n{Th(Sz9(;J_;Sj!JebYuuC*Rb6`d?Q~&=*RcZumW9J$L2I4LhTIY*ljV zbf2Wx&hz{j_5c2vWp~P4=9xEIE1uu&vaZR^`kjVFSix_@zF^krJqx8u9nYT^`()0N z&t87?`?+t8yA$VIF}_=|;oVt@&Fe2#&tIMFv-afw>|`HV{a-b;Ju4pv1-ehVFOht% zS=`lEzsRqR(=U9#QTht)Gm)?OpZQ<8yOr6-@9yb2t6v%RhdZ7T4lyWh%sOrpSei0# z$u2|x(8M#hL+zjOUvYTGAIkIDU8}QlxmW5xm)^8_>(vbO11`@HUuk(Je?|U``yt{p z!dIL=qkT2>+4d{*&#Vqf_~=_zS1tZoDs*b)+FkuSm##X0$ICRO&dv7VpEXhk?u79s z-&=8M=70B8!|5w6?e0%?-kX~xHKn=o_m6t-4*_2i*$a&N6a_7>eAayNKjK8NqW|f_ zzm|?4m=0zynBSLNC;3D&g8Oywhk`F33_ozl{6FtduX604(wmB8S$mxykp~N#`Z@P$ z?09BTsH?c6|AEWFn~%@bx$Km(?W>vHaija-<TK?p3+yGIue^Tn$63LzeH%7&|C&6p zJ^7m2*KZ#SzwJB!T)*XS@u9lb4ey^?S$}^jWqoD)_ve%RxMk#}p3kcGxy0G{N2=yU z%GZ_at)9<%8#Lc0e`eL<?$jvZ9og$F!`@sma}V>IFL3bgmTP_X;qQ&)!=h*Oui&5I zzoLJp|El0K@hjiYtPkIBbbo1my4}(|!}{e?*LXivik_))v^`Yg*=qEE#VzCiORNn4 zuUa&deMQCm-GOh+*3F3doHO%RJ<AWVzW=TXt?A9i#b=Ate(mAg$66=;$1-c9@K%eC zdG;JX6;JGM{bTU!ztInltiS3deT&)OoipCL_)ge4W79=*LQWQcd;P@n_t{T#{$8s* zS9jeeeSiJD&GR$f2IoyyuxGAZmbz=Y<_4=NpPgPauN99~*<o@1%Ne_;RcRry*Nqoj zoWHu|v6R*Poy+u6)~)xRG5fWolihqv5B>DKCHIr~u4T9WYd^%dwm;OVE=peP`OM0& zko%<%R#kk9Zo85F!1C?#2eT^lzOxoZaG$R@|7_;Z@RZ$$p0(%1ZM0lyx@G;XIXq&P zmRdzcQ);u<%a&hDpRxO8@tLE)+@ERwQeRlyY8i7sMQ+{uHP4UT3qF4`+c5og`;6j} z+GmAUQ!M@M&(B%kZYciZ;h}#L3+<0S&pxrabM>)`Q@PPkb_(v0{UpOx$M-w%`NtjZ z4(EP1-F{SAp|nGG-rTf)^GdbZixv6Z|9P*O^U1i-=4ysYmI=4j%nOyiFLY${vs^4= z)GBsv__^)s@|rvWv+Z27tJm^9Et|j9dFNgIFQ;4oRj&58+|MvqX3zcqhmGFO{{G~4 z^49girt^<IOURipH8@u4+3egvT`A7IIq!3}ohvsx{3c?Rw|}Cs+ll10vcJ|&v^e;& zNtlISXwHoMUwdM{Se~5x>Fm~}fBy=7-fR4BvgECgK6@K0r`>!1Sz=RWY1-4ru{OWb zH7l%sJ<t7c`o;X*j@2TCZ`u9X>sjk0Yc&6V+Zw^oalfPfg!y+P_8ap{4$geV@>!!a z?u7nN8Jor$vtPDq6Y^JDl)E%tE_mlL_rW^eeL{aS8Xp@R%xo&>{<rQxY=124@`pSA z_B#pR7Z6N-U|#9Oa`~%e;Zi5z{OW1Tx%`6f&b%Djaz1uVUHmk0F1@fyJMl^U*ZyU< zrmbZ@b@(=fYJae?;$Ojv34hG9W#=$HS6FxdK(gTU@RUcdv>$1S6pC)**XNwKQqA~$ z*m~pri^2@{ue!!H_p8&s#yan1C)PANn9UZQS<0_5ZJTS_UFI&;JtxlaFZ53lyt+c< z`6I;%{_QrqPsHrMn9fzfRS`GwCi}^Mf0Q=+Uwp5uv*BY~SA}_3h54rW-YoyUbCc_s zvo)mdE$}m1AFzC8_{z^`vak3)+v;UrkgWZ4k3glt?OzK{oKak8Bg3ZeBInmEzHr(8 z2JvLR180?t?OW`=iv-tAn^~!RH0>R`?C06d;*QH>H=g9oeQkLnd;xn^l;uzPxSS%_ zeP1{E?B~6>`^FR94d-g)-`2Hjxfs+wKk<<-bav(Rs<xj~vX1YGE=|3+xXP%0mC(%Z zD;Fl^Fn&(_D)d=!Ys1eOQICpQe&+m@4E3q37T-BHB<I=cfV}5ovwvz$xqbcM?1{H~ zkG`An!LVp6>+g$#AHtrz6)D-K_}t#<pI%X&@Sc-bmL56R{ke8Ul+&;IkLN8~H+Ay= zuU<a$UYa|;;?4_5D%uzDq-N=fpI&|6n;y)+VtvLw`L6F_(Jb}PrlmKYD{RU?UZ!uD ztshXwHf_dMaSi*-2cJ)z-yziXn*GQ>p(IJJ>d%ViuMO5P)wBN$lUBZYKkc#B_sZS9 z+8=HU)UL4+2)F!wGsOCvZED^!eeR#<?dlsMdj5I-xFhj=tM>yni}iowlAiHg*s)uE zmL>BS_qUyoX6}D*uSu9i+;2~<oOkPo{Y|yiUe<L{;apq=(XqWdC$BquC(=BvF3$dx z%)0qW?-pAdeZLwz^Y_cRGx{&YX9$<5d{&ryV9tukGudB1Jae*&vv|tA8wLk1Rv8!f z+&d<-y4<WJncpD&_5GR0U+kZ8{MBwLR*UfP^mCWL8;ZZY)jQ{`+L_$a{DqhOUmW=n z<5IfOGT!Rq+Vgwr7DdmmeC@K`?z7zo;TiRxRDXD`xn01ymGA29m%9olRj6t1Xnx>w zu$?8I$-X!HX!hh4_s>-QF85KZ%-%bz?oX}J$>>K`dl-NGx7htpW9RBu`##6AC~~d! z;%yIcczXQMq%-H=*Q6g0J*jr^ONy|UknX=(=g!rXm!Ela=EL0gI=dqRqc+`4nS54l zo}5E~=M;MZt!<0K`a}KKMg=}m`1+t<Ib$jBJT6AvdH)=4|9-u<JUuOV^-tyBKkt>l zul|0w{QlnWd*7dXQ}sx4pKINJmS;szb=RG*<(ePxqi1i&;Ul#dp6{%Fxvn$o-*t{- zc9W~0{!UM*4X$2l$392wrhmg5wTC~;7vzWieIq8frcs^6zF~j3j?Ieyzg@)s&pCV6 z$^C90*Rghf&huO!Y9dM;<ac{NOy-gg-({<?=|%GVpk1}DFTdq3z3o3G@4VK{=S%)C zXZRmu@avWS6yAj<8~@JV{2*sXUgK}a`F{?xPSa(oyV`WwSkuPCpOgPrZq&ydA-ONN z&t|Q;%YEt`1bKaX#+v$^H8uU{=fsN-=Qg|#`Z43sanXM#n2vAXb$s8}*cU(Y_a2%p z<jvX6uR2R?zrA7h$G4q-#p)FbuRO9A+8+Jq;E}>^`zb%#j+U#+ZTwO3=uEfF-$mip zzh)f$t};vP{_KqCKjEFTb@thBy#B~vg)idI%Oi<bpT8BepYWsl=x5WTpE(}%FIszq z@Ba>mt=dQD9OuvvIAiHpA%Aqvf2BPhhR@H`*8Dp(qxhbkU45e8&K&u5za6{m?H)Rd zI3N4=@R#0X`G1BN`Ga{X*)NKpFi-pTao1uy-ba>x|Nf*ODV|gFrXk_Y^RS2Z;yKl~ z?SB3dd2riRtoCc%L(ay!`LCXTKGeMLSLwkQtM7};U3uPe!cF1#lnWQ@{%cCe$8FIl zWPVfmOX+pP>*}^c`e8rLxGul_Q>oi-L*B)gW_w<gXzN(r{g-j^<u@_a-|Cm@IX{#( zU7UVz*NYsBwZG=amYDtFe#u_@Ol;y`=>yeM=WXZWzmzX5_ht2M(erx`HP@BSmwNp< zOD{gW_~*V^r#V%BUs<&2^P)|k>y8)ys=M~kIwQR`e$9uOT=Tc?|6l%a!oD>7`>r+a z-;P$bnyc2$Dfls8*nYzg^-gu2I-`&4#r~Uo+;UW1_<Yo#m`9b}^Zn=ilWMM?8Ik<4 zd(ZUfKS}v>kET~nkNP9@zNou?>W-k3VpHF!sqS_@8Miv6T>IvvNpr(C<*Hg|fBf88 zsaidG(%t1L{aQEov)HtJ6R+-jf84aTspkFKmU<UE1K%H-QQynomv23|=}`UJ58Oxo z2Y>1{=HHON;O}{>1F!qGMHL_T`g0X?-+!)$?$UhR_P3sU9sTci)L!pT#`d>|`ps@G z{Gl#VAN=EDnC?S&>zMk6zaLH;v41&y`$*Vp(PQVoTGup|w;x^q=^cwqqWz)GH4SzA zGwsg*Q#|zg#pgHj>b2+8`~M$m{CA(#YS}T{wBP&B6j$8Xef<&dy}x41_neP<Q{Auq zPhIry@`n8$RYmjrC+DqKwVkh6WBBqX(?jnUzvHgyDDIoG@BPz1sxhw>fAze5F)8}{ zC82Y#lYZq*o2k0Z_}l%6B<uMscVZs>oV9=M_ShF``_$LYyFBl(>HF(q??3uguU$N! zZ%1n_*MG)K#gm?WVmuUVGQEFd-sF_e=LP3|x*#tX^6P)VLvazi=L-(M=KnVT;<Y{3 zUhY5k%IvkJ&HJ^Rf7ss3*4cM*_nk+x_x2p!Ua@|A#mU{b9*O2pKkB~cwT|7ZzblWv z|GrFT-|5*Kf6Ne%uDMga{b+f0ecnggd+9p=8or<H=G}L=`p6^ey~lO_E%<)8d+wWH zvHD}xM^)MC&qZf{e7<+e(fAKc-TPnkM*ZQxcg#Cx{%xIoH(zValNLR%+h8uU<b9s% z?0oBv*LAi(58UQ(f5L2fDEHHI%R`1gKPx@#YyWy_E&E0Dyanew@2|b~H=px-WrTI@ z)DJeb;fEKu<bT-^SJjlF{OSL4{!_czE<BffwDb7knEy;4?>Nt2YyDavS?2ZB_8I?A zAK3p*;Qe&dg!7;IHtIb4sNM4Xse`=TlV6o{KP1TA*OK`BBf6FS>rA1W+>T{YFD%wq z9^4`Rjq7~vfz1k53;5pzR|G!%>$Tn5MXdIL-_qN)Ufa)W-IWX3WxFh8zxLnxY}vnT z55DleZ~r9c$COw9r=MzTK7EJ(*O|=II?_ya7dKu0JoQlXm#v_THt*3+r-}>f+on&Q z3rADmeA%?=^QKLkA4LktPGfivwv9_ZV%qx+L0>OTdei!q>v4IL<)0Ph%a8U~%5VI! z``&S#e~sTgyXC*{%lg>Ar(O5o#_#fC_Ame5dL$h8G06RX<;=z9I(5ga(>@m8yDRqp z(C?<B=d0s4{+NERS?vGz?;BoyuI@T6U1XEaV>$0W`<|9<Le@1klHY$ciwOVg`(Uo2 zX5;c>wuo?@%MZmaPIb=u?xaKi1?p}bo>BiTG3L1YiTl@N-Q<6m9c?+yY42sI=>KEB zhFXu{fAbUOWpd9--D}GP&vSly&iTmF(e9d1&)@y-Ki0F|zE=`a7cTsv8dT_Ye7M8) zW$~){j}JBPtJ<IN<*Gg>|EtdvPSlB{>{l(>a$mUVV)%dG3ZsP2^E>%=?DN<D({o6D zYF?-4G*|f#VRQ2IqYHP%Zg^DUz0TsU+tfF&!=HSQW7zL#@avLv_#EEttN-2K_b4Y~ za@~dWd#ao4+4rO$efd-Fq2n*#L(O$x<Bk@)R9sl!w`ybG>YaDiKl`L=I=y|$o9$s! z=7vw1D|-ICOZ(P_`C&gKTm7~Eyx}_D;;f~%Mz+W>aqV64bbhNp)y>bNYtB8eI&ePG z{?O-1%3pqqHt&ePCRnFg>w5Ep;FX#Go$kHv`*MAq_{u{4O@G(RmQ>t*ASxDbu;bvP zZZ>YQc%vVFN8>}kNIeLY3IA0i{qh^vrO&Y~=T&W=bNoN3@a}bOOT1;r?_bxHcep+0 zO?q2pe)j1dN0Zy?{Tu#nJkQ>D!cz9b^1d(ES9|<7xu8Ggyt}>EjQ@vTY;LJ{`?9%T z>Dhh#Q$lr`A7k7rdct0-9l9=LS9j&AG{455t&4wre^hyg{lRlf&VPFz8Xo*1dHXo) z<Gt@bH+@|9%<<rle~*It4X-`X7w&mJWpgY0{_Wp_nR`CIPqk5z*dJcwQ}JQ9$$dSE z{qY~e4>gN($u4|cUL30-u|M2QSz`bH&ry=%uNP$=l;FRwAd&s!Hp}CvJ4zC@pW+kN zaQju?Kae~9^Y@qYnRDZrenqp`Te{S{P5bb>?Z<Ct!FrJb_YVvw^f>nkd`P^=yTALT z-oo_8zWX+w^>@Vn*{=D}=Gg8Z{9`ZI{q;ZM*S}aF_G85%`;b5S!C%TXYW5yd7yZ9u z(f$Q5n3ta15j0C<d-l|z>P2GHwVs|TiCA^z^xLxd+bNaH!sfrvUvqZK@<YL%Mala! zQkUI%HGQT|_@SV^*ZNF1#_rxYdq?W^h|E2A8u}Jr+Ll)AzkDm}ld#3_SuQpPtql3h zT>m#jVtUlnAe+0HZzAmtub<s-yJz9-4J&WHc=_qp2H9gix9+WJTY9%wV@^!&l}jtH zXl}H-JNKMPy0gfQU7gEsAK14#(YkNe=QGx3ae2KHSFV}Xcf{7XR9k9yd+<fSgIdd0 zO?jQTM9O=0X~?Vhna__!-8uZqW3}<O{*K(e%v!TvFDo%!^XTf=pVv%mV?#T$H$S!5 zGHq$;X6}GnoOhBhKlQk!{`iuQMewX1rwWFU%(K>tw_637#FwUDSh2i*`GIX|JG11L ze%H{s{`zd!+gG!0#Y8OUyEW~2VN9;com(r~ij_k6wf$Ooci&FDa?e24ZK|JbPW}y% zZQqZay~Z}j)#g6edY|>@*PPG&@&D7-#i!VARY)JW{o(m9E*TH4sU<5f&B?s_DzWtM z0gsx<A`4R!um7j@RQBgQc(miV^r2f<O4exJaJS?t<(P4acgxZ2P~AhT8_x&J2xRp} z-Em!UDXzqJR>39vX<K&4?K&aBsCCvadFwVSJ(U*AsFIwurT#mvnLk|lkMnw!+7<gl zQwl{n8}Bw-Op-ehxSOr`Nk@~%^vu}BmzQ1NwfET47q{*El&u5Ziyw(B|9w>UW~X)3 z5y!2wBT6@#zY18hSB)z=aq%zfpFe!AFp9@7-9FLt+j}v!=@YXbDB7Ada0#5_;q|$u zl+p3Sv9usJLbLY`Q&C>V7Fm-+J1bf$+8*vN*(ln&`O_Rv<%K7HYucJrS(dx@N7kJw z{pzDDd8;CFg}cK2n;$h}Uq`;l<1MlOSN2&_!S-q6Gld`jWu|<->R|tJyY!!s<kb(i zB_6xqrFYre!1?CHKMNT(c=Ps5lxtepIP;T?WzcMnl}|1>Y?Ybr9`%DE%8?<@?em`* zQ@5?ytvksqs^4aP$SL_ts{$tbdruWV)@1N(x5V)cSqr~4?0Cp<Ide;PaPNky#I*<i zE>XDQ_Gj}99W~?1-|IPIr<UcL)_C%r(v&ouI#IFk$R$(X7y3OrRL{;ib~niKAx}r? zoad6CZQN%%X6M$*EVI3JPEC5Q<VMZa2lu_x(GB@l;oW5WAbp~fTiVt(Zo8n0qZ3%t zW@mqw;yEVI_>SS2zgTK$#Lb5#0xNP^ugTqQem5;dxcFA{+1r}?nG=&+&K~RvW^(hg zN}X~{!bxQHmXso;XFd0h?%TSxxshw}+mcC15^kIIf?uBSuzj|5tA>Tp&IGsej}vuf z8gbna@J!jD9`!P$Yhx$ZmO~keeJ*MusV7syAF6mqTk$^gD}KbT_HdfVR7G~pTt;Kf zG`_IR&Ec2!8C*_lyb<v3rOoj_`yTSQ*xwgr_fF2yP@kT@)8UDc=S1#ZPYvuW6z7$z zSzZy|aA4Uq&B>d5{^&$&1;3bf=+Jr2kMB;+xXU_CX6}{SygjB`iCy#m#<kf9Zz{Xv zz!A12VK;+!UXI!8Ip!8DDVJUD$+-I7`w%(L-E8q8Z&ojlJeJz~H~6{)lRFGw#;mhQ zIK<Bp_@i<DQSHksbL^y3{^SH~5jYf3p78D*bJv!rf@_%zvbDb-t+q@48W{F^OZ0@k z?7c1bb=ul{=RFtP%n_C4Z;^l5ede;uk9fo<{dHYbZd>u_VwUjy+-s|XQr9Q3n5fKW z$~t>Y%WYe3tZ~l9b-A~1JnFr?v^HGo+OM5PZFvTD)1A1_Z&`NbmG%7o9KpqB3WPJK zum%U{a$Z}IeqnzPOC48Fqw-$EO_NS-N^AFOH!Qa}rE^I8q_w(Xga55NM^0L2Zz>OS z3e>xLb#3oE1DPe06e8FAx}?UPjJfsX;5wG2lN4fO1hTIkDLpeY=AQ7~?VKBhzg|$? z@O^2VN2f|dn|hKSLy{uzD&y_hj^An~9dq4mRGxomY0T{N3&c(;sp%bNdt|xH?cvwC z0)PCUe+*H3Up(uHS(Nz~#}LEWS3IT8=sSO6nh>Ztdx6iHu;W)h_+C5dDe-OP7rk8J z#m95L20jxA`^av8nme8QrHnQ67XB-<dslM*KD91p-eb8xF<al<VhcKRV&5d=eN1ff zx{H_0cRm@iuH(l0wF_oU-yCpiiH*JLt7mh)5A9Qv?h^kk^SJi$$9*a}_7{$An8#_x zbYADj-8c_BBT=(ME8J9j^iRj_ipqGgyl$HXx3ugc*UV*q^!QRMqqA<PS=_j#_R;I| zHLc@QGjAW8*J)>Qc}>!j4R+BBd>5{$ELd1##l7~W&X0h_Qf?Pix2CuRzn-(Q#LOYK zuwNqV(V2zP%T~NDQqP;VY$wyPWj1E1J11x_&h*wjv+zbpz`576a?ZL{`^)T*@+(>9 zby?t;$JT}#>uza<30<pSyKvZbs4C2{?6h85HtRz#k8=3Nxa>DC`?xPZHM?n8pt?!s z#_ESMrYUVpl-P=WKl!p<EM6jfse5@rNx|j7=j-<N*&Vx{bLQkcISK#opV#S3{QFAH z`)H|J@9Esd-U1!33uCsQV&8Vo?N`cPo79_?|K3*YyLVZERlmglyV^88Jq>Z~-cLNb z(Fa@I-mPBU__se~?b+6=lX{C^Y=6=I!fEr<sJ%9U{IS`L(Zyl?T=AzY9qqa^iWGZ| zV^hC726{;6B`xw))08m3zeA8CA#whmRm`e6yRR@Uzhjd(&Gz`|=)CX~KhLguUelxf zVDa9P54j8cZ|69<Y+w*D{5xg!=BI3H4)JcyvdO*mH|4_Zdv_b>tEpO92<^z{n7u4^ zvD0CLl*xB_K9;QAv|Mo8?P<#HT^F+^aZZ@Fe5&E>^%J&Bdav;cF_2GRkz~5+?5RvW zPVEWboB#31s2t^ez+rxPO~O%yWcQ*@%YNPmjT;Ok91R*~eAQZ_`NAPl#LVE@*0X|} z4xDq@xGZqpXNDczli#>cu~j+qDeUCqiv}BRUY2oI&sN}jb)w|cyHg%VUq&>UmpAJ^ zvr>4URafU%zI3V2suPU`2aW~>vL6mHke#;Lroiz_=fVHFt}7RPj-1zDQ(0}R<i0ON zOEulD^SmMZi@;}s&kh)T{+T-G6QlV@LH+!`ipt`-N#}h8YIZLRUve$y{au;Qn=*f# z>H4ld)8z8yZ){6#@Af?U7a^JQaZQWkH2DM-`{}2j>`=MU>2&6J83W(TlVuNH^VL`c zrCxfl)b-DNZtkm`x77{4ah^#HJ|&{N?K)F?!H>#Q#!`DHOqitl;I>-A^wTSsyu8^H z>LJ;+_rN5p#Q_hD)sLuto9;AiUEs50*;{S~YYIPkZrUoFmbb?y-Bae)bJLTtiwhof ztBQOwSk&=V^IFTj4R6+%-xOgri#q6c#A50l#)rGb@)D+NNlf=r?G?QAX7!K0R2e0o zGn3^+<qpp^yYptvY>Q7vgsR+Hj~Ar#nonP2ZTaJfP%Vf%TXNZEvyG4TJ!=s1c99ef zQ%+GoRhR2@Moii*sZ)9JA-yI|>-_s{%+YF()8s|<_BP&Cm5TG<_W9+Cn>{;!ocDhA z=&g1r@4YKKqxY61Y&LBDeJMq_Y3GS#O{rO>y15U<CNG{jH||@}2A`RSrb_*=n;K-M zlBW4!hTx$rGmll9^fqN0PCY1cV(Ox0&n$OJ^=}b2GWHL)eZFj};lfSNB~I+SKezS9 z&+0CQg8CDhZ~lGWxW++iv3{vp;@O{S8kTqWMxMHJN$u&OZY{H=>ifDrY}S>#6?=Z$ z_lPc){Z%_RE#LiN){BsDErz$PX204$|LAGubxD~Q-o1{DVJcp<zvtZj!!s3b=X0;g z(@6EQ?MQFRnHE%TJS%8*uk8sXu~g}+DoYYyC@H7h>^8sj+G_h<!wH4eaqkY_b}HW( zz%HC>XLbAc>UnR^ZZu2J?>ZaG8LD3te1~uG%?(*;$JE|L{uG%mY^-=@h0<i+T`|=$ zvoh2dq;Blea?j6l+q!y(it@@in`MpnSoS=!W80P(Ir*$xRdGb;LkIWYj3%${%?z<! z6g{Cd@<P}upT|)f6DqvE78sd{Zk!T#Nyt2UTVwC_H%C^Oe4jnJuAF0{mSK-_MD})T z;dO788!wp>ewTOWp1sR8!e;eaG)<nPw<X~;%dWL@MF+dICq1&-dvBgb=;2)_5+*hA z9$lC;RjllNn$6pLnhtg!e``7Ia_~%Netzn~igV9j<T{$IzMFm3*?HIX%$m(TH|Bqq z{9xJ9c~|R)WVM*)s+#3f4xE_h^<7iYOzW)HJL^}f>JO_nFFfUzarLyJ6@T3QLRS-? z*Xc(?ohLkDUUhb{SEtF|q)RWC>d*aAIot2WikqSPAD2aL4VXSzI$flOQQy0*ZR`4p zIqSltQau)T7R{D5&3}`$o+D=^U%P_ygz(q`sqU<`GxB|cA|{_NeIqe@L8;3l=hZU) zvyHVr%`DDMc~!Jx<J;8uy_qE+@8)`auQt3VJJs)sS@Q0~*?Y|n>(2;!btCG{YMUvX z8=jp0skUk987sA){~A|jR{wW+zRN<({MHiz0slo(?7#MO7C!cI-u=+>y5Vl#X_Kv0 zB7CmrtY^96DcipOWUsT9$1L81A(N%uGd{g=4|r(4c*B*<hLg@SvO;4;67!C{5xHUB z^>R+#=cFvvRH^x9y_FZ=_xY<Cu6R7T&*h(1X<Ls*r*`UU&(BFZqDx{gP4e=*a-cjR z#3gt4yIJN_x4qd>_GeY>(zn*z^5s1FzE3({))T)u`T4cj+3rF6<d<x&W6-;CdQ0K! zbsty%o4z-naq_AiLi@H$CLA~@DeU8OrK50?sQiuZ7w>MD?66rTt#+D6xXtm-1QTT* zgTjPk^YU1(DZVgBT5kODzRk56$MfX!N*3R==~=&~UZurimTKDy&oloF71_SG^ZZIy zaqDed8(jJ-<mz5q<`pOB|K0bY)_H#Pd#ln{S5~en_S?Eigj3ClEl)|-bK{QMmy6WG z8iiFZzf5^xY{a9U8M~$8<)t%1(^NdHIPFhPo6%OlzM)&Atn0UB?5@eOEc+hpO!{_e zru%d6sY|?Ec6Ce&U*+epLtOCFrz@N<!o*Y0&5JXf-6Z1cCg^-cW6@>Bn_+S<Eec{% zIyUxrJn3CO`CCVww3F?z+ckGWDqPs+-3eK8)GX1HT~?@hhqd(O6IY6YC;DZq3|tVt zX-T^@cfXm~yd~R8F5O^q*{rm%YRlFSPt0s}Th@KcVb^lEsEdd`cw82=voGQ^-`&RD z9%e6s480WeF6dvps@f@S9>Ul2x^$bNvHm4fSxv76cUN5gT7PHxMsfBHze4xbeO>hK z&Eqar?WJ0R!V=DMVhg#0_8pt&ZS%0V?e&qv9fw$UNH<jL?RvtxF(PB40Yjc@Orgqx z&XYpNHTB-jI$k|zqqKTc)5_rQTXpN!ZQov8TQNDGE$eoT^Ny*$9-kAJ{kk%-DQjxj zV=FbL^U0I+CTmV>e|2?{9{<&SdMXyyuinhyRA}{RwAd9jM@#T{d9ufqvL>(MD6Uji z%_qsze^zlHKfhwK@b&MiPFn7N4ycC5Z#e04_L)GKREU|5fTYKvtL7dNO8aMh_-q^g zIrQ@M^a&;`cA0CwmOY%?_kN}CqgkeNy;fcDd-hp&_R*htlh&zM?L76m$|Av`=!v)p z<K&86*4(Y<0z`zjYIdo-S~4lB@Va7EhmZdTft`gDVtu$+=g6G+WqZ_SYxm`EZ87>9 z9xIO(eF{rl=WM-)$xCLPbBv4rrKjx&WLQ<^{Ft|}(>Yq|V%C!#oR4;NI`|b{oVe|g z=$sM*v70$fH*$>hE^}Yw`+faFrC_Yds^AS5mUw@<+~eRIFZ9Ap+L6h4c2VtuMZVTv zjkC@!3}}@7o8~mT;n>+0yT4A8W!$58S96@--BvJNK-c3#N&Xv^+RhbAoSHjVs9c(` z!(dr#uS-x+N9fFHKf9%8M~P)9iL#n*e|k$Vf8O?ri$2>{EVt30>cj5V^lh3No1vrT z+%D^t7RtKHyWZaQ&7ENSQq@K+SF(`%+0J>7&y@tp-G2Q0<BrJBdzP_sPPtH{)*@Lr z{cLV#c7CM6WZmw(37;-$Zhla%A7@c6r)}<`GBe{@#YDN@iyC6KWxFGqHqJV>sQ<Fn zw4^g^=W=6g^e1OWTWw!j_-@j%nLbCpU4H4JB^u%}HS*r9$W0=bchoHk^89@J_B6e` zu*^AJnPO*SZ(W&GJVWPniif$Rzgmw=x43DNP`Ik+tfyPH>79BqO($>O?Lz^Ne>zU+ zTmHyNY1!Q^3SKFKo=G62`SwTTbn(e2)FvHK3p%34q#B|xBppAIb*4*~-_Br-DGwhm zzP0R8O~dbbi}r6^y!(dcdEb_K#r(MoU)ZfasKco3@Keq8lW*6P*;~TW*R6EtoTWLX zAc*r+OStkno2TM4pB+9Hak|~TrQ)^fw>g{CA5F=>td<nF=i+R$_Q*TS1j=u(3Cc*~ zeV6XKb;q&g8=RlHg}hp1Ra1FrZ+2hqiD}!;#$UQ}Dy8YDZq947?Uu@BMxQn?3Y%@$ zkGeG_d*1D1-$HYZSmmB432kJ}&Y878<e2)`+M;!)yH&2wiQKg$(@s>ON=Z28+LcMU z3(x#=61x}j`5&9cE%s+~=ljj6xcqFF%0Ko=rn`U5yB2V><U<(mrBgAUGf!VGl6*CT zFK)4AN&hpJqE8S0a=qJngU$bR>t*!?FO~IA##A0WRIEF7w!N;l-(nMA<;wDBk3_pq z>{_syVS0>KvXuCmEqzU48$GWCxo%)EFZk2r{N`l~lc?Ln!q!{%OD4BnYO~0>aGXv5 zSd6)A<fTnN8!s(ls`XeK=<ztSa_Ng>vNJW;rta!l|JIA!T+aP#a{H%+MbouIi?v_> zIX1EBkzDGOp2NjkdKOGt^YoKpcvF$*xraM%m1!-}mhn&8CXzZ?<D-r3Y{$wC2WR(o z8cN^U+UT_F*7?Q+&2J|-of?(ji`53TPCNC-@zMm2sa2MD7&qDq-(7fN<&vOTf=V_k zx}IFOGUDyZ__=i*k6`hAn=2j*OVmtf`v?YSyEe`5ZSxC0Tc#1*aN%R;4yBK*>AVKl zY;;<VIZA(6bId}zWp3D|<10#o3ZAR)Z3|@JsJ|t-^J3?RpjBUc^1C0~$+|56>1d)I zrJ?&Z<|CuQnalo*Hbmv^4pEdkfA2TL<f)5<SGZqVx<x(KKX&0k!zQtbSJqwJ72>&0 z{6ek3c}Ky0yV!*+cex&q*>>&p>41sNN;SLq-!f-gZtziw)etYsuCQj=m^6F2E4x!S zN8jv|H+qkEEEQRA&b3qfX2yf3P2AseRxn)&)Yu?7E&8(RHgUZd#};Y{JUKMCaRqnD zmjFeNSM!6mJIab(ZE7*v(#3Q)WY5AZj+5?EvJG+3uBBc#7Odc1yr_udx_O6R%=K@* zF)5ud!{59<Q<|3)?Ci%mqt>x`Pf5Y#b#;~;y&~J!c{)y7-Sx9(c|cgxk~vHYcXrHh z61lj=VK!4x3TvX5^=q^1g)Z#-mA#H>pXusy-(aD7M0NKf#=5J0pB?AE)fV#nWg?%j z;iH4t`OsK3(bJxcQ`FD%-$`*OW?KK}rP@v3mDxcz>vv=t_2@XPFyJwDh~rTAY?-W5 zI_Kr;)kh=@g!DD1#9saDs-$_+!)3-Cr|t>Uoz^|NC(#_WU9nI^IZ>(P>Bk@yL3KmE z#XEQS-D$aRuKL)`MlSu7wyCJ=^O*|@x{t>icr8>4F1hQ%!5_V~VTFRnglo3?az?F< zSMMI#AuegIZ<9Aqgg1cYc(!hB=l1}k4<1GzmZS(A2~{g@{2rk9A>-5u;e7Gd_?V=g zSpixfJhUdb-`BhM{DV)LZ$-?zReryM{J3oXUT|N}$=@HVnseb{;e*va3ug%krl>vq z)zZ<DCAWR=L$}u2sJJ8SH+^^5Jye!F$Iaa`PyFH|;V7Y&X;ZRvHdvia;<>meWjV`2 z)qusvRNn3vJ>4};bfWVzro5&Jivv%_?0c7SQ^1zf$=_*_x~zHDk;w^byE8N&Xz|US z@WRvDs_MtArB9u&sBoBG@;l(0EuySbA7Zveq~S<d#!`p4BfZRfQas)=y}$nR(`0Vh zMy2ozk7Gnvep#V>dY1L9DmKH`4@qGYUdwC?DU0n3x@A0l=?g!eYrQvTxIbHV@YC5l zIR~D-o^2>T^{!(38Smz)2A{W;ib*WK{wzR<UB{EzEnR=fj2Fu?cviMexuZTQY|-pV zzmu-)o}%q_zHOh=K9A+U^|J2mT2l4e>u$8Z-1TC!vNoedS5v)AeQw1b>vcV2;#?T0 zdfj*BvSo*REIQgH3Lm&k+VM~&PNh@cZ&HVfr<+sI#0e*ggk7ZO^tn4J>H4`}n_aTx z<jaD|mpPNK_fB8$U|2gtp>x@?l&INmk5iXU;Z9L((ond=ERl10he@C8hevTsvJSE> z@Z0fsrN+jWQj;s5zB+ocuQx<<sjAVPGPTm(Qn5;(AC>%wk7N&iwWGshQ}Q*va8p*! zjm6Q*y+>?Ty1x!OKQXvsg@2#z_4B$mHUb}BI2@SF&NMIifp&_7%=E)k7u96W^xxmx z|ACF4pVh`n<iiurhUXIIpO*z1Mt!d?N#xsW)L*vX=(8Kvbt;{c!p%<vGX9$7mZdD@ z(<i0Hdzt5`IRDz0sVf=n>ls*`Odi_Ij}BETd|{QE8LRO{#;HExTFb?ba*J=<iuN8# z5=~>;vFPI2@Zw#6UwNv!o)7<{rak|)*u9w!GTXJ-CkJi_DP`TAU=Szj*;;5UlUDxW zO2VF32X`)SV}7$+oA-LGO}9|qgbmL#Huz2Z70_|vg#XKxS37njMYXdX*mFJfcF5an zy=E(Fg!AWd=bn0Mdf3)5-dsAdXi=7%wW4?IH~m*vTxV%-mM~iM&FP+H#l%XTV6_nD z@Qatv`0T9Z5Itj8*pTv4rd?;Z=k;|HCMuPzy{+=Fa+gM5`lqE)CcIqXZ<zPqU@P8G zpfi#G;EC>{M~jjjEEdjNHO>3H%EW!;p5YpGB8xBfdH>Ea&UmA>)#geU*SqR}IlU8d zSG>vd_+>ApUBu&b@$3a{bDw1jF(G9Z=BpO&ZtL;db7+qJk)5$oTTg6ndp)zI=OU-d z`X}=z<hsc^^&0*X4Um$n+kE->@k-T6JlnH){EBOsc&3)tuzi+#$!6o{(KPWIdw@vB zhXXekZdm<Rv}byI$LBEHCtYV*c^aLk+MN7wN6}?Y`x73y+Y6Ns76&WZi+T9(@M3;B z>zwu%!3P_!wApMsXk>kIZehyNj+XS+$dc<>nX*c6za6<N{CnGuEZOx+nyU<63G_L+ ztya16XoK*vt+5RTb^DWhrHoezESTfpm^AOIqLfyFbjUH?y!{K5mA1YKy<zWlB))6c zw?}*$sr{W=!gX7IyG#&>Y|MQc*WBD^kX4%1er4(^>B+w9Ufv9Fc(U~H)Ygb)JEg)u zi9VXRSfMg`##_f(pO#cBRC00}Zi(>T?(pf9fO25MgIOmXRabU*2G5E#jXmzTVOicu z-m5LPEqYEL_kAiX(oztUnrHrTlKF>8(<>%^(oIi%{rPB2A@dLEiqN>&CH*J3o}Rr@ zF1c3m*5t{~-%U>(Vbx52&A3U%P&lekOTy*0cl-jEoUdFHKHHlVCU5xAp^&`h-n_g- zH^nD`+csa_yD{P+%Q2I+Q|#tE*jjnAQaAbI|JC;{+Fb8DR(5z!@?kd15XE)ZRofKf z9GmYb*^B=<y~T9Pp_asn52iSjSw^|4N3IbuF8RJk{YZ81udl~kuPq6fyFo-qceYH- z&YnXDPn3!OzP5EwUfgV#!lbBU+9jQf{k#;s5`0>wOPTHMzRN0AoN3U!`TUQn(#f9b zezW}c#jLpM#B+lGXPL>eVwY_OvP)*kba9z<E)&WPmDxQfNG<V^{F<l#l`TD&h%4^# zb~`6~o8jDpSKTL<{q)**#p0y2^P=-p`!1B65&bl~Sn<o}4HtwC9R9%&bfGg{uGq<K z+4_^^hyEN{z*u~2PKK*`*p=0D++SN)JvA}1VGqCMuKMSL%Z2YYTGP^kkKEq4FP z1Gk~)ku{!H_U7mF9~kX8&&zbnq`Jgxab;{1_xcGZ)Xr8eC~V8LiYvZ&&Z6LDRrk`# z)7s@^G7dkTCjH&{-GYEF5qCS!`A06cytFvuYx?1V%G>feD$9H(RSVvH`JEwYOWg7k zW#&4qZq_P%3_I=4YgL|ksx|q@i!+Z8sm!db{B-HIa;k+4YtJ#^eEqe&S$0M%Dw6{a zzcG9Aw`y64utfJ4C(Glv)_?wKWLDYAX?f{GK<Tp3n-Wvo{5kugbB{VRKUQrBG!OXo zFL-+Hr?i^5W8H#Zp1PeZUp9McqD@{$&93T?CwtcvHNTp;nqy}4i#x5e^uIMa)ir&c z6xVzp%sTL9pmHXMm*t^Pz5$ze?)soqvsbm~*_oa*syXIzXPYLqCn*VjpPcRbcar(% zR^9&4^uu{=i>x2Utk;=+zH83DlqWpP=5zN)<~eWg`1+zCweWk^3yv2zwdXOMlCSmK zB;?O<Pd{L?$g@8oM}j&W`2s~eTS{fEv<!t#bp_q=O0zR>nsMJ|yQ%s6PcgyX$!V76 zQw<L<wLIdZE_Bq4|B%Ct9A8H>k=L6xgdI!kYCL$O;{Ks`TrMjd8lF$y@4aSW=GIS# z(?jkq`J%Rm<@*g)TbZ7?=os^3+@XOJt|m7gtG#gYLi0?)?Q0k4Zt(i)zWLC}xYFF? zi|wW)h)+2FG+ed#!|DtX<<P*O2NA31u&G};Gx^`0*5~#;VRqA1oxK+5e`d{UbUN+f zp&UFpK6}^uC#_-|F5H~qF?ETcdlR?Ju04)SZ2Byx6|_Hk9dd0BTOC#sR5hU|#@$us z;G)z;+Ya+szvncG=BvGO%beqEMBr}Is3RJS6Hk4=@pO+2&t$t3#+!fHEDTzELR$LQ zuU%$)4y?1CcV&lyifyA;c>D&lQ{GO>8tUeuv-(54vbS8zHA&l`q<Dq<Dy!qeRm^fT zYFC~5@?uYqo6*#uNTsFUg_Hx;n5S;C|E(5y?%jpmdb^&)C-(R>Yw~Zo?Vvbc<Id!L z`BRv69z1^VeFlH@^rBduE4Lr-x@o&HCDWAal*B~o6&*Rh#2a>9m>T9%#k19N`2<hB zb61~p-bt=V@V~uKZOQU71J9T8_A@WA`$~#et~mdEqTPJ;+#*|}yp}sLXHQPfn;@RC zN$u6s%99E~tx|_YmMO|gXX?LHeLQuO=d4G4?33E6H+S!Nl-B&uN7BguQcO*#^2vDn z!xKaDnKPMhnjSmHR&^mo&-zaHis$Q=ma4m6cGL?nkUhXFqIs=a)BH(O(<HGJ!J@NA z1S}6}o-N^9T#ykwOLN{en}>gPOcFMA+RiTZ<ORo#D^AYZs+Z#>cb-1{Yw0fWOd}?h zFHavd9p9s?%+g<^mzc>cY&G>osIqeThU9eyTHLu+y}DbwJ_jxFbMu<9a);R+iS{SF ztEOL@ksA4|N%Y>5j2Yrai!|&Pu$vU@zOE8hlPkA8pn&&^uqdD3tpmMjN?lHe{q;X+ zsW~Na{+QXj-kv$RBf#=<%L(op-}fBaldcG;^v>GBWVzgTX|(tQK79qF>t8)hojB&& zx~OHg{OwYER#@fIc}|I6Y~f3$SF39|KdpMn+GgzV_JUXW`gV;Ae_ky#$=vl?c;3~^ zyUuNulAppI)W+Rg@c2@jznTAz*rsbOrYGkv;mEI;>aA*{ceCAR(|V!FZ>;$y=NQjS zvC`vX=GE(r3ACS~URt_h{_@HD_I)(*PvD-?ti0~u-Yr*Dla;+Ye3c(Aw^a_>)?NM5 zKT9ru$JLsIABPy+D|I~jc1(X3a^9)nKxG5>vdL24OIl_~6(k#fI)13Rc16RToejbA zh41%xKHj{?C$Dd(rOd3RpsBB?heWL`YMVdfqr>0GeTK~PyyDHG%S)V0;+Gzt$szTv zq1v$2BmJJY_uBy3UWwKs#yeA`%XI|z-CzDb@2s}NO8aA;yfb=I>n<5xSiVjDrGl1j z>$W9crU%(m|9I`<xOD86_i@uxM=j<|Nr`#u9e=cwD|$^p{nlE$<11WNB&^#bm{RlB zd;PJxm`CPke%6-cy_vkoYRS_%_xpce^eJNcu_E*BabZ#6ht^t!8!P4Je!gtoTXVE~ zb@8t*?PmGwdygbIFL^hqWI?O$Lp6l}BV8W5tjga@p1$?g&A(rG=FG*^qwc=>^G)_H zJa+TbBN1nl&rIFXw~D@owJATj+2kd$?rY>sp)i(NtIH$jY>{DiS|B<5xQTkCv&nwN ztO-$`O!^vM!~?G^t%!FOT=o8m>xz9R_Bv*C+g_7hck0aZ)f>0+b9=VVb8_Eack<hE z&Fgyt-)NUS`TE;cwlZ*I@|slrkaY)Lw}$(K7~bMtxN7sEonG+~*CdNiI4w$BvW?4K zB`v!5n48E6f2Fq)g~xZko4WX8*1E3aXS|;$<W6K(RBpMjzCizlPKiRwB0HZc3m-4M z;P?FMiPS$Iqo$nJ+Pi!8WZrX3OGUGTc)wK2i3nP~`6Bx+-8^9OiSnASK_bhhCKb3Z zR9N%6R$Wo}W6<+W9H~<8PdV4x`dvHDAI=<{FVN+`_%zeuX4j|1QBMwO96fP3d9fnv zO^-FfOAYuHYuzQf)-SErzR#KA?jIiV=*#sNb|<n|E$8mJt#f}Od%b3D!KZ}>7i#{D zI=3P&{1BJCfL!~kp1BfiGRxN=3zWS3JgiP-)|L5Ax(`2vzc^)D(y`)X@(QM@{Zpp$ zPj{_K5S3cG*Uwg}Y0KLEmw5SOdHO$Ynzyj6imBHmB-A~B^Mp%&drqoNel2jbvRhU) z(bLdM)KuX@bm<(u)`%sA31Y7Tm#UvRzNc5>_pbQGoFSE0;=iw{xGWIJE>M2Jx8OiU zkQC!S>uqig{@c>`nS_3ht#onOn#goV?LzRzeKnES%3sdRo*u#!Qs%4f@VarCNP^b; zk8B@aXMcR^enQPhLvg9n(YU)yHWq2@Wyo1m6LrZqGj^GDro8Wt8uP%$<;g;K{4E{| ziCixaUL1Gn@=J$Pol<W#^A%3LUXi`)R;Uz*z+ve}nOeLnJLb;&_G*qpp<PSTq>K+` zv%en?u=;R!OMuI(gR-;5uj}1e8fF{SHEFq4`1kg8%a1rYGX5_O+Q`3kiNfuUt8=Do zymD)`lhFP>;mduyD>t6AYsmkwDbc!ilKI>9#kK0`5@KtApTGA%a0ZLi*}g+shuX?! zrKtBViDUk6aq;Gon}(ml{!BgdZ_>%0`JA7A?~>VY@XoB7^S@&Jzh_<edYpStpwd%M z({91^<^wjBEdQC9m3kRcXHVch`86mj)QfGl^7oZ?yMBJR-R~rHQm3|=x%um)2isR& zTz1Z*Iq6%{5iOIC{u7+eKD(1WJxZyym8D~yK=gy;OWMbuSjaF)$%(IyJS31%pgCVM z@=oEFg6r%|Eb9&QwU698ocZnK*Sp?*x*IPV^X;qofAD+I<+G;@>{^$I1oSyPQ}}pG zxzzI1+LPI<elG6L4)}fJ(Ji*REy`BX@<(|NSXh7ev=!}Za(j5ZK)`61&FAoczo(z6 z*S>h|#cG>?8>=Ip`nSFDn{e#ku2cX0mu#9GQ>#_@pdd1N^Wlxx=Ly70W&4+iMk>q3 zG?Z#(Y3n|yJSx~-5N{B*<kD92q@xcd=9P1-JQ&d46cQ7zGDj;$<T`h7=YsT$lYZPy z)(AY>G~wssd!1IyOt+aIrbreP%`5JF>=*oBM&0Ac-V~dYOu~ifv;N%gJU)5f`MOy3 zxlc61{o;Znb}wCB?#7?+ZQ}I#mR1x0_9fSw{j1|`$b3}2FgNti_2WiwHy+i0(!O6y zGvXQ7+}T`Oxq918HrK42`9F7t{J*m^QzHA0a^G0?Y0az0=M(yZ*q+QkP*)$EJ5BoX zgP3>BN5Agf$z+qSw{P~WXmS08L9Zeu>rdD5x1U<EZqv5I?<-!NUNx`p-JLe4*0L`? zB7gH{q)aR9x+b1+S@Oc(V4c^m*PLJbJR&Sv*8A|GD8sYQb3U?X?mtkMz4qdNTa%qd zHPtU)Hab6_Zd~g8*4@kd_3G^XvsP-FUJIXUe0AxnU(BB)g603|d4Jj0yj8gJ)#+)x zGPA;}3T7;A{4?RjTb*T7ERA+-HrP4G(r82Vt>4A(f9rV%@M^XhwJ+Q=DZc)}ZDE7h zkDa-H+s|vxF`Hw_v}LhT?(6z>F*ZBa{@;G}X#D;Om38qSJy)<F<N0)7;nU`hRgYNT z{D1W*?OT29#@@g3+Bxk@41IptP5hGZePi<RwqN~I)(PqsL>9cYwLbmVovr^WpI+L; zO}XMHw~6j6F-T48+PI?V_r!zl+3e@j3~!f<&6ktB^k{xka$KIB(T{?+59Is1el)L+ zbaDxc&8%3lolQtCjkA68Wrp0tH>*At+x?FWP~P`px!0d7ofdwXhlP)__e<S~WxuiL z;t3hK8<B^j;?K#*?ccx`RlTF+?xM^+H<wnL9{&7ljaA>XPjhx1oV)e5eagddQR(iT zI;A&t^=DiC$XGc4;Rd%QsjhlDseFciLZ)xN+OaITe_ESlm)?f$VbgE(Z&dOsUFsV; zN$kPwiHG0cIDVkJtT8lH<Nob)w@<rI-@43ZeVh5Zsix~1%{P8nvN`xz`s&lstC#V| zSM$s&DE<3j;~~FkRSDM*1^r%FC@ith)q2@A`5y+WA3tzwd%~{p^2B)#(Zi}?HJ=xL z@#T)Zxz$>(HSI1(!LFYlj(wlr-M-x3$Y}AG=;y4}`I+oj>_bd<ZebSU*%wd|{_-gE z_DzZ@7E*t>p6Yxqc{+Q+*~{fi>o*lX|1v-1MC_fT&v;&cy4tgfQChk9^wC!jdF1y7 zIhyP}BXG*#3&-NB-4!SF<Tk!<40=;tVQcey=^EbWAI(H+*Zh==``r98>FY7;W#X&d z_r=9sIN?2;qxJ3~uH>J7hqJDxNbQ;x9Q)ZqY2`vzZg1|a2^-qV7*<Z%Wa_+!d8zE$ zKlLjLXS5&K-^?$g>NGFx-Fm(F*x<MVF`p^oT<O#K<Sice=WvNGNUnL|p5$`o2FJAW z$enwa-HAEAD|}vXu%4f;=<56b_cgzt#=4zXCaQ43kM`u_61z^#ob^d2?9W~vivneC z?bL6Z_stDD_eTE4-bZ@_9%z5}Wo!BO@8|8)Z@*8QHrI5@&G=I_!Y4#d6li{Fym;K~ z+Js95l11YB^1Ie7yRvU{iD`DKZ)TEZby%k3*9*RTzQ6t6f3-T}sLH*ryK6+lr`;}} ze(O84{0~Kw#BAP@9M95~wfYR7SF!Phc>Y?``pdXFVbfjZWhRTS^7Ex1jhT1gqy2~E z2lh8tIy0LWKj2wA{X$Ti|ATi+S$mzCW$f4Re_qDRTf-G)vVPw6N-=($`U*L}1HTh% zZp!dgu*x@wDWuJ7wu(3%cEdq$>+S#ICMuhyf4o2VS>c_O#L?=7*UC4juzTm!v>E+o zx%%nYpI%;`RQcESYMYl&sa$bq-}JQ-M&EKe&f1t19GF-8Wq#tTQ2A!HdSNk9v2&*r znU6(%&{5F;Y#~4AP~_p6f9G7NJN8Oje;uRVuR=Dt7|xrK`&Rub`uzCZ;+(KKA5U#e zetE{ZwVW@!@Yze7GtF<q6&^m0V%<>Cf9KSqZF_qD3OzjAb=>LXO)Z)JqTi2~n)9YF z?+QG4(4vA_IXAt{`tatyJ$3(2rC+VTzU#mvqsu?ceYWHY&bj=nX69eHSqg{d&pGgP z#mD}~-}V0Nldb=4u!pl=|H%E7KYrh-&`IA@diu87s!#7z?!Vt~<@?$<w=eDc&-t0R z&-`{N@9(&kwef8)&&lfF`g~dI<KLHBANMx@t-H5vS<bQdVm<ps_Rp7U|9j}Ze~<7( z*FSc=``>qVzBl{xcH7bSHGgdR>sNpL9(m-o|Htoqf8HLu@Ak)*y?+0ZPj?Uf+jrvM zzEl75lI!EQwd$~bdL#Sh{rwyF_ixyL`{w=d8~68b+8^zBEvbHWuA=2KlO59!W(%wg zH>?mlbX#H%@56qBA0fVO^A;ZLEnChOpXsYqvA0z2_g@|F=>E)ojGyM0wz9hHnS6M) z&VqOH1r?@idaj+X*qgmpxo6e<X9c$F-||OQs~s2lW5zpg;Xz5>cUK?0Hu=HF+h#cB z!)?<aLA-faALQ}AyZ+#O#s^ucn*D6=6F<mg%eL1qYPDZ_u>L{jx(6SYXf=cv|M;TS zX#L~68r%D1gEJG&jU{&QoD*NodieYbp=9;L=@|u!?=C;+`nslxTP(-(K4)suteK$( zZs8v{MxS_SBftA}#qD*Eep+qhoy4|)*Z9VJshq<+Yk7@Vtjo{(P#fm(;r-g9Ec;V* zFJ6lA`@nqdD$DzAzqanVy>*ZEmM`*(KN7F8bH3mBPUXk)Yqc!)xwZ};K41IJVVCrm z{h<A(I^Pc+rOR|5rt40BpuU!^>3gKNL=ErpwJ(0FTk^esQoT2NbpzYGM_=mGr!H#0 zEA?jy+k4sd58^XFNULk?@NKR({Sn3cZx36&b94QggYKq3CUtVnTYPY>%)Z-JXKw9x z;=aG;;P&hf>pGj}G4kJ^%TZC$(*A$K@}H{h^N*P{JpVsSBSY@PpL)SM{omFGffw!_ z?RYN6V{Z|7;a;_2O&go}E%94i`%b)5`5{y-dvM)d?+xkkz8muMRV@<vh30Ir_bE8_ zPvT(XU(KfUTl3X-9NgFYAoAOOL7UtAx(}{**uP=!@^I!ly$y+-Hq#G_-*hnc+j@Y1 zN#SZ%zjx{Naa#`+FJ^mgvLn3NT0PUox7mK-!Sc)x%~CcWMOf!AJSd+1VYf-eMz-}= z9_UKNTze30^23hz-$u6Erc(CT9~7Hf1S-E+!n{9PApE41qx$#kk|O)wqg%H%t>4_v zx$oXT#)H;x;st7&_s)O7e^Z&|e#U;64_?(VK8IGn&1$-SV=K%0&9P19w>+E7Z)P@` z-!A6-=e~R51OHpo1^=A?#?@q>vR>s!*zU;>{BPc6slWBFTK8|mw7LlozJ6=xyq8cv z=fUbX=LKRm*e_pt^W=lD1NM(LZ)dwUG1u%vSN0Ey*mUOm+SeI!`3rn%H@RIfTe5#< zd-u)KZnI_aM@<@Tum5PG{c}%6!(rK)eQzGVtUrF)zVjvH|NScjKeK-L=H0?*|9i_W zHv`)T&jpq-&aqj%v{LXggJ0aGTLHGNTOWSW)H*wRSw~Tu<exNNJLl&6My?lLX-fGw zf7tFPxW%ex$J~Vnd%r1fYpT!rKjne?+j!wW-oGQ8-fydS|4{qQo2CBrw&R{Z>Tgfx zyq7uO>qGgQ%bfd8+vU&Ex-7Z;luvJPYTT-+J10E&`%S57{<hm3b=Tq?KNNqHYO2r9 zSNl=<TdJx5hP=v;@^1<U^>3v%{ZFW$@*w=pY|gr4|JH=Pf6Jo3;l0w0uG;wzBHp;O znBV;0{=oH{K1bfh|J@Icelup-e(SvOAGzPDO}F0^h6=@HT^G8O*L<g3@d9(-`x?LS z`_D_ZR&bqJ{Qtq{7kg#yCCev$V7K_gES<8=H@M+n{fXz-zuLTy^9z-Cp4DPxf9~-9 zV=upPOYm*^=(@yHVsUiEtot8K?jJBQa4S!eI&jsza+cb>H1lPQe`@$IABcPF$Sdb& zRX^YDxxhbxOP256TFkvJ?3b0ywXQqX=|iUB^am?9Hasvto+kKb+Krl~^F6wXKi=GU z%JYx)_-2j&seOlolN%0uE@$HN?`Gt?U!wKp;}wYq|7DkV**X0xpVwv6a<IO5)r;wO zg1098__@5RZtay{TPNN6&^M!L`Efgk53Cz|qkgEdnLGTPvF~q4#`B$f=B~E<^G)K! z^Sv^5`fSy!`HObgv9Yr|@A>=u)6IX9eEV(L<hK|8*dxJn)K+F)`{$I`)i<VZ-n#Eg z_S^T%x1}a?#Yz0;IJkD>Y>qnrH{2}uMScq%G(Y|?^kV&+*IoaT|NDJN-S}Q0=k{+- zx%~fa4>-RWv-oeR_x_;r+qFskcJMLpA0oedS>~tB_x&LK<}>F$n=-+J_2R{xagwt= z3zW=eKS<H>{$PLPn!ulnH>#TK#k2+fe7qsnWG^VK@MGDHcFuj4Wy%Ma-!>QgBlbI< zqi*%z(x&rU_Pc(#`K_5{|Ji?x2QR-l&arO$e~%AcH<oY;@g=1T&*_VG`miQ~`JnAa zvnKA1--T^Nc29ed`Ay*9?Bw~X72a=Fv(#&R^KCl4k)3m&+PC>E-;dY1eqc{-=iF!Z zt-5J__uq*R8Y8Z{aOU^>DpeSS9e=?7(?+OdcmMf`Zg&0u<lBvF<Yb=~*E{Ce&;C6* zn=wve_w<AL>z?lE``q~1;?9ZZ-O<_=OjBNd{IYHD<fZeEKb*05_CehlY#9}WYad8E zB(JscEq|jpElqV9<E~c^9)7%GC$?|iVZR*x6Mj*%>U7v&<gR9`56C|3zQwGD>ob#X zt<>eiJL=uC56jMA%Xpw2CH?O5tq&8XJxkPKfAR3Q&Dqe6$0KL`fAYcI@?CxN%SJyp z1KSJ76nX31vOjA_&0hW5CC<ZmrQZ_vs97<~Z~Y1LVSbo?ZKYYviq`lL_QzW%em*cW zs)BhMXZpm=CKcP*_Io$$uNB_&@w0~Y)`TB(tSr)n4L)3sTGD=5vc~VKS>5_yhTM;i z9NHe!ENxmboh^RN!Q&<si`nd#AH1IZ!QbS^X{kS3*zT`9_}b(Lw-nE}{7-Yg9o;)u zS}f<~tF1*lW5SI*&M`R8z8AXl(5^>q+UYSHJ^gnt*_>Q@d)K_0#6UF}p0Xzo4YaRs zP4q2yUpRR`<AUScVmU?EX+F7DzV3M*>z5PP=Gk#8g?-IiCd9!IpOU8+BRpe&P-S>& zN%{9Ri)3c<uGZvA-qKc5HgCi4uagZ|G2LzT4rooBnz}Z2>#3(@TCsQMu1<e&`QD-H z7fbG0cyz2a-nT<&^``YtS7}^cyUyu()k0s@w_bv3zau^}B)8QU?Qh>>RCKa=+NsNH zdu?M^S6}a7Kig6$rRLboUGrgKWXSnYn~F_GN>=Y+jO8uy41V!)^XEUy74Hdr5BjqH zpq5v5W@7V1rg%*y1>H|emYc`Cv8p@8zh{ZOiGW6pNXM;{EC(OnTR!Qior$Q+XXZxz z4s~JPcN?5Eq)tx1XcfB2<;7oZqX%OCapziFEWe)Fm26k|Y{7dK_WQe1LNhx*+M2wa zd(x3LK)rXpcv%aV_^p*+Zp~@de{u2j$Ht$#X4L54n5_5Rkzf3nkS4d*L;jXi;>?eW z3QU``;x{X+v-324`!VH;{Su?Cp6#-$!=GFKW>MYsa8qdJ>T9Lzb{TD7CmdJ2O^fx@ zC1!&oZJsB;ZoYcjTFI-#dEdp3^Xs~vuuiPm=CMHOO7!eIvrPT?El!6ozIyn|q=c&K zUnva>!~;H^D*r0xV!dN(&_t~VyB>Hr@0D#W{bExPWV`(Muj9>3Pp|CQy_|pkli>3| zC*9|m|7ZRht!KYCM9r6pD=lAp{CLCP6SrSonkgQhbALlwR7z8mXlUFYw`D6XYPv`( zA6f)jgVk|PWa(Ufp=oB{oqoFJ{^(HOyFv3Tb8T)<k+1Emmwq)ngKf{L&wcSy@)`55 zE$V+i_*(VKYhG7h_w479R=eGuF3k>oM>sP+K0o??g$~Ex)-KKE_iBUA|6F@GP^~vV z;K#FbnKtKmZQspSlgN#+c`_%C^%|#J$87EwJuGkA9k;IAUCbOcbGH7cip-NqXF2b- zu6K=|C}6oYa>0h4gf%JL=Uf&p;Z0rGx%`Tkc;2yp>sFg{_a9o^x@5z8WoGBEJ`<;f z8LKc`8<|gi^IG%S$Aww$em;TLY?T)^mDHY#P3^nNBz!SlS$&VCgT(Bkobt8J-^I8u zMd(g!S~<n*m0XF!ozFJ&q>?5GItZRz@_5IymM_6J5mS7Fg`9(TEXz6hRr6m<U(a8K zC+iL$7f<k9dPzmbex9GlEy0hMIQh9Jh(7tn;`C7PgiDe0bG3^9v&}vBDc;(+aq((t z=E*_}@2Ik|shwbGO@Hs0GBH{)kbzD6om$s{2Q5_%1-191wrrlp)5q)O_<~z|eR*_- z=Ci(yEX}u-uICgaw(_i7zWuS*!RDB%RdV;vD*c{mVjFmWqm(R%L-vQnstO+c{Tqw7 z@*FFFxzt}O#XDh2d`Mo%qh~u#eBW^L=<+X_-tV2fw{Ly$Bw)?EY?aAQ%eQiB@~Q+# zH5^~KaCelKBi{mL{>^b5X`G3&OzY%3w>I)$-1Eb={Hs{{Dd`&(95MQ$y~*77Up@Nu zb+({y;o9e(UpkakXDz9^J2#^5i{wi`eq-Tp^72(?8`oS^da{de%~JCtQ4=<6JpJcj zv2&*86GvaCEjqo@J9mATwilf1ci`KWq%-{+xmF!8*j=^e!uAb%{xj|f&2ZIkQ}%u- zS{zzEiB;+9ZtXgyJ72HPz1zyS*6`tb4ex7F-8~K6Vqr@iPCnT<A<m`YT*%=QD+Bhm z@pCEmv~<}eE@@fST2pBpfA565M(4Z4ozv<CGP%|nd<quV=4El<y!6Aqr>85W+c~|k zWr4xT*~{FUZ5KuP>AWu0<ql$=R`8dzn_E3TddC5SOE2%Ie9I5{TbD2Lx6b~+mj(Cl z?|quJ@Lqi2e)*F1Yce10KDABj-|t^3r*|C`+aI)FetnXk$NqZhXYKWyvjWy1yYOB< z+FbtA;Yz>K-pF?+Up%W%-E`rsf6J*AOJ>&}7CF5tS)TiTX5{Vr8Lyr-TS@#mc=PFz z8J8Ze{F485%BhbFtgQ=H+zZ*ZztAZB`&@$!yZ`-lIxRQLcuJ*X)~58zrbqhQzwR&a zdpM;!k-_Cw?%)0Ya~>+n8GPc=-aTif+`Pl5W#<*Q{jlV&lbd7Q+xS%}rS-?hg|&zG zgf1zMW9Qm^f8SXlsqfnlyMEsE)cNMsm$9wpO-UJ<VSgL*{h6kETXbwbb<=fEr_L8M zxm_LNbDv5y*WFR9bM=qx{BNMS=%w5x2S1+Fo$p>wU6bd$UF_>z)3Z;GEa94U@=Eu= zSzf#=k}JLL?_<4nE^E&}Gwn;Sbe79pdmdEwv!Lv$%!!CKV!d`1o0mPbd3`|DotO8y z?Skl<XMw?oE5jlVTW(%H<*C%U6-Rc@Uj6KSBVTN|uhco#<(ujZ=e#Wb`)JFuc%4@g zQ31iH-tew;dA~zEWKsE>C;#uqv(LKl{TgRb%e8gvvG313Ub8Ri!uF@TuI6jzu9e)m zO()mwo73riC#p<8ExDln%y)0UVN-LuR(D6m%Y&cP_TQ;Gw$1nQnp=)D!g<%GfBj!u z>33nm+)(QeoG<>}d%wqK-IuwI@xD5y@{(CA^-SfZR?RwLWw`Edz}vf%z0dy6exGOe zDdPXXg_Yk5+M*v%nceS`Zx>@#mH6?)fs376t?lv(m;STdT7La5cg)f+candz@!fd- zF3FPL{@ax$-~P%d7A96Pgnr+fd;3~u*hO9a)lxNEHe^~bZx=ouvZ^t0_m->qH>&FX z{V6iD+i+PgHQllAkn-V3L+4GK8=UQC%uTapxUXE^IV-*@=l)TFgO~bkf~vpU%r;NF zzl0~dE~mk?{=v;x2gS44?;l<zy>sK7uZaiRH(fo%uy|F?UtNpe>zPF#<m~;N;e2iV z-xupHZCdqEXZ~*I;GJf7TTlOKj4jK&8M)w*ZTHk?Z%X7`Pd7CGue&1AbZzR(YofK2 z5Bza@@PN&3`uBe?4qPzZs5Rrn&8MxA&N=@~uKDYxPv1P>%50VCf{VOIPE>~l*FX6A z@xsQZcUYEL?AucM^n`4|<l>wsVRL?-Tde#&aqn6K)=j+&{_V~2Tlu&1)3w&8&vqSb z=g!ygXP7;4-k&dx;>lZYdl$6MyQ%H*zB8zd??r}ww$8>UGxsv@j=p%P<MwZjH(z?i zcfECRm{DDEXoulxft6nE{A>Ow--yZim8kjo^G$=0t+&^ww#MK7U%W$f#a_9R#8Wfp ze-6w!!M64K+@ndSb+x6U!mjb%VJRr9e0%q8|9yk4RS&GoR;C`^`q%%%9P4k6DgTAp z_os53r5Bgg9+A1OZ@et{)=`51Ym4~{*L};I)*$%ba_O|s_ZdGgp0fAF#^r76Hve$x z<KGh!zWcGyxi1zsH!9w#ni%@KbMDd{gAbRM+<L8_T6(XW<@m2{e?{{y7d49u&-(t> zv}e!p>9e!*Hn9JC{pQx|^X$8OIWHI;2>dO~qx<2ZjP(zZ#gZWx(_bDpeXqa$z5dqs zvNP?jRIS;P!#ewCkG#*Lx$9RYAKloq=KoWlSgXz3%YMrwRNWNq34Eig&n-3WXg2$U zM~m-l+Hz%&`rp5QOrQ4OIo8guqsnIf$?-n>>(|>K*emUIo%3bdwd)Mdj$syjEBU7! z^S<etvA~p7E9aiMNoitcWcJQV|4hNz?xEaEBi*WGLbk1+5_@Xa;Ztk(F8|qSx^&hx zBkwb8U*A1Dp1-1#H-$M`Veyf+x8Xf{r~cYccdj*#KRIoB+_FZwc?UW-RO&zWT>9^L z<gMm@xu=zGdI{V~mbas-zkg$Jd)Kz=q!Rb~pZ|QtyvyDiE|}CiU-;>B`NYMgmhx+T zS4UhpvHkST|IgmtIlNfsovod)Q-sq4Ue6sJD;m8{bG5#Cwkwg9>E;qgCnc2_5s#f( zN-QV!9GP}(IGwt?SHU)`|GcH^m0Mo(A3LsEvEsyAMwcT87RKmot5~9%xx%eyT7XV^ z-Ts;1zn{y~i>sRV`S`=iL%%E2>x<|AJiB}M=ev?z%2j8>FWlTQGu%R4Z%tXu<k~9Z zs;8fMg&*DuxgYPgFVZDXV|SxtY-)fJi!YmY<ca_L`dV{-Fnkq0{_X1V5~j%Gtrz~a zF=W_ZD-zuMkoQD{pOB$cTu2mmznRmrWUF-PB2#wxZ>kM<(kq=L!Ue7`T=npq+Qy`o z`7NogIwlu(sK5CgbEr3eN3@EGOOIBK?iG=$P&Y#}n_g#S)>rd;oELMpKUCYmy`Ss! zl)pPpPY>Fw^TylqjpxL3N*gCH=X@IW*mZjM%&Es6v#%bBZ;g<-EcPrZ_Qa~YEk_SL zNk}?WSJ}auy|}}IPsRL4Qf`;-7nKzCV;|W9j(OH+eqU;mw@E(esU!36!0RtxNj=T~ znQrv<){PwkX3i2{THP-2eL6IWW#gi^jXKxYWbI4ja1VTt-BuKxWHqHrR^;v*tB||V z)9$>>{w6!schkG|7RITQBT}tog-*`N;|VZYA-KCe@!{)`t9dnwUKg^qmcQA0?RVQ$ zrLXzxa}sl+_FT#9=|2Aa$+?ZM>Po{azm`mWxFD<LH&5wa*VzAR`)|Ls+1R~BddWIh zuiuw$MBdX6x+UDctG)JKfp6G#Wy4QgQbHSUFInem_-1FtPr2mVoQ1Nw@5*nj`5hgy zr+>$m_P;9(4cGj>{YtJx=EJXw(ygltW*jZ3_lxCUp?!km;a8o~``)n+Z5_=&UXT6r zRiJ)@`_|PzygMdV@l>q(&%L=s)$`6HrMyg^V};rFS4{HWKHSq^zQj=T`VTqZWTXCX z%8oz2cWB@6cx3q_c2{QnlABX9%qAT6x^Z~vrz)Xav!*`$y)a(M|JaAQcP=fFxp=DH zHF?FhleMOOSHH+=N<Gis<M%jM>iv};OODBB%ZO(e%J*J2nYZktze%0f<F``puUUj% z7Pl~&x1g}~n5oqNkjM8k{wzCo+~l7?CD(7EIlIK<mS+kSndn{oanHhA+1S?a-Q|Yw ztqPmkws&4WTU6ZLuG#ii!%^2}{{AH&{g$3!{HGi3@W&|H=}*@(&zncHI^t8aJL8iT zA6>th_UP^#&ca%uQ!78+6=biTP`2P5+m{!MS(BqPzy1w)yjsft`nTu%*L~FNmHuM; z=cCyDRUc!e&R^T%^?1Rt^BI5Ij!l0Y{l5Lr&PRz-&p-da^h2b2+7F)U#vd}(oj;hr zv3;yus=)YfLafR^<!qIG2dp~({Ns8WSXp|lgr)76d1>=E`_8xjoAWOGTmGSVk<OFJ zFXTV%KKYUDWyP+OAKC17FPOdNebCx{0&zEde_1`fzVY3G%ezl*OmAyuJMw7a9`TPF z_oi3y?4SB0&}>45ac1JDpUFDS72Ky)^`2B7aoscJhn}75hw}^mtm4s6vffds|8aKI z@0^R@9=^Y@!|$>8iNyu)KZ@@#zt{VFn)S-P2Pf36xy5fIEGEBI{>Gmf*-c#Lx4A6V z?ao;}GvwJ`srQrT|5ucEus+Ft)4zk?(0g|AjL2Jal+RpxCX+hN?0IZjX7Rn`^#bzg z>oXr#v-BVOdw7#gaKZl%ax(UxC){_t8zcH|;=Sg_>AatATdXr%xoh?+uNA);*S<S2 zJM=Dpz&_)hN9~_2?-2jQ-zop(>k-GgnH9GGr|g*Yzqf+(`4ZNMQ@aJ$KPwloKO}pk zZl3d=w*H=pzjr0hS^Zq}#^jUSC)G}PcV7SOIc;6b-Rw-y8#=3ba`XyCqaEHPPd##a z#?t7OY1tj&8#jd3ePh`;-9B~c;>^&jAH_!)zco!&tM~q3`6mA6v+xc6%OCGa*b!gC zc49&V{~i6PgAavg)}63_cASO(UE)heqpFDFBZ~`JZ}}Ym`?>qdy`mG@hPQN*Hr)S| z_~a<hH<NY2W*72aU;S6S;yT;ey6&|9+^PIuZ>@T>FwS4wPO)P4t@pWhlYIjoo?o%| zwYte$&JWqPPiELS=1yH($oJcJWB1?23YFg-6<o$1?1sIOyCzjf#y@(QWAKq@nrF<x zqR!_VHy-&MsrZq}th<6I+QX(VRFFS`KfCa6)E(X<Ki?Q8@mB|VKc7C0ttIl;#H5<C z$u^C9*B!O>u<4$wIPa{U;Q7SfsJ(WI`{u@~ZhO3W-V^Hx`$vj70v`j+rc_8U%N|MJ z@jUWdApf21b6WSUurK2KwMbrS8rx^T!&388Pv~8#IOk^9`j9{IPRtXj-1Yeql`PFW zKdjHXum9w?$gTTbX8X-_YOlRM#r7*{`z?N++K+8%|NAyImRYRIIpwnV-qjy76pt4; zNFNsXH&5|+!OX15iBjD1D?SRDO|H;=HA8iM@^@kV)Tu|Vo^k)PVOeKI%i7DADqXqn z`^Fr0xc)(1W3!gC`kncEBz`Yd{}lAcPFwW5ari>Fh<AzK9+lgaEB)T^UTwwSGXc+p zwuVcdidnTZc;V8`0p96Lr}?e*Vt@5xh1c^L4}7!Ee=bVf`qpr*ZGYfiyUROf&Q<)! zRC;F8{uFuP?HlZc<I|`0CG+l2+^X2GJlCl~U4Xq(sBp%2rFUoYmG7O<?RD#TUcT*; z%<`p?tCm_udKXK5EH!Jl=(Trv^MGG4y<q-Q_J^lCUHOi*))*HG-gk>RbN|w*`bj&q z_q)lQf9&!2LhpBlcjxkz{GKp(Ru@?p>d*765!P3Dcf7kZ|KZak+dr<H)wj5*LSeqQ zO^3ePywm1F;RW8W4ZH2VZD!|Re^c*m(;U64pY@OJqt-t%9~Zw#ex$pmv10WfCGnq@ z(|rHfyt<;ApFX)${*mYr@1M*^;^KV&7_3*+d#3oP=wI+7%|Dfooc@Uwa^ClkIdwks zWz3ZvJ>m3^5mj+Th0PYzzpKd|{4KcqC&Qz_JAN_eWRJMo#B<Mg+B5OITHPF5hdbTt zmEIjU7vg{7FChN;ZIgMkd_eJ^@Xil^K6Bc=-q-X;)9$sLOWvXT-+##dnxp;0=aXTP zvEAgFc^ZHJM;@G8)%5?T&~8J?pTb`nnXA0wSt@zobiNkcx4d8xue<*HV;{ao97{^& zFRpj;f4Mv1-Sh>21-8s@`{w+!a^g9gRQ}@1eVf`V%jZuE-#YEOR4Tt&_Eg)RpA5II z8(lc@hv%)lYyEGYwtT1h-;27qlYiKU#z?eVZ`t(r+Nm;+n}=^$uX(fZeP2f9+^e5< zEqVHNXQY1O{WXuA{?{$My1IB$sJ^mi=JXcdq)A)a_r05$GWG2<mDM@+0pAjgBW@lx z-XHtedeW1s#8-*x8SlB<H036#%vW6doqO_*qp5#%A7#H`_-KEl`bdwtQ1LyVIS1AY ztAD<+PHlNX^A7v>{x#hD=UPl%F3kVH^$7FNibwB1b{@I^Jh-!b6W62ZH=Q2E=IDOR zeq;D(<)6Z}Jkg!iAD(yIPdqOypR6yuUw{80*LBJ5o&KAx9({hJ{K$UO`3`-9=shQ= zM>y>fHSe^T`CU=&7`u@F)3Qg&I&**ApE<iid$z}(-m?mIZMq6|(?YrC@jiC>TJ0<J zqgSXVU(`wO==ZRG<@;w3&bMi|nRs}+rgdS>w1?HJZBM9Lg!L;<fAo9h=BzbNzn)K8 za=!8T4R6m&&kyWROJz=e!_8AKc-UI?bis?uH&QIOE!=OFEi*l5>C8zvOD!Faw%W;d zJbb^v-#hr>h2?xx`MyjS&ONv2Y{rw~8Gb7_wb$*5zUeIQ8^Tj-=&5~JXDv^6Xv~Yn zUTb+)Z~1UlOZLTXcag((s{4;+PkI_-x6U@)`Nyr4mF3KB>;Lh5-6vXC|7DwB-JR7_ z79D!HdDDCCw)39PG}!K+6FvNVe(0G?b88oT<d%}ZY_Z_uY^nTfKb}kFUzRY}vD>jo zs{BBh&eT=LwjAXL+*=OZ47*sg<KuUq%y?dL!JV77KGAi$lD6u`k<!4YMv?-mt=i0~ zlf?oxr~G@bn!PCO@Y7{`@|7Zl%hs0IUQAq8;XC=O%bb%>dxTa_Wa@1Z^b-GQdWmOg z=;<yo)`=l&x2kApI|)vaRpmI<d5QVy7G3tDT4mD-tEWnwc$lHf#?%?5Z7ASzC2D2k zrs(d*O^dfW+?+OPZSKj=TXyq4_qI4F?6}<G&^PCrlS2DyX4MH(mRxu#wd~xvnb-OR zR@knbYx90pu3|uSm-SMP%Pc*!uC3de!qHN`Eak++yW3JuER^z(v6h?utTAJm%CVJZ zcP7s{d#m7n)KiWqbKj>PygrLK)2p_exj1QUrjdJk*_1OEuXI|*=AM+9yGeF#nzdD^ z^|Iw#6^l!>zIJI=7p)4`z9gG_T4rw0$p>dHsw949&)zRTZ=Tr7VxRH|HkD0A?W`wu zr_H>zc8egN$f=Yq+M6!5#L0H8S#rH$<zjBFo7=7W1Ako-otk8LkXdxGnChM7eY-z8 zu2ejK$N2rURo0g#o>cz2!SVR|74ur$mi_aY_25;)J~s7vQ%-6m{YkN&erNq0nH9&U zou52yse}gmm8PSjpS7OWy*DX#Is5Hwd+d1$4Sw@x<HL$uivHECXxL<SeuudJ1-+uz zEae>YK0nwK>3#KH@t0^L$x6BPnR>P2b0+1@`#Eo-pV$1GNgTRsB9@$!K49dvmjA|V zXZg2F@1$?c4|Fl|de`hUyYiW5M%jd}z=D=azGqz4Z=cVo?0Vp{lJW3^-=V#iOlu>T zY`oH-8)=pQuj%O$W$(j0t7|@=J)o0u)8zD}EawZ_>9Y^5wB+`E{bmaf*XjWE^Ub+s zRntV*sZW|aHF@uZw5}^fmmDsrG<jCCFTc6m`c_1(Opp-!K4$i*Gd5VXyqg&m_-pYV z&v{**sg=T~i!QghvGnPl{QktM%}u&*ul99G$rqZMCw%3tnqDpr3b)#&bnezU1ySRb zf?t2m&$MdjXqKL9GB<iBi@?*B$;!8iIG3zE6QFK8)6Vd)O|OA_@Y|V}!X~}UbUp2L zy(_G5{{n@xR{|Rr%?cH`aVxvgDtAi+TY;mH`GknHv|SOCBEA%_eHjvTcHSk8OBY|X zXKnvveJ!|T$*LFDcAncNhDb-L+%!sxaq)0*Yzd$Gu*6cCEo+LC$>OaJR~%n2I1$Au z`0>RO4t37ei<E7xy@MN@ECO{No%0aXSRs7bcuvu>ETs!NJku^;5o%1zsFIRhC^2!l zrfP`Z+$k-$A{0-iyL~zNu1LhKW17swUn_h5?=9sz|0lP4=B6tlk{6rZ_ohvIYTY+; z#Ygpfsavb++gyv?`WK#9H1X0&$-61bE}RZZStU7l<}!YlOQl}jFQ$bxYug$dt>%mC zsA|^gH<|Za_E}i8ZQ3%o^sA@WX@;sUObwKaOz!_yFmd^mw6vM)%#sfFe>(Q+xVq7% zHy8T@c3m;lb#k3H^IlcV=8WbrU)Aspzo&(TZQj;geD!>yOPJNE%P;pbYVTb7zvXbm z^H6uT4fSSKPg+(TF`PY9&USuD;gXCKUh}s%)m>s;vvyj`?iK6;VqfPRI-@SQStRgW zZ2hsOyh-X3Cl6mz-Yx&DCGJY`3k|_E)8<X@7I5A^{~%iRQeft-(+{k7FUvTuq8?qf zMcL@+`VU?q|Dzs-R|I}{nfUJLm4lB;I%Jpy=P%eY&r()0dR0=UOr?GeOP$+CS>eO= zvag(sZ(nS+x@0t0GDv*alB{X@mF&9$?kt|7_5QU*_UHRMoQ|DJdUEwj>#FtQ`zPv^ zT+NV_-&D2B<KMUHC3+=(PakQmpXOE<7dcP#zW$?pk%|7j6Qu(F*ZR~hUi$p@$D4uM zHultNT$=H&vqxNbrdx>RqE|r&Zlo4!{+_7g9{qox-{Y#tC5*d&x{JFW`)ww5y~$~1 zVXc-{?>3Wl;o?SR;Y`We`3BQADhECOb(rNR`+db7N9sM_Ug7-rHsZ#&*UKD=YW_}@ z4pP{uWw^yk)W5XR*fxmo`Tf3GEGrFN=BnLk+Q;~cq39Afs{-RI>9)<0HI@(aW!_(x zSik>D03V0=7t^mRjkz37T@QELFJWOZ?_7$ehfU0c4=?Ba|IuuvcVx=!Q(Kn4GLfmU z;}_azD|4gIz(S@%FfqeogRr8nx0wHljW_*Uynna3t6xi7QyRPSm1LiwYu8hEC&R|S z8`oXFI{%!?!7Qn)bv?b)6;>BrxY?uOYhpIH)$1*He;@Dk<sbe&Y|mMzee9QAl3SZ4 zM}C*^+ut$A1E;5pyyLDs*FNjp)#F$8&0$kcJUd@<&f21-zw|3S{IgCJJ7%rVS+PKO zKf|q+6WCdoAKfP4uGoED{97!K<%HVFhmStLzBf6i<?NLUoyv#jeg2bmVzPu@2d}vL zo8KC2PU_!TdDC-hB220(y)=%B^}P-e=vF@>qCTr>uKm-+uiC|rOfvdtnvoj3v}5m7 zQN8W0$8UTnS@oz}BJ|7cvJS3Ie$jtF|95z}%tn;$^nSrOk)`z~t_3u?U%qi@=cg$% zlcFv3&E90q5LuY8sg*lu;ZwJDyC3e2HEmzfE3zxDWm4Gl<_vui_1TNLJw1~*J`M9a z8JTaeODt=ZzoTwU&WZzSOE=Cq@;rHE(k{8m(pR&tTAWb`4RL6HeCFWJ@->!kwg~>7 zz42Oy?u-03yS{~gpWX<$mG12?Yb9eP>nF1KY~Gu$@7qhh^L^NUr22RJE2iq5t54oO zeIvE`!aJoa<(5}iAGN-Ea@Fb<&m@ki=G`HidSVUVg}iqtFMq%GT}8fqd3b()d6T*3 zj_bD%+n%_tUgBz!^fxN!SDL`eu88HU``doKNEMoQAS}M$T`!hzF6ZqS^&W;3MNY@3 zUO9Q=s_};Y-|KzNul;pu*?rHvslaC5#%v?=vbX$K`1xXF^K&GaAKOVVxF0=#Z^wqp z&uJFytpA$+`~SPO+Pmb(^{YE=e;41_aeCRczLmx0E9FA071_#?oF}-KH1hZg*$P@5 zVgCQ($!?W639UE|+3>x>b9CEw|G$;+KH<OV?)B9Pfx_QQ3*Y4W2x#uSx8APR-dR9z zzf2du%$9}nJQcGl9=pEw+1;I$v2tP2QZ4^Jh5z9eO-|`C%crMyOpKl#{`}ppH!->Q zZofNs+V9%4T+!*}e;2z|{XSvSQvG73%7207zmndHcwE>RUVrq|H>R{|r!>o0&-mWh zJ8!?8TXU|E|5Mf7=DnL`4`rJ)&-k3NV#m$Wn#eT;Lh=i;5Bcz(51lYmt!>?^FLzDv z6}}7Ir`+f&zB9l6?cInb>4|2Ws_NVCvsm2uv1QNh6503LPFVNvD87@y!)7DC^Re6E z!?zThADl~iz;R%ynZ>LRUN5r#PI<j)q2CTa>DR9}h#9`C?p2Wa{cv6)OFjQ}DP@l1 znmgI09d8_ZStfmujYEFryLRb=)`|b#7B81N*!#h&T$#h4GpTF6NN~;08IR%&k51pw zUM(-8TfG1FyScCP3#+yN=qm61{v-O`*J;0_(<;3G>YCo${YQ889@c-;9Pim&W|Vk+ zKH+2wv)5NX!GFg%<b)U>bmo2BUh?(Z*X=45lbhdH@YbI$SieE)&D%Hm8-M@v-Ln6& z%8ye!1m~sQeDSk%;YrSga;N5B=@aChzd^7&>3G;W=hKh=Xz#ean_+e?t4GTB?kCdQ zAO5|wfA;tOlPXjHdaTdhE|YMUH!k2-)5p_kPud~{N){!q+A*Uv_S?!AjcwB%VyxBN zrmj7xYAq;sFX(npTlzZJb&jirZdox1)y;imP;u#=QliDYi^T`G?q9`WeIuG>F4te) zxxXwUz8Ajv`kc@FUuu5tzYIC8EskH9<7Zw}Kd><Spl`s`LlGM%R66gyI!R@d+ssn= z$mW3jj)<gZueJ7Xc(b>lu|ndbtk7qcJI;><BqH`VS!7rX&vK5*zxMdb35)0rTlPIR zm?8c8%&U`+g{sZhG(4Lv)U9fC&6dGly<lFK^0TIhE3df&Z@iIaYM$fc-uTk{kcpf5 z-CIn{?%h8qIOWnh{u`|cc8|80n)NQ8C)8<LllC|4(Ekr*dKUskZXSOB?hFsJ%9jO< zhny=VL`;&J0)>SQIemntCRDIQxVAoB8>sA4;i+IC>~Xti(E_E@T3OeQ>#bWcv3-$B z2aBkwLr6&2Vz-kLS2_fpTz<UU8@f_2>+b)b->jeiejae={@Qix*6sTGV%57@uXyg1 z9+8i3wtr|RoMvtG;O<t2CKm6gMIYqmI(~m47k1E2`poO~Te)izuS-bGYmGhqGP>No zaC-;e59hmXI*nWSJ_k=;wdU2U$!<4NBX_UbU-ojV#vY#^Uv6#C7H0Qk`}b@wb6s|R z)AqksM=$<Jwfn<#|K7LWuy09)zoZrW#W&u6Qtq$2ZuWK2Y6<>6(*%iU`7ImW3;eg- zRn$Fh{aknTPoerPm)kF>sg`fOaF4n0=|BGk&Icc!o^t;tgXT%Ox4wTX^6D~Asz)t| ze!1a`1JC`awp<OS?~J$KUtY~7@4eQvxNPHHN1-+I-%g5H%{;e7zQO10*K@_wm+@)W zahr2CXqOx^l<Pj2weF+*BCiMbXIR$tH_khL=aKRDEmOCB<@V9Y?dI&!%zZ6#LOb`h z#0lNpZayA<S&kTKo6RNvdJiglpEbX}>~5*)l2vEt)aQQvQWbu@>6h@osyTDns%A!W zy-L){nl7W)?|XEujThhNY?i<6B^vS)R?Ea>wD@kTwja89xJmV^)x0O`*RLvn=&<`o z!OrXzS9utf#V>7BXjgu2{JJ-H&m-|K4I48`eA#%ntckHWp8m92SASa4zVmUPvy3X9 zAHS8oP58*o?0X6?lGm?Pdy&4ra<;;~xX*kC6{^qvX5suc>n}^^w^{uhlir%n7g};7 z`=9HCy!Ai36b{FI);-uU`{lW3J!^%e!exbTUzl>F$@S4G?!FIqbH1hYUtTyb!aIS> z;OwU<a}Ax@HwH)SWc>f#alPcZu2#ta3+<z)`i`EOIHT)(!Th<VCr-^fV*Xo0*K*O! z)M>~1f2?^^XEsml{=c=i->|3&&Gbl9YV9mBYqYAeJU2=0_QABK%(4xw3DabAR5i9V zFX!lbv!Jc=EZ+@B@q<j(FH|FB?#w-)mZ!rm`7!L<krO;xR)2W%Zl3)SedDFy|Jko~ ztJN=@Z`)+F=8Ti|>C{xQhbqd(3F)rUGr0}SXLjH0(XB8Mo0WL;ql3&`$=r8m-sHWL zsWsge?H{!)d!=}Gna=%1omnhCOA8Kjozb#B^jloK<Ws=eq|<-ZH>9{7ou((boHa<n zjQN@B!zZ^^Tnvc2cZv1!)<=qBXVx58w(im-;i~hi9&goKd}o90w+it&T*V35HS;A8 z`Z)8yD@#1L`uvYo-ZlG{l^-!!c;x0T)~eoxH%`B6oK|I5XA-jf=emA1s~mTE9^-js z6D_Kh)qc&$4$OJkR2a3<Qu#&WMGn5?8$PW)g4`$lIr~4n%$#{|sq>_BGoo#cPpz6( zVqE@i>v8wl(VKZ+aHK~lue0ZMU*LImgN;(#x7eT~aXtyA_d_jyx76i&Up|~<uCeO4 z#S6{G%Cx!-rdkuka!i>n?nzI&zwq3-{zv6LdrTeT_HS0OIP?5L$eq=k&aQmU@pb~% zKbGxHPZ#v6Fj`jD_SD{tdD5PgiMFRw-+htiJ{}g$>fU_6`eB=3Yxx7W;@2A_4;udx zx_l?Hx$=&s((90ll&#m>`krP)g=IhZBbk~$ZBFvLKLHyZc0WuIin=gq+EcB6EWch| zVom?@i2uymf5{>`w=-6?ahtr&SZ`9m!d81x>|M2x#I%;)DEr*Jmwex+beLz>TZrX3 z@VCY;Enw!_z3GD)%XU$Jizl}^&z2~>vkJP$YIX3+q-l@t?%8G$|9#u(<2y}rBc<Q^ z3i<l;-r9e0j%0dX>C?k^zMgpzVe)sjaN%WHnZJ26TcjC9&DCY|UomWNz9QUcTd;p~ zvbi%;;S=V?i&lSql%KhYZ|?CA+8O>`{cD~rTmDk}Nnwe8b4U1N_aFBj&b_v2@ebYa z<h%Sg@*iIAOGsWBDwbeekzJ{2x9^5%)Bm;Y;t9UB6^64fMe{%M_scR`nY~%uZ;O}N zjnh&$*c?;K4?H-acX&dW;J3@a3|A|#%r%|&UC1p>UnXVhnr-50H~#T%u?;`S_CiD< zH#uhIQN?1`yxfH6YqxzmwRTdd>A$US+P3!D8h*NU+aU6pn16*$kGj`o>)8wUADZ~{ z@@3n!3~j&g@Jrhr7oQQRJA68((_j5^sc}pEZlCwr>kb_B{#97q%D$bykux~%M9jUW z^ev7Nv)+Y;Uax-pC`h9~<I<r%i^O#sK6y>PmwC$TeOjB*OQrjtK3dgfoQ~PYr~D$R zP47tejHCT|?_E3B9dI#s&F?QZxxJt7R@V9lCwKgeeQ|sT`|J7Fw`$Ee_|fK3c-6<( zAz`moLqx96VLV#HP+qiAQC9YlrCy-bw*4ko<!4P#f7@B(`uowEL;RJu{}p}9X>*el z-#qb7!i-5bWxwtzvd$NMcPCkV`eo)7Li%Mcn)@&InJfP3jJjlf?Oy8cjcEb=^Xv9W z&hm>~cU-63{Pea1OAGFA{HEi|=4f<zZyE=0zTWY-wU?}CEwnKyQQw@S%JyE5)xJ}1 zu1de#mk%Ct^XDAfcq#Jff}Mrl)4H}6tUS2KLTR>QMCsl{`-t~tcE^17N<Fbo({M4F z-WIVm;6(8`-t@yq7?Mt3YhL^Jtf;)>j<?c=A0l_Y&2Ia!{pri}Gn@DyJo!*jp5>Tv z?)bB5fmL6_3&Y}AT@pgB|F#M<?rU<{wz-=jOLYmayk~Cz#7`ouaxe9aTjCr1%4es# z3jF@o7u2x+qH@%y8~t+6J>)`PBznl{FLF;m`MB^*zD9+{s=p6;>hjsdXU=DSx8vas zZU_IcKNo(A+W&cb@r*sk_xn3o3;va@pK>Z}#iZM%Cz+Q&x?MZz`0*DPT|ZSw+uoVv zu3Ew3?^G<)&zro~R_|t}(bctXuk=1Q_DI}O;4s&@%yvCOmG|J}y=SJ%Zk*ea^Jkk- z6vyTE{lPy4W2BY{e*bgmzQrEijd`q<EO*#etd?(l%`~k}I);JkrDj23!fjs#`(sYc z*|B1Wzs){ku{^Pt<zCCb*ocT3+Bf!XVos}+l>V{YwqxO$4>lnykMCK+^ZRD@2j_Lq zn73bi7qRr)>MPUvns2tcO870)xp_M6;LWlUrT00-8+C8@izS)Y9N_tSfW?h}Yti1a z8N1&4OkbKT{QaNb;*i&MZw|k0)#KKi$oc)ogxE_B|MHWL3srKZKf5#M;5EKyfA>2a zJ1iXa)>7~Hv9Q(G3`@5DJfL22MpVuD{U$CmHvjMQuAe^@ecbx}60O|{%6C*h@@?oz zl5hNN-x{a+wIjXbY{K%u*c<tqYnLtS{rKnnx&tYB@8oybbJ??GU6+x6{JrK)`R+w} zXS145m9BeY$Y{IEOYY_iLDkBbMmfEc%5t_zs{O?m7tel@xWJwN<m2=i7WwZrE3eE? zab<qIlKFU{M(_9IiDhOyKa6-@U3%!&J=<^Y%m+uK-<oC|6a5|WTs$}3Kk59%WK9ij zad-aDndz&NId5!t|FtdfY4dLLUQc7;w~yL1`dNjZsn66jotZPQ!Te>>?ZwWAHMff$ zySZ3+O;hN#7j{dz)ep!#x!`%{bxvu^vSS6wkuNs8yWjp^vG$Sd55FZ`%eQ`iFnflE z1hdZUBj5RW9-BY@Ze}KbJo;7MYTkIY8s}4S*7@f99`9&=zsGEA?=gj?-CQQdTjXvn zt=)V5)a`Wr#W&r&et&DJczw$EK&Q^E!~M@r&&&{iv#rKB%P6KTaPq-<?>AH?TkN0z z^@EAj-8V-i6D5sUujpy6+tig{w)60*_LDF6%@SQIRqdbtTqRoj!`pb@vb>9P%l+4$ zJh**n)RW6$UJ1Tpo0GznA{4#0JEW<)I|iTjI_5TYYErsebmYr#a~#78cg|fkpDpoh z=jP2qI{&q*P3&ecaK2TVENNyUziaD>MPY&b_i_)KOaDCR#%yj7Q+e3)&g#B(l9HY0 z6}qM0XqR?K&91Y|{*^lYapRntEfx7Z^POjhyZpMqR=j#epU9NQ4FdW+kL&ZfCHLxZ z>D}J<SAPGWxyNrTJSJSByTix%N~p!$MCF;G=dyLAvevX*2>cv7<LaZ(z|VW%Di*#s zm2N9mK3eg3TJjez%~c%FI9K0#?k>`^l;`jgrx_=F);y{=Ns|1{?R|5Fu*l@KFRMT7 zV&(lNF+FaB)+OH`zh&dsOgnw*r-P}~;&Up-TOATI1X7m8Z+s=Xe$f$!tINN8#^u<@ z7e>q2>CNm+wfUW1wn9q#bLJW@PXn>;s24(F5odUhF52}qeT^+|VDX;7?nVD~d9<gl zu79TX$#LHzu_KQXcH9l<K5w*}-^s0Q>tA-~*fW!D1H8<B*<U&HC%G@U?qg7Ay6B8x zA$_yQb63cG-g-f_b#2X5nMpZEUU^3vdw*%lcwu&AkGNG|;h(j#Ei;)CmH6lU;Xk=| z`s|{6>lghAb1kY@t-kr(W!<90cWgBcMxRtFPem`gRVlsT_ragRB~OB0`It|UHFsv_ zkiNB@VabF=>R(+KY3NFS@XXaVeSNhc@vb_*#?y}18fVz{oZQ#UQ9SbzTkVW}M^@{9 zoV)exf*Ch{DEV&*a+h3FmN@ySZNb?KLT9EP|Mg^}aC$=9yz2*U?XB0fGu(Ue=yI;K z3?>%tdprI3e@Vwo<dkShOI~RrZ5+Pj!9(#0i+|4Dr`*$bbH%}V?5Uzj%q&~pd+mAd zelGXu!r&>9->SK*!*|ay@4OKBfn#6W@A;($r}yO?6#O1#c5lhblV({8(*wiy9DG|b zEpJ-x(Sj?hUZ{Q3+M+t=a8Axbzcp#Dmbd)^R!3g^S9oIcbIp+ax}>FXzqnT~v5<85 zFJG7NZ*$$kEg61MlU6C6|DYXv^U%D-b{!udSGT0{Bs_RD@4w#$-epY|D%{%+@_b}x z_HW(Ede`v(ika`5yv^2fx+$dp|J8cG<?MybSyQUs`aF+|*~7@i?^Rx-v&3im8kfDr z?r-W3efgx6|9HRZ-j^1l9ea!Q@9puPclcM$cl{kp3qE|Y{9&Xx;YWAqo|9Q-@oyNE z*KFE2MM%OWciW$-5lizAeG$po!nN({kId;?m)$G7XQnNxHDl^_-52-Q+&(%xxZ8Z@ zLKm-}X4Y5r>hvsp=9hQGnYAUyr+)oq`9eT2Mkly(>bH({%P;U%KVEnv>&4B_#Vb2M z+i&33I{Y}!E>$$d%+_Zr+hjSL%mXzOz8Wm7zx4Th?>7zcd#B8srj^Oti5fI#e>~xA z;q5&6uDGYwS#7zajmzd8e!N50`C0Ck-H$AOihXl1eJdz-S|cPpKxf_6Y5&~A;+uOP zE;+3u-H_;QcFXeKmN_p}55JX}e)VC$-;dAhO)l@ba*XTw`i74e&tAEiyUFWX)LNSi zmA~Pu>i(CN{aL?8;^wva()tICZsu+^oA#gMs9*A=>9ZpJ5)%y6B)7BbuTVBUDmOXr zCx0Ysdv?){%eQ2zqPm$U{%n4;NA_ATr-e^uu8(-3@9`a7*>5LVty$&Td95jB_YZ-* z1>IR)TNU=IHQTbETk!nA#1xB0)h(aj-)LWRRoONwqAT1l&DX9x{KnGTSEfcp>Q$?r z)pS!i#BfZyl3VNUH}#KSmd$@+E-5<y^HrB08C&Cb{^zg@$tjt?_u%ip%muT*?EIUV z^J-JE+Tzwj%n|m@`)js_Jt#Klc*yb2A?J7UO4m*9OWtnp>g~0d^f6NVgX4_1{hPyl zlsdL&T*?0ZJ3{-L5YMKt2a|QJBkr>=UZ<R=VCQnjqvnRMwbkeAO0%uE2-}_P@9Fyx z6IGpa_Fmh1{WqU@f3%f_%!%C<n65pmC~57R8=IIL{dN@AnpN+bA$)vg?d$r=^Z#e@ zY@4Ime9gyG`du?8_oAQ84!5-C*s`Aaw$+|h#^0ZD`jM$~Ij`LQ{A<qFKkpC!|M)Y$ z{^Otbl`lV<?3?M)a(VjPW!b+bt(w&LxcJ<{Kbo4hZtc|{eBUJIF|!`sxBJKKWzAn? z1m&lx%VzxfVNw?QMPlO5hirGE9{U}ywkewyJN>Pelk&O3$nQVi=)6y;IhdS!?2_{T z9ZOb4|38~xcQWBk0^`0P8#mXitbYD`(Wa!})z8beZ2n-G`A#=qHIy^E%1|MN-@NbG zg{x`T;yCht&VJa#`EAaQf*f~?mAiLty{eTtlX0i_rT$2Hlex)xXN_j07ff&bw^#9c z=Fzi9?>FZDxhUq76xFnQZ^}G=5&nIWANR99d2bVzza+iv;<jwd>Wz$Rm&ZTuaek9` z^=h4DwggZ7k*Zw<AG~wgZ}3eE-Yb3ZThzAA%K}Ra97T8j411~CIpa;`hpj^I>}u@J zg+$bzUS@IhwLsL-gy}(R&wagD^i2Dz{;Z$9+shcI@7?@lPi|&`-JG1fkF%odjx91S zP;K1(CFS^|ciSdTdph^B!};~un-(pOxbWcRj7J#(nMK!XwD(o=%zG#DL$Sh2S3uaN zRxLo>=C1Y!#eKU@F4~y*d$m-yf3hZD&@`9nb0Z%e4VSwjwyRxyuBY_-xz<PSTsnCt zsQ3MZ-N{m~3jZE@zN6(;Qp`C6gB!ENUI^yc3Ky_PSBvhCpX|$-G_k?y{dsf7gk3Kt zTEuSTw!0G{wD$i&*5C6=56*Cq-{Zr-fiZ1=_{YSrTp}M|>pbFrs}%miAwkBqRy$rc z&D4C}=~<!bAIzsoHU3(nm2u;TUFD9gua7jYco)VmC&~Z+Y$n(LnR8`jb4;gQn-;2j z)BXMT>2-YW_mBBInlSSm4A<^gmEBNf^0p+-ZQf6g=U2ZLG#hTuxZtiH+Iqd_Ci5d* zi<IZGo06x`jQ-TOq=c)a*@iWGee|cl+oV@)+i<<=0`o8a*30JRr5n|EG@0u0)RZoN zbUycg;x@ev`}VHBd8d8fOd;Rysq3PHxMR<8|M1d&nD%okdvwjI@Lvye4=vyLba6m> z_}7EC)4XpsK61RqG<|B)^P^EaFQ`uNUHCCNc1_Oo2)0u_!LQfo3h6fL${$gTOwP{V znDk}MFMeB2yWMYj%6F~18vom>zl?WX>AeTvvTL^Y*-0hUGWp(}ek-j_%CK$nuFC(@ zSw22v{*jmz6I-}avWnN>uaNN<qZ79O;<sG!fA-z4YWbEY;%9ZLr+m7e@N>=HD;fER z(^|5B?DOd7teJLC^Fv|P@dJ%tUL0V58TH`q(dy=}-e+|et|+h0j9QU(ux#~%j7!$f zW`|DOZ&-R>$i9zx_1ised#zsBuUbA;hL>mSU-y*>uNBTU3Z&O}e75P>tbXJs@1r-n zZrEs_Yt_HW>aM)qG1l^9=9BY34*Ux$Ui)8s#e<deXQa;jVcA_iXG@oB&zCv-K5o9e z<;ybXSMw_0U7EtpB)58+nA(F~+}ZZ)&K(r5othKNt}n2sUf;Gye%;5U+J>MG8)e-N ziJKLt9jiViAMDUvf9l&I7LC&Vl2OYyswPfn6I&iH6tUrWy}<ODQ<w22>hGJ}7hN6v zx$OMw4m-s?=Bfuz<jC`8y1!n@y8F34=d_T_XMg*XA226gpH{F*tn4k%^6VK`n^rwq zY;aAlx-;rVr}I)(c2nWJB?cE;4o++2Ox12bX~kYBDy5>Gzdh1SUbo~9r@*n`GIKeX z({EP(JICI+q||f9x0j6hyYB1E?w(ue$jtxKrsc}t&?&pvH!z&}AoHXC_Zdm!G>0Ii ztGNX~UtQaG?RfL|8?3(%t!ppQ_*d&#KQ-=8s!Ds@+V|P@g*L0ydCq;mz@#4aA*_A% zD=CHF&$<?Wd8guh+%@&<k8_I0cx0V!p5(c@=uJl3w?#c>&Y>En##?yLM}9TZ+jY=t zv)L=Lj{RHKF5da6aL-b1?%idx^5r;|r(3?f?dZAY^4mRDc`HR5FQ4Hm_<QruuizhF z{~uXzKP&#fRo!2oU3ItQWBx1s>2p5Wx3quF<!N?OJH!87;O(3DaM4yXo;%T({*<PD z5L{)w@6xu}XD<Xx9V=KbS=ATyT#z^Z{O{M9mmaV8{=EInZ{afcf3;<fvB{OPeHqaO zk^b9uE`8wP_5Fa-j^@V!rIx-=UI%k$O^-=B7$Ch%K;qEv@1}8n*{b}}Zc&Ba2{jku z*E`#HYMXS;Z&>lB$ysd6#b4j9#=SXpVeP!P{G7X4qbKfHHR3Ek_eowe^OxqFUb$=Y zmR)~f^6S=V@5K7ePwnq)S+n=6h}pNbM_GeQb55H0#{91L;yk3z{e5%HrAJ?!!{S(% zSnarQ`ykKSBY8aPN7i2oX)EJ7cKq|cf?uDc>Q#B2K1r?F!}~4tg0;Ko&o@n6GZ@X! z*>n`Tvx`?+pYcD&Y8@G8Epo(DxW4W`zr&viEbqL3EA0Ev&@Sv-vLi{N=#ZTlv!#BD zw)+Bmxh(xpmv$Wb7XIMTTAlnG`*;6sR$6@1;iT6lv8ra(-;2&{l3pQr<j~tR<8?XQ z_aYZQKCATJ((L5UCb_p}E$jQePOqMEd*hc^4U)fHj;k}SGqJBcW8nOw%yK1{ly}OC zcV{9#Y+6@Qwcvd5pAYZfcz!9^r6!jfbDh`gLbCI8)~;T!vft@5ygWXCT5odKH>%`9 zd}rw)y$Zdp3ohwY&$H8V{Hk!NXx7@yQy(J#`QG^bB$Q{}F_(SpsuDTHGZ#w8dUK^+ z-@PF;K{S)YjYm6w^V`Nh<;nUL<_qUql?%^b+VtC2*WhN4`h}7@VLPuq5|<y}=Qwse z^9j?gZ)swa)<3%6A$ax3qrYNJx%VDlGF|Ph@|LIm^}*apj^`y3ubEqI+j5q}M?bgt zV8M%O+k(cYoh1vSIrwkNI+<N9e0p^9f-6(1m3(*PRZg@!suS&!A~Gx0)njGx*-bN_ zJe`#{?QWChy{8L<vZ@l;j`-RJv;2B=_KeU(VVz}`X_4__!5bs5^=fb_z3>s-ar67a z1xt!=@9s@?&s@Q6yzo(mgyxUz!Yd8;y_+67o0u5Ps6IG@ll^Ld%FV)p??*-d|6BZ} zm^H>ZJ>Ykv+#3$YEi3f5eCvOC;eEodg;CS`%Ud^nxok3HIiK|};V6S1f71`AH3TZP z^ioZWzeQE*ma(tyv3oxG@zzsr36G{%SU)H~U9*i}C_pav!g+;hK3n3CS{x2IeJaTB z^5MgLGn!@Af9{s4l*$d(`1rW(eg<PwGoNM4N-yOyql2~<bM9naeyV7+%j(GVkgYl9 zxrKhU;`{urDcwETb$df}Dc|4US&BOh?)Z5peSEinP2b(W-U_xCY7c%`&H8@+7L6CD z%rbd3UhhA4Wuv=lcgEJz;;i1Cj|x{h|F5oY-#63hOMZss)cuX?Gkml&=b5)wowQoL zw(vIljrr!w=gpYTfA^=k=G~jSvbLG^PK$Cj_SWr)o7AFvpq``6F84yb*}XER`<YJ5 z%QM<imx!6OtFioT|9Eh9VAQAHusw2*j-<c4&?x`xwd>EP8<Xu%%L|>b`j+-9L}0~R z*=pn0H~6=gzd8Q!*QegzdJ}%$8HE!hKcxJY+IV92@wtLm9v!>){t-vk{HfcopKGX! zk+yjmS2ca^c5$_Q<F!qvr0n08=7@(p@}GBR)A<uDTYLA*FAmgOck%q~m~Vaxr++;- za=gqlSLDmjsRu>2?=0eNI}%@cCg=S_c@~Fu?Ngr@e5r1dcKKT+yMHNLx&AZe#Z}*0 zP46+kUCjQxxBT(;g0h>cQ^WeYtrk5}srq)RO5sgiQSBD5s($Uj>{o8h%g+AVxTIX_ z{?hjUQ^TflvrAoA*;M&$*|aOH@3PNFcC3|Ln_KfT{Z!-<d%rh+yP1+dPUo2VbmqEc zcgs%NRWsGi))ti4*t&mvQ=Wj@HTH-vzW!U{w|*3{4O+M5!I|F<*HSLUHg&B$7T<bm z<%ie%Xa0Cowmo*w%siR>HqE-x+z0j;N=x19O=o-Wy85wJLRtN;=RFeg(el@S%-$H< z$~`Mn)#Y*PjW^O?9iHb(A6>&5eyQ@-b*pXqHxI>Inti)}`knl&h;^y`A2)?Y{Sj+E z+^~l4O_|)W`AK_^O;f0nR$nmj)Uk^xCKJSTGCzpM2L^|+?CO8Ix|rw5>)x8E{T{20 z{u!h<7T-(R{3ms{p=Zdq{G?lNH|t+NanHE*jm9s=$j9^Rj)}5*e&%=lS{2WuaIZh9 z`tIND>)zVW`M%-b@qeOS|5yGO@GG4z_5WS@>PO$#IDQtssbH`y>AioM!N%F0wQQob zs?r4w6WJbSO$(bIX(k(f{^$0a`4^h3bF@M)$UdH-tS;p)Zn^ISo0NOVt_qR2W&ggJ zuX0Gc$<QpfI&bq~3HP0HJDJ~0vVN6V(bAiB>P0CVFS}D^#K#Z28*Y5v-+6kM(pSI3 zeABON{Ql+e&zZYlvPDfVvH98}xvJpdB&NVC`~PzUzP-3Gx8B!O@ssMh1zMIVdkwj@ zGb^UW=x5cZe0`)>HMwww;b(Q9`kW14wTe~u-sNEZn93_3pH#WXyY%n-UA=b{A8)Vy zS09tSx$)ULlPOHSxr>=}^$z?xAeNAJ)J@Lbb?JIGyP`>~aw*%z_e_-(-`Tz@l*{MG zf|)GQ`3;5KeJ58=4eBWq`@3M`{uNCNAI&znpFVZHTD$Gub1&UxYy50jm%L;9{kh%x z;l>KFmU~ujUKW(4JH)U2+@{Wx^~PZ}cX#+L%jOMSTZ8JHzf9(z;jmFv@?mDt(~74W zt7R6iEVjNQ@t?WO?P1U25Zi(nuB(d|&kpUkPWW*9-9PEw>%UtR{jINj_kUXTeb;WD zgaDCw7x;BQ|MI-X_tLe(&%R2(<?PgZA18Sxs>$i8Ocpz(HuugEpQ>5U)|U4Ep1mRO z3&)(~b$`B;-}_Qh{B(Mfp%h<y(J$9OTXIxfZY}sQt0jJc%CU_H_3laExIMSx*M()` z?wt`&|0vFw(RwLQCZ$cj;m4}|MGv)K&Z*cdmC{=;8hv8>v`*fdSkc|G>x62P-f-5u zXo<c2_xff1g0S0_OMfuGEG>xUn<tmi78antO>nRA-h-E!nG7wa>u%k&NO`t_cka4J z^11(ueSH)EC$4_Ozv||R_cMLn{vKO(Q~Lg5-(8P_pWJxV?0H<dGa>iSl&NB!wkNYz zf7ucD_pP;E*>UyXCig1Es)Dqa_s7;q#9x0jMJ;J=(o*A3_U?}Tt}mar2^=-)Qo5(N z?y$zaqf;GkX2fdA{=1}?>tt_S!|5jTd&1ny>T~u;ojJ{O>i(Vl2i$HmZ=@7x@7~Gz zuQT5#`fl3I^8FKg3!8THsc$n-Z^@ka-*U!@M+Ta=+lBovSFyckW<T@0aOum=^9mj* zx^>5lE}w2|lwN!0#fjAAFHX<?;iq0Raak?bI^z<-+JlMnH+^v0!QZ@^?fcu-Ek|3w zrB5hk&$_kvfz6%#DUZIp*Jl*pv2R*?&B!GD+0EnHj{2<Tk}+00maG#nKjBhfZDjJ+ zvLM^|hMm~KZqv8Y1@bYh*W2d3oz$4~{=@$-=FG=Df7s6UDp-EtY|F<7-47-$6p?4z zt{ruGnS(^Rd+)c;{3-`NYMbb`++Xh1X4BmL^tCsC+_Fr=>6<IUox=*AfAS0b|MS+5 z>#U#dGRM>xh&OvPOlNynRj|ErHdCI|j+qbMF_!D^C@RQ4@K^MXTEWx@_n5ZJ-w}UM z$51XbC%t9aT<&$|JGc+VvgxtLsO^~e;8^o)u5|);m<ql(MRVzK<UQqBb0Z+{!92F_ z<^{74<g$I2+VTBBE#JH9g8hxJU$pOH$`jZjQegSu(}7;ra_$|w59+dqKRdqCtcUr4 zEmxlHj^hVyS>NS9n8*H|X~)?Iag5(*$!G6bcF|5d>e-!@m){?HTWu_UW}bD?srk#r zg?ghSOkz)8+QjuRVYl7%mCDN=i<MReccqyAf46fp^XB*ave%i#Nb~(K+WIiKt7!T8 zd6wD>c;}m@o@=>znQ3#!G9O-_`Nm~c2LhjE?FiKIZvDS*Wx4<C+UsXF2B-V(FSc4y zQaVM#Cci4-+?$m?dw-u(+ViaBlG~Yi#<f~;@>AdJe$VBhm_Nhr`8vU1rr=wa^{3ug zmL$l;{Nwv_@lWycq%Tq5rdX$o>&ck1uIrhYl6rS<L&HxIaWSD7bMx#|cV52WxA?P5 zaL%T5{TX(;^<@dK)|930DT__;diZAL%<{83bJpFR!2iGKpfAgJ_1q<FYC1)mP6hK! zo4LC8lG|O`8MdXnrtxo+k)C0s?hvLh>Fog<8Se@2ZZw75lzO80M$sf~;^wO^uKr28 zk~eQ`%-kvb;r~ZrljGYNyf+qni@khXyXCQQ-nBO?%kP-hzKhBIQ}Kg6b5C`jnOv8= zv+o5pl|%bGAN*V5>(Nx-;Mt(?pgwHkj0fp{PquP@l1r#IinscDPSdq`>w!6sUj7gM zU+`@IpUWl6r=ET*`B3&mZmyO4@e;$@*z=a=+oHeA71~yReOG+%XYKE=@&yO~U;X&4 zB;kC|c4_hJrSD=ET~DhP+qoop))Rg2p6!2ksLlN!U+e$<|HH?-nT>C3Pg}ii>7E_l zJ7lVKKg%C@dM?pNj5ql>cUz|DT>XVh?0%}=2|xGz`0j$A7fpTM?Q>gwW6Hah)l9a2 zm&!GMnYpeH`Es^vpXbH-!C$ys@2_|vEmAvo(fZIYSG)FkT|6ynyX3{vu6+>~#WkuN zE_RFT4Y-)D`OCz0{+bt)MQRr<>JR=><0`-M#m+7}r;ElSwy_t3MQkH43X9q@erY`{ zQ#)bNaqWk{HIM(+IR03~Htb?;m)zPHajxZ>yOzCJe(C(RXwki{7iT-}kMsH;=$aq$ zrRsw8($Dw3)8Bq7)zj6>_e_6lHS_f1%sqFDf5yxT`*`50pN(jy*Y2P%yj}bJE?(FA zmE{`0^u^OIxu7pWuJLPLaEsV3c;VU=x8lWSk=j{{{KLL@cG(49Jg!+~_o8}z;g^Z0 zKE_;_e(J5)MdK+SUUtn}^x|aKycI7vyX-tJJ{H|Of6@2AFBY!-p(XPdxohtVzZl!K zPV?8w)l<uszR>Nux8{Yr=-$AK(jt4~F7j*tQgmG({3YrF^UA(`{ufs}-dEqczdr8l zt*4J;?j25*oBq7$XR_Ah{|`24gszTIJQ~dL>yL>0{G~50i_{vuxbE@XKd8??<V#`K zy!9`X9s8#}Ivv{AAMl08)j#};h^v3t7Z+FmfG>_+a{RxZ2U&gz?t?gu)mCHf``|t# z*G<{{+B5sq&EwG`dm}IQYgH{?WZv*EbJpVP+Q;FJbiKd)MYU+{_C?{EzxZ75FMBby zYhUC=^TvIir|t)@@IEf@nfNx1b-HGO%=7PWk5?D`Kfiuat!{GMj;@!J*I&|lb#vc* z|GH|{68}5@Z%p;MR`B!D)Hij~&x$@xjdDE`daiP^gMIDN#r`a{D@tl)URW=A{Byzi z$zLXR*~xsFI7#mK<&RfIb^fxiPpC4T?z}U{``OE<Ma<Ke#>|RYw`<PHPYZqSoqn33 zC)~cNrtHZl524B2JNGo7j^1(R`KMVbc5<FiKB{MlimPm_sVSB0VRxu^y5ucdYxv^d z!oGbBUo0odG1SgnBHnm!(u)_Z3)WBiqPala>ld$0tbOdUC;Ro1zwMd&TD<t@FM+j8 z-%E~up6Az4weZFK_*0*%|1Z_~W1=_TBjKa%j00bu#)uVG+D?}hn)72_%g>wI)90+^ z-`jHZa+%@obDLxQo^N`6G$8-x=40xmAAZ*waM!08bpPkpTfHOZY-+t;yv&g&`r;dZ z#O>rbc3XVok88~}Pn5*&+lp^0FfW{WD)qKQS==LsWyg80%=3Ewa;6A>UDv<tKR17^ zt0=qY{849K!k(~?3-4RT9r~+&Y;(z*oeiz=M^Z1czWK3%(I@Wa{Ga=;_TP8kS@X3< zP5x<--t_B*m3GtR^rX)xfAZD4UR-HC-Mr}Mdb>UIihqjhy?<C_F}-=mox8J7zOUN& z<=<NI%hwAti~h^n&Xl_zyxPLB;imFKnH~0x`&7<dtX*KQC)>~VSIzUg)<Z~g-?8~? zm}@@c-_C!1NJ(DqOX{S$h>QH1*FmWsEkUtW?V2*r>w@$z%U@|1#65qhUHI+sYx08p zNspqhI<Ma0bLq6>{zxu)roRF4?)t2MLp|epe!Y?dMIYl`8QX^AOFy_u>|Y|@G*98> zW(RYXTB*4IHSY7*EGZXyA@6Zqy=h<IrQ?nNK3De5<NtMalATaV?4@GI`?rr@bZ@9z zw<NvcpKrdq|M4H^OTUO*xIdv!z1c4ElCb0ao2M@dJG@tY*?eK2t*mX_#&r1$k5#Mx zUx;0;adz4%{x4iF{{(#Bd|p5F%h9fV4i}lb;+DK<?XvT}xLosBitGF(FN8&F=PY`z z{maAkJZo+5l>dSY^rwH}QLWjvXt_p}(TndM&(*b#3yXluxhne$>fRr}GX8b*><>P4 zTx*yA#l?>DYIEPS{tfahZ@lMz>GrNn(RJ_o>a3=HeLwxkr{BEOfAA*kI$xf8Jp9*; zdd2C@HD~^7PJZdV!{%D+Pw|qA^JblSzq(OEL)}$=-HUMTs!5CZgTCzRx)*!#en;X< zjjqI>GXxgfhMwx*FTOT&vB=%^FJ5-l?OYVU=EYx8Tfd9GuHQ9&y}y|LTDR-ok{6~q z@_%L+UOe~Xjbcsxt(j8~|DAjDW6Zk!_c~9`j9FIvGuGWs@A0QpJ@KMS)9H44_Fs&C zicIG(tSn|%(|@{2e|qdrnO6@VbD4jc{^t2R|6@B%a&=!wtJH2Ss+n4}C+4DaSKO*O z`y(tdg7N9E$x|Lf!|{24NZ)g<UmULI1HP2F`UgJp59?Fcs%irHtHSmD@)xxtwtg3r zMei<uak1-NXvy?N*<E#~O1Irxg|qlYONh&$C7b52;;y)bFQi3ln-{GQ{<5`eU)05L z&8nS?+C}z;Tol*-#pKGbQ8jUq_^xw#`kO`mid{(GDPw!>=&#tABRzlb>IS~Cn{xPR zfZlltpSt`H&(&k@AAI^Y#_!4T&pYb)rq^GenR9K+a;=}WjNe<W7rltr_~qW!7riXe zrhBK%LDheI1V0NJy_jviE=W(jcxS_DhUu;`VnvqSr!!;xo)rmA7v3pzJk@Tx^3F3) zi&&;h#w;tIc_`IrdS{GUfn~?(3ccTjH``BJ=q2y`QYd+L>2z=L=~B~o=t-q&PuGnx zE3TY!+D%V-$C~G#45qj5So3((w9~aQ@17Q!PY;cG_n=66`qY@bXGOx(&lg4>eCnoW zUa+(8^wyYl&x%B+KaFYIq4TuJa60!6o`T3DsfyD#@0fG!X^Nh4$*S|~O7wzv_&hV3 zc$!6zy-@Oes=eOt0?Fg4I@9g+7VrF0^zu>A<4;qLrJ%V2)m|a<OC}p)cC2|&q&!`E zN6hi3QFZsS)~$cEY0hbZ>5O{mnS1_z_*}G8=3pw@bj=vG;+ZE>nWle?`Sy4d|MbF` zUpso9T{^vV^<S%k1c@Cw1wUqgdH7%*Te<EInS$#LyX9i^`gR`d?MS;{=*2#rQ;+vf z>4U0=`KqPOR;zS6-?JJzC)eK)Us}Aa(c99Vtw(;+0n=&vMaQ;I%P&4=Iz7Jd*w*RG zEgt_my)Lk)Q1)5toI=|)we*<jmB#5Yvm=j4UQgD0-t*e%dhxNZGxZCPmCoMrU=O#L z#FvBfi|S*lf9j^kWLM5HUbpkjgQT8p{pzA)rZdEgk8PciIj7L~*?fz~QfF>kK8`w5 zZTWcCnXPjQbD!O}d@OY~>)ej8&%x(*q<v05x1((H=Glhp9=<s%dA%s^kmU7}w8CRs z=b9HEGo4pnbZqOq(-x0soo}~%eCxcp<zuM}<ra^lF4PwuGhL`|arssNe{zhn)ePf* zu}3AZ_oNjc+q(F%#bc>Uk|!bx6aR&rk(|G@#b!;<kK&wMj{f4__S)sk{^qyLQ~t=i z<=M249&6hl%-;H&<^C#LU5ohN?GG;A@@_hwahs+8Y8jW@^1Zq{9B!*uG?fMHy2kl3 zDp%otyUFp-C3UQO0;Lxw&i*^`hX4J*-@O*mhqv9`$h>WF%-V-%W*Xn^c&vGRdP%{p z@WvyTRpL}W{uQ#<`?%VuTK3)Diw{{kH>>Q6d=x5VuUokENWQntlF5h7y=rD3aTRJ; zt&4edU8T<d(R<Zv*48yUk5mfX*ZO!@Xu8**1xNh7{%krj-}_JZk-&?5^R+*+3dOU{ zVf@N?U0|7T`sH$=jrHpueU;gNxII~%`Hn}z9(##DH#FYO7e9L|WcPo8PWKm=Rpza$ zWI2DqigVt|qa6F@*6E+$5%5~^hu>QpO`rOM<(J><<{#YhG5hS&J%482oLr%`wzXzL zh1I>~ThveRT@TdJpZuSPE7<oR|HYlZPu8p5eD0km+_Qh)ZI<7Y*YEJXWnX96^?Up6 zhe8w2)qCvm+#T~l`^)aYW9u{P#s2IH)A*sAyYPXzY4iu1w~Pn7x0W_d&#-3Ezq*R` zdd6<n{j1-K{+U-6@S**dc~kb*c-HsV{kZK`l$ziAsr<I)VCgM~lmC+rI_i2BNdB%< z|HzfQ<-ycjDhI!3mNVA-rk;9JW+U}`Mf%G3U0sfKeZSV}9XTI-zf|ty{gv{59S1ip z-uq`u$Rpj5zU#*mel834QxnX;`a%78xlq0TL+_-B$mB>J#s8I3@5~d0^)Ey<$UjZI z@b7g}M6JVZyJM2MJL0?!Zw`{$=6Sug{dn`Y%J5y+)Guw_H}R0khaVsJeOr6v{?QFp z7O`2gSMRiK_povLANNS@t$tJeg?S=>Hh<glK<w9Fwa53jerJ)t&c|W5uvYuWl5dM2 zn5}iSGUs}?)7@aM4e#<5dz3<!$?i_5oBd+n<+(pJp4K{uZ@JBXML*V0Mo~JgB+=|( zh0$&U>j$>BtGPEHRyw=U`S*L*HV+#o^OE+(U-Fu4tL8kA*t<Vry`4vayKQWNdTq~x zbH8+6-r2qQg{AqE>9Mb$>CK3bJ^tt1qCGAT#lGCKNs3*r@As)D@rS_q>w7fJ+78!< zdi`|zFB%(h-`fAwW1ER>pG(_+zw&0~zc8J%@A_$$_!aA?9<tGD{n`EC;IHB){cHdA zTK_K>N!u*)EcL<G6!vNJo@?x{)p);NXuf-8efJLi-Y@n~$_{+kdWSE%;d`-libt8l zf95-U(JIzCf|(vyWc@CcbNXG&W{F?9U){p>zu$+ezrHuMztp|7b3gaFE2ZJq=`RBh z#0S;gEbR~6*A`HBULfA>XRqPLdFn4C&Oi2<7SD74@{_NUk6xy3`m?Rxt6b#!``k~3 zYfhicSD)Axxa+X_tLL107k+c?^V}cvLFKR4!OLH>S<hc9X3@X$v)J%K_1E5}=`YUj znroo%l^8ei&>qFsl|nHK-iy{u-WUHtWv}0dqQCJ?&cCiVg}-uVVgE9JsYNu4{eu5` zKNRnN*iszuo@GwQwx`>69XztlGRU4Q)$rmGqf?7N&2p?!o_bwIYkkdL$wNAd%jP#_ zuhuw|@v2f@S<d<4e6zV5!*uoI_gt%s+h@m7(lCAf@q$z0fB8Rs`dT^X)7Q=~>#xiH z>#m#kK>Z72)BH=qEcR>THGfF{jXGF=U7e#Ya=y}zp!tfeJA*%@)vgoy7pG}cw`sw= zHzzNB<Gxuux9_jzy*b8Pj-ODAt;v|YKVa^A&wtV<@_uYSuQl&@qg~qksRzV=&8U5r z-B)|zzmojs^Ij+Iv|X!KmA2o%c%7@xzuxVG`L8g|Gi3(_Yv(^${A+nr{iXdA9$6~= zSnzN1gZ?k^ON;BLpEI@E@_Bky`oa0HZCUFV$E*Bc{>$}XwZVHE{Ytwn&;4YNvzbr4 zyXwTe%_rvVJ~6Mj^S;t-{iO!GSMsfYwC!lcp*!0w%=gc~UA8;rb`M{lt+7j$-%GyN zZtD^bpAdgzc#P{^!X338n*%j|#3ZkLFz=Yx!P;JS7Ile!u6?&EoC>CWT$8Z>qE^L> z!YHoCAGZ~+o2d80DtX3(jmI<&KJK~L#ND&8DY<9%lH%o_&)Jp~KlgsFCvxY$hG@-1 zL9sixf2@9>c#OMA-#BjKr9W*C@{a9py4=Hd@Nmz2*7!^r_PT~woZ5@)gKU5H9+Suq zsJ+0uM!LGzFaFEQBga+hmaIOkey(uG^PPP0I)$^2D68&seY9I8PU~Y<=lm%@QakTY z`mx~1eUCdz8?CQB%oF0D@`J1MuaLNhP3)sd5jpN`cdc?BX)y18Rl0GF@4~b4-Kn`; z^J~}kr{=!O&6Mf;_ru&JX~%s@zWX^PVm2pVDE*v$p#Gpm<&WHr5&P<mUTk)pGSB|v z+{ejvvBAabq_tzs!;V<qE%?Eg-0;9DdBX$i-qS4NlHpwQl6iz}u1o0cxUs|U1Cz3U z!BRut537&y9E|QsIvCw6bntf1)24EX#Dlwgwl>{2k`w&1;A8l~>>jRz{SvcT?6dv^ zf3QmKe(?3!>n3xltxf;)WQ6|kKQ=z7FA>lEZ~4c)BIo^^<jw1Z|Fk5QWIZ?MUH@RN zoA|-qJ$X&rrE6K<8~ozZGZtc5Z=fe0lNY0S!^q9!d7OU5MnlJf&cf9XmL5yd{3CPF zU(%b^K9_~{|Jfb#KZIAcule`K=WBu1Rp+(RpG=ycJ-)l)?U@C3%hSzQ-k)IM{b;%B zzFoTyKkiJIs@OkU>*syVk2Q}X+3vk>y8F_Sf9vJ;j^!71%ahBm`5B(|FH3(bGGEdD z>fEi<i&oCfd+<|M$?#4$Z#%!ld9HsaZs`0FPG0^%_}J|xd(&^6|IXad|FPj?=Yy)p z)(7Jy?YaIPvrzmo<KylJV#yBA%l=*6;qig<@uhR;cAjjK?#*U#@0r-tFO|&tKjDtr z5B0?!UFmusE@x=xwQt{*9J$~7X<fq)TdnWwJHAW)kXhFHqqh0mf)|acUluk#e${9@ zXOs8ziX}&ks}pYS^-eWk&#rB~=UojK^S2|pWgYg$S&i3&f1F==XTIY9!)~%a_8&U$ z`aAqv!qdKQm7!hB-MXGn5b<voIe*?pZp(ASPyeUAdLsGGe_L<z$Hi+)&i#lxJi$V% z@9K89vn%r#p7X2a=A8Y#(E85(zcU^%zT-Oh@!fOQ_$T*tDmGMiKgjw1x~ceXXp`{W zYU|D7RX_9|+di}pE3a4-r(H4WpX3JvxqWdz;@_279R0iY!RoudO~!ZEHo5PppM0r# zY8qqz=HM;Gy6yQ_^#yEP<#j4%&C{(|R@eL>@>j*d@)zdZdRPAI{LuT$_cAKA>G`YI ztn6QUC;iVppr3s6W6@3V_R`($(y#wNKT?>-Bd7T8<*{G?r3>|C`Z8jxl)jfe{(ZU5 z_GKjdS&zcrG|k;TW<7t-mtX$u`RV=Je=MtRESa~a?_p`?<M_AUT=mOK@;WM})Nzzs zDD4Y8{=BRIOG<I*n$`ZFDmK*2e|7Se%Cx(eFYTPYq&R-+xwVg;C+!Rgw#r{>d9?bD z{OJt&e&M%2?b2)Pe>5JE|CaK#e#Vvi?;e%O9oo4~eKr5?mcP??%ku5|&ds-zpHr{6 zUaz9{xAsBpyZ1Tt%H3I_-$f@Y*zeuo6Zz+FRidQsLZiJs6`E5stqL`#zWjRR^a>yK zZ%)=a3ybD>?zz%?lS^Rwu0n@xb1Ec1zKYX%@1Nm!@8jIe>U*~<Tk7`Tet0$SPuipA zDSprX>nv6Dd3op1;}Y+}a}yrTQG8T+_3a0-a*q#T+jT2;|7JY6ey6<9pIyHb59aT< z&VBD?o!1Aw@Ap~vKdp28koR4?>3&(hc+BH<VtcOtUH72;?r+xXyX?jH+`p@^<J{l9 z5Bl%ebN@SXSL?@w-#rif@6OYE`)8)L+lR#RH4o}{s&m$zxApzN{x0dk+LZdV!~7@y z%|7`rUSPk=*Cm}lQdg<3J+eN)_Tv|~bxXG0Uu%A?{p^)v>_YopT+OHa5H;Vnvgh87 zcUpJd7u>z;@y~kYzdN^XXTHB#yJY9=BiiSSE9M^2_udoz=)CGb$E52&`O2qPtT=L5 zb)Hh;$|J8;@2Py8EmW_yaryegg+lz(D%|SZ<Gac&Di@ec-*e)jtk845NslI0G#=si z__O)QTsH5As&yfcmWo@)D1Hp<yg&6vywLZ(F0+EYYo;HWcEsQF&#EK8Rr4nN=sEIS z#iC~Ak#dhcL65!)y`S)-(OdSO&c|q>dhNp1M>aakT+=JAXgG4;qo;eyt;+RB?t9e4 zJldhso<HSBWM{eOpNU6$h5oC3e6aA+jnGFkh4d%=knG&<{b%lx=W%*xJ5~0%J`(B- z_uk|BDDfoUb?-kvMfv_~6h7CMeOEN~aHr6JUDs8Ih3?PQ+FITzKjnvJXZ*y9?MLK2 zZ9ZnTr+fbi-F0}ms@|Ss4}YutTYV(oYYp$@TeFThtIDZ=^yv)u{4@24evI~3>&|}9 zH|Hk2+IA$|V~+mEoKD?NbB{mUbymix+|&N3*=aAOx7D$;y05^(@ll|V|3nLokIF*% zlYiKD)=!A|>|HkD2Un-MN6qdd*(!BzkN8#pMJ0uAJ8Y}6FYJ+_(D}(XCV^_LX+Nqv z>!<Ii?>l@_D1OH4f^A3YCs`<b^y-YCu*2(-Tj$r;OZUY-;#TpSc0>PTMQ6I#9)~3F zM_+~hJ3o>Y+OPjnT<E{b^3QDT>|S%UKb{rRpZLSEQ(JZ2#2@ONy%YKPCsj;2vRO4w zWuxxL$3pv6KIV1KR<YA9teJN>+|$PM(Um~Hc>RxOg~YvLlt4Wt&5x&r_Nx}oJ#yc( zCg{-*>7^##Hj$5Z3gu7u;o7-c<(~e>>q72Nt@pS;@>jJ}-DnxL>bB5xkDBR6POJQz zeI#0C-NYXgj!e9mGq3ye-1qLAf9jm`o#kfz__LYjp6Z^%cAeGUH4Be;3N7zXyne{? zglY1Ptp$8WIXtspf1Ud5Tx!icBbP^lzx?ysXW!lSApXvG?z}>Kl^@~XPan9R^ykl= zkI4n+J}I9qOzSylW43vx?#F(Ubk2_@Nk5F{`Nf3qX<Gi-=&Wb@(kbV>3hxHzwbz&L z*Zi^N_l76`w?3(tsZd=ydG2qXrJH-twszJp-gzT>%DMX)^FmKwo~*s}`IIU1f|dU9 z$+hpDr<Z13{_O}?-^VXPca93{?^yj@>EK=4&Zg>$Hm<(UOE}&=l~ml(pWgG}vyCvz z{MS1}3)ZA_eW*KS?fsm8%6*Nht3Rzbo^G!E-sf6YT_9Jbw~@X6-0H8g-DV#zT{`WO zG@bqV?9Aki?<#H76ZXwCo;FqU*nIEAB%6%GACJUlR374yV|!~*tfO7-^Iu2vkB#OZ zE;+f+n<lj%FMak@C^|V(@~-04i$0e%7tcJz$85{T|Lu%m%|>;VA42{+A1KaCZ+L(B z$IqSTC;75XxVud#-l6QatBikH_54fqicg;!KVnQ-{k}5JV4m8%x)}BPk~jOWZxmnp zWxvLy$!`jOaGlR?3bxJX@cX<+^+(lt>!$TzWd!Ct%@nb@b6LmYwllxNkDYUC&+XjU zWNhQyP_Hn1!<Q1d_R9TpaxPWNJp0ads+#HJ)G6OX9-YoKJzV;DhU|wsua6sAKgegv zlQ{k+K<%dD&F421BbOxh9Dmq3FXo_m<tJAEuXj``CZ%^hh_>0xa{ra4P|a+0g}KpM zKi5xKm&)9Kq~w#y9ly%`6F=?iu$ceKS@L7XD*n})?~^s(*Q@TE_~!E=iyZ5pay93- zPW|IPd2LzY?}R`3g})!XS1T+2eMjr&bH$T({GBD|zFE}lPT%{$+E$wN{KpUuy>EMT zD&{>8J^0x+pF8eJrGG)^a=#Bn=gphKtLg+|-dU>su<KvFT6o{)2Md<(elTIV{)gKs z(bN9rpKRNFV%z>nwR!5hE4e15Pqf`FZV;XLL+(kuPwkZkrY&!6Hsvz$H&^c2(r{Dw zvZV{xe63dbbBB|y+&_Hy@mp&Dk(;dl|Jj(WTpcXtsTAK|IiZ;AM)Av#hyVAy`_TQ% zv?=~tJG1`dhwCRla;%&CyI<(v)Ln<yzgo<ie_5UD-n#qRN8_3PX!kGo`C<RiabJ$j zt@%qWi*0WG7u-~D_i=H^_I%|y_tM{eA2YUpP1$~+BF+3v_{WMZZ;QXosn`7Y+2qrP zB?jLo)~l|)TGR47IZjUY{F|PaF~=n@f17dS^>O3h_jPX8i~jhZY7>2VtCtq{lk3Mf z|5+#WGghsz<J#H}RjYFaYW9acyb)g=w_$DWv_m1BaclQ#|EyQ~S+7{pdrjd-;#mv# z%YGBiMpm7h?eLx{qxO@)qo7~D2Mr!QeKOzLQR=q0P5h%Dvt|C-=iIF<5jpye{lltx zc>)(&WSKdVA`Yu5aIWUqr1^W1LgMtJ8&p*oQ_j0FO>!`h6cA~WI@&HECMd|6IN5hX zY=Fy=4bAos8b7%_*}Lwx>HS^LKb(%AAN;)R>e}13mt!x_oL6=x-)Omke&W4De`G)F zK6~J?O)fp}=pXLS%FlwBdk@bHH+Y}6@6esH35D^`qMLh<3OqJCV>)xTF~8iYYn^8- z&#<03KI8w{m^6v#V1w_eawlzOTJ}~-e&%~7e5T&e-g3^`%`@Ut`_lcA&n4R(u4(>x z(!BSzL3zTv^ET5e**-Hp<DY46_&zz$qDl7fne~S5#_ERYJtlG=#j1M^_8;HV`jh8# z{29f-QzyU7ZK?`f^X$yq6Y&+5ZY!_r{GG5)LiFk0{VT8kc%kvWc1=gswZJQn@0$j^ z4GjFXd;ZeB-`LK)s#{vP>a)t6XDvJYLTX>lkU6C|^IFX7y)_wocgFTd_w`11_J(rS zZku}SZ;JDd{W<*ZrxZUZSaQiJ9zXc_iAlvCpEmUqtOaXgn2w)(`XObf&^)E^gO{JU zRkYdgrJvYbAh^0@X2bjqT8I3j&L2!&!&VTfy{G5pa{fJ@e(m9>D+^3d^S4LI9}v8j zwqxg3*}QDo=G&3>2QEL!FA)CCCzHoMmA9fJcHf%L{)TkRvk!T03f@y=-}LR{2Q5qa zdrI~V_ort+{B*6XV#yvB`3bJ4S!+Vr4qtv!{6S~A*c`?9hWDqxeNetB8mA~6`Dgcs z>QBno{;}@yc-MISRPcxPPe!NT+TAwWTXR7A$)``tZ27;PX0iyEYrP#U{y^q_sqo|7 z%<sS56lMB%EnG-%gYiSzZSwch*EjCpUVhm9?fZwp-!gw}sg<@%KE0fIUxIim_uES! zN_Q*O9Oi4yzg7Bx)6aRw>aRj~4!>gkzUkMYy=&_}2xK$Z+>zq<-?;41```Bx-)cWt z9Axi(=BsC<yq#`*OZ_C<2gOAie^$@o5I?m<;BvZH&4ur(H8-|1+daC?KL10kQS#3@ zU5x*quIBjvb~T^<7t@yiA5B~Tzs_dm-mM*TrH+?xll$T7qa{BUcr^EO+SkN9IiP-2 z>c<?7hV$LdAJ#vzsPX*65-(={F#C~QP4J!edU5`T(T7%ve8>&t*{AGv=(`KYpY|18 z|21D7`tGXyqp_pmzu4P{?Te)UczkI+eardbr*9HFnru1iZp~wDzoA*6`dfC#roBAt z(w-kIeN$s`<{tm`?f!??zH!>IwU#+A*}moWEmv*!J2&;1%ePh^xcjEApuAe>&f$4{ z-?s=qj4R{2bNe69yZra<%5SqjIQ-VLId$#){1V$+dTi^rG(Y5jd+EdRGL1i-cNzLN zM;{1&bMnLOZ$1^P=JNP&4?kf1CZ=N9Uaon$@0*0*yno>GTVhVy{l@3F6GNH&wo4zD zEHkfY{A;!6f*eQst>6c)WlVdH#Bu6xE<dFG_Wi^3ImRD0`zgj8zj$6K^mxx_kvlh5 zvhRQ3a=>@4*@tdFl|P$|x$@roG+0{*KkW0f*>mh%%jY*SKi2(K{d3?RqxW;`8%2Ew z{4LTSC_J~4d2^@H+lv2T5Z~VmW|b>LCI1~*#rVBY>7hruj?LLwZ0EO3dJuWdsbbq! zk#{exna*$4JH)+qcEPf*9C0b4E5$zSUlUd^?<!+l`q!4_5uF8%Q<>|tYx(3i?Q7tV z-u=MoHAl@!E9U=scaz@oKhO^Q_?&599_wNAH38S|$-R3a%~1YrFK7A3qlfR-Tz)Wb zAL|E(`&<<Z@<nZqY-g2wcDmjDhu@*#n(q%Y?F6Mhl*DuHm=P+yFL!H#;oU^{zNYR| z6+bv<GO(ZAS+F67Y5Ju3hn7B#+Og&i%k;_74+VBIuhZZ^c>dJn0@Fy2_EYtTuRe|c zpmchr+z0tGgPL=7QvZ(T@%T@E8!LXH>QpqlsN2f(`{I_oce|^+ec~(Qjq1lW_N!b? zPg<CK#cK83CDp3QSE@dwuB`LlWO}n!JmkCA3E3sTmR{TU#II=G>w_upk29#f_*Sz0 zZ|+;4>zP;T)qmyWa&9f3b~Ep{*eC5zw%5~7#y(+Rx4z%-_2v2*^Ch$Y*nGBpcKgiH z;~R5l#wWcyY}5Kv_Sx4n%V(}PX74p$ckE7MB}Xw&vC`+=XXK6ZrPgQNXxsO{B4f{X zv+&>F4UV3fpndiK=ioCwxBAO(Zd-YAjsGW|nXiwn@Bj8I@bv}Wi}$4B*S<7!n{D@b zvG08L8{6z(<X+wN-sI?$A6KmYa%Jyd^*iMCzU(vCBmdWL_?O!A(q7}(YxlLh&B=Rm zug+SR(sOfLP|wY6Vz<As?p+)8-Sq11Ra@gMZg11Qy-oUdS;M`swT#NiXZ9R>Rkn4W zl>6K0tI3~^h}>Ow%{Tw`#w%8-tF}cg_gVa-?~84B<rBXz6*Inn*`}4YvM)TlH#O(Z zRV%l(f_BSon&0HU`q%x9@A~f2o?T)0o!|aU>c8cF>vwE?s^Rq&clWB5-~PX3W8Knp zUkl->`WFg=suumz>y(a9TQq(4u4}rdWBPXP*=F@WY(~bj=;B2)^Mmg$@8Z1v@zov~ z!;5FOPwoqRJGZpQ%6<Q#UvJL;l3DvW^i1@Xdk2@_dc3EiD#~$EU*Pk1DR-A!l`jwQ z(W>2ExUetq?My4Tx$DJ!L$+#duq)1<>U=M8ZQ)+W>b<Y?SIn24ayu^Ter9gbZT|`7 zk<l^n7yhm;{*^CM-@5Pp=lWf-a~J2oEWB#@%dER{Me>!OzvN{XpF7$=<NxVraW>b^ z*s5H+9d<ON=j)@ZJ9h{j-Q#Gw-c!!uqi^XRu$%u#FI;<W^Vy`c`(B7-e>?iRD!TOF zTk-5yW=7Yp<a(`H8J)CdWpve=mA5ZN1aA*rbN+k@->W(Q^m9x7;$^e@=C8Gi+gdN2 z9jE_0>Fn#LEZvrp*>U>Qlh3|>YOnK5-*%dnxP8LE**_Imdv;m`Pwpy=v)5V{G{^E@ z)~0V!g>m+;{>07R={IL)c(LsIThT{mexJ{`D>jzD<jU<;*$sYY=FW`27<T@0wduLv zK3hBgz1g@sFT9?2#%=HY$$M^eHchwg{J@oN_@{F-)4ww(TR+d)`@!lt$DVtZ%=ra+ z2c+k|{-E|;@6S}>pu;`UYuhsUOYgd#^?q(+;}`pU$>slNjvTGLuNrvWp7ROom-oz) zPg=kHZB2dR^Xs3JT;;^Y)7JicQZD=bt)q-m`o*O;D~q-*uKW7W?(OuFU-om<A5ArW zVa@mS(bdAQdbP(FT5Z)|e17}vW7WU?t{T|fyRE+}Oi*Xp=Dxt<8rS11EcZ#hf4jT* z(3{=6Owa6F-977x^)XgI=8D~y1Fm{~U7Xx@eD%(p&sj@<>mU0Se&4dA|N424lw{52 z$Ev?;$2<Htosr!&tw8sp6rZsE;ZoP|9rG%9*Xb)gbW2jn?oWDqab5X^m_3E(19+WZ z{(GESRJu#Qa{imY4LgiGW6OQb-kDteq4oJp=CPS)vS)D5IB#%2S<iBA>~W*-DRq-A z8!J_d89%Q-lhjry`E1r1_nG;I<ugydt2bPqb}rrSRLqG#>cu-Fk8Pb9ZM6TK%+Wo4 zJAdXpUUx=#hVV@Lw0mc2`hJ=f|73X_b>{4h_*A(W3;LEumAo~vbBs6Nb^Kln%ip^Z z*DrG3d%dFf-ZE(1oi2FBVJMoXCiLK$5^tWO*a6+v`=vcn-rtSQ9rsR~eX01ESnxbw zO|$Ul!E>K(Zh5+yrFL8DI|aMO>aMLH1UB-$Q#0E<V{buz;f$^G)86hsu)ec<o&CZ; zdken@{L9t&|M<!D7dOkNXXw4n*j@d^?B07vb*=p_>pvEC-rE=Ocgpf_ej=Z9l-An5 ztjn0}vRVH2s|wTgWu3qN--+3OX4~6i+hkWgzFN~B=#wvH?zVmPProaFSNuG-X@-mJ z;%D=gBwzVlG<jz5jOQv<zqMw)U9V(%_8-@bdB&XmVoM(wDzWs5Uwz=Yh|R{e<=|r% z<%&HSyvIAXtvUZ~U9j-Wn;a&2c}lj@jo+@jed4$kU!D1GamMc8HP6CV-mO0O<o=a; zZf_kuzxXg$`G)#^%3AuXUd=Op`;K*!zWn$vUzTqAvd<>n;JnD+2RD;8yk50RUiPw< z=Tn=xpX#R;&G6g!_iIGz&4|M{BMx6oSNp7FD0WV0a?F0m<VwSjCfA&#v^$SQd2F0n zwT3Ha&B~lLD_<1z7SHo&Fz?v;!EGbMKPR2m{bH8u!~^Z(?6WoIpVyqfc8b58?CSPO zXZ~58|I@KEWK$vYv#BRn%|HLLp7YbBy?<96i<-V>eR0fs|8LKtr=K;Se%4&vGCy5U zVD&@UB<4NAIgRC=OxLAD{#V_0KAF|`)8zPkjqNpEdsh`#v_0K0`RNAX+IQ)8Dtw3T zcN>2&ES$GBKH+Way7eFjs0M}DRcp={_+(eL_lkGmPT2)-qb7a7w6CIdPyZ`RgQKgL zze*42`j>O$>w_uB@88znxHHDdZu!i5vF#7zkJLZle&=cMz$s8>pN7^oqrV}khNcld zkE52&=lIc<!Tn#)YSWK-I?K$vUmpJ@c`WJJh8Y>xov+;ax<_cmyyYvlai6dc$hG$h zJpNp=ia*}}>z|4D>dPkk2hQz(d23Z&-|Jhe?kCwS%$|KVYxOPvWiOtuxNcNBuj@{i z*E`7qL(BVLMNi%A-uUdo|BaWQZ&5wz`l9&Osp62lFQqJkZr|pq$=E&r_<bqQG-tMB zT$7F+EV7IVdv-wdY2kIjRsOQ~+lwl?K1q5$X1n~~_SnSvi_V{YcIIQ&(nrD1E4Bum zpW}adXKCurzbA@*3qB5;dhBYdVvMt0Q?}RE9kaZ5R({+$C0g`UuJP00Ry*;#>yPK2 zITm_;FMp5phTZ!n9P3Td+_7=ZnOpM<Ya5PzeUyJ`N219)<)YYI?n{G0`4U6sU$}Do zyLad`=g=?reWbQeGkqZb^z)j%6JNgqIm|G$SK80=i@JLN-(!vTf>Vjt{!exmF28+q z<-Lu!TAnW6qjEKRx9Pzh%`@6NpB2n`!O*|x{q$-%-CrBNITrMEB;7uCAlX&Mrf*-r zT!&|hq2`AQL-{_jnL2fnHjX;!Z+EWq54gK$=beSWc$Qq>;S>DrpY~oCsonq5*B!po zSeZMk{LE^*&zJTj*G+w0ni+TYapc+1-@i=OKU*DfHeB)i$}^i?<ZPmA829UMJLs7t zK1b`@!OTY{HvTaU;vLcj({}LwKFWM;{~F<fWg1-P#Z_bLS3g_&d5=SB_3V4b?<Xw3 zSbEDo^I6r(7cuMYwElJOjH`9JQ`dF&>nq{YuNL3xKL7QVaM1B9>MWKuC;qIg5Q|gI zI`DIm-JU3u#_OGFAF3`&{tNojwqJ-j(mwx?wCj}D&qK~xwQnoFDieO`PW43lMLYSG zs`nQdM4gX4x_{|&xz|=+=l}AWm0z`UJ8wJftnIZY%Dvl9ul%5A$$U>;_(8Lg=s&-- z1NTqo{FoHOd4GcZLG!1}KjiKd{O6k2cK&qD5A&VucG~`j>`!n0P**we>;K)aZ-)5i z$Gs1}yY14>H^raKzueo}x~KP@Xr1>xzxQvKKijmGd9!W*-nyCgDff=l%=szw`Cj=A zTf1kk&m4Uw9iEnVu%=<B->y^p8=l=Txod59<<8;Ddy^lpd)-m;{)Weu+a=fEp1rg; z`LUk0*}Fya>b)MfZ_0=`z@Or~W5-pMGe@?xv|eTW7Fqkiy~rjfIyln)a%_1><*UNQ zm(I$pPT6=qebbenFXU{US1SMHui6&$UMIBucS!pQo%MXH<~K&h$zFNCpXb!4R})UY znjn+*Y+g@|SM)K_HLeA&*~&2|e{ro#dV2VLRP}?bYm7fEUkk`&&27kzvfnAUrs(ox zzeSa-7dJn6Hlg`tWI^PUNndn!OnnmcMQ4Z2D*wnTvj<_ToCWSGTX^VselPcXJ!{3k z^DkztxPS0x;Pn)Z)t-v0JrzH#$(A(VQrA9zyG(iESK+7ckKS2$=a5GIOyBFeQ~X!v z<gdAvvqtFMwxyfDzGuH``k3v_JZqiDPs1WDuCID&<@0rAvQ_%(!s(ZG)SfuKBClDq zeQAlmO4pvAce9VA+wap`{q~!&=kws%PZ!&$-`?G}vR7u8@ppl>5BDwNz2m=!kzdrX zpl1fp@lKYCO*5GLMYtbsKO$Ap^MgxHpKsGY|4q5)H|Dz9ZqDtjQnQnor=fKqzeB5F z$qGJxk*yCr7b)6AniR!4{64h$q~@x6@n3fvyF)&&E7ALHzEgVcW4YATkGHi4oHx*U z75>&X^KIm<^|z`!cjr}$e&Wct|FJhY;_LkhkJ^K)x%dCfS>AttPxzT@A6K<;*1ew* z{?#+(_OjO!p{sdh7iVp9*uC_1Yu$Sb&Odct<#*@3{N6Wt+SfCMmxN4bo}8m{>+s1% z>Nf6Q+KgRP=BTwD{Cq@1%(!o>`|fjrJ6~=z`+4^3rM&&+dzZYb>9OhFX8rp6KJTS* z+|$3_xw<X<OU>2yp0QUy=jxrQd3;l5>iVC1uRGa%;w<WEo*P-<sV=Jb^i2BOnd_Xz zFIP?2mb-PvwdRui6{nM;m@n0?W9;5rvub0_pS+qUN$daBO`H8`$I-aFx}K?L--u^F z_<oeFqV<PVoa(p3*+=<5uoX()Q_nltezf*S$A_!@KUQdj-9Iv=?R*#4hsr?FeF}#j zbT2a86SSqtUg+(Ee%JIJ0bi1Ce`~ZCZhlakBvj+D<N&*?)alFo^F=H_@F$tpMCGI! z-almDz4(Jwq2xV<cL!!4W&V-<(W$v%zhLfz+(pKFoWC@ccQNw%%+EJ9sP)TF_;u&V zFP(<%-GA5FFMWL0T5j9rkJ~!l9hFzx@BRJ7`AM5wcJ<d6Z>+Nac=`7Y`4S(!W!FO{ zs;>H*S>?XsgZ;U4Hg>CCRXs3%zc29hHTk623tCyLk0qU0bCZK>(-d764uu^&lV^$> zrObSImPPoen4>qVy(p`%2q$BsN{6;y#>D<>OZ7wxo3mCPI?tcCBOx@V@xJZzd*%0L zs@(cE-TuV)x#jOFpU<m)xAVKN+~+8VdrhC;$xPY)pjcn<N!a=9N$uNK>}0#Xm*cDX zBN?6RMI9%9h?%l4j2HEJF0_`pc2CIboar@^k55Nmk&#SV@o!po<rdeo6W?0#{hW1K zH>)pa`41lfJ%5q+!v3Q2!tq-Bl=`~zJCYAsUw9~eWa1IiM=Fn|yzrkR_Vb9OpyEC+ z9<_PeY69nlryk)x;`8XWtL(?5iHdPb&xG#ltW%t)C1yM~)#tg{qZK<Q-w={LV)&7v zaPf^Je|~a*{_lG7b)rs*&HS8$-{U!c=v`QQ;xS9j|F?cmiWu)t{H^(^qH+FDh42H} z$87BLTmQ_|NQl4AUpc9v_WjMZ6Qrm9IOE26N}Ki1-TiAqpK`{O8=Ok#tXO_bLbtt8 z^7g7CwqvO>muIdkP3Y0PXeDsid!}E|Ylr*knX(n(3A&GWg-vZ|x5<;+XLjN2-s>7+ z>@BC;XYcOpH`uRWcg)74W=*I5RhM_ka-KEQDwRGuY_=~vA>$I0!>6ogdR*8(_nyO_ zmYq|6M1Br?^!TjVqxc!+Li2OhDZfj<=UTJsr@}}5v&%dDjpr-B%irfw)Ay6DaNo|! zUsJ_D@_khO==ag|qg-Lj{fGWXP9FJvMDxhoXOTx%pH)2a`fT8l@|nRM<})}S?e?8* zk)Wq?FG)|;Z-#cK?&irmj_v8+aj&MsBH7OKPR>4unx#8?D;DmYTd{HH<R5Is`X76r zJwIYTdpV0tTvl60z9GACzd^h3^x2a;^^LPT+h>`5%=j$zi1XR}j_)1O9rl8=JHL0T zcdE}mFSPvZ+9R9KUhgdLD(|>2%05Fj{=(yx?UhTOpZK~qKzQH5Ul+Rm=w55*d-9&; z4u780zqkW`AKaf%-?0AJw>L+ARtsdGYd_J>vL-ct+pgbF4(AvDOgY9Z(Vt+``|--{ zo5rH2W8=>JIB9+3{tt=&-5)u%Zxjo5`PQ79c2YmVX4c1)W5yHqs@Vuf>}PtlB(Z6a z<kLefzbfx?g&tSfR_`!(0%!Iwp(h5f?k_A|(6%OG;VbDYU1nP@UvH^B#CFAA?slHr zzgEubhPAtNuk=nYjh^xN_KmIglCD?zzdkHeFaOkf!?yZ^PvWzz4W{pRlApGi-%a|( zdI#(Om!BO=Oql&oE^}r4g=P1DE8jeCapBo7;}vJWKHt7e_sr|S4CBN@#Z!YP=nBtU z-D5acD_8hg_@1+0?U$A&>|3&x?@ag2Gtb`7IQx35-I?jGQS#4DB&BV3eciAp^z{Mj zto-B}>&H)Xvuw34z8BHHUi9N+y3Lv2t6qMZ{Vel{^;xb*^|OLI%V&E&DnF}wM1IEU zPJ5Hv9p7ig9+98@UAR8Y&TY^6nx-GxpIslVKYRDc{TbCA`%S+K)u(^s-I@DaaQ42> z9ku%yKAx{hJ@S5ra_4<hb;G&cs`nWUuYA0DsqMYOf$zclTlR?FkK8N#GqtAwtNMxC zJ}X@BO+B#wLG`-dYg#teon2#5@#4Zv?L?pW<9D<pPR{dpt~=af>n~HfE!l5b;J(9q z0=CWV|5IK(<H^z!`Lj0k-#YOo=kPZDhcz|qmD+KyFHhB~U!XsKZAc~4dzX9LgPxvD zDeI3HE&9BqD{0b)ojE_B35EY&r@HRr-9t}KtJd><E4^*^R$#JZ#r)gymTl*|*(R+1 zP<e6TiNcz=k|66J_RQ~FSKnILZz#WSI@iuq?A4opt`I(+?l^th>-R0+chqL4*Ji5U z*Za29=InJ(o4eaDo|XT&Vm5yg_s5NoA|Kg3s(iHXQRt(CkK~X1J#zd=ddK<B^CIk> z^}02Q?dQd7J3b#>-@*LI=Fx^74Ld@3l=Xy@JKMWX9-01Ynecxfl^K4vmp69)?$~)m zy{qy_?a`!1#YcS4%zt|3zv-muTMzG8ZDD_dFWE}+_+QN@nilW!75tAD-oM;;{^Vne zx{L3geNJ2*a_>-t%s#FsYVS_=JAdQ+!SiQJ=#TByYbHNm^vB@ix+(3Ew>eJvi~e3( zBk@UWi@odX0~NlpOP{g!TtDiwKkD^?8)vUr3EY-CD{x!oapdYd`%GSL6Zo9=?Els? z|5eZYzdiH6?3&!=+xU~O9Ide3eNAmGfAV*Y-PbO^iGrr}`CI=se68I-?Qlf>+V$M; zqyM*k+}^W4dg*=XqpwcxwKD%Cd3x`P^G`qSJKm{Xb6&vz!{6SM@l*f&)%vqW^!B_B zQtu57*Vpyh@O{?WBxPTIbeEw_rOdJPQ?KUDKm2||*|K$E^F`kz)G=LO4`L|D8^ulE zd~ffOv-i$-KCk*NeEz$fTwz7y_lifY_bzveSAOou|G=iSZZ6Bm!}p>dMeix@h~D$| z$l80oM{@6-J#$X`$mhMgJJ)}%^SblW)}v<o_Zd#@??2A-s9A3AP&2<gW#R3zt|xjO zYx~X{TZm=q*NA;#J63P@@9)RhDYxT(+<E!<>V)J-{WbCT*Oxv2y|H}L{*Q+1(rUg) zZOc<Ke`L+2pZF>3*yf4PD;~xzsO&wJ{^7INl>0sP!M~fQIp>J43;fAr_-FC6)J^@@ z*9ZRmY;ihwf_~KEPw6xJJnfPzmd`t_dW`Fl<1wj6iO1%5vP=6L{VbjozV2Xp|HX63 z*#+;r=9lelkU6&B@a=(pB2otT_b1f8-yHUp`<C4Hu&=4BpX|&2`tQQyZ>id!>$QIx zgzd2L+v6OgXQwnz<D0O*7<-4l*gmE9<(<YI=G~G<`nkJb-Z(P7Q@dmJk+W-Zx82CK zZr>59qp&YXM`@qe9T%JMEkg0SVM6DHXLqa@^cOxat}mc3aJwVDyI$b-qxw$iqu-BA zv)Fayp;Vz&;c5-#IK4K(?VXuN5(_O07p_p#6Y@PW`)JG~<)ghv+`GRX;Xc|H)c#+? zOh{ksyx@I}dn$2CWrF&m@q)*D53^bB37q5dXTcBEkIqRJAC;4IKB@&e|C!+-Xs?&^ z=<Bifo$t-p6~C1>7tA*_6R=PGGxdk&W6?(!j}@o#`5SB#3YXg5sc+6Fc)Yi+SvD>~ zM7Tb!N9|s^k5b*q47IwOJ7)a|eO&eEdau|c^B%KDZ;wSil0C-uXuq^{=Y5lTiuW>e zRR1mCIQK_xvie84Wd4uU$Ce*ycDc_jBd7DJv%Q1k<HSc!k4`43d@M<3`j~vo=uuWO zdtvWKv%<9>ISco0oWJ9sg~J@9Gu*O%((Z!i&H9wL^-k`T?q&EWvv|S}uEjk&PVVT~ zaZ|$8=DLJ`%~nC>d#P81-kar|JnqbU<!kPNs6V@P>#mt(=w3NrsHC0!QsYU{MV9~O z^}1JXe`I=<%kxxpQP8Q^6Vx9(_YPkZIzRUCtW6%*<2LM<cpAv~pS^hLG-u!J>!y-f zx3rdho^Y*k);EJw(H}Rj(apYl>)*C(ja8rceqB>bnE!d<G-uwQ98c^1h$Pr=<9%Rv zVfVSKhSy%6->b@fOf6ad@!@Mb>%LtsTkvnrCcn4352KzhIQQ_!&-#X!EL&w)cq=Ze zSG+90`0K)FJ+5;v{?Ivo^h9#OUT=l|qooGDxyK*={<_Xd&-{V4n3#d}^+h#pjQ8hX zIQ3+EX8nR?ch6N=KDL%vpHRC${&wT7uMDqGPb<yoiP&$K@=Jc<zp6La>#poP-SEEY zLs>%&^S9SC_$J)XJy0>XrKX?pzTn0Ehqo59y;}YMdGvy(0n&eEPo=MDXFPV0&wQSE z$&QaQmmeN0&T5xFzlzU%-sUZ}8-i~?Jofo}6yMg8dHck!oX?gx|Gwb&@8x{k_ix|$ zZ(Zu&z5QRyCvW2~lS}<u+jnxl`_Iom)|_5_;~VRjx3+7UOMlnC<-c-_U!wlR59MRk z)^{quw{Bzpq;Gv^XW4|4{G~gJ->&d0UpM!{%U5%5a9TA7KF`r@|5f9+{GT85$>&Dr zl56B1-!IwqGwjC8XEy?Jg-i4<{R+6<ZYX!}<+BeaYxzy<tu{xV%{iB5RknP#{r=Y_ zpVI@E&$i!Qw(IBSRhQ4s*Go&cJ+=H%g#DQ({TcR&cW)l~anaAbe%{NH&*{<2XWLs_ z-~Cg$|MJ=S=eN{u*v$X5e?h*z!B56o-H6A0Ms`PjRfkN!eP4L@oqzMLKK*9C|Mc7Z zCEoY5J*-<}-_=MSev-WV%GQKjspC8LoPPWMi{AGAVbgElzZsiX|GaGH-@ReC*{!da z?);o8Ir;vjr{|_`(<|R+bD+d5tA5?IKMIfACG5}q5Ii<p!v5CMcc$-bovt1!(yjM7 zb>1w?=9xhMbJK+4HR<;_EZGC=HkD7GQhmMok59k*DgQ}#?l0aqXB9)F?Fvh-$Xuq! zCl*g!?-tjvhwEq9ljRfa-S0Kqh`fK%w}X3!(9?9K)z5EuPrPb;Blvw$_HUhI-IDnU zd!~NWJN7^6&Fu%DJbUU7R~S6z>=Eu+pIoE;Snrs=(Y@n8e(a9zGuSut<HYYf{@6ZF zeqZ{N=a}L#Wl8_^nDZ5KkC*mbH~gplc)P^=)IZFRliwBpG&xpxl5=jm{E5ex`DZ_u zG`#fqrryuzML{Awf#**%otIv8i_u<Vr{8D2n`Kj<Ne2DvdG>FT|J6M{uUt&Zz1CgW z6S?X7M*Ygg&m1?s71N&+EN}E@+Q+(M=Z*ag?b<#r?Xm5#PxzyK>}b#X#5;#>oUc%O ztlHCW920k<wj=HD#fn-T+1wnDW5Jx-QtP`@jRJ3X?Oy(<cV^D2ecO%0f^Tiwym#)& zlw{t{8FL>zzce!<Ie3fR)QmNkuQNuPNUxrB{Aw?6Vd<Q{o06x?SS}@mCU4T4sO%Z> zKzq7|`@v<ZtQ%kb%1c{xF=dIyB>T&!+%A92*tTrrLbLs=P72EgO3s~;mE+Olv8s7u z>DiaFHm;P2n4b|lF~_4~(bbz7dqd^dZqq%@EaGoIxu9&#Iz7?%7fU>p8aEa8mS#k* zN?Vh|zm@Cuq&%<HGuPY|SnprGXtS}V_3AaNEgFw+k}sZA*sYfp{Vud!_4$`)zg<nk z_LK!Bi=HyNvZ*{jaHrDLoD*pmL_efFNU6Mf=77}cK5ug)=Jv>$w{o;>1r|-n^^1Pa z{;B!r!^ZzB<Bs+5ANd&m|Jm`>b;lkzX4r(z_q!I^S>x~d?M@Tpzdc5Owx`FbNl&^t z?~==^gRfNEvy-;vOxQ51?nzAZ)hTZ$-rpI1;m{p!3*&|2zyE}+tF-kjI-9<!GjE&Y zrP+y-o<}X^T=r(wPF42{n^q?mo}Q^%R%|ufSayn;u!i~!hWe*xj6U5Fobb4h;r4>* zM%9yejf<b_ZY^iIa!>GxBIDxBxs7jJbS4Hoy0`S7+@p$BinFt}6hAQvG5TkF_Q>m? z2U{;6(zW&TC{BJNm!37bh~bjaxtVg0x;!uDth$!<Kz-9njW}!fpt(7lgzlz<p1m0} zIY`WZ=@X6PIo8+i%x;Z4|K%Cusj95&CxsMrBTGB)EnQ`^+39XV?7=<_lUD}QJT@rb zUbQ(%GIYB^>sDP$HpA*Px3aYx9n+K7UR`tkpFNk?s;n@#Fp+mjo?F)_H`?%Xd0qOX zFy;Bd*AE?4&MTizJe7BB@gbZ3)Z3c7UA9iVT4*7c_EADB$l$!Py8!FKJx0>?Q|HNl zXy<ZvJ?ODw#gq*jLP9qc#NDj?6ka&bJ<Ub6YND(DsSheKDO0vd6zVm)yRKTepP}@a zrvBy^sgm>5nuXU^Y*`|tA2f}VeN{^4`c}Oke=C`n>~+Z8bMf4YxS!0GK@FQ`oVlH{ z?dC)`CxzA?cTbIche8&WuN#-GklFXkhqFqfwA<m%g^2mueGjHOq?|n2ZRQZuBffgG zR9ag0lr0AN4hjw8mnR<A<K<}iShT}u@w_+n!N*=Em9U&hb@ygt>FPSrc`3+TM}$Fg z&88mvOB%-P$2T~zGfcOh@?-8lXQ_oMFTTXCU#7uhefRoe4d>3qf)g|+dB$bBUhVkV zY$4XDB(wPA)vHB?;p!o~PJEuXE9CH*e}0#K9M;Ny@?PFoIx}-k&f+hj^E^u5y1S&e z-WL?fIv&v!xS=GV%TVLo1-7{h4oq=nJnC{TN`&Rkga=1Tx6GOFMP}+6Im1%Rr?YzY zeY$GNx8iYvz+zLDre3itkz1d5tFD#3bW8DyoML;o=Ib5pGO4oD7R(9|zUpE0cf+Or z2QL?H+NHH|me;`!xuwV2e2UVVr!IIniMji*YW;MvDPk<#FWK8yDrNI~r)|mFxG8i+ zEZ3`h?A<brehU`}&tK5zzT$x3iMY_!2QnQ!IOlMjdN+~jCl_nz+^LQ`41z<lw5Rd0 zA9@(%Z<Vb+>FQOh<mOgOSGTJ0W!g)u^v>;F^yRFjz4}z27kg)}TefZ0vMQ<Ds~QgN zby=pSsl7Lt+h%9G>eV}Lt(zuJ;`R|uiE8zG*AhCtccJfzH}f`rTXH33^VKCU?AFZN zl~Q}jR=fVkr7N!&P4F?X^lplAU$Y}hLE*}(s+EV6(mOXy<=lD1Wud|fZ`P`n%tZ$~ zveK`%yt6xKD;LL69H#K|^X2f@iNDozD~qPRzSHROoG0!4GZUw6atr6kJlHmO(MRED zrRz$}7nb>b3S$sDdYE4(*>LBSl`@?c$!}74<`mW_M^_ae`(eN3%H4q2pm!^hO9QvA z|N2F#coG-y^8ahQ!)m8a4d_mPC#O(;WU`h`o!P^=k5pPyf2H(4dcxN5^LPBumpd{i zYo{3JE`JoZDDd9;XLA3hPm5$I+O?)=<@UW>jLTllIknQEFHm&G0=+egF~ZtY%EB_I zYqEZ4SvxssuTHQ;!fe&_{~=4SJJ_$CvMM}k$u%#t$T@3;@85q>EBrR!DRJ-qz_<;( zd^t;<{&hs9@1A>go?F4<=WAXpJd~$hwc^Cb$?E&;7VbIQyV`E)ov?CE4Q;jkb8qtq zv~y?de|~56f*bz7_ujcJY9qNIH~yV0_dK3U|IY7pbliBS<xpOKXXI>yFM@Lm@`FCK z+$m!_+;~TLmC41Iiv)60cD38DKJL~UsXpaiO6%OCwoA;PC#DxppBTiHUdaFYsr{oh zPZRh4ai62Z3+C)ioV!ghy^!y<ZorY7&sx5obvbgAukGtT^+y$2wr3*uA9lUlH}~sZ zL&=NWHAh~~`l6riu5dS)>s;Z6+lAY0y;SbJwQ%~DAl+^`B~-kmY+KISZ~t#cO^80a zJCvz5<F&K@dFlJ|nJdmc{1ks>^8%MIFT_qAT=T_UJJ53Vl+#x#CtX(2JyJc9q3*?m zVBeyw_F2mc?7K^y*!G_+@(FDUIe$HffBGx!6AK-meoStg?ykK&l&61MzrK82kby$D z#gdw+&i%7<f}S1;e5<bT?GpPsV7i$_-zuv>#h01(@I5@qh8V*aJ^it#Wx-yK2?^ zmrE8Kbu>r_xEm=2KM!1=x2R;7wx@IXF3<Akjf+#4?%uWAqcl9YREvLIhLb}^a*feF z>#Fs|$B*||J)SGMzWGIu#|6Vh%<}s0E%+V_cqmMq&?3O}qoIEN-fMMpg0Ct(sNeto z+jrH{bN90MUyI9ryY>35>bdiJV>`Q>?;d)qsr6}3@fjJ-Xtm!tHZ!vwGTs%qX_+Xm zxfnCaprTW9?JCXI+%*%YJhCxkuZ}S0{W7`c>hZnFUMJF%!*(~+9e-jq_mFIdx~Gb2 zrKtnwjMhsm9qK;w7lg20lb$H#F#C#Rf`Art;HOz$+M1_#x9c^8Cl*NRpU>Ny^2c;W zR$T4uuiuPT*0pdjetyQG=)msQ<({%&a**f7pA0b{=XI)>t4t{fd+K+G`&Fr1WJ8l| zU`O7OxTP_A4|m^dQo8x^PwuBgJ$ps@o2OIy7yG^4_iN{sW5$Pn?PMtCZ1q?q^3qGu zBEgSauqJ_7P~`W**pv$|b~%_woY<jrP=nX{V5h9k!$+#J?w@)0eUMsq;CEwwjok8` z_n4)Oe0Qx`mJ}AeFl$4KYRIHzdsO~t&glNN_hDL~w#%&ba#wwf7N{LtdX~5Mfyw?Y zJ`PqhSBCQG@lOa|n=3XqD00QQtE*aL5_iX+41V6?Ha*NL*NVC5+?$0#PCMVRE<5bS zxYd#GWa*PF9(uno-#Rj_=%k*=s@9%K8~ApeEIO+%8fbg=#+4@mOJjMWTPwD|SZes8 zXZ71Iw`q$%1>9u$w^rKv<*ddpJ<G57Tnx{ex9g<%<yFG-c@-=s$LRgKW}98+J;Pej z^hRjZsn5YPCQT|9UJ;OabFwN^$<#jIZO241r6sRug$arN@@Ul-Xv#UV%|vMN)C$pn z75yT+m_Bn}nA)(7L55N7!$i)o1Up7Gl?97mmMsZ!dpXsuI3?=U{LG-9%P$QkCYwcV zu?(4EVj%6CCi!N!3fp`Qmgg+DPp)`(x-Kom{^A0q*f}#g?>;eDV->sZN7m^%f@(%~ z#iBJY>z2P>GU;XBk9es!#+s3vWm4O={PnpsN5J>Np?$BGy#5)%!83<<5#JQ44o@Zi zNunKkN_<-%_GEYOKG-><XHMWFDR1$GZUruvUa#wW?%jH)Y~!`;%T~+Y1+3h$d6ss# z;HAFhSNgbw%3rwL@)cG4d*_+cKBp$XEgaFB_mb+8vg^wBESTiz_u<Le*{4IwXGPRK z^_q9c+_`VV!^Qh2tUh7)cKzce|GQ#uc6dDh`XY9oqG;p(Ain7-n^P^q4oI$9aOtwl z%)5u)teEWZ;;hIYufjdEw9ii~TOrf;sl=S)Lzds$bFC5G-9Hb`Ss7GWyf1{e)8_43 zhUWbN;+<AKe{IwaW-v{$Jg~5Bx6>QJ7<QK%OYSUbe(ySwzp63SXs4b+>`DIUz@V%5 z1G!QaEFHf_@i^_;;`SuHYpLwcn}2v7-VZKmoyuCgWzSJw8=a+>7+sjm_nXG+a2hW- zwdJRr|0RVftj%A2>ik4qtW1J)3uFZ~{Y2BaYt9*1s$SRf5?La-$auqCjz_BsdmFL^ zYxFiXN6gVr;5^TKa_;&*@wCpjIR#v*lbp`^i@Y)la=PL#-W7a#pWo9J4_0n?BlPn5 zHc|CInXD6fmLFzVs5PnYg(q*6@M(ecU5ny%&S!Dx%e8!1-u*Z_jr-~<HqVZGtVg}L zeC-t;1s?JaQj<x}bPxRKvUEpi-;C+(RlL#bFBK|vc`4dAPpIj-v@UDqsqeBX9Wp0h zGuyZpI9PQ$EqXS6`N=IT#V4Qco*-0H_`KS{uIOl-<Pwv@o<y^FA=U%=N5fV9b?<Lz zlU#FTde5roGnKXr{$=3)sOBk<aFp+>xYiloAifQJ%U=e_+qh1@+j#Zji+1HbxgUcH zi&gu7Y`*)XiJM908OJ*IsZ27TH9fA*i?Fcakq#7>aKCls$rp!)T*rS5oKLm0Pfbng zpLT77P{RhXGR_n6@hg5j{9|Gj=xij{V)6b^%FN3mKjm9~gxN;4S~j&N1Zw}9^uwm} z)6^MlZzfGNu#Cv^un~9~$aeqmiIOAn0c%C3u&qjQo*NM4KR4*a^j}M^T+w<Ol&AFm zxvFN-#7SnKy>?`?%{<m>x6bG4S<5fsCq*ZB+g#l3)hx5cmQ5t%+^LgRRo`1?e7n?j z<C^%fTB{z0AL7@H^(8OV@ffirZ+pGss&n9iC|L)oT~1w3wS&zLDsX;cX%{-75_9r= zSmL6M=|MdF&n!DXK9%VZjQw;<lJk~u)vlk;<$G?IEvaKY#l0$cMHk=n)l=5#HZ9RO zv2g)&_3wnju!n&>Y3(zczHF#9Sie<L<}9DF=HjdM3%h;<SubphaQL}^ui<-qrs__? z#EZgiW<C*<??;`;6?k-?Zz<oj?P7n7X5H+0^3bNe^kP-o3afor8dn5fbC^FNwkWgi zX=Sg^3HAi_DLsb%p^4LqqE-lp%vg7%*DkVEl5?q%MEhz3?bH=KuWCfoQm32~ut-uh znq0WlxWrsaU9tIG;Eka7?5-?Vi&H(=|29pMnX0nZm@hXupvLRT!DH6BMV6o3CVrNS zXI{~q<$XQ(io;dmm7lsY+5?}@-Td%J^R4Uy($AYxlpd<NlqM?&^kf~b6*$0=cFnRx zLrJ;!?KWj|C(kF7;?Cta$29yhxhBe@a!@oa!0*dLulJXO_BSP{Y`ODOrSPy>)9Stc zr~h&_C01ps*BrXpo>jH0;hTo_OtqF@G2$VbY<f$R9(b2FYAvigF<Ge0>wVTi$F5Bm z)l(B#8#i4z<y+fySR_<^udTUx_>4d%e~l39rpz7F@6Qwdt-SMDVtzS`aA&%YXyEB7 z3tmZF*Rywi-<_RiXyQC~>O~7K4ds1Tf-_Qt0*k7G*`%C07Dbj_)!AJ%Ett<&RZGh* zQ%jqpqt%qN^G44Eo2a{?k1R|ATol!xJ@UF^lE=fDrkowjG4ryc?ok(Y^@RQFoSaro z+^*Skb*<x3w-n1ZE6FRfYE}kboDk`;S}~=8KTgAjd3M|NCt<v6rQb+S^_x*p^!~zw z4;MWCXKd@<oP6u!q)fYO1{Y5KyLfP3BHzRZvOd<GKC(wH+<4(&pMStl-FRlot;dVG zn|b(odi&C@7fvX-<X7RjZbfN3yTfw-j(!^zg^=S<Zm_UdPW@z-xm?I1OnCj1$1xY> zr)yelo}E2;@)3@xR?*!Tyz1J`7Fj0sn;ic>N!8++-)E+5-up`%OBaNE_^Bjw#>>LW zTQk6O?c~W`FTHIiw>e#TuQ^R|w_x}^XPw7_rz<p)0^d%uU_4)4RXyQdd5edfzZ%zF z4>9k>Y>R!27Tx(KtC+djRwJWqMU8W|;@s2IyCg#O+ow-F9Q;Sm_F|dWTBS>0bDG!Q zil{#N^S?|S!-e+e4zUrAM^jjf1lcz42z2BR=W{9CY_f6{r~lMx-Njm$cWlWO^A9Mz zTU}{nCc9qyUbj?RWL(zNgY&pl*X>&`d3Q#q_`<zcuFq9@=XvC5RpgZ8yC$`4t~ivU zlUl|a>iR^Rd+ppQ7QXDE(?Y$pKYHp$IzDJ)T5vt-!~XEx<$3ZkGi3GsJx<HcXg=zu zs~xPWJ^hp2i=R6mwM5Auo#r*wy!cX*<=bnsS}*b@i0H>@PA_!yP=7MdF(zFwjj_>j zoz%1Sd&LsBD2N~1(BSEK%j|V8Yf6+*^sbl-v%Iz~&0Bj`!q%r#PAfRui_0R@qHxM3 zqwsa7Sf2Pqyw*NyIp1deq4uEQ+%F&R=smh=x$dR5a#Ym(<tsf>Im_0XWGqxkUi2-G zh2QgWRjNg8@UIs=Wq-PkY<U^H;i({-_2dAqJ5du>+r3QJ=2+$T@REeEx|EP-=7J5) zQB!@&rWA6CYHuw+b9TWCrIV^=^J^}z_}n|!sIu-y&Fh@4rB|=H?Gk9+EoJa-u`GLV z_2-($&F;rqr|R50Yx<>V>4ep1KSgSOc<B3N+0kjy3FfWS4sUUaJZ1LQiLpeYYI37o z;?K+{=d*K~AN^q}Idied)Nk3Xyw!6atvPk^R{x1d$_GrttC<pNkDgAt^~lj=NpS85 z2gYv)Bo0025efSgsyy8?W9M^~X_I$G@MT=z`f*OhS$*jh#g7bbu4{j$UD(w0p6T?8 zU)?$;43d$SM^lnk?X8fynN^&tWge@SulVd+i<W@;V<unj+{Qa8f0^=p+SGSgYw$IR z3A_z=y|_@LHz$7w-*QcJmpzhO43py~6fo|VX`W%KYkt=$h_%v4)Jlt0yF^1#)TW2^ zbuNdJaFfUJv!BC`?Q-s5oURz|>U1pQ;6X=jv!eBL)Gr@dwB5gLqUsEZJvI}|Le}@1 zx|f}B7PZ>Ft$fA$`nOrmwPBvk$~!0eHfy)D?b?yyvvbZoqn8W^ZrrN-cVy}#AFXpw zrzGEQd^7R%Z}$Zmmwb1`Z038iHtuD?rgx7@o>pe+%kgj9v#GwcX-i?h_MOH(ytdiy z#~uiT+Pqs5oTnzb=EtXnrncIZdtbUtTK#ZawE3dxFGSAQy{s#2nEp!YeBI1@g&ou1 zB>3OI;ANq9ZS%JE>9O(CWzSd4^ii7XW!`WqPv+b@X;q2i-X^P7mgl6DWCR?(!JEKV z<@Wpfvz&eT52d;$_oxdqE?C%T$5d$IVH9!x!v_bm?Rgm+(skW?UoX8pvqGzHxBSxA zKZ015J|!=UQd()G*~hH$^ho1gcG>&fQs3_WN|lOK()nuXU$F6lY)0=dC#$@umpd{q z70%s}x#MA1#y+p=%O)?kKB>Ast9{Rx!%rQ~-kzm@mFrTR@48s$yx^$v4QyErB@cUS z4rZmx+|;~mH|4c{cJB<C@7q4zxh?50W@O!^wKcFWP5CkF7U9Qy!mG9xPd#*PL9eG( z0FU(K%p2ZP{}wHXQqcD6>{RnrI$r)_vGU&6zuI?-nQWQ%{%JMaX2uxL0|z%YUi^0_ z;XKFvjD8P}Pwj#n?@s>yRqfuqH!yc?)O6`Hed}Jo4;5W-X9|P#uj}igR&%WmR^knj ziPv&4QR%GlbE_=O(w)cndvSL8<tp9v85f^jSeV`R`pKmCmuKy7TA;G$j^(9|YAPwG z7E8yJ6s7pwEi8QWYnF^^#lpJIyqmkCIdAGN@B4H03S)l3td8oU$&44oA8%BBsB}Er z#_Q^auZ2a0t?M1letuiEAlT%T--PH*FP=YPJH0Wsbb(CHdp9>GQ?E#;l{VYH?d%k? zQeHeKH)4?sv#?(JmAxBUP8D2Ss@u_~cU|lFZszL}Cx5c-%*Zg@6#Qa&*~@~~PfFH) zX*+Go7z^3A6+G?Q*2i~;S%ts&-gnEtPu03rcX__l@;9EM^jdA(Q?)6(cLwcP7Pdm_ zM?vtZmod6ie3n?}xm7akR?YR8>k<tV?XiF?KnX<~y(SK6!4szC|@}(lVLi|5EqX zTg|(-YvCsGl2)&`(w|*?xOASe{Mn*$x%C=H+^sIF#y1V@6HYXSJnu3xu#O9w*fMig z*q4UeMHg0FFKE5BCnJ+xhvUSdW0xLHxO~)8W7~8;arMO6(nl8MU-7b8mnUX%iT$yP zOzevO$?F3<-lg914E4~f;k<5=$sXkusOZY@Y1zujA4(Pmc&nVca@Wf}&b?HKvsgKC z+md%nR(Y@Nb86Z6n`4{G`(>|Auk3Sj@hZ=ky|4E>Bg^=dkey5`zxzXFSv~GMInz|P zWb7*tjWXJ`xq#ukhD%1FXw;LnA?leH@nPbBv;){A!V5Sp*E#iRPn>MBVu?Ek=VFP4 z$3tHfs#Z<%Ti|MRP1?DH({`OxzxKt+CB9!c7?Y<cUs<txN1uA&WD|`v7Y_Nw5{mAz z7g+n2CvhHDR)}bS($-!V`J}S=ZA666jOu`w=SwG@lJt-EDSB<?S=uz^iC3lHin)GX zt2q|_)k(8fOjJGZW2vdHvg(<E6mOcEbfqUxqN7@w`^+1%nMvhA9`9ZUEc&T(DNLZJ zWt#Yn;7sOODx2nU>wB^WuS#$eJHrw({nw&QtywE4mz!jA+AQ*!ST?26;fC6yTMa@% zqCGsB4~s8(om?!l={gJV&nfKOi5s2NUu<daE(+xlUlXz3RBOHmD_;dGkL|382O)xI z<<^{7s5SXmVTMbnQprzlm+}Mm7?Lbm9=0k9C3d7pD2cXtv<o|h@v2MmtG85Zy<hpV zrNIBGuc^9+9-FSZ=e{LV=XiL%@|mr7;DOdel}jPvFJv-vN?&9cPvg=PPAOuI(3(2w zP%Gatfz^fot}P9EQOFPxd1~s?9_HIS15f^T3rxB)CF#nPlq)^iB2OoY`yG>D?Mx3| zc4l!$C|iiESkR{#0-H>v{4~4OV#-x*9%gDTFwUCmq5VhW;l!|Jf3}L<Hql?TO-o}= zEew9wXZ7selB+j@(>(Y6<rQ19ae3)vtp{$mbUd>ArWBWay1Q`kd&eZ@mCEbtRUY$} z>GMwKytQk=rt}xDDsGCOkJgCZd5&$j?%QYwmJ5p<H{EAFt(zN{(5_&+cAdrH+}UB# zOZV?e;QVNFc@pOx!8!YUY>s@MX|O--&?MEzZNe7sw#SH=`~5m_CV7&VN84)O*6fL! zTv@M9sE(VSqn%YGWx)Hk;qDGS-NiGGI0v8px$OEA>FM7N2RKceYUq1HY|*Jcks3dD z*2QbQQ*A@d6i=`Eq4@E_gS!<OAM$Ku1u88jKWY(udileXclQ|_luD1<o%kpfv}C7o zV}LhP+}+I3Xt6H8hqtUQ@ujh9oC{MdmwI2i<UWsa>6=+o9{xS<c(bVOO^@ZOt*yCI z`?s(&MMQd?>lNmIrMPFho8>I=t)~m0>K!l5*&K7X=Tg}5&}iB4ywVtT1KY;bLrc&0 zWxqBsnz`Uj3m<#>-HnF@W?hf?k$20e^hlsx)wk12noeG+NNKFDcviaigYBLNb9a9D zx+}r9(Yf2@@WWqBg?m0MZPHKk{nhiB>F%K&`VY1zSbtGo(fCPiflX=;d(`BBB|;6t z*%C3)B5ylxyXuvA&XF`bG-*#v-Q&L7+=>ed&ofUCjh8z8Eb|=etrgP0wO8D;5&ZRA zy2+~UaM_DYjzIqhdtNeqjx*o1>)@H2S?iuX+3LJ4;nV-@@D=g3v#nMvIkwi~<I;C5 zuP1maB&}{e)beC$<fpxddebV?cdp9U&p$i8DSW1)SHjAedqK06pQe81>uBX%=Eq_6 z^OXC;+Y;-9j(-#iEf1W--Ib@=bYn-sjxa_Z<pXP88J>*ZI!)z><s!RP2bOb%2~3!{ zT&F)E&Go9^jlLyr6KC+m=}&&1exURGOrFPocP3mAoi1~!V0zO#uLFE`&f+}lo*t5% zYVqM~`hn~D>YB2XjVm5A#=3^yxUOU~qxNmZu`u%khr+du<|VETc<RD)pn@&;!W@lX z*H0UBm)Wdi;tb24{k1i1Uh}l{saeW4vDr-_rQFVUR&2QV%;w}y+c(Re&(y1W<+@H# z+k1}n2H8C`O(L~&u3r~$Ene4GtWmVRE4d+bu0Q)!r^<EOuS$Q`&3S#|?(9l;!)0<Y zvQ4MuD}u!O=4xJL=Sg^EBKE3z!%~eBMuWZ?O{<=HFFjkdDAr<SVtU4%PeO~d-`x)} z4V>xNdf?(2(KUIFp^s)Ab5+V>m9Z{Qop3D1AUwvmPyIFDOYi>4-pdaeTP=yzdU2zX zqa;aB#NmW;s`_r%^Hb%PJ$lyYcv9k2XzDKMH>W(R*Y(X-H?`|uQ+erN*jw2a?N+<M z4_r*sj^0U#cM1O@nj9{-zU*L>sm-KlO|{F*Z^k$(=vWjUIhs%;5<DyR_Vn24(lW1_ zALzVht7iL<(LB@c!v3nW8PjF`<Yc0(uROiN`2AbyPF|tn*Sq)ZlG1SV?$}b}S#l-N z@=lLTo>9ZkIL}JEiTAjg(s(s`+unButG%k~iWXmV>Z;+YS50imb#B)A(t%s_Ip@vd zzTDNe@Wfi)7bjn=*Z%c8E4lvU+IIKoF!31mNl86n4qK}IWLi$SFwP0_dUbT^hLidF zZGP&GUDH<R#ol9_*;e}GMa81o3eF1g)+u7KJBo!bnNI(<YkTKndzCE)*Drs+qsBG) zXVl5_x(u%2_gYMJ&-tC2CS3Ad_hIGT;;E0W?a{B+KDYd1uj~_!%o(?1zBH?a9d}&G zA(k2GBU9#+*t*HvL~XNo!3^EA*Uco1l1do^8vV=#(ivaa?5Ll%EhD`3V^Qi7ee;#g zMP7D_=I$Q1Uc7YMyh&NPZ}n!0yh{r?m#<l6^lX=BYE)RIm4t<p#(4(;C%Kk_t?dbF z_UFWB6_rLwu82MCJz>5^zFx<MM{4&a>zH^G<mAeFn_D>?8_&LOm~x-tBipg3R?GLV zozAwwlzkf8#*!VJybsJ)9PoWvBiZcPX|lo9JR<kX!wQA-Z46nH=Xsd2UGQxYH@TR- zmb=aOW}eZWSpM0Y?k=%;IOCAQ`D7P|*NqKZG8_6P?AD5#GkXemm{zjb8aCc*4$0aa zF=A6%=J&C4ANu&IPQiAuiLQ*)=}ULs9!mUH@N(-Mo!&!Rsx($_*Is*1Pp0~LE4%2~ zbx%!Jdrx{Q{eW?ed%!)8<-Rth@umv0yq=mu3p08C+)!V_EH_)7!^u<1*=^mUM{DPM zo1ap->??J(A#qCn6!#ke?%NwoH0nBxZfX>lM?KWZ`B3(Br?0PNrl)w6@<evc*ry8{ z6c>74>103d=ER|Mqb8O4;fnkQt0YS^F#*v~XW0zr$hE~SKls;`U21!`>}t-krKUYL z@&eyam1^jV^2~g8$~iCZ7+->HTI!Tntc+PdF62D*nydT!Xrb)vCZ*&nUP}|saJ?y9 zY$2|pwEboA2Dg}=Mf3GVj~D;ExpGp`kBI?KvJKhx2W+1gRB~MBZ_q{=nI86y0Xpm! zKOZMJbmTQ3`x2$JNaN;AmFYjPU*Rg@be79BGY?yLYhmuQOHAUjrq3VQ7(eNJ{hZ0^ zX`+s(V26u>_5@9)RT49KPjxeBFEsmUma&s(iGbFlq!TJO!NPe#Q<@j+2W%*uyvSyS zNkE*5^o~_Cmvv_-IkPo2ZeSEiV85iET`@tubD~B}VY8(DvW5CPQ(0Dae7>j^E<f*B z4v(Nx*{02NKDs2fPWN$B3QI|foSJ?3VBC$lVLRA1?u-d?KY#R}#ogG({!1TBcNk1w zefFhIVW8rb8M8eve48&EUB1KcOsPesgI@fm&yU1-Wx|z3J$Edy<=S@GbN{sYT2Gc$ zus;*wt|)SkTAQaGt`<_oRKCdAH7;K9{q+wY8npF(s>WPC%Co2MlUHka(@8$Pg)1a2 zyaH03xa-yC$XoeIyjPny>1U$p0nTuNFy@eb+tNM$+s)i}^w`OYHT(Y`UGmq3C8b<* zR>|G#K`z{D3OAX|x)!;>pnS%)?q8Rl<!OZ+pR>mK@Drwwe|o+MvAX)UIxEa#Qx2Q6 z_-=r~gXLzI*KxU3CcHYNq8;89Z1qQEpOo8O-OW#PH=p>K@SQPTDC7I%%}36yG5ftq z;n%#b)qKZxNpAh}z^try*C&r_O*}tijj|T9hARlH6Yp>DesSQ8(t^p8!?xS)*>T5x z+H;L_MKQT=uGH%D$E-4H6TY|T!xvpHk0Qgfd+goXbk1M<9{;(xSmOGr&0l8<B-!{| z>Dk`C{CByINpHoe;Fq5MOVibR4)T38)UZ9REWdPl&6IgPZyw(CTpaRYg?UdYE92>; z%t)P75oygI$~8~i952Z~dRe7$o#AwbfzL$w_aAaLr(D?lJn#muzq{b}REfgdOD4)4 z*cjNO)U}#Hv?0#q5NE~XE6fj!eiX7=Z((F*X;HZJkY%lT+t2XIiCZ2{|ES)xSCe`5 zN6j@)93L1zZtW2N)7JVaCQodJb)8}TBdrAnY_~ob#opbs_H^U&EJgc!PrKCTJvrFC zAa%!^8&d@~EO`9m>AEEqGY@KLXnx#Ox+hF<eP+d4fdscb0t<Ad)`zGp(Y<xwYVAE& z{cS;k(O*(l>uB#X4*a&d<~_gEj9yuxo>cX#n{TIf|I0brv!&{p<RW9?qibXPUU1Ba zo7(WQC}(Ed`bGN1G8g+^xGz00eg93p<IXNWMYi$RCiK1F=G3*m__X8SnJ3%JEj4@C z7C$>a{j!_!;V+?l4~uhcPAY072CVW4of`e6T<81mmQ}BrYcia_yK}s~xyk3@1gA3X zhFy<-a_+5pvU>Ja<J&SOQyfxDHP7@+5i4tTj?pN2Q~9L2>ge3+okGWMTr_Ri)tI5* zFumb%18aHy2C4H}=C{uDe6m|v-C>{{#qH18{)6Y7z}c7wZ_D3?#ojy3`~ACJ*L`c- zJ&QE6uhbaKW-T!koxEe>udM|ENrk(ekExi+W__A1)p5<T^LoIIq_;6n9FozoyC)df zuC)&3Eb(fy;A1t-TX4?oQi1b*_9=Xic70^upQB;7^}ANg&HzTMBIeMOVTywL4O!ZA ze%zDIoqDNob=&KS=4Jx(E*BpuHxqg#*75v=axY7}-3^x@mJiznReVp|M;KrD%69ST zoRC|_va23BtoMHBU?`zHb=`HJb1ytfl$3=z9!F?inC_xrw21qi?T25p3QcT3+^Q1M z3YfL<r0Ro%;rnbZ2{z|>_491sEF4|zaE~e6W@^)u)}V{I7cNx3xVZC()%?Zo>O#*~ z9n&q6ShU>k>_S5gb!Um@JzI)wA86S8>gmd~X-b|_6LdoGVECuPId<W-#jZ2MH7p#I zJmnrG9Jp+v<aBi3g!`EvE~K9Rt)V~l(RQgfCXY^-v{tWM!ok@cGO_Lb4b{g_F7VZC zIp0~WrKa`v(IJKx3(Z@cISyQ#SM}7r{qwzT>dp#T_je^<mfg4^`)=Wu{<z=2C*MjI z{`9T-(VSJ2i=5_$^X{D0@N~zSXED>0(i&JM?<jNeGpaQ_8(?5Nb;?V{^Y-r(YaEa7 zpX@MCptAA7#=ed>THT^kJDd5n`etwRs_Yhg6Y3J=rz+#RMa@y*DObEf%E{<c3;j!3 zE`Jo3DXVSU)&2I$^RN9powF~R)$LZE;dy=Y-fm{uCm}0ldb50WI=*Cv%;jAgOOB;% z44P_Ya%->CrXIVsH9-eOuYJA}&V13`^^Piss>IhjlNY|VvEV-NoAcZj!TKhn%-Ktw zZdV#@k>$wL+^Kn7`9{kwza@5WoTo3zxpmlE@~!tt-=?-(4VyVi(-i&hmN0(2bs}fU zw&HbClf(;p0@nSJm>Qk__uJBp-5qOQJI;LSomeIqdFyb~iRngNC-hC;Pw{^oDzEb8 z$y$xKQ$9cGRiABk&_w%~`(~NM#q!fncd0Y~{W7WkX;O-_qh6h5xa+)6Hnk61)jMVO zFWS?7i}U7#H4`htPfoCX`M_6IR<hGgiCJBhsW`Fch_L(Ivl9dEyQYXn1qWNj?T<=3 zTE3}AAZ2fwi<<utp3RfpKBT@leN=$iH(u?l&_{<E>+d;SKbf+~-b2;)>b$O#Pd)v& zP7nB^X?u0vr-fCYj6>w^R<)G%Xd7JU6=hNPwn*6!`Yj}bvEOpZ)aD?zg)PfAFkQXQ zB75umgI|lA)SjrgIGA4YJ#uGxaO3GBuW2us1@9j0%l1)!p|@W$nr*JxC+|#7Srvym zZC%NDhceZ<3*IRG-!=WqtCVmjrCE=1y3VoAS$E+R7t>NFPfJmeykHToIsd+C9GI~@ z&!OUy`5V>C$NpTc%(N}yt3GA<#`F0GcgJ}lCmY(YDL>z^e9qxGqnxE)ZEHhLmYgW( z%v~{s)r_<8{CxH=Uo9v7_z^ZSztQPf%*isRRK|puw@n8=cP&fYdY<Rnx`*0A_bjeU zmN0Yd;%~7^(`P=j>`1oj-s|cc*qB93u2<9)A7rc&&^9%3nA0`omq6~ShZ?W<Zb{rT zTh`dlOuu~F{>yVNN=^)q$=eh5^|Uef6lVVYL0erTlW$zQGuLZH>+0|jx1TAW{WLdC zoB!d{i;QT6xE^);A5%X$UCsQ+{G4T#->!p9i?*mIe?9P<%cytG>CM7Mb7lt2ox&NP ztS*|OaL7Md&g<ss!>Z0t<0kb6ebY`}tgt6-@v*gf4z~kNdSBSqvOa$qpKC(=h46a~ zcOzoGrd#<gJY#rBM8TeIPSIgErp)&f>&y-Hc5XL288YwOA+Lv5GB+qqji2~)%|55% zxYyb_0j@im*o0%^{hK}i#jfT%lT>@QH*J&SRm%;f500xc-G5tqlua?Ne?w`k(K)H` zo37%EUwDfhGGUo^v~bV#Cx_IhzVyE7rRNdL-Ix4zjg-mbr0SA?><v9O&T0uyu7_7| z5IMKx`jb4LRqZ+*1{|t0AD0}GTGIKj>9(;=+`qnM@1|IOb2Ggx-Xg8O|J1LSm-8HK zcIvjuu5p~TYUaM5ZKml5j@xvL>mO;q#<h6{v-|lK{GvD6=O|WAzQKH1%V*+G+Xo_+ z+?NYk{h}l<Y;L<IJnPu|maFWQSMIxg{GzE<I>ASzv^2xuet^m4SFe(NYd)O&^UEdR zyw7P>t~;U^b{}vw?N6G;I73Ha>b?@KhyxN6I<CC>8eaYTw?ep_QDd^^2R*yV1%fl( zHPX`i1z*{$%uo0xdg$ejy56u)kE0bDIBHuW-e0+PEiGi(7TtxMyg_ZBT}@moBx@OG ziBGINB`3(Qpeg#tY3=lBw<_B-9L!$^*M|wnOg-Uo)y6qwLDZL(=Gq)O5%Z5})%xWv zGC1lwHPg4z*r<5lokcGmoS(4IHOcYl1mSol9*5JD_ugi{(B*gLoYY>y<F_X_J;~W@ zu5>i8qD3Y1=F%N~iZ_|(X#R{U+WcdR#(O2>c$WWF1xD%Bjt@L)@~5nHziI5ZV1~Y( z?rq~s+VAvBj_R8UnSbl&`LgB=U&+mdAqM%SmTr$u>0PgpelXQ@$3#8-IajC4zKq{1 z_GqoTRC;H{+rQ4)?z<+jIpl|*s(Jm^Yxer=T}IEc&wrSubMJiz`+}-#xi8*J$1?AG zn^5Gh?=t0dU(@v6fqXx9ms-77PdsDRuFl(_yf=GObL5A{*_BM{4|w=hoP>>J=Fa7M zdh*6s<p)~)DPO;?KmCnq(t&)r6O9a2o1E0;&g@p&-B+Hxh5gRUQpv-%e{1IS37?UC z%CUoK)4|JmPkO#Moj>?^opAV9o^Sj)LI;1#6u-H!bgFi{S<`dd8C@HmZ3yq><w;m& z`RL!oskX|I8W*3YFuhc;SG?KFJ}LZb{+VyQ-}{RW6}<g5=WFab%X9xO&TIU4Z{F6` z?3-fOS)S2u+a06-;oNI)79q2;ohKa*Ez`R$bHQPHc3;cozZ=v9ugmb9m0Ip}&h%Nq zwX(`*64&^8zkN^JZBxv0c#fjY=I6?bZC|^w9<7YCxVgkqKXCf$mFK+Mj7{%Wt}K}6 zSs7<FXLZK;(<Y~!UU?r8Khs^V`i9l`?Yb7>b62L!=1^Lef3|I%i-2bB>&i);oQpSf zHX9~X{SauG5*XVVviQwK)4zMe*PQM9AULxlV*ftviJW_iQ~1`t_L_A#?)*{SD|1ZR zcQ4e=<STIAqy3WYo_U$-UWY@=)-ADIz*`n>Bw6uXHK>s#?$DbzY<vl2Wrvron{x9! zuSQ~US*%pAR_eD3WzHv4stw~^Q$BfwpW=S-zH6(q^tH035B|-G+h4PD#l>5y*A83m zY&YrmJ||_he&M}Y)-Ip3k1e>#W<U3j(EW&Gi)S=?X>FSHAaH}jZSGo6$*$Jb2dCEV z;kmuCDZsQsH%2<Sck<J1TKZWm;d-~%$bYWL5edGke44l4Va2?)8!|tgUV6P?vTek~ zJ==X}>s4kk6<YYL5Uf~~%<$^ZtDIanxn~XCf}froUiE-|_tWd!Y`d(kXzMo0xh8x) z(#Me;(D(X`NR5Ej-PncG-<3CM>Du*(tq6P(TI90$>A%SNtoNJ_OXpeav2<lVHlxm8 zp6&Z-OHtp$tAA^h|B(KEEFkRQ(a!saO@e(pI<7DY>&{GFw}<za&zj70W-_)jRt4-~ zG&+=g)K1k$<XE>c3xo4qjXd2``Zkr0Qk>@!Dy%F&{n@m`eA4=mPu6j_O=g&SCY?BJ z{z6)r;Tu;;PnSW$p3c{$r5aM}J)>EJ)4V*~p0)mv(K6%bsa<4dth_(;aNN7Af41%B zu(poWnW83j(#2qAr_Dz;^^JyV`ZuRPcwyFa)<@(Y+n!ji^_(9*cgc3nSmu(Da%5`e z7eCcUR-SG7lieCyxF*XS_dc@PWqXa*Hm5&UTr+gea|%biJ*ptu#9L(LwCB(%$LkfR z9#>XoY6yOR(bB15r?5F=vKqgm$|Fx<9{+_W-glhxmsff8%58-mdt$_*sr!4%KE2Fy zjCvHas%6RfAB=`inx<axi<8@AXy<Y1?4i5UH9Q_Pc7*<o<alX!<u)^yPoMUMo&UD3 zZu=18q7m%!SZw2#x2;94k;@(5ec1KytL@@Q8)?B)!n+yQJ03d_z@M{Ps5k2ML$CZz zfvFoxpX@&TOJ+yc{Czv*lwFME1OuIdd+Z!0bu9O(Y4z)u=+th1z|Fbv$iJ<NZ(glY z@Y9HWW9KvF#TA)5UPcq0p8H?>__nE2U}BAH+2l^{HyjG4S9d6v98kTxA@R)VmQPjH zY;0jgx)R?m9F%d;zVBGhzQN7HSI958%dm63a9PY^N#2@M|7R}9Z&VAJVcHP(aOv6K zx~D}9S0BIPv~t;I^#@J{p_XO6QCqf4b@MrMKJyR^dp4KNP%ZJHto5?1`&hG#x<6)d z8z<@d99aGEs^_YS=DRlf2Gul*`RvwMyg63ll=_Wt@42=gD4O{Bq4eYb_IgsSL5a&8 z)Tasy9O4KUY@D~{Q2%9(J$7dV=SUc?=4d~=$nuIEW3rg0W6z=>iQ{rRK80xNs>MD# z<+Qi3v*@msDvx2%L<vrXsoBL93r!dJw*>ssD(MIi?~!5>y)u3JsjLOvkDnGjeY#s? zL5O(ob{2v337#C8pH^oV9DNk}+SZKqKX=`(sjZ3+^pC7uzv1ZhsD1nFc{LngUQImv zFLl|DIxgSz{tr?gJ?r1b?Ja2S<zV`@K`B4tjM0WAZ%Qu&D!)|Fyv|lMr6YlRO8fEk z3~uR}t$cd9p_jdsH!rmcKYYE%Zrc(r>1^veAB5OGe6?jxzIni_Ta8aSHbVJrftKDA zKa0q9zw<1dGdSaHE8@i#vj*-r`tVocPuTL3LSL_P=3jh1?uXJY=U&mhQy&quuBqVr zxr!x+bapUoVpBO>o>{s%?}#wZZuW<740f^G#>`saTKIQu*16d51hv9>FSkuqXk75r z<<Fj;n{3lJom^D%m6g@*Mkj~ju`F}v_-jvJZ4v2SV>NfZNXG`(^(>3cd{n1PPTX)g zV{4n^%=F1jd~*)$+8v<GEf%5Cym*09;e-5z&%b<XeQ>n-cE*Eq?{Dc!)n}M~yYfT) z)!k{9FJo$Mo_qQ9{^Hw-`=2NNoA)a;@Z0LPlp`h=|LC~{+P|8vv>@EYZoOEoV&zAz zi{FH{{@HIbJ?ZB&?InUY>s=TQSmYE2>b7Sws(p@fT=lVU0#onFn$kH-`q^im+^{6f zP_^BWExfy=P~4}>%~*Nwot}eP&r+t%{(h)OhT~Cq`L2K?Qs*1rbsK#9^uhAb^o9xP zXT;h9*k`<Q<e8aYcFAy6yA$h7#lG!_ST0N#H}JB0R_SGMvG8TfFAnQ7E(U&!IJBo0 zY&GC-UE{%-x$b<~;WsTwQA;*(>GB7c6hyxbpR>iLb8V2(r-JQ9@duZ(7w(9z{l;S8 z%p4H9v(G2!cS<<lWetyyAC8poX>+f#SoBMD>8}={jn7uCaA;r-bX$06X`x2(?#fTI z9iBXVHKj5`T|&peaelF<#CPuvvzpo#HZ*abpZa&{i#(~OH?;*z7dr+ox!M^mX!S4g zkax=?d9^($3jY+BEoCy~ceb4p`Z$vBq>j@rl`G-%K2|OESv=dS;!UU;ThsBCA(aP| zZL)5z+95NM?<Dg?<*#=)_z2AO`n^_|XTsXu!RoRu+jiNeu*ir>_8G;s{R~QZExfgq zNB5KP!xs{qKQGQ|*|nX)*u}GJ>65M9E>4C`d&(4#D5-i{PyQtm>{QocyHHPD^@(p! zOIPx&3HMX|RZK+Q`U{_|ki9CzlKcCrEWd=@)ipD$1g#Fw_h>oyLH*GE1kV!(O1YFI zr~m0a{Wtopec7YaU*_j77cMlH^j|hj*ZauZ)KB%+a{g8KHl@zoG5s6Mli#;r`W;YB zUH1Ro&#RO5w|uy-@jv}yzSW`s(QWU)N3D4n|3&hcoAM9trw`+epFaIjR<e72V)4$4 zZ;o9|`1yL)Mw>smHPbelA9n6}dnNVQOP-X+Rtx^j{_(zc?ZGPLW5s+)6T@pC%kn9_ z`1Akd>lu&tFRzgG{qud(bBSmfsq|XegLOKOneYEs30J<gq0g;;=bfutXIef<ta&dl zBNw$itMZRXa{7n+@6wx}MkT*t`;nU@wEXeY8cp-p<}Z$~uas@*S{NYP%`=B7@7$yR zd5<6ek*xoD^QPGDO40U*nTJ`5<5~VQ%GyXYYDWHeuYKP1ocwJ2Es1|myjy&lZ+^|k zqvFqx%kBEucTU>woUzgOvUmGB|Cim{S5o)p;ob6x&o_m)&p#{t?Oojmn|U>_H*9}D z@!Gj)eeW%Icb1?3Ym-^`A-y{J?cD9#-r0Rvc;><3f5-mbY?jkc*#D!&Jl^_7?cIZ~ zjjA`Xf3MR0zIQ|VoAm16S`*JjPft<}yFIts>FE6<|9?ODw^x2k#X<fz+uzUnfAO8X zPWAcUMeqOqn|G_z=k3DW=jZP4+}xdOzvXjO_uC)m&qeF^zp*~>I!ZG4_V*)yKbOBd zFW1KS?&Q21#uYn0fAfyEEO>tQKd)QC&Z7s{+%0$0uiaSuw*Pxv^4aTs_x>r)EB?oC z|6}I4=;}4K{GYql^=!GzJ=dz)-o4EJ&%!fx_Nn)`{+4L3Gcf*<@SOLuOmg)m_wVyI zwuOrere1TcoGGO*e1GrxNk_B3zda|n?OTd`mHRgrwdx(8+tz4ge9M-5b*px{)}_kF zN*)H?SKrxfnz6i-^YQ1c>bI@t+uo?muKD-mT>RBPS3j%g@7Q1VY~IFZnWHj+GXCz< z_8wSWVfg9bTbr+)e1W@->mRjQ|7m~bA5-P|HX`j!!dDJ<`#*2;<7)(GWIh*GHN3dI z;?cRc*Vfo?w6A8G@WWO>y!x15>AhR~zMrZt|Gz5t^`gDD_iz7=xxCH(e)ZGX-St;@ zzTN-n<C|)Ww7aKIrj&o1vi0|l(B1A+IzF()*S}PqYo2#BFxffqU(4M;|IWRgnDo~8 z^Y8Na{qN4pwLbfCg>h}!y<3u5Z)0ynJ@*yvsLJ~I;@#hC?`9qjd;9KObaYCwEl1PY zyNBk_`|)Gmn?%2R=KJP8xA_>{cjBu|XZ54c{%@@g1lw&<zr8X2<)6Lz&Ck!+?N9x= z@2C9U_j~Wpx8L|D?w_(`>Vprl`y0Egzr}A0`SR6BfITPw+k={K_kQl<K7ZqW`NJTU zJxl*=ZQjqd@pygmTBV((c4ZGAX3u}bQ~dl-UEIY#A0%b&o8JrEopk=jCF%F;c^%!` z&PV)P|5^V{wc@SH!|_R}-(}DJ+3@+-ZWi`B`HHDp?OxCSawmUIkE!^f>(7{R{Lh^r zM^@&h*l+3bNB-HI=sxl-<^0pP`z^|j{o&8wb9g_?uTP<Nf8$#Ne|JBNX2>bc`Tp;k z?aj>=2a;AqO|#4{|K{j7fj@1NcXqw_o2R|uj?>*3!+PEetGoDfSXZ<0->V3J-do9c zxRpuZ@<c;JTc+eaH-hf@uqUlCZCUwHxIy!Xus+XK*`HUry9A>W`PMhDd$Tj=W!(RB z&yCc#=iZoa%Ua;S<;~trQ}^#SX#YL0`|aBu#r;z&&+Yd)W4QbZ&+-2&&+V(7^Tb&F zZ{NGuemT3V-<$5~T3h~^N5W41p{;iE?)nQ{Gq${6(Ejsau)oYAKApS9*SL0MJe9Gx zuShz7YU$^IE!%tqKXa<KTRpS<)%Wh-!63zBo0h+`-jjY;@^f<g!sPX*d**&n{}xl; zb?WBw`4;JQ_0L*gefs%)+WZ~wH<TvzGv3(yTF`O%pTe`(=D(f0*+@U+-_+}8rT<;_ zd3)vB>zxHRrK_{f7v$8vc_F99UbBQP<9+{Ge!1KWiWBYj|L^Souu!({N#%?M*F*)^ zh1RfJUAbAE{``C1i=T&P&SA>mpj5L|IHvH&ZI&O2d^_HjGHiOu%k<=a5<}Ac#)SEg z5~|B<xmK9o{&i0|Tt4_>;EkA_ufmUOAGQ2HcfqPK=WLM)7fPKHHy%0lqhRy7**R(Y zKfiz9bE0UULtXp#rL)U_`tbeF`<EXn{fgQA)ARQDWqsE_rEhe8WBBj4h4q=f4e^`Q zZv=i*u|8HhU3Jam-p!BSuvB-=P4V9x{6?~DmhI_z$<H?w-~9Y0{LS?@=6jyx-{gMd z8aL7PR;<e(x3x2_rkHj=7h8Qb>#_gaYdo`4yVvk#8`eiBl}355y&k!K`@Mv@iGLeQ zmwk16t@GOV+Rba0*LGf;z4r5(?GdNfd|u1FW_y%)RQ~3F7piubPTYFum-1`bYe%nH zuk~JIALlT?Cbhos^fsBm$=Q`*hrFUR|4kFql>Asf{i<%A{?@RF_lwNz&)Xf}cj8`d zY}(fd?X_{M&!6g=6M8NE#`GKEH?y*Puja?*#U}DbG+&F#J|VSj-Ii;S%GXwyrmfv> z79qXX_gd(+>NWNo?`7{je=73*_D|Q+vhU2=z;$hjX{v9u>+7uS?$AwXYa&<YoQ=F5 zA-X#2XV}?WS-G3HMO&}QjyGo0@mn9buF|xycXw-cZSI=6uM1>N{(IkiedF~_X^YnX zjMkI)PRy>!PfG9pS#NCJzqeKU+w;xbH==L0zR7*VfAjWD*Br~=%HR0P46D_5xBNBi zHlA&HCRNURgNpY?lhYgYuAS9O)xNR&#_pS`YueYQ>|N8JdQ)rLthI@M-xQUxN+&eu z=t@7D^<-*}taReyoSwDm(l^|;b;cgOclck+-syY$pT@m@aP<D~$a%TXrq~_i%9-T5 zF*7VBe6#MFBMniK+QobSNrgT14}G>->h`H^8{g)z@1C~&kNCg$%x|o|Iet@IC-pw* z`sTYfPua?p|NlSyMy<?vcKyw7_J{tz4a}EMt-g8u#_`@i{ukb>AN@Z+X@1)F4fdfs zr=PjzrD_&EZ|=$PZ69>`+}1zlta~^sYTuEr&65)j-#F;Sy6>@wr;OTrajhSRwqL6= zjGv|9=eH><H_dHMW@7QwPcFH4(u-Y7kM;4M6<PLa&7}DneV@1gk!io#SNg?qkN%6p zX>rCSPIs;(Fa5N&_2x>ZhEID>rKs9lp9?FVu$I-V)&8$=s=d8k+=JZ{CVo8RvN7b; z=2bN>&h}sb!z6ut{=JVit>rl~^=ikopYA!&9{)|9YtQ3Fdk=m47*y958~iwV{*4$W z@qcL?Hnv9}p5AkeYqoZXOY%?2e<5ej`zaK#CcR-&<J!FRkcw^Mq92Q*H|}aZJ2flR zEbbXc(q-#s%eXfOL~gV>xT;3m{_Hy4kW)PCKK#6W>dgFgB0m~VZ{?b;^C>Z``*!5i z{_<&^8T)d!onSnETGehsR^qY_e*=3R14o~l2|~-7`M+NMa58Pj)sPQIXDH-IluZqK z`r}yl(T_=~d&~~IWW0V=u`|eFOGlCZQRzv>hiVvgMOIwp+9$d8XM*#hle0AP9~W~4 zGgasv6q|dwljHY^vVt1lX{T!LpVJUhIULaQ*m^_#RVA12VV`xS=Bz5brFmvb?N_x0 zP5C!wo>W>dx94@kl+Hg_M2=hhWBB;sjnj3D<vt9aPb|gH6n-hJ)BfSc|3GHbE0+hX zw*zAjU3Xd;GH12e>I+TwvFijSANg?Cd?>THDDbs=Wn;dG;gQ=ubutnRKixN<cbQl& zoF$sZchc$d)|)G9mYM~hx?U4D@6nf?t%}T|X-76xZ(0*GbH)=Fjf^4&&6JKhmuEcl zw@Ag@OsTx6a3OQzRDmTv_H!0<PnEQrbatuM2FI;xAHp9RC2$>KeI9HUoNPB;j#VH; z=e0lcosxYfni1XQ4WF;SD4BU$Z{E3^3z%dYj+g$-IJlANNXzw)7VV4+9vCyNWqQ6c zO}lkvl4v?#w%&(tX<4fKEy8a#J{8fash3{9jJ@z)vcg_>#ck}%m%1zLU{_xpu4L7% zy4mgI8m*Z}C;jEPoPXep_Kdog$nLLviZ3QGS}k#C7bxLybT6<wzTwD>z$Blk5{HFm z3#3i<+Rt_RnW1g|l(X71Yyy?z6pxu5f4YG?VpGBtofVT<bs}A6EMg1}F>q~}d9>;@ zN0gbvX|63j3sPCuCSA{tSd=zp#Y!PlosG<iWh=g9ce1vytUCAP=dYc|5=49siY|_s zwc?kx7i(3h$zm}9mUoR}9|G4ZafPi{)9Re8^<1T)S$LnrhiBSrR97X=TRyMS@Gp<a zntKUrFY4Ev4b-oBd-41Rww2}^#a5a>sQ;>T&GK&a<g*?H3o1esg6b6cN-mzAb^3wA z+?tE5rqW_t&jk1zzsd}=mGoIRZ`H2#uR32FPgZ!O-fQ{rR6vDaNYHvEMH!ZLpH}U< z>fmj1`^RRX`l^r1`Rh0R*vwTQCS3Z^-~L}rpMCg)^9=uZ9-WW+BY9|k;-8&D_17Mr z=lIw2=)A<gHOJ@k{@5&7Z}#wf=nv&BJ(7NYb^A6kpUB$u;&W(MXjbvjKPJ+w+nhZ1 zngn~=m3EmFbS_xO;kGEO=egY@lS9Hfp)K0XZhEmMbsN__{G3v_>X@qe1WCW9S&J1n zwg_4|oIes3DD|*==cFVqeI<`tDNf1xtDC%^Y);_$$)qt$FHEiB?h)tEf+cD?=dypb zUSD)_!;V;c=c%*KFu&p7vn*~wo~gsVZB@_CzD|F!v#MF{h4?+@uZOA^%wNd<YOR1m z*^9=i#>fDDjTa`1Iqa@4P>{GHt=D-(q*9l;mvxFzjc;t0>(c98vyRIp$?aSv<SyBp z((AVAq1&c|UB7#a{<`h_SFrP6g5|oI0{T*O<&3nXjkKh>!p%~|xWa6vOg*#KGULpO z@-r*Sbz<H}Y*^>ZwkBYfh9!q+|Ly5V9vA-F`tth1_~~nPKF(!`K3O^YfB3yaY%O9Y zCpMlhXMW8UY<k0Zt#<L=zTN^+LA$)5?bUyEvp0!FuHSxc<G%}4%cpL*mm8bc8)cb& zYu3h9*S22Md#(0*@ip}|(QD2})#ufo{MGe!|C;=$``h-V-%Y)nY@1=5BD;w%djFQb zsN-vduX(<nQhKZE+^?x$rC+mlyDCkLSYmleDzm@DWtz)0w>WuA<)XAFYfjvpSgb7W zI_Jc0<#3m4?)T(x%FOKWaa*Pw?(Q}5=82dkLLZf*m2WFwce4}tnUIqH<ktz_iTv() zeKjhdE}l59G{2)ptH}Gw=ZX3*`{Z`&e)@Z&U+KGRo!n2?Cjn1Ro_Oh@a!azd_>1ht zbuYSJq+YywaqGq2iz{E4UVM9T_M+`B`vv~~eo?;2zQ<1B@Aen<ZuOG3g0*J9ZfAJs zWWM1~%J2Idc&2Y@()+HjN7#}VZ~T7bp7?E{*}b{lwFYI$Z=T&)o?I{YJL=8rjrm9a z8GieF<L*ZGr2QSTU9$ai`~Iq3yH}ES`KNDwewF*=>svNuF34P>c|9a&R`#u1C9#*= zXMZ#M8+loL_P%RhzWd(Ky>-9D|FZvVxh$(YC7WLURJ(TP(w-$h-#p`<egEPcllWVA zZr4<P{`Ks;xxeXoliz2ro8G_hr}No)v;VH2!)NWkSyTPl-u%D!XXdm2Z`LgN>GFB= zS$z}pt$WrzoimL)YTEW4y0N;eqs+GXY|Y8tx$&v6ZhXei_G$84Y%Y8%IDK*2^Qc+T z_b=>P^YziSb=OSSCa-<G_I8y0oht9w&!hKW`o+KYe)itgUmLIew=b>+4A?Pgm` zx9wf|_RhA{T=8wHw}0I>+v>YL^!B>k+gHnqZy&#Hcln$Bt$kO%UC+Ir@w@D{Z0_&d z?=pX9-geII-}ZOY+m+j%--^r0&WpcO=l0w3t@sxGeE+TAx2(^U&y>%fpZ(wA_u04G zx708E`}*znt?%>e7yK1}>%YzZzFh2<l8da}dT~=Cr^If_yI3tIDi$hMn{m-y{O@+x z`kgOkcYo8}m45NOxb3zVSCm#Kdmg_jD_*K%U1i;7T_n3%R{q6~osXyW>6ibhJuWM2 z|FUAiV~69DWzUyy(XYGwXuIw<@%1q^Pamxo^VeIa^Y6i<e*J%U9<A5?ckIz^@&6Sc z|407$@#u25vbUJNW%<cgZ@sujx;slwo>E;soku5fd&=cWe<rO|{d#TgeWMSl?3GVS zp8PlKw-Kn-wVCv|gd?PafBDYMmaTi^FWlf+Zn$8>c`m8n+<vhR$qtF`EWL9dd@1$g z4!H5^#Yc&Pn+s2v&Y7IoH}|CGpVu4fAIE%l`=)nJ{q&9R$){(Yu9N#2^~T8Tz_rca zH`=^@c&FI(_Myt>?H6w=)yvIJ-rtdvZoa|qV6%Lp>pAK3=6l<VucclL(K%FET>Iqi zHT|Ud$)}^|Jo{~-@2$ti$M){8Ur9^xC5MLT4U_ks@H1l+kG)|dec5KMWz~dYgU5f0 zGB@8Y>L}KKe(4!^)VpUj)ppOX`xoE)I_uxW;?Ma>@u~Hv^HT4p+9!SAIDa$q8w2Ze ze*3rlJf9ry{!i=IyBp4DuWzm0^S8JAne{h)%ey-hUrxOK_xJ1N_cwezbJJX}`thsH zZ0CQz&wp2cdh_XRI=_$pT*+<s``UbUx83y@uGbvh?zV5^$7SE=>C{v{yZtoeZR`I_ z^?x_^-}!uU`=6U@|Nq?`U-M7;|Hk*F|84gDKeB($XZ`uR>lZzLyr#W&N_oNjtC_X8 ztdjm(T{^_6A{;4R$v^+!Y~}f9-=*27%uk%3USIm)V!EGbS=9c@PX`vO_n&{aMXvJK zNoIF%>-n`lDQ}W~-`KAC^nkKD|6IMA8(kabZ~Fh>aqX<Xx3UgCdj5C4`+WP#Coe84 zKekT(E@xBsYNE4yfBx;tdu#jW+Z4=t{_pO?$H(Ved^k~9@$cA5Wq1Bh_w)OXuQ882 zy+-!hAI6Ix?z;Q+xv%M7Q!c0bX3vLf>GNvdyjb{FKCL`T`=^m{+TQD0QP%^K<1gv{ z;obUSx*K==!hd#7y0yH=3V-Qki!ZGYE-iiOa^=^Yuc@#1x%Va63YI;&aMIade&xF~ z`wjmN?mE27yZ?1v=fd~^TlW6ng0IuB9lkR4zvgFovC_9m<q`hEPY%1i-xtv1BIbUt z#3TIAgN>Kl{pMMf1S}{|S1I~(<l&!nFVvO4t$cjEFTC8%-bVQ0oV~NM(rrGz6lRyx zeN*%C&*Of1`?8GFe%fW9PHbFx_sx9E)8}2cUGDkU_3P*g;r18i`WH5J*V=#5^s4;w z)17Zl&8G_+mD$tE&2DNxzj^9Jxw3uFpL7$c-2QozdljlYO@6+ZIJy7Oks59{*`4a2 z*0amiez{;+|GZK#OD(L!O|E}V&z=SB-*zSMih3SWm;NPKhJVlQ-F<SFWgT6n_A8GU zGrBW;{q#li)$M1&$Ng=J7Hqn_YhU@iuWrW|$#=c$z9(O6@$LG?`mVnk-xBPkYV%91 zqOR%g<!--!X5-e^U-}o{UU4Y>*y0$y8l7L)J#uB+`98%xTc7@W@%-+(i5#n^O4Z7E z82;M7c>BSQeCMD$nOi?Ce81_|;_{0Z)|LexXVfaWUDCrn<?_b;9ko9j-uc!qv=r-} zD_WhMqZQVBx8}h_bw2ruUnd%qrM&+yk-u*z*s0s!D_b?|di{q0RUz+Vdiep5%Klbp zUwVDn>gkolyA}HSzm7C6Z(dr@bfxUcMP~Q;cBP+w2(!uF3%euvSKH9h{NqWn#dUoX z%5TkBx?S!%Z;WTM{QKV$ue<*)Te<h;p=ICA-)8(ey==X??Y)v!Gfm4)=HHgdKNqw0 zbk!=&Pa2Q@vH$eAd}iRry$^~&~&bAKw<yqvVm<?`-XW{NL_<}920T(?y-GwNyy ztIx^p8;f0>*4tP9VVK{$)M2LYW#8)_r*fA6>2unW8GhM)w%y|Ps$&z~`{!F6oxkXK z-@H@rcP-fY@^k-un<J5$Ros(axOYul_W$meVj;HW^_NQ0FZa)WcVGR)lP~+<h#z|N z<*v!E^)_`6PO9?<u=4-C<dAt}!539FK7E@yuP>8U{Q0u^s>f&6v!^X}eLpuQtQDU0 z>3huX+g2y9KhmD{oTKr7OovJQ&6o@aDgM{TmmPL<x7s{E>E<(i^ZM04t955b{af?& zwC??^$^~1Oem!*U`_{UxUw5zlzRm7>S>bJ;=&4Ko#h$JAZnkbpI%$=>XXQ`zv)|3_ z@6>Eb<=9<lcFCS;PWd{=3eFj8p9P;ie>kU>UGjz6x5v|#>ZWhi$*yD%cf5ah)2tcq z$_|~6j9T@7!jfOIZFlxe{`J{=(kuIb<ZfS==uf)QQFcp~RP-$Qq4#aF*rWgH^DW-R z=g+-aRD4=p_4ho_wRgYGICi;JWq17*rQ`J#R+m2AohJWs<I<A(`+|G6{i!~ktb5+3 zZpP<JlWo5LS-HR<->&Y}iDY*^*(<s}Q<T<rN1wmM`Mh9Zd5>4Tt?<)T-)CJDRD833 zd))n5d3$?4l&C2_<%#_g;~SViyLYSK_OR&utiNl{)qi#rQdKX#CBCdIa{Bgnrk#(y z8`A#n+Aov&_x82?i?@odbvoCqvM+q}QrUf{L+`)L*ZmohyLJj?{<UArUa~W_MnQeP zoyo@2zam~ww)#2uYDDys+``*GbMr5EJ~w}H^SZ^`deMn-9~S4v-M+QW{$#xT-}SlE zx2+Aj;UE0^^X1()_U0}&@l-!DsqCKpR?!T<^L5WsDxYuK|MTjXuh+KUvb#{mY<O<t z<SWPLUdvsbm$v%Wz8l}nbGL7`z47gR?)k09Z&^Rp`rgmp>9|wEa=k$2?!9l1vz4w7 zzw}tatJ_~pIhXxb-&~^!fe+t4nByl=^S}N0d`r)hkFR_^c~w4j_3gXgMBhf=TK%^E z`o8sl-?`?;Khb>^S#oueZn@pxE5_`8Vr9F`pDuoT^IPM$?++i9y*jDBv+KjlZx@+^ zitZJ?`KZjEvc1mJrutsRn!mfgN#FXutzPi>e~HfE*Gvf)zS-yg*Xj8-{|Q(5yF$I= zD%CLx({`u6-F~tqmF?u7M5|l>E`M_un_K^2!Lie)oVNV^pZwnb!7Q&`#|mxkFsu`; z)@NjO4GdB+30&EAiRBF|GfT&m1fh^MjMeY=e!o}!e(&|Stg2jI(Ov6aPy2sn?#$}v zYz22~zt#S~fB$*y4N<>k^DK*>ZPBa@etdpbDfg$MqEEg~>!PyO<%vxfpFVYZz@}_P z@6)Q4tTo+SQ8T)NXUwwAZd0^gv9)D+R(09geY@i)Unpsrx6*P|n%bWUKkXJivnZQ3 z!&HFLVd|W?V%NP{d8;e;J^MO~Kl>{4y(EvdU!rDiy~e2j@y^1@>mJQwZ}6{t)p01} z{{xL5TYt|uld=E#hlkDT2ikr4PfocL*qL1yYP^5i3L(Qin}xpF#Y_sG^?jDs6~nfb zSC@o&Ydn%wh)=rqR^s%PS3#$HHTLlpEXyig|CB%dmCVeQWraR#PedKwFvoaX8N;si zVKHk(4s9vhv9V0#bLj=6t!Y=H&IE6F=RAI5=ZvDxr>*NZd!OR|wD~me%=dCvtlC7c z=<lDDsLvCn!?h|j<aP2|`|Rs$?s8RJJe)1h{O^<hR`0C;f$mYu>*wCEy8U|2%HsDz z_Ce3@xpDtA{#Pu%CiUIbyq4d(2V`E0Xs^4wbDQ^DjU(&%A3Vq|U;CDsy<U#jF1TcW znZdfS6Q-H6>TG#6QEyG>2>oa>eky;(?ApA@YR+kkV=HWm3XEL?%ssO6*Y55AuuJ6f z`)#vU)-L-d+aY_j^L*uoi>oKS*`E5;YH_aZ8mo8L>Y8VtU4G@dZ|{!2(z#WoDm7P^ zIfVu;Hrc*nNzeJbX@{-^UVC|XQ}r^}<5spm)`<UEV%4<riP{x!?RAqw(o5!g)&z3v z9NRr*<+6_Ot20B>J?DO%b0K1$vxLVU>C;zlRxLYs&&vG*gGt5FH4b{suI*OW4Pxii zojt3q9coy*Z`J2X@6SwVUg1A6tK|L5Mfc3EnSITb$&JbVlXFPp_KoMNbK+);nF(3! z73av`9dLF33Ddx)?fgg2${J2||29+mRr2EPGc$}A=l$JfSK9o#Z_Vxn?{4j~el555 z_k_vwFTWFbF>lqZvs|-d&BSx&-Pp6?<W|Og{+aJ?+hi@wW3iCkV0p}_dy02%+{sCC zx*~<)UEPh7H{Xi6uy*~a2XWHbk=s-6ZY!PpYL`OUdDTaeonJ4wMk#1lGJCE|d*yaT z)^DO(*Qc$!)Vp54dgZsuy8Dv*H?_RA`;(r&@rv4VZPA+$@vakdyADj4vFrJ(drwYF zZCv=fdEUz3d){^1*r|)2^$7Zq6Ifu|T^06q)%EO9{ayFARC&M3U0uH7o}~h79*gw- z*Z{+?Ij>CJW}R95z?Dzo)~txrRc~LHu6!P*&ouGS><NdsKY8qZ_ch{Yxo5(U@}(;u zPh}P_{9ZMy%4*V;xw_MDMn&c`eLEYy`}yAG99K(ImK{A?wOYd|WI4w}Pr*Z;=dbJz zdar46!C1HE)!m~>ADN{Ji%#eSdhDJ5x^~U|E&Fn7&;PQ0?S4%@$iDCKzLz&Q`qVC~ ztG%XL8?m1)?Jl!Ucd4@5@zfUwu9UCQS9jXO?snw5%fmPRiB~1fr!a|Xnq*yDCVe#9 z`FW?)Yyb83yZ=4<<^Njz%KxQ}I~*6YZR52v|B&<GwgQ*Wp<Efo58YeW?BDip+OO)@ z_Z?i`dv?e%bjJP9_!}&+UYlvr_hp@O2NwN_trd2>DL<X7MO*p)7p^Ih>>6FU^IRO> zTl208{<6;T;%;%%O?s~He=4#+N?i8n#L>lUF8}`X9NVpzGf!j9!53`7(mMGC%M&vW zPvt#tGRcf9<I9?h{k{J(-bhWz6ug+gG;e+U#z&Qx672F8nzUtZ*mm&hn@K{!GM5vo zo1Ja)c3O(gd2R0D-Fhs_tm4{(-E8^NzmyNzGOd%*nB80>+|4_ohSy8_57Wu=sV$r4 znXS3IA<)_LFduKMRN2u}9bD6DTi^aZKIK|P*G8Sge&>t%CSNOj)b>|;naQ00N;5Mp z)-06r&$I}u+qxm)ypV0a#lD9nbu8-(y5H}pd#`4|d)@pF@0BCbK1=&OCfepzu!!q< zZpo=w`|xm^zx2(In=k1f&3L^aRjTf?LHptFb)K(Gx_f!OrR#E1?ym4#{H$Wi{SS+4 z8r^@&nx2yX@S<)}55Iwk@3N!M+`JY}S~EH6rpB7Upv9AW^OD6icU+v{wsFUNjyn}Q zUT)1=wbprYk6W<x+1xGD<o|N$>@J%sGF3dt@1_Ow<&5IR&XuV@U27h(ED;ocvQa8x z&%%qTYm}dVs(E$h<2Mf7%O|e95D&YX7PTic#N|-q&o#`ZvHE#AcW-PfWY=)o<PvYX z?)nbNd7JGGrq(;wZ&@=<p^|Oc#_-1uaw|P2gao^smvT3gyJR8PZ$0Dk<F(F($xj~| zyFTpQEOkC_&ytUA$NZ)C=log6+1%|e*je0LRQzl8(cW?syE`+u^tLYi;{E<q&abzf zK9AQ+*RMD1+P>K;b+uaXo{fd~ehcl3Q`x#=Y1Oim;=Z#QovdeHc^K{KEV2CST%}jH zmm~|jPJYL-|8+>Jq}+`a9XA(ss9p3uW^(i1lh<nNXNj0==HFV7IeXdM5Fg>v$tL@r zC%7D35ph~=rf-^A<dqcBsMXA!6JGaM?{xIu@~_Zm@?PJ*;;@uhg$J|dWEahykg0G@ zvw60SidCvc?xL3BZwaSk)&}m;)SsI9DLQ!d^@_~DY7d_Mn({^3uQxQVD@Hsv_`1!J z|AjMs(t___`jiyx88`9V37P&m%3V3LF6@ab-u~?P?E3qEu8Rfgn&@7NK9jLg;li%W zs>|-a^?72Ka(p(wUwU=+xvX6)Uand;d)B+GsueF+E}K5<o>j?*2aYQ*?z@)wW&1<H zFWcV*e%b!g@XPksg<r0}Wcl^FNa$~FCD-3vbz$?ryE4lz?`eLqnPdCu2Q^doR2i>M z+dA7c>)NWBwVThKjhS6(&V3*?x!~qMiS{~)_J|(m_@2WIJ%<f?4hQrc7HCb~%y@Ru zY*mxXkAw~vc4ovR85~nOwbX5M<=JVb(bsdLH`ku+Gqt|{CTer_*?EaJCKCM>J;ynE z+%1kNOFo|1Q0;kS?~#XbS9VNyTo-os)2zRD-Z&R`Kf79Zo4N3|;EuN*cglqFs+V+S z-dnO$c=bdbHuLEL-G=KHSnzkRnxC|G)^F4P%z0O8JU_?YTysMDqRp0{39CwM($?MQ zOy@seyZ+RshzmA*cTS8?iw_M+zwcmswZ`{zZ-L|;m2ckzvTO}}7q;cs?fc1l=_bb> zhNM~civm1CjL*iK=`Rv<;*h`E<-a8>@$R8@ty@~dyW_N$xvmxS{ZV9FSz@*4%u<~& z_j^gTj?3qt(|*7t`%`M!(FbD6apDZZMW^+5SetI0B;vaMR7>1;;c3dhHto3{bK%?U z6_txth%Jwf$tYZ#x^>#5Y06Q0nUyP^?wqzgYF~Eh-BsRZ2FBYqZM^X#;<OllluiD} z<nH*1CY{PA{f%34KJIe0Tk=%5@#GXY?imsu7p9r%&KA1Vdt~XPtJ8F?x0U2dUNLGq zer=u5`eglutCy{rVzjhRtt(n>n@_IgWtQzxVOcY$wM~-@(0Z@yc~<1_g-adm|JWsr z@)X<-Z;82DlwHSnv-D^4w!Xs}FQ<52yuxbocfnKh8pnR8tvjBco|Ydaw*OS~vx_$` z*&J{SK7B8{SIpYW$6>x>(t?1Sb$fS&&J8;oy>+=k`GV$&rh?Pj41KhxhuQl4jFHh@ z$-%s;?z8LPsLZI|eAA^@zg}Zp%f4mby<e5D#dD>$X5LM!o1L1w@2J~7^R-_pPV9g5 z!l`J@j;nLRx})d17Jp~)i(Gwmt=R$1-Mu&Ly}#tH-n+K%QDXlw-kK*DvZdAYO7~A) zxmA3_?kL;rueR4NXGX-D9O<gq^<sCJd~|p8^_<-6yOOh6^}ed+g^8cuvhMmW%|nl} z*S$@;(s6YAk&=qG-T!-y=NA=Bc=-BSqQ!e>rOQ<juWh52mFBz_Ik%*Wm3JfaTJ<gS zZdEzH7F~OiEnF|Z<Kele{R??E*5q`EUJ6v`-f}Jd$4kwV!cr-{n#Bn@T$io3`|{?@ z=*@|}_RHUH^Mvhz$3E_P;<e47RO5h+@1C{2YkIS1AIvqn<uhIKXn&}W^m?;e#&2t0 z2L4+3z%|e=Zi~N%#AAU>tKdD$eVtm1{C7@CxuCG^;j_cK!HZp2#obAZoxL}=k0V*X zR3P{AX|GM6<DN^+FcZIZ=UMUh+18)fBX^}ns%)#gyNqLUmCmxw3;+8B)_eMTI(tfc zhIh_a@iB4{^5&Ui{int!$XKYlb4vaeyQhq;i;fo0h-&r9l3pkNto35WKQ*2idQu9K z`ZJXxb$9CQ)UE6*Je9<(H)-c2*A1U{yF8G7ByrO1WL{p~GA2${OBG9Bl`ADZk9^J; zxpDED-}ySD@v<wkYU`x$+rH-BzOij<shaa1cB%h&w@F?95fhhrW*M(~euC?|<x*wG zdHZEe+)YkwTfg>TS>IdB+cLLnZr^`vbz|p^(ygDv4Yx7p2wzP4f3J*X-3M#ae#18n zx$3vl97EnsX6)}v&Jn+vryP@Pc&$u!-5+&{U2o%VC$k*=S@9xOO*Xmu>NiEvw=Y8C z0vG;k(hOmGu6_AYN3LaD<a?7OYwg{;%C0O+XNX@brCX+~p;VEu#puJ4e?jZg-~77K zTQza|fg7&3c%RRfm>Hh9T+`Bi{TiM4vp0M<%s#mMSh&s%i;86#8}8QaeqFXS_w|;y zx69&h2j{L|DY1KTnRvyPDIP7UM~uqK-|jn~);vl0?S_`B@9Il7&pr8$cgbgFpXb-O zZ_YSVvHSk*DB-W>a>6AWqwZ`gjK00?ppBI8qZ!-Y-mVG@snFKG@RNPTqiN4q>E7nc zoqeIq=eCZVzyIb4UD38Y9;+EQ%Y2XWO$&eVz}oA(?ozcQ!RNQ^z5LB^*3?1^n<}5J zK1;H`yY6oNmiu<T#STlJmobYs7eBujYgPL4^`6^1U8;Pm;>DIpJP>+hbZ~3q>b0w) zb}xJT=9cBQ$=kTI%vZ$T;TE2-?Wa`o*Oxk-t~V{0m1`xJzP|p_$9j92?Y)%gDbq81 zOqWd;nX>;ZYeT7{*#z(Pr%yi5Q+=v(L8UJI%e^W5Jo7>dt(|v!zFk(BJKw#xtUA{3 zmbHBH&Aigx+Hc=&tLF2ZHa&J)_>@yyZeM+u;#hVvdftMI7wVk0UiQeo+|||1)fJc7 zyXn~rp9wo+<95%#{WmTC?7d_ASf`n>R}|SjdU}U*j|*R5)pL%t_sJWleVh9>_RaDe z_nmfqv`f+cz3yAipZ|(Ut1}mge+&HP{8sqQ)^Cps!*Boi_Wj|v@_@JR550ZQ*t)#4 z@0R|?`26|<|91Rkjd=d|bd$v59h@)HSO3-Hh!WYj|Kfzj4vkHVER;VpXz&R~Uul<~ zW^(S-Klk4@zrTOmZ@uMVj9d4dH{1Wb=}DTs@zEngOFmOssn1g?ol5@pJAAURuqZir z_=d}+&5hgtpE`J4@q{8%wBY{zx>|;fGbgrAHqwuOnz=@Hl8l=5w*sD$H_uDFPFeI6 zNmPIM;8?zR$;Few?x}7kuQ>;8JbZ>vTK2a0YU?$n7B2#B+*|qg#5e2P`(IsH=iKA- zX2aFQ<%i?U7pKOSFHW`PUr_(VRA!y^ow6P8Kiqh@^RPLey~Un_il-mkvbN+X7)O~+ zk=B*g?3pH}mk_(N>F8>cC^Ocrvm0-nb$lz<CG}SKcKyYDVZV31mEM+rYhP-$=kKz& z)(y9G9p8p6D9aAm&AUREaciz)u64j}-4%EFu52q`dGX%%+JxWt-a6lQ-}3%`UBT~% zZ<B8wZ@$I1psYGzH}i_O99iWoTdf;!`7J0*57^DU;_aKL#d|mYz4FcY_W9iX8~$GU zrhR*T?*5H`!vd-mSDbCQl@xGW=*l*xt!o|MW-a(8zM!l$V0YUlx8I-N>TlnF?_b&P z-*4r&*Wdd$`<wlidd95lEL*c1Z<UH1D-VzDdB3jlR!~4RTh?jET-FtDAB8Rcn=k7k zt7BbrabZ~dE?KFvj9Uv+**RCd<;wcbx^?P;eDe$2tyjEd%&Km>6}O-)JmB{2y>9I1 z`R-c%DC2l@VYhQedk5cNYo2!oGFRTQWtFpUt!}tww_uz8inr`pzngC{E+|u2arg3K zxAu*)Y9$6`Gj1iOweOS_D~q_5nA*N|L79GlHOG~AyjkBFw>CSz6$r2vxx&Z1RlM<* zpwVf*-PTXaGz!+Jt-bg#seQF<UfGV@4-?y$%kF#iA+~+K)su!YB}ePP1#{~b%>B1u zF5`l^jSJ>FE|`08!Cb`!a~HNd9DJxZP4-^-j~fsD-3>L8n7fWNC|Ly@d64+@#(|BU z$=t`y`f{HhE5Gg-d~w0bhyXwSQ%iRn_sx~vE7G(0&_&<0nsVkTJ1a#}YHEK>X%7r~ z-Z7<+r|^xosaFm|_;tHyVP_5R73Lpr@|)*p=6BN1-Qj4;@xldyb025SyjZnl_r+b) zj*Isd%Zgj+mBzf>ajkIi<FMm%ixz+7XuTNqG-*p;p=s1{t=?;ed2ZRJ8nW*bxA+yT zd{%Mo<L<t*)_iX)wmm-Bw=+ol`0T!NS$QkF(m!5VTl`pbvmO45E%1{LxEB_7c;k_e zb04qot1n5hiYi}oaiibyU$WB8lgbvTNGvP04!9-v<rza&Hh<M?hAgY5dsa=i<~}jC z^0MAlQu6-B*5v-af3nr3Jntm#8FF1IW7=xnd@I%=H$5PlE9<mFuH}lg3|nIza>H9g zkMHQ~l$~t7tkk5z$}8YF@0CLKQX2<Z|LLz}pO?klD9k)QRrY$>og0PO$LGp^Zz{5N zu#^utCqCsf^V2_$w;30_b-0kHe<5!|_Se2}>w9l1wm&}H=Wkti_2ce7`%)I0guBvL zUNgU9ZLU&W5T~(1ob6RB^PFEzy9Cu87S3DusPE}qsnVjUQKg$+q+DHDwfxrHSB*{4 zjt4y#JSYh$P<`>F;moSZx$3|D`sP}dPiky4b~tS8c(~i)@N&n0kChoJmaVzAvV8dl zzreX{rL*q5j9K3AKE>_iyT$9=R)0Qzr#CEo%C)&dR;s0!$}W{lUC!LoeespziK-<g zQMP5qQMQb#^Qt7)&f9tQ#g;XfSNXlR%6+wE?d5fTzpZ3nm8`j}x$@$xoo6z>F1?fS zb?Tvvucj;h@~-%+yW+3xiodoi{xYxlySTd7&)=%{=F8iD_GMK!UzRT4KDWziYFQP3 z)_<0)^yXXo4sWL~DC1j^%d|DV@z#3Bw=n_M=bhiEl&yLeB0Q!3anc`-mTSlT@}~Kn zopZ~&((>yBBfs1^x4e4ge>Z$FGuk+L^W;M(dA9`e-1;H8C9o(W@z0A_foC=EXr9Vk za5-SPpkJY1=YqqF7aUGraQN|p50U{tR5WUsN-8eIzDX&#^<s-})Y;5cmwlG+^y8j8 z&1!84)20Kj3><z4IQ-yPQ7?IAKg+9mOr_`L7)8(TH1MmQ!`GlB?l7@?IbXHJ%*|dK zFRL!UZ`GYT&98jUzS2`=RqE+;<ScFNU*&DtYV|U4OK!oF8Fw;n|CllR#>?K|g~6SN zGzyChy{vXismAunvj?nIZtrW3^tY^f)iHab<@5t3>u&GlT&?SBztnhcbZMDF*h!N` z=4*v!o?AC}_j5*X_1yufQ+|DVRnxsJ>iNOBU*{e#op-O&`8o64|2>IT{V&!i9y{rD z&LXq7q$2i|Oby$bRp&li>8t<MRr!0>bn~jJrBS7Jmw#qGKR!3U<e#KS9b;B>^`2AO zXU-j;|8K|K@EPILj@R!CPB^vD?w+W{sVSM)jxO`wtS5BNWOwI=H%DiunNOafw@J_O zX6nuSgEx$q&fZ<|Jni}Zs`=A{r)B&p776>Gc=C~6^Bi%@^<l=bi{?H*c799M4cGgr zPSY)8!%8&^#VoVustfJ8{XAvA+0<vxW-%Bg_sB18N<8DAvMcAsC$-%V!bLBqrcaO7 znL1OiefJ#2tGBsM`KS7dEIU0}@BT!lZ%s_bf#zZSpEonQdMr<5)jGCwR`K#Vb8@aU z7dt->Tf%7V$Q+sPecC%@+Bvy%`_4T)r|hv%!Es@d@vG@vE91j>P8{#uar*qtggWn& z?#~~&EMA+vk8{S^lWw~cz8(0g`24Je*#`5YmwvAJ9Qj=OT;+`en;zIQ%ufpT%q&Zc znRepf&zZ$$Po*Q0)6X_WJf0q`JGXvv*yJ>?=X)MhT+%xj6y<*_=vLsYgX-I=XU~rP zVYYpbj(K$Q8e@xi+oOI;rBnN+^i>5;`ul0^$pap>Oa4Bn%Ubq@J2Ss#fx^un?%#zZ z=AW1nHr?%Wr|pg2>)ZNr=55S%mssavc&kiH%lPT+PYusal;=*=o3!rqNj>eu=iFRg z?tUXQHDZ@{l}pvE$7gh=ocu6nrt2fqu*{^F#hDA&OzWChr+)UVp0?6rv8gkHdf#3X zI~dnpe6{Dx;xn_ptFdi9_T{FDTUh)xmWZ$W|3ofIO<9}DcT>OEw`y_hj|jJCDz6Wo z^H~<FKXcOxmGuh0x8BMSXZ+X1SaV>q*n-Vdcqd7wB&Xiq<g4YjY?A8CjzpXJ44;#F zb6;mm+*G-F=lagn0^W^@^RKPu7T)BdcGKvlRZejIk+kiuo)>56rz}qqe`@zh^HcJt zn$`%xUyC?&tZy$ZOuFeCIdM;ES>~dpZ&tpEzR7)a_MAoESGwJvu5&QA-ic*<ZQ#7L zEobW{=BWPm)th#G!u84K&b~ITN9Qki#9#RF_=X?K6O50Rb?#XlqxRk5=jwugr@rs3 zWN^Q|$Hnblu-&;Svgw-rQ}`#VpD10h*J;{<>kd<m#CGvyD}L~*H2nQtYr(_y2ju@h zHO;B$dh7Jl>8IMyeRIT5&fLcTRNH%^bawT6jtv6uK3l!}Ec&~0)!U?>razT`UjH;_ zj`+_df0|>0zwPEp{{3}>oYPOOb<?7!$sRs&`iXpC5ntZbka=cT%O);bcgXXiub{+n z4Jqw6LB_e$HKX=vux>4Dy13^=n&Pypxzn{{y5kgQ#UA!ubHH{_TC29iW$nFFmBI=g zKF;ml-0iNj_=3i@r<oG2vy#|)9HuT$>1xwH7QA|kw4IBA=f(~%*|<sJIVVznX>EJF zSj2}V=1k9{C6B!HmN(bjD^jYQ{76xClJF@X)ygWjkEfOfUlIv)cirf%JAIp$+sAW9 zjpTpzx->1FuwS#syLS4rn+w*(3d?cV7(C$*?FxM4{q5Jir?naydfG|;0)=<pr_a!O z_0Z@<YK!-#?#9wQSN)X_JqnyXD-0gKyr#D~cH53OWjh~zT6+4m#Ie+cr?obnnqHLT z(R8iad4X~)-_AK|-F2E5J9$4l&fOFvA^#xd$n>--;~CeB_1?$o#_WIKb<cGz`{zqf z-tEqLVEjBu^2ywTJGPaF29yVeRIZE+(~sG`>)Xk+lO9L5voMG0Cy8|>#T?)DZ{?bW zISWdPUO(S<<gIo8QMuQ)d6hPweq76*a9v}4;i{~4#<AkN-<8=usk;5OHJh>h!oBJF z-ZzD97cE>@@?xX*q2rtr4t`zoTD9qIoRQ0Nmt$WSzBZSMUNTj2=iRv*+5>+DOxK+C zAj-?sYRdF)VJc?7INq^pMr+)jSg=^4TTy%K)=R;X%X-46Y5p%+&3QE=^PYaHT5w`y zo}$3xs>RMlI*Z>dmzfpIcddJ_cKZDjLTjg3J*{}E^OWx?_n|UbmagK3ZGn0L>%_Cp zyQUaOvSzvMjIV6FwzS)qb-_8&r^$|U@0(2#d&)d<j<a2TU_?lWNBP%iF8_(^R|=%} zB(A!uyj?AC?wwt`zcQ`*z9CxM@yI{L>~$(>byId~o}6>~#2kCAlXXW6oeGp5n;prW z=k-SH^|VK650;h5&pLE2f$Q$E-M*^9JNkVR)4#bCEID>6xA}J7_T;?qJ8~aS$DB|8 zt0K>%V*Nk0?w)r*U23AA-1(P0^5v6NyYCj+7}-8sC9&OHPB>02a(8V(`kmXm=a=e# z&FEi#`=6uC<A1Hydu=jIj!3>;&s-QDGbKD?8oOAiXI$CC?1&dRMvw2^tX(;)FnkAp zMQ9thiov^m?+(6UpL{N(eyV=GV9I_Sb`kYyP1Tcrr=)0JDK-D#)+oMB<kimekA!zO zZC#ao=lag~t-qS{zo@Qu`Eg#~Vd3d_-+lB?7aWS4asKhQ=4!q6+nM`r74E(9cd@%M z|80?DhYu|_n-D)E;oI)dpAN2wKRET_gVxJt(^6me@P$1+n%UF7+1<WjM*AgYhmMFo z$t1O=ruI|GA|h2kYwiWg*~H99$+<p_|7Dmq)8$P2$x-w6MQuD@)~_u0JU)flTA5$> z#WNd!p9htXc0bCwb|mt<@yvhPR^I%RpZCYf?m4t6S+c+8yw27ei_bi6UT%IRAhp13 zS?96pYah0J-17a+8_oJegMUG@4po?a%9$sg{%2{6doqXE9p_V*diMW0<3B~(y85z< zu<c=+#WwC$uWXJVaQny5%k!<Lt@qD4b0Z#eBN4Mt()T;8Q~1x{oae6S6zuA36JELQ z`<+LX4BJ9@40RWAJYv-rSNf_i^{n#h=V{Mt&*vvx?BDQWeMn$_#24ldMavB0EBAe^ zdHz#cKK$*Wf7{fKM;wVW-78hS^~vYCH}8Kf>N*wwWbubpTKdno&iXj1vh=BU>60?q zohs)SZC~cJLtX#Yy7WDZ_6ijk+&l5|toakBt5ZrghEKb0vwrHIlD=olKU)TTj+5SV zZYEEpkoEexaqTzvHH2*azly_zRVRAx#dVP@Uov~_l;7<j^7`wl*Av%0-~I35-BZ;u z<+tU&RxSB{<K6aq`Md8s?%!N@fAy;BzqhWgTJ3xNSZs7@XxZC~S1*(*>HiF}<lHJH zIq&L(1zCJ7q1Ve|t%V)8&f=K)Eajv|n%Fakl~FS$=iM}2^!ma&!&uXp<e562uNH07 zsbHNQ88eGN^6s}@zdNN-*DYhW&+K~CcsXv$tfO~c?Ar30ZQeY;H}9hoPVO<AI-^09 zrDt98o^x4J**CwYU1yJtFZs*b`Yd~KGylv**JJk|4E*uRAnN{C-|I>%Zp%$RyY1Ce z)st?^;$<G^zPu|Cr@8WF?Bq9WS5=yKFH75VyGpxYvie@@%{R8_v+UV^b9ei9hxZow zYui5Zec@weW8P4fbF_8+2b2FEg^&DQe_Ae0{c!E(@3VIjSC-qWMpgQM-}mhAhTCWI zEVaDfx8BR%v%T{D({$Bl<tI`uhr|-B_VicGS1pNgUbdLke_~r!_Ivp~-n*{85WAII zV4kbG-QnC(qkH>Hg!i(33!1dCmRWCay3FOZdE3|BF+HERcGpR*m358m{vkIOXf5C7 z_jPLQ=RMI^SAGtj<@2#O@3ZeyePP|*YhRY_yS+E>e5lWM-@AO9s=6!!KN$v`5uN1k z+cHz?QQ}vzDXZ3{?%MnE-lx<>JEAkczq%`(vfSuy-P?0}+#YRV`}LXiO1VzR-V-ei zQ3d7I%i3Pv+xOchxN=Qs`So|qyVXnlU)y;eE&2ZHUi6Kh8IJRNTW5B%Y>sORil4%5 zw~b}at=i1*mukL-{I<SpUV8ub-+=GYtWSTYRv!H+>9$+cm2L6eRVK@RcfNc6>2zcC zE}k8mZ~lDa;x+aC=Tky6-}Ud_->{3bic$a5=7n~NvQ}0P1?_?l#k^O16*xIQyJPpv zl*0Zr+go2=q%%3K%B@aFjQIBAiu29I)%^?J{3%yUh-SQ5YRP`1#-SoQre#?eXN%rM zWz&ShSk3;EB^_@Kw`{RFf8a~NcMnHf>my3$ClwW4?<6PnTiQ<BuT#&M<FV(~wolr} z`h6d7Hp|-oqHxo3(fQBp?0^1ycl}a++kK~b7mYr52QBZgskV7B@%H0n$3U&ik59|l z&pNfq+o)%f?~<d>s+PGY_8UE5XmDB5@k`N{XN`#L<KV-~6;%XZ&$LUbxA#e`QL&2` zU$LxvPECs4;u^IdXTIEgSL~<y?c;~eFOrAcx@&4`t2U-&9|)SsDy?Yv=^a-_*we`! zJ$Iv6ZYNgG=~-~tWa|l8hhyn8&$~%<IaMuJ>^^O2`*`zp_Pg~zmFEa6>Q9J1@#D^y z%0uBR&xctC&xz&Y`Lu3j&w1_ni>|9a6;R*J!2CG)owlBqeq-6iY>VQuSg)>0&$o;I zzV*B8)7LM&pM1aHeN%nm`;7OQ_qq37ugU*C?bpAemtOLVPu!aRaq3U4^{mpaSCx7f z>Hm?qFSn0zx>N6>WrA*jx%C_K<L|57H?jA=uek5xzK#1hjTWz%cSmE@dV?;h9TKj* ziDyriGxsdo#Td44=Dy1{>A&?p#7ZTJnC`xRU1L*~K&nWj-ACiDC>O(ht81_SmU8uF zlX89JaIAd!`+E+HSBSmX`jq#>>Z`s1TYkk(2zmTZwIOoxafOYgOQyarzMo%HT=Thx zySYbc_6DCo+57VyJfCT19D5|0vHs_EhTF%^JG?YI@91{+5&wyQB5yyfUYGtS=Z{pX z_^aOi3_GWZ=huAS+V^quXX)6CM{6SNXU40T1aDfh_0O(fUl-N9mAJRyW8&>IldgU1 z{^q@?>&Pe9n(l6|2j|KZ6F;0}*}=%Qx7OD#_PE>KUz0w?`&NGV^de2c!Z%gFc;Wv& zi)0ikj=qnqV|!eF`+cIB!Tq;#4!a-NP0-Xg?pd@}zGPb6&bp&@@BjYWbB3+vzU?l) z@E5y}YyA8DPIGs{ecSG6ovzRCg$j&5B%Y75J^yXi{nvRHwk$a6nBCOJdYAv#CjZZN zWwln{KfW~f3B7E8VgLI70{?aY>Hp#WQ_uN<PeOiz<c7xh-aiK$-xh}b<NTNTZ}H#d zzw}l8=1;ns!pC&|{hr7(Uz!Zkstg_9>_7g0&HvmNHIZ|_+B?;(+q~X)mrv)B|5@j{ zQx+dFoBOf;#edVlzT2HeB@f=N7Ti-?Y8WY_z_mi|fsa5j+q7v{CpY|J<U4XUm}QF+ z-`u8>pDqnQ-Ze2zwOEkuP;nsOl23%)9_6OQ2h&%~U?^>f6UgIKtLH9e(0t?-*KD+z zNo=xS*@jQEYZzW_-f<x$Zo=8v$F-c|JD+ZmC_HfVKyjn_q}A*;yg&2|R5rvfurkm! z&@M=PAoWM+fbfM6-3P=D+%ynm<I~{W;+7ZD+t6=gUzKdWCM_Y>ZsY7e&Mmwl`_8P* zcvhyRDRr2ojGM<{;+EwqX)`9D?epwC$GopvPU5WC_J^&#!Wm2!k*|C_Cm-O<S=PjR z<>|v@p1a-NpSXP1uvq&BBr=t=y=ynyyu?uFxc4rrIX8pnu9-1=<Fv;6ENSffUS_uH zI7t_!Zk5}@%<Ro{-`V;@=L3x#<}YE+do51S>#bJ%B6GEP^{GwEm!uz`w`ty9%d&ed zJqFPUEniFCzjXeQBmB_#cFMB!it~;s)6y@^`BWIj*Qw5XHng+4@3rOD=Q8V_p4B+c zw{6dk=TetGrCr(-JF)TQ&gIVoh5A=^UR<~K-=gP#;~vGCR&9NIb?5YI{nGW38-30% zx3y=8H{5?EWX{=LoIdBnZM!+bJPYPCtP6gva_&n}Wo%NAv@3hDsn7bVy|aX`-F6T2 zWh#HPvm@T#eA3LgyH#I}r>>kC*SOayAZNdD-&^Y`D~*o2SM#chA9yAzCd!aCMRaO| z{nMohx+2rWH~9H*y0^sF`I;C-3(t)6u8s}wtX}(e>)z{jdd2LE0;(Mr#<^F|RTjDB zsBvW;?;M^B5#N8Qtw;+vzo275q9do)vg`hP?>(*8IL(}K*mjD~$1QP3bsishomDuK z@8jNoENWho+q{x4B+kfOG}m!$vrJQpW1i#PiToemdC&WLd*lB74$HId)wY_aFZ<}E z)~0^x>84FeDRVpTXU<q~WdV=G<68MCd^y{<Ee-gyIY0Y`>7smFw>`RNThF!pos^=M z5qu%e&Mv`uMvW_%aEaOru6t~&jz<grYt@f9f2wZPHn#xB3+?wF-7Bp!f4%mV?EUJH z_jB&m?_tqRSAM+BukWR9lhmgj*%f#4pEB>xShXVdJ>Oo@y}Q4^J3Cvq#N+y;^4wc5 zXWo0bmt8^H_3%v%%T`XelX7+%PZKu0v)%dq(7oH$@~{4`_#WP|+<4~t>ho!w(Y;Gc zbS_u>zVH1|9R2M^aJ1a|{-4W&E?j<j@42ZP_stV$%AZ%qyPjj&<!`^Wp*KFB`BRt6 zj(1M_|C|H)?o=}u?e%?Mq;&oEp7!&~Du%VIzGt5BFU$`6V{>>{IrIBXdrb{$MQUv} zeQtPtLw@(i;>$DbY=66aFbVm*BTm}<>Y^?E%lg-y-(t7>X2Ql>CvrMdfAzdImh@cy zdX4lh-?Lw4UQTyby(d<Bc!7MaoNd%zrzP(uUw^*+!8OHciu)8dD&Cs#QZfCIRqM*b z?^??F_utzd7oU0m%D!l&B&9g_nw}i_nM;#?iF~bW=llG0Dua~ek0Tw;y3N__=8C6t z7}fow7cG9-o3yscn(cM7akDw=|5Zs%OAl%uxF6oxytk>g+4;hvHD|5AecqvAEo`G= z!S<B>!_VtC47Ur|T)3n)k#nA)&)xsw^#XU=<}w~F`>^i8-+&x@)$L;US>ieO3I9>~ z(f%OZVXl(<f2KIKvp<r{%|C41?R{nAZtWj8?wa<^2rQhYSn4#ZZ42Ma1G3XMClzj2 zWN&eO<E-oJl%hCK#p?pg_d>6;Enm1gpD1rIORMI$T{%7GkMN8MUnX$AnBb`AK7+M$ znj*LJwU!)y%M<-Jjo)8I7v8zrEq_9?H}%BU3GIodhh}|Lz0JUA6aPdmNa&N{6|F6~ z8OJYt2=IOJ>B8iN;m-0cV(tHg)YNt<OcY+<nz1xxn>WYW?nge$F1<N)Dd-wc-hPg= z$*WFIIn{E?dG86kgDXtbuBdMjk5aw-K&aDrTQsXn$%}>yf+;DjEnF)*eO8#2OzYzG z<u~0|b6PR*$FJ*m7L_dC!hFZEBJq?S1J_|i&%-V2c<;_nX6o}UE6ls+y+!Ql+fIQ= z7XmLW+aplKZeh#)m+zs;y(P&`@ompGcIY}}^~W5SJiIpRWP}PEJJ))FkkthWk#mo< zoILd7Gr#rW7oYjrbcMyl%=QTM^vthfF8Z~2($PfC#N@+$AA2iT&fMUcc$q6={hRLc zWg&$(nl?;L{LNA5zRWQ3_2F#`8+{HPiS3yvKYe~UPk)EE%ptv^Z?j?(yFzbFPh6T< z-*TNlzjeK}2}iZ$H?j5oY88eik2b!T#cV!Hh4=94k7@IJ)N>r9gzuT%;pJKy^zh?t z#Z-AOUxwn<A+JA7_|W)p<3sL4{4MjJ|J<N^zq4FMcpc~b1K+MF)QH@lyywx(=enGc zVzr0DTk@YpZ(9EJp4r3D^RqbuITwqz-{-HF`=@Njexau&TB+N2W#pL&ANCYDTvPgS zgm3e#id&IqF6<Ml&7Sb(p+`NBck(Z@m$#(^>y+!_UqsyJi@5myx8>ZIudkV#SzCHP zxx3x{enJ<2^vjw11Z&w9c_q$&yxy{>{N~RCiow!vL#zt#U#vC$eeP-d^8@|M*eh3c zNZu${oiDR!`@8BD?{DtoSI$v(QfB)kX*V_I@U6)fQ)gcKzI&g(@{Eou{m8dQdsiGe z@TK<lc9yk|tz0}FKfc^JL(cN2t81oP_uYWN>4o}2hL>;1KJVxgT(_s|^~v`Z?>jy$ z6+3vs=$nPhoQvDImz#X%4HH}`XsrCqZB6%&z^STsf`(RyP8bF$EqndXWiiM8=_Pte zl45Ihxi%M{4tdlOE4W=rZoigR{p=GiGMyIQI#*n`EZ?%?Q%Fu@-TZSdA})KBa~3Au zPki*fMLFBetSjf_$-~keMz)n_OOthkZ(0_8IsNC&l$A=iPpq40tDLM9{PU}UNna;V zXHP?2#`Q(tSI%7IJF)rW!P&kd?GX=5ZtuBd6s-86^57=X|FbMwBV{c0i;|zri%=`_ ze3F$SC9-ky_Lh3-S0R!nHadRC&x;;)zt=y>rL?Q4^OfLM<yS8Mx&OZZR&Q#Mxgai8 z@@MFi{)zcYr!NY$ecqH&k=MD>;QAEyKU-d<9^mZ!WBjUnMVkv>dr)1r#)oLmJMGV} z=y&8)xy5eGSuE!MwJS<)tKmf>EhR5uQ?)F&ZGD|mBBo4NzblH&()%z+e)i5k{w;d{ zgU>xRU~FQ%y~n-gntR}t#uds^kKGG5eO$aW?U{S`3hTh7f%RXqZ{*kQ=lxsu#roGO zo>ePWqzBpy_yk{`v0~1O?HPvYiJH4)E*xQDogWxvZ+~Cp_?Ok!)_?0>w9)N%uj;bt zY>WTiJM<=HbzRxtreD18reDebbNkH?oz?ljEWf^XRAQd@_f7}vOHYfpvzdaumR<e+ z_t&JB_uQw0jn~$_5qB1<(+NwD+WTg?^8EN|Q`4Sj7_IgByKJJ0!R6F9ople2XL~h@ z?FyZBI`8A1Me!dm?GHXLzVlo4wfF6HJO8fzef{12CHuG3&;O_S*Z7zJ+x=_*@B62I z^36)iX?5NqH8J}yb!pYvJ({K>EUk4-I=7wC^xpo`|KD2v-xt#JIu&a8_wKLXpQK`Z zO?K>UdwG9*eGco=yM4j8F0WX6p(Fg(x=f${H~)$+jFjS@Qucr9-|L%$O~p0e7OnZt zv*(hZyVvgcqG#^Q{%>70$!0^6*m8rv^56f@d#^mfLU#3*X@9%fBluU?FSx1Q@c;L} zda*^naxcseYhBO1sW2#lGiFiQqN2Ms6HhaoXRKp(VpHM0z&pb@;djGq=6QS-whK}c znj3Z5tOS@o2(CA8IkAzMEllN;jmwjX4O^Iv*ir;9?NeML%jsdA@UfxPCi5{z=IzWG zjMeOO);rwVCX=~5Xi09w#ocx1gKw+$N`5%qU@y4!I71fy7P*M-rQc*+azAA(n74e} z!2>)cQWA{QuRBa{yq8kBbcrGJU$$><zNwF%Zq=D6X;JXNz~ht#qyGJad{>tVi5eH& zIk0B>hphg<NAVKbQ*t~bG`u8sqzC+3u(LUj_gC77If}vUHMUQ#UTAc7=bdX_a(cs) z#K^-%p;y`CBr38W9Bz!~%QEt?I*}dlK;d3nY-5?;#yi<U`IZLN4`w&+=lRtn@VP-j zVY7=ygPooz$AbRT2UK{oY&#zR7fqQo>qC^mjPftv#6%d*mZb#zSdjShW@=@t#~I^| ze=c*_U(|oNw>OckSN=$R_^RGLYt1%JYo5j*WuEa{p+@wF>CR(!#jG5gzwui!t^7CV zP2#pi`32ik<&SNa{nDXwW7S&rr+iwnUyeU`)f~-t?$OcqCV3|o`<BD5tjjhD9V}e8 z&+6lYvgY5seQZwtHakuyyg%6ZqBcNj-8G>FTNeCzKIaY7r$X5XA4~mDjkmufXXbrt z-y@Rt;lx47L%Uvc282!PO;X_%TFbUx;!@Fx35sosk3*(4oAcf?{_*KS{!Ym_$>ThB zCO>r6mz2H<F=q`n{c-KV@sw3zlU8QUnx19(<LZM&2lw-@^qp}actPvC*_jL3opiqh z=*nHn>o`8aD_$}(ZC~@wBY&PAa80n~@048RC}TO}`jO^H=VF%c6?cVtD^A=|)Nadp zrmi++{*1qxXC};b?)z}K&r~%%(pIjhjH6t^)9wk|MfW17YsX7`G>!IiOt73O`RQ{& zn@jP>M$higOH*AlgJ&*ve$AU}c_nX!zNJWF%Cyae6T0{8-IKE-XNC0aiq7XbcLLNl zXJ&BZo8|c>w(-eJ^~)=7eA*i9uWMX#=7LV$ioibs{bH+UEc9+)mv;0>n$x_!R%tKR zC7L>1Yh0*a^eLi$<t^*4B^Nsunz!3Y&NBY;_QIw_CA*r-7SkkueZ3&BppmrLUCD%b z;*(2vYQ4g~J<z-G)qwGIsCnp>+=$PKbK5I<x(_d}y?XeT=+pxXCSQCPy(%eN*LcnE z4USf65eGJK1c*rfWH7bWvStflTECd3=9BB%^tP96z15ulrBafj%l2#DExK_hQM=7n z=9{knln;AS(r)}pRR845>dKaO<6I*94UW|r{9PNm&M~O|lM>l!@<wg8;ztKbA^&-^ z*u6J#@7NH1nV)6X)Exm+EcSftSgV}Zb0XZd=cZJ#QCZ}hWjAUI?T^<6M6b$T-M%t( z)vd!%53}?3%g(c``TF6`!_<pg7e~8QyRf@SFK*<vzf)T=ziZ>F*rwP%?>oC}r!G!w z>zA=x*tEWg<y;qg#J<DneDN;R-fM31vJuj4&zIeo|6}IE_{nD0++pw2c#Z#D`p|wz zbx&(RfOgF3=+CDtqDr3Joz8wyY|3vVYk3LAKUTbr<@}3oyOyi{y&dGXN%xLr9jjZ? zCCSu6D>W;NsueebXYK9o?h2ZjQM!e1mx}%-?;FZD(r?a9`t(xC@l{!5*&d53&ytHB z_j2YG?YjE#h3v)Z#s2Q`opmyQA5FNFQ5td1MZV8&9YcW45BIQNi3w|_i|l=FcZlt@ zkLsOt0}J8#ocS^@(j#Og6Kxkg>)53%)th0v=rhNAXG6Eu%I$X#u2<H3Ag)>Ga^s8O z=4JgCeC0Jw_v(4gODxSe(joXtP}x1hy+_tC`AC;@p4)2YcE`o-eI5t(gMLle@YFd? zSAJ2nortpB#_}Tz1=ADuY_(l(n!Dn;r}a@I<#)Xme&4EO7VeYzc$njw*Uw2WynkDy zxt#2{zr*|g+k=;aIzzX1=wB8yPg_4P^J~aeN6{rxVvnVT1&uA!(#~vpBjmiSIZ8G4 zyvYii5W62f%~J2>R&*GY1-c3*zL}J<)+^|2fNnr+kmym5ke;k5S(^%`KG<*jF<|~C z89uIcVRKKh|IG<{``EkwPT;qBZ=U@5*!Jh_S-l^k_hSQXL;fmkDBAXvlmBqtomGh; zPYr!9%nCF#6f-n4v6C-<6n1}7s)?Aca=;bMW5EF>;(D{@hi5UVoK@?wvFq%Vl$d-> zcjNk`M=Mm#*6-1=o_(J;Ky05|;`EkDMRko;5=LwH^+Y;9`|thjE|Z#Fn*91wzD%8D zz2jz`Tf4s+O;wLNcBlWRWtd2`?1P^s&z638bGG83<ZQ7+XGDaAI7FwcI@_HjtFJ3} z+$z|4X7D8QtX)?x-k5Ns<A&hISvNLrH0Ectv)4*bVn4<=l~IH5k8-nxR?3gXX*~5) z(ta$yV*CH;lyfhau9d6S{FayF_vU@!-$zN0{Eqz<ac6ycsmRpl&Ey;T-4m5BclIRM z*f-@T*DrH3u(!8PZM(X1M^$0(<ESH^k7OR-d0Zv?$slU370>$nvJ;!*S(XPo{qdjq zu)gcq|B%Fsx9=3~*?YzH^byr#Z~Zs*Tt4dCHCt-C)Z6=;X6>|EUAbDExli}>x%0oL z-b>#0^xlhym*4DQ7T#y2_O9m6bt$!XS$Axc!k_<*3gNhwxV=kSbdzb+l&NCV8DdwO zTd5p!ewi!zrZwkb<x7Q~u?zjShnNT6UOD&b-XA~x&!2w0UQn|l$S$~isfXqCs@ZKn z<7^w=?s=B6_~<77qdS*fS-I%ktH4*BuV%jD{o^*PbJnd}Rc^NNdwC?eHpYB-BU-c0 zBPe{c&yqm<!2O-;Mc*&oX?CeP<;;mr&)iA3)L2zr)nz^9X6#X|^#62HWcHLe%|cD? z&B>Bq&0o#GF?Sx5pLFZdj;pG#`ag!b=%0U}l3D$vzNAm|xOq>$puY3H<IWl`k8d9< zZ*cmet>fbQ=kc+>k98h1KRRr(+BAJf?&MclYWwD=NxojD7S=5<X>V3HYuW6y8EH$> zOeV;r?z~YtMZaQdc#@L*vnNNdb>5e%H(BWE<Z-B}WiMyC@F`(gp{JdSo!q8pP4f<@ zH%@EgtloP!S@-ez<M+G%8~tOS&@61*n168l4&D76KHIKDY4_EO#?K3o-RGmXwL?Fp zcd312Ja13$r<!jZeCytaF=b7k_$&I#qZTvHxk9^~<`i<K|Cptguq>#l{ky)tufu=w zqOI4C8gowMG+cJcD1-M=kgbW2Q_`U=P6iD&2~Fw}LTZyfoh}qi<;>g^tTcIpPGa&m z>q!di$CxzvawLSU%vxmBR;Lsmy4oTybgw~lX|m8eRU38H@JF}a9eAgZX?;NI(1ULx zY7di>xJ@T#OpGvBf3Ip&)3~{8YGFsY=A(|w8x3|hBs`gPOl6n)H-~%srZlpj^mzK! zO3l!yuq$egg^Hn_q3v%~#kui@0XrK4ek^v+46NidpL_Sl<l-HjbE{S#+1j~WC|~8@ zlpoR#1;vjVr++vgd@gS4f3EAFbgO2jYyEDp*JKF#E;RqZQWeq0g9Xh6rUsqsh3fUH zeu}A|I92SSy1vBia7NZ7N3Vm6s*j(~yKdOywy3b_xpZMyu;3l%w1emN&+^*hmbq2L z?eY4T*-S3V66e@Mlt1Knn0-pj%(R@oQDBR$qcQh3-$~D!j&a)XOC7tq<G5v)iM1*F zN3}lV{J2>=a?e?3ZG1NGS+(!Fo7%?lpB7|SCN?cymXk7hBA@cy(4J@4CthvsGKgL9 zUy9RMxMSKIO^s09M#-1vo6K*WJ>#G5*48iM^5%!+k*;;qPW1T5tbF`rrTzZqO7G7{ zPp~S7_ujE8I)7rd^8CIU%S}^0OQn6<v0M57TkZ#%JvKI<cwQ!|y?n^MnfJQfp}Biz zrTNdO{!sW|r7-C2lD3%n;(_kAKX&{-I?;{WRcP{)8BY##{#)z0Zpwq}iKmXJ8G9yr z23jsS{Qi`^fbS0TR?i^yw;`RAgC-eG4qF_4*;=*t*~ZGBw?bH2QVTsV>K|IYWMY$H z>GM$6fK{QFT9-t7_D`<!nAUu>@teTf_=5><Z5P*>e*IE4snPS4=eq@IlkTZ(Z(`rD z>_(|q)%+OSoqjx%zf^Au4UCKo?Ao|?E#sf&@9L*`eToi0NpsCSwoT{<|Bp`^Ug^(g zxQ8sbno+nZeN%kVhwdVUKRj-~*PpQLUhmEQsiDF3dis_}PXteTo~)`{Qv31Q9OIfV ze?vYkd7^qU`-l0ZJoWPjqaC>y#`u{UN&WfBaP3C4_lj&ktG%h8o<3Rh<bLp)8@#KY zSf4y!Irr`H)h~5V>aV=%rE~V|v&D<{D~ZqXeDWo?vC%Vg%A>X;Ia-sGW<NTzeOKT2 zwe{})=dG7bxW2)9xv}O#&E_9>h1}~NEVMbiR3b=i>4*37u?{@f=ce!A{=xZsimB%9 zpJJD^?Go+Np5$CSF~xmlX>jzCwk3Std)MbK$X%7Yyfi3sS<UQET1zcjt5)WUTz?#O zCE0t!w4i?;Yu$FmdcU|eN#5~pL}AwLD}5_%Cs+pXoNWxLTqSM7zE90=YPM%!=1R@> zyR(w6Jr$YybhejwVFu@peUCy)v!b-V)_ipc?n-_2<I2jF-NEL<>L)xOTw8C>eJWSL z>XWqa%qzkx#Xav%WvWl-J5jT0YglLSe(&0;r|z$eX?MHJ)nm0)=WDsqtJ0J!YhRe( zKgN7NAj|V++FnEEyvM%B4tsXHdfs{wsO}znG4e&$%SWYbfBoCmwmG+1x81+AeEE9c z`%~)-|N2(VTs6(idAC=!L$&_e>RSi4T+HOYWY@FGOe_0Jn}nNn<n9Z9X8!kOd78Sh zr>wb5TKh|C%(nEtSr_H5-&-T#9m#zBx<*~w)$O<Bx9+@k|5DZxQ;+P~YU(AQl;5qK zKCL?cfVac<{EjofuH`W86ZJb#{>AsWfWyTt2eueET}*9R)GIV|%frmhJGWjcbIgl- zdj0vlEt*$;$;>^rMA!Rv?3z;|^ZlZ=chp7xIT#W$Ps`7GUYY6JP{(;I_cUlM4P0>P z?Uwb$j!}hro^!bDC-NtIdvE5B7r*Q&sp_g)IVWKC+U-(T6GFZRE?oSp|I*WEPgByT zPtTkgI4Q8NrNNfLnnC<I>xQJy3)c1rKYVHzr!(d8vt`p(%m_T}c64&m!z+DR9g%k` zoFmOd3>_Gsh#$;dF=@Mq?WI+_^f&j#FE35fb-ye9wJ7A@3Zo0JCkNgyp1wJ4Be!|~ z8>Jl&b7$wjsAV?)w`Gb`?#k>nlV4W7{-tiTYuc`Fe`d`%<(m>;_loc3uD}&(0qxti zEOpwor@1&{#{AeB%mv#E{I^_7eR=ek)vs^AJbyjc(!N`B*Xyp>-MqV^c}IidyTuyB z@{<o_?Q*ty_wRerp{!nE-O}$R=SwYj896=HV>)*)@7M+F7M{J6>o0vTUDtKd{L*$8 zTfRqE&ng_S$`{uCy6#uwFP2&<ji*b^cmFpIOOP@ZP3u$1x$YjYs_j~keQ>>3y=%Sj zwtX)9!}j~uH^h8N>H08jNob|nzB9UY{zkgorwVTgRQP6wdYaX&WsXnW^z56MSf<X` z{4Y=2tlHk~QR061ykLIg!e<3Oonbi{Nd*QP2QRFAQMj0C^2#+G{I^Zi9Go|3OkTsY zuq}{napJVZ)-FRA$)wg~e^H*DeFnuWiakC7ULmu>L%cSz+~00uGShI5LCiB|m31uB zr)nl07IxmI7+<hD!&?9N?-_TsZmrqs^<U|(-rn%4kSZUg$#Lp?HQg7TU<!KmC|Y## zyBT_iOSUUav7Y4j`~TwuMJlFI;^M)(zs|H$vo)-3(%ij4#G`S}n@KW%UahVv3QUaC zl-Bs5%~pHHJO0qBnQxcOy}R_v;dxQalj{`zs+_EDa29)gdFGebFRz$>G^oqtU-I7} z(c+uz%IZ(Hjpx+$#Z>#tBwibr{kYMaygr@hyvGTN$r}}tFYi!$T-CGN@ZG^3j|%0F zMfbd4x5_Naa@X+}^A<b1tM|wmUz-}ey#3;~)#_1(MH}4Qzf0TBS#$Al%HI?BH{JQE zxSJ!;P+{q@7nR9}j;}a&Mq+c$nRABf$M48~zC7c*R@#?IhI>Exew?=0yyu?zvR^Zv zHMRbU*844U;f3(xdMC#77pJ?~3rzWOROi9Z<JDhuF1#>bTrVi{=jxsZ?4MiuS#RE1 z?2s&Td<W;M{l@ySeX9NcyJZ&aKG!4ZvF-Y`8ILxt*(YsWbVg-S<L*9B^;es<FYdh0 z8O45in)Z~){WJH!`tn$M^2!5i&aB-o`ugt4_S>6wroH$V7sSB!_4tihTV(#6oN}mV zt^KuqPRjewn`D2<JDL6H+AZ;;9mm;vd1a+pn?JAi{mG_0`OL~?Q5&Zv3m?xq-Y2`8 zMRMZZ4!u`gYfo-Gw(;@;r(a<O(uZe<`N!To9#!3Q*Y+ES=c~s1RprvveKj{5+oNp0 z{kyTL$8kN+nH%ZJz8{)wOZ}HrMt(cJy+&kX=E}NNE3(^M-6r>JldSz{79Znwc9GD6 zWe?OATzn^e>QDB{R3jN<rc$4_Vz=<B<^IP-<<I7Sdzk+Ie@F9o$)Na$pMMlTd}dhh zJjwH-fuykUCa(~;lVQKM6n{G5(;Y2&TBFijqw>}6Zpq(9>r!pb{D?Z5B6HHB_u8zc za;d%#mo8|_-#0F-3}-phwkM+S*z2D8#&r+Hbk2o+bl-YBvVZmI)cr0uH)=jA%spn= zTbx|J?_y`BTIX_4gNX|KTdzHKI?gL+UV5jg@bt0RikaMtv)%}mSMmB+b{#+3?=5FO zbMNeH`!<}Ipn1#s+<{!-?Q6N$uP#0D{N24<hdtIFP5IU(V4Qb&$K#D>cH}<h+Zdn1 ze7UE-<&fl*=M1|gul!ej65e3(;Lz<GF83FT_x~=s!~ZyLp}y`{*N9tY4`lWnGOF2~ zBv^OtRO5xrJ!gNUJ^uOq{4*t|E0129>^ogiuJ@buRNv25fk&RFoB~h%n9_OQM`vzG zdeHBa&g!pwcK4X~>`ytCmX@M-E@pD6&FhV;uKkdFEZ$ph@^AG=d;bk{Eeaof>daPq zH>)B?>Hn^)|02@<bbTymi1rtimDr#A=itZV$Ak3`ow{*<T8j2>xueT99InVJUSsum z^wGZWysFNo`5uq-I?w$0E<7tmJbk}!iduxv3P+a<VZZJ?3G<upb1B02g^i>6!wW6! z!tRXWyVmIZ-s@$v@O6u#aMFU5xex3Wdun-^gFa7BeWA)D7T3jbXZfBTGip0I)%6Wk zJJoyUZ>Tz?w(Zvx&d)#h><sy8xuQyc^Q+B`a*V&u9`La+f2cO!Ms(^l$s@x1<^)&; z&YSz)%zW<53AT#!^^LiwzMQ#Q)c;3rQg>&WKx5}L;oKie+!`#;7C&-K<2a*zu|vJe zSH>prXxR7J5~rT)E?cGVbhUbRX#5Yw-3vJKds#m1`qkdKSu=Jo!@SBbx;lRk+!uKJ zv-q2~k@a)$FACA;efC&<EDZEC+qA;t8DmVM7mxAB<(>H!kukknzL-p#`6F=>YZ=?V z#l1^&KfIjp*{i-)F?x|*#F`%~SNj&tE~&Y+)RSNRsqZ@DojYgEd}5m!-t~0Jyvc{u zdFM~@(s|F&s8pS}Y-=3TR%6ZDAhES&MGuVaCa3vFsa`ScKQr&+OV``;75D6&JoCHu z-rp9T>Y3k`yw{wh=XY|`uf$8|C$H_0dS~|1d{NtO!CQYFI+K_Sj)Xiq`EBxUA3o)u zx9`o0oBDk9jFWPcYdvq3Ro&&V%kfT8JMQC`^4;9MQ0!+?@7I*aPjZjxx$!5r6#Dte z7*`&9()&~GL3`qz&6-=Ty0R^P(X!I!Xx68RC(o<TRuh-Xb^O0v?Y_vZi&l+4W8!B> zy6a@lH%Tj+xlu9WLHJ|w)-Anr-L7t1^7l!|t|`-&|4x~A!Cs14vqxNPnej2lV=sTL zEc@D<l|0Mvu*J;j@j^M~Hx?dtjThU@FKNOs$y-VPqQSAF$9nZ&@IJc7!r_(H!`}0} zdqG;gui2YR9`8PhZ2Z{xu{wF(fp7N@aUT~jzFpsZP3yAJ=F(-+%ly;cyQpn;OLNZ4 zh@A7bzEl25_Zhz{3eyYhzI|p|^FC*xpYzI@U9vNqcdRR8dTdvmk|wo!LD{4$wpD7y zMbCUbedJiau<OKwEiXU295?b$op*ZA#GlD&anI&Qnr^z4R+;uQ{b)+=xm()CU44Z) z^S=u9Jgj>bKF4)Zi=Sd|jjPug-vpy>qx%aZPDM_#>YpE=Y=3S3rda{Wu~W{ZSf-uy zoSOQ=l<VSjnW@)A($tM24@Umwc$~j5{Ggca<f${Za%J3D6Brp8`FYc4?(S1pX7VX- zRy$CAo6plB{BZtZPgAQU2VUeDHf>$<_3)hgMRPt!pX*E8bS~|#mcia<8U<Yp>c<Qs z<5Oq8*u%|YF@0Ce6sx6Qr>qS==l3%?Yx2t4<$N=D)xBE#GJpAhyTu=Qu1h8wi=CTg zlKpE9@8+^I^9-vmzA;^;zszI#5C50Os!3j#rd$jb^NAEb>=Wqs(r?RGzl77bLY?g< z*k9Ts+wg3zQHB@K#XZ)Y&)y!mT&3dw`gZV(AJ?}eeR5iQQK=(gF6Xa1wof(GPi8C4 z6U*({I;W`i)LzZ=%m4JOc^!9T7hlV@uT$igZ4mlb-B^0JecL+bg?r{_*<Nis@tYxL z)$%Btt!J<F1^=y>6I?Opy>IE_f_XpXZY0?&E1%T3dA9J*9G0|IS+9hqR;)@}Rrku` z+@Z+U7gu;LWM)0Pa<j#6HOJgpji!CQo3lF4Tv;3Zz1TvBanqEURW+|H%jBnD3>4cM zmu&g<<QC4$X+FDCwEWkaT{U^zohiFab9w1}v!tl5u9?5eUafapxI)y!XZCcdv{`4j zh%Ngx-Q~v4OG`rycAa1qpUP6em|Y$9V2ehhj_;CNTNfA$o%(cd)~VAcj#tdv;pus1 zOXcNlg(CZmb46VrzPzAnY;c*+$NH?a&}xBBC$6iXUF0s;&6;MuwxnwBOW)<Em$Cc% z&$Y|@wdLjQ<?rX$b!nvii(IBu<YilUOJ3A}rM}zd#jKl+_n!U2mr~Ys;!Q?z=$Vr5 zFYEqjmhxIIeYYZUnY&N_>H@F5%;jFSVyWxQ9``S)USfFpxleqL&ks&DS>xKPUwGdn zerkQ;@r%7irB<h2#rE(4pZx}RS^Agw?>GFbXgO&ev#;&^f3{g!R(6y2&02az;X(A> zx&MrxM)N+4+*RVn+x6h}q?wYs=_Mw6)86j<qx55`&Fe~aZH?BM4^5RP$a`x%{CRcd znVvf1v=v8;+s=B-IJkfHR@T6+x(i<Qe36{Y5xQMq)i&KDbu$-Vt2*{ea(7zHypLti zW=2}ga}KJEd4Jx*@1d1;sLkVVJ^5*SSRR@E*8Q-gqr~9hi$vx<GiHe{4V(S(w$JLB zylK16@ywWMRV+U9phM%uZ?8)8DiarW&AeHaRvq+cOTz5b=9!V-rP!2B&YamW^Kh%% zon&L>b^IItr!6}#a-)7{&efa7XW#5kPYZR{ws~xEJ|Oqm+?nUor=82PIh{AHDC~!K z#V_^s0xR}LEtvg2jp?%dyWX^0q4R(4(zurqE?fCRdBdbLTP~mbvw4HZ@iVK;PP0|N zUp(Q~nG?<YG7Gb(8X9O`)+-HLen{!jljTbdH}5*f#WJJ8?m&9G&}Hvnz8cLN5wrB> znPyz;h@2(<hV|r1hYhoe9Ng4uDjApgEdKV?EqQzC^m#K)%dZ(7a&5QJo8J?YfARdw z;G@seWM`JvZ9Dr$VxH!t$ulCu(`%0x9=jX)<@b8yQz4Hcmqog6zE@aNAyya}exQAG z-TYkNA0Koc9$u$;=8fCtyKx7?mExACb>2FcXMKBS)RrWfyB%!ZC1u-h9^O1L+r~Ph zEPjt~GQ+faD_QD2u1n=gFHej7Yf}9rNAKU&WHa&quN-??=3A)N_XK}Rw_9;!^Y(N1 z?0-wN|Ep@L%WnAhX7lFtf?uu+e~HeX-mztK{mkI>a~F1AD|UX)H`_XQUPj#F%DB%= z&;M>xNILk4)m<z_zbA4>#zQMn<KO+3VK1y|G&$`{`ZmtFT+;V`j$QGujraG?KDy+5 zrg^(n@x<_tx2N6{dNQqmYZt4Pzo?k@JYn<n`*ZGxoS8GRxNL*@^XE&>&ooG9lXA1Q zYuenwZ+s@wj6MGn+sB{VBmVxASoPKN__H}}lism^I%=F+{O)X}+4JR=JBv?!P!xRC zoxAVY^t$;0<`3pSl>QK3l>9<0-E#Z8JKu_}&ws6-c;-y5(RSXt#$Eb$*F$H!u3)^m zR($X5*9U_im|nkaTe{5k$sLVF57^W@p09c?^{g*_f8Dg7WqDe!nM)kl-Mn^O)b-pl zXLrK8S39Gh2i?DD)%*C<y{NQz?{>Od{*gbhe&TJD@2Boq7tcTcH}Rdc&8z&Mf%}gv z{x?tRYk$R+n@#UOzg>ND%MGLRQ58u?)H-KgPny>h9k%=V*5%Vet>o@9+<Sg+a+0ln zR@|*UhM(om{Vt1R+*c!Olz(K8OHYi-u@(BWqJG34xO`;$v$HeI)9-z%jD9XVRr2Wh z%C1#6qFtV(eUjMxo>eYC;o01I<=#K`9uU5m*!kP$yv>n#!J5Q*ob#9LIIaI=gVR@~ zi8*z%f66{P{k;AB^)uJc%G=k!{PXzp{#o;l|Nmu5bG*$uSA2)w3rCTLuIT3Voj(nd z_LaMSPAro#-v9s4!Z!-SU8j6nf2u9G*`Shr{GP6l$t}Lhso`wvr|<dAx8~8$$j{FO zYT_q{&SCiT?&s@g@8|6AH#Z9T`O)p7Wm4vitQkMkpWk1fkm+IJtvp#M>Z{hhcJ0T# z{E<?dA9S;tc?d{1#6(}HaP+>GGo!PofBwb5@VS8{VzU)9=SV79g-$!6^J1rhgjfH* zO4UNQ+a7Bx4nANN7Gr47KG?x(_2um8eDRDE*Of#IW_R(PIj8%z@&3s(E=xPb*Tike zJQ&w<F)vurGUIcXZP(>%atkW54t};sJJ`y)J$~bEhSmhjw|Xb^Y9r6FdAcq?UG#AB zkATpv7o&AGA|k32U$@qZ@ttW6KPbK@`h)eOL%-6(4^}TOUtS-1Lqh+*{msp$+_&|o ze6~{WFn1}_edD*bTjiJbqW@3++)QHLY*46J%9mmEduz+0Ppy;1{En|yZuu{DY(r69 z`t354%>}2Oe(08Sm+PNtcb={Ea@&U^hkkSWZaj0Sm^(kP@Zr6HO%X>8x##Qs;bU)a zj(f7dJ^$c;!JdC#G;1SSM7m!vl*^<~tO$JT`se3*>kgjUAEqVhxf3;V0}o8f_LkH8 zS=E_&^Hpl}^!2fY38`PF=7#6R@2n5~u<GS%v-P)DuiC6pc5#a9XEEK_Eom3$x}Fz* zs-qQkr)uM6q3@~}z5Q0saGmA)lJ)3Pm(7w7BR%qVZxFuzKhLGNj-$7a^UNaO?!FZ> zU9H95y1zgBpJRQ`p9$x5thT-|ax64YoZt6HruWqE39%6oE!%bG{_OqXe)7zsPe)5H zWM+TUSot7y<4RZk;`>3>)5Tfq&Zf+**m(NU0@b;pXOhkz-S<W^e(?(nqsBLliu){T zK32Y%c~+z}V$Oz&FONQU_jW(miQ8E5|B>>|FLxX7?>;DA&HbQrbIm)8Eh%zaQ}$ml z?!K;judAomagL>l;J%l?r`0<in!5L^N$`^$KYk`%eq`R=E%txckt)yCs%3}X?K=Ff zuJP{P=euY7mxjll*IBuB3FE6ggX?!yZrrurXRT@yQ2Z&5F?!O)?&)75E~TGjxP0D) zGv<u$X|)epHrsdKm~EpzttZN;^5hlO&(qe#ZVEr9Be^+c&zX!;CB8q_Ynb+XtQ9_F z{7wDLxf}BroWC*u$JFyTj_6BfKjQf75qn8~!MxO|o1Z)mdcE}QbSs^&F}n(1&RZ%z zUH9Shoz@%A{+WJFdE3nWFT>we@K|Z8{MjY8-(~gEM(=jrQ2nd=u~XJ2PixcZb=p)V z6!`G5L7gSj`^1K}$XOdpmVNm5*5S~u$1UQ8>>v01_D#KRQ2t`gw0p6?t{SD?{E=$B zve|QC!INN@Z{EJ%+|&PgZ8_nQb#CnjP3xe;I=_=<F4M@{wc_-qw9~hAi{qYc)hUQ% z$?rT<b@G&?LXeBPM&<HH{-5?QyR~+4`ZV4cv0kbE2S*a}G-oJXP}tIQe^c6o{EaIO z+G|x~)3@AaQz^6j!zRAiC5mgmcI2jJ?j>jZMD%a(e$)PxQ|sfV#i!5d?>@%aW9t!A z!ZfSo=H1lu9UeEFU7Xa<ntc44`tx+xbap-dSUV00$@4x>k9JNwT^Fwx`EJjh*rPh) z`sUnX{lZ6FXK@=(?$qHBoU*F5Kc|mXPyL&jEo=Msd6`E~Z#~U>`uX9_TDQA|XFh#A z-Cx!GUG#L}-@8*Y%Nz^!EL9X3Z^Xy!t3J9!baR+a?8ciR^V0VI`SR)g^#A)7-R%0N z-Nx`lU$0)_h`+wW>Vw|An{Co74Mnd=`c4m1H`G3&{pxA0f#_aU))SR+@s8eM4t%d> zie3^uxS*@3b^n4c#{XZ%+sZHTp5eOMWg=mr^;pS0nZ@<Xo)cytdj5qt?0WuQb8&@N z-OjpID=v2xYv--2*s`dlfAx07!mp{CXS(#m|4ayvSZChFmpN0^QoE>;_vf6)=Vv9z z>|gUk_+vVc`s-s$4YYH^%%1<Wn6u%2c+~2t=d^9Z{bDSOpC-vY?0jL(^r_*k!L_2) z7pD$tKMsHOFns?5?!w%J6<mjPZ(4BuyRd7Ig!9@ThV}72-+H4bnD-hl{TiN^;4kd0 zdc*(TV&U~R`#wE9Wn;Se)0<PPZ#<U^=URVd)3J%UulF!b_<r@2{EfG*!FT*N9|_Ig zxvAvo`qet&S5Ir!bN(rqZT=z0c*DutQ3spLm&vr8$j>~pN^SM7RWn1^hHX84o_$H? z?JY}8=0-l<;?)@QOXtx^e@(5%xoNj{u6@PnyEd#UE%eB$&RIGi&xSUKudGxw)v{lI z$=znTu#h~<+w-woo7CS)%rlBFTK6&VoT;5{*0PK%t8TBhU$-$XdGoT5QoBv}UTayc z6K)&(wXAgc)%-^@LhrBn)hWu$%xy7ui}Agp(4VX9!>&i&opi!E-tocnoskjGy&qcc zT>s$g#hGF1;lJ0t+i#V(HLdj3E5p^x*Z+%Ci@RH0`r;MG%8Rd5E~Kd^AGEjJT=n9W z;D_D!Z4TJ~SemEa_&&9C(u1O)6)*kzlETi%*2?!-UM>2%>gw!p`Ka2Js}`kseN<U1 z;$Nq=e#r%v{JMfKHx6W<t#Zl!*OI54x8zCX{Y5`?R$tGyTKjNH%6Zc}-|N4q^zJ<- zv&;N$(b)&4AG7t=<epi?^xdk5Z<hGe50~D~G<|$s;<`_?arN0rrn9fh*geVHVpV)Y z^p6$OnMUI!D~%5^&Nr0)AXycV{vdYoqAQt;-et?JKN<b`byQle?1Jv=HG7|_n;g#V zcp@?H@ILR7L|@Lj<`+!U^e3;_xb0x&UB+wEvfp0Iy5<+N+v>UNCzFYHqkcy9Z?(O~ zwmx)Ye49#U@4LC%mt+}#cpFx_Y|GbM|L*LXyzP+q<>-y)&w0&SclBfTrq;el>(sY4 z|BQcgtzB~S*3*>*znk|y+E@1amhFn;&tCZi{@&WYf^YRpvCfk0_;uBL*QM-z`)dX7 zD_&vqn(Z(9&*qw2=ZEF{-AvlN^rzT+-Ps|g*Xv@^_pW=lOYJq=I`5e2JM-S{%6)xq z-RWmXU$OWtmUDUMz2D+=>9*Im))&W$AJbFTG+{7)J8S)9C+$liF7Lm-jTb-g_N%PI zfqmhxd{%S6UUbqWmO-m(ZrR<4MT_`_M0KBv|JAv-`Bb#~@&Dl)3{5wPE%cv${^74; zuFda0?OGqXdWBP(;hwKdAw@Bf^R8tqe^R-(aLv<Q_pfzdzaDj8;H?y|(r!2A4@xJN zZSP<^V)**@`ssz{e_n}7&iMN7b!|tkCCB_@Qk(YiTlSjz<nFag``h%j{rdCV1hXx@ z>DScP`I{d!U+MeisA*^TzL(+(LD&7`>}5NzymVP|u7WrI*d@c);p^`+yj}aZD(&yK zuhlogcNSk<edoSP*Y){v|1<vfH=Ms7A5|~>ac7Uu(m;hvKh`eZX;b+5`u@coyLXuw zp4KXNKFfQy^;@pKQR&XbN2RTD3+@|Cs8!{4o%m+Y=a4gP@1%D)X>*-oY}|1xEaB9H zpUeLoQfl6qdpEpNp?&WWn@r~O|Ia*eNjp4+ceSJUW;30KY4562uJB&=6O6yLq4e-l zUjBrmozmYH^gi@S`_uOLk8evdQ}V;~2P++zXI`zd&sbx==jN4)$^Vya@a>%4AUY+c zc5z1X?cPtlwr0!n=4|-*@tC~1p;p@BuWp-P$1P^r=5L#rwkAP+jl0lh!-8a+E$s{< z`w9h4epq7b&in7RqQ&<2Q`PQSls>-J>(0Qp*?gVIk69;0n35iz{P*rbu+-*{Z;oZF zEY*%R?)>*4H^FR{*)-1F4S7t`IVui&Rn`X>tP)XZpW(aK+;TzwtBu*rc9yxHMCK^v zxa~WB{2kN&mh{gt-_kAzbe#@cW;8p<e6PohLp7T--z?Ldo%WIU=H~qmzXjWD&iuHn z`_1)-hT>+qH?~w?HjH!QeU!cBiHy)Q&Z?Ywmiu46Q+qWviGSabWXFunj*_)~%kqsj z-z?h9yMMFj*?H?dPNb;i<oTUb>{+am*AlkpX71+q&lLYmc>d8@?}m&UZ>6uNrP<3{ zNl$n9tKXZmukz|MVXcqPI%lWn%sc<_PkG1l)Ea}F6`B)o?kP0h?!MLIf%Cb;%fIQE z-@oxE<8%1z_#)lEEm2Yjj~CQES|6XQclXb4G4FM6LPM_2*RP&h|K@u-^JdpgOPTEs z>=anPw@0_A?yaov_B)q~y^l;=qPx1X>deEJAIrQ=T>C>a&rA!9o;K^snQ0rNmvQe~ z$M<fVNYQ++&zppM-|utZlI`xc>*<AQ#?gBDJCBRbZr-r|WU_s`{L5+Yx9_=k$h?wu z>et7o<1Xq8zTCd;Zr;|t@4o%K-Tzi<fA+6?Zokdn?B8zx{XidcKHpWFD=#iIANJ*s zx2p*ctzCUPZ2sE6+t=N%N_zct?ftyJJJ#x6|Kz#Cz*x5}=dCZR%$35h=;Uo`xw2bJ zKV4%@VT+9vxx@PD=a!i#E8Q}R=CMW<zuva?H|HgF&hj0fzq~ts`S*=$>>_)QKYyOy z{J$}tSL)A%?5g>(T=wD<R$N%mx@^0{m-PJ2_pZ&EQD%30$B%Y?!KXJ>wN~d|%6+^o zHP?FATb+j8d7tl#?a|GgEw_2QOnrP0|DV2fB5Be8bG0rg^X>aNUD*8kdWOHD3+#hp zR=2zD$^EwN?Co!vGjh4NuYG9#WBKBmaJy6~ufl`>Hs<fDxP3ME{kFgB#PWCV)=iI| zIP2!Oire37e$HGmM|!>y^HPnA^5t(<SAV$XxH)3=Tixxaw^ir)-<mh`Y+QI~?)K%& z%o-!OFYbIF8a%`CHuLuHcjb=%wu%qGqxf4)@@n(LcUQ~)e%pBAScRjW0N>&s-er<D z{hMlke&bzYF1k%GY5V&{1s7JV&fmZF@9Vew-+s8avGjPWZ2a4jJ1^(|-DP7xe|kf# zW4wKye*619-Xgc-x#Je?KKrX{k?gXN)3R5~uH3y?<t~0`2^V9voLTaDWv6d8r|c?< zYuxY4UbKExw&cx>4ax8NM2*spH^@3S951$!`(w?sXW`?P$$i|qzaOVf`&(#Nw_}Fc zr+#%K>$3L?LJqq0{cQhmratX>Y}Ze9(To|g_V3nw+|=>6OlG|-tM$FNDJL|d1C;i% z_BFfi)jq|{XFA1u#lfxC(Sf{q8YTwTORa5p&R8HTejxAnxhYohPqrD?EiX$yc23m# z`ujUOKVLfczU<$|)yLMk?VhrG*IO<nS@nXV#SJ;iN8ithDwNJtoD{Bkr+LcZMwJ_t z3C}&1IJr7hJWhrhTIav3Ig~G|Iw5w^H>tGe-E&h#%Q|ItNPOVw;`9BXtGL}HExbFn z%p<dx`PmD-<FV)7OuJCCMfHnZK1=Vj^NV{74R#+YTYC7j#%{JZQjRjGOfH1{StoMk zN=S`ds_O1nY<sj$r^>S%c70O~yS=sMd&^zpGX2}eHU5|4q^Evew{|z*8>_9aU%fkV z_vD{5{SRN1&xw!U`)Ee&_VV&Gfsya3w!LnT-T!`_r^iKe_1y~`j=ni{*L9!HA9K-q z(U037u3x~SJl}24Sv}oA!`;$v^L!^ItvGb?)yi+(<=W-d@A+=X&SHLB@muxhn*8+r z9D3cKL>B)|vdHu@2;I&8zE3r{bdJwdqx~k=r{q8KW7B(h)Nk?homaLwPq<a|z3s03 z+q%ual_M7IE`M*g>G!2~?kNF!O{!IQaysV;=v|zA=kC7g_OmA$tL`qJ{8a7cUq92k zuO7^cs*ZY7ct`pE<IT(0_uLGw_n+*1K-r$-|H+xQ+p6C@We94nXL;Rx$hGD|j-dRK z@OO??A?YS(<^@)(i4>f75L@E6@zibO+Vj_|<Bk|sKYO?Hyw<`s{f^aP?{2zW379bN z=H}${k_x*XF!#&P{WhU|zn#^?CFiQwO<Z!$Ri<#~4^O!ah4S<HOB(yCcl_QjTNt!_ z?=_W`!rCi0o5a7#-EUs>{=?qnZ+f?P=e>Vd`!`N}#j=j|Z$jUc-o721CKBIPJb~xm zv+3e#(`T~Sd2p_u&Hmxh%Oi2Wc27`yGQB_Po8LX_$qAKxc1Bg}6#99)%2|IDc24j9 za;@6`?ccoj`M+nqE50GVBI#S)jq3Opvn5#iybn*8N_&5LuWQJUa-mo&yUv@(->lZ| zc-nWko|&uB-XUsIuYdA4%eS8wNN-=p@98h%R;S)GS3T(6<@d8U<p0{Y_V>3pyLY`m z{#WdG_WS%@_mlUZ|Cey+#K${H=hP1c?9C5!P29o2c{pXmx^J@gj_<9X=zlHLNTBie zyEoP6x(`$+G0B>ovAewQyQs?oTXm-8!Actp^_iw-p80p}_uGkgPBADI?7v)RslDf! zqTmm{?gJ%pEPZAMzm>nOZ&E7w|KM+M^31==-_(;VSLo_DGB)sAs=eEtu;XGqL+#mn z{rCURZAyK@73TKMKkZxo?fR~})5`Ac?>}^P*$M;2%SoU9c~6Pmpw@cxf6D*wca%lu z)qM0=`}JQryOm6U42Ru>!h|fF&HuMEn|5vXKE3npZf&+_4tJT)T1?cbIjuh<{Z*n( z@O<kF%}K9L{;afoTJ_A~KQpJnqBC{t1HZ9flPXNVudp!qPJ?)xuZ#QM9|!I*pXOh4 zUd`|W-;G17J#AL>9o72S*v!68?nLFvb0VI6a~PUh&usIUwD??!MBxLz-zIk(m$UCX z?0>oUK;k!xX&Zh==Ei<r@bzF7`)!#Ldx;W*ZwuZ%nAH56f1g#vx!b;R8_yh6V~;)} zB^n;w(^aan?u*dA&l6_Helz+WDz`!GP5IM9>+{p+-*)1Ro;;&DkzHB1r;Al{X4hAC z_PuBH&Nbf`T(M*R8JR0GKAxspa-xlIj%!Y1SC=u7n^RUG_QS-Ue@X>gRa7_Mi{p}_ zvl*6N_}I#|H?MtqX33d@liB4rnB@veOC+0%2Q<pQVB+&?cMbUDSJW$4dxwoPxr+b9 z`Fp{~?|1K5+9F|c|J6)qUB1}hNV!e+Pij0WPqZgr70%Gy^|9_s=b;vTK3CZ;%PD0U zmljsGUz532`r^lF8?PrUoJ!o67erM0+DYE$YUz(rD7n(~o$Jqw4Q>kp?(Hb{%kFHn z{PHHiu3AG$F?h?<3;tIoooq7?n(6$seeKzs!I6!&v6olNzAM;q{o%uQ({^$BxataJ zo-3(0Q)R<s-m&dp$vn4t&e^#gbL39T@Y&vxmoJmy-(PSkVaw{1>t{K7o=JTBQ1Z?t z%hC#)ttD#Hir*`{Fw`^bwG7t3`r?A9E8FHb%Vh4A|4_OAS!UgH$vgi}l*@OWx}P3A zy-`g<tc%B8r|+7@t!FR(Ek5rbF+Z;2*=^(X=cmleu2}bZr{?p!=fq<<g05OzdeZS$ z@TuT?<-h$owncAF{8hd$`?GWQ$F=&CXDG||S!`xEc(ZL&V7_(Dob9p`PPqT+ZxM*Q z;iXcv+vT*fa$iPYkL9Kw9`B0!ADh}NjXs`;S@^Q3^@3JZ#^IQ=+N{cpkC{%K?jYV5 zv+P8MPIbP~#HwqymwF$qUc7nDJ(-iXS&X(Zwa<><bN3Q@_&&bl*n8h6_h(By%ecF^ z_krm>mUDWm1+#0nd=8wxIL`fVzn}dsPS&2QFRE3`g!~Q6u20FRH2L#l!D3GL;}g!Y zzW-Y<lmG3`H<pKb|6N{4$<3`V;S3SgXZ<efcJbhg8y3%ATwMHo=V2%9hTRokZe9HC z!l?4lOY_w$_xm!s_F;c3njiZepWH8RQTL@nPybA<_RmK=2~G0ZWoO>a_;TYw^5Xtn zi#$iROMwQ3r;9fio1QW3Pu|;de5(0u+3<C&T)g(vl;%7TO=)_3vGHZ{v1IO+vpGiD z%hI@tb8c^x{;=_ek!bOo2Zrx#_Ah2wyEN<BjlIeDFT`w~^!DM=jq_V=b4*_^^lL4? zS~YL?I{E1VcT81hTI$)$C1{<~)e1?!bxZF1v94u)ahe8>eeH7c-)>D|o~5p{^<%nl ziNcBFu`8z?cbA`EQ}gko>=D~bPeKiRWiHQntlgjQaP5Fg4zJFkYi@3tizePooRReP z>c`K=<>miRJCb{+|GpB>TfbeuS52{cRsSY-UY})L&7A6)*}S<0>pZvEUHow5-ef-Y z^7&krwy~+DPDP6zbKdN{r(V%sDjoItTf*7-1@;GP|KB&;^z7~AnZgg%cf9{Und@1) zeh=ebR-?e0q%WPR>emjfUaYP*cg9iow6LIX_i%-!@;POtB|D>P9=+(?G}%;G*ME+E z;o~Elh3{Bzn#;0xt=Z?!YaCBc-V!n`e)QPW`?7xJ(o~12?)Zbrg=KoFt8_k|oXqQQ z#>)0jxzY2#$Kg38Rx?>c{1!d+?4RuHuQu0Y#f-^!{oA<SzUOKDd)H^iOqVO68y19| z75bKK?RU<0XHS7^kyLTf*^_5GSbJu$PRm;BKhLJ}^^?Do@6SDBcXfxsZh?8b7^g8Q zh1phYN{KhD{==evRiCl!j(lq8qsjSxhRd@UTe|)K&GJ4}==<URF4retJcHlKcqM<+ z;4AhjS|xnmDRSwba;<rvY@WJj%s*4RJgKPDb8o;Bi>3Ca53hU)j`n|RS^DP6-{8vS z+4J&>c0JC#e)+Gz`h2rF^L(_9744bo{^tLT;HfwM|Ipgi#@)ulYE$v*jpn;Q)p8FV zc_Z4E&zt+J^E*pYr}~Ak!*jH(asv~0-YlGVK;%?NM!?4tZ>;ZG1}rgLzSr;fqMwqy zJew{%E<b$3b5<`$VAtHF+GQ{Pyo?BD{GF@)zV1MG#BurgwoNZ&Pu}f|UA3~T>hVk4 z^r-oU^JZ2*yEF6m9@d3kNq+KHwcWyg)BWZzZV6tt@=ikKubVI9&xKeAhaa8u@7ot? z#otRgcdT1yVBGd$+3W=(ljkp<cdVv-*=fms<Gts<*e`zkHYHQ1c-e2sdXBD}+jEXu zx_+o;yLm=1>e-nK#vhOBa4uB#jttW~B9>}js?D&9L;h~$#A9<JYo0CO^m#P%YWg;T zhg;@M3pw4r(*47wAHok_IGhyurQ3P(iuR$Xth~iruAb{Uf6emtn>BylyxV;I{M84m zGb*ywKSe!w7RlaqAvpMGy6yROw!1xZE3f^3vt~2*dA<6HYd70S*O@(iGh?&cW&KoD zt!Hl@Y%bi{5PP%ML%4FSLce#F>!c#?Pel<AzG_#99e)&)c`st|QIj8U)*kh%NUPO) z*z@f}WJyioJvNEel?lC1W;J~6+kflZo4uR!FP0md+x)(IbACZcu|$2<W#)SQ;>DZa zpa0jnx&8Cad8saWCR$;J&!gsKpSSZmb8MaNw+(CR9MtWeSLwZq$tmO8J$Y_scKJE? z^K)KT>b2ZmSl3*(V!tZC_~ISk&+K`_a=Q3daa*zEbG4^Sq~4x?c3k@H`e_n9-<F@g z-1DvdYw*ms&&B3g*Tog>D=zC(JN@eF&d}%I1h0x!<Y@=yHnwobt(;k$e*W%*)Zm29 zs$Ew%7RS%6E`9fQ=cdn(KJ%uW*(rZ+?*!?!eJc;{KWz9wd}XbV#6hbxv4d7_?i>0p z-rr}|^4ZvnciQvXbFa_K+y0MIwUaNg`}8NlFCfR^(JEenpy#2_-GvmlHWuVcC+N<b zUs8AMXX^9qf`(HSH;4(JS##87;Z}|%bAJ5U`Puy3{pY{#bo`ofz;6EB|BYXEPW+;I zuzIHPrK8X9$0z7*c_3-qm;Pn7c#ekK`J~F0oeA}gR*MBsPv2M6`0t<nTZv~*H(DoW zJ#*U6efiV<l}E)F>8r#k`2XGJ?Uk&zB+kQKsn{qi(|d!1Onk&N#eEwd96H4v?NMo4 zqt`k0&cuHUUajM154<Y5<CWCgnu&i7g^O>}-?KO3@1pNV|B1WD#uODEK6+UEeC(fx zk5+fr3!FMuU~)>;%dPZbtgEWAdf(2B;*Emd$6OM^;&UoD+SXSemSdbL^t-#L?xY9f zPW@l;PyWo0aeC*Xa7d4D_ly&-7fLK@e`9jysG)dz=mqC(bL37fN(uejRkdQyb>~ke z&mK+f-Y%GWsZnm%j~9=o>r|#G+J-c7+IXFhIkP{aZGMW?;g$0br*@uEUF~i9U{(JK zZN_!0b3=Y91^!aq?tNEZHSSi)&dX0foG#a^uU>j?>I&`K>)!0os=xaC)w<Q!*X>-` z&Ali-Sx28WmTRxcgGpQ#erI%=p6Hxwe%0`<Y3Y$J{iU%|#hI){3+FktKfm<EJNRMD z^96f1_*^{h&Anld+~KvB`z=;`|JIwk=gWgjn@?~1@KyB4%i4Gq<LP=ayBgO=_Z(VY zeBn>%dFA-jKew0e@wSiuRj~8j(`7rJgzsRteewVN>1!Nw^LM<fbK{MyabLIE=DA+z zOraU4H=Ta>;?uSEl4nKRPure6b6&|f-ZrqN^1;&?r`dOk3a?1jQ;)k=_<cj%;oH&d z`ss1=N-JMJ-8#Mek+wqRpSQX_&aby$dApXWrh0Y9uDw$;4PSk7jkB8ij5EK`)Ke(F zuJY$&(d@jVdHZ8r)<(SY@?yL8&pCL8Ht%|tl{2)@uCG|=9pf4PX1&MHNv?l<r+#cY zZEa_B`I~p@I-Y%-ICe~b(>i(Oq8Hkl;a|el;%A<%3#=9H+Q0jAw`Zf?%9hL-+S=>Z zw0`XGE9gBW(7uAhe(q}j&AW<zom#5BeO*oIR<)$x%|9BN1V5OF>h3>PSNv4u<5unU z>uUCBJ-dH%Z}C!*`)t-7{JH0k&40f!zO`oS!>eX{re5y4de*=6%vHbeyDKif`ut#O z#@e_V(+62suKGM=K7BZHXJzS)t1fYQY#)k>Z(l9R5;JM&3eYzWe;&JZ-<MAfKbxnw zN3fmPbRovJ?5oVPnLK9<UcL+qmyiAX?N#?``Sn+yupG_V5|qWDSZew{i!<@+%@iKf zGwb4iep;@+ZtIS;`m>$cFO9NJPVfH}yX@4rJ=eb9a#;69HRM{mes$&-nTs#7h1Xx- zeech%zhC9o&CdI>N3inokzQ`|d8>5RpWR{h|5jgid!TN3!|Sc7*RM@pb(|w_-Ji+_ z-xn{BvfW+w@7DF}b}`5MZ>H3i>@9nK>+s`s$NJYD2`lhTS@*Z%t!Y|&`T=eKlYeeJ zk1{;@{<Ge1*~Dp&_+2eo{>{u#5Z<q#zIyF??RDk5?Oy&`^O}2|{WEpfc^Q>^uYcWl zeewG2&IR|iE<Eu}n`INZ;$-lT#M%b-YqC`ft{#YqudP-7BgKA^rDFH#PrvrPR$m{# zvu=9*rL|_~7xx{Rw&(P}eV%vM&uh`yU@7(SYt!rfcQOu_fA{t*YxJsdu37wz_us$k zwkF()f9~AXKC8zlcCOdYJSM;7=_y~wr$=fmZ<W7VFM401NcrEfIJy3fmHNJgXL#TC zsy^ZTAM)(j5ozO}UpLNkf6HITU3a#(_e#*hQ-8YrLu8E%%-7xB(Vg<xCFjW*-}Jni z;=@PG_f1(JVV2gIapvqVbNhRnc3u56?f+WI?P7N>-i<6yKR$Po_5OQXcSOI=Q@$#0 ze*5m5lFMJy`e%PMUw%KP=CegqZg9tT73m}9dlfo&N>&tGY~RtH=N2Hb{-`LMQt+#^ zTW3GkT>WVi)|&dKbO+<&nX|R?^IYy<(9He0aE}0Ykg&dX?6HpgdHX9LKQlg5x|ii+ zztb!0!n|j9RMhL%+~)N1t#{n@=bviG@$IkfWHCto7qy%<N$&WaO}n2S;rx?%Kxfy| z9apEiNT)w|YUrI?sr}{Jg6LP#!apzSo@$PN7C9-FE2nFj=b5!jqF>%As6Un>8Rw#5 z#j|>k&yM8JN7t_1{_XCz9kx%tHQv5|cV+c*@p48Hg~}(_cvFtuyuY)QZ)V|#mtU0( zzN#J(-SzeA+L~`Wwr)AMHfLT|-5Ta8np=0e-p%~npPU!ITlef~y$1KxH~Dwg_0JDH zp<Tm!xH|u)?j)Hh`CIl!e%ZHSN5|e@6A#>ZS7<%wte$eZ;#>U>4|dj=7F$32b|*Zw zrZsT8@mZ~yhX=hsoNO&JuuqZMZhr6HLAE<fdoOAhWeS^l9ot_1@|*JJZ+;&iaPIw4 zc24%0U$4lsZ?kW|cQCYh_^tZWgUQVmlLeONYB7I0cJS7LJDD}duTAM+G{=p7_9CyE zv(|FuRSHLDB^{YHRlGRju4IAwL7vsgHWe<1??_gsbDh`Zo;<^P^E;h~I~GfPb}>;6 zX3NlhFSD!o+quow>wk82SI&(pdM>v0&7)vr)!pwd+z<Qys@ANMZ;7p#Y`gaYzWlwD z?9Wv+&G|9s`$B<;I`L!YgnIXC@4o#t@BHqE<&)p_?X`aR?#yoPO3628=igu9zvb9# zi)VTNcPsBOHSWJZcdoPjrg@7DyUqu5@EwVeeR#2Q=0=Aph2QV&UHbjoo$5~yE;I-8 z=h?6MxZ&esw*EbGUu#4@YCJ65u<F^}^zzN`_w9`?`hM8<<KAiCZ{6qKY5wEhnKv?i zb6Sdmelr-|{CGD#-EWpF!_w;Y$M&+hOp{mex;|6=>lKw}anGw6W%d@os|@%O*A@LL zdIB%2`J!TtNtNFpy$f8w%=h8)H&6F+h6taW@>k?^*W&8e?{eEj&Z<7j@R2Ege_^k2 z%a%p<jTXDgf8LXIihpE1W%cU2)s_F>{@uiWjbBFYg<OvJpGR>&_u9YnepkNJ{@K5t z-_zgQt1@l;&i&&|>#Uvef9q-|eT!Idfc5^YU+$dx5xVbx-+5nK|KP7n(0RvzqHU2J zRec65w%2ubZ(&d{{QpmCmyhI~13UIV{g?QV?b!D;X$fZSoCF=+)4GO^pO;QC72;^> zKhg5t|Ex&v?*H0HYt?i=FSyq1w#32y^XCVbOCPbv%DLD`%$v)7<E3*TqsINOjtm=T zmR%Oyb@$5Rv$dzR=e7L_;4-fiKEkhNKjUYD>PyAV7SRR&YPtR@uGZ<_d^IfDH}KRw z^$ixk9vFR_a4&m}oK5|NzY6~ye>UI$**fjqcbkSS;=w-@rPtK5r(4B%?7rK)<*J;O zjZdA$v&3hIW%=jZ{!z^9x_X^|DgR&jwh0@i9Cy}F@~RTJv+rMk$Z?xD-wP}}H5v`A z-?_O;*U6qaqrBscSCZVhiXDy7VmtY#2b@l_)H7w#UDn<%H}9$R%!B&NuJdR9oF3Ko zUDwNaM!RMIs?{^v^W~-$a@VQ7_;lT!=U+?zkz0lN7q0mw%b8ZIIDUGOaWPwXK?UQ2 zNov71?<P*!zh8R6=`A<@ooJuBXm!QL(n|+yq<&~f%}kNs;4*i9-dB(R8J8B%?EhxJ z>|W4}a}yKugg$5dTm1G;L!51tFK>pVo~e_5UCEz|<^5~po~Ro1pR?a})ITpME->=m zY8&CNejZ+RagmY%hx+5}7nxZJYl&UiaHKZod7-h~)=Zm1-~N|B@=vjwe!lT|qyE7f zzVst!{w+w7bGMT_=6Oec;)-55^LUeYAFrqv&tFqf^z-ER^DgHn&DX8p_Veby^zHL) z>%Kj@86Dbte6@Uj^`7q^Cmw%3|4P-RkDae4JNjR-$v(FD!cmJWcLeUGN>9r8`QzDR z_x}2tKh}{?4}E@m-SkZI<;O+~H|%sgb|YS6O5U@jM*dPZ5A)nlvHHqBIeYc7{p?3G z)$jTL+QZhRHs9d)rumMIPM<O}PoBSX?D;8v(239I=V#3KQ9SMbGess+?1|CBtHp8i z%{oQxZ+=MmE&Rvz!sG=`6`THZ{{DNuGD2}n+>yM)`bqI8=6!hbZgP6c>>8$PEZ$eH z`QNjv{C?%z%FDsqm&^a;EbmU9_vhP{WsmfJtm1m~%6*<{+b0o==tXn2C)xE@S-r_T zbot71<9T|uyB@xrxBU40xSFcxFO!`P2+FAMaS9ga4|#j}%kn$F)7PJHITrkU<{I}8 z{U#Ec3qz*!|MA?ZyFKaOk4UMgeGhf!cg_Fz;mg;{m&^~S8NckQ{}UMz(vj$?du85| zw3(+g?B<=Y*<2Uazr2Qd>(k9*=Vj(;&j0y=$KukP?yY*C7Z~+bUi*CWLD!O)z{V-} zvyYtTIj?3v`|RWr1^-KvTU}!~>g>0cZthV!n4tUl%?smK`z{vj`&XIcD61`)XRo88 ze^K5)ecs<cZ_M|7O4#@5<tDGXXIHYyQ~getg}X>zQ<^CH!~Sg4me3GimU^?LO<N{D zxS#A6Qmx@J{ff&=TgNE-50%Nr|2E6(J$Ia%&3oy|gU?5&{dxXu$DK6qEB77#To?MY zm7)H9_r>RrlP+G1mkc@2yQKH%ORf*!1y|%BUGV9C<bwUSu8Y>%Z*_b6x*=XKZGLt~ zz+Q_F;wFifOn+E?BluYB9j{Mg{&-(Q@b<h^i+|ER|Gyoo|NHU2+>iAv|8qNT|7F_# zTjoy{*S}iMf40p3mo<E`;5J!cD>8@u-_h<1=cPZa*KV_KsCVNDXO_Lf*!!R5C41rr zeYpeYB<xuJ{Y<zaIHmi@hfIS7Dm>MUk5UtN7_QjOb@(o0jl`h^YnJTtD4BeqfqkE{ z!Hn}oJcljCjXByrNAVw?aE*`WknpE|>*ibP_OS*sjF*-Nz5FL8om)|{+t-%wUTX5` zgYCIi#UBKvE!pR9D181P*sRv_$Ck4UeESk6A2`UK>lT!owbJZ(K(61STQMG6ch1Qw z=4FrHa?@k${?_K=oU)=1)wA!))Es}N!G3?U<@tmBIeCR2glFgQ)n$F2*1Uha=HmzQ zIroY`_?yXF{%GyJ(R6&F75n~eE6*RSH2W4JY0h^q<8rf>yvJ1eQwP~|A6fqBJL|z$ zmo)j{LI2!k1s{rM@09to^eoe=xuqf2vl;dXd~mZq!_Urm$9c=V*7Hmii!++fme>FL z`CON6UAM29J>w6-!|NyZi`?-%b9kPJjLX4|NjLtbNo%|cy7}d-ndO4B8*_e%Nq0o4 zh1RLF&R_80wa6cd1L7ZN%-ir*W*g&a?=Q^U@`=Yk&1&u6^!9(xY3F--jjyE-OtAM} zxvM^)bamvX($|rTc1>u19ldDRgzr)tQsZtryu2hdz47xsuIY`%cV}r`mIKj@(;Gj( z?nu;#wqn{bm*e0E^(#&7yAyUyR*kyezQgjZ(?O$)tbB1gyN(`|cHy_EnES$zJzvOn z@umGwALxjwvz!;0xx(yz!H1xW)~jlD(jsME6%}k*!OQ;IWv)epe$m4RB@@}%`^8G1 zKH!<i&+aeqv-m?wpa8pi_acjmRT&cO{^F_yA9yBC)0%wn;A|IRjXBE;Hf+xjV`uNW zR#f1BF^!K;=<S0C_ZHoikx{ZbaB$+H!!mc`OWK;NJJuC{2)M}1C#P5CckwOzDjz*| zelbyo2<D$G=c~o8h&F6qXcv>kdEFyjFed(X#J$=4rAspQtL`uJ3;vMJ)#fGtN&Sf= zxAu|A6U-&F_syNPgXhWQs2x0i!e{GFJ}}EzcTK`<|C?${b>?VjvHhsnTwpm{?&u+@ zKuHhzuG=kdc@F0~$w~Wto!xNyz!#SowofzKa*umY;l3q#_E4<rPlkDiu6<4WIJ5h; zlii$l5aIuD&$L6u;;pw8W5lP~pPA-9>&+Tb|LyJ}Gmr16Ju%tefT!|}W^1}xYr10V z^XfZ%Pxi*&D6!vGdrWGnvz<uvVl&165lIra^1`lp<go-6F)xdbR=&+}yL=7L}> z&K23?{)L_Wz35dD;U5cDaI(t_Zhi1z@gg&s8jlqBrPd5PG>@=v*WcRqXXo6f{{CY3 z6j!mHjyi1kuF*_(OCh6g+J;<}h|gPOy$>4S{8SxTA<CVf{!mwEPjl<{#HfRH-;;ki zSifah*1x%9dH>=W%R80Z|Fd%K(<*xWAX`bEZ=d3;qX+w4K3n|QnxV=5yz^Sohx3bM zW&SvpOlhu9|0>a>tFv$Et@@J({ax}ce(Zc<&iAj&bdlhn-WS|_|NK%8AH2VL7xzK? zj#&i-+g4bz?-#gP^g%gLoUcyz(~}1_6ZP5mi?$XN?9-Un%<Zz+Vn>L{#OBixH;X4c zWp}w9t;0Vj>E}ajF}t&$4r`0qDX-#wz^_vi#*+JY*HwiYzbhgKWFvm;;n-yvcU2)j zCM7jiUo7u<QGJQ&y!1;N6=JOGmpw=pshQrie|bWOPUGvq4ce^i0R<+k@rx6dzp}YA zwW(RNLV~q_@dHbdJ<U!2K_8}z+*!!R|2wEah4pyghQ_AlfdyY@*}QQ$m?t9RdQelu zrn6~!V8L1|n>+KG*n>W3aGhK9;I&B1Vmtox%O7xy{F&1fAN)aIBxWyT>h7Qd9oG0I z5A-!9td_9kc^;grY0=Td9t_d6Rb)?p)B4~K;Ua&GS<5qz9Nw!@VE}T;PLVy+o6ZM+ z;1`MUIoK-|{MqARt%k+4rp+1^nymAeJoqhQvq6%--uK|+S-~~8o7&R@K7?`E-I}yW zk+t6QV5P{PiA}~)A3x-9#kn6`{^H9u5&57G;UY1+dAIs$TJ$$%dsO@|W1X#0F-ceT zvPOkG>-}X9-fRBw=h~Nl{IILYnJrHrmWk|{(ZnD0L6qy<!Ux|)?ktftE#s2&Jh)k- zLYH;^@(1oBfBKq!-v}<6)TAH$p@v<~&gbBEjUDdnUTHxEGOYc}9()(6IWe()e!vH9 zF1=Sr4&S%@Sis2o-|=9s)#nX!nhtANv^A**eQ@Hk^ElYAVbR{ScK3$@W3F$D9t3dt zEq<UWvZogm7v>@{4hPN7+2pt%tktNnU_HO!!Bvr(X-)D0AF8?5DK1S>WBncQ!Gmj_ z$HCc}KO|V|eGdw!Oz~Opz+Gfd^tr>+HGZhF{$KXsp_QJ9eZYpErdmyluBNLZHf>Gm zfghx}?ztZn*Z3jGx_`-oBCdajrnc8Feeldn?w!xUy&4r9tm#1?g1GFw5AtjLU}X(2 zfBbNo$Q$p2e>Ey(Sl2Ip&@A$&r71qJptO9IKG!?HgMuP9eNE2;KL~RDo7Hq$<Ho7x zNlQiEcpQuqk?}crQRL3m$x)|8WPA@U*0AVqnjY|hlWU*v!KWgBTE&m97J1`;P*Wsl z$%CUJds>_N13wgV#a*4+{ypdeGgqDC!K-^T|1C+7=jvPZV55jlcT;%q2RV?#u512K zWUco;xPH$>e(u_(*K>a9UJQQlSY-2u{uKe{FFxN(e9X2r;)mYsJFBEuao1kDc6Y*m z?!TwZ?*1sV3Mh?Tv5Rqs-WPM`n_twGB*c4{Tv}W(`-1<Q_CyK)SN;c?cPYkK3yO9( zy!^17oAq~e$mRzRZ;6>(?&v!z%eOB3<BVomow_BL;tL9tyTfJf99cA@IXZIB;|FG9 z^#vQ|x|V7)-HyKU>;a$H*R?;sNf#EVcc;m`Nl|>5kj~Anwbyv+yE6xUb*3=Labz|f zw_YawC2_6Jg8$aNt!s4`{NLTP^rv`^M5%C_;@|Iy5|ciQSog<A9Jq0X*X(ZB(oe=> z+qN|nXC3;?`n&4rwDtLnkE8ZKDDgPVU$IYtw|?oVE3f)aIaFPH*LTXn>dMP=(<eSK zDu~&(gXhlYO^Y9FyDP|_(p4e%Vbi0^1Ko@JSF`f(j$|n+2=Cq}^CsJ{q4}|HTR}ln zYg@Ca*kX$t_mgbc*&`$@cPu}u!`HVV!hh@jiK})`UA24qs_Gfd&N_aD1v8Gat~$F~ zMkcdxZq|P>cK$6pjvqX%JFn;iNB4Tmh}4hD?8hT!SXi7`)FbtK{goSuJpu<Gifv6; z!+J^n^0n>OPYhX4=ReeWbLi9TuDQWWS$mwbb_ZKcZ@qhCXWSjxPg9$op6so-mpFU& zjS~GM^L6e_eY!VT=grwqPfW$$9sBfFIY#{4%j7fa1#<HP-v05}`gvN`bK9$ZJJ_?> z&*|ThNP9fLVDm2a`+j@nYOL2*eRyl}?ZNHBqi-FeGz+Z@)?e#wx?8Ov_fPDys>t%g z^YujD<Qtx9YA+SrCS!B!kn{n$4YD!I>iIqXo0RF9=-6fI<OvtV_l3mYUAb>pac<xC z2M;;L_F7hKa*gLRi|Sc$>PW!LLWX%K9yQ;JJpIVH?`XPu_jwDk`HLmye-p9$C}Q_9 zX129%MMb}>7W@0H63$BxTf8&e79a9Y@b>$%ZTEA;?j8J;qWNw+=hgQv0sDBCSVx$p zeLpV!)8R)K>mA|uM-JIX9oSnWFSae=!M!RIZu7(k_kLA~l_fsd_tT4`dwJA>zkii= z_S|FAI#kUtt)p*4a{cSW>szDtP3d<y_)uic;s;AXrF?$C2Xm1*{s-#=Htdz>-yQtH zp#GHGq6exXHC;{bg9<oVqgg*}n9}rD!=kmR7o<Txuz-)Xob$;;IT0DhgM}hCvzpRb z4jD^l+*6d_veB&TpN{j!YL0rH<nxUkISsa(1gCV09Xx;H#)aSle=fge34tZE>_Vq5 zy5_z-<ME}*S1)cnskJvwL{@ff;4bamDl2#|W^TOLcI3;IC3=R*+W!5lFF&?r?2R&y z5?<ZsckKo5#gkFFK~++-=PmN<?7P15>Y^8cRcp^3So-qHswXMAYfkKxU$L^>FXVL+ zBU4p+{Z_k^3w(>)N_iwRU!D7;*QK}a-27<2_1&e%l9}o+uGn>?%Y}2}#!oLIa=m7$ zMao`xeUkY?p>&dE)#m+*qDjFanZGi8S2?cj4nMl8^3Z{ek2W4W^5RQ~?;0~dS=*?o zbM!nKx0<pgdgUzgVxRQ*O0u@6e`vq!(L{00RS_3<hRv7Y-TidZSGLfsIbP!I40F{? z8GU*kkEyQ;b}Uwy=^NVb8~mClB+4e#R?$+K*L1DB<SdI<!Y}6hTGDm-*os14i`h1n z2C@N$9dfZEyr1QLCp(HVpDObd3B9@|-DZZy&cz&IA9&a|915JW#`B_t&E*U25&j>p z9}Q&5IN`Upd-3+ZzmKm*>J=9j7lv!Z-q~w$;jH(RHNL(RmMni|%DM8D1?Nh2_peX- z;)3*79_s!5(Me`;!IyU&|8`g{>R;D)&+|dQ&=-ESDZW9A*rse?oGEj~`{I%+r4Sd* zRU0MFnwXtD8+b(Vfa!yGFYY?Of44N*@j}O)tD@!a+N{1Gm|MNz++A7M#am}toVnl- z!YJ|Gyz7gQwz_Bi-1Dkj4j1cp{5vDgXT8v9<>HQXAET)uTwV@Gf;c*KRv8o<NiMSa z5uNysY4M`ptV^Xtib8_AuGuaTyT8LjWVJ7Q?#5h(Fy_)GkIO~dm=yRA$*O7I5c=E1 zD8A5$Yg>=ZB5$cR7tHdaE_hAlm@)NG>xCzdceEEbyfEJVC^~T}!<25Vxl(?CCNVFR zKC_hVI`AX(jmk*|k;9G^aj7djS0=k=C1<{F`VsCH*3Y9aFL}LfPPTKa!Zu|l$F5nP z(MQ}GWE<QrzA_T<Ye<Z2Y_e;7I%(Ftrk2imzLT2y7EUotwzX6cPkF}mQm;k*aR{3W zgXN3BwU;wX=k2IAc*5{)GoxxknWOyOi#wja%h@T=vXU|JRWH|qNky7^oCSRSJ@4Ax zyG~Up{Co7Wd({bxIJfy5TY@}ps#UGxwN-qzFu|bl<;smKc#_fsM6MSeEltUp>)_Dr zrL}W`SIVa+5mF~3Y7T8(^UTFE<HrI9`#T(^Ia|_2l$y53E%RaDbVOLRh)MSJ-iYXi zr-eI}f3Qz}5VJv3ug}j*d`6Qmn_1w?7f%+pbjF#i{87iS^GlKVifuO@Ex5h0s-Z8w zLyK4BQ%Te5!*{uh*iPT?m}0=Y&2v)B5(Q69*SiX=49hg+bd|nDw%G~)(l+=TD-c_w zu<xRbplHV@u61V1_Ha)!pYSOp(WQ`e;SQ$YJFK1aI9zyE*(}=4bWxUHB+&Wc!64aF z{yqZY;!Xk+j$J<D{E}7YK;h#XN+O+_rz8z512=P+il5n`*D^WQAW}hi0n5$_ehC6G zjErI&iQ?fM8)TxAbhPAV_;wUB3&%RjCtodiI??5fMdnE@=RIN5g?LS5b(SambYJ!) zD_HVf!OlmFpQacja4Gs29GmfH-8z}t#eWxU?J4>=t6W)IJY_MDi&nU*p`^jen2QIP zA9C<!bllU3cH!j=JS-~EFPpI<enx#j#`zZ)He6uvUnx9SL`YKBQsaoZ&W+$_3k!lZ z?o5$;*TnSKshL59Vbk3uM&>JH)Pz&qzwvdogihrOZ@m;c<ND?BbrVk7rsi>pi<gV9 z47ss6KfpiSUvh;q>$a(voF|wcP&e5WpW*MnGeoPrJh);9r}R77Yp0KkZ+ZQWYY*2< zpTI<y`3_tu^-}r)4}w=TzS)0(Z^{pqCcA%$`xq}y476ML&ra~)JfoHE-R<qGXV0!y zUCPAP#_r<s(5OiK`l+Z-uf-)r#STrM7#gH@LtRV5B<h)F@${YAPrO!M3JuWExgjq; z@w4lcLuH2!H#09%KIBy6#F#0f_wJoskon5V;%Cb`f+uD%o>9M~&UAk5qK$7}G3ADC zs4IEFykYm0b?dmoQwm%Ud99Gy)Em?3R&uoK{?)lrx-+gGw7RrAS@wNr595|EnfVOf z*<0@HJz@1|3427eLzTvpfL+dlhfWoRD>)}{-RJW;_KR)VarM<gJ05wwe!(kwGELG$ zCn$~8@Axa_xT%Xg&pq&oSlV-0X@#z1Tl<_XqU$ABv-QnOlW~%mk?#<?S!0FUYLk-} zmOLz;YH)q(Vdn0#eT%HSIp?kkIWSQvYE|%6E8f)}Q(XkV9LaQec*1d2xKGbC)d@kJ z+&_Lbu_)Y}y5<>6aLNUD=6+)<g%*zBaPhD+tG;Z^a)=8%sD0OQ(<ISN4z{zG?$%7K zS`;;TLdF9jMq3A^f~gJS7Ex2Vo~87totxnCX=+gU=bA)jFUxKht2dgFlUMcmU4CWC z)@wFZ`+<_En1M=G(&V74Rkq=Wrn>gbjh^w0ts>y%v2(&p>}RuNyiqG%m~mzqQ}9vW zgMMCf{EVe|ukyYKG*{iEJ>hM;kNtvb1Am6yYOT7QzskZ3{=SHOFP*l-`=bm?GfP<L zZsvO|lb3jzX9$~~xWjJz@(H7afXeFQQdbf-W(9vea^jOi&atS>m8(*=1sbr-6fvAJ zJz(iaZO&QQMVgYP1xgpBl5+EJv~fq;7TyZk*0Foi8fm+42bb-hoO<}EUBagJDbc1k zRMii;Y95`pWlNU4Tu_Te!a9#et<K$yV&X;9pQ<?a33q&5dSsi_3{%1V3>OYey}(eI z&RciOr}sL;BgUi+!ml4H2{@)ON`6@7w6^2Jse@-XP4cufb2+?eal6p=*^a6U)Q-0; zNN8ktKhLApy6N<d)XW3iqNR;bP2D~Dy?mPa<K~JM9heaJ!CXm6f7R3zF@Zv-&-Dff z&eUELFEDeBYwO(!%5U9ztjv7^_@BIVaaw1%;OL{?O@)?8-*#O(CV$GQrC2#^x-@51 z#Rk{E7grfANPXJN^<a|R4aJE{!dgPQ+RRbm_g1uY#5-p=-AOH&Cwz64#gd$q3MU?i z2Su7!R3@`#99S)6+GtP^F2Ex)Czm~$Bjc##g-M^?SPOZ>gATWvYc(IZ^{A(++=ai~ ziNE|&nWv`l75O!```8wBTQBUkb{AJo-N7`8{ovA*;m#&S&lh<c1)cSc&=pw|vu+x@ zQe%71ggFxYav4ijc*plLa(K*>x0zt8Fj=VlVDsYU_5@9~qSI#^uFW>r>WT47sjSx6 zS?X`BVSZRH<D}<gQ$s6Jv3+v_9jzrYrgbJHrP_V7O1u#)>%N9>%eNM-DN_?2J}g_o z$eA=ztSwM^No3?{RhIOPQt}yj`YWnKcEv@_J;ttS6vA!7wkGlhtJa11wZ<VD5Blb$ zS=|)<el1=$`@$=m#-GPl6~5qD8DPQDCLPhvsVLG>6k*CE)t#u$Df&f0OMa>1($|is zT+~-T_H5|XFr1ToVOgPM$Glr5%rfj=Qy-QcE>K#1?7*E3YCU$gZQGYcq|0clJGS|( zYp^`=sq^YGsgheyGNSyL*A*@QJn5>(XJ=Ps=V$(#?9{CM=JvdDDCAmkTxs>{84u4b zT41X3iILlYZ|P2>sV8F-+q$jQH5Imh_Tl)tqT8Fb{#sABNKvs`Q=-_klns{i+8Own zE??kb=0CUZ^P^PNex@GA9Ui4oy0ffVXZ8q~xp_A!B^d4CXz*G1KqvfK-!fjIY5m$; zO*ce#nG0;u%K3CsWZj(DS4X`w_#8EMD7G1D*_xSkTvL6<E-uBSCi|~vnudvP=`0gw zz7rcS&MR5RUO(Y==k(lJrzUuu$&cuhkhfaIxMG5T&L*+sM@r9mN*8jrzx{lpWbV8# zXN4JZ0}47*o>*vgtreWv&Aoi8)57z~2cnKkPhYjbQ=^H|a#eY#5TmMcnML;fNg<XS zvr^XtW?xtt^fjl1MW=3VnvRsbpq!!x?<7g7pEZejp$?9Rg*bd{=bx=~pK{sBtUG{T zMt*UKeQ1u-BTLKd9Phmi*(+0(&n0wSNmx;Mu~TE&i7@s(yte%1^Xl|07Pv5J2Pktn z`2;*%C?P!m(Xr(mUxgNGaQSoDa!s4Vq|P#N(gxMkEw0O#t_(hN#>`R5@Q#6<T$;w| zj%!B?7bL9N!V{5Q`PfORcx%(g_T2(it#h2G85{f*{CI<DvHxRk6P^n<nOiM_Et^|r zsB>Kv)mFa9#kA>I!ab=tj}WozGI4&3TW|3`JE1w<WrY>5%i2c^H+eH#owYdLx{YOm zoJvXJVXkCWm6HNNhr8Fe%q~7EtEpL}ywo$Q)V*-$yo1e$s$JRJTw8v)1a7o++!P<- zQ4x_65Yn*RXJyIs-5Pgor-*X>WOHr((ek)s>h3#N7dv%ss0%#kxPW=)?n{TAU%q2n zkrAh2W1*v^rNAUo7=9`ycFF<14@U9~a*FrrC+xg@nz5Jno$HIIdRA{GL^zMTJhtfm zTzko+En-sB4s|tKySTI7&RP+Rf>RaLrH^|ZQ1W8_Je|j1enCfvvPeh5%;hU5U1e*I zn!s3MGX3DoB-QmFHf&8&P~(wn>oB)CapTFF@Yzzlxh%R9?y{(tEnV)m{NP<4xxliG zpEHfZ*+tbBfIrP3}>Ns(h2Kjt))Ec_FDO2|myH^<}lr;T%N8#_lS8QHeYb(_=u zHp6oJRhI8@0hK8#&fXC(njD;uN{frmyeZmZv*z;qbKJ&$%TqWe2_znKd!2l6PQf<K zMLunjT1tGfl8;im6bxKEMHZepWbDgYcgCf2`p<$76^4^fcWzb;_TZeTAv8mfb8|n_ zM*eiAL@rGM=8tWYv<*Yg?B#J)bz@%CI`bvF2cyZV=?lzz^qz6C9v9{6)4rp*e#Wid zhPK(}dY-Qe<~%&uy*VLej^u{YXT98$v~FB4S^g(8!&^{^L2Bvl0_ihekAjzGTJAl2 z)OSyd?t^c43;T~epR!Zn>+&VFKVB&4J}+?keMVYbb!x}$wNoxm{j=b!+ttHa%<tz3 z7I)7N-f@5N^plrMUR^vC!0?e{WdOt5e2vQ7)-~#v<_Wb{9V^Oi$j!}Z`{^Z_z0Jeu zhfv52_UJUWq;(JVTtt1fF4^<leV82S@YBWhmn%yv^HfPOt}9dgJs7N67V&u=oKSZ# z(D9<8-9(3Wmq|hv8lBw=rH|#Gh`WB8y5*?2tek|PtdM}H;FIH~4Q@_cJRDrSJWsVQ zf4XqT#^v!*?;EVIHP?#i2k*&z=6Bo6hV?<%?6_wOMb_<G^;d60+X8uJp2rh!%$P2G zWT%d=*8HQ=b~$nzq9-b)e4el+>HGAXPtR0uz0v<5IMpl1#JOGk#@hgqRTJ3~|LVL5 zW%|-ES<u%g&{U&Y)M%Tf1jjPoG}SGaMD;Wp7G7#jS#WjBiNFx2y(=B!?5B$Rx>p{w zDt6ywsb;Ha6}Z~>(28A~rDjcCK1cGk*EHSIEzG;k=NJ?oT^;gLF(Bni&dv?Xw8ahD zLZ)zqEZ5%Mc<`OU3!#)HJlAw~vFt23W%0bF!s5iEgo|d^dql+6t>Mplww3GSgYEMs zbf5mZr0?+@QB{+qfNdAfH{Ebl`OqoU7|mMA;A3*iOXXYJo<*NutXi^|sVQ)Rkc!`m zFDn)(t+=@9UEh^fZY~97jxTLxhqo9iH#(j%WV`d|(2N61PHie=aN=JX9l1^WUfTtU zMV<yOY|gn{BI%90IYQcGDr=Xp9bb@FGofeg!E}wC4<uGi>|tly9u|{Yw2$p%gZ7!L ztlj#|Rx?iKA3SI)BqQIv^F+kbO|ci+L_+>FBrn=2t1Nko?ck<k0&`i^IOL-z9Gok# zXZ8{!iG~H;eb*DbIp4KCh*d4&nY6VyAYQI0FW+;y+|+f~g1<Ca3s!V{uJ>Eksn^UV z)OWFR=F8eH{)C(rL5`efb?<$7YAL_$@-n?Mj@p9HLO7l-RGqml+?_dfRdC^H7Cp~$ zeZ5DIANsZXC{D}iVBiWqG1-BMi7`XLHBzkMWz!3pWrC4fUNs5r#`C76sh2JI@-=K@ zyWP^D9j$98R3>tIaU~Rc>rH()**t<ndV|QfV@o|Mld?3QO!?aJdBdx)qNc!?Zc)zz zOUw_S=x!Aa$=<SYxr+N?3!W3}dS%`VJ@_HGb-lvjYICE!&u(sI`A;eqH>_2;5jEjq zuZ-mO$;!&nmPLDf8(1eTP#2HsR9+!%o>I5?#2$6kbx)3keo~lflX2bcg0Pv!U5n;R za|M{@d#7k~Rv+4JVU#EB?)I(liN%FOi^LbQF*VpeTekdFQdNPpmC>ff%E#S3R_+QY zyHIKvxnr%Y<jva?A75bW)`?*WQS}kaD|dI>R{q3DyzW}nD&E=&M;5M1dQ@O-W5nNQ zAu|2P2BpsRZRHgSi9x-}{XrL$`5p&2ADQi7ly^Mz*};j&d)4^0&#kDMVIn7!X=8CI zKt}jvm(?mMHNL&!ov9qtigS2k7Mk3id>}DD%*b{2&!0E?7Jq(HqgG$Gxar8`@U7*I z&4=TjX*@D~5ZUy5Zs?qV>5qB~b!4>Wl&C%GwCCnre6q^iQudcQ|JT#0a(5CY{#CqV zp_J@e`9@c8+pHL^8&8~qI%RF{JaW3Gs-^MV#CV%!>74WYUB$O%`h^y)k~~^&#FOR2 zWSRQ?x3ln8@eKh#7f%QX3yN;tazaHVajmcFzORSc*Pmo$pQC7!yMkv^yTbI{#a;YQ z6Uq;qX+JzOpg6lEV)5x85d!C)t(&jFdXnAN!|ay-gu`p)8s!Cj`{GZC+PrrZcDk@A z#__ZKvMH-0Wn%pfJ-ah8Nyv10*N)lZ9}V=CCeIR`cv4GbVz@_Oh=(EnXXnJ!d5hLe z2x3g0S=}n4WFfjPq-OdvL5V(QInJcYS;DL0RJTMQI6JMWc*4eu=g*3ktFh^8=SpSQ zo{aqwY?!9Uc52$}wV_2}-tQhIZ40_wl2tK5J~d1#<~c8Cnc?HcWTlCZpA?C!1S?-? zGJ7EUw)gaeOD?;T-DRg9W9qc3>+7HNIsN3x#G;+u?FSC6iV&Tz`}~~f;jithc1>!w zFA};xdG{%n)A6%cnZLNSlVQIM`_F{RpkTkOOVgw$7#!-dP*Q)cR8%B1aq@1i9+NdU zIgS>D@J$oznKX+@rgd_0y6RIEF7@)IKSL6JocMS#KVsSyr8{rE-p6t1$XoX9Ke_YA z>^Vp7KUtUeWfnt@=UwIlK8IKzJW*j#KmO1oM7wK)PN-;c5BG6Hy_Vz`D^yI>9;{Sb zrSwcfd=|^Yj;$+$L{}VmYo+A3L?-3LqI*Arxcycr97_1ZAs77AZ-Qf+k$!U7I$0xz zPv!+2!4@YYHf`9*w{(lp_T51%n`-lxNL8u__bC+zIc{k_)pp!_<KeUM<(;aFnr!)A zowMARve=bR+5N`LV_mbZe={h0^2n)ONg;gJ<RdZlJHjR$TlehO;i>mIo`(AiEZ@yD zW5Js*MQbN8*A^|^J>kmK4fBNbBUR0(&k0{{GTE}>_aBx!?Y1_S&mW%bY*#Ngp8dpQ zE2Dz{N0o2ipLoe-Z<=R$p8HY0o5IqY#|++dXdm(pyTLCelULD@_lb+u;PTFmv&HnL z7D?nzU%KkJLVT3t7s>PujBbvR>+U?%n4<bX!94Hs`XcXsnVk+Z=a`jzUa;-+hXp5O zcAkC_*t+WY2a&SFn;#!L+b2C!wtQy*FQd-Ns*1Eb7K?Tlif<Ju*~?Y@>RDTM(f4h4 zI*%2WFU;mTx>h>O{N0>gh0|xAR46abe6-F$|KXvj6DI6d6jdm5p3daD@`iTe`KQ6* z$6X5cPucrZGxhz0jSuzT@yUh0zx-4vB74T}V;N=s{Z{Ng=i)flKc9H{U*-<mcgNO< z#Lj%0P*f~>ph5id<jAy^`2p2do4;B7NvP@UI=j*N_nj?X#}4IjY@EE{$CZF57dAit z_@r0s-xc*;m!y2}mKsQNxpSLvCRa*aK2%fmuRLpm%gT!EyTbQ-nhoX^7TurZrR3YS zYR4nLsEf_-JWFj`yH-q^{j+291KR+R?BwUnZXZtc3FmQtN*BHU$X5C0PR85|;*Sbf zNzXnNJL~w$gv`(~Y5C_>8+N8`|MYW@m)@<#KKu@kxZVps(2<;fRCc|S<%dUws{WQ0 z-%^S#o4MI0uq<?4+OFNBSG3H6$LS(#!?(1>{c?LajQahmJkEMo%-H_0%d24TffYir zhpryw-Fj%|A_I%5N0{c+d^6y_aw=f)oUQE4!Eb7lRPT3j?^}3&`Gno>dSC8kmh6y| zE4Vh<qDSWVq$hH7dfF8=S|+%Qnw~rxTz)NAB(A)DkGiV$lSA5Pa>UBFY&6<<a@vD$ z?b?EFIgEMJujT}9n)%1m{YXg_^Zt7YjFR<lCh9xf-xhM>M}xRl;<=kk1l}ekDIK(} zpSQ(>Un}K^NU%rh6Q)f~`+msWm7mnN|Gt(hn}Uv?)}-6#41RdVGK=kU=aSKDI_l~A z?$qYh8<LJTf1L2?-VVN%Z{4!AwXccI>2KfssCV^*Q*uj;c4<o;Iy>#bKGQiy`7v^0 zpA$3XIMZ0?ZhC%r4cE*m`klcY^6ktChcXY8HzodXeb0B4V;}$O1%6Bg?yFL-sEXgQ z;JoCq^WB+d6E2}852ws);=c63eEHoStFQe3`?LN<y26vx=Pgeva#tPvxxV}VVtLIU zg~g?=^-~Y+|KYAOS?kUchrb%JQ<PSo5v>vNjQQXGLGaHK=H7LaJzSowoV@DP-%vYA zj-S8(Pn19Shkc0}!)cX`-bJ(gtUuj<+;)Cu{mR*g&ibxm3A)XCX8-IUy}$4O{LlYW zlk~4S=<(Kv7lPh8&0GAd-F||cm-zHm&*bG=7Cn<+a=LL6<LCeTosRr}{Q3X!`AX@5 z?h{=^bS`xzxoQP&@=%si59)s8a4X|Oxca4Lk+mA4f2KC<|M;L>;D-qR1HDBi+xEnz zFs$@kP{J0yN;zXQ+mG}9A{w7Wmo{H2Trej}gzJ_+W4)?U{)h8^BATDr|9ZLDEtqTa z;pXZ|RudPwT$s%F<wAUeuZqV-MvKrX0j|~0et5eCHEdkdRaezi&z6_+e^048!_USk zCJx*;oR|*C2f6coYMjL!z;WUw=cg+TQfwErmaKF%VXJA%j5VlRsIXl8fIjPz<y}fQ zE)_nA=jqN(wN=ph-@EVs@6Ywm+!g*`oUfN@`2Y8>c(y6~W?%B<x)T)kU;F9*tN;H? z+s~g-|HE6B+rF>$f&Kf(mw(0UF{jy^{|{R5V`<UO+1-Ek|N3A5`1sApq}%I~_pfmH z-uE^qyJvl1?9y)ED?MS~-Pxm6?g`Bd?|qe161bLqzC&lH0^{6oPq{U1cDTf>+I1yX z>cPS<-}!kac&GmJs^9LA^7i4IR|{r8v6w4$?Hz-CIDg64!otrVKTJPWvqbORCx-y< zhwop#dhPO@Z9z<H$b{D~SnIRDXkCcd@&3R(tK2H7*(}LP3TOEro>zN$<zt{^roq+L zziX~9d!2MO(8|<j)9YCbugf+!M;0tdkdUi0TDm$up<#EoiNmYs>QjIJ_~ChXl?>au z2l;Ueja+`OE|CgdwUB9_sL%WV44=6=1kOBkO!>qnGADhdz;*}TJ<~+ivn6+jZjNl| zXtP^+%W$OucXCodKdaCprd1U(Hx?#Levq1Dw^B>~@q7L&Hzf<Cen%hsH*NEN(Kq?x zAEMQ!ZrY#vCg1XR^ud2+jJzk7tb13NXLsoUgM7I7fg+=s^ZW0dzrOv{%dflzh5S4L z6&`nMm};lk?F(ADetq|u`^P)aef=4-?$Z3TrITkrO$teQwxUL?{WfcM(BvzHlN@A! z*to6szI6Mq@Vu2=>`s0APs%2jtlDC-b)C1(L9Y!OTQ^2cjTB20dVYduujAZDJ^4Q^ zJ})j>w?@p~BQv!*<mij7CttFa9xXg&Uw!MT+&;NHuASKn_Qx;iKXjNil;c2fdvUDR z*}tb(ayP5r`oDSRZ<E>0_vLcdvCn>e@LAP{opNuKK75$GoBbDq<nxE`wWj~7f2UO7 zob&FXR>G70Qu#alq^I+JIbtvMRQ=e)H#+IXPjlAIIXiXp&Z4p@8Iw}DK6@%H?(t+_ z+!G?r6TmmoWm<HBSj{=#^A`^sW$(Ft^t`^nnhbgIc-9=hSI@gGnV$a&pVh4~WyK}; zW2=IKuNF2&$qF8+>g%**YE!oE@%0JJ42o=O(y^Jx<<l-EwCc(Fi>-@QQ`>iNNmz4c zHQ&oods-KIUd6j{)vsSIVryc4Uw-ZS?c`OJ;@?lARvYw2bc7u|#q@E_ANQJU@t5*C zA3eP{FIJs;*IsCIXzzdFZ4)n@jeq%0ed^DjzjtWYF5Tqd+OT{5@%w@X6LtK4)${-5 z68;iy7RajnYV(Eu0OgV||HU4ORxbBCvf7BBMQV4G*v~bIA3yzzmkytL`t$ve+X<{+ zE=v5{c5mI5Tld57guZ<EzjGp6*5%;GAs<Xn?zg?Awff&(!TP9`me#v}c-*{i^lkf` zziSifou`IR?fbRl)arNQVs;u<d#3xV)Vw!S(vV4MY1?=s?ETB<;&1IWuBfY=(6=(t zv9dXFUdLGB%5ifG1uKJ$gf0Fn>bJy4WP}7{>}Lqb3UE+~Uz6^T;n3nA;;^N@A%Fio z+neT{H`#lY&w97Dy0f;j@P6y$;^OY*<9i`5aOUE=T?*&*4Q?z~Uz2y;(x)pd@asWF z!NiLP9T(QF2vg^}zEpqtt(Pmmhxdo6XI~DwvXZUu>#Cra^|NO*eGK(Aa0;suuy|{H ze8RLfXBV`6$jmD&`^Gx~kv-b>giKwkAW>&wkab0L4flVquev9B|Aee_`gSsAx_?HI z*usvIQ)!DYX`cyBXz}+r(6FJy?&3s7JHfiWiw@T=s@nL*<jT6(_P9hv#=faKUlx{4 zT39x9+3k<PGID|fa)Qsq1tcZK7$xisG)y>(baM7g_y5mu;1T0O+vdQZag28V7zOLO z+0zrIe+W9ZbGlUA_q9Ts{ipmZ5x>ah{OA7bWvirSm^dzMOni9IabjS@&t}ELw-07G zq>Hrl^u3!tZ2`0BqeX!gjjKf@p9;&I31SOVv|#=^X-#LUs@}GORqX6P-F~?6ta9+4 zBP({5TVU37sir3h^`A=&n*aU%b0JttK{By(lM?fvMTe9gY?&D@^*~sVD^*%`HrtYn zuWX*r8CTvq_tD{7dE4_{R>u$B)>;*kFnzP+%axu1{-u7GR|*A%q}VVk)f_tPsLsf| zn8`_*k-70(!?#5&PIIhy<@WjYUY+sTMqSH^vD0n!;t2f)F|jKZmnPJUu>^Ygsl9W) z+H&lvv-Z|WfpW_`92-~FxbLzFn^?B-))c*jj+3wSEEXI8`6Ow^`S?IITj)ut#+px^ zty7&seyO~0_}I^Vn8`pc%&~;Erf+qF<?ZQ{8$7NqU*5J<EuG<c-}EC76FwabXfRyu z9%#PO@}H>Hlz@j;4(=J#Lj*O}x@bBCv)`1Q`g3c^e$gc#>RrrRzZAbX7WwTz+f%Kw z$caUvKNbITKGn)v@xQ0&lfRbD(dQRTKgBP}Vl7$q<T%&DpZ_~niLymS?w@LX^nc)f zQJt>;IcBl;mb3TG?@{_)Yt$tZkSTJrN4TQ(&w2yr){7x?rmRvr@&DqI5RMyvoXh*~ zu9cWQN$10k|F>TKn0>DzRH{#5tsM8&>Bj;(<-Ib^TsB;}@#Kp|X@FL>Ph^mySw!KD zijWHJ={MN_aEOSyKe(;0VWA}@Z87oUKS#l5&MP<E{%HR&FMNXp>%MQ#XUzD2;_$kv z%g^dFCe&v){J-`<%VSoT_V!gf|MiFEu}X%e?iW4rfBu)~!v44QNk)eocHZ5*>gO6O zi;&E%^;VljzdD49tn-*$@AS~Wopa7y=Gdig@+E&qpZgcKVSl2)LanKP`P112Ipq>x z3f)%Sw#dHu@`ouUFCX#z6Mym{WP13Ls+5TR9QHrndL{<STwJ|r@Bdy#j&COq-r^6; z3@UtNe{^$`@3;I1D|;m+qa{~q{^tn&!GEupKiR+EV@K^;F2}0%Qo{eMO+McLxAM)O z>k%`)>B}+xx&7V#$%n)B=l}oB|5H=-@BduohWU2?mj`GqU03jLDp%`lr&THE|L@-M z@B5$o|4*IYU-Iv~>pNAO|KW#sE<O@IcY&v9gqYCYS)~h9W#?wsC_Q3*RrJcAY1V;{ zrUBgBVml8i{e1mk#)gZ1=i(;$AMbPc$kl#XK`-XatIZo$e)^KI^z7{9P{VIdyh^M| z!avOmR$fvOFv;q3K5D_E;g_>wf4`IHGx@vAEZIbx`4()sX=u>Fk)K#ErWYz#x_U`z z@f5A9;Epz@@-OlVp-cD2X8wMb5n8e>U~4_|(yn`jt=rCCSb4;lG4#yb`Sm@4s(Nv$ zXOovWggIozOg*$>(T=3;!L6TGow{2RF!PqdvE&smqCZ-1`CtD1?*Ehjti0odmi#ea z`8z-NNchf&dMUfObW|T$H7cv6?9uWs+AO=_`O356eHYeF4zYQy`}54@J3^Zm-<fpY z=D6-kB@eBiUo0PcwZ32O_N~%U+EX;WPqqI4fsH>8tT@s0<Z}DQ12@k2JN{kWyt?4X zD`U6tjpx$&)<5FZG1zme&-U+X=QUqquBP*B{!~?OdPS>Te#6(WtLqNhOBii8R{Xgq zx6@yLy;iwGg*A7;5B&>&&g61=s#c3k>e?+ZY5%RF2{l!R7jiMbxSzbXYd7bl{ae3( z*m>tmWZRYfR%_17U%D@UE<HN&|Gf^amh<+>f5X>&4nO?cC;aJqzSBBMx`zDW-dg>k z-m7{RdD+QMGy7ciU%906>3R0$_QD(YmstH*K60aBi)Ef>eWP^#oY2fl&bOPrwq4Th zP7f(+V#snU7I&9uS)VogU%XYx2TQrn%lXx6<~9F*`Ix)@ZExMLhQsMQ`>$wr>@Pjm znAE<1Mh0W}g3}gh*Q!Lt;~%O#aEMa1IS?=K<IU`i&sP7wY@T{{x{T{euXQKu?ztZ9 z`mW}vF1k+X-`R)%Vx=Ek4%gQXUO#_dUt}xW?=QM%PuWiIGFkU((X;0lcRy-%?O1*D z@4@|^@9GmS)c?AcEZXO%x@E<mXOH72E?RZFYe96;_7C$5@5J9eEqYvG$Jrm1-<N5r zO4ynGHW&PF6Z!e2cexGs$Ax$N<Bv3(zOeYQT>n{UK>hrEE7Q$-=kMF`U2<N8YL2?a zqCfuYUxhkt-LHPx{`9^zMHe~pKL5S^yDIJTkM9=m-@nZXk?Hslci(>R&hOK=T~$B! zp?vC%<@tX@6}z<g?!0++fBAZw;xtcIZ|8*e5R0a`mtoOI4}V<1`|#bYhO(*hIsd2o zU8+x-{odaEk)0<$<I@+?f>VXoKI&D^>kM<-%w?_<QS>u2_^~PHORKQyhu$x4jqt9$ z%k(6VYbE=S$M3msl~31BEefmH+~J+{GD;|H!O`qe(GA<2Z`?R|mT%qh^Lx5fpEUT# zpIH_2F1(UQ?p*%U)c?0!e|>*nsAv@O|A?--bxZPBuT24c%KM`~%)kHgS9Xoo{#9Q& zb+p$%_!21_S{M0R-)i-qNevPI#q%pCu5_KgmxK51s$E}HbrR}+dOMu`|Ag<xe`E8# zS`k-EnCt()64(E-TIeZLW&ixk0$snf?z1@_(}-r2&0p#B<g$LrpQ&5Qf2&`bw;*8U zg8%2|>#W?-`1hr|kJg(Lb^lhY&Hvocc|lg`%tv|KbftisP1}7d-mPpgWa$Y$nY-2N zZR`G!*`hy|uc|Kif9dM(^H!(7%%2@o?<mixt9>V6waKJk;%cs}R$+DT-^TB1``)=Z zeEz<L;a?k9{-5(~{*uKFkG=#KPo1atBgcOo(@pI?N#AegKjP#!2>CKat6uJ%vFx%{ zZf7Q^E|{Osnwje+t+FLnOZe7&t53m^r|aM6a9Ngo+Mja%-~QqqFZN&i`oDe6>-|<7 z-|A2N`Ip{)Z$m@j+L!|&l`r1fPuIUw^(S7)puTp`yZzk%|2uR4|NmmwzctD8@2m<7 z+qdd*=*yG;KTi6WKj-y+?oa=pHJL=$yvZ_(uYC9aFq?IZ)L&*Lg|v%Ot-FO%c9bmS ziI_Bfni%&ck=P5Xxvx6c{5hn=-c%|gCu63eqF|zBbxM6vx`Rljv)bE7pTt!IyB92w z@t<BVU$KO9iRI&uD@z+vf4`XP9I|l%=Z%yq@!FV43oKrK$iM0sTkkjZylJ(~zx1<m zJAyRqSbrq*wJct*@amuS{Q1`NLtk3Y|L<7){l4TcYhxE~R~f;ds}tB|#a2q}U#Fw> zX?<SIEMs?8kyRb*J~!?@-+$HO;?w`Pz6y!_=bqiym3VZa3*$D&U;m``s;SMaf4+EA z(8Bpwa{piBJG9^J<N1JXOhW&*UJ)1h&%N@Ky?bHa!<s6~ns3ZvQ}fjR{{I=ueemyp z|Hw7}9p&r4{;f~oef0i+;I5q~9{#Q0$$jGA`@jGHx6WU8_xLguZ@0zWf9{oS(hIWY z{5dH-e|KGA<J`M%ca^Wcc=ek78U3t)iUt<h)!gr&OUpb_-}w5?nO|C2o%799b?-8m zOxavNWq(U)i^>AS^ydu$)}6774o-OX@{LW}8Hqj1rC0klvVJ|6V0%D++PQ|+tBhA% zP(3G*&i>2!F2@I^m4&k+oVQC|-L1CLc-K$XU(1#sQ(dj;D9m_ey4lv%#%I`;UYO@- zzUSbDtCIC*tK|*CWM}6EFmfiw39fBf^@^1-kvpGn#`RU3Y$9U*NrmMwunXJIO^A!U z=^7RKw;(iUl2+s1{|Ry2KfDfxhIU_3S+a`f<u0zNyPD^((h6;yyQTZg9=8mYI|AHS zkA%2!%@AGW=es^aQ>Lcp>XMa{ZaS}e_SH#QlYPeeJ69#o)`zE0v)=XhyXk`ef7})R z@4Q^`KTp11@&8giFV_Em*XJ=z(~M31|M%bZ|5N1?CV8yLeS1!*!ht!1p;^y)(z2^d zl$e8NuXCO*ZIyj&<>MQNB^~;%PgpR2K}fITVy|flD<5ip41Zbj>PgB;2GNM+Ra^Zo zndb3upQ>82^!1}lS7WafzP#)4H6S<Z`2~gh=js}SRr!Q;t6R*>0;kSeaIM<QDI{5S z@0ML5p4UaL-jG{->FUbDS$c)9@=R~MYRoF#q$2l@MS9Dm2!rXjL>d+znXuyG=JI=q zo9tqfC!`!uT(atF;V-ER*MI)s_<hOU+{Yf@!as*AY>HDldF|=u=)Ckto7LCL9)FyC zd2ihQmPrbo*_~HDe3-cA|L<#z4GOB3WslD8xoM_;S<G=kfQHDcB*r=4-5x9S99?gs zwe@&4gTws;6H;#!TL%TZZaMOh^LE)e=@)<hProvA*FSgv+sFUD-oKOY+r1~h;w$6+ z+dul%y}tfT;u>DAnbl#9nK##8%ngy>z0jJ8v(Zi_=*it{@)Aw<H>_RcFNFBk82Ic` z@m%mIa!H`%u3DF++KxMVY~s6KH!dlR^PcG9cI`^ddR>NH@<&+2VnSE+d|c4npRQgl z-{|wDDskOI3qFIqH;Hb6JyTxfxBflXrg!APZh@&>)8b}cdi(u7|Atrlo|mUqJW#7k z-_UsEMQ06v$G>S3Cmu?uAMQ=HXXraHQGVW>3ASw<QI{@>Oz%55xqZ^)C1+Jrmuq=t zt~Q!oe0zHgf1TXpknIb&{%Y+0;vQ4|aY5?#;-A;qydPFt_NXMj<UVwWoi8Q6#ZTLL zQ(5M()Hyv@g$slxWiS<1wUuf8_*p2y({7ZLIZ=P#9mQYajn{R{e;8hKIr2e&QENSK z(1E#o_lRxmi40P^W^3O3OWA=jR$|@M+$RA_*Fqb92UaB-FwL9vNdClC3%Q3!g|-(< znan(za4Jf5N4J5rMajMkMF$yJ>go<H{rT_s&D+6@_k>$xURX|h7sx1@AE5Ym&Cxm2 zSKrQ^@yp%QWP#bz=^>kY1bOAel<K&4O!9dc$ywF1cj~d-GxRG&4_Zl{vg>JBp4DWw zBZT8eXU|I0eN&y)UREidku1{kv9WU~7k+T?)ltW#{klbl%{2)eyLY**Zs}es!`qZ{ z<F2HGx2scBBo9B=`C!X}jT7zGm;7k^$NcAA`LXSbrkF)9d0JI^Z%2fPAjg^o;YR0A zEn1_HIEVLO=&8)pywj?$GmGRc^>W{HLuCEG)gM>sT>0~jS;l%o{CUmBsE7>$r_9!^ z-gaXLuidhSt4snSCvz08u3}xnWWf4;ui_i-0}b}P!gm+<{^rmSTe_`1PG7b>AZ-B) ztBU{0MTIlD_OH+@{H?T&b=D!{#K{@O!6prUtE{Wmq{Wm@nOSb!VRM8@elx>=F3mGG zM{b!!lplC<nN|JM(|zTKvxT<`dGJ1|XA$)h2%7QPud(WUf6~jcLf;uNRkMw&@0~S? zbe<&mD(Q@ow!%&y!&O4dn~uJ0)4Kh6@<g84gu=jy&$icfJ-9!~LULt%*ZnCz_e7pQ z?{R)})VWg8NvH09vPe|^8G|cH2VOp1wsql`-yaz)*9DsCENwW*W#d}0*5-%gszcWV zvMz{=b6qY85Zk7qwEfV9y?X;1uTSCO3f`*bRdwga4W_53rA6=W)kvRd;w*jnSK^aO zj?NArwspQMYts9br`@gR;@bRuve~`3CjlK#HmIApM{%sYCAsX%-JBImofukXWeb!q zKWL}1zMD77dC76vl!|Fb+@wD%d6-_`D*emD&1~g`e8CUjy$)sZ?{d528~S|FBR{cQ zKKY?DVz{48+^evxq)EnLZ*{o^kCpg_2YVv~k8TNH`(k<MTjmLq(|`FcoRGg*^2?n= zMPbnogHCLGTJ2n@ng9LY%!+Wmf~XwEXPl>++II%bxnRWqMXLGaj;R-wq}JbUSd%4E zqUXcpvzmJqd&*q?LwO=Go;s_-O!XPJH>&cj{S&@1YeR?WuEw4X9PwObdpRV2gq1Bf zGYSx2S@7UcFSp!jUzuIqdqfU+ci+$oN)mU!Smw<8UTWjvV`4fkH8#`oBqpBaxb|sj zfwRqDhwV;o(Q^{aO&_N`66h=l@i-9HHmB>t^UF7mnQ7++`Lmz5uwTHw!g5NUin`o| zFU$DfdnCVY$YQEK-CFvlygB<?oWZe@*t!Mm!rYT13-Z<#<<5H^KH+cA^niamm*z%D z&Hlw7A=eYpHa*dywLE}-?!hL*2_H|sC_Jssx@g)(=?Tp#iqj4lGL>hvm>TTkn;P}B zQ`GEI#@uM<OEN~MeD7uy6}=IZRlW7#`_$A$Kcf0|y`Qr81q8lVOnPK<y-`)^lDe^E zc)u05iuti%9_c5482_#_k=tQ-y6(qw=Ke`f=ck6hnpMsArXuI!Zcd)k@&_Euk$JB7 znGG4r^w~I__BI<{Vq0K$J?ilGWk%bN6|tPsH+m|0**mXnsjhy1Qg7AKw*eZ;|F=A8 z>fg^%w6cDx-u|^LJ0@CNaWy@RN#*%}b(hBPoG!Vbdm{Vt*1OzQ{O5Oa^K*Akjr6nZ zek|^FHYHn4ON;pOS@?S1M5*qSbQkBd?ei@2dmgyoJ<C^^_127&lKiQwuL#9H&3W(j z=4F8Xt928rJ-xhptsZv^xhxY3ys>5Wg6yt8>$2_#@qT{Xf6=~c>-014ei(2Zvovb) zT=sOQoAU8Slb@3NE*o;n=sw^ycKyX)ZBi(_I(!4e(R%e6j~Y50b6?yDe<=6ZDEiKZ z*QJS~l@}Whd!{UC3@(y566gP!!D2(5K=yGK<}ir~UW=w&-gkUrdeMSPtGkoWx9rwS zJG#55<3dW!Ztm%iQhc86vDw0#_T;tly_fClJC9oYtzDSE<>9*L!HR#%pG1~yWAt~r z6}K`)C3~Ohq}2j^S9Jo<1RPa5^)jVq!g{AIZ)!R>N?zZulFZ2}b}O|@e8ajuA0G)F z-n!WCXUEyvg$I}S@@nyU|2gsc_krCfvfeIXXZp+X<@2#8&T|$q-&%2E^HIGUN2knM z#U2`Y_v!0unZFP9w$41P(cDnbE*T!9EPtw_sBeYEQL$YYZ|L6G8}526_RfY`57}BL z>rQc1$iLUPP~x84&RWT-K`TT>^MZCvEB^GsJmLR5@mCvoBc-^u&H7v-WBRIn|Njd& zW>lOw_h#8avkUXLdS7RY_-)<5GDFU&Cu)`ar<u{3OS(OI+~c-$-}`lWVaAHpxv8e+ zku0K;;zi0@=bbE@i>0`$4UX-so4~7<UU#d)<bKF<#(B1k#>ci#n3Vo3;H!rvuc61I zLZQ_SEpp16E%oFM|B7K;d(qSE!NDy-=eAZ`+1#A^&c`l(OW4G-_Z3&PUl6a_+n5)^ z#BJ&n{>`J#>hq2Xm#tNE18eu4-Y<37Vf9HlrmSL>;1GwKp)S!<p1+wg8+aq$OtMfs zdHT_!MZ8wYQ&}EIZ?ivC*HmPZw5-szUSf;m|Coo@(%uAL6jQ9S^p27|mE2QVcCme* zTZKZ02ftI`Z?Tjbrhrwl0TR=%g(UiP7>KMlKRT)6=cMEtiwz?egg-yq?HahEPkH|a zjj)mjSGqbT#tHs;Iiu&>)!%#@FU>u0;{22_y}c)9WpqTZUom&FcKl2RO9=_(N9=(? zpL*}tOm%h5+}XNJtkjC_j6fX2gU!v%UwKMnPAVrV+I(DHwNh<QYikkP+117Gn+%V} zOZ%;pQM{L){v`KFp}@(t9YG7H%$<-`pmRm--IDzY)hyCl)7nh;zq6NcJ`^R{``mxc z->Z7({x3KZzxnA~&EooxzoP!Ve^uoC{QtT&>rLyjbWE>Ln|=PLy#1r9bN}bg{lD6* z?pzi}nCv>~ZK<Df*9!9QHM4lVRpE_&q*kFg8~3}dJo25NzCTk~%x`s3wX(YD@7wZC zuXjE=u-Em9+}z`P{=Yl?-uUwjcE=U=7UpxGcptFM?)PgB6Z!pk;>rs<&;82{o*enF zUoZcM#@`p6!SyedD%ZO_-ty=E*JrE#{d<0^DEY1W1&-I=ug`z_?;i76|5fh!^@oo% z@3pe$|DS$d@m0$`3o+TQez!#qH9^clSAWgt{<SyCPRd>2Kx5GRs~N9n1RVeF>SrNz zb;I$czu0V+WqaA4owBMVM9=%-MrVe(-<iDLb<dHT(lKjAkj}b*+qOR|ni$_VtymPV z#t`%HwCs!dy-loY2YXyf7s&jXy4Plo7jH<A$uZry@Zdz>ko@}!7urK)86{^Me@IT! zKHk6Y(90=S7k0JDMcntF5V(52b+~QfdA9pgF82Oy`}zE<ecH@FPwpJO4r&E&+O%)c z+x?+Ff7-v^ui5s$?u_Ywrwm30pPR*VJRU9L_^@NA|5p{RmzlSFRSF9>e(cOrndq&l z-)j8lqL6D=QQX^DjyqhDN55#sED!ZMWXqns)ZJcxfnRt@s!QkxzW5y<8}oLluw6f_ zES#$G&pl-3M}4j<>*W(zjuaX=1@0AOJ9shGT4Ji^dx!ns1VgsXT$?1vxA=_nuF{_0 zbF%dwpL_G{M}X<`fIvC(@4t-NC8y-v>fbDTIrwu+Vv?n>QtpZGUo?W(aUXxjd$>_v zBkq@8s!Xt&@iRsDmdwI?OFg*MWS2&qI;SAuI_s&)rTaSBB_Z3U1oXxy|7riY|J$Q; z4D(kw2u?X)`XS~}*7m1oW<Ch|n16yf!I<mn%R4gVKUpPTu1k$jaSh+$JfZ(?^rFC? zP|=Rvvog<e9G>em-D-(}@b^<M{%K81E9E{T*`xVE=v2Mhg6m3$ST1L7ypXYry@WHh zW2M~lWlAS6vD!&g?5%LVAipE`@BzKW*;l7|tm(LRT8Q`hHCq>B@Aq<xGzI*<w%lX6 zIK@e^XJ2bp)q==X4^MOYEUo8ZJuJhTS|ZP=8(5+*$a!k=C4)J>&aGF>FHUU#oqHyo zGs)FO?5~ku@yZuoHD4V%m+bUW?2^~IX!|nl4)^wxWeXnoygl4tta?S2`F2>rv!m>q zzZmyj{`Py1Fw58QEgH9sj%gnC70+GYzbk(4;ZR;rrp;elOIFLDnq9Hln#pig-^pj^ z<*%L1++ONGy*{O(Ym$Y%_xgCVwU+mu^(su+=QQKtYdy;;;p^nDi!fG%<rJ-47#by( z!2G$#KQQRbWuv0&>sHS=GVL+X<{)R;xv>f<vF8&mg)F|m*=)ll=diX%0k8P`_XTx` zo3!6MK5ME}lt|=}jVWS}j{V!gU%2KA$B~u$-4)jL&8?W?;9nE*(eeKB*l@Pe>S^-2 z{_<Vxf3dcH>Eqcmx$#ZRCFw~MyYIIgdec2eS250qFLP3=yWISAo0V&`zTcK}o3k&V z=GRrdWd?7;e<l1*ySF0ODmKP<?vA2%&V>gSwF~LEdGH#3sd?$MJx5@Vkwf8zs~a^| zNkwkfHx<b;lTuu^EbtNMsvx67g?u;urm-e|V_6z{#Z3CKmh~*ov>9JRCN4Rsep>jd z>=Hh^n^UL1kXiC9d~R>oZYi6Bjt%=g<v%|wWb3(La-i$RzOdDXJ6Ek*aK<EvkwK?u zlgsM9Bfnm0*)#HZFHkzAkaKaz(k;3(I6pjHtdU;yAx!LDr1jO7<g4PXmQw1AX0C4f z(b+UFV3VcGxi)qizh*;0r@|WTectnnQjXMF?eM<8R;(*#VMAH@!V?>~7R||xULm?k zXOdH>gZjpmiJgz+TkWz>X#U7wc`#2X^fk+rCa(XUTMfP~_;5$SmCG)MyER+V#`v&X z+m{56FzW}rBEb)?ty1*~k$5b4;)}iiLAS=AcV6C{EBU4<Wj3R1M7mYU6HSTiubUa{ z*BO6nD!H-qpy1q@9L<3jM76cGZ*rZ;n&BC`IJNct*R!*>L<Fy2y?qUjuFS@5XE!h~ z{+xPMr(n*b5VyoNVnu<Cv)XP(GaGb^t=w!A6&$kqY~dQlw?CUEh3tD~pf)wvz${5{ z<1)T3t|ebJntx`pStRGPsP-zF+&7*f<9zMI{8r`bUK>kp%y_bv{kq=s8W$m#WFg*H zj}z7u#jcQ>#wfjVUR-xoc-+;$DHbKqo@J&p?~_`fJAv(@l-h0Hb~cmz>SMo>?;MqM zEx9MAA?0<F<w~Wyp<Iu7Nw1l)mW!vYzgzy_<lJBNmkd2_9lH5<N~Tlcm6=nkV<eB= zJlo?wap~gEA!@NAr)K&Xhv$?|%@S^5I_0x#E@RV;<qHliPh67ugOm5F;V-vU3*xR^ z_2Ac#KDu#b|0xysUvnArTbQk)MVyNCTe!`;7yPj<lDTb>w7NtiuIFS>TaIOq=H=ZX zbDVy^;nRBNy!#@z&_^@xTjIw5wO-k*4qO(MwKCJ|%vo)*MHidy1sV4=^J)fOmA_Y) zsv<e<MBl-v36~2dWo<uGQa5v3&hH$}27NZQ9>b6XzU|F{VOs(k&aSypmzDTp+BOvz z<0e+F12b11>lV3uxhOtde0_Y>3~ARz+S#AWs@}T4Xtu2WF=MMpDo25ns-#fB(w8nC zx3dqL`iliJZTOpVh3&WY3(c?(e|l~;9{>G{Sz~^e$O)0FCwR^WeZDRmC|kEl@wI60 z-r}&GW~?dKE0gc8sJV9K(;Kx#RV#lt`gOhgy0n7znRVJG(b?te?R>Yz-w-)neBi;3 z+%-RcZ&SGD8a;z;zedTvM~nPQpOw2Xa7<m~*m!vFuKY_ojDN8Qoyj;lW#*-fwnH_} zuS(erf))oalzeu2OTNKuPC3ch*S`lw6u;>SOmk$I*xeSxy=X<|h67$vf8*Tr6x^1q z^uOy6)UT-@Jk|MZg6rX|Z(pMXME!!E)y+P*Vuq`L)Sh$ZH%=OP86LNo%sWNo(0tY? z1KV4N82q+vUABQY;sM{!wq7INo9~xtJ-Yu)_J8g4s{iFT*SnpRIB&4hzE=LrzWmbC zXTR%fVwc_jzgG9+PkUdR|Jh$(2F~2`@6r4JYR~ISR$A=&7IIP{e&+vYMa8<c|99{E z7o5Cu<E4nYy8pkG^``!Jd?_!p{iBuDPv*aZdvzmLSKX;h=G(Y5r~cFl0cHOF{Rc0{ zIj#Ks;NrC-CKUqPtS0v}2WQrCuFBsM5^Cl4<xt_7c3m^>qiF|!_OE@sJ-U5)!Dg0C zKQgkPe_wn5+k<l<+Aj|EAFoz_f4;B$o1YoCnX_~{cdBJ)&7s?TzZIl3k9_gwXTAEM zx&7Lfo||D|c51D6yM*Va--^(bRr|LzDq+VNzuyHn=LSu*Zf;6eN|?gu>}@L7EBiX& z!({~tx36<QT5oUO7u2ZjC+jcfakntb>bvr9mlTbR0JqZ%8uUFw^Z37+wK5$#wT<yV zL&AfJIyrqeBOTHVPAzkp>#M2%rNns&r#|cKEHz%u;3$pyV5T$ie`Zbj-*#~R8KH`v zfAQ=G`9JO7d8OvsfBQ$f^8fWOy<MxG{qbyh9>b4QfAkOjxA?#LW<+fC^3VIFd!K)n zuRpQ$()^EeP3A6o6l7#>#Pn8wvHr8Rk`|fV@~7*SC+<69{vw6<fnZl(^Yc9`6&Bdd zI=;7PuVOP}=uM&E;zzHezP^61qo|RwW_Q#4SpLgvZgakK^VeV%F;$T(PCqyK_uCIX zGJncS7|vQ<>Q7m=dEfj1{}u7=o5ZhwY><$=#`ZB|MOCnu!KLWE%1vDomC7cqy=+St z?zb1Lzrs={s&HWOw_iT&_c$*4?^$=`dgH}KR=+Qrm~Obu7!oe~;NPzs(w;#L37S7^ zn*6T+syWnPXMXgTutx0}PNgmS8=n4=R7q+%m}tf6&bal1={@6f6F;tv?z@?6@v%~S z%kO11?57{DyAy42<HZezGkvo6Uh#c6!Lot5erdBA`@s`kpZCpU@|AtXd@Y{ce0wwF zi`aud3b+a;E6Fuje)z@wVMp^4`xTv+%pyFl>&<n0ShQxEi}+1(=Tm|Ere(OrRi3EX zr?}p5@)0>X!70nGKJW-x$7`VX;B}edi9EjN3U3zO?l>oSNnPOLlxqezx0O6;tN7*` z`A7DK@Zlo|y4-J<9`iCTJ<S-nEiBh$^=aQg(cfFP&e}eKsgF4?QaJtby6!u@f9L(2 zQ6;p~d1J5p&B`B>9<-c)e<ho#s%d`38%@`jA5XMxo3hVCWX89(7uK6h;JNiJjV;uq z>(cdOUsNR(uD#!y&i!hA+1=&;?N2CjEPZdz5FmfA{NL|ORiBq1`*rHlr&C43J&afW zd!Noe|Lebd%(icr7ujt3>a?ok@5`!%Y61EsF*dB~T$^4U___ZQ`}w9<o$F41UH_Kx z%h&nK`q!`hf7Q)c`ai4UhHroVw#ye?G%QG4`*_{4Quo|S5#RLiqB(wZcl(s`>BuuE z`(^NSUpk!gd(+~58%h_PH<_81@viEk>e8iCKP=VSCV48N?!jaG*5Z!kJMvXODsb#Q z|Egu-_Zu9sy^}2@9>0xLc^LoWT(928Yj#15dHt$;byV&@IlospH>mvM%uN&SCx4i< zs>tfw#+>A&$f(5oOLy0QWvP39^mY9D%3G{mlfNy=Z<G`J9~s$ph%JJ_{-L_!wQKVq z+uJ{yW%@ts>7#3Ie}2Z+-m(90@H{&^?Vt2&-!1=VWuO23zwSin`fl-~r*6LdcYf+4 z?&sac%Z(DY@;z{_c_AXT((YK-ed{O63YWdKy_ZeMUK%fKd+T5Gz3l<F!k!r~x?Qbp z|Ni~Dcjni&f7_mL)?DiLZSAwMzx)<GJHhzt<g4o2uVzpEv)4=d4ck$-zSRDGmv6<~ zym#w%mWgz<_U-J~uYa4!pVhhGRm*(&{u%YO?SB6K_w(k@eRuJBQ~xBhjBZyOo_~D* zC1b8ndv{oL|4~K1E4LT6KiIW@*S3ATxAE<G_vYWGZ7lWQr+=@z_fM5uq;PBDjepl4 zfB4MxaKjgGxptoio)ORfItK)9n7*Gcdf{Tb3zpr7)ha)z>^p0mxOnHTE&Dg`;cm(h zpLz7z^xt+8^B8|leJ}R@U*(Rk@7|s}e)zk5|GjrBHm~_|c<<r0Z=3h_|Neja-sbwP zz1nl*AFdDBTwTVgny(=8Lix$XXE_`(LfhWvTFMApAKBhHH{04~*Yf-G|JB~_k=vGH zePrQ*vhvB*+f_E1NS*C@rW%=5Yq7rU)$^^3{nlT#%<Wjb$z|*IUcbjnZe`E8F3r9? z|NbM}H+TEn+1=mf?Ra*vaDC~GU*%iduPbhs-fw>E-__;X|MTX^%-tS6_x=*M&-$;^ zRI-jt&Ulu3w>u!iOps+|%9+ZWcee+%w<sT~a<$6RG0nEvG5_O@jrn<xLqeaj&aZNf zG<iJxcz|+LH{SyNu71PUeeU1I$_o7UX_!bGT=cR&8?`WG?KQ5clHw;GU46!}_V~IC z%}YWtbzgh7f7!DmY_9wc^=CK2Y}Yt1F{=@-x;1}qitilush;i~)#gt{l+17Xq%YTA z{l$0HR#DYO2a>y%9PHO?;(B^W&bH*Ed5t~a>Y`5@-iTShQ!&4z98>ov?%N5M#mhCG z6;-aBVEX!DXmG$xy^{HlW$&)ayVrO5Y_Z?<S;lL27*-tXoxWSLzb58#@h^{dwh8z4 zm%MrTBs9u(f6?^JiC5ppa!8v?WY3(}@_uV``)g~)4qF5MzZXN;6SE_C6&~)p^SHUQ zM8fIcgDqFz&6S@obJah4@4L#qrHlF&37T_tc(KOheq=0Iud&>+JV~#7lf<Q|5$Bua z{bTKGtl6Jh%z4D3-n-gIZ5><h)_(@s&znALUv4yDz1#LQ?VQG>o9|qg+PYOWd1_BD z`jcG5^)uk?g_H|=G1VqtdFt&{zIMq)$$wS;wL*S*|F7b&fyJ*~dC!FG3|NtWm2X>_ z!^U4+rV-ccX9zAZ`?Qg#;e4Q_%;B>ZJWHpxyE_Cn&Eq-#)<Wi~%}Zqk&F1~Wrw@pn z-?Dy{=r?uNuibs^Kb%T?HgAsYyX+x2J?>+{qXhPO@mtUPDV6SbcpFr>dDG6|d-v8{ z;9~yAbx5l8+dKKxoP^&zpVO9!sePQaP54J!#cx@A|G6I*J*eJUb7iZ2?v?Kcq8|N~ zS*NA+LF}ly5ZlypGxOCi9={ji7m=UedU&Bm%t8j%6LW4VetCDn`I4me<f<~E$2-`3 zR{ssUUYvT&<%9FoPid*u%j5FRPFr6+yEbcMgndQeZOaGqjBPt|4l;_A#a-#TeLMO^ zk9c>q^(NzY@=S_s8#X8}-Qx9V#|d5`3*Nv@Tt+HN>fA0}g^e8Ut0axyc%JkM&1O_M zwjwOk@|65XC#F-g-<a@gP0i{p;<Hdn)(<m`Sf%1}eXdfl&24t$sSNKGXYSDS*_YlS zkeV`s@ub8opBds0mNZS~SC%y5{*Z2X)9cyZqc3E(-gmK5-*`sHh=p&8?}wnJI?TDV z#o}14Prv)PkfmQ-!sXGwcZSnkHahBfJKa@(<W=-{(}rtWN^3Mi)RTC`3gnj-c5C<? zGD<tL>Gb*@OUAPA5+DCKI7t>Ut+%sEQs4QBLuP)5{^AO&J1TeHzRWv%>#p^kxg1x1 z|K7p9wytJ-@$X0e5--YkZY}@h|FER}o%`ENKDjLd$Deqd3ch&0aPf3UHs<5G`=33% zvT!!%hZ{vMdkO+FMWpq)^tE~~mGP?m@ypyDp~V)y=*!cvFA5yH8kKq~CY1PgUwPMR z|E=TAnTgRy-)bDWI``#%vE-#j``-Pr2wb^Ovj0SQ=)RXL{Fez@cEvlbsL$EXcP`t# z{rJ_m*9)%ZeYKnS|DMImZGBcQDo0$GUY<PJZMk^uogW1?C6}_V9NomVcOA2wwE2q0 zy9vE>LciZ%XZ7A}mHO85=M}sa*PmbT`t^KkxqExBkB^bo*%upyK6lujY}w5*VXaz> zpwMZx_fl7@9;Xz_Ty2SrJCd;3us{F6>+ZFuD(5Yq6F5hll}j>e?lZx?0S*Nzb(>~y zfBkLMTQgacZB@cgtj=G2^kD1##N|n>E>D(JeKPbhkPq%S7IAd(J?jP8Yj3XGca-bp zmY6&1x{DlNuE~xOGmR~0;p8@d>bos8!8t^-Gwzb(#p_#~xaU>czHdljQDmsTmV2ej zUH!ycgP`}T)n!HcqgYmdzm*~K<=eeYo0(@kiQE&S&aHL&tI6r&P?3A{L;Cv{PCnKi zxA^eVq6J43?*G_yZANUYi{!C*r-a=e|I^$4tho3w{q^S1tEH28|2S`C=S{e9c9C)k zuWZ$-MW?mYnRSm`W<L_Yv4Gd-%Vm)}IR!!Qb;2e@88*E>#u7hs<FB-c+Sc0QjTP+^ zmDDd8mj9pBp`Cv-kjd$%=L9|x@A{L$!bUQgKO62pI4FOixM_*F&tbXaemVJXO4$Un zZChTht>6DLbfZ^7{qvo{T{l<jB?LZyt}yl0#(8J?69Us`c`TeR6uoigZK+fB(%RE+ zeE1<+Ex*!~MfrO6)n^g&S(deK&z1es*LO=$_|Uw0CjVsX3Z}a@y-HA%+Im^;-8+R# zc2lcwt};Br?b$23-XQh(<23cYGRtcr-rsa*uH$>%dQ)rmyuHrr-M;Kxs`X;G!_kaa zDlZ?fPBAeLx16pdc=5`{#*7rkU%R)IZ2s{#Dk^IBy!8vUKNg<3Akn+)4MW%afQg*8 z2VBzyxH^|+^Bvj$X6u|U@zqA0VI0g7_pFafM2qX@Kc3w1X<Cbl@CT;%hW&FJ47bd+ zWEIxgpku&jdt1&`IAXJqxL29;n_ofK--z8*6PvkbkK3Zk-KFy@wF5kgYnPt8{-NZT zn(d*rRgHgC?l0V_czyo<*gzrU0J*#S(jwdLZIRs=^8VL4o_n`X3HAPawr5Fpk|N{h zg(}gOLTe{ZD7`GWkx@9h|CEo4wu$-0r561sWlENwtnn5M2owA&p&7R1j=%fan==i} zr;7@HlQ`i&_tYHY9RiB`&M6+0jodQhV14bYMD<SJIu@JMZ)X&C9+Eg&x?{GZr%gWx zW70x<M#Zq0HxUwnWpWV#=RUG-{Ve>lpNIFnWWf0qw*=a4c`I#Pcx<v8=SF<I$u&1& zY5&WG{`1$~bdUIZXZ5^2xnIr|?oN~~mvjrZ(Aw}PeYL&f=e~`c${%iW^{s6B_~ZNW z&gLL?m(6)6Z<$)_IL*1J!#DFl^4TAb!p)j-x}LoE9h~LW*lTypJU^}I*3<)6-?t|! z%oSuawTpJXJEv+{eObh{eM&bQz3-XsKJWSMlw9C+kCa23)?Jpr@kPXJsqjDV3B63q z<`%LYTYT(w$LBk~@4vpj9-t(9a%qgSx}*5?i=M8AvyVRalP}$*YQ$DNO>5EQH;g<7 zYvb5|y*s+wQgVsA><gv$GIz@tOq!u$Hf7=iML$t}fl8MSiFL}BaVg(!izN1YXB~~3 z_<^~n^`1tjz^io+*-L%}Sa<yRzR;sdHE?xd-oIFV$D@vMdY4z8F0ns%I=;SH=Vg&@ z!PE6y#VXF5^Ubug>bUN1eBUBw)#9J8GXBk;c6u+XckQR^7t}lNF@M|YsT((Y!|J=! zR;BD@%v`DRPt8kdiNFgU{_N&s@e0>Gw=^b6#{YS-+u%v((knlnzuEd@oxy^ikJ}kL z(_S&}x_6p4@bt<b0>Oof{JSE59JGD$wC(WIKff+N4`+J5IkGC{`RC)GxaG4K$5i;= z;MbG5|CrhIbpLB+)nfl?J%8f3cm3=TD>*s$$glF>6Tj+5g=9{c>^XmN{<QLKqJf7x zkN=%fT*J|8R^0l+n4$5Wd*5&Q_N%u7zca6R`uN+$<IW{*Kl&v3nAd-q5j@$krAzhP z?qB&oj4Y>k{w`W@;jDaCErVk|=gFPF#Fy@RQLxZ#&1)6kNvn>Zdc5kms=a*s{LNRM zoKs$PQdM8Refp+FPpw0q<=RZ#zQUz^{_(c~l`qWS9G)a{P)R`L>BKG8wjZy}<lXu2 z&(hqbzvgV!&OAN!9G7TL^t<=VvLB_gA5!mMeRZdC{67u-2s??N!YQ9ctIqjrp1S&6 z)lP2yAO8Q(t~gJ$^VC^=p{Pz}amf6~hW3mv<=;G=&aPa^^gVRp!<zRVEA5W|vXeVm zySZ??p~EwaZEs~amd_Tm)Bk-t{_mw}?0+`=w!gEmwl}=i?!{L9f9%(1Jiq@xXq|{x z^whU!--ayQv32L(J^#OZ+A01sU*mlt>F}Kwiu#ORhyFV)jaezO?R4uWwY~p$Zrc0g ze{jvaC-!;8mTs%36~Fw;Xv|*!o&9Cu@xS>;oic+T+28vgb5Bd}eSOWO^Z)<FYt4`H zpBQ4Dy8M@>uBq3|mFqQ?mpb1R{ZksGH|2&V_dlT@)(!R1AF>(l7q8@8`+k{?#$Tqb z`I&1=8+LO2U%hnJ%H}H~S+4`mdz3Q#llV93iuVuwxv!SJx}fhF%6N{Y?)}j%FPF7l zn9OYZXI;YORw4F%(JN0&emL}FatNb=-nkdgb^kp7sl40%3-6Dx=1H6vm=t4}{&~z5 zvSBx7zt8vZWOPLugQ-nJm&w<l>mRsJ7s>4Bv#DhN(Yx@D*W3%Ytp1ccZtQ*CnD|qm zR^R^r41bURmwS63g{Q<nw*5V0`G4=JT|5474qEbU|DMRGd;fo`%>R4c{PDycihojf z&Cp)bdGNe_#Z0@mrkkx_USA*feg4({tiAomc@LdiY-eYiu{}#=?%C%z*FG|>wwYPg zHu?PZ>Qblj(?Sf>&YN3hPMVg-p87oL%Ui>+lFtJ3e0h%VKB}P4&0Dl<`SOMK*Ls`8 zr@TtLU%hqLrvFEG)P`ou`RLZBcoe?xEacq!{qqlrEW_nbMZaf$`~0VTMeX7HQ>61W zo*i5>O_$^U$8)U(yJvn)EV}9|bv)~w?tUBnI~CU9Gp^2?AKA3LrzJYHzyJ2;S*2&a zy$^q%e7HC6aC+Ec$s3|YM+>_Bz6Thu?W+`Y=c*~mh`5}wIQhp-bM;#*+RC}xZkO)5 z)VtR4@n4(C4S#K>_J?~1f89HO!oT;|ZlBn6=Y!(!8H@jO&%XWi!2k7AZvI{G{r|tG z-Oo~|jt9SHq;SfWGK(E3&O3R;On2IaBbW8E%kE#>^eo)@_%D_(KeQ6(PfM*@W~LOA z{$|pyXBNjYT<&EXc*h=A{Qb-HZ&Z!(Osij4PDuXxGBxAg#<e-iODC*tRGAdt@s@F= zXZ?!E>215c`L;@bI#;H%$^Kg2y+7qy5xZty?hRkPrSh_YTghoDxic5o<8CD%m{3u% z+IHWGzN7E1e7Vs$SL~k5-Y#x``<cmAzkb`vhR*vpTbk*Dxk1Wd$&6a(fYvvY{H8CJ z3cv60zFvQ>aq_=@`Az-1pWFL<3(_?Duf6o?pZc!z_BH<=fAYzj5msl+EHUNn?(KPX zi!5(Rn6T(+D!B5kmM=J-v-{#fRnGmdt}tzPSw4$JYu+xVsT0dOSG-`;n7%Pn@<~<3 zg~B-LlvlrYsin^pXIT)v&Hdo3V+>l4AJzQ+v*or0yV1q+3t?QVSFe5}<8BiusaY6V zs`tBkk$}0s;HG_jOT+749=sSRz1qyz+kDP8v#q}l+p4fxpK^W2cyaxtg@&^fj7`q( z*y5;E@MNyuejgEmDO;At?<q_2aSOOKH*UkEGg;Htu&y;aGt+uU>emOaIX6{_uezWw z+51oN`ZDu7Q*UR!xh;43kiDex^#u`8ElG)uESn-)?uGTHT-E%|n{V~dU%_L>F2N%& zjlTqayuf>0u9qi0d_~Qt<K`~^Pnmu7nQwb+R)@qt*DW8`_ltNuSIBWy37;k<{L(y| z?d$OdrZ$5$({5!<jT0zIeXOg&d|dAG;--JCLA{R^m!<a<`Y`#bB^}sw*YwBJM;8^& zy^=54^`L47Z{bw8pMTe14(oUL;u6mAvREhg0#no;ckY+h=Nvz0Ci3>%pI^s=%RO$d z`RkOOR?yhX%Pshxmv>pPMED!VqjB7B+XeN0Ty3p1GSVyDIBS!Zlk^-dk&5ddGP3WS zYjj#Po9_dUs;Gp2e+knL2L3dCKCKF!iQSwhs@WFmWxZMVFy&-J;+(!Ow*;b!gf7iI z`oQtwatHo7Z&}Y@|NVyjFZ+|bul(~)MqS8h_Pf5?zjZV3qozZf*t7p_<~dp5vExnm zgKNf)r)`&gU)R3k&b4d5pWO8R^!oXs^^%8vR%brG(fFrnxyY5z&xM?_9^2%1_v$Mg zTC%+QW>bpMgq$#@O?(ENudDk{$TKj1G%=`h(6@APkc-@HVEAn5^yoB+04`RO^RrwY z^XUF*F7GTqmmIx7Q%*r`@{6b5K?h#nj4c0R_}t>X$HU$B9R^2A^rol(_h&aaEKppy zVPE5f<Jx{xPA{uG{7fxMwQLeU>r;sZOBiH!Ke@am=KO_{Il>v`0q#pvPs+?NFWl9Z z<+h^R`^BoJl+>7jomQ$obKia3)MhFx-N&Znca8V|?uxDl(IIntewyp$$EfdDnQvz( zV{=(rGX2QGM~fMq6TkP`^VmsF*t;e(FC}97Jpt8q6F$0jF*i%zaIV;$_`%qxHAnHs zg7fDrmK|K6k`w3}ChNZ2_VI59CZhtMpK~IFA0Im=q;Y!3!`r;)j8;w1+VU}4UD;nq zDA4F<L8@1)b#zZe(SJq_8}`zwM*H(l8as|<IJCHUaeTbh70{LU?MKK$29D>ZD|XMj z%ksE%oBMNtt&dl0eDD$eeQkzs(}AMc?7r5N6g|;nx-9?VBn@uo-VHC`_-xLa?2As3 zFP3s$-1)$MlDdnJx(4INyV;8;-nDP$%&(fGQCEGht8VJ5z3fFse)~O_AI@!QsGGE5 z&edrdCJ%RH&s6?&bVu%=@~pT_h0J*@GYmag`S(1SwBfbAKrzpZ!t5Q=FZR4L`?@Od zV&(ysgw<@z*h}WB`h~SD$_YCm<RM-0=)$RAS0D45ZD`Ar))RZ^W_q{8u_2$=cH2b$ z(q=I}(;o{X-yAr}YbNUU=8cmCOZaY!F7C5}AJz$4=ja@CI-)M@oLt_t<AH9y;;dwU zU3qSiExjE(3j2b^+b40jx3b&`J#muruclv4%Jv|&Qk#ml;wHHT&rV#3QU27h$-Lr6 zZ<NkH%Yf#}oR{BBH^&(qONiUIoL@<Ja_56nr+#hyZ)4N^Bt3_#b-wqtw#?-Hbxki1 z3IwM}vQ4pTsgmGXR?99qzejww9ixC<@4W`OC326XSlk5odN;DAU0--9PtEA?F{ZWt zmnO8d^f<4PcAu%-|Dr-mrmnkMEoR-(8zEZiGK$ONgiJqbUTIvS)TD0A8r~DdDkPQ6 zf0=Dzg+tEW&uz1gm)QTg&m_5Y-hQohTe7biCmcWaOwP?f<gTLvPs&c!>1rz&KU5of zKIjO35c`l})4y2xeMe4Rkl_~8usK<g;`2RbQ$SSLr;K%hXLd;WrnbyqmnrZ#zaehd z9<F8arCshPFZK21R&Uv4*I3`G8#Mpu4MjQMhwsjphRZ+v-eALf`e<@)`UhsogGTmh zZMT}N7B*aOWjJ<W=_G;UhAoeubG9F`e6Tpe^;T~%>!F#Pmi&?{LxN%@x0bK_=CVpW z_j<%{r(QAntwP;F9X(!C4%O}Eh-H5Ade2|Id<nVz?H?zqFG>;X>(8kcQff91jj9vM zXi=G96hF~=;^YGtH(Bpk@%OOY-#wjIv@05(*azP!>;|u&d-PJyK4sdHg?X<Gx_!z| zT=Kl)*t}p#a`iKZ6AUaHroHVvz#<$rW5TRmjZ13%70#b%e3x0HvVO_#b7@a^J9Px4 z-LY@sF8CDtY=hkt*|aIIlgrff^n@mRe)#M2N1$)_19kTwvZr*|Za1jAM$KD!#Z#=v z+w)wo#g=DMXC*(yxTqx@t9~5LZfkw|z@477+J)zYv~<3l-l3Ba`}o+GYZ5V*uZ7Ru zxHDC%=Efa`=^Iu)oi$x-cWz&d5Bq`(yA$SrU&KGrHMi=v?qf0TgXfa6KFL+2{?m@R zpK??F+R}nziBn&qgj7YuPgu8kZ$EJP5kvF~w}kI8?`*xN6cqYrwXIh!U%jH+;l51M z;um-1vZuH07ITPw{!*<kTWtyd{iYxMKJH6$S1do6SUivY@rjFd6AqRvuK%IPofiM= z#-~%&m+mm+?`QL9c%5kRPVasDu`|0Fmu%K(OAfxS7*%f}Qu~T4e&%O4*9nt9R%W=& zjMUJ!VBfjnh(!A@N5hUHyF44GyiJ7->Bb4ie#~QkGSf1|Fz8!UkL_2r;C^+LBN8)b zJbv=gb$+NrzKIrFj=}E6C#P&nca=KN)_g8~NoUg2+l-$dM7W$W-_RSAxX|@NFXPqu ztL-1U@YNOOc0c=Uu*amWGpzo*K)~!&qmxz=yGx4_f6V$Od5J;VV5|34&Z~QTV%KoD zpZo6h=A`at`#Gmy&WKy&+3Kb|UHLcDoAXnj&Di4a7u}N4W|R3&!{6Zf%4D9}-VY9f zfz}+Z;@cNIUe2I;o4xs?Ym(@*7LB$iSG|Lj_WwClbmKASSBLd>qUX&#tgH*yeqp;Q z(iyC&?Dm!`@%Sf=YvFT58>a3PJoD$smP;?3!j>q?ZE?80w(C@QU6YJVkKt7IO~<}U zNB=xEp)~L5Jn`05!j=ha4<#Awa<~69-cp#Y7Akf`<#$bB?~L>F(?v|y+s#bp3I4Nf zyOfrDNBK|5MET03-ELQxN-x|oUm&7DM?^2rByNIolkGh3!?Qj=X1_miLYiCR&%7)4 zZ-sCDSKRj`Z^NI)I3}-8|N1}u3tt(bm#cUGe`VMCntz{fA1|8RE&Zpe-|pSL|H1dP zav%SD|EX+ejONr0a({wX=zRZgb5wo4`uVyz`?sd$*Xrxo^iFWarRK(U{@s74BUn4- zgR#knuhG+(xU_Po{c#HO-nq23s&$90#k;C$YP-+ou8!lrt9$s{!vsG29YK<bzsooO zNcjFDZocq`n{kt#g_Uj&stwc^S>1YeZqVj{HPc^5NB_TnZ|fJcJm!bR|63m>PrN(z z#qtM>8dSV<H@GGr$!wh0v^IGQTatQ#jEU`=`t=$?Lh{NJr#!i$o7QLMdXA_4@WbqV z9_zl`_U~?NSUXv$gZ=GK>8Gx(Gqax^o6Ww_e(sT<r=J|@K05tm)mN?X$7*Naq+XHD zKC9wmtjvGuOx)u{rjG%;I(w~!zpVUL^XlhEqd7|!K3~2#MUK^Lt(LfP2X|TaW+#@@ z5fdFYoxStpUW(j#Cwt#RCoPOc@Ao?kxeJEuK6Po&vSN`LM&-*Q{&LETO-w(MIsFD# z){R%qs{7ki=g#F?#3A#0SNRD;`_%6Se9fKaeUD9imp!zQx_Iv6BMp<MuO_X^@n8|T zzou??{9lQ*i$8z8`&MN-Ay_3Y;GfIK{aX8Pw@c^WP~4~x{$407Klj-hzFSjS%+jSx z&TU#QF*hw}($%GBc33`G-?VzR^;^{^TYe@hm0t1Kx^ZIgf)mg3(k8zDU$e~fbw(hc zNX@N%b8np9mBbanv!h_o+@lX>E;N#oOVek|3EQ<eJkj{}k9YiC#=rkg_|0Z+e_cgV z<ygFXRY~2NR~kzLUg<6Ux#i#Qr(5ni|IFL!FLH3-pMRge{HVG$ZPP>ruC$v~im}Hs zEx3;PY*X3(IEV31Wx3Vlf~==zmtNkF=rV6S;{Eb(OHF0Hn&3jVoFgs!jXPgief+Av zJgiz(WzM8X-CWICS6ObYj`*guvwL!z&9#VCfyIA?ABlZ>8uuype*~97PF_+*LED_4 z97+3l9A9$A8?U}?zH8?;Yeri|nS;7)Hk{wTKK%7zLv3<(cZ|SB)7H$cn(FfN!5i0U zvgkd(XVp*^YMeb!@3(!PU7nZps#iKU)6CP3+N)f<ZodD{v6HrE)gnISY*%}Iq{uXU zTIemKv>2h%B%Nrne3N_M*zT>0SY{S5@$k$d9rMFamj!3kF3@FPQo+A!ch{eojVZU+ zK6PREwar_9WuMsVCGQSwTNXEI*BACzTd$nB;@$MpsN2UgZPn$cI;s9Iig-WSN-bdi zJgaD*d41YhxzENq*VMN;fA-SJmC<in*5xswaQgp{$8)<|Ir+nEH6s3ImM>VJFzfAB z$C&E^&L)z(Z_ciLC|2<Ll~h&}pKOTxg0%ck-_zEbURUDVD`dZ=_dH|liaEDeDs`N+ z;eBkvIZgPHu50L;K7ao8Z`|hZ{usf^w@buzw%H!zsXrH-`k|}re(kMH`;A1q8<*E; zi>!J7s9W+&>yCIW$s-(FRPM${mo0g6=QiuIhL@t{yJV`)dgbTo-7<Q#TGnb$thi=R z?aQ><yxk9WDWsnMrW7GDqnl^l=1C^}H>^@(KfKD{{3LYF!dAYZgoFLTvzU*nv@)su zRB^jBH!Qnd;Nnw{71bfvR`7ck2RWsBWO`oC<XmF9@z|^{`z!z5?#Z7uXS%>NeoLj# z-#Qm?*R@re-C1-trf93WPnbewti0Ch-}P}-EZ+=cuI<SXT%$1k*|$&w?T6*L^MA=E zl;|_-oVhST=2w&%TYU=iyxSY958F@PSj_#bRoj>CNR05mUZ&z;gCqa;uqa3iyqNY* z<f8rlPiJnO|5EusadU8Q?9II=>#Nf)UNU|9<YVDc^UJSHPoMtJbJXe2{;cFh7Ajk~ z`j2Y;n0B(@^Ool)AO4V+&p5?csP8-f`Kv!0pKR&oc`#}JvqU}#<qXZkrt8moM_9h8 zlx~k**56*c_0`dRT=f@&*PrUWEx#zP^Xb{;O-+ZF_P3eG^R>TqHv24gJWl^;$Zy`g zUrsSi%K5ZC>ZZsu$IuOTWVyXlr<I?oj-I{3$2kA!`V_~8LXTs?e(`O&rjPF|zbOz< z+}^SBF6*>+8z(#3Ptv;{Hp}D)>nypgQPvq3pC0NJSzvK@(#v&U-F&^Q{!hIpVn64= zUYG5zGnZ9te08jJ{zHY>_%APx-{#AnZ`J9#VPRT?5?_ns36`R}wug?G-f^gG-|%IV z-p+&xf7Y{|T&C^z|GdU7W)*G4;2YLoS}kvsG`^a<r}<}}SYK4kt$C#ZyAHe-GHPy5 z(cdv~M_|k1m-ZI3&J>(zVM*^R7WCN4J|WrZ&}TLoj-KE16ppvJq|aHip<Rz>*N*Sa z)>mz!nmVI$i()#To;@wMa)+XdwRK(geCZE+U*1VNG<8bGw?9FJ&FMRB7{ZrdmhcH` TXdw)yT(nPr_{EChMFax?7wxG! literal 0 HcmV?d00001 diff --git a/alienblaster/project/jni/sdl_ttf/acinclude/libtool.m4 b/alienblaster/project/jni/sdl_ttf/acinclude/libtool.m4 new file mode 100644 index 000000000..72f154a14 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/acinclude/libtool.m4 @@ -0,0 +1,6409 @@ +############################################################################## +# Based on libtool-1.5.22 +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 +## Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 +## +## This file is free software; the Free Software Foundation gives +## unlimited permission to copy and/or distribute it, with or without +## modifications, as long as this notice is preserved. + +# serial 48 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +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 "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_LINKER_BOILERPLATE + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<EOF +[$]* +EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) LD="${LD-ld} -64" ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + beos*) + # On BeOS, this test takes a really really long time. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +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' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + #soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + #soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [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. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [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. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--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([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + 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(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$lt_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_PROG_LD_GNU +])# AC_PROG_LD + + +# AC_PROG_LD_GNU +# -------------- +AC_DEFUN([AC_PROG_LD_GNU], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac]) +with_gnu_ld=$lt_cv_prog_gnu_ld +])# AC_PROG_LD_GNU + + +# AC_PROG_LD_RELOAD_FLAG +# ---------------------- +# find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], +[AC_CACHE_CHECK([for $LD option to reload object files], + lt_cv_ld_reload_flag, + [lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac +])# AC_PROG_LD_RELOAD_FLAG + + +# AC_DEPLIBS_CHECK_METHOD +# ----------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], +[AC_CACHE_CHECK([how to recognise dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + #lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. + #lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | kfreebsd*-gnu | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix3*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; 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 + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +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 +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. We must also pass each convience library through + # to the system linker between allextract/defaultextract. + # The C++ compiler will combine linker options so we + # cannot just pass the convience library names through + # without $wl. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext <<EOF +int a; +void foo (void) { a = 0; } +EOF +],[$1],[CXX],[cat > conftest.$ac_ext <<EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +EOF +],[$1],[F77],[cat > conftest.$ac_ext <<EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +EOF +],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +EOF +]) +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then + _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then + _LT_AC_TAGVAR(predep_objects, $1)="$p" + else + _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then + _LT_AC_TAGVAR(postdep_objects, $1)="$p" + else + _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$rm -f confest.$objext + +# PORTME: override above test on systems where it is broken +ifelse([$1],[CXX], +[case $host_os in +interix3*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_AC_TAGVAR(predep_objects,$1)= + _LT_AC_TAGVAR(postdep_objects,$1)= + _LT_AC_TAGVAR(postdeps,$1)= + ;; + +solaris*) + case $cc_basename in + CC*) + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun' + ;; + esac + ;; +esac +]) + +case " $_LT_AC_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac +])# AC_LIBTOOL_POSTDEP_PREDEP + +# AC_LIBTOOL_LANG_F77_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) +AC_DEFUN([_LT_AC_LANG_F77_CONFIG], +[AC_REQUIRE([AC_PROG_F77]) +AC_LANG_PUSH(Fortran 77) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +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 +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +_LT_AC_TAGVAR(GCC, $1)="$G77" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_F77_CONFIG + + +# AC_LIBTOOL_LANG_GCJ_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) +AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], +[AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_GCJ_CONFIG + + +# AC_LIBTOOL_LANG_RC_CONFIG +# ------------------------- +# Ensure that the configuration vars for the Windows resource compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) +AC_DEFUN([_LT_AC_LANG_RC_CONFIG], +[AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_RC_CONFIG + + +# AC_LIBTOOL_CONFIG([TAGNAME]) +# ---------------------------- +# If TAGNAME is not passed, then create an initial libtool script +# with a default configuration from the untagged config vars. Otherwise +# add code to config.status for appending the configuration named by +# TAGNAME from the matching tagged config vars. +AC_DEFUN([AC_LIBTOOL_CONFIG], +[# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + _LT_AC_TAGVAR(compiler, $1) \ + _LT_AC_TAGVAR(CC, $1) \ + _LT_AC_TAGVAR(LD, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ + _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ + _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ + _LT_AC_TAGVAR(old_archive_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ + _LT_AC_TAGVAR(predep_objects, $1) \ + _LT_AC_TAGVAR(postdep_objects, $1) \ + _LT_AC_TAGVAR(predeps, $1) \ + _LT_AC_TAGVAR(postdeps, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(archive_cmds, $1) \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ + _LT_AC_TAGVAR(postinstall_cmds, $1) \ + _LT_AC_TAGVAR(postuninstall_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ + _LT_AC_TAGVAR(allow_undefined_flag, $1) \ + _LT_AC_TAGVAR(no_undefined_flag, $1) \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ + _LT_AC_TAGVAR(hardcode_automatic, $1) \ + _LT_AC_TAGVAR(module_cmds, $1) \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) \ + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ + _LT_AC_TAGVAR(exclude_expsyms, $1) \ + _LT_AC_TAGVAR(include_expsyms, $1); do + + case $var in + _LT_AC_TAGVAR(old_archive_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ + _LT_AC_TAGVAR(archive_cmds, $1) | \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(module_cmds, $1) | \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\[$]0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` + ;; + esac + +ifelse([$1], [], + [cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + AC_MSG_NOTICE([creating $ofile])], + [cfgfile="$ofile"]) + + cat <<__EOF__ >> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_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=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# 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 "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# 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='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat <<EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <<EOF >> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + 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'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + 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'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux*) + case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix3*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # 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*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include <windows.h> +# #undef WIN32_LEAN_AND_MEAN +# #include <stdio.h> +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include <cygwin/cygwin_dll.h> +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_MSG_RESULT([$SED]) +]) diff --git a/alienblaster/project/jni/sdl_ttf/acinclude/sdl.m4 b/alienblaster/project/jni/sdl_ttf/acinclude/sdl.m4 new file mode 100644 index 000000000..0928a9ddf --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/acinclude/sdl.m4 @@ -0,0 +1,181 @@ +# Configure paths for SDL +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN([AM_PATH_SDL], +[dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], + sdl_prefix="$withval", sdl_prefix="") +AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], + sdl_exec_prefix="$withval", sdl_exec_prefix="") +AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + if test "x$prefix" != xNONE; then + PATH="$prefix/bin:$prefix/usr/bin:$PATH" + fi + AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_CXXFLAGS="$CXXFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + CXXFLAGS="$ac_save_CXXFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include <stdio.h> +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + CXXFLAGS="$ac_save_CXXFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) diff --git a/alienblaster/project/jni/sdl_ttf/aclocal.m4 b/alienblaster/project/jni/sdl_ttf/aclocal.m4 new file mode 100644 index 000000000..04fbad902 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/aclocal.m4 @@ -0,0 +1,1022 @@ +# generated automatically by aclocal 1.9.4 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# -*- Autoconf -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Generated from amversion.in; do not edit by hand. + +# 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 + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.9.4])]) + +# AM_AUX_DIR_EXPAND + +# Copyright (C) 2001, 2003 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. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004 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. + +# serial 6 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# serial 7 -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# 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. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# 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. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# 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. + +# serial 11 + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.58])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright (C) 2001, 2003 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. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# -*- Autoconf -*- +# Copyright (C) 2003 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. + +# serial 1 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 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. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# -*- Autoconf -*- + + +# Copyright (C) 1997, 1999, 2000, 2001, 2003 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. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_PROG_MKDIR_P +# --------------- +# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. + +# Copyright (C) 2003, 2004 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. + +# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories +# created by `make install' are always world readable, even if the +# installer happens to have an overly restrictive umask (e.g. 077). +# This was a mistake. There are at least two reasons why we must not +# use `-m 0755': +# - it causes special bits like SGID to be ignored, +# - it may be too restrictive (some setups expect 775 directories). +# +# Do not use -m 0755 and let people choose whatever they expect by +# setting umask. +# +# We cannot accept any implementation of `mkdir' that recognizes `-p'. +# Some implementations (such as Solaris 8's) are not thread-safe: if a +# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' +# concurrently, both version can detect that a/ is missing, but only +# one can create it and the other will error out. Consequently we +# restrict ourselves to GNU make (using the --version option ensures +# this.) +AC_DEFUN([AM_PROG_MKDIR_P], +[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi +AC_SUBST([mkdir_p])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 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. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright (C) 1996, 1997, 2000, 2001, 2003 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. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright (C) 2001, 2003 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. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004 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. + +# serial 1 + + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar <conftest.tar]) + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([acinclude/libtool.m4]) +m4_include([acinclude/sdl.m4]) diff --git a/alienblaster/project/jni/sdl_ttf/autogen.sh b/alienblaster/project/jni/sdl_ttf/autogen.sh new file mode 100755 index 000000000..95f4886ea --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/autogen.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# + +set -e + +aclocal -I acinclude +automake --foreign --include-deps --add-missing --copy +autoconf + +#./configure $* +echo "Now you are ready to run ./configure" diff --git a/alienblaster/project/jni/sdl_ttf/config.guess b/alienblaster/project/jni/sdl_ttf/config.guess new file mode 100755 index 000000000..cc726cd15 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/config.guess @@ -0,0 +1,1388 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +timestamp='2003-02-22' + +# 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. + +# Originally written by Per Bothner <per@bothner.com>. +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# 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 build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +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 + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-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 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # 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. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-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 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + 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=`(sed 1q /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 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${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:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #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_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + 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 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${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 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + 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_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + 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:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | 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=${UNAME_VERSION}.${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 BSD 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/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #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 + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + 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_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + 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 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + 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*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + 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/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + # Determine whether the default compiler uses glibc. + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #if __GLIBC__ >= 2 + LIBC=gnu + #else + LIBC= + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i586-pc-interix3 + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + 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 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # 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. + 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:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + 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|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # 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 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*: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.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + 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:*: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 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000: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 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + case `uname -p` in + *86) UNAME_PROCESSOR=i686 ;; + powerpc) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + 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 + +eval $set_cc_for_build +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`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%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) +# include <sys/param.h> +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# 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_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# 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 + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + ftp://ftp.gnu.org/pub/gnu/config/ + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/alienblaster/project/jni/sdl_ttf/config.sub b/alienblaster/project/jni/sdl_ttf/config.sub new file mode 100755 index 000000000..277a01d0f --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/config.sub @@ -0,0 +1,1487 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +timestamp='2003-02-22' + +# 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. + +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# 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. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +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 + nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + 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 | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + 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/'` + ;; + -udk*) + 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 + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +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. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # 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*86 | x86_64) + 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. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | msp430-* \ + | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + 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-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + 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 | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + 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 + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-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 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + 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 + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + 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 + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + 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 + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nv1) + basic_machine=nv1-cray + os=-unicosmp + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + 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 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-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/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + 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 + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic4x | c4x*) + basic_machine=tic4x-unknown + os=-coff + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + 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 + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + 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. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + 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* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -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|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # 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*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -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*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + 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 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-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 + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-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 + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + 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 + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/alienblaster/project/jni/sdl_ttf/configure b/alienblaster/project/jni/sdl_ttf/configure new file mode 100755 index 000000000..e227ddf87 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/configure @@ -0,0 +1,23328 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59. +# +# Copyright (C) 2003 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<EOF +$* +EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="README" +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#if HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#if HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#if STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# if HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#if HAVE_STRINGS_H +# include <strings.h> +#endif +#if HAVE_INTTYPES_H +# include <inttypes.h> +#else +# if HAVE_STDINT_H +# include <stdint.h> +# endif +#endif +#if HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAJOR_VERSION MINOR_VERSION MICRO_VERSION INTERFACE_AGE BINARY_AGE VERSION LT_RELEASE LT_CURRENT LT_REVISION LT_AGE build build_cpu build_vendor build_os host host_cpu host_vendor host_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB DLLTOOL ac_ct_DLLTOOL AS ac_ct_AS OBJDUMP ac_ct_OBJDUMP CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL WINDRES ALLOCA USE_VERSION_RC_TRUE USE_VERSION_RC_FALSE FREETYPE_CONFIG SDL_CONFIG SDL_CFLAGS SDL_LIBS X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS GL_LIBS MATHLIB LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +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' + +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # 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_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$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 ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) 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 | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$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 | -n) + 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_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + 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 "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# 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_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + 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 "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS +ac_env_CXXCPP_set=${CXXCPP+set} +ac_env_CXXCPP_value=$CXXCPP +ac_cv_env_CXXCPP_set=${CXXCPP+set} +ac_cv_env_CXXCPP_value=$CXXCPP +ac_env_F77_set=${F77+set} +ac_env_F77_value=$F77 +ac_cv_env_F77_set=${F77+set} +ac_cv_env_F77_value=$F77 +ac_env_FFLAGS_set=${FFLAGS+set} +ac_env_FFLAGS_value=$FFLAGS +ac_cv_env_FFLAGS_set=${FFLAGS+set} +ac_cv_env_FFLAGS_value=$FFLAGS + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +Program names: + --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 + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-shared[=PKGS] + build shared libraries [default=yes] + --enable-static[=PKGS] + build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --disable-libtool-lock avoid locking (might break parallel builds) + --disable-sdltest Do not try to compile and run a test SDL program + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] + include additional configurations [automatic] + --with-freetype-prefix=PFX Prefix where FREETYPE is +installed (optional) + --with-freetype-exec-prefix=PFX Exec prefix +where FREETYPE is installed (optional) + --with-sdl-prefix=PFX Prefix where SDL is installed (optional) + --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) + --with-x use the X Window System + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have + headers in a nonstandard directory <include dir> + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright (C) 2003 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# 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 + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# 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 "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + + +# Making releases: +# MICRO_VERSION += 1; +# INTERFACE_AGE += 1; +# BINARY_AGE += 1; +# if any functions have been added, set INTERFACE_AGE to 0. +# if backwards compatibility has been broken, +# set BINARY_AGE and INTERFACE_AGE to 0. + +MAJOR_VERSION=2 +MINOR_VERSION=0 +MICRO_VERSION=9 +INTERFACE_AGE=3 +BINARY_AGE=9 +VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION + + + + + + + + +# libtool versioning +LT_RELEASE=$MAJOR_VERSION.$MINOR_VERSION +LT_CURRENT=`expr $MICRO_VERSION - $INTERFACE_AGE` +LT_REVISION=$INTERFACE_AGE +LT_AGE=`expr $BINARY_AGE - $INTERFACE_AGE` + + + + + + +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 + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + + +am__api_version="1.9" +# 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 +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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 "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&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_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 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 conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE=SDL_ttf + VERSION=$VERSION + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + + + + +# 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. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi; + +# 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. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi; + +# Check whether --enable-fast-install or --disable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi; + +DEPDIR="${am__leading_dot}deps" + + ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval="$enable_dependency_tracking" + +fi; +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +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 "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 $# != 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 + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 + (eval $ac_compiler --version </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 + (eval $ac_compiler -v </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 + (eval $ac_compiler -V </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include <stdlib.h> +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 +if test "${lt_cv_path_SED+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done + +fi + +SED=$lt_cv_path_SED +echo "$as_me:$LINENO: result: $SED" >&5 +echo "${ECHO_T}$SED" >&6 + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + + +# 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 "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + 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 "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + + +echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 +if test "${lt_cv_ld_reload_flag+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_ld_reload_flag='-r' +fi +echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + +echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 +if test "${lt_cv_path_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; 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 + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +echo "${ECHO_T}$lt_cv_path_NM" >&6 +NM="$lt_cv_path_NM" + +echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 +echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 +if test "${lt_cv_deplibs_check_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + #lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump'. + #lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | kfreebsd*-gnu | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix3*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 3712 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +lt_cv_cc_needs_belf=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) LD="${LD-ld} -64" ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-cygwin* | *-*-mingw* | *-*-pw32*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_DLLTOOL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + echo "$as_me:$LINENO: result: $DLLTOOL" >&5 +echo "${ECHO_T}$DLLTOOL" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_DLLTOOL" && ac_cv_prog_ac_ct_DLLTOOL="false" +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5 +echo "${ECHO_T}$ac_ct_DLLTOOL" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + DLLTOOL=$ac_ct_DLLTOOL +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + echo "$as_me:$LINENO: result: $AS" >&5 +echo "${ECHO_T}$AS" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_AS" && ac_cv_prog_ac_ct_AS="false" +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + echo "$as_me:$LINENO: result: $ac_ct_AS" >&5 +echo "${ECHO_T}$ac_ct_AS" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AS=$ac_ct_AS +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_OBJDUMP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + echo "$as_me:$LINENO: result: $OBJDUMP" >&5 +echo "${ECHO_T}$OBJDUMP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_OBJDUMP" && ac_cv_prog_ac_ct_OBJDUMP="false" +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 +echo "${ECHO_T}$ac_ct_OBJDUMP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + OBJDUMP=$ac_ct_OBJDUMP +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; + +esac + +need_locks="$enable_libtool_lock" + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <string.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + 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 <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdlib.h> + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + 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 <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ctype.h> +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#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); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done +test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + + CXX=$ac_ct_CXX +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 + (eval $ac_compiler --version </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 + (eval $ac_compiler -v </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 + (eval $ac_compiler -V </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cxx_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include <stdlib.h> +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +depcc="$CXX" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6 +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + # <limits.h> exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <ac_nonexistent.h> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +fi + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + echo "$as_me:$LINENO: result: $F77" >&5 +echo "${ECHO_T}$F77" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_F77="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +echo "${ECHO_T}$ac_ct_F77" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_F77" && break +done + + F77=$ac_ct_F77 +fi + + +# Provide some information about the compiler. +echo "$as_me:5553:" \ + "checking for Fortran 77 compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 + (eval $ac_compiler --version </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 + (eval $ac_compiler -v </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 + (eval $ac_compiler -V </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 +if test "${ac_cv_f77_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_f77_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_f77_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_f77_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +G77=`test $ac_compiler_gnu = yes && echo yes` +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! + +# find the maximum length of command line arguments +echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + beos*) + # On BeOS, this test takes a really really long time. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 +else + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 +fi + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# 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='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDGIRSTW]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +EOF + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat <<EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <<EOF >> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + 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 $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6 +else + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 +fi + +echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +if test "${lt_cv_objdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +echo "${ECHO_T}$lt_cv_objdir" >&6 +objdir=$lt_cv_objdir + + + + + +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 "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:$LINENO: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AR=$ac_ct_AR +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +enable_dlopen=no +enable_win32_dll=yes + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +# Check whether --with-pic or --without-pic was given. +if test "${with_pic+set}" = set; then + withval="$with_pic" + pic_mode="$withval" +else + pic_mode=default +fi; +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}\n' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6626: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:6630: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + 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'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic='-qnocommon' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux*) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6894: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:6898: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 + +if test x"$lt_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 +if test "${lt_prog_compiler_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works=yes + fi + else + lt_prog_compiler_static_works=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 + +if test x"$lt_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:6998: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:7002: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix3*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # 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 $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6 +test "$ld_shlibs" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +echo "${ECHO_T}$archive_cmds_need_lc" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +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' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + #soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + #soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var" || \ + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != 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 +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6 + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + ;; + *) + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef shl_load + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* 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_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef dlopen + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* 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_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<EOF +#line 9345 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<EOF +#line 9445 "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which library types will actually be built +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&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 +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { echo "$as_me:$LINENO: creating $ofile" >&5 +echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_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=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} 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 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# 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 "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + +# Check whether --with-tags or --without-tags was given. +if test "${with_tags+set}" = set; then + withval="$with_tags" + tagnames="$withval" +fi; + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# 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 "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + 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 "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break + ;; + *) + test "$with_gnu_ld" != yes && break + ;; + esac + fi + done + IFS="$lt_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 </dev/null` in +*GNU* | *'with BFD'*) + lt_cv_prog_gnu_ld=yes + ;; +*) + lt_cv_prog_gnu_ld=no + ;; +esac +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_CXX=yes + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes ; then + lt_int_apple_cc_single_mod=no + output_verbose_link_cmd='echo' + if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then + lt_int_apple_cc_single_mod=yes + fi + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + else + archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + fi + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + if test "X$lt_int_apple_cc_single_mod" = Xyes ; then + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_CXX=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_CXX='+b $libdir' + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + interix3*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC*) + # Portland Group C++ compiler + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + openbsd*) + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The C++ compiler is used as linker so we must use $wl + # flag to pass the commands to the underlying system + # linker. We must also pass each convience library through + # to the system linker between allextract/defaultextract. + # The C++ compiler will combine linker options so we + # cannot just pass the convience library names through + # without $wl. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6 +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +cat > conftest.$ac_ext <<EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +EOF + +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +# PORTME: override above test on systems where it is broken +case $host_os in +interix3*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +solaris*) + case $cc_basename in + CC*) + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + postdeps_CXX='-lCstd -lCrun' + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + 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'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix4* | aix5*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_CXX='-qnocommon' + lt_prog_compiler_wl_CXX='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | kfreebsd*-gnu | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC*) + # Portland Group C++ compiler. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11789: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:11793: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 + +if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 +if test "${lt_prog_compiler_static_works_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_CXX=yes + fi + else + lt_prog_compiler_static_works_CXX=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6 + +if test x"$lt_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:11893: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:11897: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix4* | aix5*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +echo "${ECHO_T}$ld_shlibs_CXX" >&6 +test "$ld_shlibs_CXX" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +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' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + #soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + #soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var_CXX" || \ + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +echo "${ECHO_T}$hardcode_action_CXX" >&6 + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_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=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_CXX" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code=" subroutine t\n return\n end\n" + +# Code to be used in simple link tests +lt_simple_link_test_code=" program t\n end\n" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&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 +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix4* | aix5*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 + +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + 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'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_F77='-qnocommon' + lt_prog_compiler_wl_F77='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux*) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13465: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:13469: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 + +if test x"$lt_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 +if test "${lt_prog_compiler_static_works_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_F77=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_F77=yes + fi + else + lt_prog_compiler_static_works_F77=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6 + +if test x"$lt_prog_compiler_static_works_F77" = xyes; then + : +else + lt_prog_compiler_static_F77= +fi + + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:13569: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:13573: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <<EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_F77=no + fi + ;; + + interix3*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_F77=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <<EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = no; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_F77=yes + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_f77_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77='$convenience' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_F77='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='' + link_all_deplibs_F77=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_F77=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # 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_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + *) + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag_F77='${wl}-z,text' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='${wl}-z,text' + allow_undefined_flag_F77='${wl}-z,nodefs' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +echo "${ECHO_T}$ld_shlibs_F77" >&6 +test "$ld_shlibs_F77" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +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' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + #soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + #soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var_F77" || \ + test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +echo "${ECHO_T}$hardcode_action_F77" >&6 + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_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=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_F77" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}\n" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + +old_archive_cmds_GCJ=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:15778: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:15782: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + 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'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + interix3*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_GCJ='-qnocommon' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + esac + ;; + + mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux*) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-fpic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_GCJ='-Qoption ld ';; + *) + lt_prog_compiler_wl_GCJ='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_can_build_shared_GCJ=no + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 +if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16046: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:16050: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 + +if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" +echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6 +if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_prog_compiler_static_works_GCJ=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + printf "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_prog_compiler_static_works_GCJ=yes + fi + else + lt_prog_compiler_static_works_GCJ=yes + fi + fi + $rm conftest* + LDFLAGS="$save_LDFLAGS" + +fi +echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5 +echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6 + +if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then + : +else + lt_prog_compiler_static_GCJ= +fi + + +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16150: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:16154: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <<EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + interix3*) + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + linux*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_GCJ=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <<EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_GCJ=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = no; then + runpath_var= + hardcode_libdir_flag_spec_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct_GCJ=yes + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'`; fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ='$convenience' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_GCJ=no + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='' + link_all_deplibs_GCJ=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_GCJ=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # 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_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | kfreebsd*-gnu | dragonfly*) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + *) + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine linker options so we + # cannot just pass the convience library names through + # without $wl, iff we do not link with $LD. + # Luckily, gcc supports the same syntax we need for Sun Studio. + # Supported since Solaris 2.6 (maybe 2.5.1?) + case $wlarc in + '') + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; + *) + whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;; + esac ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) + no_undefined_flag_GCJ='${wl}-z,text' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_GCJ='${wl}-z,text' + allow_undefined_flag_GCJ='${wl}-z,nodefs' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +echo "${ECHO_T}$ld_shlibs_GCJ" >&6 +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + $rm conftest* + printf "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + pic_flag=$lt_prog_compiler_pic_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 + ;; + esac + fi + ;; +esac + +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +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' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + #soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + #soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo ${libname} | sed -e 's/^lib//'`${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. + if test "$GCC" = yes; then + sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` + else + sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' + fi + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +kfreebsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + freebsd*) # from 4.6 on + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix3*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +knetbsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='GNU ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var_GCJ" || \ + test "X$hardcode_automatic_GCJ" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +echo "${ECHO_T}$hardcode_action_GCJ" >&6 + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_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=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_GCJ" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +printf "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +printf "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_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=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path_RC" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + ;; + + *) + { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +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 "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 $# != 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 + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5 + (eval $ac_compiler --version </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5 + (eval $ac_compiler -v </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5 + (eval $ac_compiler -V </dev/null >&5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <stdarg.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include <stdlib.h> +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +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 +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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 "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&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_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 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 conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +if test -z "$host_alias"; then + hostaliaswindres= +else + hostaliaswindres="$host_alias-windres" +fi +for ac_prog in windres $hostaliaswindres $host_os-windres +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_WINDRES+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$WINDRES"; then + ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_WINDRES="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +WINDRES=$ac_cv_prog_WINDRES +if test -n "$WINDRES"; then + echo "$as_me:$LINENO: result: $WINDRES" >&5 +echo "${ECHO_T}$WINDRES" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$WINDRES" && break +done + + +case "$host" in + *-*-cygwin* | *-*-mingw32*) + ;; + *) + # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +echo "$as_me:$LINENO: checking for working alloca.h" >&5 +echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6 +if test "${ac_cv_working_alloca_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <alloca.h> +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_working_alloca_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_working_alloca_h=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 +echo "${ECHO_T}$ac_cv_working_alloca_h" >&6 +if test $ac_cv_working_alloca_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA_H 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for alloca" >&5 +echo $ECHO_N "checking for alloca... $ECHO_C" >&6 +if test "${ac_cv_func_alloca_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include <malloc.h> +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_alloca_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_alloca_works=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 +echo "${ECHO_T}$ac_cv_func_alloca_works" >&6 + +if test $ac_cv_func_alloca_works = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA 1 +_ACEOF + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=alloca.$ac_objext + +cat >>confdefs.h <<\_ACEOF +#define C_ALLOCA 1 +_ACEOF + + +echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 +echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6 +if test "${ac_cv_os_cray+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if defined(CRAY) && ! defined(CRAY2) +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 +echo "${ECHO_T}$ac_cv_os_cray" >&6 +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* 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 (); +/* 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 +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 +echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6 +if test "${ac_cv_c_stack_direction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + exit (find_stack_direction () < 0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_stack_direction=1 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_stack_direction=-1 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 +echo "${ECHO_T}$ac_cv_c_stack_direction" >&6 + +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + + ;; +esac + + + +case "$host" in + *-*-beos*) + ac_default_prefix=/boot/develop/tools/gnupro + ;; + *-*-cygwin* | *-*-mingw32*) + if test "$build" != "$host"; then # cross-compiling + # Default cross-compile location + ac_default_prefix=/usr/local/cross-tools/i386-mingw32 + else + # Look for the location of the tools and install there + if test "$BUILD_PREFIX" != ""; then + ac_default_prefix=$BUILD_PREFIX + fi + fi + if test x$WINDRES != x; then + use_version_rc=true + fi + ;; +esac + + +if test x$use_version_rc = xtrue; then + USE_VERSION_RC_TRUE= + USE_VERSION_RC_FALSE='#' +else + USE_VERSION_RC_TRUE='#' + USE_VERSION_RC_FALSE= +fi + + + +# Check whether --with-freetype-prefix or --without-freetype-prefix was given. +if test "${with_freetype_prefix+set}" = set; then + withval="$with_freetype_prefix" + freetype_prefix="$withval" +else + freetype_prefix="" +fi; + +# Check whether --with-freetype-exec-prefix or --without-freetype-exec-prefix was given. +if test "${with_freetype_exec_prefix+set}" = set; then + withval="$with_freetype_exec_prefix" + freetype_exec_prefix="$withval" +else + freetype_exec_prefix="" +fi; + +if test x$freetype_exec_prefix != x ; then + freetype_args="$freetype_args --exec-prefix=$freetype_exec_prefix" + if test x${FREETYPE_CONFIG+set} != xset ; then + FREETYPE_CONFIG=$freetype_exec_prefix/bin/freetype-config + fi +fi +if test x$freetype_prefix != x ; then + freetype_args="$freetype_args --prefix=$freetype_prefix" + if test x${FREETYPE_CONFIG+set} != xset ; then + FREETYPE_CONFIG=$freetype_prefix/bin/freetype-config + fi +fi +# Extract the first word of "freetype-config", so it can be a program name with args. +set dummy freetype-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_FREETYPE_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $FREETYPE_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_FREETYPE_CONFIG" && ac_cv_path_FREETYPE_CONFIG="no" + ;; +esac +fi +FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG + +if test -n "$FREETYPE_CONFIG"; then + echo "$as_me:$LINENO: result: $FREETYPE_CONFIG" >&5 +echo "${ECHO_T}$FREETYPE_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +no_freetype="" +if test "$FREETYPE_CONFIG" = "no" ; then + { { echo "$as_me:$LINENO: error: +*** Unable to find FreeType2 library (http://www.freetype.org/) +" >&5 +echo "$as_me: error: +*** Unable to find FreeType2 library (http://www.freetype.org/) +" >&2;} + { (exit 1); exit 1; }; } +else + CFLAGS="$CFLAGS `$FREETYPE_CONFIG $freetypeconf_args --cflags`" + LIBS="$LIBS `$FREETYPE_CONFIG $freetypeconf_args --libs`" +fi + +SDL_VERSION=1.2.4 + +# Check whether --with-sdl-prefix or --without-sdl-prefix was given. +if test "${with_sdl_prefix+set}" = set; then + withval="$with_sdl_prefix" + sdl_prefix="$withval" +else + sdl_prefix="" +fi; + +# Check whether --with-sdl-exec-prefix or --without-sdl-exec-prefix was given. +if test "${with_sdl_exec_prefix+set}" = set; then + withval="$with_sdl_exec_prefix" + sdl_exec_prefix="$withval" +else + sdl_exec_prefix="" +fi; +# Check whether --enable-sdltest or --disable-sdltest was given. +if test "${enable_sdltest+set}" = set; then + enableval="$enable_sdltest" + +else + enable_sdltest=yes +fi; + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + if test "x$prefix" != xNONE; then + PATH="$prefix/bin:$prefix/usr/bin:$PATH" + fi + # Extract the first word of "sdl-config", so it can be a program name with args. +set dummy sdl-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_SDL_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $SDL_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" + ;; +esac +fi +SDL_CONFIG=$ac_cv_path_SDL_CONFIG + +if test -n "$SDL_CONFIG"; then + echo "$as_me:$LINENO: result: $SDL_CONFIG" >&5 +echo "${ECHO_T}$SDL_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + min_sdl_version=$SDL_VERSION + echo "$as_me:$LINENO: checking for SDL - version >= $min_sdl_version" >&5 +echo $ECHO_N "checking for SDL - version >= $min_sdl_version... $ECHO_C" >&6 + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_CXXFLAGS="$CXXFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + rm -f conf.sdltest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +no_sdl=yes +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + CFLAGS="$ac_save_CFLAGS" + CXXFLAGS="$ac_save_CXXFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + : + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include <stdio.h> +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main + +int +main () +{ + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$ac_save_CFLAGS" + CXXFLAGS="$ac_save_CXXFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + { { echo "$as_me:$LINENO: error: *** SDL version $SDL_VERSION not found!" >&5 +echo "$as_me: error: *** SDL version $SDL_VERSION not found!" >&2;} + { (exit 1); exit 1; }; } + + fi + + + rm -f conf.sdltest + +CFLAGS="$CFLAGS $SDL_CFLAGS" +LIBS="$LIBS $SDL_LIBS" + +case "$host" in + *-*-cygwin* | *-*-mingw32*) + MATHLIB="" + SYS_GL_LIBS="-lopengl32" + ;; + *-*-beos*) + MATHLIB="" + SYS_GL_LIBS="-lGL" + ;; + *-*-darwin*) + MATHLIB="" + SYS_GL_LIBS="-Wl,-framework,OpenGL" + ;; + *-*-aix*) + if test x$ac_cv_c_compiler_gnu = xyes; then + CFLAGS="-mthreads" + fi + SYS_GL_LIBS="" + ;; + *) + MATHLIB="-lm" + echo "$as_me:$LINENO: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + + +# 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 test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'_ACEOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +_ACEOF + 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 conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/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' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <X11/Intrinsic.h> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <X11/Intrinsic.h> +int +main () +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +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 "$as_me:$LINENO: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&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 "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&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 <<\_ACEOF +#define X_DISPLAY_MISSING 1 +_ACEOF + + 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 "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_nospace=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_space=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:$LINENO: result: neither works" >&5 +echo "${ECHO_T}neither works" >&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 says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main () +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* 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; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* 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; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson 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 T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:$LINENO: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define gethostbyname to an innocuous variant, in case <limits.h> declares gethostbyname. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define gethostbyname innocuous_gethostbyname + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef gethostbyname + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +/* 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 +char (*f) () = gethostbyname; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != gethostbyname; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* 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; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* 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; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test $ac_cv_lib_bsd_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + 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 Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:$LINENO: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define connect to an innocuous variant, in case <limits.h> declares connect. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define connect innocuous_connect + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef connect + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +/* 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 +char (*f) () = connect; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != connect; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_connect=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* 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; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_socket_connect=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:$LINENO: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define remove to an innocuous variant, in case <limits.h> declares remove. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define remove innocuous_remove + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef remove + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +/* 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 +char (*f) () = remove; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != remove; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_remove=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:$LINENO: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* 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; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix_remove=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:$LINENO: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shmat to an innocuous variant, in case <limits.h> declares shmat. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define shmat innocuous_shmat + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef shmat + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +/* 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 +char (*f) () = shmat; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shmat; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shmat=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* 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; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ipc_shmat=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +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. + # John Interrante, Karl Berry + echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* 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; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + if test x$have_x = xyes; then + CFLAGS="$CFLAGS $X_CFLAGS" + SYS_GL_LIBS="$X_LIBS -lGL" + else + SYS_GL_LIBS="-lGL" + fi + ;; +esac +echo "$as_me:$LINENO: checking for OpenGL support" >&5 +echo $ECHO_N "checking for OpenGL support... $ECHO_C" >&6 +have_opengl=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include "SDL_opengl.h" + +int +main () +{ + + GLuint texture; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +have_opengl=yes + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $have_opengl" >&5 +echo "${ECHO_T}$have_opengl" >&6 +if test x$have_opengl = xyes; then + CFLAGS="$CFLAGS -DHAVE_OPENGL" + GL_LIBS="$SYS_GL_LIBS" +else + GL_LIBS="" +fi + + + + +# Finally create all the generated files + ac_config_files="$ac_config_files Makefile SDL_ttf.spec" +cat >confcache <<\_ACEOF +# 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, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# 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 | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${USE_VERSION_RC_TRUE}" && test -z "${USE_VERSION_RC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"USE_VERSION_RC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"USE_VERSION_RC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to <bug-autoconf@gnu.org>." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "SDL_ttf.spec" ) CONFIG_FILES="$CONFIG_FILES SDL_ttf.spec" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@MAJOR_VERSION@,$MAJOR_VERSION,;t t +s,@MINOR_VERSION@,$MINOR_VERSION,;t t +s,@MICRO_VERSION@,$MICRO_VERSION,;t t +s,@INTERFACE_AGE@,$INTERFACE_AGE,;t t +s,@BINARY_AGE@,$BINARY_AGE,;t t +s,@VERSION@,$VERSION,;t t +s,@LT_RELEASE@,$LT_RELEASE,;t t +s,@LT_CURRENT@,$LT_CURRENT,;t t +s,@LT_REVISION@,$LT_REVISION,;t t +s,@LT_AGE@,$LT_AGE,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CYGPATH_W@,$CYGPATH_W,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@install_sh@,$install_sh,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@mkdir_p@,$mkdir_p,;t t +s,@AWK@,$AWK,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@am__leading_dot@,$am__leading_dot,;t t +s,@AMTAR@,$AMTAR,;t t +s,@am__tar@,$am__tar,;t t +s,@am__untar@,$am__untar,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@DEPDIR@,$DEPDIR,;t t +s,@am__include@,$am__include,;t t +s,@am__quote@,$am__quote,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t +s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t +s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t +s,@EGREP@,$EGREP,;t t +s,@LN_S@,$LN_S,;t t +s,@ECHO@,$ECHO,;t t +s,@AR@,$AR,;t t +s,@ac_ct_AR@,$ac_ct_AR,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@DLLTOOL@,$DLLTOOL,;t t +s,@ac_ct_DLLTOOL@,$ac_ct_DLLTOOL,;t t +s,@AS@,$AS,;t t +s,@ac_ct_AS@,$ac_ct_AS,;t t +s,@OBJDUMP@,$OBJDUMP,;t t +s,@ac_ct_OBJDUMP@,$ac_ct_OBJDUMP,;t t +s,@CPP@,$CPP,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@CXXDEPMODE@,$CXXDEPMODE,;t t +s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t +s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t +s,@CXXCPP@,$CXXCPP,;t t +s,@F77@,$F77,;t t +s,@FFLAGS@,$FFLAGS,;t t +s,@ac_ct_F77@,$ac_ct_F77,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@WINDRES@,$WINDRES,;t t +s,@ALLOCA@,$ALLOCA,;t t +s,@USE_VERSION_RC_TRUE@,$USE_VERSION_RC_TRUE,;t t +s,@USE_VERSION_RC_FALSE@,$USE_VERSION_RC_FALSE,;t t +s,@FREETYPE_CONFIG@,$FREETYPE_CONFIG,;t t +s,@SDL_CONFIG@,$SDL_CONFIG,;t t +s,@SDL_CFLAGS@,$SDL_CFLAGS,;t t +s,@SDL_LIBS@,$SDL_LIBS,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@GL_LIBS@,$GL_LIBS,;t t +s,@MATHLIB@,$MATHLIB,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # 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_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # 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" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`(dirname "$file") 2>/dev/null || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p $dirpart/$fdir + else + as_dir=$dirpart/$fdir + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 +echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + { (exit 1); exit 1; }; }; } + + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + esac +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/alienblaster/project/jni/sdl_ttf/configure.in b/alienblaster/project/jni/sdl_ttf/configure.in new file mode 100644 index 000000000..c29ef0a9b --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/configure.in @@ -0,0 +1,192 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(README) + +dnl Set various version strings - taken gratefully from the GTk sources + +# Making releases: +# MICRO_VERSION += 1; +# INTERFACE_AGE += 1; +# BINARY_AGE += 1; +# if any functions have been added, set INTERFACE_AGE to 0. +# if backwards compatibility has been broken, +# set BINARY_AGE and INTERFACE_AGE to 0. + +MAJOR_VERSION=2 +MINOR_VERSION=0 +MICRO_VERSION=9 +INTERFACE_AGE=3 +BINARY_AGE=9 +VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION + +AC_SUBST(MAJOR_VERSION) +AC_SUBST(MINOR_VERSION) +AC_SUBST(MICRO_VERSION) +AC_SUBST(INTERFACE_AGE) +AC_SUBST(BINARY_AGE) +AC_SUBST(VERSION) + +# libtool versioning +LT_RELEASE=$MAJOR_VERSION.$MINOR_VERSION +LT_CURRENT=`expr $MICRO_VERSION - $INTERFACE_AGE` +LT_REVISION=$INTERFACE_AGE +LT_AGE=`expr $BINARY_AGE - $INTERFACE_AGE` + +AC_SUBST(LT_RELEASE) +AC_SUBST(LT_CURRENT) +AC_SUBST(LT_REVISION) +AC_SUBST(LT_AGE) + +dnl Detect the canonical build and host environments +AC_CANONICAL_HOST + +dnl Setup for automake +AM_INIT_AUTOMAKE(SDL_ttf, $VERSION) + +dnl Check for tools + +AC_LIBTOOL_WIN32_DLL +AM_PROG_LIBTOOL +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_MAKE_SET +if test -z "$host_alias"; then + hostaliaswindres= +else + hostaliaswindres="$host_alias-windres" +fi +AC_CHECK_PROGS(WINDRES, [windres $hostaliaswindres $host_os-windres]) + +case "$host" in + *-*-cygwin* | *-*-mingw32*) + ;; + *) + AC_FUNC_ALLOCA + ;; +esac + + +dnl Check for iconv (character conversion library; see iconv.m4) +dnl This isn't available on many systems +dnl AM_ICONV + +case "$host" in + *-*-beos*) + ac_default_prefix=/boot/develop/tools/gnupro + ;; + *-*-cygwin* | *-*-mingw32*) + if test "$build" != "$host"; then # cross-compiling + # Default cross-compile location + ac_default_prefix=/usr/local/cross-tools/i386-mingw32 + else + # Look for the location of the tools and install there + if test "$BUILD_PREFIX" != ""; then + ac_default_prefix=$BUILD_PREFIX + fi + fi + if test x$WINDRES != x; then + use_version_rc=true + fi + ;; +esac +AM_CONDITIONAL(USE_VERSION_RC, test x$use_version_rc = xtrue) + +dnl Check for the FreeType 2 library +dnl +dnl Get the cflags and libraries from the freetype-config script +dnl +AC_ARG_WITH(freetype-prefix,[ --with-freetype-prefix=PFX Prefix where FREETYPE is +installed (optional)], + freetype_prefix="$withval", freetype_prefix="") +AC_ARG_WITH(freetype-exec-prefix,[ --with-freetype-exec-prefix=PFX Exec prefix +where FREETYPE is installed (optional)], + freetype_exec_prefix="$withval", freetype_exec_prefix="") + +if test x$freetype_exec_prefix != x ; then + freetype_args="$freetype_args --exec-prefix=$freetype_exec_prefix" + if test x${FREETYPE_CONFIG+set} != xset ; then + FREETYPE_CONFIG=$freetype_exec_prefix/bin/freetype-config + fi +fi +if test x$freetype_prefix != x ; then + freetype_args="$freetype_args --prefix=$freetype_prefix" + if test x${FREETYPE_CONFIG+set} != xset ; then + FREETYPE_CONFIG=$freetype_prefix/bin/freetype-config + fi +fi +AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) +no_freetype="" +if test "$FREETYPE_CONFIG" = "no" ; then + AC_MSG_ERROR([ +*** Unable to find FreeType2 library (http://www.freetype.org/) +]) +else + CFLAGS="$CFLAGS `$FREETYPE_CONFIG $freetypeconf_args --cflags`" + LIBS="$LIBS `$FREETYPE_CONFIG $freetypeconf_args --libs`" +fi + +dnl Check for SDL +SDL_VERSION=1.2.4 +AM_PATH_SDL($SDL_VERSION, + :, + AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!]) +) +CFLAGS="$CFLAGS $SDL_CFLAGS" +LIBS="$LIBS $SDL_LIBS" + +dnl Check for OpenGL +case "$host" in + *-*-cygwin* | *-*-mingw32*) + MATHLIB="" + SYS_GL_LIBS="-lopengl32" + ;; + *-*-beos*) + MATHLIB="" + SYS_GL_LIBS="-lGL" + ;; + *-*-darwin*) + MATHLIB="" + SYS_GL_LIBS="-Wl,-framework,OpenGL" + ;; + *-*-aix*) + if test x$ac_cv_prog_gcc = xyes; then + CFLAGS="-mthreads" + fi + SYS_GL_LIBS="" + ;; + *) + MATHLIB="-lm" + AC_PATH_X + AC_PATH_XTRA + if test x$have_x = xyes; then + CFLAGS="$CFLAGS $X_CFLAGS" + SYS_GL_LIBS="$X_LIBS -lGL" + else + SYS_GL_LIBS="-lGL" + fi + ;; +esac +AC_MSG_CHECKING(for OpenGL support) +have_opengl=no +AC_TRY_COMPILE([ + #include "SDL_opengl.h" +],[ + GLuint texture; +],[ +have_opengl=yes +]) +AC_MSG_RESULT($have_opengl) +if test x$have_opengl = xyes; then + CFLAGS="$CFLAGS -DHAVE_OPENGL" + GL_LIBS="$SYS_GL_LIBS" +else + GL_LIBS="" +fi +AC_SUBST([GL_LIBS]) +AC_SUBST([MATHLIB]) +AC_SUBST([WINDRES]) + +# Finally create all the generated files +AC_OUTPUT([ +Makefile +SDL_ttf.spec +]) diff --git a/alienblaster/project/jni/sdl_ttf/depcomp b/alienblaster/project/jni/sdl_ttf/depcomp new file mode 100755 index 000000000..11e2d3bfe --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/depcomp @@ -0,0 +1,522 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2004-05-31.23 + +# Copyright (C) 1999, 2000, 2003, 2004 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. + +# 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. + +# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>. + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to <bug-automake@gnu.org>. +EOF + exit 0 + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit 0 + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # Dependencies are output in .lo.d with libtool 1.4. + # With libtool 1.5 they are output both in $dir.libs/$base.o.d + # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the + # latter, because the former will be cleaned when $dir.libs is + # erased. + tmpdepfile1="$dir.libs/$base.lo.d" + tmpdepfile2="$dir$base.o.d" + tmpdepfile3="$dir.libs/$base.d" + "$@" -Wc,-MD + else + tmpdepfile1="$dir$base.o.d" + tmpdepfile2="$dir$base.d" + tmpdepfile3="$dir$base.d" + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + elif test -f "$tmpdepfile2"; then + tmpdepfile="$tmpdepfile2" + else + tmpdepfile="$tmpdepfile3" + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/alienblaster/project/jni/sdl_ttf/gcc-fat.sh b/alienblaster/project/jni/sdl_ttf/gcc-fat.sh new file mode 100755 index 000000000..041c19dca --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/gcc-fat.sh @@ -0,0 +1,110 @@ +#!/bin/sh +# +# Build Universal binaries on Mac OS X, thanks Ryan! +# +# Usage: ./configure CC="sh gcc-fat.sh" && make && rm -rf ppc x86 + +# PowerPC compiler flags (10.2 runtime compatibility) +GCC_COMPILE_PPC="gcc-3.3 -arch ppc \ +-DMAC_OS_X_VERSION_MIN_REQUIRED=1020 \ +-nostdinc \ +-F/Developer/SDKs/MacOSX10.2.8.sdk/System/Library/Frameworks \ +-I/Developer/SDKs/MacOSX10.2.8.sdk/usr/include/gcc/darwin/3.3 \ +-isystem /Developer/SDKs/MacOSX10.2.8.sdk/usr/include" + +GCC_LINK_PPC="\ +-L/Developer/SDKs/MacOSX10.2.8.sdk/usr/lib/gcc/darwin/3.3 \ +-F/Developer/SDKs/MacOSX10.2.8.sdk/System/Library/Frameworks \ +-Wl,-syslibroot,/Developer/SDKs/MacOSX10.2.8.sdk" + +# Intel compiler flags (10.4 runtime compatibility) +GCC_COMPILE_X86="gcc-4.0 -arch i386 -mmacosx-version-min=10.4 \ +-DMAC_OS_X_VERSION_MIN_REQUIRED=1040 \ +-nostdinc \ +-F/Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks \ +-I/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin8/4.0.1/include \ +-isystem /Developer/SDKs/MacOSX10.4u.sdk/usr/include" + +GCC_LINK_X86="\ +-L/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/gcc/i686-apple-darwin8/4.0.1 \ +-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" + +# Output both PowerPC and Intel object files +args="$*" +compile=yes +link=yes +while test x$1 != x; do + case $1 in + --version) exec gcc $1;; + -v) exec gcc $1;; + -V) exec gcc $1;; + -print-prog-name=*) exec gcc $1;; + -print-search-dirs) exec gcc $1;; + -E) GCC_COMPILE_PPC="$GCC_COMPILE_PPC -E" + GCC_COMPILE_X86="$GCC_COMPILE_X86 -E" + compile=no; link=no;; + -c) link=no;; + -o) output=$2;; + *.c|*.cc|*.cpp|*.S) source=$1;; + esac + shift +done +if test x$link = xyes; then + GCC_COMPILE_PPC="$GCC_COMPILE_PPC $GCC_LINK_PPC" + GCC_COMPILE_X86="$GCC_COMPILE_X86 $GCC_LINK_X86" +fi +if test x"$output" = x; then + if test x$link = xyes; then + output=a.out + elif test x$compile = xyes; then + output=`echo $source | sed -e 's|.*/||' -e 's|\(.*\)\.[^\.]*|\1|'`.o + fi +fi + +if test x"$output" != x; then + dir=ppc/`dirname $output` + if test -d $dir; then + : + else + mkdir -p $dir + fi +fi +set -- $args +while test x$1 != x; do + if test -f "ppc/$1" && test "$1" != "$output"; then + ppc_args="$ppc_args ppc/$1" + else + ppc_args="$ppc_args $1" + fi + shift +done +$GCC_COMPILE_PPC $ppc_args || exit $? +if test x"$output" != x; then + cp $output ppc/$output +fi + +if test x"$output" != x; then + dir=x86/`dirname $output` + if test -d $dir; then + : + else + mkdir -p $dir + fi +fi +set -- $args +while test x$1 != x; do + if test -f "x86/$1" && test "$1" != "$output"; then + x86_args="$x86_args x86/$1" + else + x86_args="$x86_args $1" + fi + shift +done +$GCC_COMPILE_X86 $x86_args || exit $? +if test x"$output" != x; then + cp $output x86/$output +fi + +if test x"$output" != x; then + lipo -create -o $output ppc/$output x86/$output +fi diff --git a/alienblaster/project/jni/sdl_ttf/glfont.c b/alienblaster/project/jni/sdl_ttf/glfont.c new file mode 100644 index 000000000..23f299535 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/glfont.c @@ -0,0 +1,537 @@ +/* + glfont: An example of using the SDL_ttf library with OpenGL. + Copyright (C) 1997-2004 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + The SDL_GL_* functions in this file are available in the public domain. + + Sam Lantinga + slouken@libsdl.org +*/ + +/* $Id: glfont.c 2429 2006-05-14 21:03:44Z slouken $ */ + +/* A simple program to test the text rendering feature of the TTF library */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "SDL.h" +#include "SDL_ttf.h" + +#ifdef HAVE_OPENGL + +#include "SDL_opengl.h" + +#define DEFAULT_PTSIZE 18 +#define DEFAULT_TEXT "The quick brown fox jumped over the lazy dog" +#define NUM_COLORS 256 + +static char *Usage = +"Usage: %s [-utf8|-unicode] [-b] [-i] [-u] [-fgcol r,g,b] [-bgcol r,g,b] \ +<font>.ttf [ptsize] [text]\n"; + +void SDL_GL_Enter2DMode() +{ + SDL_Surface *screen = SDL_GetVideoSurface(); + + /* Note, there may be other things you need to change, + depending on how you have your OpenGL state set up. + */ + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_DEPTH_TEST); + glDisable(GL_CULL_FACE); + glEnable(GL_TEXTURE_2D); + + /* This allows alpha blending of 2D textures with the scene */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glViewport(0, 0, screen->w, screen->h); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + glOrtho(0.0, (GLdouble)screen->w, (GLdouble)screen->h, 0.0, 0.0, 1.0); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +} + +void SDL_GL_Leave2DMode() +{ + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glPopAttrib(); +} + +/* Quick utility function for texture creation */ +static int power_of_two(int input) +{ + int value = 1; + + while ( value < input ) { + value <<= 1; + } + return value; +} + +GLuint SDL_GL_LoadTexture(SDL_Surface *surface, GLfloat *texcoord) +{ + GLuint texture; + int w, h; + SDL_Surface *image; + SDL_Rect area; + Uint32 saved_flags; + Uint8 saved_alpha; + + /* Use the surface width and height expanded to powers of 2 */ + w = power_of_two(surface->w); + h = power_of_two(surface->h); + texcoord[0] = 0.0f; /* Min X */ + texcoord[1] = 0.0f; /* Min Y */ + texcoord[2] = (GLfloat)surface->w / w; /* Max X */ + texcoord[3] = (GLfloat)surface->h / h; /* Max Y */ + + image = SDL_CreateRGBSurface( + SDL_SWSURFACE, + w, h, + 32, +#if SDL_BYTEORDER == SDL_LIL_ENDIAN /* OpenGL RGBA masks */ + 0x000000FF, + 0x0000FF00, + 0x00FF0000, + 0xFF000000 +#else + 0xFF000000, + 0x00FF0000, + 0x0000FF00, + 0x000000FF +#endif + ); + if ( image == NULL ) { + return 0; + } + + /* Save the alpha blending attributes */ + saved_flags = surface->flags&(SDL_SRCALPHA|SDL_RLEACCELOK); + saved_alpha = surface->format->alpha; + if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) { + SDL_SetAlpha(surface, 0, 0); + } + + /* Copy the surface into the GL texture image */ + area.x = 0; + area.y = 0; + area.w = surface->w; + area.h = surface->h; + SDL_BlitSurface(surface, &area, image, &area); + + /* Restore the alpha blending attributes */ + if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) { + SDL_SetAlpha(surface, saved_flags, saved_alpha); + } + + /* Create an OpenGL texture for the image */ + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + w, h, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + image->pixels); + SDL_FreeSurface(image); /* No longer needed */ + + return texture; +} + +static void cleanup(int exitcode) +{ + TTF_Quit(); + SDL_Quit(); + exit(exitcode); +} + +int main(int argc, char *argv[]) +{ + char *argv0 = argv[0]; + SDL_Surface *screen; + TTF_Font *font; + SDL_Surface *text; + int ptsize; + int i, done; + SDL_Color white = { 0xFF, 0xFF, 0xFF, 0 }; + SDL_Color black = { 0x00, 0x00, 0x00, 0 }; + SDL_Color *forecol; + SDL_Color *backcol; + GLenum gl_error; + GLuint texture; + int x, y, w, h; + GLfloat texcoord[4]; + GLfloat texMinX, texMinY; + GLfloat texMaxX, texMaxY; + float color[8][3]= {{ 1.0, 1.0, 0.0}, + { 1.0, 0.0, 0.0}, + { 0.0, 0.0, 0.0}, + { 0.0, 1.0, 0.0}, + { 0.0, 1.0, 1.0}, + { 1.0, 1.0, 1.0}, + { 1.0, 0.0, 1.0}, + { 0.0, 0.0, 1.0}}; + float cube[8][3]= {{ 0.5, 0.5, -0.5}, + { 0.5, -0.5, -0.5}, + {-0.5, -0.5, -0.5}, + {-0.5, 0.5, -0.5}, + {-0.5, 0.5, 0.5}, + { 0.5, 0.5, 0.5}, + { 0.5, -0.5, 0.5}, + {-0.5, -0.5, 0.5}}; + SDL_Event event; + int renderstyle; + int dump; + enum { + RENDER_LATIN1, + RENDER_UTF8, + RENDER_UNICODE + } rendertype; + char *message; + + /* Look for special execution mode */ + dump = 0; + /* Look for special rendering types */ + renderstyle = TTF_STYLE_NORMAL; + rendertype = RENDER_LATIN1; + /* Default is black and white */ + forecol = &black; + backcol = &white; + for ( i=1; argv[i] && argv[i][0] == '-'; ++i ) { + if ( strcmp(argv[i], "-utf8") == 0 ) { + rendertype = RENDER_UTF8; + } else + if ( strcmp(argv[i], "-unicode") == 0 ) { + rendertype = RENDER_UNICODE; + } else + if ( strcmp(argv[i], "-b") == 0 ) { + renderstyle |= TTF_STYLE_BOLD; + } else + if ( strcmp(argv[i], "-i") == 0 ) { + renderstyle |= TTF_STYLE_ITALIC; + } else + if ( strcmp(argv[i], "-u") == 0 ) { + renderstyle |= TTF_STYLE_UNDERLINE; + } else + if ( strcmp(argv[i], "-dump") == 0 ) { + dump = 1; + } else + if ( strcmp(argv[i], "-fgcol") == 0 ) { + int r, g, b; + if ( sscanf (argv[++i], "%d,%d,%d", &r, &g, &b) != 3 ) { + fprintf(stderr, Usage, argv0); + return(1); + } + forecol->r = (Uint8)r; + forecol->g = (Uint8)g; + forecol->b = (Uint8)b; + } else + if ( strcmp(argv[i], "-bgcol") == 0 ) { + int r, g, b; + if ( sscanf (argv[++i], "%d,%d,%d", &r, &g, &b) != 3 ) { + fprintf(stderr, Usage, argv0); + return(1); + } + backcol->r = (Uint8)r; + backcol->g = (Uint8)g; + backcol->b = (Uint8)b; + } else { + fprintf(stderr, Usage, argv0); + return(1); + } + } + argv += i; + argc -= i; + + /* Check usage */ + if ( ! argv[0] ) { + fprintf(stderr, Usage, argv0); + return(1); + } + + /* Initialize SDL */ + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); + return(2); + } + + /* Initialize the TTF library */ + if ( TTF_Init() < 0 ) { + fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError()); + SDL_Quit(); + return(2); + } + + /* Open the font file with the requested point size */ + ptsize = 0; + if ( argc > 1 ) { + ptsize = atoi(argv[1]); + } + if ( ptsize == 0 ) { + i = 2; + ptsize = DEFAULT_PTSIZE; + } else { + i = 3; + } + font = TTF_OpenFont(argv[0], ptsize); + if ( font == NULL ) { + fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", + ptsize, argv[0], SDL_GetError()); + cleanup(2); + } + TTF_SetFontStyle(font, renderstyle); + + if( dump ) { + for( i = 48; i < 123; i++ ) { + SDL_Surface* glyph = NULL; + + glyph = TTF_RenderGlyph_Shaded( font, i, *forecol, *backcol ); + + if( glyph ) { + char outname[64]; + sprintf( outname, "glyph-%d.bmp", i ); + SDL_SaveBMP( glyph, outname ); + } + + } + cleanup(0); + } + + /* Set a 640x480 video mode */ + screen = SDL_SetVideoMode(640, 480, 0, SDL_OPENGL); + if ( screen == NULL ) { + fprintf(stderr, "Couldn't set 640x480 OpenGL mode: %s\n", + SDL_GetError()); + cleanup(2); + } + + /* Render and center the message */ + if ( argc > 2 ) { + message = argv[2]; + } else { + message = DEFAULT_TEXT; + } + switch (rendertype) { + case RENDER_LATIN1: + text = TTF_RenderText_Blended(font, message, *forecol); + break; + + case RENDER_UTF8: + text = TTF_RenderUTF8_Blended(font, message, *forecol); + break; + + case RENDER_UNICODE: + { + /* This doesn't actually work because you can't pass + UNICODE text in via command line, AFAIK, but... + */ + Uint16 unicode_text[BUFSIZ]; + int index; + for ( index = 0; (message[0] || message[1]); ++index ) { + unicode_text[index] = ((Uint8 *)message)[0]; + unicode_text[index] <<= 8; + unicode_text[index] |= ((Uint8 *)message)[1]; + message += 2; + } + text = TTF_RenderUNICODE_Blended(font, + unicode_text, *forecol); + } + break; + default: + text = NULL; /* This shouldn't happen */ + break; + } + if ( text == NULL ) { + fprintf(stderr, "Couldn't render text: %s\n", SDL_GetError()); + TTF_CloseFont(font); + cleanup(2); + } + x = (screen->w - text->w)/2; + y = (screen->h - text->h)/2; + w = text->w; + h = text->h; + printf("Font is generally %d big, and string is %hd big\n", + TTF_FontHeight(font), text->h); + + /* Convert the text into an OpenGL texture */ + glGetError(); + texture = SDL_GL_LoadTexture(text, texcoord); + if ( (gl_error = glGetError()) != GL_NO_ERROR ) { + /* If this failed, the text may exceed texture size limits */ + printf("Warning: Couldn't create texture: 0x%x\n", gl_error); + } + + /* Make texture coordinates easy to understand */ + texMinX = texcoord[0]; + texMinY = texcoord[1]; + texMaxX = texcoord[2]; + texMaxY = texcoord[3]; + + /* We don't need the original text surface anymore */ + SDL_FreeSurface(text); + + /* Initialize the GL state */ + glViewport( 0, 0, screen->w, screen->h ); + glMatrixMode( GL_PROJECTION ); + glLoadIdentity( ); + + glOrtho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0 ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity( ); + + glEnable(GL_DEPTH_TEST); + + glDepthFunc(GL_LESS); + + glShadeModel(GL_SMOOTH); + + /* Wait for a keystroke, and blit text on mouse press */ + done = 0; + while ( ! done ) { + while ( SDL_PollEvent(&event) ) { + switch (event.type) { + case SDL_MOUSEMOTION: + x = event.motion.x - w/2; + y = event.motion.y - h/2; + break; + + case SDL_KEYDOWN: + case SDL_QUIT: + done = 1; + break; + default: + break; + } + } + + /* Clear the screen */ + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + /* Draw the spinning cube */ + glBegin( GL_QUADS ); + + glColor3fv(color[0]); + glVertex3fv(cube[0]); + glColor3fv(color[1]); + glVertex3fv(cube[1]); + glColor3fv(color[2]); + glVertex3fv(cube[2]); + glColor3fv(color[3]); + glVertex3fv(cube[3]); + + glColor3fv(color[3]); + glVertex3fv(cube[3]); + glColor3fv(color[4]); + glVertex3fv(cube[4]); + glColor3fv(color[7]); + glVertex3fv(cube[7]); + glColor3fv(color[2]); + glVertex3fv(cube[2]); + + glColor3fv(color[0]); + glVertex3fv(cube[0]); + glColor3fv(color[5]); + glVertex3fv(cube[5]); + glColor3fv(color[6]); + glVertex3fv(cube[6]); + glColor3fv(color[1]); + glVertex3fv(cube[1]); + + glColor3fv(color[5]); + glVertex3fv(cube[5]); + glColor3fv(color[4]); + glVertex3fv(cube[4]); + glColor3fv(color[7]); + glVertex3fv(cube[7]); + glColor3fv(color[6]); + glVertex3fv(cube[6]); + + glColor3fv(color[5]); + glVertex3fv(cube[5]); + glColor3fv(color[0]); + glVertex3fv(cube[0]); + glColor3fv(color[3]); + glVertex3fv(cube[3]); + glColor3fv(color[4]); + glVertex3fv(cube[4]); + + glColor3fv(color[6]); + glVertex3fv(cube[6]); + glColor3fv(color[1]); + glVertex3fv(cube[1]); + glColor3fv(color[2]); + glVertex3fv(cube[2]); + glColor3fv(color[7]); + glVertex3fv(cube[7]); + glEnd( ); + + /* Rotate the cube */ + glMatrixMode(GL_MODELVIEW); + glRotatef(5.0, 1.0, 1.0, 1.0); + + /* Show the text on the screen */ + SDL_GL_Enter2DMode(); + glBindTexture(GL_TEXTURE_2D, texture); + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(texMinX, texMinY); glVertex2i(x, y ); + glTexCoord2f(texMaxX, texMinY); glVertex2i(x+w, y ); + glTexCoord2f(texMinX, texMaxY); glVertex2i(x, y+h); + glTexCoord2f(texMaxX, texMaxY); glVertex2i(x+w, y+h); + glEnd(); + SDL_GL_Leave2DMode(); + + /* Swap the buffers so everything is visible */ + SDL_GL_SwapBuffers( ); + } + TTF_CloseFont(font); + cleanup(0); + + /* Not reached, but fixes compiler warnings */ + return 0; +} + +#else /* HAVE_OPENGL */ + +int main(int argc, char *argv[]) +{ + printf("No OpenGL support on this system\n"); + return 1; +} + +#endif /* HAVE_OPENGL */ diff --git a/alienblaster/project/jni/sdl_ttf/install-sh b/alienblaster/project/jni/sdl_ttf/install-sh new file mode 100755 index 000000000..6ebe46de6 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/install-sh @@ -0,0 +1,323 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2004-12-17.09 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. 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}" + +chmodcmd="$chmodprog 0755" +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= +dstarg= +no_target_directory= + +usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: +-c (ignored) +-d create directories instead of installing files. +-g GROUP $chgrpprog installed files to GROUP. +-m MODE $chmodprog installed files to MODE. +-o USER $chownprog installed files to USER. +-s $stripprog installed files. +-t DIRECTORY install into DIRECTORY. +-T report an error if DSTFILE is a directory. +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test -n "$1"; do + case $1 in + -c) shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit 0;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t) dstarg=$2 + shift + shift + continue;; + + -T) no_target_directory=true + shift + continue;; + + --version) echo "$0 $scriptversion"; exit 0;; + + *) # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + test -n "$dir_arg$dstarg" && break + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done + break;; + esac +done + +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + src= + + if test -d "$dst"; then + mkdircmd=: + chmodcmd= + else + mkdircmd=$mkdirprog + fi + else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dstarg: Is a directory" >&2 + exit 1 + fi + dst=$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=' + ' + IFS="${IFS-$defaultIFS}" + + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + shift + IFS=$oIFS + + pathcomp= + + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test -d "$pathcomp" || exit + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $mkdircmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Copy the file name to the temp name. + $doit $cpprog "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit 1 + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit 1; } +done + +# The final little trick to "correctly" pass the exit status to the exit trap. +{ + (exit 0); exit 0 +} + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/alienblaster/project/jni/sdl_ttf/ltmain.sh b/alienblaster/project/jni/sdl_ttf/ltmain.sh new file mode 100644 index 000000000..6698c1b44 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/ltmain.sh @@ -0,0 +1,6864 @@ +# Based on libtool-1.5.22 +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# Originally by 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.22 +TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)" + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes. +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<EOF +$* +EOF + exit $EXIT_SUCCESS +fi + +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 1s/^X//' +sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + SP2NL='tr \040 \012' + NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + SP2NL='tr \100 \n' + NL2SP='tr \r\n \100\100' + ;; +esac + +# 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). +# We save the old values to restore during execute mode. +if test "${LC_ALL+set}" = set; then + save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL +fi +if test "${LANG+set}" = set; then + save_LANG="$LANG"; LANG=C; export LANG +fi + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +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 $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xdir="$my_gentop/$my_xlib" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# 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) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + 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$TIMESTAMP" + $echo + $echo "Copyright (C) 2005 Free Software Foundation, Inc." + $echo "This is free software; see the source for copying conditions. There is NO" + $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --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 $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + 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 $EXIT_FAILURE + 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= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + *.java) xform=java ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T <<EOF +# $libobj - a libtool object file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +EOF + + # 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 + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + if test ! -d "${xdir}$objdir"; then + $show "$mkdir ${xdir}$objdir" + $run $mkdir ${xdir}$objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then + exit $exit_status + fi + fi + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command="$command -o $lobj" + fi + + $run $rm "$lobj" "$output_obj" + + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit $EXIT_FAILURE + fi + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <<EOF +pic_object='$objdir/$objname' + +EOF + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + else + # No PIC object so indicate it doesn't exist in the libtool + # object file. + test -z "$run" && cat >> ${libobj}T <<EOF +pic_object=none + +EOF + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$obj" "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit $EXIT_FAILURE + fi + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <<EOF +# Name of the non-PIC object. +non_pic_object='$objname' + +EOF + else + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <<EOF +# Name of the non-PIC object. +non_pic_object=none + +EOF + fi + + $run $mv "${libobj}T" "${libobj}" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $run $rm "$lockfile" + fi + + exit $EXIT_SUCCESS + ;; + + # libtool link mode + link | relink) + modename="$modename: link" + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args="$nonopt" + base_compile="$nonopt $@" + compile_command="$nonopt" + finalize_command="$nonopt" + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + notinst_path= # paths that contain not-installed libtool libraries + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + + func_infer_tag $base_compile + + # 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"; then + if 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 + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + 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. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # 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) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + 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 + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # 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 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -pg pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \ + -t[45]*|-txscale*|@*) + + # 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 + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + 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 + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + 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 # arg + + # 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 # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # 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 \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # 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_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + 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" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor - 1` + age="$number_minor" + revision="$number_minor" + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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 $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + major=`expr $current - $age + 1` + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 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) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + 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 + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` + done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c <<EOF + int main() { return 0; } +EOF + $rm conftest + $LTCC $LTCFLAGS -o conftest conftest.c $deplibs + if test "$?" -eq 0 ; then + ldd_output=`ldd conftest` + for i in $deplibs; do + name=`expr $i : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test "$name" != "" && test "$name" -ne "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + newdeplibs="$newdeplibs $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval \\$echo \"$libname_spec\"` + deplib_matches=`eval \\$echo \"$library_names_spec\"` + set dummy $deplib_matches + deplib_match=$2 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + newdeplibs="$newdeplibs $i" + else + droppeddeps=yes + $echo + $echo "*** Warning: dynamic linker does not accept needed library $i." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which I believe you do not have" + $echo "*** because a test_compile did reveal that the linker did not use it for" + $echo "*** its dynamic dependency list that programs get resolved with at runtime." + fi + fi + else + newdeplibs="$newdeplibs $i" + fi + done + else + # Error occurred in the first compile. Let's try to salvage + # the situation: Compile a separate program for each library. + for i in $deplibs; do + name=`expr $i : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test "$name" != "" && test "$name" != "0"; then + $rm conftest + $LTCC $LTCFLAGS -o conftest conftest.c $i + # Did it work? + if test "$?" -eq 0 ; then + ldd_output=`ldd conftest` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $i "*) + newdeplibs="$newdeplibs $i" + i="" + ;; + esac + fi + if test -n "$i" ; then + libname=`eval \\$echo \"$libname_spec\"` + deplib_matches=`eval \\$echo \"$library_names_spec\"` + set dummy $deplib_matches + deplib_match=$2 + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + newdeplibs="$newdeplibs $i" + else + droppeddeps=yes + $echo + $echo "*** Warning: dynamic linker does not accept needed library $i." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because a test_compile did reveal that the linker did not use this one" + $echo "*** as a dynamic dependency that programs can get resolved with at runtime." + fi + fi + else + droppeddeps=yes + $echo + $echo "*** Warning! Library $i is needed by this library but I was not able to" + $echo "*** make it link in! You will probably need to install it or some" + $echo "*** library that it depends on before this library will be fully" + $echo "*** functional. Installing it before continuing would be even better." + fi + else + newdeplibs="$newdeplibs $i" + fi + done + fi + ;; + file_magic*) + set dummy $deplibs_check_method + file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test "$name" != "" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + 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 + hardcode_libdirs="$libdir" + 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 + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + 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 + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + 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 + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # 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 $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + 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 + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + 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 + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 </dev/null >/dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"` + else + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # 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 "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + 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 + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <<EOF + +/* $cwrappersource - temporary wrapper executable for $objdir/$outputname + Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP + + The $output program cannot be directly executed until all the libtool + libraries that it depends on are installed. + + This wrapper executable should never be moved out of the build directory. + If it is, it will not operate correctly. + + Currently, it simply execs the wrapper *script* "/bin/sh $output", + but could eventually absorb all of the scripts functionality and + exec $objdir/$outputname directly. +*/ +EOF + cat >> $cwrappersource<<"EOF" +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <malloc.h> +#include <stdarg.h> +#include <assert.h> +#include <string.h> +#include <ctype.h> +#include <sys/stat.h> + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <<EOF + newargz[0] = (char *) xstrdup("$SHELL"); +EOF + + cat >> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i<argc+1; i++) + { + DEBUG("(main) newargz[%d] : %s\n",i,newargz[i]); + ; + } + +EOF + + case $host_os in + *cygwin* | *mingw* ) + cat >> $cwrappersource <<EOF + execv("$SHELL",(char const **)newargz); +EOF + ;; + *) + cat >> $cwrappersource <<EOF + execv("$SHELL",newargz); +EOF + ;; + esac + + cat >> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +char * +find_executable (const char* wrapper) +{ + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + return NULL; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# 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 the build directory. +# 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 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + 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\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && 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 + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# 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 + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; 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=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -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 $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + 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 "$isdir" = yes; 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 $EXIT_FAILURE + 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 $EXIT_FAILURE + ;; + 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 + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # 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" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $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 "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + 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 "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # 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 + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; 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'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + 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 $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $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_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + 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. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least 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 -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + 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 "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # 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 $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + 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 | grep "^# Generated by .*$PACKAGE") >/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 + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) 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 $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# 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. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic 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 + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + 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. + +Report bugs to <bug-libtool@gnu.org>." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build 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, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +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 + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -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, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', 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 $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/alienblaster/project/jni/sdl_ttf/missing b/alienblaster/project/jni/sdl_ttf/missing new file mode 100755 index 000000000..64b5f901d --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/missing @@ -0,0 +1,353 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2004-09-07.08 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 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, 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. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to <bug-automake@gnu.org>." + exit 0 + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit 0 + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case "$1" in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/alienblaster/project/jni/sdl_ttf/showfont.c b/alienblaster/project/jni/sdl_ttf/showfont.c new file mode 100644 index 000000000..ac39fee70 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/showfont.c @@ -0,0 +1,375 @@ +/* + showfont: An example of using the SDL_ttf library with 2D graphics. + Copyright (C) 1997-2004 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@libsdl.org +*/ + +/* $Id: showfont.c 2429 2006-05-14 21:03:44Z slouken $ */ + +/* A simple program to test the text rendering feature of the TTF library */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#ifdef HAVE_ICONV +#include <iconv.h> +#endif + +#include "SDL.h" +#include "SDL_ttf.h" + +#define DEFAULT_PTSIZE 18 +#define DEFAULT_TEXT "The quick brown fox jumped over the lazy dog" +#define NUM_COLORS 256 + +static char *Usage = +"Usage: %s [-solid] [-utf8|-unicode] [-b] [-i] [-u] [-fgcol r,g,b] [-bgcol r,g,b] <font>.ttf [ptsize] [text]\n"; + +static void cleanup(int exitcode) +{ + TTF_Quit(); + SDL_Quit(); + exit(exitcode); +} + +int main(int argc, char *argv[]) +{ + char *argv0 = argv[0]; + SDL_Surface *screen; + TTF_Font *font; + SDL_Surface *text, *temp; + int ptsize; + int i, done; + int rdiff, gdiff, bdiff; + SDL_Color colors[NUM_COLORS]; + SDL_Color white = { 0xFF, 0xFF, 0xFF, 0 }; + SDL_Color black = { 0x00, 0x00, 0x00, 0 }; + SDL_Color *forecol; + SDL_Color *backcol; + SDL_Rect dstrect; + SDL_Event event; + int rendersolid; + int renderstyle; + int dump; + enum { + RENDER_LATIN1, + RENDER_UTF8, + RENDER_UNICODE + } rendertype; + char *message, string[128]; + + /* Look for special execution mode */ + dump = 0; + /* Look for special rendering types */ + rendersolid = 0; + renderstyle = TTF_STYLE_NORMAL; + rendertype = RENDER_LATIN1; + /* Default is black and white */ + forecol = &black; + backcol = &white; + for ( i=1; argv[i] && argv[i][0] == '-'; ++i ) { + if ( strcmp(argv[i], "-solid") == 0 ) { + rendersolid = 1; + } else + if ( strcmp(argv[i], "-utf8") == 0 ) { + rendertype = RENDER_UTF8; + } else + if ( strcmp(argv[i], "-unicode") == 0 ) { + rendertype = RENDER_UNICODE; + } else + if ( strcmp(argv[i], "-b") == 0 ) { + renderstyle |= TTF_STYLE_BOLD; + } else + if ( strcmp(argv[i], "-i") == 0 ) { + renderstyle |= TTF_STYLE_ITALIC; + } else + if ( strcmp(argv[i], "-u") == 0 ) { + renderstyle |= TTF_STYLE_UNDERLINE; + } else + if ( strcmp(argv[i], "-dump") == 0 ) { + dump = 1; + } else + if ( strcmp(argv[i], "-fgcol") == 0 ) { + int r, g, b; + if ( sscanf (argv[++i], "%d,%d,%d", &r, &g, &b) != 3 ) { + fprintf(stderr, Usage, argv0); + return(1); + } + forecol->r = (Uint8)r; + forecol->g = (Uint8)g; + forecol->b = (Uint8)b; + } else + if ( strcmp(argv[i], "-bgcol") == 0 ) { + int r, g, b; + if ( sscanf (argv[++i], "%d,%d,%d", &r, &g, &b) != 3 ) { + fprintf(stderr, Usage, argv0); + return(1); + } + backcol->r = (Uint8)r; + backcol->g = (Uint8)g; + backcol->b = (Uint8)b; + } else { + fprintf(stderr, Usage, argv0); + return(1); + } + } + argv += i; + argc -= i; + + /* Check usage */ + if ( ! argv[0] ) { + fprintf(stderr, Usage, argv0); + return(1); + } + + /* Initialize SDL */ + if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { + fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); + return(2); + } + + /* Initialize the TTF library */ + if ( TTF_Init() < 0 ) { + fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError()); + SDL_Quit(); + return(2); + } + + /* Open the font file with the requested point size */ + ptsize = 0; + if ( argc > 1 ) { + ptsize = atoi(argv[1]); + } + if ( ptsize == 0 ) { + i = 2; + ptsize = DEFAULT_PTSIZE; + } else { + i = 3; + } + font = TTF_OpenFont(argv[0], ptsize); + if ( font == NULL ) { + fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", + ptsize, argv[0], SDL_GetError()); + cleanup(2); + } + TTF_SetFontStyle(font, renderstyle); + + if( dump ) { + for( i = 48; i < 123; i++ ) { + SDL_Surface* glyph = NULL; + + glyph = TTF_RenderGlyph_Shaded( font, i, *forecol, *backcol ); + + if( glyph ) { + char outname[64]; + sprintf( outname, "glyph-%d.bmp", i ); + SDL_SaveBMP( glyph, outname ); + } + + } + cleanup(0); + } + + /* Set a 640x480x8 video mode */ + screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE); + if ( screen == NULL ) { + fprintf(stderr, "Couldn't set 640x480x8 video mode: %s\n", + SDL_GetError()); + cleanup(2); + } + + /* Set a palette that is good for the foreground colored text */ + rdiff = backcol->r - forecol->r; + gdiff = backcol->g - forecol->g; + bdiff = backcol->b - forecol->b; + for ( i=0; i<NUM_COLORS; ++i ) { + colors[i].r = forecol->r + (i*rdiff)/4; + colors[i].g = forecol->g + (i*gdiff)/4; + colors[i].b = forecol->b + (i*bdiff)/4; + } + SDL_SetColors(screen, colors, 0, NUM_COLORS); + + /* Clear the background to background color */ + SDL_FillRect(screen, NULL, + SDL_MapRGB(screen->format, backcol->r, backcol->g, backcol->b)); + SDL_UpdateRect(screen, 0, 0, 0, 0); + + /* Show which font file we're looking at */ + sprintf(string, "Font file: %s", argv[0]); /* possible overflow */ + if ( rendersolid ) { + text = TTF_RenderText_Solid(font, string, *forecol); + } else { + text = TTF_RenderText_Shaded(font, string, *forecol, *backcol); + } + if ( text != NULL ) { + dstrect.x = 4; + dstrect.y = 4; + dstrect.w = text->w; + dstrect.h = text->h; + SDL_BlitSurface(text, NULL, screen, &dstrect); + SDL_FreeSurface(text); + } + + /* Render and center the message */ + if ( argc > 2 ) { + message = argv[2]; + } else { + message = DEFAULT_TEXT; + } + switch (rendertype) { + case RENDER_LATIN1: + if ( rendersolid ) { + text = TTF_RenderText_Solid(font,message,*forecol); + } else { + text = TTF_RenderText_Shaded(font,message,*forecol,*backcol); + } + break; + + case RENDER_UTF8: + if ( rendersolid ) { + text = TTF_RenderUTF8_Solid(font,message,*forecol); + } else { + text = TTF_RenderUTF8_Shaded(font,message,*forecol,*backcol); + } + break; + + case RENDER_UNICODE: + { + Uint16 unicode_text[BUFSIZ]; + int index; +#ifdef HAVE_ICONV + /* Use iconv to convert the message into utf-16. + * "char" and "" are aliases for the local 8-bit encoding */ + iconv_t cd; + /*ICONV_CONST*/ char *from_str = message; + char *to_str = (char*)unicode_text; + size_t from_sz = strlen(message) + 1; + size_t to_sz = sizeof(unicode_text); + size_t res; + int i; + + if ((cd = iconv_open("UTF-16", "char")) == (iconv_t)-1 + && (cd = iconv_open("UTF-16", "")) == (iconv_t)-1) { + perror("Couldn't open iconv"); + exit(1); + } + + res = iconv(cd, &from_str, &from_sz, &to_str, &to_sz); + if (res == -1) { + perror("Couldn't use iconv"); + exit(1); + } + + iconv_close(cd); +#else + /* Convert the message from ascii into utf-16. + * This is unreliable as a test because it always + * gives the local ordering. */ + for (index = 0; message[index]; index++) { + unicode_text[index] = message[index]; + } + unicode_text[index] = 0; +#endif + + if ( rendersolid ) { + text = TTF_RenderUNICODE_Solid(font, + unicode_text, *forecol); + } else { + text = TTF_RenderUNICODE_Shaded(font, + unicode_text, *forecol, *backcol); + } + } + break; + default: + text = NULL; /* This shouldn't happen */ + break; + } + if ( text == NULL ) { + fprintf(stderr, "Couldn't render text: %s\n", SDL_GetError()); + TTF_CloseFont(font); + cleanup(2); + } + dstrect.x = (screen->w - text->w)/2; + dstrect.y = (screen->h - text->h)/2; + dstrect.w = text->w; + dstrect.h = text->h; + printf("Font is generally %d big, and string is %hd big\n", + TTF_FontHeight(font), text->h); + + /* Blit the text surface */ + if ( SDL_BlitSurface(text, NULL, screen, &dstrect) < 0 ) { + fprintf(stderr, "Couldn't blit text to display: %s\n", + SDL_GetError()); + TTF_CloseFont(font); + cleanup(2); + } + SDL_UpdateRect(screen, 0, 0, 0, 0); + + /* Set the text colorkey and convert to display format */ + if ( SDL_SetColorKey(text, SDL_SRCCOLORKEY|SDL_RLEACCEL, 0) < 0 ) { + fprintf(stderr, "Warning: Couldn't set text colorkey: %s\n", + SDL_GetError()); + } + temp = SDL_DisplayFormat(text); + if ( temp != NULL ) { + SDL_FreeSurface(text); + text = temp; + } + + /* Wait for a keystroke, and blit text on mouse press */ + done = 0; + while ( ! done ) { + if ( SDL_WaitEvent(&event) < 0 ) { + fprintf(stderr, "SDL_PullEvent() error: %s\n", + SDL_GetError()); + done = 1; + continue; + } + switch (event.type) { + case SDL_MOUSEBUTTONDOWN: + dstrect.x = event.button.x - text->w/2; + dstrect.y = event.button.y - text->h/2; + dstrect.w = text->w; + dstrect.h = text->h; + if ( SDL_BlitSurface(text, NULL, screen, + &dstrect) == 0 ) { + SDL_UpdateRects(screen, 1, &dstrect); + } else { + fprintf(stderr, + "Couldn't blit text to display: %s\n", + SDL_GetError()); + } + break; + + case SDL_KEYDOWN: + case SDL_QUIT: + done = 1; + break; + default: + break; + } + } + SDL_FreeSurface(text); + TTF_CloseFont(font); + cleanup(0); + + /* Not reached, but fixes compiler warnings */ + return 0; +} diff --git a/alienblaster/project/jni/sdl_ttf/version.rc b/alienblaster/project/jni/sdl_ttf/version.rc new file mode 100644 index 000000000..360b6c198 --- /dev/null +++ b/alienblaster/project/jni/sdl_ttf/version.rc @@ -0,0 +1,39 @@ +#define APSTUDIO_READONLY_SYMBOLS +#include "afxres.h" +#undef APSTUDIO_READONLY_SYMBOLS + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 2,0,9,0 + PRODUCTVERSION 2,0,9,0 + FILEFLAGSMASK 0x3fL + FILEFLAGS 0x0L + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "\0" + VALUE "FileDescription", "SDL_ttf\0" + VALUE "FileVersion", "2, 0, 9, 0\0" + VALUE "InternalName", "SDL_ttf\0" + VALUE "LegalCopyright", "Copyright © 2007 Sam Lantinga\0" + VALUE "OriginalFilename", "SDL_ttf.dll\0" + VALUE "ProductName", "Simple DirectMedia Layer\0" + VALUE "ProductVersion", "2, 0, 9, 0\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END